name more fields in save structs
This commit is contained in:
@@ -4539,11 +4539,11 @@ struct G_SyncFlagState_6x6E_Decompressed {
|
|||||||
// unknown fields above.
|
// unknown fields above.
|
||||||
} __packed__;
|
} __packed__;
|
||||||
|
|
||||||
// 6x6F: Unknown (used while loading into game)
|
// 6x6F: Set quest flags (used while loading into game)
|
||||||
|
|
||||||
struct G_Unknown_6x6F {
|
struct G_SetQuestFlags_6x6F {
|
||||||
G_UnusedHeader header;
|
G_UnusedHeader header;
|
||||||
parray<uint8_t, 0x200> unknown_a1;
|
parray<parray<uint8_t, 0x80>, 4> quest_flags_by_difficulty;
|
||||||
} __packed__;
|
} __packed__;
|
||||||
|
|
||||||
// 6x70: Sync player disp data and inventory (used while loading into game)
|
// 6x70: Sync player disp data and inventory (used while loading into game)
|
||||||
|
|||||||
@@ -765,6 +765,7 @@ struct PlayerConfig {
|
|||||||
/* 000C:---- */ parray<uint8_t, 0x1C> unknown_a1;
|
/* 000C:---- */ parray<uint8_t, 0x1C> unknown_a1;
|
||||||
/* 0028:---- */ parray<be_uint16_t, 20> tech_menu_shortcut_entries;
|
/* 0028:---- */ parray<be_uint16_t, 20> tech_menu_shortcut_entries;
|
||||||
/* 0050:---- */ parray<be_uint32_t, 10> choice_search_config;
|
/* 0050:---- */ parray<be_uint32_t, 10> choice_search_config;
|
||||||
|
// This field maps to quest_global_flags on Episodes 1 & 2
|
||||||
/* 0078:---- */ parray<be_uint32_t, 0x30> scenario_progress;
|
/* 0078:---- */ parray<be_uint32_t, 0x30> scenario_progress;
|
||||||
// place_counts[0] and [1] from this field are added to the player's win and
|
// place_counts[0] and [1] from this field are added to the player's win and
|
||||||
// loss count respectively when they're shown in the status menu. However,
|
// loss count respectively when they're shown in the status menu. However,
|
||||||
|
|||||||
+36
-20
@@ -94,7 +94,10 @@ struct PSOGCSystemFile {
|
|||||||
/* 0004 */ be_int16_t music_volume; // 0 = full volume; -250 = min volume
|
/* 0004 */ be_int16_t music_volume; // 0 = full volume; -250 = min volume
|
||||||
/* 0006 */ int8_t sound_volume; // 0 = full volume; -100 = min volume
|
/* 0006 */ int8_t sound_volume; // 0 = full volume; -100 = min volume
|
||||||
/* 0007 */ uint8_t language;
|
/* 0007 */ uint8_t language;
|
||||||
/* 0008 */ be_uint32_t unknown_a3; // Default 1728000 (== 60 * 60 * 24 * 20)
|
// This field stores the effective time zone offset between the server and
|
||||||
|
// client, in frames. The default value is 1728000, which corresponds to 16
|
||||||
|
// hours. This is recomputed when the client receives a B1 command.
|
||||||
|
/* 0008 */ be_uint32_t server_time_delta_frames;
|
||||||
/* 000C */ be_uint16_t udp_behavior; // 0 = auto, 1 = on, 2 = off
|
/* 000C */ be_uint16_t udp_behavior; // 0 = auto, 1 = on, 2 = off
|
||||||
/* 000E */ be_uint16_t surround_sound_enabled;
|
/* 000E */ be_uint16_t surround_sound_enabled;
|
||||||
/* 0010 */ parray<uint8_t, 0x100> event_flags; // Can be set by quest opcode D8 or E8
|
/* 0010 */ parray<uint8_t, 0x100> event_flags; // Can be set by quest opcode D8 or E8
|
||||||
@@ -200,7 +203,11 @@ struct PSOGCCharacterFile {
|
|||||||
// R = Map direction (0 = non-fixed; 1 = fixed)
|
// R = Map direction (0 = non-fixed; 1 = fixed)
|
||||||
/* 042C:0010 */ be_uint32_t option_flags;
|
/* 042C:0010 */ be_uint32_t option_flags;
|
||||||
/* 0430:0014 */ be_uint32_t save_count;
|
/* 0430:0014 */ be_uint32_t save_count;
|
||||||
/* 0434:0018 */ parray<uint8_t, 0x230> unknown_a4;
|
/* 0434:0018 */ parray<uint8_t, 0x1C> unknown_a4;
|
||||||
|
/* 0450:0034 */ parray<uint8_t, 0x10> unknown_a5;
|
||||||
|
// 1024 bits (flags) per difficulty
|
||||||
|
/* 0460:0044 */ parray<parray<uint8_t, 0x80>, 4> quest_flags;
|
||||||
|
/* 0660:0244 */ be_uint32_t death_count;
|
||||||
/* 0664:0248 */ PlayerBank bank;
|
/* 0664:0248 */ PlayerBank bank;
|
||||||
/* 192C:1510 */ GuildCardV3 guild_card;
|
/* 192C:1510 */ GuildCardV3 guild_card;
|
||||||
/* 19BC:15A0 */ parray<PSOGCSaveFileSymbolChatEntry, 12> symbol_chats;
|
/* 19BC:15A0 */ parray<PSOGCSaveFileSymbolChatEntry, 12> symbol_chats;
|
||||||
@@ -211,7 +218,13 @@ struct PSOGCCharacterFile {
|
|||||||
/* 25DC:21C0 */ parray<uint8_t, 4> unknown_a2;
|
/* 25DC:21C0 */ parray<uint8_t, 4> unknown_a2;
|
||||||
/* 25E0:21C4 */ PlayerRecordsV3_Challenge<true> challenge_records;
|
/* 25E0:21C4 */ PlayerRecordsV3_Challenge<true> challenge_records;
|
||||||
/* 26E0:22C4 */ parray<be_uint16_t, 20> tech_menu_shortcut_entries;
|
/* 26E0:22C4 */ parray<be_uint16_t, 20> tech_menu_shortcut_entries;
|
||||||
/* 2708:22EC */ parray<uint8_t, 0x90> unknown_a6;
|
/* 2708:22EC */ parray<uint8_t, 0x28> unknown_a6;
|
||||||
|
/* 2730:2314 */ parray<be_uint32_t, 0x10> quest_global_flags;
|
||||||
|
/* 2770:2354 */ PlayerRecords_Battle<true> offline_battle_records;
|
||||||
|
/* 2788:236C */ parray<uint8_t, 4> unknown_f5;
|
||||||
|
/* 278C:2370 */ be_uint32_t unknown_f6;
|
||||||
|
/* 2790:2374 */ be_uint32_t unknown_f7;
|
||||||
|
/* 2794:2378 */ be_uint32_t unknown_f8;
|
||||||
/* 2798:237C */
|
/* 2798:237C */
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
/* 00004 */ parray<Character, 7> characters;
|
/* 00004 */ parray<Character, 7> characters;
|
||||||
@@ -232,7 +245,7 @@ struct PSOGCEp3CharacterFile {
|
|||||||
// to the start of the second internal structure (second column).
|
// to the start of the second internal structure (second column).
|
||||||
/* 0000:---- */ PlayerInventory inventory;
|
/* 0000:---- */ PlayerInventory inventory;
|
||||||
/* 034C:---- */ PlayerDispDataDCPCV3 disp;
|
/* 034C:---- */ PlayerDispDataDCPCV3 disp;
|
||||||
/* 041C:0000 */ be_uint32_t unknown_a1;
|
/* 041C:0000 */ be_uint32_t flags;
|
||||||
/* 0420:0004 */ be_uint32_t creation_timestamp;
|
/* 0420:0004 */ be_uint32_t creation_timestamp;
|
||||||
/* 0424:0008 */ be_uint32_t signature; // Same value as for Episodes 1&2 (above)
|
/* 0424:0008 */ be_uint32_t signature; // Same value as for Episodes 1&2 (above)
|
||||||
/* 0428:000C */ be_uint32_t play_time_seconds;
|
/* 0428:000C */ be_uint32_t play_time_seconds;
|
||||||
@@ -242,14 +255,17 @@ struct PSOGCEp3CharacterFile {
|
|||||||
/* 0430:0014 */ be_uint32_t save_count;
|
/* 0430:0014 */ be_uint32_t save_count;
|
||||||
/* 0434:0018 */ parray<uint8_t, 0x1C> unknown_a2;
|
/* 0434:0018 */ parray<uint8_t, 0x1C> unknown_a2;
|
||||||
/* 0450:0034 */ parray<uint8_t, 0x10> unknown_a3;
|
/* 0450:0034 */ parray<uint8_t, 0x10> unknown_a3;
|
||||||
// seq_vars is an array of 1024 bits, which contain all the Episode 3 quest
|
// seq_vars is an array of 8192 bits, which contain all the Episode 3 quest
|
||||||
// progress flags. This includes things like which maps are unlocked, which
|
// progress flags. This includes things like which maps are unlocked, which
|
||||||
// NPC decks are unlocked, and whether the player has a VIP card or not.
|
// NPC decks are unlocked, and whether the player has a VIP card or not.
|
||||||
/* 0460:0044 */ parray<uint8_t, 0x400> seq_vars;
|
/* 0460:0044 */ parray<uint8_t, 0x400> seq_vars;
|
||||||
/* 0860:0444 */ be_uint32_t unknown_a4;
|
/* 0860:0444 */ be_uint32_t death_count;
|
||||||
/* 0864:0448 */ be_uint32_t unknown_a5;
|
// The following three fields appear to actually be a PlayerBank structure
|
||||||
/* 0868:044C */ be_uint32_t unknown_a6;
|
// with only 4 item slots instead of 200. They presumably didn't completely
|
||||||
/* 086C:0450 */ parray<uint8_t, 0x60> unknown_a7;
|
// remove the bank in Ep3 because they would have to change too much code.
|
||||||
|
/* 0864:0448 */ be_uint32_t num_bank_items;
|
||||||
|
/* 0868:044C */ be_uint32_t bank_meseta;
|
||||||
|
/* 086C:0450 */ parray<PlayerBankItem, 4> bank_items;
|
||||||
/* 08CC:04B0 */ GuildCardV3 guild_card;
|
/* 08CC:04B0 */ GuildCardV3 guild_card;
|
||||||
/* 095C:0540 */ parray<PSOGCSaveFileSymbolChatEntry, 12> symbol_chats;
|
/* 095C:0540 */ parray<PSOGCSaveFileSymbolChatEntry, 12> symbol_chats;
|
||||||
/* 0D7C:0960 */ parray<PSOGCSaveFileChatShortcutEntry, 20> chat_shortcuts;
|
/* 0D7C:0960 */ parray<PSOGCSaveFileChatShortcutEntry, 20> chat_shortcuts;
|
||||||
@@ -275,15 +291,15 @@ struct PSOGCEp3CharacterFile {
|
|||||||
// by the B7 command sent by the server instead.
|
// by the B7 command sent by the server instead.
|
||||||
/* 19420 */ be_uint64_t bgm_test_songs_unlocked;
|
/* 19420 */ be_uint64_t bgm_test_songs_unlocked;
|
||||||
/* 19428 */ be_uint32_t save_count;
|
/* 19428 */ be_uint32_t save_count;
|
||||||
// This is an array of 1000 bits, represented here as 128 bytes, the last few
|
// This is an array of 999 bits, represented here as 128 bytes (the last bit
|
||||||
// of which are unused. Each bit corresponds to a card ID with the bit's
|
// is never used). Each bit corresponds to a card ID with the bit's index; if
|
||||||
// index; if the bit is set, then the card's rank is replaced with D2 if its
|
// the bit is set, then during offline play, the card's rank is replaced with
|
||||||
// original rank is S, SS, E, or D2, or with D1 if the original rank is any
|
// D2 if its original rank is S, SS, E, or D2, or with D1 if the original rank
|
||||||
// other value. Upon receiving a B8 command (new card definitions), the game
|
// is any other value. Upon receiving a B8 command (server card definitions),
|
||||||
// updates this array of bits based on which cards in the received update
|
// the game clears this array, and sets all bits whose corresponding cards
|
||||||
// have D1 or D2 ranks. This could have been used by Sega to persist part of
|
// from the server have the D1 or D2 ranks. This could have been used by Sega
|
||||||
// the online updates into offline play, but there's no indication that they
|
// to prevent broken cards from being used offline, but there's no indication
|
||||||
// ever used this functionality.
|
// that they ever used this functionality.
|
||||||
/* 1942C */ parray<uint8_t, 0x80> card_rank_override_flags;
|
/* 1942C */ parray<uint8_t, 0x80> card_rank_override_flags;
|
||||||
/* 194AC */ be_uint32_t round2_seed;
|
/* 194AC */ be_uint32_t round2_seed;
|
||||||
/* 194B0 */
|
/* 194B0 */
|
||||||
@@ -531,7 +547,7 @@ struct PSOPCSystemFile { // PSO______COM
|
|||||||
/* 0004 */ le_int16_t music_volume;
|
/* 0004 */ le_int16_t music_volume;
|
||||||
/* 0006 */ int8_t sound_volume;
|
/* 0006 */ int8_t sound_volume;
|
||||||
/* 0007 */ uint8_t language;
|
/* 0007 */ uint8_t language;
|
||||||
/* 0008 */ le_uint32_t unknown_a3;
|
/* 0008 */ le_uint32_t server_time_delta_frames;
|
||||||
/* 000C */ parray<le_uint16_t, 0x10> unknown_a4; // Last one is always 0x1234?
|
/* 000C */ parray<le_uint16_t, 0x10> unknown_a4; // Last one is always 0x1234?
|
||||||
/* 002C */ parray<uint8_t, 0x100> event_flags;
|
/* 002C */ parray<uint8_t, 0x100> event_flags;
|
||||||
/* 012C */ le_uint32_t round1_seed;
|
/* 012C */ le_uint32_t round1_seed;
|
||||||
@@ -561,7 +577,7 @@ struct PSOPCCharacterFile { // PSO______SYS and PSO______SYD
|
|||||||
/* 0000 */ le_uint32_t checksum;
|
/* 0000 */ le_uint32_t checksum;
|
||||||
/* 0004 */ PlayerInventory inventory;
|
/* 0004 */ PlayerInventory inventory;
|
||||||
/* 0350 */ PlayerDispDataDCPCV3 disp;
|
/* 0350 */ PlayerDispDataDCPCV3 disp;
|
||||||
/* 0420 */ be_uint32_t unknown_a1;
|
/* 0420 */ be_uint32_t flags;
|
||||||
/* 0424 */ be_uint32_t creation_timestamp;
|
/* 0424 */ be_uint32_t creation_timestamp;
|
||||||
/* 0428 */ be_uint32_t signature; // == 0x6C5D889E?
|
/* 0428 */ be_uint32_t signature; // == 0x6C5D889E?
|
||||||
/* 042C */ be_uint32_t play_time_seconds;
|
/* 042C */ be_uint32_t play_time_seconds;
|
||||||
|
|||||||
Reference in New Issue
Block a user