From 8748646016e8db6ef93623e8a4480636ef7111cb Mon Sep 17 00:00:00 2001 From: AdventureT <35010415+AdventureT@users.noreply.github.com> Date: Sun, 29 Oct 2023 19:46:28 +0100 Subject: [PATCH] patterns/CrashLvl: Update Crash Back in Time level format (#186) * Working on new Version * Needs testing * Updated CrashLvl script to support version 0.94c * Update README.md * Added TestData and author to script * Delete tests/patterns/test_data/CrashLvl.hexpat.bin --- README.md | 2 +- patterns/Crashlvl.hexpat | 203 +++++++++++++++++++++-- tests/patterns/test_data/CrashLvl.hexpat | Bin 0 -> 8121 bytes 3 files changed, 187 insertions(+), 18 deletions(-) create mode 100644 tests/patterns/test_data/CrashLvl.hexpat 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 0000000000000000000000000000000000000000..81effe91c2a8cd7f4cac7a677852b6a79237e08e GIT binary patch literal 8121 zcmaKx+i%-87)R;*{eHJ)TfRH4F$}|A_L%jdEfAo^vbDfo2Cp{Obcr1}NxSW@A7vYu zoc)dh7zoc1sgEBiN}^u=bb0;y>itzT_U$)6eE%{1=4$t4^XBgL=CAbS`pahf__W{r zZ0uji{=(ir_OD}qZ!O5a{r&TA*I#%0^{c19b0%&=7N$LTb@R_^zpkB7&O?{`yVd&U z_I5Wt(TqpmZMJ_r-E1eObf|o2@xy9=|LbnMS=s~5q3-qV>h9%!^|+asly_X{IZaEN zku)o5PSU)j1xbs7j*X%tNr#fUKvfK`QSrJ)_02UZ53W%;bB)TcE61WM2dc)n z2WL~qI`UXY_QH`pc4T%OnMp@x-7#u}oKufe-rPUT=-eq*KRIUGPmZJFC&$tAljA7+ z$#FLL$uTBBInK|j7tgEx>fzzX+ug@Mzx!po-t3nqVvIB|0!$R^*yRISv&)7wOK-IS z!*%#P)Y=03v+x!@8NtF^62Z`UF0i!=Y;7K3_&j9h0TIw>&oMhQY;B5Wg8iAInFSb% zdWum`(2UWHus_29Lo;NA{TX9x6Es7NdVt2o)&^)s*xJ<4RX;&9Ml(X=VgzH%=*V6Q z`Z^t=8K4=XnWCAYnV@me^wA732QHdEnjX%BF4l3-^w4y%KRq;kjLiwCLn}oOXH^%C zgQkO~jiwXOAG-gvu}&u-*VLMe*IXY>4^0bu+Q6vmXliI0c%Ei}p&YdEJaufXhNc=| zD1sV}TpdjVO%qKOO(nqCOG`fQRPmatp=qFLqG@4lZ8Q}eg))wI2~7n}86&VSwve}a zKu@ibxwen%U;_wuh}E1@Z(DWEB%$)m}k$p#q8fqkKZp4!(jFlC%? zB{W4ec{DjRSu_PSd7L{%G&NlP>u4HinrNzMDrj10+Gsjx95h2TGcG zK}W%kf^7v`3N{sNC|FmpreIaUih^YYO9~bhEGU@w;9*1T!_(dUs%E$2e8sxmGxQZ3 zcC*k|Y}#EyU$JGk2hWQ3M)hCIO}ioJD>m#-ps!dzFV@ZvuAbY;=7)Ajx8>-OF5X8RcN_Tryku|_2{q+nRVh=NfCV+zIwp%dDrL2r$&2IF4xyO%zQ8P1rNf mZ$25derFZT;i8_y1t5pP*e3u;VJ4ssEhia_ARAz8I{pRNIth&c literal 0 HcmV?d00001