add enemy count computation in load-maps-test
This commit is contained in:
+39
@@ -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<bool>("disassemble");
|
||||
bool generate_enemy_stats = args.get<bool>("generate-enemy-stats");
|
||||
|
||||
auto s = make_shared<ServerState>(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<unordered_map<EnemyType, size_t>, NUM_VERSIONS> counts_for_version;
|
||||
for (Version v : ALL_ARPG_SEMANTIC_VERSIONS) {
|
||||
counts_for_version[static_cast<size_t>(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<size_t>(EnemyType::MAX_ENEMY_TYPE); type_ss++) {
|
||||
EnemyType type = static_cast<EnemyType>(type_ss);
|
||||
bool any_count_nonzero = false;
|
||||
array<size_t, NUM_VERSIONS> counts;
|
||||
for (Version v : ALL_ARPG_SEMANTIC_VERSIONS) {
|
||||
size_t& count = counts[static_cast<size_t>(v)];
|
||||
try {
|
||||
count = counts_for_version[static_cast<size_t>(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<size_t>(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();
|
||||
|
||||
+12
@@ -3002,6 +3002,18 @@ vector<shared_ptr<const SuperMap::Event>> SuperMap::events_for_floor_room_wave(
|
||||
return ret;
|
||||
}
|
||||
|
||||
unordered_map<EnemyType, size_t> SuperMap::count_enemy_sets_for_version(Version version) const {
|
||||
unordered_map<EnemyType, size_t> 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;
|
||||
|
||||
@@ -588,6 +588,8 @@ public:
|
||||
std::vector<std::shared_ptr<const Event>> events_for_floor_room_wave(
|
||||
Version version, uint8_t floor, uint16_t room, uint16_t wave_number) const;
|
||||
|
||||
std::unordered_map<EnemyType, size_t> count_enemy_sets_for_version(Version version) const;
|
||||
|
||||
struct EfficiencyStats {
|
||||
size_t filled_object_slots = 0;
|
||||
size_t total_object_slots = 0;
|
||||
|
||||
Reference in New Issue
Block a user