more notes on PlayerInventoryItem
This commit is contained in:
+2
-2
@@ -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
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user