#pragma once #include #include #include #include #include #include #include #include "Episode3/DataIndexes.hh" #include "PlayerSubordinates.hh" #include "Text.hh" #include "Version.hh" struct PendingItemTrade { uint8_t other_client_id; bool confirmed; // true if client has sent a D2 command std::vector items; }; struct PendingCardTrade { uint8_t other_client_id; bool confirmed; // true if client has sent an EE D2 command std::vector> card_to_count; }; constexpr uint64_t PLAYER_FILE_SIGNATURE_V0 = 0x6E65777365727620; constexpr uint64_t PLAYER_FILE_SIGNATURE_V1 = 0xA904332D5CEF0296; struct SavedPlayerDataBB { // .nsc file format /* 0000 */ be_uint64_t signature = PLAYER_FILE_SIGNATURE_V1; /* 0008 */ parray unused; /* 0028 */ PlayerRecords_Battle battle_records; /* 0040 */ PlayerDispDataBBPreview preview; /* 00BC */ ptext auto_reply; /* 0214 */ PlayerBank bank; /* 14DC */ PlayerRecordsBB_Challenge challenge_records; /* 161C */ PlayerDispDataBB disp; /* 17AC */ ptext guild_card_description; /* 185C */ ptext info_board; /* 19B4 */ PlayerInventory inventory; /* 1D00 */ parray quest_data1; /* 1F08 */ parray quest_data2; /* 1F60 */ parray tech_menu_config; /* 1F88 */ void update_to_latest_version(); void add_item(const ItemData& item); ItemData remove_item(uint32_t item_id, uint32_t amount, bool allow_meseta_overdraft); void add_meseta(uint32_t amount); void remove_meseta(uint32_t amount, bool allow_overdraft); uint8_t get_technique_level(uint8_t which) const; // Returns FF or 00-1D void set_technique_level(uint8_t which, uint8_t level); enum class MaterialType : int8_t { HP = -2, TP = -1, POWER = 0, MIND = 1, EVADE = 2, DEF = 3, LUCK = 4, }; uint8_t get_material_usage(MaterialType which) const; void set_material_usage(MaterialType which, uint8_t usage); void print_inventory(FILE* stream) const; } __attribute__((packed)); enum AccountFlag { IN_DRESSING_ROOM = 0x00000001, }; struct SavedAccountDataBB { // .nsa file format ptext signature; parray blocked_senders; GuildCardFileBB guild_cards; KeyAndTeamConfigBB key_config; le_uint32_t newserv_flags; le_uint32_t option_flags; parray shortcuts; parray symbol_chats; ptext team_name; } __attribute__((packed)); class ClientGameData { private: std::shared_ptr account_data; std::shared_ptr player_data; uint64_t last_play_time_update; public: uint32_t guild_card_number; bool should_update_play_time; // The following fields are not saved, and are only used in certain situations // Null unless the client is within the trade sequence (D0-D4 or EE commands) std::unique_ptr pending_item_trade; std::unique_ptr pending_card_trade; // Null unless the client is Episode 3 and has sent its config already std::shared_ptr ep3_config; // These are only used if the client is BB std::string bb_username; size_t bb_player_index; ItemData identify_result; std::array, 3> shop_contents; bool should_save; ClientGameData(); ~ClientGameData(); std::shared_ptr account(bool should_load = true); std::shared_ptr player(bool should_load = true); std::shared_ptr account() const; std::shared_ptr player() const; std::string account_data_filename() const; std::string player_data_filename() const; static std::string player_template_filename(uint8_t char_class); void create_player( const PlayerDispDataBBPreview& preview, std::shared_ptr level_table); void load_account_data(); void save_account_data() const; void load_player_data(); // Note: This function is not const because it updates the player's play time. void save_player_data(); };