rewrite quest disassembler for better consistency with assembler

This commit is contained in:
Martin Michelsen
2025-11-25 23:27:34 -08:00
parent 9d42f849c5
commit a783177420
9 changed files with 521 additions and 456 deletions
+22 -21
View File
@@ -11,21 +11,21 @@
#include "Version.hh"
struct PSOQuestHeaderDCNTE {
/* 0000 */ le_uint32_t code_offset = 0;
/* 0000 */ le_uint32_t text_offset = 0;
/* 0004 */ le_uint32_t label_table_offset = 0;
/* 0008 */ le_uint32_t size = 0;
/* 000C */ le_uint16_t unknown_a1 = 0;
/* 000E */ le_uint16_t unknown_a2 = 0;
/* 000C */ le_uint16_t unknown_a1 = 0xFFFF;
/* 000E */ le_uint16_t unknown_a2 = 0xFFFF;
/* 0010 */ pstring<TextEncoding::SJIS, 0x10> name;
/* 0020 */
} __packed_ws__(PSOQuestHeaderDCNTE, 0x20);
struct PSOQuestHeaderDC112000 {
/* 0000 */ le_uint32_t code_offset = 0;
/* 0000 */ le_uint32_t text_offset = 0;
/* 0004 */ le_uint32_t label_table_offset = 0;
/* 0008 */ le_uint32_t size = 0;
/* 000C */ le_uint16_t unknown_a1 = 0;
/* 000E */ le_uint16_t unknown_a2 = 0;
/* 000C */ le_uint16_t unknown_a1 = 0xFFFF;
/* 000E */ le_uint16_t unknown_a2 = 0xFFFF;
/* 0010 */ pstring<TextEncoding::MARKED, 0x20> name;
/* 0030 */ pstring<TextEncoding::MARKED, 0x80> short_description;
/* 00B0 */ pstring<TextEncoding::MARKED, 0x120> long_description;
@@ -33,11 +33,11 @@ struct PSOQuestHeaderDC112000 {
} __packed_ws__(PSOQuestHeaderDC112000, 0x1D0);
struct PSOQuestHeaderDC { // Same format for DC v1 and v2
/* 0000 */ le_uint32_t code_offset = 0;
/* 0000 */ le_uint32_t text_offset = 0;
/* 0004 */ le_uint32_t label_table_offset = 0;
/* 0008 */ le_uint32_t size = 0;
/* 000C */ le_uint16_t unknown_a1 = 0;
/* 000E */ le_uint16_t unknown_a2 = 0;
/* 000C */ le_uint16_t unknown_a1 = 0xFFFF;
/* 000E */ le_uint16_t unknown_a2 = 0xFFFF;
/* 0010 */ Language language = Language::JAPANESE;
/* 0011 */ uint8_t unknown_a3 = 0;
/* 0012 */ le_uint16_t quest_number = 0; // 0xFFFF for challenge quests
@@ -48,11 +48,11 @@ struct PSOQuestHeaderDC { // Same format for DC v1 and v2
} __packed_ws__(PSOQuestHeaderDC, 0x1D4);
struct PSOQuestHeaderPC {
/* 0000 */ le_uint32_t code_offset;
/* 0000 */ le_uint32_t text_offset;
/* 0004 */ le_uint32_t label_table_offset;
/* 0008 */ le_uint32_t size = 0;
/* 000C */ le_uint16_t unknown_a1 = 0;
/* 000E */ le_uint16_t unknown_a2 = 0;
/* 000C */ le_uint16_t unknown_a1 = 0xFFFF;
/* 000E */ le_uint16_t unknown_a2 = 0xFFFF;
/* 0010 */ Language language = Language::JAPANESE;
/* 0011 */ uint8_t unknown_a3 = 0;
/* 0012 */ le_uint16_t quest_number = 0; // 0xFFFF for challenge quests
@@ -65,11 +65,11 @@ struct PSOQuestHeaderPC {
// TODO: Is the XB quest header format the same as on GC? If not, make a
// separate struct; if so, rename this struct to V3.
struct PSOQuestHeaderGC {
/* 0000 */ le_uint32_t code_offset = 0;
/* 0000 */ le_uint32_t text_offset = 0;
/* 0004 */ le_uint32_t label_table_offset = 0;
/* 0008 */ le_uint32_t size = 0;
/* 000C */ le_uint16_t unknown_a1 = 0;
/* 000E */ le_uint16_t unknown_a2 = 0;
/* 000C */ le_uint16_t unknown_a1 = 0xFFFF;
/* 000E */ le_uint16_t unknown_a2 = 0xFFFF;
/* 0010 */ Language language = Language::JAPANESE;
/* 0011 */ uint8_t unknown_a3 = 0;
// Note: The GC client byteswaps this field, then loads it as a byte, so
@@ -98,15 +98,15 @@ struct CreateItemMaskEntry {
} __packed_ws__(CreateItemMaskEntry, 0x38);
struct PSOQuestHeaderBBBase {
/* 0000 */ le_uint32_t code_offset = 0;
/* 0000 */ le_uint32_t text_offset = 0;
/* 0004 */ le_uint32_t label_table_offset = 0;
/* 0008 */ le_uint32_t size = 0;
/* 000C */ le_uint16_t unknown_a1 = 0;
/* 000E */ le_uint16_t unknown_a2 = 0;
/* 000C */ le_uint16_t unknown_a1 = 0xFFFF;
/* 000E */ le_uint16_t unknown_a2 = 0xFFFF;
/* 0010 */ le_uint16_t quest_number = 0; // 0xFFFF for challenge quests
/* 0012 */ le_uint16_t unknown_a3 = 0;
/* 0014 */ uint8_t episode = 0; // 0 = Ep1, 1 = Ep2, 2 = Ep4
/* 0015 */ uint8_t max_players = 0;
/* 0015 */ uint8_t max_players = 0; // 0 means no limit (that is, 4)
/* 0016 */ uint8_t joinable = 0;
/* 0017 */ uint8_t unknown_a4 = 0;
/* 0018 */ pstring<TextEncoding::UTF16, 0x20> name;
@@ -141,7 +141,7 @@ struct AssembledQuestScript {
Language language = Language::UNKNOWN;
Episode episode = Episode::NONE;
bool joinable = false;
uint8_t max_players = 0x00;
uint8_t max_players = 4;
std::string name;
std::string short_description;
std::string long_description;
@@ -149,6 +149,7 @@ struct AssembledQuestScript {
AssembledQuestScript assemble_quest_script(
const std::string& text,
const std::vector<std::string>& script_include_directories,
const std::vector<std::string>& native_include_directories);
const std::vector<std::string>& native_include_directories,
bool strict = true);
void populate_quest_metadata_from_script(QuestMetadata& meta, const void* data, size_t size, Version version, Language language);