Skip to content

Commit

Permalink
add option in realmz_dasm to find unused tile icons
Browse files Browse the repository at this point in the history
  • Loading branch information
fuzziqersoftware committed Mar 26, 2023
1 parent 0abe5ea commit 5c96b77
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 13 deletions.
27 changes: 23 additions & 4 deletions src/RealmzScenarioData.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2087,12 +2087,23 @@ unordered_set<string> RealmzScenarioData::all_land_types() {
return all;
}

Image RealmzScenarioData::generate_land_map(int16_t level_num, uint8_t x0,
uint8_t y0, uint8_t w, uint8_t h) {
Image RealmzScenarioData::generate_land_map(
int16_t level_num,
uint8_t x0,
uint8_t y0,
uint8_t w,
uint8_t h,
unordered_set<int16_t>* used_negative_tiles,
unordered_map<string, unordered_set<uint8_t>>* used_positive_tiles) {
const auto& mdata = this->land_maps.at(level_num);
const auto& metadata = this->land_metadata.at(level_num);
const auto& aps = this->land_aps.at(level_num);

unordered_set<uint8_t>* used_positive_tiles_for_land_type = nullptr;
if (used_positive_tiles) {
used_positive_tiles_for_land_type = &(*used_positive_tiles)[metadata.land_type];
}

LevelNeighbors n;
if (x0 == 0 && y0 == 0 && w == 90 && h == 90) {
try {
Expand Down Expand Up @@ -2183,7 +2194,11 @@ Image RealmzScenarioData::generate_land_map(int16_t level_num, uint8_t x0,
size_t yp = (y - y0) * 32 + (n.top != -1 ? 9 : 0);

// Draw the tile itself
if (data < 0 || data > 200) { // Masked tile
if ((data < 0) || (data >= 200)) { // Masked tile
if (used_negative_tiles) {
used_negative_tiles->emplace(data);
}

Image cicn;
if (this->scenario_rsf.resource_exists(RESOURCE_TYPE_cicn, data)) {
cicn = this->scenario_rsf.decode_cicn(data).image;
Expand Down Expand Up @@ -2219,7 +2234,11 @@ Image RealmzScenarioData::generate_land_map(int16_t level_num, uint8_t x0,
0);
}

} else if (data <= 200) { // Standard tile
} else if (data < 200) { // Standard tile
if (used_positive_tiles_for_land_type) {
used_positive_tiles_for_land_type->emplace(data);
}

size_t source_id = data - 1;
size_t sxp = (source_id % 20) * 32;
size_t syp = (source_id / 20) * 32;
Expand Down
10 changes: 8 additions & 2 deletions src/RealmzScenarioData.hh
Original file line number Diff line number Diff line change
Expand Up @@ -400,8 +400,14 @@ struct RealmzScenarioData {
const TileSetDefinition& def);
void populate_image_caches(ResourceFile& the_family_jewels_rsf);
void add_custom_pattern(const std::string& land_type, Image& img);
Image generate_land_map(int16_t level_num, uint8_t x0, uint8_t y0, uint8_t w,
uint8_t h);
Image generate_land_map(
int16_t level_num,
uint8_t x0,
uint8_t y0,
uint8_t w,
uint8_t h,
std::unordered_set<int16_t>* used_negative_tiles = nullptr,
std::unordered_map<std::string, std::unordered_set<uint8_t>>* used_positive_tiles = nullptr);



Expand Down
38 changes: 31 additions & 7 deletions src/realmz_dasm.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ using namespace std;


int disassemble_scenario(const string& data_dir, const string& scenario_dir,
const string& out_dir, const ImageSaver& image_saver) {
const string& out_dir, const ImageSaver& image_saver, bool show_unused_tile_ids) {

string scenario_name;
{
Expand Down Expand Up @@ -148,10 +148,13 @@ int disassemble_scenario(const string& data_dir, const string& scenario_dir,

// Generate land maps
unordered_map<int16_t, string> level_id_to_filename;
unordered_set<int16_t> used_negative_tiles;
unordered_map<string, unordered_set<uint8_t>> used_positive_tiles;
for (size_t z = 0; z < scen.land_maps.size(); z++) {
string filename = string_printf("%s/land_%zu", out_dir.c_str(), z);
try {
Image map = scen.generate_land_map(z, 0, 0, 90, 90);
Image map = scen.generate_land_map(
z, 0, 0, 90, 90, &used_negative_tiles, &used_positive_tiles);
filename = image_saver.save_image(map, filename);
fprintf(stderr, "... %s\n", filename.c_str());
level_id_to_filename[z] = filename;
Expand Down Expand Up @@ -192,6 +195,24 @@ int disassemble_scenario(const string& data_dir, const string& scenario_dir,
fprintf(stderr, "... %s\n", filename.c_str());
}

// Find unused land tiles
if (show_unused_tile_ids) {
for (const auto& it : used_positive_tiles) {
for (uint8_t z = 0; z < 200; z++) {
if (!it.second.count(z)) {
fprintf(stderr, ">>> unused positive tile: %s-%hhu (x=%hhu, y=%hhu in positive pattern)\n",
it.first.c_str(), z, static_cast<uint8_t>(z % 20),
static_cast<uint8_t>(z / 20));
}
}
}
for (int16_t z : scen.scenario_rsf.all_resources_of_type(RESOURCE_TYPE_cicn)) {
if (!used_negative_tiles.count(z)) {
fprintf(stderr, ">>> unused negative tile: %hd\n", z);
}
}
}

return 0;
}

Expand Down Expand Up @@ -272,13 +293,16 @@ IMAGE_SAVER_HELP);
}

int main(int argc, char* argv[]) {
string data_dir;
string scenario_dir;
string out_dir;
ImageSaver image_saver;
string data_dir;
string scenario_dir;
string out_dir;
ImageSaver image_saver;
bool show_unused_tile_ids = false;
for (int x = 1; x < argc; x++) {
if (image_saver.process_cli_arg(argv[x])) {
// Nothing
} else if (!strcmp(argv[x], "--show-unused-tiles")) {
show_unused_tile_ids = true;
} else if (data_dir.empty()) {
data_dir = argv[x];
} else if (scenario_dir.empty()) {
Expand All @@ -302,7 +326,7 @@ int main(int argc, char* argv[]) {
}

if (!scenario_dir.empty()) {
return disassemble_scenario(data_dir, scenario_dir, out_dir, image_saver);
return disassemble_scenario(data_dir, scenario_dir, out_dir, image_saver, show_unused_tile_ids);
} else {
return disassemble_global_data(data_dir, out_dir, image_saver);
}
Expand Down

0 comments on commit 5c96b77

Please sign in to comment.