diff --git a/Dialogue.bt b/Dialogue.bt new file mode 100644 index 0000000..c71f491 --- /dev/null +++ b/Dialogue.bt @@ -0,0 +1,53 @@ +#ifndef _DIALOGUE +#define _DIALOGUE + +#include "Common.bt" + +typedef enum { + Armstrong = 0x3B6D5087, + Duke = 0xF3FA69F7, + MacKenzie = 0x3749E413, + Tokabi = 0xF1CAB965, + VUE_995 = 0x5AFA1EB5, + Samus = 0x525C2625, + Sylux = 0x97CE32B7, + None = 0x1344B4AA +} DialogueActor; + +typedef struct Line { + CStringFixed label; + ubyte unk[4]; + DialogueActor speakerId; + DialogueActor targetId; + ubyte unk1[4]; + GUID caud; + byte unk2[10]; +}; + +typedef struct Scene { + uint maybe_id ; + uint unk1; + uint unk2[2]; + ubyte unk3[4]; + uint unk4[2]; + ubyte unk5[6]; + uint unk6; + ubyte hasLDCH; + if (hasLDCH) { + ubyte magic[4]; + uint ldchSize; + uint ldchUnks[4]; + ubyte unk0[ldchSize]; + } + uint lineCount; + Line lines[lineCount] ; +}; + +typedef struct Dialogue { + uint count; + if (count) { + Scene scenes[count] ; + } +}; + +#endif// _DIALOGUE \ No newline at end of file diff --git a/MessageTable.bt b/MessageTable.bt index cfc4624..47bb73d 100644 --- a/MessageTable.bt +++ b/MessageTable.bt @@ -125,6 +125,7 @@ struct TextsSection { struct Language (string expectedLanguage) { ChunkDescriptor languageChunkHeader; + Assert(languageChunkHeader.id == expectedLanguage); // Each section here is heavily referenced from https://zeldamods.org/wiki/Msbt struct MSBTContents { MSBTHeader header; @@ -138,8 +139,15 @@ struct Language (string expectedLanguage) { } contents; }; -struct MessageStudioBinaryText -{ +struct TableName { + ChunkDescriptor tableNameChunkHeader; + Assert(tableNameChunkHeader.id == "TBNM"); + CStringFixed name; +}; + +struct MessageStudioBinaryText(uint32 readerVersion, uint32 writerVersion) +{ + Assert(readerVersion == writerVersion); if (isDKCTF == 1) { Language us_english("USEN"); @@ -151,7 +159,7 @@ struct MessageStudioBinaryText Language eu_german("EUGE"); Language eu_italian("EUIT"); Language jp_japanese("JPJP"); - } else { + } else if (readerVersion == 10) { Language us_english("USEN"); Language eu_english("EUEN"); Language eu_french("EUFR"); @@ -165,6 +173,24 @@ struct MessageStudioBinaryText Language ch_traditionalchinese("CHTC"); Language ch_simplifiedchinese("CHSC"); Language us_spanish("USSP"); + } else if (readerVersion == 16) { + Language us_english("USEN"); + Language eu_english("EUEN"); + Language us_portuguese("USPO"); + Language eu_french("EUFR"); + Language us_french("USFR"); + Language eu_spanish("EUSP"); + Language us_spanish("USSP"); + Language eu_german("EUGE"); + Language eu_italian("EUIT"); + Language eu_dutch("EUDU"); + Language jp_japanese("JPJP"); + Language ch_simplifiedchinese("CHSC"); + Language ko_korean("KOKO"); + Language ch_traditionalchinese("CHTC"); + TableName tableName; + } else { + Assert(false, "Unsupported MSBT version!"); } }; diff --git a/Run.bt b/Run.bt index 0ab2796..8718e73 100644 --- a/Run.bt +++ b/Run.bt @@ -40,6 +40,7 @@ if (!exists(isDKCTF)) { #include "CFont.bt" #include "DependencyGroup.bt" #include "NModConFormat.bt" +#include "Dialogue.bt" // Custom footer #include "Footer.bt" @@ -107,7 +108,7 @@ typedef struct { ModelFile model(form.size, form.readerVersion, form.writerVersion); break; case "MSBT": - // MessageStudioBinaryText text; + MessageStudioBinaryText text(form.readerVersion, form.writerVersion); break; case "PACK": CPakFile pak; @@ -148,6 +149,9 @@ typedef struct { case "MCON": CModConData data(form.size); break; + case "DLOG": + Dialogue data; + break; } FSeek(start + form.size); } File;