diff --git a/mainwindow.cpp b/mainwindow.cpp index be578b65..c5c90f65 100755 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -377,6 +377,7 @@ void MainWindow::loadDataStructures() { project->readSecretBaseIds(); project->readBgEventFacingDirections(); project->readMapsWithConnections(); + project->readTilesetProperties(); } void MainWindow::populateMapList() { diff --git a/map.cpp b/map.cpp index 721d4b17..54298a5c 100755 --- a/map.cpp +++ b/map.cpp @@ -1,4 +1,5 @@ #include "map.h" +#include "project.h" #include #include @@ -68,7 +69,7 @@ uint16_t Map::getSelectedBlockIndex(int index) { if (index < layout->tileset_primary->metatiles->length()) { return static_cast(index); } else { - return 0x200 + static_cast(index - layout->tileset_primary->metatiles->length()); + return static_cast(Project::getNumMetatilesPrimary() + index - layout->tileset_primary->metatiles->length()); } } @@ -76,7 +77,7 @@ int Map::getDisplayedBlockIndex(int index) { if (index < layout->tileset_primary->metatiles->length()) { return index; } else { - return index - 0x200 + layout->tileset_primary->metatiles->length(); + return index - Project::getNumMetatilesPrimary() + layout->tileset_primary->metatiles->length(); } } @@ -337,7 +338,7 @@ QPixmap Map::renderMetatiles() { for (int i = 0; i < length_; i++) { int tile = i; if (i >= primary_length) { - tile += 0x200 - primary_length; + tile += Project::getNumMetatilesPrimary() - primary_length; } QImage metatile_image = Metatile::getMetatileImage(tile, layout->tileset_primary, layout->tileset_secondary); int map_y = i / width_; diff --git a/project.cpp b/project.cpp index b3b625ba..9cce7bbb 100755 --- a/project.cpp +++ b/project.cpp @@ -12,6 +12,13 @@ #include #include +int Project::num_tiles_primary = 512; +int Project::num_tiles_total = 1024; +int Project::num_metatiles_primary = 512; +int Project::num_metatiles_total = 1024; +int Project::num_pals_primary = 6; +int Project::num_pals_total = 13; + Project::Project() { groupNames = new QStringList; @@ -1121,6 +1128,64 @@ QMap Project::getTilesets() { return allTilesets; } +void Project::readTilesetProperties() { + QStringList defines; + QString text = readTextFile(root + "/include/fieldmap.h"); + if (!text.isNull()) { + bool error = false; + QStringList definePrefixes; + definePrefixes << "NUM_"; + QMap defines = readCDefines(text, definePrefixes); + auto it = defines.find("NUM_TILES_IN_PRIMARY"); + if (it != defines.end()) { + Project::num_tiles_primary = it.value(); + } + else { + error = true; + } + it = defines.find("NUM_TILES_TOTAL"); + if (it != defines.end()) { + Project::num_tiles_total = it.value(); + } + else { + error = true; + } + it = defines.find("NUM_METATILES_IN_PRIMARY"); + if (it != defines.end()) { + Project::num_metatiles_primary = it.value(); + } + else { + error = true; + } + it = defines.find("NUM_METATILES_TOTAL"); + if (it != defines.end()) { + Project::num_metatiles_total = it.value(); + } + else { + error = true; + } + it = defines.find("NUM_PALS_IN_PRIMARY"); + if (it != defines.end()) { + Project::num_pals_primary = it.value(); + } + else { + error = true; + } + it = defines.find("NUM_PALS_TOTAL"); + if (it != defines.end()) { + Project::num_pals_total = it.value(); + } + else { + error = true; + } + + if (error) + { + qDebug() << "Some global tileset values could not be loaded. Using default values"; + } + } +} + void Project::readRegionMapSections() { QString filepath = root + "/include/constants/region_map_sections.h"; QStringList prefixes = (QStringList() << "MAPSEC_"); @@ -1666,3 +1731,33 @@ QMap Project::readCDefines(QString text, QStringList prefixes) { } return filteredDefines; } + +int Project::getNumTilesPrimary() +{ + return Project::num_tiles_primary; +} + +int Project::getNumTilesTotal() +{ + return Project::num_tiles_total; +} + +int Project::getNumMetatilesPrimary() +{ + return Project::num_metatiles_primary; +} + +int Project::getNumMetatilesTotal() +{ + return Project::num_metatiles_total; +} + +int Project::getNumPalettesPrimary() +{ + return Project::num_pals_primary; +} + +int Project::getNumPalettesTotal() +{ + return Project::num_pals_total; +} diff --git a/project.h b/project.h index fb630f38..cb1a10ee 100755 --- a/project.h +++ b/project.h @@ -88,6 +88,7 @@ public: QStringList getSongNames(); QStringList getVisibilities(); QMap getTilesets(); + void readTilesetProperties(); void readRegionMapSections(); void readItemNames(); void readFlagNames(); @@ -114,6 +115,13 @@ public: QStringList readCArray(QString text, QString label); QString readCIncbin(QString text, QString label); QMap readCDefines(QString text, QStringList prefixes); + + static int getNumTilesPrimary(); + static int getNumTilesTotal(); + static int getNumMetatilesPrimary(); + static int getNumMetatilesTotal(); + static int getNumPalettesPrimary(); + static int getNumPalettesTotal(); private: QString getMapLayoutsTableFilepath(); QString getMapLayoutFilepath(QString); @@ -132,6 +140,13 @@ private: void setNewMapBorder(Map *map); void setNewMapEvents(Map *map); void setNewMapConnections(Map *map); + + static int num_tiles_primary; + static int num_tiles_total; + static int num_metatiles_primary; + static int num_metatiles_total; + static int num_pals_primary; + static int num_pals_total; }; #endif // PROJECT_H diff --git a/tileset.cpp b/tileset.cpp index df368170..55fa6258 100755 --- a/tileset.cpp +++ b/tileset.cpp @@ -1,4 +1,5 @@ #include "tileset.h" +#include "project.h" #include #include @@ -88,8 +89,7 @@ QImage Metatile::getMetatileTile(int tile, Tileset *primaryTileset, Tileset *sec } Tileset* Metatile::getBlockTileset(int metatile_index, Tileset *primaryTileset, Tileset *secondaryTileset) { - int primary_size = 0x200; - if (metatile_index < primary_size) { + if (metatile_index < Project::getNumMetatilesPrimary()) { return primaryTileset; } else { return secondaryTileset; @@ -97,24 +97,19 @@ Tileset* Metatile::getBlockTileset(int metatile_index, Tileset *primaryTileset, } int Metatile::getBlockIndex(int index) { - int primary_size = 0x200; - if (index < primary_size) { + if (index < Project::getNumMetatilesPrimary()) { return index; } else { - return index - primary_size; + return index - Project::getNumMetatilesPrimary(); } } QList> Metatile::getBlockPalettes(Tileset *primaryTileset, Tileset *secondaryTileset) { QList> palettes; - for (int i = 0; i < 6; i++) { + for (int i = 0; i < Project::getNumPalettesPrimary(); i++) { palettes.append(primaryTileset->palettes->at(i)); } - - // TODO: Find a reliable way to detect Ruby vs. Emerald - // Ruby's secondary tilesets only use palettes 6-11, whereas - // Emerald uses 6-12. - for (int i = 6; i < 13; i++) { + for (int i = Project::getNumPalettesPrimary(); i < Project::getNumPalettesTotal(); i++) { palettes.append(secondaryTileset->palettes->at(i)); } return palettes;