diff --git a/include/config.h b/include/config.h index 19c64850..b42398e7 100644 --- a/include/config.h +++ b/include/config.h @@ -113,6 +113,13 @@ public: this->baseGameVersion = BaseGameVersion::pokeemerald; this->useEncounterJson = true; this->useCustomBorderSize = false; + this->enableEventWeatherTrigger = true; + this->enableEventSecretBase = true; + this->enableHiddenItemQuantity = false; + this->enableHiddenItemRequiresItemfinder = false; + this->enableHealLocationRespawnData = false; + this->enableObjectEventInConnection = false; + this->enableFloorNumber = false; this->customScripts.clear(); } void setBaseGameVersion(BaseGameVersion baseGameVersion); @@ -125,6 +132,20 @@ public: QString getProjectDir(); void setUseCustomBorderSize(bool enable); bool getUseCustomBorderSize(); + void setEventWeatherTriggerEnabled(bool enable); + bool getEventWeatherTriggerEnabled(); + void setEventSecretBaseEnabled(bool enable); + bool getEventSecretBaseEnabled(); + void setHiddenItemQuantityEnabled(bool enable); + bool getHiddenItemQuantityEnabled(); + void setHiddenItemRequiresItemfinderEnabled(bool enable); + bool getHiddenItemRequiresItemfinderEnabled(); + void setHealLocationRespawnDataEnabled(bool enable); + bool getHealLocationRespawnDataEnabled(); + void setObjectEventInConnectionEnabled(bool enable); + bool getObjectEventInConnectionEnabled(); + void setFloorNumberEnabled(bool enable); + bool getFloorNumberEnabled(); void setCustomScripts(QList scripts); QList getCustomScripts(); protected: @@ -138,6 +159,13 @@ private: bool useEncounterJson; bool usePoryScript; bool useCustomBorderSize; + bool enableEventWeatherTrigger; + bool enableEventSecretBase; + bool enableHiddenItemQuantity; + bool enableHiddenItemRequiresItemfinder; + bool enableHealLocationRespawnData; + bool enableObjectEventInConnection; + bool enableFloorNumber; QList customScripts; }; diff --git a/src/config.cpp b/src/config.cpp index 0c102cf6..9a42ddb8 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -380,6 +380,48 @@ void ProjectConfig::parseConfigKeyValue(QString key, QString value) { if (!ok) { logWarn(QString("Invalid config value for use_custom_border_size: '%1'. Must be 0 or 1.").arg(value)); } + } else if (key == "enable_event_weather_trigger") { + bool ok; + this->enableEventWeatherTrigger = value.toInt(&ok); + if (!ok) { + logWarn(QString("Invalid config value for enable_event_weather_trigger: '%1'. Must be 0 or 1.").arg(value)); + } + } else if (key == "enable_event_secret_base") { + bool ok; + this->enableEventSecretBase = value.toInt(&ok); + if (!ok) { + logWarn(QString("Invalid config value for enable_event_secret_base: '%1'. Must be 0 or 1.").arg(value)); + } + } else if (key == "enable_hidden_item_quantity") { + bool ok; + this->enableHiddenItemQuantity = value.toInt(&ok); + if (!ok) { + logWarn(QString("Invalid config value for enable_hidden_item_quantity: '%1'. Must be 0 or 1.").arg(value)); + } + } else if (key == "enable_hidden_item_requires_itemfinder") { + bool ok; + this->enableHiddenItemRequiresItemfinder = value.toInt(&ok); + if (!ok) { + logWarn(QString("Invalid config value for enable_hidden_item_requires_itemfinder: '%1'. Must be 0 or 1.").arg(value)); + } + } else if (key == "enable_heal_location_respawn_data") { + bool ok; + this->enableHealLocationRespawnData = value.toInt(&ok); + if (!ok) { + logWarn(QString("Invalid config value for enable_heal_location_respawn_data: '%1'. Must be 0 or 1.").arg(value)); + } + } else if (key == "enable_object_event_in_connection") { + bool ok; + this->enableObjectEventInConnection = value.toInt(&ok); + if (!ok) { + logWarn(QString("Invalid config value for enable_object_event_in_connection: '%1'. Must be 0 or 1.").arg(value)); + } + } else if (key == "enable_floor_number") { + bool ok; + this->enableFloorNumber = value.toInt(&ok); + if (!ok) { + logWarn(QString("Invalid config value for enable_floor_number: '%1'. Must be 0 or 1.").arg(value)); + } } else if (key == "custom_scripts") { this->customScripts.clear(); QList paths = value.split(","); @@ -400,6 +442,13 @@ QMap ProjectConfig::getKeyValueMap() { map.insert("use_encounter_json", QString::number(this->useEncounterJson)); map.insert("use_poryscript", QString::number(this->usePoryScript)); map.insert("use_custom_border_size", QString::number(this->useCustomBorderSize)); + map.insert("enable_event_weather_trigger", QString::number(this->enableEventWeatherTrigger)); + map.insert("enable_event_secret_base", QString::number(this->enableEventSecretBase)); + map.insert("enable_hidden_item_quantity", QString::number(this->enableHiddenItemQuantity)); + map.insert("enable_hidden_item_requires_itemfinder", QString::number(this->enableHiddenItemRequiresItemfinder)); + map.insert("enable_heal_location_respawn_data", QString::number(this->enableHealLocationRespawnData)); + map.insert("enable_object_event_in_connection", QString::number(this->enableObjectEventInConnection)); + map.insert("enable_floor_number", QString::number(this->enableFloorNumber)); map.insert("custom_scripts", this->customScripts.join(",")); return map; } @@ -430,7 +479,15 @@ void ProjectConfig::onNewConfigFileCreated() { this->baseGameVersion = static_cast(baseGameVersionComboBox->currentData().toInt()); } } - this->useCustomBorderSize = this->baseGameVersion == BaseGameVersion::pokefirered; + bool isPokefirered = this->baseGameVersion == BaseGameVersion::pokefirered; + this->useCustomBorderSize = isPokefirered; + this->enableEventWeatherTrigger = !isPokefirered; + this->enableEventSecretBase = !isPokefirered; + this->enableHiddenItemQuantity = isPokefirered; + this->enableHiddenItemRequiresItemfinder = isPokefirered; + this->enableHealLocationRespawnData = isPokefirered; + this->enableObjectEventInConnection = isPokefirered; + this->enableFloorNumber = isPokefirered; this->useEncounterJson = true; this->usePoryScript = false; this->customScripts.clear(); @@ -480,6 +537,69 @@ bool ProjectConfig::getUseCustomBorderSize() { return this->useCustomBorderSize; } +void ProjectConfig::setEventWeatherTriggerEnabled(bool enable) { + this->enableEventWeatherTrigger = enable; + this->save(); +} + +bool ProjectConfig::getEventWeatherTriggerEnabled() { + return this->enableEventWeatherTrigger; +} + +void ProjectConfig::setEventSecretBaseEnabled(bool enable) { + this->enableEventSecretBase = enable; + this->save(); +} + +bool ProjectConfig::getEventSecretBaseEnabled() { + return this->enableEventSecretBase; +} + +void ProjectConfig::setHiddenItemQuantityEnabled(bool enable) { + this->enableHiddenItemQuantity = enable; + this->save(); +} + +bool ProjectConfig::getHiddenItemQuantityEnabled() { + return this->enableHiddenItemQuantity; +} + +void ProjectConfig::setHiddenItemRequiresItemfinderEnabled(bool enable) { + this->enableHiddenItemRequiresItemfinder = enable; + this->save(); +} + +bool ProjectConfig::getHiddenItemRequiresItemfinderEnabled() { + return this->enableHiddenItemRequiresItemfinder; +} + +void ProjectConfig::setHealLocationRespawnDataEnabled(bool enable) { + this->enableHealLocationRespawnData = enable; + this->save(); +} + +bool ProjectConfig::getHealLocationRespawnDataEnabled() { + return this->enableHealLocationRespawnData; +} + +void ProjectConfig::setObjectEventInConnectionEnabled(bool enable) { + this->enableObjectEventInConnection = enable; + this->save(); +} + +bool ProjectConfig::getObjectEventInConnectionEnabled() { + return this->enableObjectEventInConnection; +} + +void ProjectConfig::setFloorNumberEnabled(bool enable) { + this->enableFloorNumber = enable; + this->save(); +} + +bool ProjectConfig::getFloorNumberEnabled() { + return this->enableFloorNumber; +} + void ProjectConfig::setCustomScripts(QList scripts) { this->customScripts = scripts; this->save(); diff --git a/src/core/event.cpp b/src/core/event.cpp index e08d1a5e..a872a519 100644 --- a/src/core/event.cpp +++ b/src/core/event.cpp @@ -60,7 +60,7 @@ Event* Event::createNewObjectEvent(Project *project) event->put("event_type", EventType::Object); event->put("sprite", project->getEventObjGfxConstants().keys().first()); event->put("movement_type", project->movementTypes->first()); - if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { + if (projectConfig.getObjectEventInConnectionEnabled()) { event->put("in_connection", false); } event->put("radius_x", 0); @@ -93,7 +93,7 @@ Event* Event::createNewHealLocationEvent(QString map_name) event->put("loc_name", QString(Map::mapConstantFromName(map_name)).remove(0,4)); event->put("id_name", map_name.replace(QRegularExpression("([a-z])([A-Z])"), "\\1_\\2").toUpper()); event->put("elevation", 3); - if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { + if (projectConfig.getHealLocationRespawnDataEnabled()) { event->put("respawn_map", map_name); event->put("respawn_npc", 1); } @@ -141,8 +141,10 @@ Event* Event::createNewHiddenItemEvent(Project *project) event->put("item", project->itemNames->first()); event->put("flag", project->flagNames->first()); event->put("elevation", 3); - if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { + if (projectConfig.getHiddenItemQuantityEnabled()) { event->put("quantity", 1); + } + if (projectConfig.getHiddenItemRequiresItemfinderEnabled()) { event->put("underfoot", false); } return event; @@ -168,108 +170,101 @@ int Event::getPixelY() return (this->y() * 16) - qMax(0, this->spriteHeight - 16); } +static QMap expectedObjectFields { + {"graphics_id", true}, + {"x", true}, + {"y", true}, + {"elevation", true}, + {"movement_type", true}, + {"movement_range_x", true}, + {"movement_range_y", true}, + {"trainer_type", true}, + {"trainer_sight_or_berry_tree_id", true}, + {"script", true}, + {"flag", true}, +}; + +static QMap expectedWarpFields { + {"x", true}, + {"y", true}, + {"elevation", true}, + {"dest_map", true}, + {"dest_warp_id", true}, +}; + +static QMap expectedTriggerFields { + {"type", true}, + {"x", true}, + {"y", true}, + {"elevation", true}, + {"var", true}, + {"var_value", true}, + {"script", true}, +}; + +static QMap expectedWeatherTriggerFields { + {"type", true}, + {"x", true}, + {"y", true}, + {"elevation", true}, + {"weather", true}, +}; + +static QMap expectedSignFields { + {"type", true}, + {"x", true}, + {"y", true}, + {"elevation", true}, + {"player_facing_dir", true}, + {"script", true}, +}; + +static QMap expectedHiddenItemFields { + {"type", true}, + {"x", true}, + {"y", true}, + {"elevation", true}, + {"item", true}, + {"flag", true}, +}; + +static QMap expectedSecretBaseFields { + {"type", true}, + {"x", true}, + {"y", true}, + {"elevation", true}, + {"secret_base_id", true}, +}; + QMap Event::getExpectedFields() { QString type = this->get("event_type"); + QMap expectedFields = QMap(); if (type == EventType::Object) { - if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { - return QMap { - {"graphics_id", true}, - {"in_connection", true}, - {"x", true}, - {"y", true}, - {"elevation", true}, - {"movement_type", true}, - {"movement_range_x", true}, - {"movement_range_y", true}, - {"trainer_type", true}, - {"trainer_sight_or_berry_tree_id", true}, - {"script", true}, - {"flag", true}, - }; - } else { - return QMap { - {"graphics_id", true}, - {"x", true}, - {"y", true}, - {"elevation", true}, - {"movement_type", true}, - {"movement_range_x", true}, - {"movement_range_y", true}, - {"trainer_type", true}, - {"trainer_sight_or_berry_tree_id", true}, - {"script", true}, - {"flag", true}, - }; + expectedFields = expectedObjectFields; + if (projectConfig.getObjectEventInConnectionEnabled()) { + expectedFields.insert("in_connection", true); } } else if (type == EventType::Warp) { - return QMap { - {"x", true}, - {"y", true}, - {"elevation", true}, - {"dest_map", true}, - {"dest_warp_id", true}, - }; + expectedFields = expectedWarpFields; } else if (type == EventType::Trigger) { - return QMap { - {"type", true}, - {"x", true}, - {"y", true}, - {"elevation", true}, - {"var", true}, - {"var_value", true}, - {"script", true}, - }; + expectedFields = expectedTriggerFields; } else if (type == EventType::WeatherTrigger) { - return QMap { - {"type", true}, - {"x", true}, - {"y", true}, - {"elevation", true}, - {"weather", true}, - }; + expectedFields = expectedWeatherTriggerFields; } else if (type == EventType::Sign) { - return QMap { - {"type", true}, - {"x", true}, - {"y", true}, - {"elevation", true}, - {"player_facing_dir", true}, - {"script", true}, - }; + expectedFields = expectedSignFields; } else if (type == EventType::HiddenItem) { - if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { - return QMap { - {"type", true}, - {"x", true}, - {"y", true}, - {"elevation", true}, - {"item", true}, - {"flag", true}, - {"quantity", true}, - {"underfoot", true}, - }; - } else { - return QMap { - {"type", true}, - {"x", true}, - {"y", true}, - {"elevation", true}, - {"item", true}, - {"flag", true}, - }; + expectedFields = expectedHiddenItemFields; + if (projectConfig.getHiddenItemQuantityEnabled()) { + expectedFields.insert("quantity", true); + } + if (projectConfig.getHiddenItemRequiresItemfinderEnabled()) { + expectedFields.insert("underfoot", true); } } else if (type == EventType::SecretBase) { - return QMap { - {"type", true}, - {"x", true}, - {"y", true}, - {"elevation", true}, - {"secret_base_id", true}, - }; - } else { - return QMap(); + expectedFields = expectedSecretBaseFields; } + return expectedFields; }; void Event::readCustomValues(QJsonObject values) @@ -296,7 +291,7 @@ OrderedJson::object Event::buildObjectEventJSON() { OrderedJson::object eventObj; eventObj["graphics_id"] = this->get("sprite"); - if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { + if (projectConfig.getObjectEventInConnectionEnabled()) { eventObj["in_connection"] = this->getInt("in_connection") > 0 || this->get("in_connection") == "TRUE"; } eventObj["x"] = this->getS16("x"); @@ -378,8 +373,10 @@ OrderedJson::object Event::buildHiddenItemEventJSON() hiddenItemObj["elevation"] = this->getInt("elevation"); hiddenItemObj["item"] = this->get("item"); hiddenItemObj["flag"] = this->get("flag"); - if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { + if (projectConfig.getHiddenItemQuantityEnabled()) { hiddenItemObj["quantity"] = this->getInt("quantity"); + } + if (projectConfig.getHiddenItemRequiresItemfinderEnabled()) { hiddenItemObj["underfoot"] = this->getInt("underfoot") > 0 || this->get("underfoot") == "TRUE"; } this->addCustomValuesTo(&hiddenItemObj); diff --git a/src/core/heallocation.cpp b/src/core/heallocation.cpp index e88d99e6..8ecb70a8 100644 --- a/src/core/heallocation.cpp +++ b/src/core/heallocation.cpp @@ -26,7 +26,7 @@ HealLocation HealLocation::fromEvent(Event *event) } hl.x = event->getU16("x"); hl.y = event->getU16("y"); - if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { + if (projectConfig.getHealLocationRespawnDataEnabled()) { hl.respawnNPC = event->getU16("respawn_npc"); hl.respawnMap = Map::mapConstantFromName(event->get("respawn_map")).remove(0,4); } diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 11090201..f42323f6 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -174,44 +174,50 @@ void MainWindow::setProjectSpecificUIVisibility() ui->checkBox_AllowRunning->setVisible(false); ui->checkBox_AllowBiking->setVisible(false); ui->checkBox_AllowEscapeRope->setVisible(false); - ui->spinBox_FloorNumber->setVisible(false); ui->label_AllowRunning->setVisible(false); ui->label_AllowBiking->setVisible(false); ui->label_AllowEscapeRope->setVisible(false); - ui->label_FloorNumber->setVisible(false); - ui->newEventToolButton->newWeatherTriggerAction->setVisible(true); - ui->newEventToolButton->newSecretBaseAction->setVisible(true); ui->actionRegion_Map_Editor->setVisible(true); break; case BaseGameVersion::pokeemerald: ui->checkBox_AllowRunning->setVisible(true); ui->checkBox_AllowBiking->setVisible(true); ui->checkBox_AllowEscapeRope->setVisible(true); - ui->spinBox_FloorNumber->setVisible(false); ui->label_AllowRunning->setVisible(true); ui->label_AllowBiking->setVisible(true); ui->label_AllowEscapeRope->setVisible(true); - ui->label_FloorNumber->setVisible(false); - ui->newEventToolButton->newWeatherTriggerAction->setVisible(true); - ui->newEventToolButton->newSecretBaseAction->setVisible(true); ui->actionRegion_Map_Editor->setVisible(true); break; case BaseGameVersion::pokefirered: ui->checkBox_AllowRunning->setVisible(true); ui->checkBox_AllowBiking->setVisible(true); ui->checkBox_AllowEscapeRope->setVisible(true); - ui->spinBox_FloorNumber->setVisible(true); ui->label_AllowRunning->setVisible(true); ui->label_AllowBiking->setVisible(true); ui->label_AllowEscapeRope->setVisible(true); - ui->label_FloorNumber->setVisible(true); - ui->newEventToolButton->newWeatherTriggerAction->setVisible(false); - ui->newEventToolButton->newSecretBaseAction->setVisible(false); // TODO: pokefirered is not set up for the Region Map Editor and vice versa. // porymap will crash on attempt. Remove below once resolved ui->actionRegion_Map_Editor->setVisible(false); break; } + + if (projectConfig.getEventWeatherTriggerEnabled()) { + ui->newEventToolButton->newWeatherTriggerAction->setVisible(true); + } else { + ui->newEventToolButton->newWeatherTriggerAction->setVisible(false); + } + if (projectConfig.getEventSecretBaseEnabled()) { + ui->newEventToolButton->newSecretBaseAction->setVisible(true); + } else { + ui->newEventToolButton->newSecretBaseAction->setVisible(false); + } + if (projectConfig.getFloorNumberEnabled()) { + ui->spinBox_FloorNumber->setVisible(true); + ui->label_FloorNumber->setVisible(true); + } else { + ui->spinBox_FloorNumber->setVisible(false); + ui->label_FloorNumber->setVisible(false); + } } void MainWindow::mapSortOrder_changed(QAction *action) @@ -707,6 +713,8 @@ bool MainWindow::loadDataStructures() { && project->readMapTypes() && project->readMapBattleScenes() && project->readWeatherNames() + && project->readCoordEventWeatherNames() + && project->readSecretBaseIds() && project->readBgEventFacingDirections() && project->readTrainerTypes() && project->readMetatileBehaviors() @@ -716,10 +724,6 @@ bool MainWindow::loadDataStructures() { && project->readMiscellaneousConstants() && project->readSpeciesIconPaths() && project->readWildMonData(); - if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokeemerald || projectConfig.getBaseGameVersion() == BaseGameVersion::pokeruby) - success = success - && project->readSecretBaseIds() - && project->readCoordEventWeatherNames(); return success && loadProjectCombos(); } @@ -1466,7 +1470,10 @@ void MainWindow::updateSelectedObjects() { QList frames; - bool pokefirered = projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered; + bool inConnectionEnabled = projectConfig.getObjectEventInConnectionEnabled(); + bool quantityEnabled = projectConfig.getHiddenItemQuantityEnabled(); + bool underfootEnabled = projectConfig.getHiddenItemRequiresItemfinderEnabled(); + bool respawnDataEnabled = projectConfig.getHealLocationRespawnDataEnabled(); for (DraggablePixmapItem *item : *events) { EventPropertiesFrame *frame = new EventPropertiesFrame(item->event); // frame->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); @@ -1561,9 +1568,7 @@ void MainWindow::updateSelectedObjects() { fields << "event_flag"; fields << "trainer_type"; fields << "sight_radius_tree_id"; - if (pokefirered) { - fields << "in_connection"; - } + if (inConnectionEnabled) fields << "in_connection"; } else if (event_type == EventType::Warp) { fields << "destination_map_name"; @@ -1584,10 +1589,8 @@ void MainWindow::updateSelectedObjects() { else if (event_type == EventType::HiddenItem) { fields << "item"; fields << "flag"; - if (pokefirered) { - fields << "quantity"; - fields << "underfoot"; - } + if (quantityEnabled) fields << "quantity"; + if (underfootEnabled) fields << "underfoot"; } else if (event_type == EventType::SecretBase) { fields << "secret_base_id"; @@ -1596,7 +1599,7 @@ void MainWindow::updateSelectedObjects() { // Hide elevation so users don't get impression that editing it is meaningful. frame->ui->spinBox_z->setVisible(false); frame->ui->label_z->setVisible(false); - if (pokefirered) { + if (respawnDataEnabled) { fields << "respawn_map"; fields << "respawn_npc"; } diff --git a/src/project.cpp b/src/project.cpp index 4339a1d8..52794047 100644 --- a/src/project.cpp +++ b/src/project.cpp @@ -178,81 +178,38 @@ void Project::setNewMapConnections(Map *map) { map->connections.clear(); } +static QMap defaultTopLevelMapFields { + {"id", true}, + {"name", true}, + {"layout", true}, + {"music", true}, + {"region_map_section", true}, + {"requires_flash", true}, + {"weather", true}, + {"map_type", true}, + {"show_map_name", true}, + {"battle_scene", true}, + {"connections", true}, + {"object_events", true}, + {"warp_events", true}, + {"coord_events", true}, + {"bg_events", true}, + {"shared_events_map", true}, + {"shared_scripts_map", true}, +}; + QMap Project::getTopLevelMapFields() { - if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokeemerald) { - return QMap - { - {"id", true}, - {"name", true}, - {"layout", true}, - {"music", true}, - {"region_map_section", true}, - {"requires_flash", true}, - {"weather", true}, - {"map_type", true}, - {"allow_cycling", true}, - {"allow_escaping", true}, - {"allow_running", true}, - {"show_map_name", true}, - {"battle_scene", true}, - {"connections", true}, - {"object_events", true}, - {"warp_events", true}, - {"coord_events", true}, - {"bg_events", true}, - {"shared_events_map", true}, - {"shared_scripts_map", true}, - }; - } else if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { - return QMap - { - {"id", true}, - {"name", true}, - {"layout", true}, - {"music", true}, - {"region_map_section", true}, - {"requires_flash", true}, - {"weather", true}, - {"map_type", true}, - {"allow_cycling", true}, - {"allow_escaping", true}, - {"allow_running", true}, - {"show_map_name", true}, - {"floor_number", true}, - {"battle_scene", true}, - {"connections", true}, - {"object_events", true}, - {"warp_events", true}, - {"coord_events", true}, - {"bg_events", true}, - {"shared_events_map", true}, - {"shared_scripts_map", true}, - }; - } else if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokeruby) { - return QMap - { - {"id", true}, - {"name", true}, - {"layout", true}, - {"music", true}, - {"region_map_section", true}, - {"requires_flash", true}, - {"weather", true}, - {"map_type", true}, - {"show_map_name", true}, - {"battle_scene", true}, - {"connections", true}, - {"object_events", true}, - {"warp_events", true}, - {"coord_events", true}, - {"bg_events", true}, - {"shared_events_map", true}, - {"shared_scripts_map", true}, - }; - } else { - logError("Invalid game version"); - return QMap(); + QMap topLevelMapFields = defaultTopLevelMapFields; + if (projectConfig.getBaseGameVersion() != BaseGameVersion::pokeruby) { + topLevelMapFields.insert("allow_cycling", true); + topLevelMapFields.insert("allow_escaping", true); + topLevelMapFields.insert("allow_running", true); } + + if (projectConfig.getFloorNumberEnabled()) { + topLevelMapFields.insert("floor_number", true); + } + return topLevelMapFields; } bool Project::loadMapData(Map* map) { @@ -278,14 +235,12 @@ bool Project::loadMapData(Map* map) { map->requiresFlash = QString::number(mapObj["requires_flash"].toBool()); map->show_location = QString::number(mapObj["show_map_name"].toBool()); map->battle_scene = mapObj["battle_scene"].toString(); - if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokeemerald) { - map->allowBiking = QString::number(mapObj["allow_cycling"].toBool()); - map->allowEscapeRope = QString::number(mapObj["allow_escaping"].toBool()); - map->allowRunning = QString::number(mapObj["allow_running"].toBool()); - } else if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { + if (projectConfig.getBaseGameVersion() != BaseGameVersion::pokeruby) { map->allowBiking = QString::number(mapObj["allow_cycling"].toBool()); map->allowEscapeRope = QString::number(mapObj["allow_escaping"].toBool()); map->allowRunning = QString::number(mapObj["allow_running"].toBool()); + } + if (projectConfig.getFloorNumberEnabled()) { map->floorNumber = mapObj["floor_number"].toInt(); } map->sharedEventsMap = mapObj["shared_events_map"].toString(); @@ -299,7 +254,7 @@ bool Project::loadMapData(Map* map) { Event *object = new Event(event, EventType::Object); object->put("map_name", map->name); object->put("sprite", event["graphics_id"].toString()); - if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { + if (projectConfig.getObjectEventInConnectionEnabled()) { object->put("in_connection", event["in_connection"].toBool()); } object->put("x", QString::number(event["x"].toInt())); @@ -360,7 +315,7 @@ bool Project::loadMapData(Map* map) { heal->put("destination_map_name", mapConstantsToMapNames->value(map->name)); heal->put("event_group_type", "heal_event_group"); heal->put("event_type", EventType::HealLocation); - if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { + if (projectConfig.getHealLocationRespawnDataEnabled()) { heal->put("respawn_map", mapConstantsToMapNames->value(QString("MAP_" + loc.respawnMap))); heal->put("respawn_npc", loc.respawnNPC); } @@ -423,8 +378,10 @@ bool Project::loadMapData(Map* map) { bg->put("elevation", QString::number(event["elevation"].toInt())); bg->put("item", event["item"].toString()); bg->put("flag", event["flag"].toString()); - if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { + if (projectConfig.getHiddenItemQuantityEnabled()) { bg->put("quantity", event["quantity"].toInt()); + } + if (projectConfig.getHiddenItemRequiresItemfinderEnabled()) { bg->put("underfoot", event["underfoot"].toBool()); } bg->put("event_group_type", "bg_event_group"); @@ -513,16 +470,13 @@ void Project::setNewMapHeader(Map* map, int mapIndex) { map->song = defaultSong; if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokeruby) { map->show_location = "TRUE"; - } else if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokeemerald) { - map->allowBiking = "1"; - map->allowEscapeRope = "0"; - map->allowRunning = "1"; - map->show_location = "1"; - } else if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { + } else { map->allowBiking = "1"; map->allowEscapeRope = "0"; map->allowRunning = "1"; map->show_location = "1"; + } + if (projectConfig.getFloorNumberEnabled()) { map->floorNumber = 0; } @@ -903,7 +857,7 @@ void Project::saveMapConstantsHeader() { // and indexes as defines in root + /include/constants/heal_locations.h void Project::saveHealLocationStruct(Map *map) { QString constantPrefix, arrayName; - if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { + if (projectConfig.getHealLocationRespawnDataEnabled()) { constantPrefix = "SPAWN_"; arrayName = "sSpawnPoints"; } else { @@ -971,7 +925,7 @@ void Project::saveHealLocationStruct(Map *map) { } i++; } - if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { + if (projectConfig.getHealLocationRespawnDataEnabled()) { // Save second array (map where player respawns for each heal location) data_text += QString("};\n\n%1%2u16 sWhiteoutRespawnHealCenterMapIdxs[][2] =\n{\n") .arg(dataQualifiers.value("heal_locations").isStatic ? "static " : "") @@ -1403,7 +1357,7 @@ void Project::saveMap(Map *map) { mapObj["allow_escaping"] = map->allowEscapeRope.toInt() > 0 || map->allowEscapeRope == "TRUE"; mapObj["allow_running"] = map->allowRunning.toInt() > 0 || map->allowRunning == "TRUE"; mapObj["show_map_name"] = map->show_location.toInt() > 0 || map->show_location == "TRUE"; - if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { + if (projectConfig.getFloorNumberEnabled()) { mapObj["floor_number"] = map->floorNumber; } mapObj["battle_scene"] = map->battle_scene; @@ -2159,7 +2113,7 @@ bool Project::readHealLocations() { QString text = parser.readTextFile(root + "/" + filename); text.replace(QRegularExpression("//.*?(\r\n?|\n)|/\\*.*?\\*/", QRegularExpression::DotMatchesEverythingOption), ""); - if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { + if (projectConfig.getHealLocationRespawnDataEnabled()) { dataQualifiers.insert("heal_locations", getDataQualifiers(text, "sSpawnPoints")); QRegularExpression spawnRegex("SPAWN_(?[A-Za-z0-9_]+)\\s*- 1\\]\\s* = \\{MAP_GROUP[\\(\\s]+(?[A-Za-z0-9_]+)[\\s\\)]+,\\s*MAP_NUM[\\(\\s]+(\\2)[\\s\\)]+,\\s*(?[0-9A-Fa-fx]+),\\s*(?[0-9A-Fa-fx]+)"); QRegularExpression respawnMapRegex("SPAWN_(?[A-Za-z0-9_]+)\\s*- 1\\]\\s* = \\{MAP_GROUP[\\(\\s]+(?[A-Za-z0-9_]+)[\\s\\)]+,\\s*MAP_NUM[\\(\\s]+(\\2)[\\s\\)]+}"); @@ -2302,6 +2256,8 @@ bool Project::readWeatherNames() { } bool Project::readCoordEventWeatherNames() { + if (!projectConfig.getEventWeatherTriggerEnabled()) return true; + coordEventWeatherNames->clear(); QStringList prefixes = (QStringList() << "COORD_EVENT_WEATHER_"); QString filename = "include/constants/weather.h"; @@ -2315,6 +2271,8 @@ bool Project::readCoordEventWeatherNames() { } bool Project::readSecretBaseIds() { + if (!projectConfig.getEventSecretBaseEnabled()) return true; + secretBaseIds->clear(); QStringList prefixes = (QStringList() << "SECRET_BASE_[A-Za-z0-9_]*_[0-9]+"); QString filename = "include/constants/secret_bases.h"; diff --git a/src/ui/newmappopup.cpp b/src/ui/newmappopup.cpp index 21e1639f..170e2ed6 100644 --- a/src/ui/newmappopup.cpp +++ b/src/ui/newmappopup.cpp @@ -122,31 +122,25 @@ void NewMapPopup::setDefaultValues(int groupNum, QString mapSec) { ui->checkBox_NewMap_Allow_Running->setVisible(false); ui->checkBox_NewMap_Allow_Biking->setVisible(false); ui->checkBox_NewMap_Allow_Escape_Rope->setVisible(false); - ui->spinBox_NewMap_Floor_Number->setVisible(false); ui->label_NewMap_Allow_Running->setVisible(false); ui->label_NewMap_Allow_Biking->setVisible(false); ui->label_NewMap_Allow_Escape_Rope->setVisible(false); - ui->label_NewMap_Floor_Number->setVisible(false); break; case BaseGameVersion::pokeemerald: ui->checkBox_NewMap_Allow_Running->setVisible(true); ui->checkBox_NewMap_Allow_Biking->setVisible(true); ui->checkBox_NewMap_Allow_Escape_Rope->setVisible(true); - ui->spinBox_NewMap_Floor_Number->setVisible(false); ui->label_NewMap_Allow_Running->setVisible(true); ui->label_NewMap_Allow_Biking->setVisible(true); ui->label_NewMap_Allow_Escape_Rope->setVisible(true); - ui->label_NewMap_Floor_Number->setVisible(false); break; case BaseGameVersion::pokefirered: ui->checkBox_NewMap_Allow_Running->setVisible(true); ui->checkBox_NewMap_Allow_Biking->setVisible(true); ui->checkBox_NewMap_Allow_Escape_Rope->setVisible(true); - ui->spinBox_NewMap_Floor_Number->setVisible(true); ui->label_NewMap_Allow_Running->setVisible(true); ui->label_NewMap_Allow_Biking->setVisible(true); ui->label_NewMap_Allow_Escape_Rope->setVisible(true); - ui->label_NewMap_Floor_Number->setVisible(true); break; } if (projectConfig.getUseCustomBorderSize()) { @@ -160,6 +154,13 @@ void NewMapPopup::setDefaultValues(int groupNum, QString mapSec) { ui->label_NewMap_BorderWidth->setVisible(false); ui->label_NewMap_BorderHeight->setVisible(false); } + if (projectConfig.getFloorNumberEnabled()) { + ui->spinBox_NewMap_Floor_Number->setVisible(true); + ui->label_NewMap_Floor_Number->setVisible(true); + } else { + ui->spinBox_NewMap_Floor_Number->setVisible(false); + ui->label_NewMap_Floor_Number->setVisible(false); + } } void NewMapPopup::on_lineEdit_NewMap_Name_textChanged(const QString &text) { @@ -223,14 +224,12 @@ void NewMapPopup::on_pushButton_NewMap_Accept_clicked() { newMap->isFlyable = "TRUE"; } - if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokeemerald) { - newMap->allowRunning = this->ui->checkBox_NewMap_Allow_Running->isChecked() ? "1" : "0"; - newMap->allowBiking = this->ui->checkBox_NewMap_Allow_Biking->isChecked() ? "1" : "0"; - newMap->allowEscapeRope = this->ui->checkBox_NewMap_Allow_Escape_Rope->isChecked() ? "1" : "0"; - } else if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) { + if (projectConfig.getBaseGameVersion() != BaseGameVersion::pokeruby) { newMap->allowRunning = this->ui->checkBox_NewMap_Allow_Running->isChecked() ? "1" : "0"; newMap->allowBiking = this->ui->checkBox_NewMap_Allow_Biking->isChecked() ? "1" : "0"; newMap->allowEscapeRope = this->ui->checkBox_NewMap_Allow_Escape_Rope->isChecked() ? "1" : "0"; + } + if (projectConfig.getFloorNumberEnabled()) { newMap->floorNumber = this->ui->spinBox_NewMap_Floor_Number->value(); }