From 010f753a083859f130a649a85a3b9e94384d9012 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Fri, 2 Sep 2022 18:26:47 -0700 Subject: [PATCH] clean up some player structs --- src/Client.cc | 2 +- src/CommandFormats.hh | 1 + src/Items.cc | 2 +- src/LevelTable.cc | 7 ++-- src/LevelTable.hh | 30 +++++++++-------- src/Map.hh | 3 +- src/Player.cc | 11 +++---- src/Player.hh | 69 ++++++++++++++++++++------------------- src/ReceiveCommands.cc | 2 +- src/ReceiveSubcommands.cc | 28 +++++++--------- src/SendCommands.cc | 2 +- 11 files changed, 77 insertions(+), 80 deletions(-) diff --git a/src/Client.cc b/src/Client.cc index e22005f4..1b8a2e86 100644 --- a/src/Client.cc +++ b/src/Client.cc @@ -71,7 +71,7 @@ Client::Client( void Client::set_license(shared_ptr l) { this->license = l; - this->game_data.serial_number = this->license->serial_number; + this->game_data.guild_card_number = this->license->serial_number; if (this->version() == GameVersion::BB) { this->game_data.bb_username = this->license->username; } diff --git a/src/CommandFormats.hh b/src/CommandFormats.hh index 5e33b2df..db894c9d 100644 --- a/src/CommandFormats.hh +++ b/src/CommandFormats.hh @@ -3252,6 +3252,7 @@ struct G_ShopContents_BB_6xB6 { uint8_t shop_type; uint8_t num_items; le_uint16_t unused; + // Note: data2d of these entries should be the price ItemData entries[20]; }; diff --git a/src/Items.cc b/src/Items.cc index bf7972ae..65d4db25 100644 --- a/src/Items.cc +++ b/src/Items.cc @@ -156,7 +156,7 @@ void player_use_item(shared_ptr c, size_t item_index) { // ssize_t equipped_shield = -1; // ssize_t equipped_mag = -1; for (size_t y = 0; y < c->game_data.player()->inventory.num_items; y++) { - if (c->game_data.player()->inventory.items[y].equip_flags & 0x0008) { + if (c->game_data.player()->inventory.items[y].flags & 0x00000008) { if (c->game_data.player()->inventory.items[y].data.data1[0] == 0) { equipped_weapon = y; } diff --git a/src/LevelTable.cc b/src/LevelTable.cc index 70833146..6f6461b4 100644 --- a/src/LevelTable.cc +++ b/src/LevelTable.cc @@ -11,7 +11,6 @@ using namespace std; LevelTable::LevelTable(const string& filename, bool compressed) { - string data = load_file(filename); if (compressed) { data = prs_decompress(data); @@ -31,7 +30,7 @@ const PlayerStats& LevelTable::base_stats_for_class(uint8_t char_class) const { return this->base_stats[char_class]; } - const LevelStats& LevelTable::stats_for_level(uint8_t char_class, +const LevelTable::LevelStats& LevelTable::stats_for_level(uint8_t char_class, uint8_t level) const { if (char_class >= 12) { throw invalid_argument("invalid character class"); @@ -42,12 +41,12 @@ const PlayerStats& LevelTable::base_stats_for_class(uint8_t char_class) const { return this->levels[char_class][level]; } -// Levels up a character by adding the level-up bonuses to the player's stats. -void LevelStats::apply(PlayerStats& ps) const { +void LevelTable::LevelStats::apply(PlayerStats& ps) const { ps.ata += this->ata; ps.atp += this->atp; ps.dfp += this->dfp; ps.evp += this->evp; ps.hp += this->hp; ps.mst += this->mst; + ps.lck += this->lck; } diff --git a/src/LevelTable.hh b/src/LevelTable.hh index 9097ded3..1a00c85c 100644 --- a/src/LevelTable.hh +++ b/src/LevelTable.hh @@ -19,22 +19,21 @@ struct PlayerStats { PlayerStats() noexcept; } __attribute__((packed)); -// information on a single level for a single class -struct LevelStats { - uint8_t atp; // atp to add on level up - uint8_t mst; // mst to add on level up - uint8_t evp; // evp to add on level up - uint8_t hp; // hp to add on level up - uint8_t dfp; // dfp to add on level up - uint8_t ata; // ata to add on level up - uint8_t unknown[2]; - le_uint32_t experience; // EXP value of this level +struct LevelTable { // from PlyLevelTbl.prs + struct LevelStats { + uint8_t atp; + uint8_t mst; + uint8_t evp; + uint8_t hp; + uint8_t dfp; + uint8_t ata; + uint8_t lck; + uint8_t tp; + le_uint32_t experience; - void apply(PlayerStats& ps) const; -} __attribute__((packed)); + void apply(PlayerStats& ps) const; + } __attribute__((packed)); -// level table format (PlyLevelTbl.prs) -struct LevelTable { PlayerStats base_stats[12]; le_uint32_t unknown[12]; LevelStats levels[12][200]; @@ -43,4 +42,7 @@ struct LevelTable { const PlayerStats& base_stats_for_class(uint8_t char_class) const; const LevelStats& stats_for_level(uint8_t char_class, uint8_t level) const; + + static std::shared_ptr load_shared( + const std::string& filename, bool compressed); } __attribute__((packed)); diff --git a/src/Map.hh b/src/Map.hh index df80956a..82a62126 100644 --- a/src/Map.hh +++ b/src/Map.hh @@ -18,7 +18,8 @@ struct BattleParams { le_uint16_t dfp; // defense le_uint16_t ata; // accuracy le_uint16_t lck; // luck - uint8_t unknown_a1[0x0E]; + le_uint16_t esp; // ??? + uint8_t unknown_a1[0x0C]; le_uint32_t experience; le_uint32_t difficulty; } __attribute__((packed)); diff --git a/src/Player.cc b/src/Player.cc index 18f19ab9..6e29fad7 100644 --- a/src/Player.cc +++ b/src/Player.cc @@ -524,7 +524,7 @@ PlayerBB ClientGameData::export_player_bb() { ret.option_flags = account->option_flags; ret.quest_data1 = player->quest_data1; ret.bank = player->bank; - ret.serial_number = this->serial_number; + ret.guild_card_number = this->guild_card_number; ret.name = player->disp.name; ret.team_name = account->team_name; ret.guild_card_description = player->guild_card_description; @@ -657,14 +657,11 @@ PlayerInventoryItem::PlayerInventoryItem() { } PlayerInventoryItem::PlayerInventoryItem(const PlayerBankItem& src) - : tech_flag(0x0001), data(src.data) { - this->equip_flags = (this->data.data1[0] > 2) ? 0x0044 : 0x0050; -} + : present(1), flags(0), data(src.data) { } void PlayerInventoryItem::clear() { - this->equip_flags = 0x0000; - this->tech_flag = 0x0000; - this->game_flags = 0x00000000; + this->present = 0x00000000; + this->flags = 0x00000000; this->data.clear(); } diff --git a/src/Player.hh b/src/Player.hh index f5802853..ad82e25a 100644 --- a/src/Player.hh +++ b/src/Player.hh @@ -36,9 +36,8 @@ struct ItemData { // 0x14 bytes struct PlayerBankItem; struct PlayerInventoryItem { // 0x1C bytes - le_uint16_t equip_flags; - le_uint16_t tech_flag; - le_uint32_t game_flags; + le_uint32_t present; + le_uint32_t flags; // 8 = equipped ItemData data; PlayerInventoryItem(); @@ -68,7 +67,7 @@ struct PlayerInventory { // 0x34C bytes size_t find_item(uint32_t item_id); } __attribute__((packed)); -struct PlayerBank { // 0xFA8 bytes +struct PlayerBank { // 0x12C8 bytes le_uint32_t num_items; le_uint32_t meseta; PlayerBankItem items[200]; @@ -176,7 +175,7 @@ struct PlayerDispDataBB { le_uint32_t meseta; ptext guild_card; uint64_t unknown_a2; - le_uint32_t name_color; + le_uint32_t name_color; // ARGB8888 uint8_t extra_model; parray unused; le_uint32_t name_color_checksum; @@ -195,7 +194,9 @@ struct PlayerDispDataBB { le_uint16_t hair_b; le_float proportion_x; le_float proportion_y; - ptext name; + ptext name; + le_uint32_t play_time; + uint32_t unknown_a3; parray config; parray technique_levels; @@ -262,7 +263,7 @@ struct KeyAndTeamConfigBB { parray unknown_a1; // 0000 parray key_config; // 0114 parray joystick_config; // 0280 - le_uint32_t serial_number; // 02B8 + le_uint32_t guild_card_number; // 02B8 le_uint32_t team_id; // 02BC le_uint64_t team_info; // 02C0 le_uint16_t team_privilege_level; // 02C8 @@ -413,31 +414,31 @@ struct PSOPlayerDataBB { // For command 61 } __attribute__((packed)); struct PlayerBB { // Used in 00E7 command - PlayerInventory inventory; // player - PlayerDispDataBB disp; // player - parray unknown; // not saved - le_uint32_t option_flags; // account - parray quest_data1; // player - PlayerBank bank; // player - le_uint32_t serial_number; // player - ptext name; // player - ptext team_name; // player - ptext guild_card_description; // player - uint8_t reserved1; // player - uint8_t reserved2; // player - uint8_t section_id; // player - uint8_t char_class; // player - le_uint32_t unknown3; // not saved - parray symbol_chats; // account - parray shortcuts; // account - ptext auto_reply; // player - ptext info_board; // player - parray unknown5; // not saved - parray challenge_data; // player - parray tech_menu_config; // player - parray unknown6; // not saved - parray quest_data2; // player - KeyAndTeamConfigBB key_config; // account + PlayerInventory inventory; // 0000-034C; player + PlayerDispDataBB disp; // 034C-04DC; player + parray unknown; // 04DC-04EC; not saved + le_uint32_t option_flags; // 04EC-04F0; account + parray quest_data1; // 04F0-06F8; player + PlayerBank bank; // 06F8-19C0; player + le_uint32_t guild_card_number; // 19C0-19C4; player + ptext name; // 19C4-19F4; player + ptext team_name; // 19F4-1A14; player + ptext guild_card_description; // 1A14-1AC4; player + uint8_t reserved1; // 1AC4-1AC5; player + uint8_t reserved2; // 1AC5-1AC6; player + uint8_t section_id; // 1AC6-1AC7; player + uint8_t char_class; // 1AC7-1AC8; player + le_uint32_t unknown3; // 1AC8-1ACC; not saved + parray symbol_chats; // 1ACC-1FAC; account + parray shortcuts; // 1FAC-29EC; account + ptext auto_reply; // 29EC-2B44; player + ptext info_board; // 2B44-2C9C; player + parray unknown5; // 2C9C-2CB8; not saved + parray challenge_data; // 2CB8-2DF8; player + parray tech_menu_config; // 2DF8-2E20; player + parray unknown6; // 2E20-2E4C; not saved + parray quest_data2; // 2E4C-2EA4; player + KeyAndTeamConfigBB key_config; // 2EA4-3994; account } __attribute__((packed)); @@ -482,7 +483,7 @@ private: std::shared_ptr player_data; public: - uint32_t serial_number; + uint32_t guild_card_number; // The following fields are not saved, and are only used in certain situations @@ -499,7 +500,7 @@ public: std::vector shop_contents; bool should_save; - ClientGameData() : serial_number(0), bb_player_index(0), should_save(true) { } + ClientGameData() : guild_card_number(0), bb_player_index(0), should_save(true) { } ~ClientGameData(); std::shared_ptr account(bool should_load = true); diff --git a/src/ReceiveCommands.cc b/src/ReceiveCommands.cc index d0471561..42aab17b 100644 --- a/src/ReceiveCommands.cc +++ b/src/ReceiveCommands.cc @@ -1723,7 +1723,7 @@ static void on_player_preview_request_bb(shared_ptr, shared_ptrlicense->serial_number; + temp_gd.guild_card_number = c->license->serial_number; temp_gd.bb_username = c->license->username; temp_gd.bb_player_index = cmd.player_index; diff --git a/src/ReceiveSubcommands.cc b/src/ReceiveSubcommands.cc index 54f3816e..0cf2ab4d 100644 --- a/src/ReceiveSubcommands.cc +++ b/src/ReceiveSubcommands.cc @@ -318,9 +318,8 @@ static void on_subcommand_create_inventory_item(shared_ptr, if (l->flags & Lobby::Flag::ITEM_TRACKING_ENABLED) { PlayerInventoryItem item; - item.equip_flags = 0; // TODO: Use the right default flags here - item.tech_flag = 0; - item.game_flags = 0; + item.present = 1; + item.flags = 0; item.data = cmd->item; c->game_data.player()->add_item(item); @@ -350,9 +349,8 @@ static void on_subcommand_drop_partial_stack(shared_ptr, // TODO: Should we delete anything from the inventory here? Does the client // send an appropriate 6x29 alongside this? PlayerInventoryItem item; - item.equip_flags = 0; // TODO: Use the right default flags here - item.tech_flag = 0; - item.game_flags = 0; + item.present = 1; + item.flags = 0; item.data = cmd->data; l->add_item(item, cmd->area, cmd->x, cmd->z); @@ -419,9 +417,8 @@ static void on_subcommand_buy_shop_item(shared_ptr, if (l->flags & Lobby::Flag::ITEM_TRACKING_ENABLED) { PlayerInventoryItem item; - item.equip_flags = 0; // TODO: Use the right default flags here - item.tech_flag = 0; - item.game_flags = 0; + item.present = 1; + item.flags = 0; item.data = cmd->item; c->game_data.player()->add_item(item); @@ -447,9 +444,8 @@ static void on_subcommand_box_or_enemy_item_drop(shared_ptr, } PlayerInventoryItem item; - item.equip_flags = 0; // TODO: Use the right default flags here - item.tech_flag = 0; - item.game_flags = 0; + item.present = 1; + item.flags = 0; item.data = cmd->data; l->add_item(item, cmd->area, cmd->x, cmd->z); @@ -526,10 +522,10 @@ static void on_subcommand_equip_unequip_item(shared_ptr, if (l->flags & Lobby::Flag::ITEM_TRACKING_ENABLED) { size_t index = c->game_data.player()->inventory.find_item(cmd->item_id); - if (cmd->command == 0x25) { - c->game_data.player()->inventory.items[index].equip_flags |= 0x00000008; // equip - } else { - c->game_data.player()->inventory.items[index].equip_flags &= 0xFFFFFFF7; // unequip + if (cmd->command == 0x25) { // equip + c->game_data.player()->inventory.items[index].flags |= 0x00000008; + } else { // unequip + c->game_data.player()->inventory.items[index].flags &= 0xFFFFFFF7; } } else if (l->version == GameVersion::BB) { throw logic_error("item tracking not enabled in BB game"); diff --git a/src/SendCommands.cc b/src/SendCommands.cc index 544942c9..ff0cd76c 100644 --- a/src/SendCommands.cc +++ b/src/SendCommands.cc @@ -1476,7 +1476,7 @@ void send_level_up(shared_ptr l, shared_ptr c) { PlayerStats stats = c->game_data.player()->disp.stats; for (size_t x = 0; x < c->game_data.player()->inventory.num_items; x++) { - if ((c->game_data.player()->inventory.items[x].equip_flags & 0x08) && + if ((c->game_data.player()->inventory.items[x].flags & 0x08) && (c->game_data.player()->inventory.items[x].data.data1[0] == 0x02)) { stats.dfp += (c->game_data.player()->inventory.items[x].data.data1w[2] / 100); stats.atp += (c->game_data.player()->inventory.items[x].data.data1w[3] / 50);