Add config options for some project-specific features
This commit is contained in:
parent
aa2ce13551
commit
125a287b9c
7 changed files with 328 additions and 223 deletions
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
122
src/config.cpp
122
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<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();
|
||||
|
|
|
@ -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,27 +170,7 @@ int Event::getPixelY()
|
|||
return (this->y() * 16) - qMax(0, this->spriteHeight - 16);
|
||||
}
|
||||
|
||||
QMap<QString, bool> Event::getExpectedFields()
|
||||
{
|
||||
QString type = this->get("event_type");
|
||||
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> {
|
||||
static QMap<QString, bool> expectedObjectFields {
|
||||
{"graphics_id", true},
|
||||
{"x", true},
|
||||
{"y", true},
|
||||
|
@ -201,17 +183,16 @@ QMap<QString, bool> Event::getExpectedFields()
|
|||
{"script", true},
|
||||
{"flag", true},
|
||||
};
|
||||
}
|
||||
} else if (type == EventType::Warp) {
|
||||
return QMap<QString, bool> {
|
||||
|
||||
static QMap<QString, bool> expectedWarpFields {
|
||||
{"x", true},
|
||||
{"y", true},
|
||||
{"elevation", true},
|
||||
{"dest_map", true},
|
||||
{"dest_warp_id", true},
|
||||
};
|
||||
} else if (type == EventType::Trigger) {
|
||||
return QMap<QString, bool> {
|
||||
|
||||
static QMap<QString, bool> expectedTriggerFields {
|
||||
{"type", true},
|
||||
{"x", true},
|
||||
{"y", true},
|
||||
|
@ -220,16 +201,16 @@ QMap<QString, bool> Event::getExpectedFields()
|
|||
{"var_value", true},
|
||||
{"script", true},
|
||||
};
|
||||
} else if (type == EventType::WeatherTrigger) {
|
||||
return QMap<QString, bool> {
|
||||
|
||||
static QMap<QString, bool> expectedWeatherTriggerFields {
|
||||
{"type", true},
|
||||
{"x", true},
|
||||
{"y", true},
|
||||
{"elevation", true},
|
||||
{"weather", true},
|
||||
};
|
||||
} else if (type == EventType::Sign) {
|
||||
return QMap<QString, bool> {
|
||||
|
||||
static QMap<QString, bool> expectedSignFields {
|
||||
{"type", true},
|
||||
{"x", true},
|
||||
{"y", true},
|
||||
|
@ -237,20 +218,8 @@ QMap<QString, bool> Event::getExpectedFields()
|
|||
{"player_facing_dir", true},
|
||||
{"script", true},
|
||||
};
|
||||
} 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> {
|
||||
|
||||
static QMap<QString, bool> expectedHiddenItemFields {
|
||||
{"type", true},
|
||||
{"x", true},
|
||||
{"y", true},
|
||||
|
@ -258,18 +227,44 @@ QMap<QString, bool> Event::getExpectedFields()
|
|||
{"item", true},
|
||||
{"flag", true},
|
||||
};
|
||||
}
|
||||
} else if (type == EventType::SecretBase) {
|
||||
return QMap<QString, bool> {
|
||||
|
||||
static QMap<QString, bool> expectedSecretBaseFields {
|
||||
{"type", true},
|
||||
{"x", true},
|
||||
{"y", true},
|
||||
{"elevation", true},
|
||||
{"secret_base_id", true},
|
||||
};
|
||||
} else {
|
||||
return QMap<QString, bool>();
|
||||
|
||||
QMap<QString, bool> Event::getExpectedFields()
|
||||
{
|
||||
QString type = this->get("event_type");
|
||||
QMap<QString, bool> expectedFields = QMap<QString, bool>();
|
||||
if (type == EventType::Object) {
|
||||
expectedFields = expectedObjectFields;
|
||||
if (projectConfig.getObjectEventInConnectionEnabled()) {
|
||||
expectedFields.insert("in_connection", true);
|
||||
}
|
||||
} else if (type == EventType::Warp) {
|
||||
expectedFields = expectedWarpFields;
|
||||
} else if (type == EventType::Trigger) {
|
||||
expectedFields = expectedTriggerFields;
|
||||
} else if (type == EventType::WeatherTrigger) {
|
||||
expectedFields = expectedWeatherTriggerFields;
|
||||
} else if (type == EventType::Sign) {
|
||||
expectedFields = expectedSignFields;
|
||||
} else if (type == EventType::HiddenItem) {
|
||||
expectedFields = expectedHiddenItemFields;
|
||||
if (projectConfig.getHiddenItemQuantityEnabled()) {
|
||||
expectedFields.insert("quantity", true);
|
||||
}
|
||||
if (projectConfig.getHiddenItemRequiresItemfinderEnabled()) {
|
||||
expectedFields.insert("underfoot", true);
|
||||
}
|
||||
} else if (type == EventType::SecretBase) {
|
||||
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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
|
|
140
src/project.cpp
140
src/project.cpp
|
@ -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";
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue