mirror of
https://github.com/WerWolv/ImHex-Patterns.git
synced 2026-03-27 23:37:04 -05:00
patterns: Added Miles Sound System Compressed Archive (MSSCMP) (#320)
* MSSCMP readme * Add files via upload
This commit is contained in:
85
patterns/msscmp.hexpat
Normal file
85
patterns/msscmp.hexpat
Normal file
@@ -0,0 +1,85 @@
|
||||
#pragma author DexrnZacAttack
|
||||
#pragma description MSSCMP (Miles Sound System Compressed Archive)
|
||||
#pragma magic [ 42 41 4E 4B ] @ 0x00
|
||||
#pragma magic [ 4B 4E 41 42 ] @ 0x00
|
||||
#pragma array_limit 4294967295
|
||||
#pragma pattern_limit 4294967295
|
||||
|
||||
import type.magic;
|
||||
import std.core;
|
||||
#ifdef __IMHEX__
|
||||
import hex.core;
|
||||
#endif
|
||||
|
||||
struct FileDataEntry {
|
||||
u32 nameOffset;
|
||||
char name[] @ nameOffset;
|
||||
u32 folderOffset;
|
||||
char folder[] @ folderOffset;
|
||||
le u32 fileDataOffset;
|
||||
padding[8];
|
||||
u32 sampleRate;
|
||||
u32 fileSize;
|
||||
u8 data[fileSize] @ fileDataOffset;
|
||||
#ifdef __IMHEX__
|
||||
hex::core::add_virtual_file(std::string::to_string(name) + ".binka", data);
|
||||
#endif
|
||||
};
|
||||
|
||||
struct Index2Entry {
|
||||
u32 entryOffset;
|
||||
u32 fStructureOffset;
|
||||
FileDataEntry fileDataEntry @ entryOffset;
|
||||
};
|
||||
|
||||
struct MsscmpEntry {
|
||||
char name[12];
|
||||
Index2Entry entries[parent.header.index2EntryCount] @ parent.header.index1LastEntryOffset + 4;
|
||||
};
|
||||
|
||||
|
||||
struct Header<T> {
|
||||
padding[4]; // unk
|
||||
T fileDataOffset;
|
||||
padding[8]; // unk
|
||||
T index1Offset;
|
||||
T index1LastEntryOffset;
|
||||
if (sizeof(T) == 4)
|
||||
padding[8];
|
||||
else
|
||||
padding[16];
|
||||
|
||||
T unkOffset;
|
||||
T index1EntryCount;
|
||||
|
||||
if (sizeof(T) == 4)
|
||||
padding[8];
|
||||
else
|
||||
padding[4];
|
||||
|
||||
u32 index2EntryCount;
|
||||
};
|
||||
|
||||
using OldGenHeader = Header<u32>;
|
||||
using NewGenHeader = Header<u64>;
|
||||
|
||||
struct MSSCMP {
|
||||
char magic[4];
|
||||
if (magic == "BANK")
|
||||
std::core::set_endian(std::mem::Endian::Big);
|
||||
else if (magic == "KNAB")
|
||||
std::core::set_endian(std::mem::Endian::Little);
|
||||
else
|
||||
std::error("Magic does not match BANK or KNAB");
|
||||
|
||||
u32 check1 @ 0x1c [[hidden]]; // use this to check if old gen or new gen
|
||||
u32 check2 @ 0x20 [[hidden]];
|
||||
|
||||
if (check1 == check2)
|
||||
OldGenHeader header;
|
||||
else
|
||||
NewGenHeader header;
|
||||
MsscmpEntry entry;
|
||||
};
|
||||
|
||||
MSSCMP msscmp @ 0x00;
|
||||
Reference in New Issue
Block a user