From a6fc81ae1a379059b4a24757fa82c4cf5c41cd9b Mon Sep 17 00:00:00 2001 From: Diegoisawesome Date: Tue, 18 Sep 2018 13:18:12 -0500 Subject: [PATCH] Use project values for tilesets --- mainwindow.cpp | 1 + map.cpp | 6 ++--- project.cpp | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ project.h | 1 + tileset.cpp | 23 +++++++++--------- tileset.h | 7 ++++++ 6 files changed, 88 insertions(+), 14 deletions(-) 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..d4bb6ab0 100755 --- a/map.cpp +++ b/map.cpp @@ -68,7 +68,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(Tileset::num_metatiles_primary + index - layout->tileset_primary->metatiles->length()); } } @@ -76,7 +76,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 - Tileset::num_metatiles_primary + layout->tileset_primary->metatiles->length(); } } @@ -337,7 +337,7 @@ QPixmap Map::renderMetatiles() { for (int i = 0; i < length_; i++) { int tile = i; if (i >= primary_length) { - tile += 0x200 - primary_length; + tile += Tileset::num_metatiles_primary - 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..c8d0c2d6 100755 --- a/project.cpp +++ b/project.cpp @@ -1121,6 +1121,70 @@ 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()) { + Tileset::num_tiles_primary = it.value(); + } + else { + Tileset::num_tiles_primary = 512; + error = true; + } + it = defines.find("NUM_TILES_TOTAL"); + if (it != defines.end()) { + Tileset::num_tiles_total = it.value(); + } + else { + Tileset::num_tiles_total = 1024; + error = true; + } + it = defines.find("NUM_METATILES_IN_PRIMARY"); + if (it != defines.end()) { + Tileset::num_metatiles_primary = it.value(); + } + else { + Tileset::num_metatiles_primary = 512; + error = true; + } + it = defines.find("NUM_METATILES_TOTAL"); + if (it != defines.end()) { + Tileset::num_metatiles_total = it.value(); + } + else { + Tileset::num_metatiles_total = 1024; + error = true; + } + it = defines.find("NUM_PALS_IN_PRIMARY"); + if (it != defines.end()) { + Tileset::num_pals_primary = it.value(); + } + else { + Tileset::num_pals_primary = 6; + error = true; + } + it = defines.find("NUM_PALS_TOTAL"); + if (it != defines.end()) { + Tileset::num_pals_total = it.value(); + } + else { + Tileset::num_pals_total = 13; + 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_"); diff --git a/project.h b/project.h index fb630f38..ca34147b 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(); diff --git a/tileset.cpp b/tileset.cpp index df368170..981e2612 100755 --- a/tileset.cpp +++ b/tileset.cpp @@ -9,6 +9,13 @@ Tileset::Tileset() } +int Tileset::num_tiles_primary; +int Tileset::num_tiles_total; +int Tileset::num_metatiles_primary; +int Tileset::num_metatiles_total; +int Tileset::num_pals_primary; +int Tileset::num_pals_total; + Metatile::Metatile() { tiles = new QList; @@ -88,8 +95,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 < Tileset::num_metatiles_primary) { return primaryTileset; } else { return secondaryTileset; @@ -97,24 +103,19 @@ Tileset* Metatile::getBlockTileset(int metatile_index, Tileset *primaryTileset, } int Metatile::getBlockIndex(int index) { - int primary_size = 0x200; - if (index < primary_size) { + if (index < Tileset::num_metatiles_primary) { return index; } else { - return index - primary_size; + return index - Tileset::num_metatiles_primary; } } QList> Metatile::getBlockPalettes(Tileset *primaryTileset, Tileset *secondaryTileset) { QList> palettes; - for (int i = 0; i < 6; i++) { + for (int i = 0; i < Tileset::num_pals_primary; 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 = Tileset::num_pals_primary; i < Tileset::num_pals_total; i++) { palettes.append(secondaryTileset->palettes->at(i)); } return palettes; diff --git a/tileset.h b/tileset.h index 5cd22daa..f936855a 100755 --- a/tileset.h +++ b/tileset.h @@ -24,6 +24,13 @@ public: QList *tiles = nullptr; QList *metatiles = nullptr; QList> *palettes = nullptr; + + 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; }; class Metatile