mirror of
https://github.com/zeldaret/ph
synced 2026-05-28 16:31:13 -04:00
90 lines
3.0 KiB
C++
90 lines
3.0 KiB
C++
#pragma once
|
|
|
|
#include "global.h"
|
|
#include "types.h"
|
|
|
|
#define BMG_MAGIC "MESGbmg1"
|
|
#define BMG_TAG(a, b, c, d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
|
|
|
|
typedef enum BMGTag {
|
|
/* "INF1" */ BMG_TAG_INF1 = BMG_TAG('I', 'N', 'F', '1'),
|
|
/* "FLW1" */ BMG_TAG_FLW1 = BMG_TAG('F', 'L', 'W', '1'),
|
|
/* "FLI1" */ BMG_TAG_FLI1 = BMG_TAG('F', 'L', 'I', '1'),
|
|
/* "DAT1" */ BMG_TAG_DAT1 = BMG_TAG('D', 'A', 'T', '1'),
|
|
} BMGTag;
|
|
|
|
typedef enum BMGEncoding {
|
|
/* 1 */ BMG_ENCODING_CP1252 = 1,
|
|
/* 2 */ BMG_ENCODING_UTF16_BE,
|
|
/* 3 */ BMG_ENCODING_SHIFT_JIS,
|
|
/* 4 */ BMG_ENCODING_UTF8,
|
|
/* 5 */ BMG_ENCODING_MAX
|
|
} BMGEncoding;
|
|
|
|
typedef struct BMGSectionBase {
|
|
/* 0x00 */ char tag[4]; // "INF1", "DAT1", ...
|
|
/* 0x04 */ u32 size; // the size of the section
|
|
} BMGSectionBase; // size = 0x8
|
|
|
|
typedef struct BMGHeader {
|
|
/* 0x00 */ char magic[8]; // always "MESGbmg1"
|
|
/* 0x08 */ u32 fileSize; // the size of the BMG file
|
|
/* 0x0C */ u32 numSections; // the number of sections (INF1, DAT1, ...)
|
|
/* 0x10 */ u8 encoding; // see `BMGEncoding`
|
|
/* 0x11 */ u8 unk_11[0xF]; // alignment padding?
|
|
/* 0x20 */ BMGSectionBase* firstSection; // technically not part of the header but used by functions
|
|
} BMGHeader; // size = 0x24
|
|
|
|
typedef struct EntryINF1 {
|
|
/* 0x00 */ u32 offset; // relative to the end of the DAT1 header
|
|
/* 0x04 */ u32 unk_04; // flags?
|
|
} EntryINF1; // size = 0x8
|
|
|
|
typedef struct SectionINF1 {
|
|
/* 0x00 */ BMGSectionBase base;
|
|
/* 0x08 */ u16 numEntries;
|
|
/* 0x0A */ u16 entrySize;
|
|
/* 0x0C */ u16 groupId;
|
|
/* 0x0E */ u8 colorId;
|
|
/* 0x0F */ u8 unk_0F[0x1]; // alignment padding?
|
|
/* 0x10 */ EntryINF1* entries;
|
|
} SectionINF1;
|
|
|
|
typedef struct EntryFLW1 {
|
|
/* 0x00 */ u8* data; //! TODO: find what's the format
|
|
} EntryFLW1;
|
|
|
|
typedef struct SectionFLW1 {
|
|
/* 0x00 */ BMGSectionBase base;
|
|
/* 0x08 */ EntryFLW1* entries;
|
|
} SectionFLW1;
|
|
|
|
typedef struct EntryFLI1 {
|
|
/* 0x00 */ u8* data; //! TODO: find what's the format
|
|
} EntryFLI1;
|
|
|
|
typedef struct SectionFLI1 {
|
|
/* 0x00 */ BMGSectionBase base;
|
|
/* 0x08 */ EntryFLI1* entries;
|
|
} SectionFLI1;
|
|
|
|
typedef struct EntryDAT1 {
|
|
/* 0x00 */ char* text;
|
|
} EntryDAT1;
|
|
|
|
typedef struct SectionDAT1 {
|
|
/* 0x00 */ BMGSectionBase base;
|
|
/* 0x08 */ EntryDAT1* entries;
|
|
} SectionDAT1;
|
|
|
|
typedef struct BMGFileInfo {
|
|
/* 0x00 */ BMGHeader* pHeader; // pointer to the file's header
|
|
/* 0x04 */ SectionINF1* pINF1; // pointer to the data informations (INF -> informations)
|
|
/* 0x08 */ SectionFLW1* pFLW1; // pointer to an unknown dataset (FLW -> ?)
|
|
/* 0x0C */ SectionFLI1* pFLI1; // pointer to an unknown dataset (FLI -> ?)
|
|
/* 0x10 */ SectionDAT1* pDAT1; // pointer to the data (DAT -> data)
|
|
/* 0x14 */ BMGHeader* unk_14; // same as unk_00 (?)
|
|
/* 0x18 */ s16 unk_18; // stores `func_020372f0`->param_3 value (currently undetermined purpose)
|
|
/* 0x1A */ s16 unk_1A; // stores result of `func_020371c8` (currently undetermined purpose)
|
|
} BMGFileInfo; // size = 0x1C
|