Moving paths to project config

- Replaced all instances of hardcoded paths with requesting a path from the new project config file properties for "path/".
- As a result, all default paths hardcoded into porymap are now in one place.
- When reading the config file, it now trims out white space around the key and value.
This commit is contained in:
tustin2121 2022-09-01 12:14:47 -04:00
parent 8e83daac84
commit 3d9cd2ad0d
6 changed files with 190 additions and 59 deletions

View file

@ -33,16 +33,19 @@ to a file, it probably is not a good idea to edit yourself unless otherwise note
include/constants/flags.h, yes, no, include/constants/flags.h, yes, no,
include/constants/vars.h, yes, no, include/constants/vars.h, yes, no,
include/constants/weather.h, yes, no, include/constants/weather.h, yes, no,
include/constants/songs.h, yes, no,
include/constants/heal_locations.h, no, yes, include/constants/heal_locations.h, no, yes,
include/constants/pokemon.h, yes, no, reads min and max level constants include/constants/pokemon.h, yes, no, reads min and max level constants
include/constants/map_types.h, yes, no, include/constants/map_types.h, yes, no,
include/constants/trainer_types.h, yes, no, include/constants/trainer_types.h, yes, no,
include/constants/secret_bases.h, yes, no, pokeemerald and pokeruby only include/constants/secret_bases.h, yes, no, pokeemerald and pokeruby only
include/constants/event_object_movement.h, yes, no, include/constants/event_object_movement.h, yes, no,
include/constants/event_objects.h, yes, no,
include/constants/event_bg.h, yes, no, include/constants/event_bg.h, yes, no,
include/constants/region_map_sections.h, yes, no, include/constants/region_map_sections.h, yes, no,
include/constants/metatile_labels.h, yes, yes, include/constants/metatile_labels.h, yes, yes,
include/constants/metatile_behaviors.h, yes, no, include/constants/metatile_behaviors.h, yes, no,
include/fieldmap.h, yes, no, reads tileset related constants include/fieldmap.h, yes, no, reads tileset related constants
src/event_object_movement.c, yes, no,

View file

@ -139,6 +139,50 @@ enum BaseGameVersion {
pokeemerald, pokeemerald,
}; };
enum ProjectFilePath {
data_map_folders,
data_scripts_folders,
data_layouts_folders,
data_event_scripts,
json_map_groups,
json_layouts,
json_wild_encounters,
json_region_map_entries,
json_region_porymap_cfg,
tilesets_headers,
tilesets_graphics,
tilesets_metatiles,
data_obj_event_gfx_pointers,
data_obj_event_gfx_info,
data_obj_event_pic_tables,
data_obj_event_gfx,
data_pokemon_gfx,
data_heal_locations,
data_region_map_entries,
constants_global,
constants_map_groups,
constants_items,
constants_opponents,
constants_flags,
constants_vars,
constants_weather,
constants_songs,
constants_heal_locations,
constants_pokemon,
constants_map_types,
constants_trainer_types,
constants_secret_bases,
constants_obj_event_movement,
constants_obj_events,
constants_event_bg,
constants_region_map_sections,
constants_metatile_labels,
constants_metatile_behaviors,
constants_fieldmap,
path_initial_facing_table,
path_pokemon_icon_table,
};
class ProjectConfig: public KeyValueConfigBase class ProjectConfig: public KeyValueConfigBase
{ {
public: public:
@ -157,6 +201,7 @@ public:
this->enableFloorNumber = false; this->enableFloorNumber = false;
this->createMapTextFile = false; this->createMapTextFile = false;
this->enableTripleLayerMetatiles = false; this->enableTripleLayerMetatiles = false;
this->filePaths.clear();
this->readKeys.clear(); this->readKeys.clear();
} }
void setBaseGameVersion(BaseGameVersion baseGameVersion); void setBaseGameVersion(BaseGameVersion baseGameVersion);
@ -186,6 +231,8 @@ public:
bool getCreateMapTextFileEnabled(); bool getCreateMapTextFileEnabled();
void setTripleLayerMetatilesEnabled(bool enable); void setTripleLayerMetatilesEnabled(bool enable);
bool getTripleLayerMetatilesEnabled(); bool getTripleLayerMetatilesEnabled();
void setFilePath(ProjectFilePath pathId, QString path);
QString getFilePath(ProjectFilePath pathId);
protected: protected:
virtual QString getConfigFilepath() override; virtual QString getConfigFilepath() override;
virtual void parseConfigKeyValue(QString key, QString value) override; virtual void parseConfigKeyValue(QString key, QString value) override;
@ -195,6 +242,7 @@ protected:
private: private:
BaseGameVersion baseGameVersion; BaseGameVersion baseGameVersion;
QString projectDir; QString projectDir;
QMap<ProjectFilePath, QString> filePaths;
bool usePoryScript; bool usePoryScript;
bool useCustomBorderSize; bool useCustomBorderSize;
bool enableEventWeatherTrigger; bool enableEventWeatherTrigger;

View file

@ -15,6 +15,59 @@
#include <QAction> #include <QAction>
#include <QAbstractButton> #include <QAbstractButton>
const QMap<ProjectFilePath, std::pair<QString, QString>> defaultPaths = {
{ProjectFilePath::data_map_folders, { "data_map_folders", "data/maps/"}},
{ProjectFilePath::data_scripts_folders, { "data_scripts_folders", "data/scripts/"}},
{ProjectFilePath::data_layouts_folders, { "data_layouts_folders", "data/layouts/"}},
{ProjectFilePath::data_event_scripts, { "data_event_scripts", "data/event_scripts.s"}},
{ProjectFilePath::json_map_groups, { "json_map_groups", "data/maps/map_groups.json"}},
{ProjectFilePath::json_layouts, { "json_layouts", "data/layouts/layouts.json"}},
{ProjectFilePath::json_wild_encounters, { "json_wild_encounters", "src/data/wild_encounters.json"}},
{ProjectFilePath::json_region_map_entries, { "json_region_map_entries", "src/data/region_map/region_map_sections.json"}},
{ProjectFilePath::json_region_porymap_cfg, { "json_region_porymap_cfg", "src/data/region_map/porymap_config.json"}},
{ProjectFilePath::tilesets_headers, { "tilesets_headers", "data/tilesets/headers.inc"}},
{ProjectFilePath::tilesets_graphics, { "tilesets_graphics", "data/tilesets/graphics.inc"}},
{ProjectFilePath::tilesets_metatiles, { "tilesets_metatiles", "data/tilesets/metatiles.inc"}},
{ProjectFilePath::data_obj_event_gfx_pointers, { "data_obj_event_gfx_pointers", "src/data/object_events/object_event_graphics_info_pointers.h"}},
{ProjectFilePath::data_obj_event_gfx_info, { "data_obj_event_gfx_info", "src/data/object_events/object_event_graphics_info.h"}},
{ProjectFilePath::data_obj_event_pic_tables, { "data_obj_event_pic_tables", "src/data/object_events/object_event_pic_tables.h"}},
{ProjectFilePath::data_obj_event_gfx, { "data_obj_event_gfx", "src/data/object_events/object_event_graphics.h"}},
{ProjectFilePath::data_pokemon_gfx, { "data_pokemon_gfx", "src/data/graphics/pokemon.h"}},
{ProjectFilePath::data_heal_locations, { "data_heal_locations", "src/data/heal_locations.h"}},
{ProjectFilePath::data_region_map_entries, { "data_region_map_entries", "src/data/region_map/region_map_entries.h"}},
{ProjectFilePath::constants_global, { "constants_global", "include/constants/global.h"}},
{ProjectFilePath::constants_map_groups, { "constants_map_groups", "include/constants/map_groups.h"}},
{ProjectFilePath::constants_items, { "constants_items", "include/constants/items.h"}},
{ProjectFilePath::constants_opponents, { "constants_opponents", "include/constants/opponents.h"}},
{ProjectFilePath::constants_flags, { "constants_flags", "include/constants/flags.h"}},
{ProjectFilePath::constants_vars, { "constants_vars", "include/constants/vars.h"}},
{ProjectFilePath::constants_weather, { "constants_weather", "include/constants/weather.h"}},
{ProjectFilePath::constants_songs, { "constants_songs", "include/constants/songs.h"}},
{ProjectFilePath::constants_heal_locations, { "constants_heal_locations", "include/constants/heal_locations.h"}},
{ProjectFilePath::constants_pokemon, { "constants_pokemon", "include/constants/pokemon.h"}},
{ProjectFilePath::constants_map_types, { "constants_map_types", "include/constants/map_types.h"}},
{ProjectFilePath::constants_trainer_types, { "constants_trainer_types", "include/constants/trainer_types.h"}},
{ProjectFilePath::constants_secret_bases, { "constants_secret_bases", "include/constants/secret_bases.h"}},
{ProjectFilePath::constants_obj_event_movement, { "constants_obj_event_movement", "include/constants/event_object_movement.h"}},
{ProjectFilePath::constants_obj_events, { "constants_obj_events", "include/constants/event_objects.h"}},
{ProjectFilePath::constants_event_bg, { "constants_event_bg", "include/constants/event_bg.h"}},
{ProjectFilePath::constants_region_map_sections, { "constants_region_map_sections", "include/constants/region_map_sections.h"}},
{ProjectFilePath::constants_metatile_labels, { "constants_metatile_labels", "include/constants/metatile_labels.h"}},
{ProjectFilePath::constants_metatile_behaviors, { "constants_metatile_behaviors", "include/constants/metatile_behaviors.h"}},
{ProjectFilePath::constants_fieldmap, { "constants_fieldmap", "include/fieldmap.h"}},
{ProjectFilePath::path_pokemon_icon_table, { "path_pokemon_icon_table", "src/pokemon_icon.c"}},
{ProjectFilePath::path_initial_facing_table, { "path_initial_facing_table", "src/event_object_movement.c"}},
};
std::optional<ProjectFilePath> reverseDefaultPaths(QString str) {
for (auto it = defaultPaths.constKeyValueBegin(); it != defaultPaths.constKeyValueEnd(); ++it) {
if (it->second.first == str) return it->first;
}
return std::nullopt;
}
KeyValueConfigBase::~KeyValueConfigBase() { KeyValueConfigBase::~KeyValueConfigBase() {
} }
@ -56,7 +109,7 @@ void KeyValueConfigBase::load() {
continue; continue;
} }
this->parseConfigKeyValue(match.captured("key").toLower(), match.captured("value")); this->parseConfigKeyValue(match.captured("key").trimmed().toLower(), match.captured("value").trimmed());
} }
this->setUnreadKeys(); this->setUnreadKeys();
@ -222,6 +275,7 @@ QMap<QString, QString> PorymapConfig::getKeyValueMap() {
map.insert("theme", this->theme); map.insert("theme", this->theme);
map.insert("text_editor_open_directory", this->textEditorOpenFolder); map.insert("text_editor_open_directory", this->textEditorOpenFolder);
map.insert("text_editor_goto_line", this->textEditorGotoLine); map.insert("text_editor_goto_line", this->textEditorGotoLine);
return map; return map;
} }
@ -505,6 +559,13 @@ void ProjectConfig::parseConfigKeyValue(QString key, QString value) {
} }
} }
#endif #endif
} else if (key.startsWith("path/")) {
auto k = reverseDefaultPaths(key.mid(5));
if (k.has_value()) {
this->filePaths[k.value()] = value;
} else {
logWarn(QString("Invalid config key found in config file %1: '%2'").arg(this->getConfigFilepath()).arg(key));
}
} else { } else {
logWarn(QString("Invalid config key found in config file %1: '%2'").arg(this->getConfigFilepath()).arg(key)); logWarn(QString("Invalid config key found in config file %1: '%2'").arg(this->getConfigFilepath()).arg(key));
} }
@ -539,6 +600,9 @@ QMap<QString, QString> ProjectConfig::getKeyValueMap() {
map.insert("enable_floor_number", QString::number(this->enableFloorNumber)); map.insert("enable_floor_number", QString::number(this->enableFloorNumber));
map.insert("create_map_text_file", QString::number(this->createMapTextFile)); map.insert("create_map_text_file", QString::number(this->createMapTextFile));
map.insert("enable_triple_layer_metatiles", QString::number(this->enableTripleLayerMetatiles)); map.insert("enable_triple_layer_metatiles", QString::number(this->enableTripleLayerMetatiles));
for (auto it = this->filePaths.constKeyValueBegin(); it != this->filePaths.constKeyValueEnd(); ++it) {
map.insert("path/"+defaultPaths[it->first].first, it->second);
}
return map; return map;
} }
@ -590,6 +654,21 @@ QString ProjectConfig::getProjectDir() {
return this->projectDir; return this->projectDir;
} }
void ProjectConfig::setFilePath(ProjectFilePath pathId, QString path) {
if (!defaultPaths.contains(pathId)) return;
this->filePaths[pathId] = path;
}
QString ProjectConfig::getFilePath(ProjectFilePath pathId) {
if (this->filePaths.contains(pathId)) {
return this->filePaths[pathId];
} else if (defaultPaths.contains(pathId)) {
return defaultPaths[pathId].second;
} else {
return QString();
}
}
void ProjectConfig::setBaseGameVersion(BaseGameVersion baseGameVersion) { void ProjectConfig::setBaseGameVersion(BaseGameVersion baseGameVersion) {
this->baseGameVersion = baseGameVersion; this->baseGameVersion = baseGameVersion;
this->save(); this->save();

View file

@ -1865,8 +1865,9 @@ void MainWindow::addNewEvent(QString event_type)
msgBox.setText("Failed to add new event"); msgBox.setText("Failed to add new event");
if (Event::typeToGroup(event_type) == EventGroup::Object) { if (Event::typeToGroup(event_type) == EventGroup::Object) {
msgBox.setInformativeText(QString("The limit for object events (%1) has been reached.\n\n" msgBox.setInformativeText(QString("The limit for object events (%1) has been reached.\n\n"
"This limit can be adjusted with OBJECT_EVENT_TEMPLATES_COUNT in 'include/constants/global.h'.") "This limit can be adjusted with OBJECT_EVENT_TEMPLATES_COUNT in '%2'.")
.arg(editor->project->getMaxObjectEvents())); .arg(editor->project->getMaxObjectEvents())
.arg(projectConfig.getFilePath(ProjectFilePath::constants_global)));
} }
msgBox.setDefaultButton(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok);
msgBox.setIcon(QMessageBox::Icon::Warning); msgBox.setIcon(QMessageBox::Icon::Warning);

View file

@ -183,7 +183,7 @@ bool Project::loadMapData(Map* map) {
return true; return true;
} }
QString mapFilepath = QString("%1/data/maps/%2/map.json").arg(root).arg(map->name); QString mapFilepath = QString("%1/%3%2/map.json").arg(root).arg(map->name).arg(projectConfig.getFilePath(ProjectFilePath::data_map_folders));
QJsonDocument mapDoc; QJsonDocument mapDoc;
if (!parser.tryParseJsonFile(&mapDoc, mapFilepath)) { if (!parser.tryParseJsonFile(&mapDoc, mapFilepath)) {
logError(QString("Failed to read map data from %1").arg(mapFilepath)); logError(QString("Failed to read map data from %1").arg(mapFilepath));
@ -425,7 +425,7 @@ QString Project::readMapLayoutId(QString map_name) {
return mapCache.value(map_name)->layoutId; return mapCache.value(map_name)->layoutId;
} }
QString mapFilepath = QString("%1/data/maps/%2/map.json").arg(root).arg(map_name); QString mapFilepath = QString("%1/%3%2/map.json").arg(root).arg(map_name).arg(projectConfig.getFilePath(ProjectFilePath::data_map_folders));
QJsonDocument mapDoc; QJsonDocument mapDoc;
if (!parser.tryParseJsonFile(&mapDoc, mapFilepath)) { if (!parser.tryParseJsonFile(&mapDoc, mapFilepath)) {
logError(QString("Failed to read map layout id from %1").arg(mapFilepath)); logError(QString("Failed to read map layout id from %1").arg(mapFilepath));
@ -441,7 +441,7 @@ QString Project::readMapLocation(QString map_name) {
return mapCache.value(map_name)->location; return mapCache.value(map_name)->location;
} }
QString mapFilepath = QString("%1/data/maps/%2/map.json").arg(root).arg(map_name); QString mapFilepath = QString("%1/%3%2/map.json").arg(root).arg(map_name).arg(projectConfig.getFilePath(ProjectFilePath::data_map_folders));
QJsonDocument mapDoc; QJsonDocument mapDoc;
if (!parser.tryParseJsonFile(&mapDoc, mapFilepath)) { if (!parser.tryParseJsonFile(&mapDoc, mapFilepath)) {
logError(QString("Failed to read map's region map section from %1").arg(mapFilepath)); logError(QString("Failed to read map's region map section from %1").arg(mapFilepath));
@ -508,7 +508,7 @@ bool Project::readMapLayouts() {
mapLayouts.clear(); mapLayouts.clear();
mapLayoutsTable.clear(); mapLayoutsTable.clear();
QString layoutsFilepath = QString("%1/data/layouts/layouts.json").arg(root); QString layoutsFilepath = QString("%1/%2").arg(root).arg(projectConfig.getFilePath(ProjectFilePath::json_layouts));
fileWatcher.addPath(layoutsFilepath); fileWatcher.addPath(layoutsFilepath);
QJsonDocument layoutsDoc; QJsonDocument layoutsDoc;
if (!parser.tryParseJsonFile(&layoutsDoc, layoutsFilepath)) { if (!parser.tryParseJsonFile(&layoutsDoc, layoutsFilepath)) {
@ -627,7 +627,7 @@ bool Project::readMapLayouts() {
} }
void Project::saveMapLayouts() { void Project::saveMapLayouts() {
QString layoutsFilepath = QString("%1/data/layouts/layouts.json").arg(root); QString layoutsFilepath = QString("%1/%2").arg(root).arg(projectConfig.getFilePath(ProjectFilePath::json_layouts));
QFile layoutsFile(layoutsFilepath); QFile layoutsFile(layoutsFilepath);
if (!layoutsFile.open(QIODevice::WriteOnly)) { if (!layoutsFile.open(QIODevice::WriteOnly)) {
logError(QString("Error: Could not open %1 for writing").arg(layoutsFilepath)); logError(QString("Error: Could not open %1 for writing").arg(layoutsFilepath));
@ -679,8 +679,8 @@ void Project::setNewMapLayout(Map* map) {
layout->height = QString::number(getDefaultMapSize()); layout->height = QString::number(getDefaultMapSize());
layout->border_width = QString::number(DEFAULT_BORDER_WIDTH); layout->border_width = QString::number(DEFAULT_BORDER_WIDTH);
layout->border_height = QString::number(DEFAULT_BORDER_HEIGHT); layout->border_height = QString::number(DEFAULT_BORDER_HEIGHT);
layout->border_path = QString("data/layouts/%1/border.bin").arg(map->name); layout->border_path = QString("%2%1/border.bin").arg(map->name).arg(projectConfig.getFilePath(ProjectFilePath::data_layouts_folders));
layout->blockdata_path = QString("data/layouts/%1/map.bin").arg(map->name); layout->blockdata_path = QString("%2%1/map.bin").arg(map->name).arg(projectConfig.getFilePath(ProjectFilePath::data_layouts_folders));
layout->tileset_primary_label = tilesetLabels["primary"].value(0, "gTileset_General"); layout->tileset_primary_label = tilesetLabels["primary"].value(0, "gTileset_General");
layout->tileset_secondary_label = tilesetLabels["secondary"].value(0, projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered ? "gTileset_PalletTown" : "gTileset_Petalburg"); layout->tileset_secondary_label = tilesetLabels["secondary"].value(0, projectConfig.getBaseGameVersion() == BaseGameVersion::pokefirered ? "gTileset_PalletTown" : "gTileset_Petalburg");
map->layout = layout; map->layout = layout;
@ -692,7 +692,7 @@ void Project::setNewMapLayout(Map* map) {
} }
void Project::saveMapGroups() { void Project::saveMapGroups() {
QString mapGroupsFilepath = QString("%1/data/maps/map_groups.json").arg(root); QString mapGroupsFilepath = QString("%1/%2").arg(root).arg(projectConfig.getFilePath(ProjectFilePath::json_map_groups));
QFile mapGroupsFile(mapGroupsFilepath); QFile mapGroupsFile(mapGroupsFilepath);
if (!mapGroupsFile.open(QIODevice::WriteOnly)) { if (!mapGroupsFile.open(QIODevice::WriteOnly)) {
logError(QString("Error: Could not open %1 for writing").arg(mapGroupsFilepath)); logError(QString("Error: Could not open %1 for writing").arg(mapGroupsFilepath));
@ -729,7 +729,7 @@ void Project::saveMapGroups() {
void Project::saveWildMonData() { void Project::saveWildMonData() {
if (!userConfig.getEncounterJsonActive()) return; if (!userConfig.getEncounterJsonActive()) return;
QString wildEncountersJsonFilepath = QString("%1/src/data/wild_encounters.json").arg(root); QString wildEncountersJsonFilepath = QString("%1/%2").arg(root).arg(projectConfig.getFilePath(ProjectFilePath::json_wild_encounters));
QFile wildEncountersFile(wildEncountersJsonFilepath); QFile wildEncountersFile(wildEncountersJsonFilepath);
if (!wildEncountersFile.open(QIODevice::WriteOnly)) { if (!wildEncountersFile.open(QIODevice::WriteOnly)) {
logError(QString("Error: Could not open %1 for writing").arg(wildEncountersJsonFilepath)); logError(QString("Error: Could not open %1 for writing").arg(wildEncountersJsonFilepath));
@ -849,7 +849,7 @@ void Project::saveMapConstantsHeader() {
text += QString("#define MAP_GROUPS_COUNT %1\n\n").arg(groupNum); text += QString("#define MAP_GROUPS_COUNT %1\n\n").arg(groupNum);
text += QString("#endif // GUARD_CONSTANTS_MAP_GROUPS_H\n"); text += QString("#endif // GUARD_CONSTANTS_MAP_GROUPS_H\n");
QString mapGroupFilepath = root + "/include/constants/map_groups.h"; QString mapGroupFilepath = root + "/" + projectConfig.getFilePath(ProjectFilePath::constants_map_groups);
ignoreWatchedFileTemporarily(mapGroupFilepath); ignoreWatchedFileTemporarily(mapGroupFilepath);
saveTextFile(mapGroupFilepath, text); saveTextFile(mapGroupFilepath, text);
} }
@ -953,11 +953,11 @@ void Project::saveHealLocationStruct(Map *map) {
data_text += QString("};\n"); data_text += QString("};\n");
constants_text += QString("\n#endif // GUARD_CONSTANTS_HEAL_LOCATIONS_H\n"); constants_text += QString("\n#endif // GUARD_CONSTANTS_HEAL_LOCATIONS_H\n");
QString healLocationFilepath = root + "/src/data/heal_locations.h"; QString healLocationFilepath = root + "/" + projectConfig.getFilePath(ProjectFilePath::data_heal_locations);
ignoreWatchedFileTemporarily(healLocationFilepath); ignoreWatchedFileTemporarily(healLocationFilepath);
saveTextFile(healLocationFilepath, data_text); saveTextFile(healLocationFilepath, data_text);
QString healLocationConstantsFilepath = root + "/include/constants/heal_locations.h"; QString healLocationConstantsFilepath = root + "/" + projectConfig.getFilePath(ProjectFilePath::constants_heal_locations);
ignoreWatchedFileTemporarily(healLocationConstantsFilepath); ignoreWatchedFileTemporarily(healLocationConstantsFilepath);
saveTextFile(healLocationConstantsFilepath, constants_text); saveTextFile(healLocationConstantsFilepath, constants_text);
} }
@ -981,7 +981,7 @@ void Project::saveTilesetMetatileLabels(Tileset *primaryTileset, Tileset *second
QMap<QString, int> defines; QMap<QString, int> defines;
bool definesFileModified = false; bool definesFileModified = false;
QString metatileLabelsFilename = "include/constants/metatile_labels.h"; QString metatileLabelsFilename = projectConfig.getFilePath(ProjectFilePath::constants_metatile_labels);
defines = parser.readCDefines(metatileLabelsFilename, (QStringList() << "METATILE_")); defines = parser.readCDefines(metatileLabelsFilename, (QStringList() << "METATILE_"));
// Purge old entries from the file. // Purge old entries from the file.
@ -1630,7 +1630,7 @@ void Project::loadTilesetMetatiles(Tileset* tileset) {
void Project::loadTilesetMetatileLabels(Tileset* tileset) { void Project::loadTilesetMetatileLabels(Tileset* tileset) {
QString tilesetPrefix = QString("METATILE_%1_").arg(QString(tileset->name).replace("gTileset_", "")); QString tilesetPrefix = QString("METATILE_%1_").arg(QString(tileset->name).replace("gTileset_", ""));
QString metatileLabelsFilename = "include/constants/metatile_labels.h"; QString metatileLabelsFilename = projectConfig.getFilePath(ProjectFilePath::constants_metatile_labels);
fileWatcher.addPath(root + "/" + metatileLabelsFilename); fileWatcher.addPath(root + "/" + metatileLabelsFilename);
QMap<QString, int> labels = parser.readCDefines(metatileLabelsFilename, QStringList() << tilesetPrefix); QMap<QString, int> labels = parser.readCDefines(metatileLabelsFilename, QStringList() << tilesetPrefix);
@ -1720,7 +1720,7 @@ bool Project::readWildMonData() {
return true; return true;
} }
QString wildMonJsonFilepath = QString("%1/src/data/wild_encounters.json").arg(root); QString wildMonJsonFilepath = QString("%1/%2").arg(root).arg(projectConfig.getFilePath(ProjectFilePath::json_wild_encounters));
fileWatcher.addPath(wildMonJsonFilepath); fileWatcher.addPath(wildMonJsonFilepath);
OrderedJson::object wildMonObj; OrderedJson::object wildMonObj;
@ -1944,7 +1944,7 @@ QMap<QString, QStringList> Project::getTilesetLabels() {
bool Project::readTilesetProperties() { bool Project::readTilesetProperties() {
QStringList definePrefixes; QStringList definePrefixes;
definePrefixes << "\\bNUM_"; definePrefixes << "\\bNUM_";
QString filename = "include/fieldmap.h"; QString filename = projectConfig.getFilePath(ProjectFilePath::constants_fieldmap);
fileWatcher.addPath(root + "/" + filename); fileWatcher.addPath(root + "/" + filename);
QMap<QString, int> defines = parser.readCDefines(filename, definePrefixes); QMap<QString, int> defines = parser.readCDefines(filename, definePrefixes);
@ -2002,7 +2002,7 @@ bool Project::readTilesetProperties() {
bool Project::readMaxMapDataSize() { bool Project::readMaxMapDataSize() {
QStringList definePrefixes; QStringList definePrefixes;
definePrefixes << "\\bMAX_"; definePrefixes << "\\bMAX_";
QString filename = "include/fieldmap.h"; // already in fileWatcher from readTilesetProperties QString filename = projectConfig.getFilePath(ProjectFilePath::constants_fieldmap); // already in fileWatcher from readTilesetProperties
QMap<QString, int> defines = parser.readCDefines(filename, definePrefixes); QMap<QString, int> defines = parser.readCDefines(filename, definePrefixes);
auto it = defines.find("MAX_MAP_DATA_SIZE"); auto it = defines.find("MAX_MAP_DATA_SIZE");
@ -2031,7 +2031,7 @@ bool Project::readRegionMapSections() {
this->mapSectionValueToName.clear(); this->mapSectionValueToName.clear();
QStringList prefixes = (QStringList() << "\\bMAPSEC_"); QStringList prefixes = (QStringList() << "\\bMAPSEC_");
QString filename = "include/constants/region_map_sections.h"; QString filename = projectConfig.getFilePath(ProjectFilePath::constants_region_map_sections);
fileWatcher.addPath(root + "/" + filename); fileWatcher.addPath(root + "/" + filename);
this->mapSectionNameToValue = parser.readCDefines(filename, prefixes); this->mapSectionNameToValue = parser.readCDefines(filename, prefixes);
if (this->mapSectionNameToValue.isEmpty()) { if (this->mapSectionNameToValue.isEmpty()) {
@ -2048,7 +2048,7 @@ bool Project::readRegionMapSections() {
bool Project::readHealLocations() { bool Project::readHealLocations() {
dataQualifiers.clear(); dataQualifiers.clear();
healLocations.clear(); healLocations.clear();
QString filename = "src/data/heal_locations.h"; QString filename = projectConfig.getFilePath(ProjectFilePath::data_heal_locations);
fileWatcher.addPath(root + "/" + filename); fileWatcher.addPath(root + "/" + filename);
QString text = parser.readTextFile(root + "/" + filename); QString text = parser.readTextFile(root + "/" + filename);
text.replace(QRegularExpression("//.*?(\r\n?|\n)|/\\*.*?\\*/", QRegularExpression::DotMatchesEverythingOption), ""); text.replace(QRegularExpression("//.*?(\r\n?|\n)|/\\*.*?\\*/", QRegularExpression::DotMatchesEverythingOption), "");
@ -2095,7 +2095,7 @@ bool Project::readHealLocations() {
bool Project::readItemNames() { bool Project::readItemNames() {
QStringList prefixes("\\bITEM_(?!(B_)?USE_)"); // Exclude ITEM_USE_ and ITEM_B_USE_ constants QStringList prefixes("\\bITEM_(?!(B_)?USE_)"); // Exclude ITEM_USE_ and ITEM_B_USE_ constants
QString filename = "include/constants/items.h"; QString filename = projectConfig.getFilePath(ProjectFilePath::constants_items);
fileWatcher.addPath(root + "/" + filename); fileWatcher.addPath(root + "/" + filename);
itemNames = parser.readCDefinesSorted(filename, prefixes); itemNames = parser.readCDefinesSorted(filename, prefixes);
if (itemNames.isEmpty()) { if (itemNames.isEmpty()) {
@ -2108,12 +2108,12 @@ bool Project::readItemNames() {
bool Project::readFlagNames() { bool Project::readFlagNames() {
// First read MAX_TRAINERS_COUNT, used to skip over trainer flags // First read MAX_TRAINERS_COUNT, used to skip over trainer flags
// If this fails flags may simply be out of order, no need to check for success // If this fails flags may simply be out of order, no need to check for success
QString opponentsFilename = "include/constants/opponents.h"; QString opponentsFilename = projectConfig.getFilePath(ProjectFilePath::constants_opponents);
fileWatcher.addPath(root + "/" + opponentsFilename); fileWatcher.addPath(root + "/" + opponentsFilename);
QMap<QString, int> maxTrainers = parser.readCDefines(opponentsFilename, QStringList() << "\\bMAX_"); QMap<QString, int> maxTrainers = parser.readCDefines(opponentsFilename, QStringList() << "\\bMAX_");
// Parse flags // Parse flags
QStringList prefixes("\\bFLAG_"); QStringList prefixes("\\bFLAG_");
QString flagsFilename = "include/constants/flags.h"; QString flagsFilename = projectConfig.getFilePath(ProjectFilePath::constants_flags);
fileWatcher.addPath(root + "/" + flagsFilename); fileWatcher.addPath(root + "/" + flagsFilename);
flagNames = parser.readCDefinesSorted(flagsFilename, prefixes, maxTrainers); flagNames = parser.readCDefinesSorted(flagsFilename, prefixes, maxTrainers);
if (flagNames.isEmpty()) { if (flagNames.isEmpty()) {
@ -2125,7 +2125,7 @@ bool Project::readFlagNames() {
bool Project::readVarNames() { bool Project::readVarNames() {
QStringList prefixes("\\bVAR_"); QStringList prefixes("\\bVAR_");
QString filename = "include/constants/vars.h"; QString filename = projectConfig.getFilePath(ProjectFilePath::constants_vars);
fileWatcher.addPath(root + "/" + filename); fileWatcher.addPath(root + "/" + filename);
varNames = parser.readCDefinesSorted(filename, prefixes); varNames = parser.readCDefinesSorted(filename, prefixes);
if (varNames.isEmpty()) { if (varNames.isEmpty()) {
@ -2137,7 +2137,7 @@ bool Project::readVarNames() {
bool Project::readMovementTypes() { bool Project::readMovementTypes() {
QStringList prefixes("\\bMOVEMENT_TYPE_"); QStringList prefixes("\\bMOVEMENT_TYPE_");
QString filename = "include/constants/event_object_movement.h"; QString filename = projectConfig.getFilePath(ProjectFilePath::constants_obj_event_movement);
fileWatcher.addPath(root + "/" + filename); fileWatcher.addPath(root + "/" + filename);
movementTypes = parser.readCDefinesSorted(filename, prefixes); movementTypes = parser.readCDefinesSorted(filename, prefixes);
if (movementTypes.isEmpty()) { if (movementTypes.isEmpty()) {
@ -2148,7 +2148,7 @@ bool Project::readMovementTypes() {
} }
bool Project::readInitialFacingDirections() { bool Project::readInitialFacingDirections() {
QString filename = "src/event_object_movement.c"; QString filename = projectConfig.getFilePath(ProjectFilePath::path_initial_facing_table);
fileWatcher.addPath(root + "/" + filename); fileWatcher.addPath(root + "/" + filename);
facingDirections = parser.readNamedIndexCArray(filename, "gInitialMovementTypeFacingDirections"); facingDirections = parser.readNamedIndexCArray(filename, "gInitialMovementTypeFacingDirections");
if (facingDirections.isEmpty()) { if (facingDirections.isEmpty()) {
@ -2160,7 +2160,7 @@ bool Project::readInitialFacingDirections() {
bool Project::readMapTypes() { bool Project::readMapTypes() {
QStringList prefixes("\\bMAP_TYPE_"); QStringList prefixes("\\bMAP_TYPE_");
QString filename = "include/constants/map_types.h"; QString filename = projectConfig.getFilePath(ProjectFilePath::constants_map_types);
fileWatcher.addPath(root + "/" + filename); fileWatcher.addPath(root + "/" + filename);
mapTypes = parser.readCDefinesSorted(filename, prefixes); mapTypes = parser.readCDefinesSorted(filename, prefixes);
if (mapTypes.isEmpty()) { if (mapTypes.isEmpty()) {
@ -2172,9 +2172,9 @@ bool Project::readMapTypes() {
bool Project::readMapBattleScenes() { bool Project::readMapBattleScenes() {
QStringList prefixes("\\bMAP_BATTLE_SCENE_"); QStringList prefixes("\\bMAP_BATTLE_SCENE_");
QString filename = "include/constants/map_types.h"; QString filename = projectConfig.getFilePath(ProjectFilePath::constants_map_types);
fileWatcher.addPath(root + "/" + filename); fileWatcher.addPath(root + "/" + filename);
mapBattleScenes = parser.readCDefinesSorted("include/constants/map_types.h", prefixes); mapBattleScenes = parser.readCDefinesSorted(filename, prefixes);
if (mapBattleScenes.isEmpty()) { if (mapBattleScenes.isEmpty()) {
logError(QString("Failed to read map battle scene constants from %1").arg(filename)); logError(QString("Failed to read map battle scene constants from %1").arg(filename));
return false; return false;
@ -2184,7 +2184,7 @@ bool Project::readMapBattleScenes() {
bool Project::readWeatherNames() { bool Project::readWeatherNames() {
QStringList prefixes("\\bWEATHER_"); QStringList prefixes("\\bWEATHER_");
QString filename = "include/constants/weather.h"; QString filename = projectConfig.getFilePath(ProjectFilePath::constants_weather);
fileWatcher.addPath(root + "/" + filename); fileWatcher.addPath(root + "/" + filename);
weatherNames = parser.readCDefinesSorted(filename, prefixes); weatherNames = parser.readCDefinesSorted(filename, prefixes);
if (weatherNames.isEmpty()) { if (weatherNames.isEmpty()) {
@ -2199,7 +2199,7 @@ bool Project::readCoordEventWeatherNames() {
return true; return true;
QStringList prefixes("\\bCOORD_EVENT_WEATHER_"); QStringList prefixes("\\bCOORD_EVENT_WEATHER_");
QString filename = "include/constants/weather.h"; QString filename = projectConfig.getFilePath(ProjectFilePath::constants_weather);
fileWatcher.addPath(root + "/" + filename); fileWatcher.addPath(root + "/" + filename);
coordEventWeatherNames = parser.readCDefinesSorted(filename, prefixes); coordEventWeatherNames = parser.readCDefinesSorted(filename, prefixes);
if (coordEventWeatherNames.isEmpty()) { if (coordEventWeatherNames.isEmpty()) {
@ -2214,7 +2214,7 @@ bool Project::readSecretBaseIds() {
return true; return true;
QStringList prefixes("\\bSECRET_BASE_[A-Za-z0-9_]*_[0-9]+"); QStringList prefixes("\\bSECRET_BASE_[A-Za-z0-9_]*_[0-9]+");
QString filename = "include/constants/secret_bases.h"; QString filename = projectConfig.getFilePath(ProjectFilePath::constants_secret_bases);
fileWatcher.addPath(root + "/" + filename); fileWatcher.addPath(root + "/" + filename);
secretBaseIds = parser.readCDefinesSorted(filename, prefixes); secretBaseIds = parser.readCDefinesSorted(filename, prefixes);
if (secretBaseIds.isEmpty()) { if (secretBaseIds.isEmpty()) {
@ -2226,7 +2226,7 @@ bool Project::readSecretBaseIds() {
bool Project::readBgEventFacingDirections() { bool Project::readBgEventFacingDirections() {
QStringList prefixes("\\bBG_EVENT_PLAYER_FACING_"); QStringList prefixes("\\bBG_EVENT_PLAYER_FACING_");
QString filename = "include/constants/event_bg.h"; QString filename = projectConfig.getFilePath(ProjectFilePath::constants_event_bg);
fileWatcher.addPath(root + "/" + filename); fileWatcher.addPath(root + "/" + filename);
bgEventFacingDirections = parser.readCDefinesSorted(filename, prefixes); bgEventFacingDirections = parser.readCDefinesSorted(filename, prefixes);
if (bgEventFacingDirections.isEmpty()) { if (bgEventFacingDirections.isEmpty()) {
@ -2238,7 +2238,7 @@ bool Project::readBgEventFacingDirections() {
bool Project::readTrainerTypes() { bool Project::readTrainerTypes() {
QStringList prefixes("\\bTRAINER_TYPE_"); QStringList prefixes("\\bTRAINER_TYPE_");
QString filename = "include/constants/trainer_types.h"; QString filename = projectConfig.getFilePath(ProjectFilePath::constants_trainer_types);
fileWatcher.addPath(root + "/" + filename); fileWatcher.addPath(root + "/" + filename);
trainerTypes = parser.readCDefinesSorted(filename, prefixes); trainerTypes = parser.readCDefinesSorted(filename, prefixes);
if (trainerTypes.isEmpty()) { if (trainerTypes.isEmpty()) {
@ -2253,7 +2253,7 @@ bool Project::readMetatileBehaviors() {
this->metatileBehaviorMapInverse.clear(); this->metatileBehaviorMapInverse.clear();
QStringList prefixes("\\bMB_"); QStringList prefixes("\\bMB_");
QString filename = "include/constants/metatile_behaviors.h"; QString filename = projectConfig.getFilePath(ProjectFilePath::constants_metatile_behaviors);
fileWatcher.addPath(root + "/" + filename); fileWatcher.addPath(root + "/" + filename);
this->metatileBehaviorMap = parser.readCDefines(filename, prefixes); this->metatileBehaviorMap = parser.readCDefines(filename, prefixes);
if (this->metatileBehaviorMap.isEmpty()) { if (this->metatileBehaviorMap.isEmpty()) {
@ -2269,7 +2269,7 @@ bool Project::readMetatileBehaviors() {
bool Project::readSongNames() { bool Project::readSongNames() {
QStringList songDefinePrefixes{ "\\bSE_", "\\bMUS_" }; QStringList songDefinePrefixes{ "\\bSE_", "\\bMUS_" };
QString filename = "include/constants/songs.h"; QString filename = projectConfig.getFilePath(ProjectFilePath::constants_songs);
fileWatcher.addPath(root + "/" + filename); fileWatcher.addPath(root + "/" + filename);
QMap<QString, int> songDefines = parser.readCDefines(filename, songDefinePrefixes); QMap<QString, int> songDefines = parser.readCDefines(filename, songDefinePrefixes);
this->songNames = songDefines.keys(); this->songNames = songDefines.keys();
@ -2283,7 +2283,7 @@ bool Project::readSongNames() {
bool Project::readObjEventGfxConstants() { bool Project::readObjEventGfxConstants() {
QStringList objEventGfxPrefixes("\\bOBJ_EVENT_GFX_"); QStringList objEventGfxPrefixes("\\bOBJ_EVENT_GFX_");
QString filename = "include/constants/event_objects.h"; QString filename = projectConfig.getFilePath(ProjectFilePath::constants_obj_events);
fileWatcher.addPath(root + "/" + filename); fileWatcher.addPath(root + "/" + filename);
this->gfxDefines = parser.readCDefines(filename, objEventGfxPrefixes); this->gfxDefines = parser.readCDefines(filename, objEventGfxPrefixes);
if (this->gfxDefines.isEmpty()) { if (this->gfxDefines.isEmpty()) {
@ -2296,14 +2296,14 @@ bool Project::readObjEventGfxConstants() {
bool Project::readMiscellaneousConstants() { bool Project::readMiscellaneousConstants() {
miscConstants.clear(); miscConstants.clear();
if (userConfig.getEncounterJsonActive()) { if (userConfig.getEncounterJsonActive()) {
QString filename = "include/constants/pokemon.h"; QString filename = projectConfig.getFilePath(ProjectFilePath::constants_pokemon);
fileWatcher.addPath(root + "/" + filename); fileWatcher.addPath(root + "/" + filename);
QMap<QString, int> pokemonDefines = parser.readCDefines(filename, { "MIN_", "MAX_" }); QMap<QString, int> pokemonDefines = parser.readCDefines(filename, { "MIN_", "MAX_" });
miscConstants.insert("max_level_define", pokemonDefines.value("MAX_LEVEL") > pokemonDefines.value("MIN_LEVEL") ? pokemonDefines.value("MAX_LEVEL") : 100); miscConstants.insert("max_level_define", pokemonDefines.value("MAX_LEVEL") > pokemonDefines.value("MIN_LEVEL") ? pokemonDefines.value("MAX_LEVEL") : 100);
miscConstants.insert("min_level_define", pokemonDefines.value("MIN_LEVEL") < pokemonDefines.value("MAX_LEVEL") ? pokemonDefines.value("MIN_LEVEL") : 1); miscConstants.insert("min_level_define", pokemonDefines.value("MIN_LEVEL") < pokemonDefines.value("MAX_LEVEL") ? pokemonDefines.value("MIN_LEVEL") : 1);
} }
QString filename = "include/constants/global.h"; QString filename = projectConfig.getFilePath(ProjectFilePath::constants_global);
fileWatcher.addPath(root + "/" + filename); fileWatcher.addPath(root + "/" + filename);
QStringList definePrefixes("\\bOBJECT_"); QStringList definePrefixes("\\bOBJECT_");
QMap<QString, int> defines = parser.readCDefines(filename, definePrefixes); QMap<QString, int> defines = parser.readCDefines(filename, definePrefixes);
@ -2366,7 +2366,7 @@ QString Project::getScriptDefaultString(bool usePoryScript, QString mapName) con
QString Project::getMapScriptsFilePath(const QString &mapName) const { QString Project::getMapScriptsFilePath(const QString &mapName) const {
const bool usePoryscript = projectConfig.getUsePoryScript(); const bool usePoryscript = projectConfig.getUsePoryScript();
auto path = QDir::cleanPath(root + "/data/maps/" + mapName + "/scripts"); auto path = QDir::cleanPath(root + projectConfig.getFilePath(ProjectFilePath::data_map_folders) + mapName + "/scripts");
auto extension = getScriptFileExtension(usePoryscript); auto extension = getScriptFileExtension(usePoryscript);
if (usePoryscript && !QFile::exists(path + extension)) if (usePoryscript && !QFile::exists(path + extension))
extension = getScriptFileExtension(false); extension = getScriptFileExtension(false);
@ -2375,9 +2375,9 @@ QString Project::getMapScriptsFilePath(const QString &mapName) const {
} }
QStringList Project::getEventScriptsFilePaths() const { QStringList Project::getEventScriptsFilePaths() const {
QStringList filePaths(QDir::cleanPath(root + "/data/event_scripts.s")); QStringList filePaths(QDir::cleanPath(root + "/" + projectConfig.getFilePath(ProjectFilePath::data_event_scripts)));
const QString scriptsDir = QDir::cleanPath(root + "/data/scripts"); const QString scriptsDir = QDir::cleanPath(root + "/" + projectConfig.getFilePath(ProjectFilePath::data_scripts_folders));
const QString mapsDir = QDir::cleanPath(root + "/data/maps"); const QString mapsDir = QDir::cleanPath(root + "/" + projectConfig.getFilePath(ProjectFilePath::data_map_folders));
const bool usePoryscript = projectConfig.getUsePoryScript(); const bool usePoryscript = projectConfig.getUsePoryScript();
if (usePoryscript) { if (usePoryscript) {
@ -2463,12 +2463,12 @@ void Project::setEventPixmap(Event * event, bool forceLoad) {
} }
bool Project::readEventGraphics() { bool Project::readEventGraphics() {
fileWatcher.addPaths(QStringList() << root + "/" + "src/data/object_events/object_event_graphics_info_pointers.h" fileWatcher.addPaths(QStringList() << root + "/" + projectConfig.getFilePath(ProjectFilePath::data_obj_event_gfx_pointers)
<< root + "/" + "src/data/object_events/object_event_graphics_info.h" << root + "/" + projectConfig.getFilePath(ProjectFilePath::data_obj_event_gfx_info)
<< root + "/" + "src/data/object_events/object_event_pic_tables.h" << root + "/" + projectConfig.getFilePath(ProjectFilePath::data_obj_event_pic_tables)
<< root + "/" + "src/data/object_events/object_event_graphics.h"); << root + "/" + projectConfig.getFilePath(ProjectFilePath::data_obj_event_gfx));
QMap<QString, QString> pointerHash = parser.readNamedIndexCArray("src/data/object_events/object_event_graphics_info_pointers.h", "gObjectEventGraphicsInfoPointers"); QMap<QString, QString> pointerHash = parser.readNamedIndexCArray(projectConfig.getFilePath(ProjectFilePath::data_obj_event_gfx_pointers), "gObjectEventGraphicsInfoPointers");
qDeleteAll(eventGraphicsMap); qDeleteAll(eventGraphicsMap);
eventGraphicsMap.clear(); eventGraphicsMap.clear();
@ -2488,9 +2488,9 @@ bool Project::readEventGraphics() {
QString dimensions_label = gfxInfoAttributes.value("oam"); QString dimensions_label = gfxInfoAttributes.value("oam");
QString subsprites_label = gfxInfoAttributes.value("subspriteTables"); QString subsprites_label = gfxInfoAttributes.value("subspriteTables");
QString gfx_label = parser.readCArray("src/data/object_events/object_event_pic_tables.h", pic_label).value(0); QString gfx_label = parser.readCArray(projectConfig.getFilePath(ProjectFilePath::data_obj_event_pic_tables), pic_label).value(0);
gfx_label = gfx_label.section(QRegularExpression("[\\(\\)]"), 1, 1); gfx_label = gfx_label.section(QRegularExpression("[\\(\\)]"), 1, 1);
QString path = parser.readCIncbin("src/data/object_events/object_event_graphics.h", gfx_label); QString path = parser.readCIncbin(projectConfig.getFilePath(ProjectFilePath::data_obj_event_gfx), gfx_label);
if (!path.isNull()) { if (!path.isNull()) {
path = fixGraphicPath(path); path = fixGraphicPath(path);
@ -2525,7 +2525,7 @@ QMap<QString, QMap<QString, QString>> Project::readObjEventGfxInfo() {
// TODO: refactor this to be more general if we end up directly parsing C // TODO: refactor this to be more general if we end up directly parsing C
// for more use cases in the future. // for more use cases in the future.
auto cParser = fex::Parser(); auto cParser = fex::Parser();
auto tokens = fex::Lexer().LexFile((root + "/src/data/object_events/object_event_graphics_info.h").toStdString()); auto tokens = fex::Lexer().LexFile((root + "/" + projectConfig.getFilePath(ProjectFilePath::data_obj_event_gfx_info)).toStdString());
auto gfxInfoObjects = cParser.ParseTopLevelObjects(tokens); auto gfxInfoObjects = cParser.ParseTopLevelObjects(tokens);
QMap<QString, QMap<QString, QString>> gfxInfos; QMap<QString, QMap<QString, QString>> gfxInfos;
for (auto it = gfxInfoObjects.begin(); it != gfxInfoObjects.end(); it++) { for (auto it = gfxInfoObjects.begin(); it != gfxInfoObjects.end(); it++) {
@ -2565,8 +2565,8 @@ QMap<QString, QMap<QString, QString>> Project::readObjEventGfxInfo() {
bool Project::readSpeciesIconPaths() { bool Project::readSpeciesIconPaths() {
speciesToIconPath.clear(); speciesToIconPath.clear();
QString srcfilename = "src/pokemon_icon.c"; QString srcfilename = projectConfig.getFilePath(ProjectFilePath::path_pokemon_icon_table);
QString incfilename = "src/data/graphics/pokemon.h"; QString incfilename = projectConfig.getFilePath(ProjectFilePath::data_pokemon_gfx);
fileWatcher.addPath(root + "/" + srcfilename); fileWatcher.addPath(root + "/" + srcfilename);
fileWatcher.addPath(root + "/" + incfilename); fileWatcher.addPath(root + "/" + incfilename);
QMap<QString, QString> monIconNames = parser.readNamedIndexCArray(srcfilename, "gMonIconTable"); QMap<QString, QString> monIconNames = parser.readNamedIndexCArray(srcfilename, "gMonIconTable");

View file

@ -110,7 +110,7 @@ void RegionMapEditor::applyUserShortcuts() {
bool RegionMapEditor::loadRegionMapEntries() { bool RegionMapEditor::loadRegionMapEntries() {
this->region_map_entries.clear(); this->region_map_entries.clear();
QString regionMapSectionFilepath = QString("%1/src/data/region_map/region_map_sections.json").arg(this->project->root); QString regionMapSectionFilepath = QString("%1/%2").arg(this->project->root).arg(projectConfig.getFilePath(ProjectFilePath::json_region_map_entries));
ParseUtil parser; ParseUtil parser;
QJsonDocument sectionsDoc; QJsonDocument sectionsDoc;
@ -140,7 +140,7 @@ bool RegionMapEditor::loadRegionMapEntries() {
} }
bool RegionMapEditor::saveRegionMapEntries() { bool RegionMapEditor::saveRegionMapEntries() {
QString regionMapSectionFilepath = QString("%1/src/data/region_map/region_map_sections.json").arg(this->project->root); QString regionMapSectionFilepath = QString("%1/%2").arg(this->project->root).arg(projectConfig.getFilePath(ProjectFilePath::json_region_map_entries));
QFile sectionsFile(regionMapSectionFilepath); QFile sectionsFile(regionMapSectionFilepath);
if (!sectionsFile.open(QIODevice::WriteOnly)) { if (!sectionsFile.open(QIODevice::WriteOnly)) {
@ -508,7 +508,7 @@ bool RegionMapEditor::setup() {
bool RegionMapEditor::load() { bool RegionMapEditor::load() {
// check for config json file // check for config json file
QString jsonConfigFilepath = this->project->root + "/src/data/region_map/porymap_config.json"; QString jsonConfigFilepath = this->project->root + "/" + projectConfig.getFilePath(ProjectFilePath::json_region_porymap_cfg);
bool badConfig = true; bool badConfig = true;
@ -586,7 +586,7 @@ void RegionMapEditor::saveConfig() {
mapsObject["region_maps"] = mapArray; mapsObject["region_maps"] = mapArray;
OrderedJson newConfigJson(mapsObject); OrderedJson newConfigJson(mapsObject);
QString filepath = QString("%1/src/data/region_map/porymap_config.json").arg(this->project->root); QString filepath = QString("%1/%2").arg(this->project->root).arg(projectConfig.getFilePath(ProjectFilePath::json_region_porymap_cfg));
QFile file(filepath); QFile file(filepath);
if (!file.open(QIODevice::WriteOnly)) { if (!file.open(QIODevice::WriteOnly)) {
logError(QString("Error: Could not open %1 for writing").arg(filepath)); logError(QString("Error: Could not open %1 for writing").arg(filepath));