From 3a21cb29fd240b8cc8a59250a99e13d80678ca08 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Fri, 27 Oct 2023 00:07:34 -0700 Subject: [PATCH] refine PlayerInventoryItem --- notes/psobb/ItemRT_Ep4.gsl | Bin 114688 -> 114688 bytes src/Player.cc | 4 ++++ src/PlayerSubordinates.cc | 2 ++ src/PlayerSubordinates.hh | 3 ++- 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/notes/psobb/ItemRT_Ep4.gsl b/notes/psobb/ItemRT_Ep4.gsl index 4224bcdc0d43adf8fca9a8508a28919976a536a0..e0a30d8bcd91fa165c08faa6d0218632b3334ab1 100755 GIT binary patch delta 3574 zcmZwHM^6+`07c;$gN_BeKAdO8UUBGP#V&RcdlyF$2UG;?$s}$~jK79I=far0cV;o? zZol1G+1ypyv8}wQP*_keq$TXkSQ6~YxLB||;}XH1j7tT3 zGcFVC%h)Q|pK-b1K*kkvU@jC7HDfIwQHUL;sZofBO;e;0E2gPZh@GY>Q;1!r zsZ)sErYTg2J*KHth`pvMRfv72sa1&mqWO|S95AKTpee16n9}N~DXor~((1S=txlNI z>ZB>HhD>R7N;IESh^I|yb;gudXH98!&XiW?O=)$(lvWo_X*Fz0t4pS|x-6P+D#RY0nX-caRQ(E0JrPZh@t!_8#SmUqmn9}O5DXs3A((1k`tsa=t z>Y*vE9+}eWu_>*dn9}O0XydP*nbPXHDXm_Z(rV0 p*_2jaOlkGilvdwNY4zPSw_5n)zs|Q$6n~X}wp8X@D#gFQ{{fad;V}RJ literal 114688 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 zxrTrtUinventory.items.size(); z++) { auto& i = overlay->inventory.items[z]; i.present = 0; + i.unknown_a1 = 0; i.extension_data1 = 0; i.extension_data2 = 0; i.flags = 0; @@ -124,6 +125,7 @@ void ClientGameData::create_challenge_overlay(size_t template_index, shared_ptr< for (size_t z = 0; z < tpl.items.size(); z++) { auto& inv_item = overlay->inventory.items[z]; inv_item.present = tpl.items[z].present; + inv_item.unknown_a1 = tpl.items[z].unknown_a1; inv_item.flags = tpl.items[z].flags; inv_item.data = tpl.items[z].data; } @@ -350,6 +352,7 @@ void SavedPlayerDataBB::add_item(const ItemData& item) { } auto& inv_item = this->inventory.items[this->inventory.num_items]; inv_item.present = 1; + inv_item.unknown_a1 = 0; inv_item.flags = 0; inv_item.data = item; this->inventory.num_items++; @@ -395,6 +398,7 @@ ItemData SavedPlayerDataBB::remove_item(uint32_t item_id, uint32_t amount, bool } auto& last_item = this->inventory.items[this->inventory.num_items]; last_item.present = 0; + last_item.unknown_a1 = 0; last_item.flags = 0; last_item.data.clear(); return ret; diff --git a/src/PlayerSubordinates.cc b/src/PlayerSubordinates.cc index 9eb7d53d..7eaf9b14 100644 --- a/src/PlayerSubordinates.cc +++ b/src/PlayerSubordinates.cc @@ -562,6 +562,7 @@ size_t PlayerInventory::remove_all_items_of_type(uint8_t data1_0, int16_t data1_ if (!should_delete) { if (read_offset != write_offset) { this->items[write_offset].present = this->items[read_offset].present; + this->items[write_offset].unknown_a1 = this->items[read_offset].unknown_a1; this->items[write_offset].flags = this->items[read_offset].flags; this->items[write_offset].data = this->items[read_offset].data; } @@ -809,6 +810,7 @@ const ChallengeTemplateDefinition& get_challenge_template_definition(uint32_t cl static auto make_template_item = +[](bool equipped, uint64_t first_data, uint64_t second_data = 0) -> PlayerInventoryItem { PlayerInventoryItem ret = { .present = 1, + .unknown_a1 = 0, .extension_data1 = 0, .extension_data2 = 0, .flags = (equipped ? 8 : 0), diff --git a/src/PlayerSubordinates.hh b/src/PlayerSubordinates.hh index 22002161..262df4bc 100644 --- a/src/PlayerSubordinates.hh +++ b/src/PlayerSubordinates.hh @@ -43,7 +43,8 @@ extern FileContentsCache player_files_cache; // Unknown. These are not an array, but do appear to be related. struct PlayerInventoryItem { - /* 00 */ le_uint16_t present = 0; + /* 00 */ uint8_t present = 0; + /* 01 */ uint8_t unknown_a1 = 0; // See note above about these fields /* 02 */ uint8_t extension_data1 = 0; /* 03 */ uint8_t extension_data2 = 0;