diff --git a/src/Client.cc b/src/Client.cc index 6f69183b..eb197dbf 100644 --- a/src/Client.cc +++ b/src/Client.cc @@ -686,7 +686,7 @@ void Client::create_challenge_overlay( for (size_t z = 0; z < overlay->inventory.items.size(); z++) { auto& i = overlay->inventory.items[z]; - i.present = 0; + i.state = 0; i.unknown_a1 = 0; i.extension_data1 = 0; i.extension_data2 = 0; @@ -712,7 +712,7 @@ void Client::create_challenge_overlay( 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.state = tpl.items[z].state; inv_item.unknown_a1 = tpl.items[z].unknown_a1; inv_item.flags = tpl.items[z].flags; inv_item.data = tpl.items[z].data; diff --git a/src/PlayerInventory.hh b/src/PlayerInventory.hh index 295ec033..76afade2 100644 --- a/src/PlayerInventory.hh +++ b/src/PlayerInventory.hh @@ -42,19 +42,34 @@ class ItemParameterTable; template struct PlayerInventoryItemT { - /* 00 */ uint8_t present = 0; + // Values for state: + // 0 = on floor (used in TItem; not used in PlayerInventoryItem) + // 1 = in player's inventory, not equipped + // 2 = in player's inventory, equipped + // 3 = destroying + /* 00 */ uint8_t state = 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; - /* 04 */ U32T flags = 0; // 8 = equipped + // Bits in the flags field: + // 0004 = is equippable item type ("Equip" appears in menu) + // 0008 = is equipped + // 0010 = is consumable item type (item is automatically deleted when used; also applies to Present) + // 0020 = TODO (3OE1:8010B2DC, 3OE1:80120744) + // 0040 = hidden (model does not render, no related effects are created, no related sounds are played) + // 0080 = TODO (3OE1:TItem_check_flag80; pssibly temp flag only used in Tekker sequence) + // 0100 = has kill count + // 0200 = kill count limit has been reached (item can be unsealed) + // 0400 = wrapped + /* 04 */ U32T flags = 0; /* 08 */ ItemData data; /* 1C */ PlayerInventoryItemT() = default; PlayerInventoryItemT(const ItemData& item, bool equipped) - : present(1), + : state(1), unknown_a1(0), extension_data1(0), extension_data2(0), @@ -63,7 +78,7 @@ struct PlayerInventoryItemT { operator PlayerInventoryItemT() const { PlayerInventoryItemT ret; - ret.present = this->present; + ret.state = this->state; ret.unknown_a1 = this->unknown_a1; ret.extension_data1 = this->extension_data1; ret.extension_data2 = this->extension_data2; @@ -227,7 +242,7 @@ struct PlayerInventoryT { ((data1_1 < 0) || (this->items[read_offset].data.data1[1] == static_cast(data1_1)))); if (!should_delete) { if (read_offset != write_offset) { - this->items[write_offset].present = this->items[read_offset].present; + this->items[write_offset].state = this->items[read_offset].state; 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; diff --git a/src/ReceiveSubcommands.cc b/src/ReceiveSubcommands.cc index 6a3c0e33..8b8a99ef 100644 --- a/src/ReceiveSubcommands.cc +++ b/src/ReceiveSubcommands.cc @@ -756,7 +756,7 @@ static void transcode_inventory_items( } for (size_t z = num_items; z < 30; z++) { auto& item = items[z]; - item.present = 0; + item.state = 0; item.unknown_a1 = 0; item.flags = 0; item.data.clear(); diff --git a/src/SaveFileFormats.cc b/src/SaveFileFormats.cc index f498b27b..1aef6f90 100644 --- a/src/SaveFileFormats.cc +++ b/src/SaveFileFormats.cc @@ -1257,7 +1257,7 @@ void PSOBBCharacterFile::add_item(const ItemData& item, const ItemData::StackLim throw out_of_range("inventory is full"); } auto& inv_item = this->inventory.items[this->inventory.num_items]; - inv_item.present = 1; + inv_item.state = 1; inv_item.unknown_a1 = 0; inv_item.flags = 0; inv_item.data = item; @@ -1304,13 +1304,13 @@ ItemData PSOBBCharacterFile::remove_item(uint32_t item_id, uint32_t amount, cons for (size_t x = index; x < this->inventory.num_items; x++) { auto& to_item = this->inventory.items[x]; const auto& from_item = this->inventory.items[x + 1]; - to_item.present = from_item.present; + to_item.state = from_item.state; to_item.unknown_a1 = from_item.unknown_a1; to_item.flags = from_item.flags; to_item.data = from_item.data; } auto& last_item = this->inventory.items[this->inventory.num_items]; - last_item.present = 0; + last_item.state = 0; last_item.unknown_a1 = 0; last_item.flags = 0; last_item.data.clear();