Add config options for some project-specific features

This commit is contained in:
GriffinR 2020-05-22 17:51:56 -04:00 committed by huderlem
parent aa2ce13551
commit 125a287b9c
7 changed files with 328 additions and 223 deletions

View file

@ -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<QString> scripts);
QList<QString> 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<QString> customScripts;
};

View file

@ -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<QString> paths = value.split(",");
@ -400,6 +442,13 @@ QMap<QString, QString> 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<BaseGameVersion>(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<QString> scripts) {
this->customScripts = scripts;
this->save();

View file

@ -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<QString, bool> 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<QString, bool> expectedWarpFields {
{"x", true},
{"y", true},
{"elevation", true},
{"dest_map", true},
{"dest_warp_id", true},
};
static QMap<QString, bool> expectedTriggerFields {
{"type", true},
{"x", true},
{"y", true},
{"elevation", true},
{"var", true},
{"var_value", true},
{"script", true},
};
static QMap<QString, bool> expectedWeatherTriggerFields {
{"type", true},
{"x", true},
{"y", true},
{"elevation", true},
{"weather", true},
};
static QMap<QString, bool> expectedSignFields {
{"type", true},
{"x", true},
{"y", true},
{"elevation", true},
{"player_facing_dir", true},
{"script", true},
};
static QMap<QString, bool> expectedHiddenItemFields {
{"type", true},
{"x", true},
{"y", true},
{"elevation", true},
{"item", true},
{"flag", true},
};
static QMap<QString, bool> expectedSecretBaseFields {
{"type", true},
{"x", true},
{"y", true},
{"elevation", true},
{"secret_base_id", true},
};
QMap<QString, bool> Event::getExpectedFields()
{
QString type = this->get("event_type");
QMap<QString, bool> expectedFields = QMap<QString, bool>();
if (type == EventType::Object) {
if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered) {
return QMap<QString, bool> {
{"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<QString, bool> {
{"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<QString, bool> {
{"x", true},
{"y", true},
{"elevation", true},
{"dest_map", true},
{"dest_warp_id", true},
};
expectedFields = expectedWarpFields;
} else if (type == EventType::Trigger) {
return QMap<QString, bool> {
{"type", true},
{"x", true},
{"y", true},
{"elevation", true},
{"var", true},
{"var_value", true},
{"script", true},
};
expectedFields = expectedTriggerFields;
} else if (type == EventType::WeatherTrigger) {
return QMap<QString, bool> {
{"type", true},
{"x", true},
{"y", true},
{"elevation", true},
{"weather", true},
};
expectedFields = expectedWeatherTriggerFields;
} else if (type == EventType::Sign) {
return QMap<QString, bool> {
{"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<QString, bool> {
{"type", true},
{"x", true},
{"y", true},
{"elevation", true},
{"item", true},
{"flag", true},
{"quantity", true},
{"underfoot", true},
};
} else {
return QMap<QString, bool> {
{"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<QString, bool> {
{"type", true},
{"x", true},
{"y", true},
{"elevation", true},
{"secret_base_id", true},
};
} else {
return QMap<QString, bool>();
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);

View file

@ -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);
}

View file

@ -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<EventPropertiesFrame *> 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";
}

View file

@ -178,81 +178,38 @@ void Project::setNewMapConnections(Map *map) {
map->connections.clear();
}
static QMap<QString, bool> 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<QString, bool> Project::getTopLevelMapFields() {
if (projectConfig.getBaseGameVersion() == BaseGameVersion::pokeemerald) {
return QMap<QString, bool>
{
{"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<QString, bool>
{
{"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<QString, bool>
{
{"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<QString, bool>();
QMap<QString, bool> 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_(?<id>[A-Za-z0-9_]+)\\s*- 1\\]\\s* = \\{MAP_GROUP[\\(\\s]+(?<map>[A-Za-z0-9_]+)[\\s\\)]+,\\s*MAP_NUM[\\(\\s]+(\\2)[\\s\\)]+,\\s*(?<x>[0-9A-Fa-fx]+),\\s*(?<y>[0-9A-Fa-fx]+)");
QRegularExpression respawnMapRegex("SPAWN_(?<id>[A-Za-z0-9_]+)\\s*- 1\\]\\s* = \\{MAP_GROUP[\\(\\s]+(?<map>[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";

View file

@ -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();
}