From d93e6405c3d8c160877f2d2d1a91e9853ab34d56 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Fri, 1 Mar 2024 23:19:18 -0800 Subject: [PATCH] fix v1-encoded item descriptions --- src/Client.cc | 28 ++++++--------------------- src/ItemNameIndex.cc | 4 +--- src/ServerState.cc | 8 +++++++- system/item-tables/ItemPMT-dc-v1.prs | Bin 5549 -> 5755 bytes 4 files changed, 14 insertions(+), 26 deletions(-) diff --git a/src/Client.cc b/src/Client.cc index 2138d0fd..68efb6e8 100644 --- a/src/Client.cc +++ b/src/Client.cc @@ -1047,44 +1047,28 @@ void Client::use_character_bank(int8_t index) { } void Client::print_inventory(FILE* stream) const { + auto s = this->require_server_state(); auto p = this->character(); - shared_ptr name_index; - try { - name_index = this->require_server_state()->item_name_index(this->version()); - } catch (const runtime_error&) { - } fprintf(stream, "[PlayerInventory] Meseta: %" PRIu32 "\n", p->disp.stats.meseta.load()); fprintf(stream, "[PlayerInventory] %hhu items\n", p->inventory.num_items); for (size_t x = 0; x < p->inventory.num_items; x++) { const auto& item = p->inventory.items[x]; auto hex = item.data.hex(); - if (name_index) { - auto name = name_index->describe_item(item.data); - fprintf(stream, "[PlayerInventory] %2zu: [+%08" PRIX32 "] %s (%s)\n", x, item.flags.load(), hex.c_str(), name.c_str()); - } else { - fprintf(stream, "[PlayerInventory] %2zu: [+%08" PRIX32 "] %s\n", x, item.flags.load(), hex.c_str()); - } + auto name = s->describe_item(this->version(), item.data, false); + fprintf(stream, "[PlayerInventory] %2zu: [+%08" PRIX32 "] %s (%s)\n", x, item.flags.load(), hex.c_str(), name.c_str()); } } void Client::print_bank(FILE* stream) const { + auto s = this->require_server_state(); auto p = this->character(); - shared_ptr name_index; - try { - name_index = this->require_server_state()->item_name_index(this->version()); - } catch (const runtime_error&) { - } fprintf(stream, "[PlayerBank] Meseta: %" PRIu32 "\n", p->bank.meseta.load()); fprintf(stream, "[PlayerBank] %" PRIu32 " items\n", p->bank.num_items.load()); for (size_t x = 0; x < p->bank.num_items; x++) { const auto& item = p->bank.items[x]; const char* present_token = item.present ? "" : " (missing present flag)"; auto hex = item.data.hex(); - if (name_index) { - auto name = name_index->describe_item(item.data); - fprintf(stream, "[PlayerBank] %3zu: %s (%s) (x%hu)%s\n", x, hex.c_str(), name.c_str(), item.amount.load(), present_token); - } else { - fprintf(stream, "[PlayerBank] %3zu: %s (x%hu)%s\n", x, hex.c_str(), item.amount.load(), present_token); - } + auto name = s->describe_item(this->version(), item.data, false); + fprintf(stream, "[PlayerBank] %3zu: %s (%s) (x%hu)%s\n", x, hex.c_str(), name.c_str(), item.amount.load(), present_token); } } diff --git a/src/ItemNameIndex.cc b/src/ItemNameIndex.cc index 681a5052..31a07c5e 100644 --- a/src/ItemNameIndex.cc +++ b/src/ItemNameIndex.cc @@ -97,9 +97,7 @@ const array name_for_s_rank_special = { "King\'s", }; -std::string ItemNameIndex::describe_item( - const ItemData& item, - bool include_color_escapes) const { +std::string ItemNameIndex::describe_item(const ItemData& item, bool include_color_escapes) const { if (item.data1[0] == 0x04) { return string_printf("%s%" PRIu32 " Meseta", include_color_escapes ? "$C7" : "", item.data2d.load()); } diff --git a/src/ServerState.cc b/src/ServerState.cc index 98e5b016..7589fc4f 100644 --- a/src/ServerState.cc +++ b/src/ServerState.cc @@ -406,7 +406,13 @@ shared_ptr ServerState::item_name_index(Version version) co } string ServerState::describe_item(Version version, const ItemData& item, bool include_color_codes) const { - return this->item_name_index(version)->describe_item(item, include_color_codes); + if (is_v1(version)) { + ItemData encoded = item; + encoded.encode_for_version(version, this->item_parameter_table(version)); + return this->item_name_index(version)->describe_item(encoded, include_color_codes); + } else { + return this->item_name_index(version)->describe_item(item, include_color_codes); + } } ItemData ServerState::parse_item_description(Version version, const string& description) const { diff --git a/system/item-tables/ItemPMT-dc-v1.prs b/system/item-tables/ItemPMT-dc-v1.prs index a3fecfcc46808cadf0f5760ec0ce15ce1426fa2d..369d1580163cccd0cf18b0f4dd0bb98975f47a50 100644 GIT binary patch literal 5755 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 literal 5549 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