diff --git a/src/Main.cc b/src/Main.cc index 9d33493d..4a0b4b58 100644 --- a/src/Main.cc +++ b/src/Main.cc @@ -2628,6 +2628,7 @@ Action a_show_battle_params( Action a_load_maps_test( "load-maps-test", nullptr, +[](phosg::Arguments& args) { bool save_disassembly = args.get("disassemble"); + bool generate_enemy_stats = args.get("generate-enemy-stats"); auto s = make_shared(get_config_filename(args)); s->load_config_early(); @@ -2718,6 +2719,44 @@ Action a_load_maps_test( supermap->print(f.get()); filename_token = " => " + filename; } + if (generate_enemy_stats) { + array, NUM_VERSIONS> counts_for_version; + for (Version v : ALL_ARPG_SEMANTIC_VERSIONS) { + counts_for_version[static_cast(v)] = supermap->count_enemy_sets_for_version(v); + } + string filename = phosg::string_printf("supermap_quest_%" PRIu32 "_%08" PRIX32 "_enemy_counts.txt", it.first, random_seed); + auto f = phosg::fopen_unique(filename, "wt"); + fprintf(f.get(), "QUEST %" PRIu32 " (%s)\n", it.first, it.second->name.c_str()); + fprintf(f.get(), "ENEMY--------------- DCNTE 11/2K DC-V1 DC-V2 PCNTE PC-V2 GCNTE GC-V3 XB-V3 BB-V4\n"); + for (size_t type_ss = 0; type_ss < static_cast(EnemyType::MAX_ENEMY_TYPE); type_ss++) { + EnemyType type = static_cast(type_ss); + bool any_count_nonzero = false; + array counts; + for (Version v : ALL_ARPG_SEMANTIC_VERSIONS) { + size_t& count = counts[static_cast(v)]; + try { + count = counts_for_version[static_cast(v)].at(type); + } catch (const out_of_range&) { + count = 0; + } + if (count != 0) { + any_count_nonzero = true; + } + } + if (any_count_nonzero) { + fprintf(f.get(), "%20s", phosg::name_for_enum(type)); + for (Version v : ALL_ARPG_SEMANTIC_VERSIONS) { + size_t count = counts[static_cast(v)]; + if (count > 0) { + fprintf(f.get(), " %5zu", count); + } else { + fputs(" ", f.get()); + } + } + fputc('\n', f.get()); + } + } + } auto eff = supermap->efficiency(); all_quests_eff += eff; auto eff_str = eff.str(); diff --git a/src/Map.cc b/src/Map.cc index bd114dd9..e9f2ec7d 100644 --- a/src/Map.cc +++ b/src/Map.cc @@ -3002,6 +3002,18 @@ vector> SuperMap::events_for_floor_room_wave( return ret; } +unordered_map SuperMap::count_enemy_sets_for_version(Version version) const { + unordered_map ret; + for (const auto& ene : this->version(version).enemy_sets) { + try { + ret.at(ene->type) += 1; + } catch (const out_of_range&) { + ret.emplace(ene->type, 1); + } + } + return ret; +} + SuperMap::EfficiencyStats& SuperMap::EfficiencyStats::operator+=(const EfficiencyStats& other) { this->filled_object_slots += other.filled_object_slots; this->total_object_slots += other.total_object_slots; diff --git a/src/Map.hh b/src/Map.hh index 30393615..40f87738 100644 --- a/src/Map.hh +++ b/src/Map.hh @@ -588,6 +588,8 @@ public: std::vector> events_for_floor_room_wave( Version version, uint8_t floor, uint16_t room, uint16_t wave_number) const; + std::unordered_map count_enemy_sets_for_version(Version version) const; + struct EfficiencyStats { size_t filled_object_slots = 0; size_t total_object_slots = 0;