more notes on PlayerInventoryItem

This commit is contained in:
Martin Michelsen
2026-05-17 07:59:41 -07:00
parent d31fb5b084
commit cb69dc9c14
4 changed files with 26 additions and 11 deletions
+2 -2
View File
@@ -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;
+20 -5
View File
@@ -42,19 +42,34 @@ class ItemParameterTable;
template <bool BE>
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<BE> 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<BE> 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<!BE>() const {
PlayerInventoryItemT<!BE> 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<uint8_t>(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;
+1 -1
View File
@@ -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();
+3 -3
View File
@@ -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();