diff --git a/README.md b/README.md index caebdf2..cc37f4d 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ Everything will immediately show up in ImHex's Content Store and gets bundled wi | CHM | | [`patterns/chm.hexpat`](patterns/chm.hexpat) | Windows HtmlHelp Data (ITSF / CHM) | | COFF | `application/x-coff` | [`patterns/coff.hexpat`](patterns/coff.hexpat) | Common Object File Format (COFF) executable | | CPIO | `application/x-cpio` | [`patterns/cpio.hexpat`](patterns/cpio.hexpat) | Old Binary CPIO Format | -| CrashLvl | | [`patterns/Crashlvl.hexpat`](patterns/Crashlvl.hexpat) | Crash Bandicoot - Back in Time (fan game) User created flashback tapes level format | +| CrashLvl | | [`patterns/Crashlvl.hexpat`](patterns/Crashlvl.hexpat) | Crash Bandicoot - Back in Time (fan game) User created level format | | DDS | `image/vnd-ms.dds` | [`patterns/dds.hexpat`](patterns/dds.hexpat) | DirectDraw Surface | | DEX | | [`patterns/dex.hexpat`](patterns/dex.hexpat) | Dalvik EXecutable Format | | DMG | | [`patterns/dmg.hexpat`](patterns/dmg.hexpat) | Apple Disk Image Trailer (DMG) | diff --git a/patterns/Crashlvl.hexpat b/patterns/Crashlvl.hexpat index 5687e73..e903ad8 100644 --- a/patterns/Crashlvl.hexpat +++ b/patterns/Crashlvl.hexpat @@ -1,20 +1,26 @@ -#pragma description Crash Bandicoot - Back in Time (fan game) User created flashback tapes level format +#pragma author AdventureT +#pragma description Crash Bandicoot - Back in Time (fan game) User created level format +// Supports all versions till 0.94c, newer versions might be compatible! #include #include #include -// Crash Bandicoot - Back in Time (fan game) user created tapes -// author AdventureT struct Header { type::Magic<"CRASHLVL"> magic; u8 version; + if (version >= 4) { + std::string::SizedString gameVersion; + } std::string::SizedString levelName; std::string::SizedString author; }; -enum Music : u32 { +Header header @ 0x0; + +// Background Music +enum BGM : u32 { None, BonusBGM, CrashCreatorBGM, @@ -30,39 +36,199 @@ enum Music : u32 { NBrioBGM }; +enum BGMV2 : u32 { + None, + N_TropyBGM, + CrashCreatorBGM, + MainMenuBGM, + WarpRoomBGM, + Jungle01BGM, + SnowBGM, + RiverBGM, + FutureBGM, + LabBGM, + SewerBGM, + EgyptBGM, + NBrioBGM, + AdventureBGM, + SpyBGM, + ChaseBGM, + TrialsBGM, + SpaceBGM, + Jungle02BGM, + RipperBGM, + TheGreatWallBGM, + RoadToSomewhereBGM, + LavaKoalaBGM, + CortexBGM, + CyberCortexBGM, + ArabicBGM, + N_Tropy2BGM, + JazzBGM, + Space2BGM, + TawnaBonusBGM, + CortexPowerBGM, + ArabicBonusBGM, + EgyptBonusBGM, + FutureBonusBGM, + LostCityBGM, + PolarBGM, + RiverBonusBGM, + RuinsBonusBGM, + SewerBonusBGM, + SnowBonusBGM, + RoadToRuinBGM, + NGinBGM, + Arabia01BGM, + Arabia02BGM, + BashBGM, + Cortex02BGM, +}; + enum Type : u32 { Unset, Flashback, - Trial + Trial, }; -enum Time : u32 { +enum TypeV2 : u32 { + Practice, + Flashback, + Trial, + Adventure +}; + +enum Skybox : u32 { Night, Day, Storm, Dawn }; -enum Terrain : u32 { +enum SkyboxV2 : u32 { + Default = 1, + Briolab, + Fort, + Moon, + Toxic, + AboutRight, + Crash1Island, + Arabia, + RoadToRuin, + Black +}; + +enum Scenery : u32 { None, - Machines, - Trees, + FutureTense, + Forest, Waterfall, Snow, Fortress, }; +enum SceneryV2 : u32 { + None, + FutureTense, + Forest, + Waterfall, + None2, + Fortress, + None3, + Lava, + TheGreatGate, + Mountain, + KoalaKong, + SunsetVista, + HangemHigh, + Sphynxinator, + Tunnel, + Pipes +}; + +enum SceneryV4 : u32 { + None, + FutureTense, + Forest, + Waterfall, + Snow, + Fortress, + None2, + Lava, + TheGreatGate, + Mountain, + KoalaKong, + SunsetVista, + HangemHigh, + Sphynxinator, + Tunnel, + Pipes +}; + +enum Weather : u32 { + Default, + Snow, + Rain +}; + struct Options { - Type type; - Time time; - Terrain terrain; - Music music; + + if (header.version > 1) + TypeV2 type; + else + Type type; + + if (header.version > 1) + SkyboxV2 skybox; + else + Skybox skybox; + + if (header.version == 1) + Scenery scenery; + else if (header.version > 1 && header.version < 4) + SceneryV2 scenery; + else + SceneryV4 scenery; + + if (header.version > 2) + { + Weather weather; + } + + if (header.version > 1) + BGMV2 bgm; + else + BGM bgm; + + + if (type == Type::Trial) + { + u32 timeTrialTicksBronze; + u32 timeTrialTicksSilver; + u32 timeTrialTicksGold; + } }; struct Object { + std::string::SizedString objName; - u32 x; - u32 y; + + if (header.version > 1) + { + u16 x; + u16 y; + bool hasMetafields; + if (hasMetafields) + { + u16 numOfMetafields; + u8 metafields[numOfMetafields]; + } + } + else + { + u32 x; + u32 y; + } }; struct Objects{ @@ -70,6 +236,9 @@ struct Objects{ std::Array objArray; }; -Header header @ 0x0; + Options options @ $; -Objects objects @ $; \ No newline at end of file +Objects objects @ $; + + + diff --git a/tests/patterns/test_data/CrashLvl.hexpat b/tests/patterns/test_data/CrashLvl.hexpat new file mode 100644 index 0000000..81effe9 Binary files /dev/null and b/tests/patterns/test_data/CrashLvl.hexpat differ