From ac20d0c7d407d774c6c4e2b59db533c9ed7577c6 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Sat, 2 Nov 2024 23:43:13 -0700 Subject: [PATCH] refine DC NTE and 11/2000 save file formats --- src/SaveFileFormats.hh | 62 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 8 deletions(-) diff --git a/src/SaveFileFormats.hh b/src/SaveFileFormats.hh index 2ea7f019..51e7cdcb 100644 --- a/src/SaveFileFormats.hh +++ b/src/SaveFileFormats.hh @@ -101,11 +101,11 @@ struct ShuffleTables { template struct SaveFileSymbolChatEntryT { - /* PC:GC:XB:BB */ - /* 00:00:00:00 */ U32T present; - /* 04:04:04:04 */ pstring name; - /* 34:1C:1C:2C */ SymbolChatT spec; - /* 70:58:58:68 */ + /* DC:PC:GC:XB:BB */ + /* 00:00:00:00:00 */ U32T present; + /* 04:04:04:04:04 */ pstring name; + /* 1C:34:1C:1C:2C */ SymbolChatT spec; + /* 58:70:58:58:68 */ } __packed__; using SaveFileSymbolChatEntryPC = SaveFileSymbolChatEntryT; using SaveFileSymbolChatEntryGC = SaveFileSymbolChatEntryT; @@ -291,19 +291,59 @@ struct PSOBBBaseSystemFile : PSOBBMinimalSystemFile { //////////////////////////////////////////////////////////////////////////////// // Character files +struct PSODCNTECharacterFile { + // See PSOGCCharacterFile::Character for descriptions of fields' meanings. + /* 0000:---- */ PlayerInventory inventory; + /* 034C:---- */ PlayerDispDataDCPCV3 disp; + /* 041C:0000 */ le_uint32_t validation_flags = 0; + /* 0420:0004 */ le_uint32_t creation_timestamp = 0; + /* 0424:0008 */ le_uint32_t signature = 0xBB40711D; + /* 0428:000C */ le_uint32_t play_time_seconds = 0; + /* 042C:0010 */ le_uint32_t option_flags = 0x00040058; + /* 0430:0014 */ le_uint16_t save_count_since_last_inventory_erasure = 1; + /* 0432:0016 */ le_uint16_t inventory_erasure_count = 0; + /* 0434:0018 */ pstring ppp_username; + /* 0450:0034 */ pstring ppp_password; + // TODO: Figure out how quest flags work; it's obviously different from 0x80 + // bytes per difficulty like in v1. Is it just 2048 flags shared across all + // difficulties, instead of 1024 in each difficulty? + /* 0460:0044 */ parray quest_flags; + /* 0560:0144 */ le_uint16_t bank_meseta; + /* 0562:0146 */ le_uint16_t num_bank_items; + /* 0564:0148 */ parray bank_items; + /* 0A14:05F8 */ GuildCardDCNTE guild_card; + /* 0A8F:0673 */ uint8_t unknown_s1; // Probably actually unused + /* 0A90:0674 */ pstring v1_serial_number; + /* 0AA0:0684 */ pstring v1_access_key; + /* 0AB0:0694 */ +} __packed_ws__(PSODCNTECharacterFile, 0xAB0); + struct PSODC112000CharacterFile { // See PSOGCCharacterFile::Character for descriptions of fields' meanings. /* 0000:---- */ PlayerInventory inventory; /* 034C:---- */ PlayerDispDataDCPCV3 disp; /* 041C:0000 */ le_uint32_t validation_flags = 0; /* 0420:0004 */ le_uint32_t creation_timestamp = 0; - /* 0424:0008 */ le_uint32_t signature = 0xA205B064; + /* 0424:0008 */ le_uint32_t signature = 0xBB40711D; /* 0428:000C */ le_uint32_t play_time_seconds = 0; /* 042C:0010 */ le_uint32_t option_flags = 0x00040058; /* 0430:0014 */ le_uint16_t save_count_since_last_inventory_erasure = 1; /* 0432:0016 */ le_uint16_t inventory_erasure_count = 0; - // TODO: Fill out the rest of this structure. - /* 0434:0018 */ parray unknown_a1; + /* 0434:0018 */ pstring ppp_username; + /* 0450:0034 */ pstring ppp_password; + // TODO: Figure out how quest flags work; it's obviously different from 0x80 + // bytes per difficulty like in v1. Is it just 2048 flags shared across all + // difficulties, instead of 1024 in each difficulty? + /* 0460:0044 */ parray quest_flags; + /* 0560:0144 */ le_uint16_t bank_meseta; + /* 0562:0146 */ le_uint16_t num_bank_items; + /* 0564:0148 */ parray bank_items; + /* 0A14:05F8 */ GuildCardDC guild_card; + /* 0A91:0675 */ parray unknown_s1; // Probably actually unused + /* 0A94:0678 */ parray symbol_chats; + /* 0EB4:0A98 */ parray shortcuts; + /* 13B4:0F98 */ pstring v1_serial_number; + /* 13C4:0FA8 */ pstring v1_access_key; /* 13D4:0FB8 */ } __packed_ws__(PSODC112000CharacterFile, 0x13D4); @@ -771,6 +811,12 @@ void save_psochar( //////////////////////////////////////////////////////////////////////////////// // Guild Card files +struct PSODCV2GuildCardFile { + // TODO: Fill this out. + /* 0000 */ parray unknown_a1; + /* 330C */ +} __packed_ws__(PSODCV2GuildCardFile, 0x330C); + struct PSOPCGuildCardFile { // PSO______GUD /* 0000 */ le_uint32_t checksum = 0; // TODO: Figure out the PC guild card format.