From 267c2ca00ba2a5950684bef460a4c80d52825940 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Tue, 21 Nov 2023 11:25:25 -0800 Subject: [PATCH] fix invalid tool class on v3/v4 --- src/ItemCreator.cc | 27 +++++++++++++++++++-------- src/ItemCreator.hh | 1 - src/ItemParameterTable.cc | 2 +- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/ItemCreator.cc b/src/ItemCreator.cc index c4f8e691..09d96ba8 100644 --- a/src/ItemCreator.cc +++ b/src/ItemCreator.cc @@ -632,8 +632,26 @@ void ItemCreator::generate_common_tool_variances(uint32_t area_norm, ItemData& i if (this->is_v3() && (tool_class == 0x1A)) { tool_class = 0x73; } + this->log.info("Generating tool with class %02hhX", tool_class); + + // Note: This block was originally a separate function called + // generate_common_tool_type + { + // It appears that when Sega deleted Hit Material in v3, they never deleted + // it from the ItemPT entries, so sometimes ItemCreator tries to generate + // it. The original implementation just generates no item when that happens, + // so we do the same here. + try { + auto data = this->item_parameter_table->find_tool_by_id(tool_class); + item.data1[0] = 0x03; + item.data1[1] = data.first; + item.data1[2] = data.second; + } catch (const out_of_range&) { + this->log.info("Tool class is missing; skipping item generation"); + return; + } + } - this->generate_common_tool_type(tool_class, item); if (item.data1[1] == 0x02) { // Tech disk item.data1[4] = this->get_rand_from_weighted_tables_2d_vertical(this->pt->technique_index_prob_table(), area_norm); item.data1[2] = this->generate_tech_disk_level(item.data1[4], area_norm); @@ -652,13 +670,6 @@ uint8_t ItemCreator::generate_tech_disk_level(uint32_t tech_num, uint32_t area_n return range.min; } -void ItemCreator::generate_common_tool_type(uint8_t id, ItemData& item) const { - auto data = this->item_parameter_table->find_tool_by_id(id); - item.data1[0] = 0x03; - item.data1[1] = data.first; - item.data1[2] = data.second; -} - void ItemCreator::generate_common_mag_variances(ItemData& item) const { if (item.data1[0] == 0x02) { item.data1[1] = 0x00; diff --git a/src/ItemCreator.hh b/src/ItemCreator.hh index cd6e71c3..3914188b 100644 --- a/src/ItemCreator.hh +++ b/src/ItemCreator.hh @@ -109,7 +109,6 @@ private: void generate_common_armor_or_shield_type_and_variances(char area_norm, ItemData& item); void generate_common_tool_variances(uint32_t area_norm, ItemData& item); uint8_t generate_tech_disk_level(uint32_t tech_num, uint32_t area_norm); - void generate_common_tool_type(uint8_t tool_class, ItemData& item) const; void generate_common_mag_variances(ItemData& item) const; void generate_common_weapon_variances(uint8_t area_norm, ItemData& item); void generate_common_weapon_grind(ItemData& item, uint8_t offset_within_subtype_range); diff --git a/src/ItemParameterTable.cc b/src/ItemParameterTable.cc index be96016c..58a7a94e 100644 --- a/src/ItemParameterTable.cc +++ b/src/ItemParameterTable.cc @@ -404,7 +404,7 @@ pair ItemParameterTable::find_tool_by_id_t(uint32_t tool_table } } } - throw runtime_error(string_printf("invalid tool class %08" PRIX32, item_id)); + throw out_of_range(string_printf("invalid tool class %08" PRIX32, item_id)); } pair ItemParameterTable::find_tool_by_id(uint32_t item_id) const {