From 5192def6a50e0b2248bcefd69ce47b4244b9eaf8 Mon Sep 17 00:00:00 2001 From: Scott Duensing Date: Mon, 7 Sep 2026 15:46:23 -0500 Subject: [PATCH] Repo cleanup --- .gitignore | 17 +- cfg/default.cfg | 5 - cfg/x68000.cfg | 19 - examples/spacetaxi/generated/amiga/font.tbk | Bin 32044 -> 0 bytes .../generated/amiga/levels/level01.dat | Bin 2749 -> 0 bytes .../generated/amiga/levels/level02.dat | Bin 2749 -> 0 bytes .../generated/amiga/levels/level03.dat | Bin 2749 -> 0 bytes .../generated/amiga/levels/level04.dat | Bin 2749 -> 0 bytes .../generated/amiga/levels/level05.dat | Bin 2749 -> 0 bytes .../generated/amiga/levels/level06.dat | Bin 2813 -> 0 bytes .../generated/amiga/levels/level07.dat | Bin 3005 -> 0 bytes .../generated/amiga/levels/level08.dat | Bin 2813 -> 0 bytes .../generated/amiga/levels/level09.dat | Bin 3389 -> 0 bytes .../generated/amiga/levels/level10.dat | Bin 3581 -> 0 bytes .../generated/amiga/levels/level11.dat | Bin 2749 -> 0 bytes .../generated/amiga/levels/level12.dat | Bin 3005 -> 0 bytes .../generated/amiga/levels/level13.dat | Bin 2749 -> 0 bytes .../generated/amiga/levels/level14.dat | Bin 2749 -> 0 bytes .../generated/amiga/levels/level15.dat | Bin 2749 -> 0 bytes .../generated/amiga/levels/level16.dat | Bin 3197 -> 0 bytes .../generated/amiga/levels/level17.dat | Bin 3517 -> 0 bytes .../generated/amiga/levels/level18.dat | Bin 2749 -> 0 bytes .../generated/amiga/levels/level19.dat | Bin 2749 -> 0 bytes .../generated/amiga/levels/level20.dat | Bin 2749 -> 0 bytes .../generated/amiga/levels/level21.dat | Bin 2941 -> 0 bytes .../generated/amiga/levels/level22.dat | Bin 2749 -> 0 bytes .../generated/amiga/levels/level23.dat | Bin 2749 -> 0 bytes .../generated/amiga/levels/level24.dat | Bin 2749 -> 0 bytes .../generated/amiga/levels/title.dat | Bin 2749 -> 0 bytes .../generated/amiga/sprites/sprites.spc | 3 - .../generated/amiga/sprites/sprites.spr | 3 - .../generated/amiga/tiles/tbank0.tbk | Bin 8236 -> 0 bytes .../generated/amiga/tiles/tbank1.tbk | Bin 32044 -> 0 bytes .../generated/amiga/tiles/tbank2.tbk | Bin 32044 -> 0 bytes .../generated/amiga/tiles/tilebank0.tbk | Bin 32044 -> 0 bytes examples/spacetaxi/generated/atarist/font.tbk | Bin 32044 -> 0 bytes .../generated/atarist/levels/level01.dat | Bin 2749 -> 0 bytes .../generated/atarist/levels/level02.dat | Bin 2749 -> 0 bytes .../generated/atarist/levels/level03.dat | Bin 2749 -> 0 bytes .../generated/atarist/levels/level04.dat | Bin 2749 -> 0 bytes .../generated/atarist/levels/level05.dat | Bin 2749 -> 0 bytes .../generated/atarist/levels/level06.dat | Bin 2813 -> 0 bytes .../generated/atarist/levels/level07.dat | Bin 3005 -> 0 bytes .../generated/atarist/levels/level08.dat | Bin 2813 -> 0 bytes .../generated/atarist/levels/level09.dat | Bin 3389 -> 0 bytes .../generated/atarist/levels/level10.dat | Bin 3581 -> 0 bytes .../generated/atarist/levels/level11.dat | Bin 2749 -> 0 bytes .../generated/atarist/levels/level12.dat | Bin 3005 -> 0 bytes .../generated/atarist/levels/level13.dat | Bin 2749 -> 0 bytes .../generated/atarist/levels/level14.dat | Bin 2749 -> 0 bytes .../generated/atarist/levels/level15.dat | Bin 2749 -> 0 bytes .../generated/atarist/levels/level16.dat | Bin 3197 -> 0 bytes .../generated/atarist/levels/level17.dat | Bin 3517 -> 0 bytes .../generated/atarist/levels/level18.dat | Bin 2749 -> 0 bytes .../generated/atarist/levels/level19.dat | Bin 2749 -> 0 bytes .../generated/atarist/levels/level20.dat | Bin 2749 -> 0 bytes .../generated/atarist/levels/level21.dat | Bin 2941 -> 0 bytes .../generated/atarist/levels/level22.dat | Bin 2749 -> 0 bytes .../generated/atarist/levels/level23.dat | Bin 2749 -> 0 bytes .../generated/atarist/levels/level24.dat | Bin 2749 -> 0 bytes .../generated/atarist/levels/title.dat | Bin 2749 -> 0 bytes .../generated/atarist/sprites/sprites.spc | 3 - .../generated/atarist/sprites/sprites.spr | 3 - .../generated/atarist/tiles/tbank0.tbk | Bin 8236 -> 0 bytes .../generated/atarist/tiles/tbank1.tbk | Bin 32044 -> 0 bytes .../generated/atarist/tiles/tbank2.tbk | Bin 32044 -> 0 bytes .../generated/atarist/tiles/tilebank0.tbk | Bin 32044 -> 0 bytes examples/spacetaxi/generated/dos/font.tbk | Bin 32044 -> 0 bytes .../generated/dos/levels/level01.dat | Bin 2749 -> 0 bytes .../generated/dos/levels/level02.dat | Bin 2749 -> 0 bytes .../generated/dos/levels/level03.dat | Bin 2749 -> 0 bytes .../generated/dos/levels/level04.dat | Bin 2749 -> 0 bytes .../generated/dos/levels/level05.dat | Bin 2749 -> 0 bytes .../generated/dos/levels/level06.dat | Bin 2813 -> 0 bytes .../generated/dos/levels/level07.dat | Bin 3005 -> 0 bytes .../generated/dos/levels/level08.dat | Bin 2813 -> 0 bytes .../generated/dos/levels/level09.dat | Bin 3389 -> 0 bytes .../generated/dos/levels/level10.dat | Bin 3581 -> 0 bytes .../generated/dos/levels/level11.dat | Bin 2749 -> 0 bytes .../generated/dos/levels/level12.dat | Bin 3005 -> 0 bytes .../generated/dos/levels/level13.dat | Bin 2749 -> 0 bytes .../generated/dos/levels/level14.dat | Bin 2749 -> 0 bytes .../generated/dos/levels/level15.dat | Bin 2749 -> 0 bytes .../generated/dos/levels/level16.dat | Bin 3197 -> 0 bytes .../generated/dos/levels/level17.dat | Bin 3517 -> 0 bytes .../generated/dos/levels/level18.dat | Bin 2749 -> 0 bytes .../generated/dos/levels/level19.dat | Bin 2749 -> 0 bytes .../generated/dos/levels/level20.dat | Bin 2749 -> 0 bytes .../generated/dos/levels/level21.dat | Bin 2941 -> 0 bytes .../generated/dos/levels/level22.dat | Bin 2749 -> 0 bytes .../generated/dos/levels/level23.dat | Bin 2749 -> 0 bytes .../generated/dos/levels/level24.dat | Bin 2749 -> 0 bytes .../spacetaxi/generated/dos/levels/title.dat | Bin 2749 -> 0 bytes .../generated/dos/sprites/sprites.spc | 3 - .../generated/dos/sprites/sprites.spr | 3 - .../spacetaxi/generated/dos/tiles/tbank0.tbk | Bin 8236 -> 0 bytes .../spacetaxi/generated/dos/tiles/tbank1.tbk | Bin 32044 -> 0 bytes .../spacetaxi/generated/dos/tiles/tbank2.tbk | Bin 32044 -> 0 bytes .../generated/dos/tiles/tilebank0.tbk | Bin 32044 -> 0 bytes examples/spacetaxi/generated/iigs/font.tbk | Bin 32044 -> 0 bytes .../generated/iigs/levels/level01.dat | Bin 2749 -> 0 bytes .../generated/iigs/levels/level02.dat | Bin 2749 -> 0 bytes .../generated/iigs/levels/level03.dat | Bin 2749 -> 0 bytes .../generated/iigs/levels/level04.dat | Bin 2749 -> 0 bytes .../generated/iigs/levels/level05.dat | Bin 2749 -> 0 bytes .../generated/iigs/levels/level06.dat | Bin 2813 -> 0 bytes .../generated/iigs/levels/level07.dat | Bin 3005 -> 0 bytes .../generated/iigs/levels/level08.dat | Bin 2813 -> 0 bytes .../generated/iigs/levels/level09.dat | Bin 3389 -> 0 bytes .../generated/iigs/levels/level10.dat | Bin 3581 -> 0 bytes .../generated/iigs/levels/level11.dat | Bin 2749 -> 0 bytes .../generated/iigs/levels/level12.dat | Bin 3005 -> 0 bytes .../generated/iigs/levels/level13.dat | Bin 2749 -> 0 bytes .../generated/iigs/levels/level14.dat | Bin 2749 -> 0 bytes .../generated/iigs/levels/level15.dat | Bin 2749 -> 0 bytes .../generated/iigs/levels/level16.dat | Bin 3197 -> 0 bytes .../generated/iigs/levels/level17.dat | Bin 3517 -> 0 bytes .../generated/iigs/levels/level18.dat | Bin 2749 -> 0 bytes .../generated/iigs/levels/level19.dat | Bin 2749 -> 0 bytes .../generated/iigs/levels/level20.dat | Bin 2749 -> 0 bytes .../generated/iigs/levels/level21.dat | Bin 2941 -> 0 bytes .../generated/iigs/levels/level22.dat | Bin 2749 -> 0 bytes .../generated/iigs/levels/level23.dat | Bin 2749 -> 0 bytes .../generated/iigs/levels/level24.dat | Bin 2749 -> 0 bytes .../spacetaxi/generated/iigs/levels/title.dat | Bin 2749 -> 0 bytes .../generated/iigs/sprites/sprites.spc | 3 - .../generated/iigs/sprites/sprites.spr | 3 - .../spacetaxi/generated/iigs/tiles/tbank0.tbk | Bin 8236 -> 0 bytes .../spacetaxi/generated/iigs/tiles/tbank1.tbk | Bin 32044 -> 0 bytes .../spacetaxi/generated/iigs/tiles/tbank2.tbk | Bin 32044 -> 0 bytes examples/spacetaxi/stCels.c | 79 ++++ examples/spacetaxi/stCels.h | 37 ++ examples/spacetaxi/stRender.c | 389 ++++++++++++------ examples/spacetaxi/stSim.c | 183 ++++---- examples/spacetaxi/stSim.h | 11 +- make/amiga.mk | 22 +- make/atarist.mk | 22 +- make/dos.mk | 22 +- make/iigs.mk | 19 +- make/tools.mk | 15 +- nvram/x68000_0/nvram | Bin 16384 -> 0 bytes tools/staxibake/staxibake.c | 71 ++++ tools/stsim/stsim | Bin 148328 -> 0 bytes 143 files changed, 671 insertions(+), 264 deletions(-) delete mode 100644 cfg/default.cfg delete mode 100644 cfg/x68000.cfg delete mode 100644 examples/spacetaxi/generated/amiga/font.tbk delete mode 100644 examples/spacetaxi/generated/amiga/levels/level01.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level02.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level03.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level04.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level05.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level06.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level07.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level08.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level09.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level10.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level11.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level12.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level13.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level14.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level15.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level16.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level17.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level18.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level19.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level20.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level21.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level22.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level23.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/level24.dat delete mode 100644 examples/spacetaxi/generated/amiga/levels/title.dat delete mode 100644 examples/spacetaxi/generated/amiga/sprites/sprites.spc delete mode 100644 examples/spacetaxi/generated/amiga/sprites/sprites.spr delete mode 100644 examples/spacetaxi/generated/amiga/tiles/tbank0.tbk delete mode 100644 examples/spacetaxi/generated/amiga/tiles/tbank1.tbk delete mode 100644 examples/spacetaxi/generated/amiga/tiles/tbank2.tbk delete mode 100644 examples/spacetaxi/generated/amiga/tiles/tilebank0.tbk delete mode 100644 examples/spacetaxi/generated/atarist/font.tbk delete mode 100644 examples/spacetaxi/generated/atarist/levels/level01.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level02.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level03.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level04.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level05.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level06.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level07.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level08.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level09.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level10.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level11.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level12.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level13.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level14.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level15.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level16.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level17.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level18.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level19.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level20.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level21.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level22.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level23.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/level24.dat delete mode 100644 examples/spacetaxi/generated/atarist/levels/title.dat delete mode 100644 examples/spacetaxi/generated/atarist/sprites/sprites.spc delete mode 100644 examples/spacetaxi/generated/atarist/sprites/sprites.spr delete mode 100644 examples/spacetaxi/generated/atarist/tiles/tbank0.tbk delete mode 100644 examples/spacetaxi/generated/atarist/tiles/tbank1.tbk delete mode 100644 examples/spacetaxi/generated/atarist/tiles/tbank2.tbk delete mode 100644 examples/spacetaxi/generated/atarist/tiles/tilebank0.tbk delete mode 100644 examples/spacetaxi/generated/dos/font.tbk delete mode 100644 examples/spacetaxi/generated/dos/levels/level01.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level02.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level03.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level04.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level05.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level06.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level07.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level08.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level09.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level10.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level11.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level12.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level13.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level14.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level15.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level16.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level17.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level18.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level19.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level20.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level21.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level22.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level23.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/level24.dat delete mode 100644 examples/spacetaxi/generated/dos/levels/title.dat delete mode 100644 examples/spacetaxi/generated/dos/sprites/sprites.spc delete mode 100644 examples/spacetaxi/generated/dos/sprites/sprites.spr delete mode 100644 examples/spacetaxi/generated/dos/tiles/tbank0.tbk delete mode 100644 examples/spacetaxi/generated/dos/tiles/tbank1.tbk delete mode 100644 examples/spacetaxi/generated/dos/tiles/tbank2.tbk delete mode 100644 examples/spacetaxi/generated/dos/tiles/tilebank0.tbk delete mode 100644 examples/spacetaxi/generated/iigs/font.tbk delete mode 100644 examples/spacetaxi/generated/iigs/levels/level01.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level02.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level03.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level04.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level05.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level06.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level07.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level08.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level09.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level10.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level11.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level12.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level13.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level14.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level15.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level16.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level17.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level18.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level19.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level20.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level21.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level22.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level23.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/level24.dat delete mode 100644 examples/spacetaxi/generated/iigs/levels/title.dat delete mode 100644 examples/spacetaxi/generated/iigs/sprites/sprites.spc delete mode 100644 examples/spacetaxi/generated/iigs/sprites/sprites.spr delete mode 100644 examples/spacetaxi/generated/iigs/tiles/tbank0.tbk delete mode 100644 examples/spacetaxi/generated/iigs/tiles/tbank1.tbk delete mode 100644 examples/spacetaxi/generated/iigs/tiles/tbank2.tbk create mode 100644 examples/spacetaxi/stCels.c create mode 100644 examples/spacetaxi/stCels.h delete mode 100644 nvram/x68000_0/nvram create mode 100644 tools/staxibake/staxibake.c delete mode 100755 tools/stsim/stsim diff --git a/.gitignore b/.gitignore index c50f839..5c78102 100644 --- a/.gitignore +++ b/.gitignore @@ -42,10 +42,25 @@ Thumbs.db *.SND *.ANI +# Baked assets: sprite banks (.spr), precompiled sprite banks (.spc), +# tile banks (.tbk) and level files -- all regenerated by the platform +# makefiles from the PNG/ROM sources +*.spr +*.spc +*.tbk +examples/spacetaxi/generated/ + +# Host tool binaries built from source +tools/stsim/stsim + +# MAME droppings (written next to the work dir by the verify scripts) +cfg/ +nvram/ + # Crap I added stuff/* docs/* -tools/__pycache__/* +__pycache__/ # AGI game data (Sierra/fan-made AGI games used for testing; never committed) examples/agi/gamedata/ diff --git a/cfg/default.cfg b/cfg/default.cfg deleted file mode 100644 index 02f0986..0000000 --- a/cfg/default.cfg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/cfg/x68000.cfg b/cfg/x68000.cfg deleted file mode 100644 index 4d58885..0000000 --- a/cfg/x68000.cfg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/examples/spacetaxi/generated/amiga/font.tbk b/examples/spacetaxi/generated/amiga/font.tbk deleted file mode 100644 index 61466adc270807ba1ab822c89ab4e102643d0722..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32044 zcmeIyJ!%_46u|Kjw#E`#ly*SDg-@`-U~CwcAX23aNk3qiM#89aT!_^AjI zigSZ>%A0ktv=;C6f&U`J&c}N*`f+;r>=j`PG>W%PiRu~Yd!zJxUCi+ z=MPU$5A&$C`^wH;g}SaorG-0btE7+G?sDA5tT($5+9GH^!5YA|W^8G+1~?LdI;kmQ zzPZg=<&)HxvIF!f#O$j&ne89Fk>5{G^TvC1er;NND?aA5w&vgF>U9e%BSZGxP=6c?FCyMiarfbpazn;)m@WqcrS9QO!PN*xpeXzTU*E9)^vJJ& zs+K*WwSrZJZRNI@)0rHzc;Hsma~5s8fx|-WWEKhOMaA{9OmsiU3!Hn6@wS8HLEK;J z`9SkE%uVa!Ni+UY{)E>xq-*5%;@~q{j@fvizSo=cDWi^S+cDuc(Fp}&Y-Obx(!_j=4 ziXt(q^kIM6)=euqrz7ME#orTUJpRHP^R_k^_XiVL!ht_`m<$y4*|gqY3hUYxSu{wSw$;BJ!zZz>o!X(;r?W6 z+3I3dbRg)V%PZ>Pu)n%qE|Pp21J8Kg{B8*mJC$jrzXCb@Crdiyfy_!_(&M}w8XS*+ zdC>##YNY6mFAz*zS`OxL;zm)d#m}5vsBxU2RxgSeUnxz;`-}Iw!D%1iczph>J*k`Y yLsjW|b=cdcv?;t9rA(={J`Gly;V@+}Ek;p%=aLztb;<%fvZegdJ8s}VHt++Ni0Fd= diff --git a/examples/spacetaxi/generated/amiga/levels/level02.dat b/examples/spacetaxi/generated/amiga/levels/level02.dat deleted file mode 100644 index dbebde54cfb5666c5d7580175e47678faa75eb5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmeH}O>PrG5QWPV_Y9*pi`-x&q?~{Y@M9DSlnq%DDxQ`cK@a7=z}Y9XF18v;rvj^lJFNqsetnbx>I81n)nZgrcSH+LLz z(OvIFZylVmpfhP{@Zw-orQVlyIQTD1}tEo~F)Cl3+oZNuNv9M0TpDJ(C^k z3fU#Hz;L3hKO=~yDkJ~Nai0G&{*C7`YmC&Ab=orQ`kOw*gz_GjN1s61ajS z6FEobmr8@HJxI=QIOJqKRZbj(&J{(09cmP@ICzxiy28}}g;Q9+Kp{PP>^K2aUo^{% znX8$Dq`&AWiTm=@2e{afliw+Wef2m@oGT%YWbDVj%aw{TXeo;`uEg6lo6TzeB&E3W xSd4P|?M$cq0=SC1yq8ot?`^evKakB|KK>~cg{|`c2*;xC2JeEq8@P=d_yZFt4gUZD diff --git a/examples/spacetaxi/generated/amiga/levels/level03.dat b/examples/spacetaxi/generated/amiga/levels/level03.dat deleted file mode 100644 index 41ae91bbb408052b501566bdb8013a845b3f593c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmd^BO=uHA6rLS3`7tRL5segNuRRDJya^?uEd_fhtrrXGrj6^S{**{*r7+vnn${mu z?WtY@5~y^8DYo=dOFYybOuYmZ4}wzaQ7A=kJp|v(?(A+hwtDcSA7SUc_kH`lnYWve z?(-cdWrpr^7v%0UU8g%+yI6`$;DFyx$Wv56=xif8h%hT3MnehIw2E4gx`a-xqF3n4 z653cp6X@9*8ec_KsVyPJ)=Y=rUzJ`D;#UFn)r)LjzsIHjO{X$k<5yLk@(kz^)CWv1 z>xSylsV*`tVhHMWP_zXgwBmZ5FsWS=zwVo6KJf9{*lJZYGVS)zIeUU=Zyodcn|+-< zPO0j3n7aKm`c?G?{8_3zLv8+717Dtmmdkk^eiLu zj5y->@jLy(4+$e!S&{2F%eQFjh(|}*Tr8IOED%W|0gQ1_AOP>2!vbxBRo!1cLSUK2;H6`zZu&}O`M)mn4x4^AEpMXj- zksZ>r!@4n)(F{G4l#je0#W;Myfk7_8si(u1A#t?i8+eg}u7 zou*xN9cBQtvv3Adc3+0=5nMFzNA!LOZ2;l@6_^?L1mC{E2Lr!EdKG>eabEO?;+%mS zaQGQ^nSbFU{5H^o{&(0kq9^)a#irT2*TDV*0(o;B29f>ST-ULfgx)*<&dU+;>Ch*M z=c`3@hR+bob2Z&;93u0nwXX5PK*L@kkNSI#7@vz*rv9vM{@6F>quwfcx;_w3D6DLp zy|ubacv??fzyHbOO}?ZLj{{N<29M1qtVEEt3i-~?5U!14s8NCyWMUrq+&?IfRy1|&5rR%h~TL)o>B>b zr>P`7SJO@E2+pV)FAOy774lA7&|KV~cS9(6g;a5U0QNu-XqW|$64HSMfRw=dSjGdD z+I|=FsQe{7*C~CIY^i%(FK!U_n|a`L7dBJyxFZLr)$E=wF851FW6g9NWKnFCr|7OF z?!H*XSU$yh5&fl7636REh#}ZB5Ex WvLM-0MO(0EVM5A@eKLWSPv9@&{us;v diff --git a/examples/spacetaxi/generated/amiga/levels/level05.dat b/examples/spacetaxi/generated/amiga/levels/level05.dat deleted file mode 100644 index 02e66bed022342e2e1bbdd8a862150d75e1ec75d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmeHH&ubGw6rNo=i9-$|Z6G3)?H}OHgF+9f&|VB)S`b3jRUszUlLVCD?5$9-n{(4h zD?Nx468{0kL-Ejnh{U%36^5QXc=EkBvzys&e|QkR^kdoC_r33Z@6GHc^9!Xb9^(4! z%+2|QnbHl4JjMhAxY=!q~vSe+c&;0@CblJ=tmZJO4npyZ3s ze~S-Nfca9~-AasVwK5wAjYeax0?Y`{;IaO+UMJT6T~v^Xvpj_?AVqR6jsvq3oJW5k zu-XYB5~1a16_AADsMOK{g(<;cI82|SW2hqy7DY( zJk5YQdNAeqZ1xce$r*H7X5FoQAWH{HeXUu**6cU7J4pxX6Lr*`<{Rmv`Sd17<#>M9 zv^1hVKdjIh>Zf&3Xgo1(&V_W806q0Z|FkaA2mNRaqr+!&F4UQF;F9#y7WT-fLpC`d zZCCqgqo~&*KRqS&H9BntZV{EIA>z<2{<+&V>vyj$6Ht`-fcimBT zjE3+5$_a%G%TlqhC6ybtr5X>{q?!!ZWiS7v?;JS3nuEaa3E3B49lzI<{T!@A5Uk7o zEfg>i3|q3-l6`(KRj5sLy5KSJUIehNtf+~rKU%Uwgm*3Qf!w;-Ys*6IQ6$+qPw^7O zpeU8G5bO%Id`EqcL~307>;d5qg~Y3j7ft_VO~%)-E#XqHm#ZpRu6dV>esd#O-3+`- g#djM)cQa7jn=JZ_O;0m6<^9Y!=CzzHfA<7_11l4gYybcN diff --git a/examples/spacetaxi/generated/amiga/levels/level06.dat b/examples/spacetaxi/generated/amiga/levels/level06.dat deleted file mode 100644 index f744d27973171ecde067cacb3a0f07a4f42bd380..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2813 zcmeHH&1(}u6rWAHSwk*@^eS6=svvmqAP7>y4+N`%MLhVCq;ZUB3kwOB;FzSa;AIY8 zJxY7n!u}KDB{vgI^YKT796edzo0*-RB-^G!@zft-=FNM*`Mrn zz0YN3^VS!q$ZOV{^*MU4sK6$rr}{UA)obetA1`}tur<^(yFMLC7E=AfZ?TEH+&9*KD1j7kG*@`QJhCpAP=YDiu*K5-v-Myf1I4;ceN1RLLnZC5mC8m(2*s!2w6}QUZ7jc?mD& zlq=4QnN_xUlO9o#dQU}pF+o|1hbLK|@E@r+%`>MaZ(>SWk1F_>UZT)~f^Av019QNy zLBO$dIa@~|EP-D0nkb{Ci4{Cxal-1fCFSf|}m6dwy(v{_4-!BIr z{WtFA)!=Xq3LP-mq1quE4cL$L2$Z{QY`3 diff --git a/examples/spacetaxi/generated/amiga/levels/level07.dat b/examples/spacetaxi/generated/amiga/levels/level07.dat deleted file mode 100644 index 0eb4025aa5dd7be0ba68be67b8dbbf7b0dd6fd6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3005 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 Am;e9( diff --git a/examples/spacetaxi/generated/amiga/levels/level12.dat b/examples/spacetaxi/generated/amiga/levels/level12.dat deleted file mode 100644 index 50b1b33da5a0db562634a96ef2aae124c770bcdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3005 zcmd^9PiP!v6n`_jv$IPqZd=f_#WD!elh8vCQK6Z(G>y8!gWlA1HZIdm)apq3$G|r` zNwd()$j1Dk1bPVsI%10LO-o^kIanLYf+D>L0skO~%Yq={p`Y)~%r`r`!zQO(+P6FN zz4v~9-nZWj`{rAPV;aTD!iiI_Yr}68PWvT5UmpO-Y9^CWN^l-v=pY<~6!yS`&o<$` zb$9^(Y{I`A(qU<+ARSt#brx5629D2yzCmk&)*Zqa>x$wzjAZv+e`7n|Mt6s2?=*PS zG|f-(n(0Mk2!4py?(DDE)TqBp=Mwq%O6XiZ+UZ=*KY{16YwrQQXzz;?r{V)q&@&o+ zr`C>Xv(lreokdX?<+6EN-!#dKj4&ZeFg)A<7O@}cvhuOemFkWlaQj9F+Epm&Fce8r zR9Tj@B2=ZXuZe}R9Vp63qmS;;owh?CCe zN#Lt+^{omzWI!JM4jwuCDqo>e^f|J@mb%@`2RxGC+g)@h}XJ;|1=DqXr*Y zVAyNUvqq}9z}7CHWUXqwW){7-Q6uzEk$#c%OG3ZMsKG~;81|Zrq+epjYB8UAl~;?u z7l-_hQL%46`$a}G)rq;HarX|pK@4vWDL21iSpVE)tv$H*vtQWtJFGBm zd-C<$xLYcIvI!ZNFu#{-9k}uJpE%)u;8E5N>no~uRL2>}zRd*SX=pBxl`LYn*!PY9 PJaz3BGvW{C@yh=PC6oI< diff --git a/examples/spacetaxi/generated/amiga/levels/level13.dat b/examples/spacetaxi/generated/amiga/levels/level13.dat deleted file mode 100644 index 3eb8f9da136d0e2b9cbdba81a9d5991030aa7569..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmeHH&1w`u5Uv@W9p?w~074k>?9KC%RTC8!gk%LzA_U50{ntU`9yGaln>Sd*H^>7B z9+rIuUqJ9N#H#A*>7GB>gXkq6%v4u>Usu=Hv+TiadZU;<*uQ!I`mMW@{X4t2i`nGi zy#inagfJeB(qsbX0OLK_F~#rjV+r3@@C$yg;pYk-!Min_tl=|!S;E(KupNw-!H&dI zo+tp5w${J420XFTCs zdORQVs`7;F;}xqqd#lr`>J)o)MURZm?QAWo({4?5AAP33AL57F$GpN9SP}3ksu}k2 zvgL!E3Pjp)-JVZ{68upHb?v)p`K3mrFzD|`v*B|c%;@kLrS{9%ek7|K*@jY5A>tu} zo%ZXhW1_De^35oYj&Rqmaj{tJAyphsXj#55OR4&^BUfrR?I0#}ifNh*0em7&`439r z6G_t2)ua*EX(G8zo97Z`3F^nNX_{U#Fa_bfSCS~*>}Pj(O!}(x$e=KxU$uwTBensT#a&!GE2l{SSB9ZE(FyI2MOjGG+ znJv38QBxVl)76cfnoG7{#9(Sbmk^ytX>?f;1wjszKkET(#j=rTepC8-;ctW`_B8^aOj0&)J*VjJTd}$gL4*SFCIcD&|q)1--qZAn|>QVG0 z7r#^g63sXvo4kCJJQ<62M6Wtl7TJTJ`(x4P|?}1HS>yh!max diff --git a/examples/spacetaxi/generated/amiga/levels/level15.dat b/examples/spacetaxi/generated/amiga/levels/level15.dat deleted file mode 100644 index 7607e7d5f1a4666d13c740c55331cc4e762fd932..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmeHHzi-n(6h1e;bF7L|1WZWCEJ&zQ7AodS5EP^eB-#;zq2;iH#1sh>;rs{5oW)C~ z7|Hwxw=mTRMU083Oo*v4G4tNtIX{To1VPm$pX7VK_ddV(-Mc&Q?eA_oi1Kdv?*8LP z5AN;BDN$In7&DARQZmT)Wpb4i(0zwI{6cPj(v*KT?u$S0{1sr{`&0^BI8@Jz$KNjn zzS5Vwht*a8^84}^=cUH^YtH@LJejllT<)(ToWN6T|Lz6~psvXrNbJQe6&@+$6d|i0iuDLc0@u>;$6L>8P9 zHmk&TiWHlLMJDVtET)=LO1)NzLCVC$Y(A~T{t&4?4LvISVdxDtwLSD&Z5l_AEt1(H r7WSBk(y*6h>qE9abFb4Y7pZ;WQr8lrty*)m^?CD`t5?1<=h=bZXissC diff --git a/examples/spacetaxi/generated/amiga/levels/level16.dat b/examples/spacetaxi/generated/amiga/levels/level16.dat deleted file mode 100644 index 11f416df153d6ea08842786a48d1896c41c4dc87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3197 zcmds3PiP!v6o23B&g{$v>O@Tygvk(kh=?~21&fT54Mf(9=2U6iB+WKOJq$!r0<$xj z?GzPKyd))(#jsFt3M;*OSdrpoYYsVi@t|jsbPHlFJ*@A0-_Ex)lS;Mr)W`C^_kQp9 z{(avj?0fUo*KCrvs&i-0zWMHq@BqdDMJZ`op>Q5f0lYl{6QDs6U;!Ej@cu3M3I05Q zzkXmAd*gt;bc^#JM`}wsS-gO996cu{dz4;yx_Ep4Zr{D#FCRe^_mbxwFaJxFrxlzG%dAZTTxrCMw6Q6EA#iNI)la@-lS>E!p z4A{$@Tqi9y6fe3^Z#J8Cl+Q)6&*}n@t~5AlC?6(h#@lOKjfU2hc*`x!8k>kmrNRX~Ue&S~PVkik< zJuZox<%t*(gi2^ejwkWFG32STL7pId5InrDhsQZe6L10`J6kZ5Mav)$`J9)MtVgbWb^wUzLd&H3`TK)ylZ4|hP)>vYH=ty zfm%`&MNg!pj*X3?!vT?mXzp91D5K~zr9f;hv=Roml5!(}8GswW#-ViQd(>znf;f+c znUu{@eh4aa6bRIcqlY%DK=HIQd8dyWZA1{~QRYCHP9hr%mtnsMPC48kXQpUkn&t5KL{(JP*@4n5Y$S zE`JKP$$u%~M=1kN=9JBV(@At_^L!K&bg;RB!lrbGPjw245vB#i;62PK>O`bO**Hf^ z99>~aAqSKz0pOQqIAMw=P2G{EG)xG@N{G~IwfIc58aJYg_Nz{CwsyRuZSSyfwBvOwbxzx|)Q-nbPwlL0c&=-m zAKhrBUD8%=>b&T^YNgTj+}`Og?siZ5J*EF!tnj8`>za%0Pxx`so^Y;O{x_CiH5!8f zz-H~c=UBTSFih%OJ$6{A-fZ*~JZ?8=>LbhVSbk4G{JGXXBc}enJwPK`j3HWz&SSkU z^P^>3bFMG8K5?%vwIVkTc-t3Ro*T2)RTl@Tt~9#W+&PB$%dD?;?>FpcotWWF7&)5s zJCi=*1x`ERzj%@1#67iN{`yYNKEzcPm-qF zG}#@om$smzu(Xg_Oh`*FHLNT#2pcbJyLeC(sUQ-e2EA3;^}T=QpP9^VRu6iSK7Ri9 z-uK@3y|;fh`{I$&CsnlP4jsuH9?l%j9C{{0IY1Af$?@*)MEn9=2N)iNK~M;sf(xI( zr49H9KC8nA>+m=XUxr85;S2cbL-=_^+AHn5EbU*H9+39crTrW5Jv8d@?K>ofF5C@kFD$w;!h4Ul5Hw=+uA80kK*RNKdZ}>P ztez1u`C%QAz}~@d^3>!cM?<@-Iw5{lX|Xt33#jnlnD7ro`}khpfA}sknkV1!ojdmh zRX?J@mlhu&fObY=g?4>m%0>8mv{z(-@mV;_vY9_k%L4d7FS80{b3cpLMhydcL(7}}3Y?O~p2S|d>ul&X!LdG7! zKi!^xAPs-?L9<3T#;Ay#@DcpE7Jdwdo`s>O;m>|(enmINh@@g|`Da@A07HDeCP1?S zc;hHU!ox%R=i2a*fQQKZxaltZvr#^0b~U%dhlCIhOJK@vKFW7@<0}7T{<${%UVv$k z4pyXQ1#gT2k??SL24^lr_^}kkdZF)m= z7k<7ye~W+f8shu6`}YSl&1qT>*R*21yv6J}bLqx!%)V$i-S)>u`6jd9Hp<^HJ7<({ zGn*NXWWQ%@{vg+GYB+e{XzA`#-U1T(`HRyh@wM>hDb}5snLRysCUJywbf$7y$IMNrkEOHP_&C5U{4Pt997}x8M#{HX zDXTt|cI4b~^^!UIig{&hV4|KIyK?;eF|EADmZ-xyk1Z>oGR(ib!?yRJA7DQ+dyS3G znvQH=W4JLUUz=3HkFmz8UE708H-5nhU%DDub#J;DSD#4Z4D7zfM8Q!}TvUn)tX*ZB QwYyGy`6|=s?f#$k7aEx~yZ`_I diff --git a/examples/spacetaxi/generated/amiga/levels/level18.dat b/examples/spacetaxi/generated/amiga/levels/level18.dat deleted file mode 100644 index b682e46e550fc6503224c59e6f721d3bafc90ac9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmeHHJ8l#~5bfFN*=AT+nH$U@2ylXA39n=cA{3$#+x~YoDq+&v)4xLY2e@9_!+6~7b_+{P!h70o-)*Z_N Ffg6$c9^L=| diff --git a/examples/spacetaxi/generated/amiga/levels/level19.dat b/examples/spacetaxi/generated/amiga/levels/level19.dat deleted file mode 100644 index 7a9076126fb30a6749800a89cb49b90ef359bf92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmd^9O=uHA6n?wSHi=2G6wydQ_S%Es!JAM5+7h7$p#`C!ZrZqR>Q9N3*2`>DV_JVm zwWoRsNTAXUrr6R;E%8u$F!d5tJP1muN1+tG^$>hByR*C5*xG|9{Rlhnz3HeWg1QW6*5EaK zU53qdn1tu+kXeJ8(47#X>r{FWC<7kEuOS+%m&|?s>3aEp)2S5K*;Q4iJ>z+d^ z+za3)B+2#X;wFMYkIp8|8|*a5a-P=rMT!&XN5Rv2oyjqQdEv64M`zc)!2xw3h3eq3 zadBZcLSCJV6nTt6$aMr7hQe611t_%Q{rtEcUH8z5mTkx$XT$#7O>tWup3gf(n>bRc z^UR;!i080?TKri$&nto{J1^HZjsv~jes*I%cD_rVd;40>_EdN$Z(nvK5vOMvnP(Kk zjvu?Tnfn1Z!j%@8j?XgM^Fm>az>9Ng?vV@gsYMP7|gHy zAo*G5y`{uT7gE(DC6cQ2KWV8fzYG=*$-!tP&?;(5!G~dSLo1K#3&(DwTda`4N-~if z)pKLIF`Cs3J)4wIMl~go0GNQEq9BOAz#9@Pe;`FoZjTybc1V7z_gvBE1|rFi*@3yC znYdD3CG%8a%%Ei96~X+=HrZ*xHA23T{3_|0&5$OTpa=UWHr|t~6m!Gj}z+1uL+XgqKaAP+5b;CVYXt zB>ZT>cQ{;wUoDu2m0id-HB&pA)SQ;^RpCD9!u>~xUiO~sSg6-Wz(s0&8+jo7FU1|4LFPF0CGP>N91iM$h1D7Z0nomMjQ z4ZHk~S%(9CMjr~(_v>O^qA!pVjYSrpLu3-08(}0zBeH(FST(K=C$E~Qaj+x%j;wPA z`$_Y_&%qHeD#sFbU83{}(t)lJ(!=k|bR^+28W$FigpftZ=jn8mV34B7#CVNi@l~9$1JTGLcX}4ufM=*Heb_JG&Q z-a<9+RjLK&;&r!CD<7O}lv#UWM{}K4*%fi-gXT6eto?iEf=I7niiK&$GmOtLKFhok zdhMfAUU90j11u}C_7+-se`ZmiW_ZV<4BJn$ZzuLM%$tuZCMEz*T{<+h$w`27@YB#z OsUT1f{XhQa6Zi|61CWvc diff --git a/examples/spacetaxi/generated/amiga/levels/level21.dat b/examples/spacetaxi/generated/amiga/levels/level21.dat deleted file mode 100644 index 7d6c4c99512cbf448abcca49e806e76130ea2b0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2941 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 H{E_(u4GZeo diff --git a/examples/spacetaxi/generated/amiga/levels/level24.dat b/examples/spacetaxi/generated/amiga/levels/level24.dat deleted file mode 100644 index 13dca31b4b3937c07b17df8bd08a25a41909d135..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmb_e&rcIk5Pq%fF3=`c6N5LFzW_+Q%LT%riU~yEWciVbsA!WKk>tUthXNZQCgP#5 zCQUe$q>Ja{0{5N>*OX5QN$?b3yVU(%iTX1#fE-`^4Bl2kT%uI_KECBzwPuHmhtw*&VdI>@3N?enFd6 zc1PI)+6GtwJO%`u;8FVt0&?W2+;@sNB4^T*qKtG7(zn0+Tm{s6qW)*qquKjsQwDW_+ zpVV2ASBkuvIFF<#RuMdLEm>Tw6!`5YH@5Bl7Ex`n*EO-B*<-pG*KN}fU534XB&tXD z`mxwJw#RB>yk?sxqU+?~cY!AkJ{GwBfeXlmM94CYa$Ggszd$Q4-ooLib4M8VMaGp`9nEKWERs z^;D^Xz8%`xr?%Tw+g+2*!&5=@cPTo8qFYgPDFSC~-s~$e^X<~b%7 diff --git a/examples/spacetaxi/generated/amiga/levels/title.dat b/examples/spacetaxi/generated/amiga/levels/title.dat deleted file mode 100644 index 83ca545328d4c48b3b960ce6b48517eb6f470f02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 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 diff --git a/examples/spacetaxi/generated/amiga/tiles/tbank1.tbk b/examples/spacetaxi/generated/amiga/tiles/tbank1.tbk deleted file mode 100644 index 1b1b788e345e06935d4a14669d6a9f12a85ff9db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32044 zcmeIwu};EJ6vpw}Ahv{oxOF4p2{0_0G{G1qN27bEPVPDt3=3~Sm|T1d7YIWaU%>>Y z;v`No5U#g{_3P;LKW)04``y$2Zg1|c&pmHlGiBLUFL*n>3|{LOCt340xT+`3`}(85 zZanz2#$k)I*I8|{|9#59Z{O@8q z{rnn#s|{SR>q_PeK4aWnRbkjw?J!ExBuP};9KJ7>eV47wN9Fm--^Zkf^RL)Ha<8c0 z&&@AJ$h=*=jH~`XyD3ZhTASy^EeFs*009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ X1Q0*~0R#|0009ILKmY**{#oD;NEmlW diff --git a/examples/spacetaxi/generated/amiga/tiles/tbank2.tbk b/examples/spacetaxi/generated/amiga/tiles/tbank2.tbk deleted file mode 100644 index 58c3ff240dbbaabd53d1f2bdedb9e1188af01692..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32044 zcmeIwu`feW6vy$~RJCHLZf_(00%9R)q7jo(*za_w?kbV0bnzd^n=JkdgNmVxe?bt# zV^R|@=yB_H{n;ho)27Ssocr$k^z7_yt(Hp9W%pZFU#nftZqzO+>oddo-CC;>=JzWH z)#tf(HJvMZ^sh}zcf@4n&{S?RDJBNfQuF0$sr-0zv0g2gRP0=D@G$!L8mk6dyPbUG zE$t?abt7{Zj~_h@)bY-htMzz6nUB9e-(T;qj#Y!%+n{%+6_*>Q+oz4?hMMns-|@by zVwW^SH-sSbqY#d~_cAvt{y^1W*)Yqp6X|DJnrG*K8RX~(y3chtBm{JhMgO)PzWGx+9gXv%rBV!>6z`0FFCS5L*xmEwXeZtDH%=TCXw zmwuL}CwZRBd|_c}snzPq3z%iut^O&FgDj*Qu(i6j|yh z?Kizq>W{M6|9Qvuh>gGO@5j8$=WX3nx;i%m2oNAZ;2#Q{kIUWf8J`|M$aeL7jCo|# zMPFpBM@D@qOMTHV2@oJafB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U rAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&Uc)!3MWWlcR diff --git a/examples/spacetaxi/generated/atarist/font.tbk b/examples/spacetaxi/generated/atarist/font.tbk deleted file mode 100644 index d77d9d11a039a47df3f532b83bcb06d402777741..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32044 zcmeH|y=s(E5QgK=ZW1Ee3Q7vEKoKN@1PNA_LHh$j8iQDAiX~o$g`GEG?FD!%@eb_b zJe%(g!={LbU8@AIcyUuSzaf9xD?J)a%z zyqkY)WiNNcQ%fG}YjVAQSx`SP;H=z-bvNdr z)5)*9OL|hz+1=>>8%uv``9}cPe)lnLa&PYYuJmDw^PXBR@6Eiu7PHP>(x3U)uYh{q$KCQy@>uTQ_sG-pFUA~Zz<~GT zW1|AJD6xl#yU{Pnh$>uK zSnbs+v-|nX!thqTG!=toIX- zN#&My6~B2l%cp--994K}^p6tf(no!aH=maBcKqt!f9@U6yl%GxP=6c?FCyMiarfbpazn;)m@WqcrS9QO!PN*xpeXzTU*E9)^vJJ& zs+K*WwSrZJZRNI@)0rHzc;Hsma~5s8fx|-WWEKhOMaA{9OmsiU3!Hn6@wS8HLEK;J z`9SkE%uVa!Ni+UY{)E>xq-*5%;@~q{j@fvizSo=cDWi^S+cDuc(Fp}&Y-Obx(!_j=4 ziXt(q^kIM6)=euqrz7ME#orTUJpRHP^R_k^_XiVL!ht_`m<$y4*|gqY3hUYxSu{wSw$;BJ!zZz>o!X(;r?W6 z+3I3dbRg)V%PZ>Pu)n%qE|Pp21J8Kg{B8*mJC$jrzXCb@Crdiyfy_!_(&M}w8XS*+ zdC>##YNY6mFAz*zS`OxL;zm)d#m}5vsBxU2RxgSeUnxz;`-}Iw!D%1iczph>J*k`Y yLsjW|b=cdcv?;t9rA(={J`Gly;V@+}Ek;p%=aLztb;<%fvZegdJ8s}VHt++Ni0Fd= diff --git a/examples/spacetaxi/generated/atarist/levels/level02.dat b/examples/spacetaxi/generated/atarist/levels/level02.dat deleted file mode 100644 index dbebde54cfb5666c5d7580175e47678faa75eb5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmeH}O>PrG5QWPV_Y9*pi`-x&q?~{Y@M9DSlnq%DDxQ`cK@a7=z}Y9XF18v;rvj^lJFNqsetnbx>I81n)nZgrcSH+LLz z(OvIFZylVmpfhP{@Zw-orQVlyIQTD1}tEo~F)Cl3+oZNuNv9M0TpDJ(C^k z3fU#Hz;L3hKO=~yDkJ~Nai0G&{*C7`YmC&Ab=orQ`kOw*gz_GjN1s61ajS z6FEobmr8@HJxI=QIOJqKRZbj(&J{(09cmP@ICzxiy28}}g;Q9+Kp{PP>^K2aUo^{% znX8$Dq`&AWiTm=@2e{afliw+Wef2m@oGT%YWbDVj%aw{TXeo;`uEg6lo6TzeB&E3W xSd4P|?M$cq0=SC1yq8ot?`^evKakB|KK>~cg{|`c2*;xC2JeEq8@P=d_yZFt4gUZD diff --git a/examples/spacetaxi/generated/atarist/levels/level03.dat b/examples/spacetaxi/generated/atarist/levels/level03.dat deleted file mode 100644 index 41ae91bbb408052b501566bdb8013a845b3f593c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmd^BO=uHA6rLS3`7tRL5segNuRRDJya^?uEd_fhtrrXGrj6^S{**{*r7+vnn${mu z?WtY@5~y^8DYo=dOFYybOuYmZ4}wzaQ7A=kJp|v(?(A+hwtDcSA7SUc_kH`lnYWve z?(-cdWrpr^7v%0UU8g%+yI6`$;DFyx$Wv56=xif8h%hT3MnehIw2E4gx`a-xqF3n4 z653cp6X@9*8ec_KsVyPJ)=Y=rUzJ`D;#UFn)r)LjzsIHjO{X$k<5yLk@(kz^)CWv1 z>xSylsV*`tVhHMWP_zXgwBmZ5FsWS=zwVo6KJf9{*lJZYGVS)zIeUU=Zyodcn|+-< zPO0j3n7aKm`c?G?{8_3zLv8+717Dtmmdkk^eiLu zj5y->@jLy(4+$e!S&{2F%eQFjh(|}*Tr8IOED%W|0gQ1_AOP>2!vbxBRo!1cLSUK2;H6`zZu&}O`M)mn4x4^AEpMXj- zksZ>r!@4n)(F{G4l#je0#W;Myfk7_8si(u1A#t?i8+eg}u7 zou*xN9cBQtvv3Adc3+0=5nMFzNA!LOZ2;l@6_^?L1mC{E2Lr!EdKG>eabEO?;+%mS zaQGQ^nSbFU{5H^o{&(0kq9^)a#irT2*TDV*0(o;B29f>ST-ULfgx)*<&dU+;>Ch*M z=c`3@hR+bob2Z&;93u0nwXX5PK*L@kkNSI#7@vz*rv9vM{@6F>quwfcx;_w3D6DLp zy|ubacv??fzyHbOO}?ZLj{{N<29M1qtVEEt3i-~?5U!14s8NCyWMUrq+&?IfRy1|&5rR%h~TL)o>B>b zr>P`7SJO@E2+pV)FAOy774lA7&|KV~cS9(6g;a5U0QNu-XqW|$64HSMfRw=dSjGdD z+I|=FsQe{7*C~CIY^i%(FK!U_n|a`L7dBJyxFZLr)$E=wF851FW6g9NWKnFCr|7OF z?!H*XSU$yh5&fl7636REh#}ZB5Ex WvLM-0MO(0EVM5A@eKLWSPv9@&{us;v diff --git a/examples/spacetaxi/generated/atarist/levels/level05.dat b/examples/spacetaxi/generated/atarist/levels/level05.dat deleted file mode 100644 index 02e66bed022342e2e1bbdd8a862150d75e1ec75d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmeHH&ubGw6rNo=i9-$|Z6G3)?H}OHgF+9f&|VB)S`b3jRUszUlLVCD?5$9-n{(4h zD?Nx468{0kL-Ejnh{U%36^5QXc=EkBvzys&e|QkR^kdoC_r33Z@6GHc^9!Xb9^(4! z%+2|QnbHl4JjMhAxY=!q~vSe+c&;0@CblJ=tmZJO4npyZ3s ze~S-Nfca9~-AasVwK5wAjYeax0?Y`{;IaO+UMJT6T~v^Xvpj_?AVqR6jsvq3oJW5k zu-XYB5~1a16_AADsMOK{g(<;cI82|SW2hqy7DY( zJk5YQdNAeqZ1xce$r*H7X5FoQAWH{HeXUu**6cU7J4pxX6Lr*`<{Rmv`Sd17<#>M9 zv^1hVKdjIh>Zf&3Xgo1(&V_W806q0Z|FkaA2mNRaqr+!&F4UQF;F9#y7WT-fLpC`d zZCCqgqo~&*KRqS&H9BntZV{EIA>z<2{<+&V>vyj$6Ht`-fcimBT zjE3+5$_a%G%TlqhC6ybtr5X>{q?!!ZWiS7v?;JS3nuEaa3E3B49lzI<{T!@A5Uk7o zEfg>i3|q3-l6`(KRj5sLy5KSJUIehNtf+~rKU%Uwgm*3Qf!w;-Ys*6IQ6$+qPw^7O zpeU8G5bO%Id`EqcL~307>;d5qg~Y3j7ft_VO~%)-E#XqHm#ZpRu6dV>esd#O-3+`- g#djM)cQa7jn=JZ_O;0m6<^9Y!=CzzHfA<7_11l4gYybcN diff --git a/examples/spacetaxi/generated/atarist/levels/level06.dat b/examples/spacetaxi/generated/atarist/levels/level06.dat deleted file mode 100644 index f744d27973171ecde067cacb3a0f07a4f42bd380..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2813 zcmeHH&1(}u6rWAHSwk*@^eS6=svvmqAP7>y4+N`%MLhVCq;ZUB3kwOB;FzSa;AIY8 zJxY7n!u}KDB{vgI^YKT796edzo0*-RB-^G!@zft-=FNM*`Mrn zz0YN3^VS!q$ZOV{^*MU4sK6$rr}{UA)obetA1`}tur<^(yFMLC7E=AfZ?TEH+&9*KD1j7kG*@`QJhCpAP=YDiu*K5-v-Myf1I4;ceN1RLLnZC5mC8m(2*s!2w6}QUZ7jc?mD& zlq=4QnN_xUlO9o#dQU}pF+o|1hbLK|@E@r+%`>MaZ(>SWk1F_>UZT)~f^Av019QNy zLBO$dIa@~|EP-D0nkb{Ci4{Cxal-1fCFSf|}m6dwy(v{_4-!BIr z{WtFA)!=Xq3LP-mq1quE4cL$L2$Z{QY`3 diff --git a/examples/spacetaxi/generated/atarist/levels/level07.dat b/examples/spacetaxi/generated/atarist/levels/level07.dat deleted file mode 100644 index 0eb4025aa5dd7be0ba68be67b8dbbf7b0dd6fd6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3005 zcmd^9O=whC6h80Gym_Xv31SctDT9SV7TvUxRgi3wg^oYe&_xz9q-~N~f4CA+0{3MS z$<7E;ILKcM=I=GWAIuL>jjjc>#=)#qB=|Tc7nvFl_ocr^BGRE0^k~#1EeCIpg zy>FPaqm`p&veDtn@R`$Jjh^MK46ql_{IFCCf@Qc1@by9HgAx@7;M@iHauq&~C-Xs@LNUOncp{@Grdn$%Fd@?ZhTKHLcA0$w`jP!&b}Xd_lw7)NRAixYPxj zGsBloPN0-p#vG1NJguLGY$so80WqP` zQZyInv~8t5Zs%>k3ukw^6?zMv>H=N4vz=Pn>C?k*2pKM#`_Tt`kDqWhH8nBpl9`#A zkqN9Mb{)g%Ytz$Qb?Y#gpo;5;omy97(A5=&oYDic#KJKBMby@qv0{lWxW2Tu}l(X%nTSZE+%JToF3QHI(DO$ z$Ka@rd{&6_I4rQ=6XG!}SX5cDcQ~D+&rQVbwf`NeA2tyK(05Ro;4$YM)lCaiG>^bt#OC_1{EXtN$#TPi6h8X#OYb z3!?d4)}@HO`l48S=C_{4pf;p>BC7yzYIE~9=I4<2$oZpRtT4al(PQw|?ZFd`N21?r zdDYlci=qlIAZkF=UuYe9u^}59@?ohJFxhf*Q>tHtx-HZlq3S~YDjHAZR-y7JYOIO= zZK43Ai2HDD<@adGFLw>~dt1GYMY;9S!_tp_94uF^L`wnIm;YIptzfO?F9nP1a;^C? zQdflSeS}u7rrllJ`|5Bf3_{?u|Mnn y8~&^cH`Sg^M4lIqQMWm8<#;r5ePin;-^$2?2ZP@}9~%SMSKIF6E8_YGvZy_EN;eegC5OF)QZ&T6he8oVJy|_8EFPp3+Vy?EpP6r(szk(hhxy*0 z=Y8IvZ+BrKVucF67rHNCIKu#Xi zRCH=4Qs=l%uA-)y+rfq5yP;@BBgpuUh2dMs_HXKHtstSYr4kAr%6hnH1L*Ljr37v5i3;NE0vXhC4#y#z2owA7 zaH*oW#5G&CKK;~G)@0TBqMa1i1M;5Y@oI8InO zpNh)0U@q@Z`SVQ*kBtNKS@`}6_rcrY{XsEJOtYeiQ4mWLjuT}7Zx|ULF${p=JcNLP zIDP@pEZ}fZ5hDa}f&hVl<0*Uv8V+p3%Ca1e!z>*KVSMh#DRM%9Pl>=uLPzj%E@YH- z1)l?a{CY5z&!ITfyaI>w3LMaJoScO3MJ)!_BKHEl%Dv=^F02`GnLOZ!^%pM1VNz<^ zaMu~TZH|qZSro!T&}*uZ@Wiir9<}MIDj_EcxyK(+z}%JuL2%AZNm6IsNw)sbopW|d zyPrqhGf{e~`)SnwF7CFX{*Ac16!m|KyK%Jsb7}BH05#^9e>5(OS`?4?^y&EWxM_~> z*!AetzI{{1*!a$!_>95DQuy#!r`76o@M(2Ku6(~b{i083sce?YM%g9QwQSq9ol2Qn zBiC?7u2UM3iZe1D+Zut$w3GzBIvbY#?^$m?8q%Owi-u2Df1|E@AvKnc_Mc$qS0~wU z{IkSosRd*DU$I}W9v%D=^wy&&>#KZD?h)!Js$ZOESY! zBRR~zZLmSvKiOWHVf`w5w(LFD-kf3A4zt0nAgS?IU%ML*owQuN)nNV$?Oubuyjo%3 zbcQ>cdp^7wUs(M;KJUNYZm!hWo*48#_|EKR%Mh}PduS-)!FY-{K?FSr9z;BN@t}3)ee6e*Xay0$NxC!d_kQ!6nYWv=1B3mC z9J0eFjtva-9X)YGtQ?TWtW?UfYET2Xyd8Exg5ZPDHwgQmlE0z+L-O~a{tWIuHFg>Y z9~!;S$lp+Y5WSLYaW2}#P{dB3L(4^gp%QUi4?pgN?62*$Bq^?YrtNkFJSzm<2+|>x zbvtZEU~0|XpdK+VbesfdEf9n3-=D+1*y)ax+^cekKR(As&)M6^{rJuM=3eSN@0GtY zFUKmE@ozHn^f?Zd*7KeZw!#D8c}b_|)N_Z0DK|WP-pxw{uX<0M3#p=wjJQW+gxB%$ z@jgOAyN==Lwb4<5M!OQ3!LChaM$JNtu1!I)E&SMarqw_}wxZa!{$~>BYF;KI1+|uB zhg`9iOCmDjX+;P{B&K+bn2Ln#2tTGyEN!GJv!hqND?C;c1>5jMjv^BY%e2*_DgZ=e z(f*<(1w~$vgr?@`KRVBo+Dwb*ilSl_mD+P_|(!x`g z=U%XymosRDr13C7B3e+9?1Ia8gNVzGP&BK3kfRw)5+aw~LZ7#MIBxAn*{z4*`%T+BODoea_yWq3RgTjlqtobSDug&)~bAfs` zh~mMNSDL&z^kwLavBtiar)Os8W@o1T#QY+EyvSFU_~+dXqnYTxRctVH^`Z~+OZ?L! zf3(OO>E`QPb<)kzgW&Y2eQ>fkUUYuf%>-;S<195fKu1jq_MKfcjXPtZrbcT9QjF0Z zCzoxrNm|wiOnUr?Wwrx0^RyhgY%3!<6s&vU;t&>+;+jI9yNYAiUBKJj`p% zDI!pp*OM=YTWXL-MFPgOSb2`byIXm8<2CAdjgQ=wFX!FE`+hL6A00Jb6~NTgRF8p3 z-6nB6@!`Y-N4*g_wIEM;m5^y@Ay83b2O0Ps3V#;44;H^87Hi-Mr$ZJ;{)7|UU|ysi zis!`eJ>G;W7*D{V%^`Vk2p%sZhVyG|v>~a}o6@{?e=mFn?0)#CA%Z#S*to^4n(~;N zF?>7`Bd|d==lPx_UYBs3>+y(M4ke`4=m~7e= z<01pZLGCT6eJj!!m7Yu=i>Ep|-;8zk-$OrB*N1m;fKK)yzroR4mB?kAJPj}&$Uhra zxd^s{;v{JCMC)d^_BkGaL@QB!9BzU7gPokURj}t8_3Z!&fYbaF)ip`eS|Z1xZIY-j z6+n_J5Fdw4NX*)wMC=6EIY0p~654PCI-IxxCjmiB-zI|!8ihzjZyN_SjSy5=1NbF& zRj;I>a*^qAa*yB(9N$ozA?#K_3j<^dWCfz_Ag39O){kE**#)3FtXy)~ECed>+Qd+g zhPC;OU>F?;%)1!&e6XdlkC1i24aD*ccLsJq2ozW0XhR4TPm&5=7hL^QJPJEB8Y&AA z3+sCcMg1b9_i#<7QR$q2#&=*8+%q+s{U1ym|&*3Y@+n0Rg&qW z`jvgFbSF1j%I40|=k#y)tU?JxlC?^X*aFhFje)n%uegtQ2DchR{s5ZB=v%|HdMS| zu4Rfjvt+Z99xrCi5-DCWvB=a3Yh&5$BZxmss_MqNMIY8n1nXsT_(6xHy-0m)>tr)Oq%E|*`pxOi#lg1P?kr2JeJRkx{m`Lx1hqgLTR3#3;&&ZpN}lV#)et- z;b1VhVlY$Kb9DR9`hCuZT^Y*wszQsc9ponj|@ z6qn$`AXjv4Jv?S;c#(KsJ!P!n^rkA)fpC100F{zlr|Tz8GgNdtlYLI!xw( za|ux;MO-fd$!ML4vAiu{nL!F|nf7HV8@ml%J+n(~e}t&LL?oE}c97=^*zyC(g+Y9Onl90fnI- Am;e9( diff --git a/examples/spacetaxi/generated/atarist/levels/level12.dat b/examples/spacetaxi/generated/atarist/levels/level12.dat deleted file mode 100644 index 50b1b33da5a0db562634a96ef2aae124c770bcdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3005 zcmd^9PiP!v6n`_jv$IPqZd=f_#WD!elh8vCQK6Z(G>y8!gWlA1HZIdm)apq3$G|r` zNwd()$j1Dk1bPVsI%10LO-o^kIanLYf+D>L0skO~%Yq={p`Y)~%r`r`!zQO(+P6FN zz4v~9-nZWj`{rAPV;aTD!iiI_Yr}68PWvT5UmpO-Y9^CWN^l-v=pY<~6!yS`&o<$` zb$9^(Y{I`A(qU<+ARSt#brx5629D2yzCmk&)*Zqa>x$wzjAZv+e`7n|Mt6s2?=*PS zG|f-(n(0Mk2!4py?(DDE)TqBp=Mwq%O6XiZ+UZ=*KY{16YwrQQXzz;?r{V)q&@&o+ zr`C>Xv(lreokdX?<+6EN-!#dKj4&ZeFg)A<7O@}cvhuOemFkWlaQj9F+Epm&Fce8r zR9Tj@B2=ZXuZe}R9Vp63qmS;;owh?CCe zN#Lt+^{omzWI!JM4jwuCDqo>e^f|J@mb%@`2RxGC+g)@h}XJ;|1=DqXr*Y zVAyNUvqq}9z}7CHWUXqwW){7-Q6uzEk$#c%OG3ZMsKG~;81|Zrq+epjYB8UAl~;?u z7l-_hQL%46`$a}G)rq;HarX|pK@4vWDL21iSpVE)tv$H*vtQWtJFGBm zd-C<$xLYcIvI!ZNFu#{-9k}uJpE%)u;8E5N>no~uRL2>}zRd*SX=pBxl`LYn*!PY9 PJaz3BGvW{C@yh=PC6oI< diff --git a/examples/spacetaxi/generated/atarist/levels/level13.dat b/examples/spacetaxi/generated/atarist/levels/level13.dat deleted file mode 100644 index 3eb8f9da136d0e2b9cbdba81a9d5991030aa7569..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmeHH&1w`u5Uv@W9p?w~074k>?9KC%RTC8!gk%LzA_U50{ntU`9yGaln>Sd*H^>7B z9+rIuUqJ9N#H#A*>7GB>gXkq6%v4u>Usu=Hv+TiadZU;<*uQ!I`mMW@{X4t2i`nGi zy#inagfJeB(qsbX0OLK_F~#rjV+r3@@C$yg;pYk-!Min_tl=|!S;E(KupNw-!H&dI zo+tp5w${J420XFTCs zdORQVs`7;F;}xqqd#lr`>J)o)MURZm?QAWo({4?5AAP33AL57F$GpN9SP}3ksu}k2 zvgL!E3Pjp)-JVZ{68upHb?v)p`K3mrFzD|`v*B|c%;@kLrS{9%ek7|K*@jY5A>tu} zo%ZXhW1_De^35oYj&Rqmaj{tJAyphsXj#55OR4&^BUfrR?I0#}ifNh*0em7&`439r z6G_t2)ua*EX(G8zo97Z`3F^nNX_{U#Fa_bfSCS~*>}Pj(O!}(x$e=KxU$uwTBensT#a&!GE2l{SSB9ZE(FyI2MOjGG+ znJv38QBxVl)76cfnoG7{#9(Sbmk^ytX>?f;1wjszKkET(#j=rTepC8-;ctW`_B8^aOj0&)J*VjJTd}$gL4*SFCIcD&|q)1--qZAn|>QVG0 z7r#^g63sXvo4kCJJQ<62M6Wtl7TJTJ`(x4P|?}1HS>yh!max diff --git a/examples/spacetaxi/generated/atarist/levels/level15.dat b/examples/spacetaxi/generated/atarist/levels/level15.dat deleted file mode 100644 index 7607e7d5f1a4666d13c740c55331cc4e762fd932..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmeHHzi-n(6h1e;bF7L|1WZWCEJ&zQ7AodS5EP^eB-#;zq2;iH#1sh>;rs{5oW)C~ z7|Hwxw=mTRMU083Oo*v4G4tNtIX{To1VPm$pX7VK_ddV(-Mc&Q?eA_oi1Kdv?*8LP z5AN;BDN$In7&DARQZmT)Wpb4i(0zwI{6cPj(v*KT?u$S0{1sr{`&0^BI8@Jz$KNjn zzS5Vwht*a8^84}^=cUH^YtH@LJejllT<)(ToWN6T|Lz6~psvXrNbJQe6&@+$6d|i0iuDLc0@u>;$6L>8P9 zHmk&TiWHlLMJDVtET)=LO1)NzLCVC$Y(A~T{t&4?4LvISVdxDtwLSD&Z5l_AEt1(H r7WSBk(y*6h>qE9abFb4Y7pZ;WQr8lrty*)m^?CD`t5?1<=h=bZXissC diff --git a/examples/spacetaxi/generated/atarist/levels/level16.dat b/examples/spacetaxi/generated/atarist/levels/level16.dat deleted file mode 100644 index 11f416df153d6ea08842786a48d1896c41c4dc87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3197 zcmds3PiP!v6o23B&g{$v>O@Tygvk(kh=?~21&fT54Mf(9=2U6iB+WKOJq$!r0<$xj z?GzPKyd))(#jsFt3M;*OSdrpoYYsVi@t|jsbPHlFJ*@A0-_Ex)lS;Mr)W`C^_kQp9 z{(avj?0fUo*KCrvs&i-0zWMHq@BqdDMJZ`op>Q5f0lYl{6QDs6U;!Ej@cu3M3I05Q zzkXmAd*gt;bc^#JM`}wsS-gO996cu{dz4;yx_Ep4Zr{D#FCRe^_mbxwFaJxFrxlzG%dAZTTxrCMw6Q6EA#iNI)la@-lS>E!p z4A{$@Tqi9y6fe3^Z#J8Cl+Q)6&*}n@t~5AlC?6(h#@lOKjfU2hc*`x!8k>kmrNRX~Ue&S~PVkik< zJuZox<%t*(gi2^ejwkWFG32STL7pId5InrDhsQZe6L10`J6kZ5Mav)$`J9)MtVgbWb^wUzLd&H3`TK)ylZ4|hP)>vYH=ty zfm%`&MNg!pj*X3?!vT?mXzp91D5K~zr9f;hv=Roml5!(}8GswW#-ViQd(>znf;f+c znUu{@eh4aa6bRIcqlY%DK=HIQd8dyWZA1{~QRYCHP9hr%mtnsMPC48kXQpUkn&t5KL{(JP*@4n5Y$S zE`JKP$$u%~M=1kN=9JBV(@At_^L!K&bg;RB!lrbGPjw245vB#i;62PK>O`bO**Hf^ z99>~aAqSKz0pOQqIAMw=P2G{EG)xG@N{G~IwfIc58aJYg_Nz{CwsyRuZSSyfwBvOwbxzx|)Q-nbPwlL0c&=-m zAKhrBUD8%=>b&T^YNgTj+}`Og?siZ5J*EF!tnj8`>za%0Pxx`so^Y;O{x_CiH5!8f zz-H~c=UBTSFih%OJ$6{A-fZ*~JZ?8=>LbhVSbk4G{JGXXBc}enJwPK`j3HWz&SSkU z^P^>3bFMG8K5?%vwIVkTc-t3Ro*T2)RTl@Tt~9#W+&PB$%dD?;?>FpcotWWF7&)5s zJCi=*1x`ERzj%@1#67iN{`yYNKEzcPm-qF zG}#@om$smzu(Xg_Oh`*FHLNT#2pcbJyLeC(sUQ-e2EA3;^}T=QpP9^VRu6iSK7Ri9 z-uK@3y|;fh`{I$&CsnlP4jsuH9?l%j9C{{0IY1Af$?@*)MEn9=2N)iNK~M;sf(xI( zr49H9KC8nA>+m=XUxr85;S2cbL-=_^+AHn5EbU*H9+39crTrW5Jv8d@?K>ofF5C@kFD$w;!h4Ul5Hw=+uA80kK*RNKdZ}>P ztez1u`C%QAz}~@d^3>!cM?<@-Iw5{lX|Xt33#jnlnD7ro`}khpfA}sknkV1!ojdmh zRX?J@mlhu&fObY=g?4>m%0>8mv{z(-@mV;_vY9_k%L4d7FS80{b3cpLMhydcL(7}}3Y?O~p2S|d>ul&X!LdG7! zKi!^xAPs-?L9<3T#;Ay#@DcpE7Jdwdo`s>O;m>|(enmINh@@g|`Da@A07HDeCP1?S zc;hHU!ox%R=i2a*fQQKZxaltZvr#^0b~U%dhlCIhOJK@vKFW7@<0}7T{<${%UVv$k z4pyXQ1#gT2k??SL24^lr_^}kkdZF)m= z7k<7ye~W+f8shu6`}YSl&1qT>*R*21yv6J}bLqx!%)V$i-S)>u`6jd9Hp<^HJ7<({ zGn*NXWWQ%@{vg+GYB+e{XzA`#-U1T(`HRyh@wM>hDb}5snLRysCUJywbf$7y$IMNrkEOHP_&C5U{4Pt997}x8M#{HX zDXTt|cI4b~^^!UIig{&hV4|KIyK?;eF|EADmZ-xyk1Z>oGR(ib!?yRJA7DQ+dyS3G znvQH=W4JLUUz=3HkFmz8UE708H-5nhU%DDub#J;DSD#4Z4D7zfM8Q!}TvUn)tX*ZB QwYyGy`6|=s?f#$k7aEx~yZ`_I diff --git a/examples/spacetaxi/generated/atarist/levels/level18.dat b/examples/spacetaxi/generated/atarist/levels/level18.dat deleted file mode 100644 index b682e46e550fc6503224c59e6f721d3bafc90ac9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmeHHJ8l#~5bfFN*=AT+nH$U@2ylXA39n=cA{3$#+x~YoDq+&v)4xLY2e@9_!+6~7b_+{P!h70o-)*Z_N Ffg6$c9^L=| diff --git a/examples/spacetaxi/generated/atarist/levels/level19.dat b/examples/spacetaxi/generated/atarist/levels/level19.dat deleted file mode 100644 index 7a9076126fb30a6749800a89cb49b90ef359bf92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmd^9O=uHA6n?wSHi=2G6wydQ_S%Es!JAM5+7h7$p#`C!ZrZqR>Q9N3*2`>DV_JVm zwWoRsNTAXUrr6R;E%8u$F!d5tJP1muN1+tG^$>hByR*C5*xG|9{Rlhnz3HeWg1QW6*5EaK zU53qdn1tu+kXeJ8(47#X>r{FWC<7kEuOS+%m&|?s>3aEp)2S5K*;Q4iJ>z+d^ z+za3)B+2#X;wFMYkIp8|8|*a5a-P=rMT!&XN5Rv2oyjqQdEv64M`zc)!2xw3h3eq3 zadBZcLSCJV6nTt6$aMr7hQe611t_%Q{rtEcUH8z5mTkx$XT$#7O>tWup3gf(n>bRc z^UR;!i080?TKri$&nto{J1^HZjsv~jes*I%cD_rVd;40>_EdN$Z(nvK5vOMvnP(Kk zjvu?Tnfn1Z!j%@8j?XgM^Fm>az>9Ng?vV@gsYMP7|gHy zAo*G5y`{uT7gE(DC6cQ2KWV8fzYG=*$-!tP&?;(5!G~dSLo1K#3&(DwTda`4N-~if z)pKLIF`Cs3J)4wIMl~go0GNQEq9BOAz#9@Pe;`FoZjTybc1V7z_gvBE1|rFi*@3yC znYdD3CG%8a%%Ei96~X+=HrZ*xHA23T{3_|0&5$OTpa=UWHr|t~6m!Gj}z+1uL+XgqKaAP+5b;CVYXt zB>ZT>cQ{;wUoDu2m0id-HB&pA)SQ;^RpCD9!u>~xUiO~sSg6-Wz(s0&8+jo7FU1|4LFPF0CGP>N91iM$h1D7Z0nomMjQ z4ZHk~S%(9CMjr~(_v>O^qA!pVjYSrpLu3-08(}0zBeH(FST(K=C$E~Qaj+x%j;wPA z`$_Y_&%qHeD#sFbU83{}(t)lJ(!=k|bR^+28W$FigpftZ=jn8mV34B7#CVNi@l~9$1JTGLcX}4ufM=*Heb_JG&Q z-a<9+RjLK&;&r!CD<7O}lv#UWM{}K4*%fi-gXT6eto?iEf=I7niiK&$GmOtLKFhok zdhMfAUU90j11u}C_7+-se`ZmiW_ZV<4BJn$ZzuLM%$tuZCMEz*T{<+h$w`27@YB#z OsUT1f{XhQa6Zi|61CWvc diff --git a/examples/spacetaxi/generated/atarist/levels/level21.dat b/examples/spacetaxi/generated/atarist/levels/level21.dat deleted file mode 100644 index 7d6c4c99512cbf448abcca49e806e76130ea2b0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2941 zcmc(f-)kII6vxlZW@o#th%FI=U|CU+Q1r=CLC~P7icWULALK>IK6GbyQxmz6`XjKp zn?gX44SCa-!Lo>C3M;-YG$Nr7rVnNR0YMZ5MMC-@f{69}xcAOXwk7S8r_0`Z&-tA1 z`R<)b-+m{2w!-n&`Il<%R%hi<0SUhp1jXVNxC-$46ik7S{~&_3S?FGeXQ28OoY{p< z`1%@rwhRAyr>}XH>+q`=%)&3bM&igN8jB{zSTc$lZDUTB#S65KC8H>x6YLO(N#t@M z9wiPb5@*0hbTNu}Dw7TJ_(7zljX9^76UiNfI~p|Hk)Y*{0v(rvY*Jc!PF~vgl(HHIo*k$M$kP#viv@JI*ct7F4u)sBA~(R^iGi zhc_zL%(pojj;!!pxzCg|-mTS?;|571ZN&q=UrcbB-YXNR4oF!KxRJ@0a~FdNxdyJ# zFEwVwA1kvM4z(qkmoBeGm-NI2`4PIvgjx^t>H zVWQ}H#S(TNvr#IZIFVMdEJ4|#`%Snh7JWahP8PZ^09*vP+J*1b_Q~Y-Tvhd| z3fG$I)zp4fjSBm?HahqTf9xbsA1vvE;O3GJ>uZA>YT6qWWY=ryE6^`J*wS0x4l%KHO*}dZS%=dZu5flxOz5(W9^7m{9dX8aJnUb80`NadWD*=S$~Z?DR{U zP5n(%@679iM^LE{`kH^%&88kSHFp18@1LeAg@^v=PvB=%uY>DwY}*Ac5Dyd(AbU8 uttU>shi{XIf1rQ=GXc4e-6rNo(yIB$x16D%VDwrajrVJOj1ciuT@&j(Y%eYB2Dg>0kMJ!gXvA9|k zn=4KTa(_U=VR1r=fTFD=)-jc}-+MDVJC{p{MG6bw!S46o`{sLZX5QT`E-hS-VT(6! z%`Z*enYufBdzO450s-^GAPB?v;)4(~u^89EaWP#MSG#bhcj>(@UY5mLSG*M;cg5?j z_$Cg^;!D??@Mdg#Mff1XlnNg_zAUp zc5lQ`Dos}`bu}$K;5-3Hyqe`LgO_{24&=JU(p4?t1dJ;4ilxh1!U-5vrLeZBKu+Ej zHIZZ9M?bAdI>c4hGpmZOVpo@YR%);pY@ej;ZV6x?W{;$ix8ulBG-aOIBWYNPLe50> zy%kdZN~QoRYF;7bG*&=V)I57}r-Jk6DfPfkC(2@4)%vl(W17?IUl}otVHoFftTs0{ z=P{brSLzw?#?y@rj=KA$5iYWFz(UwSP|D~u6K+CE=f}iNMA0#xP3i^Kjo8m!DM#7h zYcQ%a#(}0reRZ7{jzcMZ-?u?v>oG)^FhI+rauo1=U6`>EU>@)=jCnxJ;sAQnDPq(4 zF^^7x!UfL+hKDI7B^`elnhGajZqe`rt%)M0VG%pp!*SzdE|L@I0jH!Xe7_8-H3apA z7d&%YmS?sAUKHRzi1rY`n5H5BGik_rnum47(|s}|9x8K`>XOtDj71|t45I=f-N&P| zF+5VzkTzp@d_a(;P@i#xR`aGcz_X7-j^Pn>=Kd6(W;=6Ay7^d+^0;!Pd`|UApZ(-* z;UPUwhL|*(DYj6Kj7XbBS{p^(FCXp|V{EfmM1^c@Oo+?kxAYG8>)ZSF$xBCGrTr#L z+x2WEo+`D2R|oa&gZiX@6yX(L+*DC*@4QZuRXb@`>vfVwGwF5GMlAR7`t#{Y3v9Ylp9S~n0!*cY|=qN*jtpHvv zDm94=(gaFU3sKvko>T!-AOD z-N*aO9Isr>avu8pdE?Tp66J!fi!fc+U(AVpMxxti7vQ|cF&*GX!dxPP5RpYu^a@Ai zNIdRGA?ymG5q2N0A`wyaqbCT_G|dsrEvg}5f~bN(!se5(`7&(6;#Jsu9X6+Drf1-r zhJs=%h}_nx;7^Q+v5wY`R$))rgHIr0R0c={sH3n&tL=_$q#bHxlyj;>pa`gw5A1tN zOwCB9ylzIK|&`CRgTZZ6fCSvOL1!&CiQ30c5!rhtOQmg(kKT5Sc}NjEV` zaw_MDkP>Qwvz^08Mu2rWR6RBSW*aKJb91DXglfymc@=7~6M6whf#hDqjzTO?*DAY? z40qP7$xqhJ&z7>G^o@U*rG;5q7OH~gL`{oowotIBa$L2EGBduj!xYzFdMn=w*RmBs zvx!S87+G_Gnp(E-Fl(l$c`K`x;?(FbwNNAF5MvN%#z4EcI;cqMT)!2kb1AFEeHHxa H{E_(u4GZeo diff --git a/examples/spacetaxi/generated/atarist/levels/level24.dat b/examples/spacetaxi/generated/atarist/levels/level24.dat deleted file mode 100644 index 13dca31b4b3937c07b17df8bd08a25a41909d135..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmb_e&rcIk5Pq%fF3=`c6N5LFzW_+Q%LT%riU~yEWciVbsA!WKk>tUthXNZQCgP#5 zCQUe$q>Ja{0{5N>*OX5QN$?b3yVU(%iTX1#fE-`^4Bl2kT%uI_KECBzwPuHmhtw*&VdI>@3N?enFd6 zc1PI)+6GtwJO%`u;8FVt0&?W2+;@sNB4^T*qKtG7(zn0+Tm{s6qW)*qquKjsQwDW_+ zpVV2ASBkuvIFF<#RuMdLEm>Tw6!`5YH@5Bl7Ex`n*EO-B*<-pG*KN}fU534XB&tXD z`mxwJw#RB>yk?sxqU+?~cY!AkJ{GwBfeXlmM94CYa$Ggszd$Q4-ooLib4M8VMaGp`9nEKWERs z^;D^Xz8%`xr?%Tw+g+2*!&5=@cPTo8qFYgPDFSC~-s~$e^X<~b%7 diff --git a/examples/spacetaxi/generated/atarist/levels/title.dat b/examples/spacetaxi/generated/atarist/levels/title.dat deleted file mode 100644 index 83ca545328d4c48b3b960ce6b48517eb6f470f02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 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 diff --git a/examples/spacetaxi/generated/atarist/tiles/tbank1.tbk b/examples/spacetaxi/generated/atarist/tiles/tbank1.tbk deleted file mode 100644 index c4a9cb1010ecd973811a52053ce9aafe73c062de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32044 zcmeIwu}%U(6op|?5eNmbvm@~dG&Gu+V2qWe(VmLRUMs=a_y&f`#<#G+P|)}aCRmA; zT4`axb8v66*|6GK{gWJKxObS{{g#8Hz0JkKcxhoarnN@-Ze_cCTijY6Ru9X&#dh_$ zcv>1)PD;JX&z}6xsan5fqW+iisk|v8rLT0A7zHhSGbN>_)Rm^vQ9O2(b0vKpe|O!r zhVn3Hj{O7mdYQQ9{@NdjGv2kYuXL41CF&imn@U~rz55ybEPf`BD`j6w4aZ-}o%A{T|zj@7Z%i%iQN{xv3F*^M3EM<9g}Ybq`-NT~DvwkMrZ4 zxL4ObqVGBO#2N0}$i6pXLkcC8iz0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ j0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL_*a2%Vkvh? diff --git a/examples/spacetaxi/generated/atarist/tiles/tbank2.tbk b/examples/spacetaxi/generated/atarist/tiles/tbank2.tbk deleted file mode 100644 index 26619da4f635a86daa87df8d17360c7aacbc6a94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32044 zcmeIwu}&0G97b_gTy_Zs+Sy@z0tgKxCJ+_#+>IFe$y}d zLEq>jy`drHcckxB(TF}!*}unpn|A17z2?5`KW84)Z8qlY=ek4pX`Ql{wZu5F)ws_* zXvFyUIV$G1@|<62T(6na3o7rB`}qE(%rB{VUOrdWG3P1wF?&n9b)Q(j(l*61@0XSu zbMDLgZ!&LCdFQOT&wj3}{03*I7d^69D&Jphv!8j2@;fr;D(^JO+|~*E$8tuQ^(wA?5qGDYl>MHFNfImSUe`p0iTUZq?moO{;Yy)>OVD|8FVx&6!&- z1r$&~0RLRcg{%CU53 zG@7|1`84zR^l*26_IVN0w}`lTiTkUM+x7DO`uXy0v2MPWuT9frWV1bUWZY~b_8E_@ zRzI0)wIBOT2gXCY)RcKVQTs=dyZ*ts+T#V|Eq~6nGjQ${q^$Q_2=d7i{Fo*uJ12jAHQ6_-#&-Ez>ejbM5wiU8P$!)w3>^EbBCDF?x@^zskiL3+3m&`FEp} z!K&sMWtH=~Icn^+@{8m*{aP-kt|yDhj9%;WCh*+D)=a>;dOdlX+Rk`MbS|I!-)Ae$ zki%vXzq#HXRs5!qlNa}0Y@1))q3%Ek>yzxHC@9Twa(uEMfxG-6(pUL;K8|ng zTjL|?R}uPFUaUpDfp5*{@T~gUX-G9KK4}!|7Pa$bQI$mNXEj=Xs}=va4+Xb+EVorW z1IxUx!7TPRZNI;eG>7Kh`0mbM=g9k1P}EcY#jy2NP;I;a%UfBRN69^}`;Qtb-U2sY zL5X+yOHiAwKl<Es!_kvMNhsxQJ21sweRY;=y#)N5-XzvMe+PB`fZY|ldx^7IKQyn^C*F-i0h%Va{GSoCAw2wh zTw`(EAN-YD@5)d@)bA^CUU!H3MlZ$?fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| bfB*y_009U<00Izz00bZa0SG|geGxP=6c?FCyMiarfbpazn;)m@WqcrS9QO!PN*xpeXzTU*E9)^vJJ& zs+K*WwSrZJZRNI@)0rHzc;Hsma~5s8fx|-WWEKhOMaA{9OmsiU3!Hn6@wS8HLEK;J z`9SkE%uVa!Ni+UY{)E>xq-*5%;@~q{j@fvizSo=cDWi^S+cDuc(Fp}&Y-Obx(!_j=4 ziXt(q^kIM6)=euqrz7ME#orTUJpRHP^R_k^_XiVL!ht_`m<$y4*|gqY3hUYxSu{wSw$;BJ!zZz>o!X(;r?W6 z+3I3dbRg)V%PZ>Pu)n%qE|Pp21J8Kg{B8*mJC$jrzXCb@Crdiyfy_!_(&M}w8XS*+ zdC>##YNY6mFAz*zS`OxL;zm)d#m}5vsBxU2RxgSeUnxz;`-}Iw!D%1iczph>J*k`Y yLsjW|b=cdcv?;t9rA(={J`Gly;V@+}Ek;p%=aLztb;<%fvZegdJ8s}VHt++Ni0Fd= diff --git a/examples/spacetaxi/generated/dos/levels/level02.dat b/examples/spacetaxi/generated/dos/levels/level02.dat deleted file mode 100644 index dbebde54cfb5666c5d7580175e47678faa75eb5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmeH}O>PrG5QWPV_Y9*pi`-x&q?~{Y@M9DSlnq%DDxQ`cK@a7=z}Y9XF18v;rvj^lJFNqsetnbx>I81n)nZgrcSH+LLz z(OvIFZylVmpfhP{@Zw-orQVlyIQTD1}tEo~F)Cl3+oZNuNv9M0TpDJ(C^k z3fU#Hz;L3hKO=~yDkJ~Nai0G&{*C7`YmC&Ab=orQ`kOw*gz_GjN1s61ajS z6FEobmr8@HJxI=QIOJqKRZbj(&J{(09cmP@ICzxiy28}}g;Q9+Kp{PP>^K2aUo^{% znX8$Dq`&AWiTm=@2e{afliw+Wef2m@oGT%YWbDVj%aw{TXeo;`uEg6lo6TzeB&E3W xSd4P|?M$cq0=SC1yq8ot?`^evKakB|KK>~cg{|`c2*;xC2JeEq8@P=d_yZFt4gUZD diff --git a/examples/spacetaxi/generated/dos/levels/level03.dat b/examples/spacetaxi/generated/dos/levels/level03.dat deleted file mode 100644 index 41ae91bbb408052b501566bdb8013a845b3f593c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmd^BO=uHA6rLS3`7tRL5segNuRRDJya^?uEd_fhtrrXGrj6^S{**{*r7+vnn${mu z?WtY@5~y^8DYo=dOFYybOuYmZ4}wzaQ7A=kJp|v(?(A+hwtDcSA7SUc_kH`lnYWve z?(-cdWrpr^7v%0UU8g%+yI6`$;DFyx$Wv56=xif8h%hT3MnehIw2E4gx`a-xqF3n4 z653cp6X@9*8ec_KsVyPJ)=Y=rUzJ`D;#UFn)r)LjzsIHjO{X$k<5yLk@(kz^)CWv1 z>xSylsV*`tVhHMWP_zXgwBmZ5FsWS=zwVo6KJf9{*lJZYGVS)zIeUU=Zyodcn|+-< zPO0j3n7aKm`c?G?{8_3zLv8+717Dtmmdkk^eiLu zj5y->@jLy(4+$e!S&{2F%eQFjh(|}*Tr8IOED%W|0gQ1_AOP>2!vbxBRo!1cLSUK2;H6`zZu&}O`M)mn4x4^AEpMXj- zksZ>r!@4n)(F{G4l#je0#W;Myfk7_8si(u1A#t?i8+eg}u7 zou*xN9cBQtvv3Adc3+0=5nMFzNA!LOZ2;l@6_^?L1mC{E2Lr!EdKG>eabEO?;+%mS zaQGQ^nSbFU{5H^o{&(0kq9^)a#irT2*TDV*0(o;B29f>ST-ULfgx)*<&dU+;>Ch*M z=c`3@hR+bob2Z&;93u0nwXX5PK*L@kkNSI#7@vz*rv9vM{@6F>quwfcx;_w3D6DLp zy|ubacv??fzyHbOO}?ZLj{{N<29M1qtVEEt3i-~?5U!14s8NCyWMUrq+&?IfRy1|&5rR%h~TL)o>B>b zr>P`7SJO@E2+pV)FAOy774lA7&|KV~cS9(6g;a5U0QNu-XqW|$64HSMfRw=dSjGdD z+I|=FsQe{7*C~CIY^i%(FK!U_n|a`L7dBJyxFZLr)$E=wF851FW6g9NWKnFCr|7OF z?!H*XSU$yh5&fl7636REh#}ZB5Ex WvLM-0MO(0EVM5A@eKLWSPv9@&{us;v diff --git a/examples/spacetaxi/generated/dos/levels/level05.dat b/examples/spacetaxi/generated/dos/levels/level05.dat deleted file mode 100644 index 02e66bed022342e2e1bbdd8a862150d75e1ec75d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmeHH&ubGw6rNo=i9-$|Z6G3)?H}OHgF+9f&|VB)S`b3jRUszUlLVCD?5$9-n{(4h zD?Nx468{0kL-Ejnh{U%36^5QXc=EkBvzys&e|QkR^kdoC_r33Z@6GHc^9!Xb9^(4! z%+2|QnbHl4JjMhAxY=!q~vSe+c&;0@CblJ=tmZJO4npyZ3s ze~S-Nfca9~-AasVwK5wAjYeax0?Y`{;IaO+UMJT6T~v^Xvpj_?AVqR6jsvq3oJW5k zu-XYB5~1a16_AADsMOK{g(<;cI82|SW2hqy7DY( zJk5YQdNAeqZ1xce$r*H7X5FoQAWH{HeXUu**6cU7J4pxX6Lr*`<{Rmv`Sd17<#>M9 zv^1hVKdjIh>Zf&3Xgo1(&V_W806q0Z|FkaA2mNRaqr+!&F4UQF;F9#y7WT-fLpC`d zZCCqgqo~&*KRqS&H9BntZV{EIA>z<2{<+&V>vyj$6Ht`-fcimBT zjE3+5$_a%G%TlqhC6ybtr5X>{q?!!ZWiS7v?;JS3nuEaa3E3B49lzI<{T!@A5Uk7o zEfg>i3|q3-l6`(KRj5sLy5KSJUIehNtf+~rKU%Uwgm*3Qf!w;-Ys*6IQ6$+qPw^7O zpeU8G5bO%Id`EqcL~307>;d5qg~Y3j7ft_VO~%)-E#XqHm#ZpRu6dV>esd#O-3+`- g#djM)cQa7jn=JZ_O;0m6<^9Y!=CzzHfA<7_11l4gYybcN diff --git a/examples/spacetaxi/generated/dos/levels/level06.dat b/examples/spacetaxi/generated/dos/levels/level06.dat deleted file mode 100644 index f744d27973171ecde067cacb3a0f07a4f42bd380..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2813 zcmeHH&1(}u6rWAHSwk*@^eS6=svvmqAP7>y4+N`%MLhVCq;ZUB3kwOB;FzSa;AIY8 zJxY7n!u}KDB{vgI^YKT796edzo0*-RB-^G!@zft-=FNM*`Mrn zz0YN3^VS!q$ZOV{^*MU4sK6$rr}{UA)obetA1`}tur<^(yFMLC7E=AfZ?TEH+&9*KD1j7kG*@`QJhCpAP=YDiu*K5-v-Myf1I4;ceN1RLLnZC5mC8m(2*s!2w6}QUZ7jc?mD& zlq=4QnN_xUlO9o#dQU}pF+o|1hbLK|@E@r+%`>MaZ(>SWk1F_>UZT)~f^Av019QNy zLBO$dIa@~|EP-D0nkb{Ci4{Cxal-1fCFSf|}m6dwy(v{_4-!BIr z{WtFA)!=Xq3LP-mq1quE4cL$L2$Z{QY`3 diff --git a/examples/spacetaxi/generated/dos/levels/level07.dat b/examples/spacetaxi/generated/dos/levels/level07.dat deleted file mode 100644 index 0eb4025aa5dd7be0ba68be67b8dbbf7b0dd6fd6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3005 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 Am;e9( diff --git a/examples/spacetaxi/generated/dos/levels/level12.dat b/examples/spacetaxi/generated/dos/levels/level12.dat deleted file mode 100644 index 50b1b33da5a0db562634a96ef2aae124c770bcdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3005 zcmd^9PiP!v6n`_jv$IPqZd=f_#WD!elh8vCQK6Z(G>y8!gWlA1HZIdm)apq3$G|r` zNwd()$j1Dk1bPVsI%10LO-o^kIanLYf+D>L0skO~%Yq={p`Y)~%r`r`!zQO(+P6FN zz4v~9-nZWj`{rAPV;aTD!iiI_Yr}68PWvT5UmpO-Y9^CWN^l-v=pY<~6!yS`&o<$` zb$9^(Y{I`A(qU<+ARSt#brx5629D2yzCmk&)*Zqa>x$wzjAZv+e`7n|Mt6s2?=*PS zG|f-(n(0Mk2!4py?(DDE)TqBp=Mwq%O6XiZ+UZ=*KY{16YwrQQXzz;?r{V)q&@&o+ zr`C>Xv(lreokdX?<+6EN-!#dKj4&ZeFg)A<7O@}cvhuOemFkWlaQj9F+Epm&Fce8r zR9Tj@B2=ZXuZe}R9Vp63qmS;;owh?CCe zN#Lt+^{omzWI!JM4jwuCDqo>e^f|J@mb%@`2RxGC+g)@h}XJ;|1=DqXr*Y zVAyNUvqq}9z}7CHWUXqwW){7-Q6uzEk$#c%OG3ZMsKG~;81|Zrq+epjYB8UAl~;?u z7l-_hQL%46`$a}G)rq;HarX|pK@4vWDL21iSpVE)tv$H*vtQWtJFGBm zd-C<$xLYcIvI!ZNFu#{-9k}uJpE%)u;8E5N>no~uRL2>}zRd*SX=pBxl`LYn*!PY9 PJaz3BGvW{C@yh=PC6oI< diff --git a/examples/spacetaxi/generated/dos/levels/level13.dat b/examples/spacetaxi/generated/dos/levels/level13.dat deleted file mode 100644 index 3eb8f9da136d0e2b9cbdba81a9d5991030aa7569..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmeHH&1w`u5Uv@W9p?w~074k>?9KC%RTC8!gk%LzA_U50{ntU`9yGaln>Sd*H^>7B z9+rIuUqJ9N#H#A*>7GB>gXkq6%v4u>Usu=Hv+TiadZU;<*uQ!I`mMW@{X4t2i`nGi zy#inagfJeB(qsbX0OLK_F~#rjV+r3@@C$yg;pYk-!Min_tl=|!S;E(KupNw-!H&dI zo+tp5w${J420XFTCs zdORQVs`7;F;}xqqd#lr`>J)o)MURZm?QAWo({4?5AAP33AL57F$GpN9SP}3ksu}k2 zvgL!E3Pjp)-JVZ{68upHb?v)p`K3mrFzD|`v*B|c%;@kLrS{9%ek7|K*@jY5A>tu} zo%ZXhW1_De^35oYj&Rqmaj{tJAyphsXj#55OR4&^BUfrR?I0#}ifNh*0em7&`439r z6G_t2)ua*EX(G8zo97Z`3F^nNX_{U#Fa_bfSCS~*>}Pj(O!}(x$e=KxU$uwTBensT#a&!GE2l{SSB9ZE(FyI2MOjGG+ znJv38QBxVl)76cfnoG7{#9(Sbmk^ytX>?f;1wjszKkET(#j=rTepC8-;ctW`_B8^aOj0&)J*VjJTd}$gL4*SFCIcD&|q)1--qZAn|>QVG0 z7r#^g63sXvo4kCJJQ<62M6Wtl7TJTJ`(x4P|?}1HS>yh!max diff --git a/examples/spacetaxi/generated/dos/levels/level15.dat b/examples/spacetaxi/generated/dos/levels/level15.dat deleted file mode 100644 index 7607e7d5f1a4666d13c740c55331cc4e762fd932..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmeHHzi-n(6h1e;bF7L|1WZWCEJ&zQ7AodS5EP^eB-#;zq2;iH#1sh>;rs{5oW)C~ z7|Hwxw=mTRMU083Oo*v4G4tNtIX{To1VPm$pX7VK_ddV(-Mc&Q?eA_oi1Kdv?*8LP z5AN;BDN$In7&DARQZmT)Wpb4i(0zwI{6cPj(v*KT?u$S0{1sr{`&0^BI8@Jz$KNjn zzS5Vwht*a8^84}^=cUH^YtH@LJejllT<)(ToWN6T|Lz6~psvXrNbJQe6&@+$6d|i0iuDLc0@u>;$6L>8P9 zHmk&TiWHlLMJDVtET)=LO1)NzLCVC$Y(A~T{t&4?4LvISVdxDtwLSD&Z5l_AEt1(H r7WSBk(y*6h>qE9abFb4Y7pZ;WQr8lrty*)m^?CD`t5?1<=h=bZXissC diff --git a/examples/spacetaxi/generated/dos/levels/level16.dat b/examples/spacetaxi/generated/dos/levels/level16.dat deleted file mode 100644 index 11f416df153d6ea08842786a48d1896c41c4dc87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3197 zcmds3PiP!v6o23B&g{$v>O@Tygvk(kh=?~21&fT54Mf(9=2U6iB+WKOJq$!r0<$xj z?GzPKyd))(#jsFt3M;*OSdrpoYYsVi@t|jsbPHlFJ*@A0-_Ex)lS;Mr)W`C^_kQp9 z{(avj?0fUo*KCrvs&i-0zWMHq@BqdDMJZ`op>Q5f0lYl{6QDs6U;!Ej@cu3M3I05Q zzkXmAd*gt;bc^#JM`}wsS-gO996cu{dz4;yx_Ep4Zr{D#FCRe^_mbxwFaJxFrxlzG%dAZTTxrCMw6Q6EA#iNI)la@-lS>E!p z4A{$@Tqi9y6fe3^Z#J8Cl+Q)6&*}n@t~5AlC?6(h#@lOKjfU2hc*`x!8k>kmrNRX~Ue&S~PVkik< zJuZox<%t*(gi2^ejwkWFG32STL7pId5InrDhsQZe6L10`J6kZ5Mav)$`J9)MtVgbWb^wUzLd&H3`TK)ylZ4|hP)>vYH=ty zfm%`&MNg!pj*X3?!vT?mXzp91D5K~zr9f;hv=Roml5!(}8GswW#-ViQd(>znf;f+c znUu{@eh4aa6bRIcqlY%DK=HIQd8dyWZA1{~QRYCHP9hr%mtnsMPC48kXQpUkn&t5KL{(JP*@4n5Y$S zE`JKP$$u%~M=1kN=9JBV(@At_^L!K&bg;RB!lrbGPjw245vB#i;62PK>O`bO**Hf^ z99>~aAqSKz0pOQqIAMw=P2G{EG)xG@N{G~IwfIc58aJYg_Nz{CwsyRuZSSyfwBvOwbxzx|)Q-nbPwlL0c&=-m zAKhrBUD8%=>b&T^YNgTj+}`Og?siZ5J*EF!tnj8`>za%0Pxx`so^Y;O{x_CiH5!8f zz-H~c=UBTSFih%OJ$6{A-fZ*~JZ?8=>LbhVSbk4G{JGXXBc}enJwPK`j3HWz&SSkU z^P^>3bFMG8K5?%vwIVkTc-t3Ro*T2)RTl@Tt~9#W+&PB$%dD?;?>FpcotWWF7&)5s zJCi=*1x`ERzj%@1#67iN{`yYNKEzcPm-qF zG}#@om$smzu(Xg_Oh`*FHLNT#2pcbJyLeC(sUQ-e2EA3;^}T=QpP9^VRu6iSK7Ri9 z-uK@3y|;fh`{I$&CsnlP4jsuH9?l%j9C{{0IY1Af$?@*)MEn9=2N)iNK~M;sf(xI( zr49H9KC8nA>+m=XUxr85;S2cbL-=_^+AHn5EbU*H9+39crTrW5Jv8d@?K>ofF5C@kFD$w;!h4Ul5Hw=+uA80kK*RNKdZ}>P ztez1u`C%QAz}~@d^3>!cM?<@-Iw5{lX|Xt33#jnlnD7ro`}khpfA}sknkV1!ojdmh zRX?J@mlhu&fObY=g?4>m%0>8mv{z(-@mV;_vY9_k%L4d7FS80{b3cpLMhydcL(7}}3Y?O~p2S|d>ul&X!LdG7! zKi!^xAPs-?L9<3T#;Ay#@DcpE7Jdwdo`s>O;m>|(enmINh@@g|`Da@A07HDeCP1?S zc;hHU!ox%R=i2a*fQQKZxaltZvr#^0b~U%dhlCIhOJK@vKFW7@<0}7T{<${%UVv$k z4pyXQ1#gT2k??SL24^lr_^}kkdZF)m= z7k<7ye~W+f8shu6`}YSl&1qT>*R*21yv6J}bLqx!%)V$i-S)>u`6jd9Hp<^HJ7<({ zGn*NXWWQ%@{vg+GYB+e{XzA`#-U1T(`HRyh@wM>hDb}5snLRysCUJywbf$7y$IMNrkEOHP_&C5U{4Pt997}x8M#{HX zDXTt|cI4b~^^!UIig{&hV4|KIyK?;eF|EADmZ-xyk1Z>oGR(ib!?yRJA7DQ+dyS3G znvQH=W4JLUUz=3HkFmz8UE708H-5nhU%DDub#J;DSD#4Z4D7zfM8Q!}TvUn)tX*ZB QwYyGy`6|=s?f#$k7aEx~yZ`_I diff --git a/examples/spacetaxi/generated/dos/levels/level18.dat b/examples/spacetaxi/generated/dos/levels/level18.dat deleted file mode 100644 index b682e46e550fc6503224c59e6f721d3bafc90ac9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmeHHJ8l#~5bfFN*=AT+nH$U@2ylXA39n=cA{3$#+x~YoDq+&v)4xLY2e@9_!+6~7b_+{P!h70o-)*Z_N Ffg6$c9^L=| diff --git a/examples/spacetaxi/generated/dos/levels/level19.dat b/examples/spacetaxi/generated/dos/levels/level19.dat deleted file mode 100644 index 7a9076126fb30a6749800a89cb49b90ef359bf92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmd^9O=uHA6n?wSHi=2G6wydQ_S%Es!JAM5+7h7$p#`C!ZrZqR>Q9N3*2`>DV_JVm zwWoRsNTAXUrr6R;E%8u$F!d5tJP1muN1+tG^$>hByR*C5*xG|9{Rlhnz3HeWg1QW6*5EaK zU53qdn1tu+kXeJ8(47#X>r{FWC<7kEuOS+%m&|?s>3aEp)2S5K*;Q4iJ>z+d^ z+za3)B+2#X;wFMYkIp8|8|*a5a-P=rMT!&XN5Rv2oyjqQdEv64M`zc)!2xw3h3eq3 zadBZcLSCJV6nTt6$aMr7hQe611t_%Q{rtEcUH8z5mTkx$XT$#7O>tWup3gf(n>bRc z^UR;!i080?TKri$&nto{J1^HZjsv~jes*I%cD_rVd;40>_EdN$Z(nvK5vOMvnP(Kk zjvu?Tnfn1Z!j%@8j?XgM^Fm>az>9Ng?vV@gsYMP7|gHy zAo*G5y`{uT7gE(DC6cQ2KWV8fzYG=*$-!tP&?;(5!G~dSLo1K#3&(DwTda`4N-~if z)pKLIF`Cs3J)4wIMl~go0GNQEq9BOAz#9@Pe;`FoZjTybc1V7z_gvBE1|rFi*@3yC znYdD3CG%8a%%Ei96~X+=HrZ*xHA23T{3_|0&5$OTpa=UWHr|t~6m!Gj}z+1uL+XgqKaAP+5b;CVYXt zB>ZT>cQ{;wUoDu2m0id-HB&pA)SQ;^RpCD9!u>~xUiO~sSg6-Wz(s0&8+jo7FU1|4LFPF0CGP>N91iM$h1D7Z0nomMjQ z4ZHk~S%(9CMjr~(_v>O^qA!pVjYSrpLu3-08(}0zBeH(FST(K=C$E~Qaj+x%j;wPA z`$_Y_&%qHeD#sFbU83{}(t)lJ(!=k|bR^+28W$FigpftZ=jn8mV34B7#CVNi@l~9$1JTGLcX}4ufM=*Heb_JG&Q z-a<9+RjLK&;&r!CD<7O}lv#UWM{}K4*%fi-gXT6eto?iEf=I7niiK&$GmOtLKFhok zdhMfAUU90j11u}C_7+-se`ZmiW_ZV<4BJn$ZzuLM%$tuZCMEz*T{<+h$w`27@YB#z OsUT1f{XhQa6Zi|61CWvc diff --git a/examples/spacetaxi/generated/dos/levels/level21.dat b/examples/spacetaxi/generated/dos/levels/level21.dat deleted file mode 100644 index 7d6c4c99512cbf448abcca49e806e76130ea2b0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2941 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 H{E_(u4GZeo diff --git a/examples/spacetaxi/generated/dos/levels/level24.dat b/examples/spacetaxi/generated/dos/levels/level24.dat deleted file mode 100644 index 13dca31b4b3937c07b17df8bd08a25a41909d135..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmb_e&rcIk5Pq%fF3=`c6N5LFzW_+Q%LT%riU~yEWciVbsA!WKk>tUthXNZQCgP#5 zCQUe$q>Ja{0{5N>*OX5QN$?b3yVU(%iTX1#fE-`^4Bl2kT%uI_KECBzwPuHmhtw*&VdI>@3N?enFd6 zc1PI)+6GtwJO%`u;8FVt0&?W2+;@sNB4^T*qKtG7(zn0+Tm{s6qW)*qquKjsQwDW_+ zpVV2ASBkuvIFF<#RuMdLEm>Tw6!`5YH@5Bl7Ex`n*EO-B*<-pG*KN}fU534XB&tXD z`mxwJw#RB>yk?sxqU+?~cY!AkJ{GwBfeXlmM94CYa$Ggszd$Q4-ooLib4M8VMaGp`9nEKWERs z^;D^Xz8%`xr?%Tw+g+2*!&5=@cPTo8qFYgPDFSC~-s~$e^X<~b%7 diff --git a/examples/spacetaxi/generated/dos/levels/title.dat b/examples/spacetaxi/generated/dos/levels/title.dat deleted file mode 100644 index 83ca545328d4c48b3b960ce6b48517eb6f470f02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmb`JPiP!f9LL|x?99$gw%NLWO4c0u@J~?Cq9|o8D5;uY>yT{sPl~1LM2f`Y2ssGu zTMrHOknKfK%d)6FbxJoB=_TM^LMa+z-9teHQBPJ64T}enf~>#adv7*xveo9`FPk^- z{od#I{e9n?B&1UHo~1lWwNt0OnX*_=B0^7EmT7)XJ|^Ua0x1v+(%J#-a8)Z_*DP&n zOMC1(Y~I)+A8nAsWMPXuvq7fFY?VB`Atmnn@ZZ`~EWXaIorR!$faO_C4KsX2-{72> z;|SkSAX!m?Rg%MMDZzy}id8(XaF~)>Q${kImXc?I-Et^?0bHGdtg;j2t zyvGE&+=NMy0Xstx8bcWg>O0z~fV`iU_HF3R{=TFXY(izX@GI=BCq{jss=Vp(U zXXuNyYIS~&=F(I*lg{`dt_WNyucw@>t(e~NHyy>B(LKW*kHl9>CgPOTJ*TH5Wqghh zmHFA~$)jMJYI_X_{$yA-1koYz?}v^lzQ93uFf@%omhU*2(FuHD!V7RE133rwP>C1w zQRf6t3puU_9M|O41V`kc&xoF|fdr_cIVq0$9e=3D0}mmmQ6^dne+Wop;xw=g#{ttZ zjxUhJZ3*HP!1pKz-ta!8Bbe^yhMqXbCAlha!!5X%NLlLbw2u2ri5UCWkbt7+$dvLR z(YD$bTJj50hsaf&OKFN0Orb)83b%{l6%iJlS8Wxa5B1`mMpm*jyk9~_Hsc9wjz0(S z?8u5M0;g<1D(+7CC6gOK!z{Wk{v`N2A!B&qQ9^mfq!nf5E(L9nXqS));`{zZHzds} zYvVg~ z43}uGl}x%x$2K%;;3k}b>*xbwI|I{6S_24K781WxWqrf@fpyLVea-Kbg8rk$-!<30 z941y4yN|F->v`5secJR`Xu&bPFWGN57JI+?oz38L)4iJbuy@yAtui>c3kS#J{S}%Q zz6jt_Dy&&!H)|}+G#6OdTUiR($~*MQY3P>A5%R#*KGn7t7<@VltZCnBCU0$5Sf|1s zPlA>08Ut_KOS8VZ1wY>fBpF5x98*e zaQplBj9{?WXae>ppn zvYX?txHgA-xoZo0qmeJ?P5FZht08uNmtE!JDsK+9SNb{2ZsyOC0Ly?6ny`FQoYv7< z&@?`|Z??%&_Yay8Gv4%;qhz1(kx%BcTOJ6>T|b7arvu`jwu!~OTg_Ka#Cbh(T1TVP zQ1ss~R9^EEa1pFzIL9PJ#_4O|&8foSEP2ogSqBOlU32!F`#AUsUiq3S4w<-Of2~W2 zHPdS30AGs_>)BYUALldW*LmqrAE?;=s(ZI?`z;e&HqXIg^5=V{`>hoAC%KbGV^PjM z*SNTp{lYI7xAG@Ri-(18Q0lgxFP!Oeq?roHZrQGV5SIPoZ{0%Q^4NngU=64(+Om($ zNBpPUNjUrmCDiWbcYE!hka+kHdOma3{!wV-}`MfBYW5 zVZmP&FYh<;xz1u-BpiToi=Z~h{q8)3`uGx4;^9nYyx8ACAMvTubuW+KeaZRt!eMgH zy@k8^j~G!{`QO=P=D4t*a?dv>%RS47;u|IX*kU*`jxk&oD4d^WencOBX=iQ|k3!}}r7hnyRACYeLL?MwNK zyzIW2|7ySC*Z9q#6n-IgElTI#HFD%~HMrk(NS89>YXewL&w2C@s|z&;i58B#(o-T^PU%{x z!Lx*J1-oU}ZljmIhVR0^IB9rc1ye4H06(~^ExFQPyJ#F(xq`Dfnra4LhYs}oK z8s?5o{3KR(An+QYFJC{L*9C0loMhyC|5!&Q*Kyfu2n}4C<=T=ycq=}EYs8#N6Cy3qKd#|tKkV|xFqNftdqo79gDKTHARr%X) z;+1YLo#=LJ?OtEUA-5mN*BHke64Htj)5r2+%hjjj>ZtlkfiUBLh>I2P`z-lC=rh|l#g7a}$QYaqaCa@%`6Kvyee3Ge>@a;wRNCljrIv^B+rPFB^Ecs$yZ zA5JLv#3`fsVV?$BtXD*;8}!&;^20K^ZLiV49j0c?cv1ZrUt}2}P5_=$gJR2^UDu?) z0bzw)hlE&PREkD6Sb1VRR*L^@I-8vD+~&ZXt51EYQGjMER7NU9+t$t1@~uLqdjtim zF-1@L<2@no3fh8}vPViKtK3OZ5-j(5VBd1arGp+FIb>pZ4B0n8_HB+wJJ@?tacmAO z^SL&3`@0*J9X>Sx@UbRDHWLFSwbvm;h9%bBj7)f>hiuTo)&~tYbZ_OZ0?CN!wC^N2 z0^_zERgOVjW}HkoT;x(Szw*ENE&JHwS~{EGl5Zc=Kk;5aXtGD{^{x5r%1hRglN%A8 zozha-W9iZ$9j%hHVMiaCI>iJ{N#1l4q6Pw~1u*xFbdDy%qU;oToFZwi0OVFHKHMD+ z8MjO9TOltLI(KxMhAgQiWZxThue#jvOVe2KF=>#?`PMmx5d@z$L4-@vv}G(E?$<~_4D#|U1N?vhre5|kZu@y z-Cd`yQ`f1Rx1twK7e@^0ykJo0&^F~fQ`5I3^n_OCvENU@%FvhZS2pt6qDp?bryQiyncYm9Pg5StX{qlKWJxz{e>1n1XrM<=PdNxf&*}s+ydTvW1A!jq(=HTvUly- znce;3`^US>S=-LKw6BY+<;VHW@_l}N_PKso-p-%bPxIHscJ;D&Th*N3@0%0tXy&Ht z+NN*2sYmDOrKbLQod|EdNasrfRm#dkPE()O>z;Kqs9Akdl-7HX3g&j$JC>%jzU}|A zn1WtlzqTjWyDVNeO=(F{WEdyS`|uvL`=ec!uUiUqIZMm2^I9+Zu61qb^62OBy$dVo z3I0#2&)BWNj{71I2zn?aWsOv3b$I7RtBQuTEtjjLrt z*_1OiZ@OGdm3?_ZT?daYI2NfiKaC|cR2B^Z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 Z009ILKmY**5I_I{1Q0*~0R;Y;z&GRNEaU(H diff --git a/examples/spacetaxi/generated/dos/tiles/tilebank0.tbk b/examples/spacetaxi/generated/dos/tiles/tilebank0.tbk deleted file mode 100644 index 5b8edfc35dd9fcf11056ff0c1167a1d7b5a84276..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32044 zcmeIuv1-C#7zNN2MTM4zK1y+Pk&>x%-7;rwH%B|hsjEJRV`euWqGKPR;Fx}YiwFU; z7te*{av^_6&hyLD|2=d0UR9&& zbfu@xtE$p2ieYiO(mt=ENIMSqCJy&z8A&g=)DMw5a;ej~zNBvy0t5&UAaHF0i^Jkj z?#q4DBC71}X4*`5v)wGJiQ0Adw%*p8^=2KljoNf~yKI-o)o~ToMjgBR+PwWQ0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs a0RjXF5FkK+009C72oNAZfB=F2B=7^rL7a2| diff --git a/examples/spacetaxi/generated/iigs/font.tbk b/examples/spacetaxi/generated/iigs/font.tbk deleted file mode 100644 index f9883f49152c41cc25ee12c340e82484eb7a9a01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32044 zcmeH|J&x2s5QS~A!_I00?4uwO$PghRf-4Y_a~5)L!2!6+-eP&Ls;k{L9uXsbJ@WM5 zt5?-udv-s5{_y&4etI!Qdw%ui`s?Mp>(9&EyWfwWuJ12jAHQ6_-#&-Ez>ejbM5wiU8P$!)w3>^EbBCDF?x@^zskiL3+3m&`FEp} z!K&sMWtH=~Icn^+@{8m*{aP-kt|yDhj9%;WCh*+D)=a>;dOdlX+Rk`MbS|I!-)Ae$ zki%vXzq#HXRs5!qlNa}0Y@1))q3%Ek>yzxHC@9Twa(uEMfxG-6(pUL;K8|ng zTjL|?R}uPFUaUpDfp5*{@T~gUX-G9KK4}!|7Pa$bQI$mNXEj=Xs}=va4+Xb+EVorW z1IxUx!7TPRZNI;eG>7Kh`0mbM=g9k1P}EcY#jy2NP;I;a%UfBRN69^}`;Qtb-U2sY zL5X+yOHiAwKl<Es!_kvMNhsxQJ21sweRY;=y#)N5-XzvMe+PB`fZY|ldx^7IKQyn^C*F-i0h%Va{GSoCAw2wh zTw`(EAN-YD@5)d@)bA^CUU!H3MlZ$?fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| bfB*y_009U<00Izz00bZa0SG|geGxP=6c?FCyMiarfbpazn;)m@WqcrS9QO!PN*xpeXzTU*E9)^vJJ& zs+K*WwSrZJZRNI@)0rHzc;Hsma~5s8fx|-WWEKhOMaA{9OmsiU3!Hn6@wS8HLEK;J z`9SkE%uVa!Ni+UY{)E>xq-*5%;@~q{j@fvizSo=cDWi^S+cDuc(Fp}&Y-Obx(!_j=4 ziXt(q^kIM6)=euqrz7ME#orTUJpRHP^R_k^_XiVL!ht_`m<$y4*|gqY3hUYxSu{wSw$;BJ!zZz>o!X(;r?W6 z+3I3dbRg)V%PZ>Pu)n%qE|Pp21J8Kg{B8*mJC$jrzXCb@Crdiyfy_!_(&M}w8XS*+ zdC>##YNY6mFAz*zS`OxL;zm)d#m}5vsBxU2RxgSeUnxz;`-}Iw!D%1iczph>J*k`Y yLsjW|b=cdcv?;t9rA(={J`Gly;V@+}Ek;p%=aLztb;<%fvZegdJ8s}VHt++Ni0Fd= diff --git a/examples/spacetaxi/generated/iigs/levels/level02.dat b/examples/spacetaxi/generated/iigs/levels/level02.dat deleted file mode 100644 index dbebde54cfb5666c5d7580175e47678faa75eb5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmeH}O>PrG5QWPV_Y9*pi`-x&q?~{Y@M9DSlnq%DDxQ`cK@a7=z}Y9XF18v;rvj^lJFNqsetnbx>I81n)nZgrcSH+LLz z(OvIFZylVmpfhP{@Zw-orQVlyIQTD1}tEo~F)Cl3+oZNuNv9M0TpDJ(C^k z3fU#Hz;L3hKO=~yDkJ~Nai0G&{*C7`YmC&Ab=orQ`kOw*gz_GjN1s61ajS z6FEobmr8@HJxI=QIOJqKRZbj(&J{(09cmP@ICzxiy28}}g;Q9+Kp{PP>^K2aUo^{% znX8$Dq`&AWiTm=@2e{afliw+Wef2m@oGT%YWbDVj%aw{TXeo;`uEg6lo6TzeB&E3W xSd4P|?M$cq0=SC1yq8ot?`^evKakB|KK>~cg{|`c2*;xC2JeEq8@P=d_yZFt4gUZD diff --git a/examples/spacetaxi/generated/iigs/levels/level03.dat b/examples/spacetaxi/generated/iigs/levels/level03.dat deleted file mode 100644 index 41ae91bbb408052b501566bdb8013a845b3f593c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmd^BO=uHA6rLS3`7tRL5segNuRRDJya^?uEd_fhtrrXGrj6^S{**{*r7+vnn${mu z?WtY@5~y^8DYo=dOFYybOuYmZ4}wzaQ7A=kJp|v(?(A+hwtDcSA7SUc_kH`lnYWve z?(-cdWrpr^7v%0UU8g%+yI6`$;DFyx$Wv56=xif8h%hT3MnehIw2E4gx`a-xqF3n4 z653cp6X@9*8ec_KsVyPJ)=Y=rUzJ`D;#UFn)r)LjzsIHjO{X$k<5yLk@(kz^)CWv1 z>xSylsV*`tVhHMWP_zXgwBmZ5FsWS=zwVo6KJf9{*lJZYGVS)zIeUU=Zyodcn|+-< zPO0j3n7aKm`c?G?{8_3zLv8+717Dtmmdkk^eiLu zj5y->@jLy(4+$e!S&{2F%eQFjh(|}*Tr8IOED%W|0gQ1_AOP>2!vbxBRo!1cLSUK2;H6`zZu&}O`M)mn4x4^AEpMXj- zksZ>r!@4n)(F{G4l#je0#W;Myfk7_8si(u1A#t?i8+eg}u7 zou*xN9cBQtvv3Adc3+0=5nMFzNA!LOZ2;l@6_^?L1mC{E2Lr!EdKG>eabEO?;+%mS zaQGQ^nSbFU{5H^o{&(0kq9^)a#irT2*TDV*0(o;B29f>ST-ULfgx)*<&dU+;>Ch*M z=c`3@hR+bob2Z&;93u0nwXX5PK*L@kkNSI#7@vz*rv9vM{@6F>quwfcx;_w3D6DLp zy|ubacv??fzyHbOO}?ZLj{{N<29M1qtVEEt3i-~?5U!14s8NCyWMUrq+&?IfRy1|&5rR%h~TL)o>B>b zr>P`7SJO@E2+pV)FAOy774lA7&|KV~cS9(6g;a5U0QNu-XqW|$64HSMfRw=dSjGdD z+I|=FsQe{7*C~CIY^i%(FK!U_n|a`L7dBJyxFZLr)$E=wF851FW6g9NWKnFCr|7OF z?!H*XSU$yh5&fl7636REh#}ZB5Ex WvLM-0MO(0EVM5A@eKLWSPv9@&{us;v diff --git a/examples/spacetaxi/generated/iigs/levels/level05.dat b/examples/spacetaxi/generated/iigs/levels/level05.dat deleted file mode 100644 index 02e66bed022342e2e1bbdd8a862150d75e1ec75d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmeHH&ubGw6rNo=i9-$|Z6G3)?H}OHgF+9f&|VB)S`b3jRUszUlLVCD?5$9-n{(4h zD?Nx468{0kL-Ejnh{U%36^5QXc=EkBvzys&e|QkR^kdoC_r33Z@6GHc^9!Xb9^(4! z%+2|QnbHl4JjMhAxY=!q~vSe+c&;0@CblJ=tmZJO4npyZ3s ze~S-Nfca9~-AasVwK5wAjYeax0?Y`{;IaO+UMJT6T~v^Xvpj_?AVqR6jsvq3oJW5k zu-XYB5~1a16_AADsMOK{g(<;cI82|SW2hqy7DY( zJk5YQdNAeqZ1xce$r*H7X5FoQAWH{HeXUu**6cU7J4pxX6Lr*`<{Rmv`Sd17<#>M9 zv^1hVKdjIh>Zf&3Xgo1(&V_W806q0Z|FkaA2mNRaqr+!&F4UQF;F9#y7WT-fLpC`d zZCCqgqo~&*KRqS&H9BntZV{EIA>z<2{<+&V>vyj$6Ht`-fcimBT zjE3+5$_a%G%TlqhC6ybtr5X>{q?!!ZWiS7v?;JS3nuEaa3E3B49lzI<{T!@A5Uk7o zEfg>i3|q3-l6`(KRj5sLy5KSJUIehNtf+~rKU%Uwgm*3Qf!w;-Ys*6IQ6$+qPw^7O zpeU8G5bO%Id`EqcL~307>;d5qg~Y3j7ft_VO~%)-E#XqHm#ZpRu6dV>esd#O-3+`- g#djM)cQa7jn=JZ_O;0m6<^9Y!=CzzHfA<7_11l4gYybcN diff --git a/examples/spacetaxi/generated/iigs/levels/level06.dat b/examples/spacetaxi/generated/iigs/levels/level06.dat deleted file mode 100644 index f744d27973171ecde067cacb3a0f07a4f42bd380..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2813 zcmeHH&1(}u6rWAHSwk*@^eS6=svvmqAP7>y4+N`%MLhVCq;ZUB3kwOB;FzSa;AIY8 zJxY7n!u}KDB{vgI^YKT796edzo0*-RB-^G!@zft-=FNM*`Mrn zz0YN3^VS!q$ZOV{^*MU4sK6$rr}{UA)obetA1`}tur<^(yFMLC7E=AfZ?TEH+&9*KD1j7kG*@`QJhCpAP=YDiu*K5-v-Myf1I4;ceN1RLLnZC5mC8m(2*s!2w6}QUZ7jc?mD& zlq=4QnN_xUlO9o#dQU}pF+o|1hbLK|@E@r+%`>MaZ(>SWk1F_>UZT)~f^Av019QNy zLBO$dIa@~|EP-D0nkb{Ci4{Cxal-1fCFSf|}m6dwy(v{_4-!BIr z{WtFA)!=Xq3LP-mq1quE4cL$L2$Z{QY`3 diff --git a/examples/spacetaxi/generated/iigs/levels/level07.dat b/examples/spacetaxi/generated/iigs/levels/level07.dat deleted file mode 100644 index 0eb4025aa5dd7be0ba68be67b8dbbf7b0dd6fd6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3005 zcmd^9O=whC6h80Gym_Xv31SctDT9SV7TvUxRgi3wg^oYe&_xz9q-~N~f4CA+0{3MS z$<7E;ILKcM=I=GWAIuL>jjjc>#=)#qB=|Tc7nvFl_ocr^BGRE0^k~#1EeCIpg zy>FPaqm`p&veDtn@R`$Jjh^MK46ql_{IFCCf@Qc1@by9HgAx@7;M@iHauq&~C-Xs@LNUOncp{@Grdn$%Fd@?ZhTKHLcA0$w`jP!&b}Xd_lw7)NRAixYPxj zGsBloPN0-p#vG1NJguLGY$so80WqP` zQZyInv~8t5Zs%>k3ukw^6?zMv>H=N4vz=Pn>C?k*2pKM#`_Tt`kDqWhH8nBpl9`#A zkqN9Mb{)g%Ytz$Qb?Y#gpo;5;omy97(A5=&oYDic#KJKBMby@qv0{lWxW2Tu}l(X%nTSZE+%JToF3QHI(DO$ z$Ka@rd{&6_I4rQ=6XG!}SX5cDcQ~D+&rQVbwf`NeA2tyK(05Ro;4$YM)lCaiG>^bt#OC_1{EXtN$#TPi6h8X#OYb z3!?d4)}@HO`l48S=C_{4pf;p>BC7yzYIE~9=I4<2$oZpRtT4al(PQw|?ZFd`N21?r zdDYlci=qlIAZkF=UuYe9u^}59@?ohJFxhf*Q>tHtx-HZlq3S~YDjHAZR-y7JYOIO= zZK43Ai2HDD<@adGFLw>~dt1GYMY;9S!_tp_94uF^L`wnIm;YIptzfO?F9nP1a;^C? zQdflSeS}u7rrllJ`|5Bf3_{?u|Mnn y8~&^cH`Sg^M4lIqQMWm8<#;r5ePin;-^$2?2ZP@}9~%SMSKIF6E8_YGvZy_EN;eegC5OF)QZ&T6he8oVJy|_8EFPp3+Vy?EpP6r(szk(hhxy*0 z=Y8IvZ+BrKVucF67rHNCIKu#Xi zRCH=4Qs=l%uA-)y+rfq5yP;@BBgpuUh2dMs_HXKHtstSYr4kAr%6hnH1L*Ljr37v5i3;NE0vXhC4#y#z2owA7 zaH*oW#5G&CKK;~G)@0TBqMa1i1M;5Y@oI8InO zpNh)0U@q@Z`SVQ*kBtNKS@`}6_rcrY{XsEJOtYeiQ4mWLjuT}7Zx|ULF${p=JcNLP zIDP@pEZ}fZ5hDa}f&hVl<0*Uv8V+p3%Ca1e!z>*KVSMh#DRM%9Pl>=uLPzj%E@YH- z1)l?a{CY5z&!ITfyaI>w3LMaJoScO3MJ)!_BKHEl%Dv=^F02`GnLOZ!^%pM1VNz<^ zaMu~TZH|qZSro!T&}*uZ@Wiir9<}MIDj_EcxyK(+z}%JuL2%AZNm6IsNw)sbopW|d zyPrqhGf{e~`)SnwF7CFX{*Ac16!m|KyK%Jsb7}BH05#^9e>5(OS`?4?^y&EWxM_~> z*!AetzI{{1*!a$!_>95DQuy#!r`76o@M(2Ku6(~b{i083sce?YM%g9QwQSq9ol2Qn zBiC?7u2UM3iZe1D+Zut$w3GzBIvbY#?^$m?8q%Owi-u2Df1|E@AvKnc_Mc$qS0~wU z{IkSosRd*DU$I}W9v%D=^wy&&>#KZD?h)!Js$ZOESY! zBRR~zZLmSvKiOWHVf`w5w(LFD-kf3A4zt0nAgS?IU%ML*owQuN)nNV$?Oubuyjo%3 zbcQ>cdp^7wUs(M;KJUNYZm!hWo*48#_|EKR%Mh}PduS-)!FY-{K?FSr9z;BN@t}3)ee6e*Xay0$NxC!d_kQ!6nYWv=1B3mC z9J0eFjtva-9X)YGtQ?TWtW?UfYET2Xyd8Exg5ZPDHwgQmlE0z+L-O~a{tWIuHFg>Y z9~!;S$lp+Y5WSLYaW2}#P{dB3L(4^gp%QUi4?pgN?62*$Bq^?YrtNkFJSzm<2+|>x zbvtZEU~0|XpdK+VbesfdEf9n3-=D+1*y)ax+^cekKR(As&)M6^{rJuM=3eSN@0GtY zFUKmE@ozHn^f?Zd*7KeZw!#D8c}b_|)N_Z0DK|WP-pxw{uX<0M3#p=wjJQW+gxB%$ z@jgOAyN==Lwb4<5M!OQ3!LChaM$JNtu1!I)E&SMarqw_}wxZa!{$~>BYF;KI1+|uB zhg`9iOCmDjX+;P{B&K+bn2Ln#2tTGyEN!GJv!hqND?C;c1>5jMjv^BY%e2*_DgZ=e z(f*<(1w~$vgr?@`KRVBo+Dwb*ilSl_mD+P_|(!x`g z=U%XymosRDr13C7B3e+9?1Ia8gNVzGP&BK3kfRw)5+aw~LZ7#MIBxAn*{z4*`%T+BODoea_yWq3RgTjlqtobSDug&)~bAfs` zh~mMNSDL&z^kwLavBtiar)Os8W@o1T#QY+EyvSFU_~+dXqnYTxRctVH^`Z~+OZ?L! zf3(OO>E`QPb<)kzgW&Y2eQ>fkUUYuf%>-;S<195fKu1jq_MKfcjXPtZrbcT9QjF0Z zCzoxrNm|wiOnUr?Wwrx0^RyhgY%3!<6s&vU;t&>+;+jI9yNYAiUBKJj`p% zDI!pp*OM=YTWXL-MFPgOSb2`byIXm8<2CAdjgQ=wFX!FE`+hL6A00Jb6~NTgRF8p3 z-6nB6@!`Y-N4*g_wIEM;m5^y@Ay83b2O0Ps3V#;44;H^87Hi-Mr$ZJ;{)7|UU|ysi zis!`eJ>G;W7*D{V%^`Vk2p%sZhVyG|v>~a}o6@{?e=mFn?0)#CA%Z#S*to^4n(~;N zF?>7`Bd|d==lPx_UYBs3>+y(M4ke`4=m~7e= z<01pZLGCT6eJj!!m7Yu=i>Ep|-;8zk-$OrB*N1m;fKK)yzroR4mB?kAJPj}&$Uhra zxd^s{;v{JCMC)d^_BkGaL@QB!9BzU7gPokURj}t8_3Z!&fYbaF)ip`eS|Z1xZIY-j z6+n_J5Fdw4NX*)wMC=6EIY0p~654PCI-IxxCjmiB-zI|!8ihzjZyN_SjSy5=1NbF& zRj;I>a*^qAa*yB(9N$ozA?#K_3j<^dWCfz_Ag39O){kE**#)3FtXy)~ECed>+Qd+g zhPC;OU>F?;%)1!&e6XdlkC1i24aD*ccLsJq2ozW0XhR4TPm&5=7hL^QJPJEB8Y&AA z3+sCcMg1b9_i#<7QR$q2#&=*8+%q+s{U1ym|&*3Y@+n0Rg&qW z`jvgFbSF1j%I40|=k#y)tU?JxlC?^X*aFhFje)n%uegtQ2DchR{s5ZB=v%|HdMS| zu4Rfjvt+Z99xrCi5-DCWvB=a3Yh&5$BZxmss_MqNMIY8n1nXsT_(6xHy-0m)>tr)Oq%E|*`pxOi#lg1P?kr2JeJRkx{m`Lx1hqgLTR3#3;&&ZpN}lV#)et- z;b1VhVlY$Kb9DR9`hCuZT^Y*wszQsc9ponj|@ z6qn$`AXjv4Jv?S;c#(KsJ!P!n^rkA)fpC100F{zlr|Tz8GgNdtlYLI!xw( za|ux;MO-fd$!ML4vAiu{nL!F|nf7HV8@ml%J+n(~e}t&LL?oE}c97=^*zyC(g+Y9Onl90fnI- Am;e9( diff --git a/examples/spacetaxi/generated/iigs/levels/level12.dat b/examples/spacetaxi/generated/iigs/levels/level12.dat deleted file mode 100644 index 50b1b33da5a0db562634a96ef2aae124c770bcdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3005 zcmd^9PiP!v6n`_jv$IPqZd=f_#WD!elh8vCQK6Z(G>y8!gWlA1HZIdm)apq3$G|r` zNwd()$j1Dk1bPVsI%10LO-o^kIanLYf+D>L0skO~%Yq={p`Y)~%r`r`!zQO(+P6FN zz4v~9-nZWj`{rAPV;aTD!iiI_Yr}68PWvT5UmpO-Y9^CWN^l-v=pY<~6!yS`&o<$` zb$9^(Y{I`A(qU<+ARSt#brx5629D2yzCmk&)*Zqa>x$wzjAZv+e`7n|Mt6s2?=*PS zG|f-(n(0Mk2!4py?(DDE)TqBp=Mwq%O6XiZ+UZ=*KY{16YwrQQXzz;?r{V)q&@&o+ zr`C>Xv(lreokdX?<+6EN-!#dKj4&ZeFg)A<7O@}cvhuOemFkWlaQj9F+Epm&Fce8r zR9Tj@B2=ZXuZe}R9Vp63qmS;;owh?CCe zN#Lt+^{omzWI!JM4jwuCDqo>e^f|J@mb%@`2RxGC+g)@h}XJ;|1=DqXr*Y zVAyNUvqq}9z}7CHWUXqwW){7-Q6uzEk$#c%OG3ZMsKG~;81|Zrq+epjYB8UAl~;?u z7l-_hQL%46`$a}G)rq;HarX|pK@4vWDL21iSpVE)tv$H*vtQWtJFGBm zd-C<$xLYcIvI!ZNFu#{-9k}uJpE%)u;8E5N>no~uRL2>}zRd*SX=pBxl`LYn*!PY9 PJaz3BGvW{C@yh=PC6oI< diff --git a/examples/spacetaxi/generated/iigs/levels/level13.dat b/examples/spacetaxi/generated/iigs/levels/level13.dat deleted file mode 100644 index 3eb8f9da136d0e2b9cbdba81a9d5991030aa7569..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmeHH&1w`u5Uv@W9p?w~074k>?9KC%RTC8!gk%LzA_U50{ntU`9yGaln>Sd*H^>7B z9+rIuUqJ9N#H#A*>7GB>gXkq6%v4u>Usu=Hv+TiadZU;<*uQ!I`mMW@{X4t2i`nGi zy#inagfJeB(qsbX0OLK_F~#rjV+r3@@C$yg;pYk-!Min_tl=|!S;E(KupNw-!H&dI zo+tp5w${J420XFTCs zdORQVs`7;F;}xqqd#lr`>J)o)MURZm?QAWo({4?5AAP33AL57F$GpN9SP}3ksu}k2 zvgL!E3Pjp)-JVZ{68upHb?v)p`K3mrFzD|`v*B|c%;@kLrS{9%ek7|K*@jY5A>tu} zo%ZXhW1_De^35oYj&Rqmaj{tJAyphsXj#55OR4&^BUfrR?I0#}ifNh*0em7&`439r z6G_t2)ua*EX(G8zo97Z`3F^nNX_{U#Fa_bfSCS~*>}Pj(O!}(x$e=KxU$uwTBensT#a&!GE2l{SSB9ZE(FyI2MOjGG+ znJv38QBxVl)76cfnoG7{#9(Sbmk^ytX>?f;1wjszKkET(#j=rTepC8-;ctW`_B8^aOj0&)J*VjJTd}$gL4*SFCIcD&|q)1--qZAn|>QVG0 z7r#^g63sXvo4kCJJQ<62M6Wtl7TJTJ`(x4P|?}1HS>yh!max diff --git a/examples/spacetaxi/generated/iigs/levels/level15.dat b/examples/spacetaxi/generated/iigs/levels/level15.dat deleted file mode 100644 index 7607e7d5f1a4666d13c740c55331cc4e762fd932..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmeHHzi-n(6h1e;bF7L|1WZWCEJ&zQ7AodS5EP^eB-#;zq2;iH#1sh>;rs{5oW)C~ z7|Hwxw=mTRMU083Oo*v4G4tNtIX{To1VPm$pX7VK_ddV(-Mc&Q?eA_oi1Kdv?*8LP z5AN;BDN$In7&DARQZmT)Wpb4i(0zwI{6cPj(v*KT?u$S0{1sr{`&0^BI8@Jz$KNjn zzS5Vwht*a8^84}^=cUH^YtH@LJejllT<)(ToWN6T|Lz6~psvXrNbJQe6&@+$6d|i0iuDLc0@u>;$6L>8P9 zHmk&TiWHlLMJDVtET)=LO1)NzLCVC$Y(A~T{t&4?4LvISVdxDtwLSD&Z5l_AEt1(H r7WSBk(y*6h>qE9abFb4Y7pZ;WQr8lrty*)m^?CD`t5?1<=h=bZXissC diff --git a/examples/spacetaxi/generated/iigs/levels/level16.dat b/examples/spacetaxi/generated/iigs/levels/level16.dat deleted file mode 100644 index 11f416df153d6ea08842786a48d1896c41c4dc87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3197 zcmds3PiP!v6o23B&g{$v>O@Tygvk(kh=?~21&fT54Mf(9=2U6iB+WKOJq$!r0<$xj z?GzPKyd))(#jsFt3M;*OSdrpoYYsVi@t|jsbPHlFJ*@A0-_Ex)lS;Mr)W`C^_kQp9 z{(avj?0fUo*KCrvs&i-0zWMHq@BqdDMJZ`op>Q5f0lYl{6QDs6U;!Ej@cu3M3I05Q zzkXmAd*gt;bc^#JM`}wsS-gO996cu{dz4;yx_Ep4Zr{D#FCRe^_mbxwFaJxFrxlzG%dAZTTxrCMw6Q6EA#iNI)la@-lS>E!p z4A{$@Tqi9y6fe3^Z#J8Cl+Q)6&*}n@t~5AlC?6(h#@lOKjfU2hc*`x!8k>kmrNRX~Ue&S~PVkik< zJuZox<%t*(gi2^ejwkWFG32STL7pId5InrDhsQZe6L10`J6kZ5Mav)$`J9)MtVgbWb^wUzLd&H3`TK)ylZ4|hP)>vYH=ty zfm%`&MNg!pj*X3?!vT?mXzp91D5K~zr9f;hv=Roml5!(}8GswW#-ViQd(>znf;f+c znUu{@eh4aa6bRIcqlY%DK=HIQd8dyWZA1{~QRYCHP9hr%mtnsMPC48kXQpUkn&t5KL{(JP*@4n5Y$S zE`JKP$$u%~M=1kN=9JBV(@At_^L!K&bg;RB!lrbGPjw245vB#i;62PK>O`bO**Hf^ z99>~aAqSKz0pOQqIAMw=P2G{EG)xG@N{G~IwfIc58aJYg_Nz{CwsyRuZSSyfwBvOwbxzx|)Q-nbPwlL0c&=-m zAKhrBUD8%=>b&T^YNgTj+}`Og?siZ5J*EF!tnj8`>za%0Pxx`so^Y;O{x_CiH5!8f zz-H~c=UBTSFih%OJ$6{A-fZ*~JZ?8=>LbhVSbk4G{JGXXBc}enJwPK`j3HWz&SSkU z^P^>3bFMG8K5?%vwIVkTc-t3Ro*T2)RTl@Tt~9#W+&PB$%dD?;?>FpcotWWF7&)5s zJCi=*1x`ERzj%@1#67iN{`yYNKEzcPm-qF zG}#@om$smzu(Xg_Oh`*FHLNT#2pcbJyLeC(sUQ-e2EA3;^}T=QpP9^VRu6iSK7Ri9 z-uK@3y|;fh`{I$&CsnlP4jsuH9?l%j9C{{0IY1Af$?@*)MEn9=2N)iNK~M;sf(xI( zr49H9KC8nA>+m=XUxr85;S2cbL-=_^+AHn5EbU*H9+39crTrW5Jv8d@?K>ofF5C@kFD$w;!h4Ul5Hw=+uA80kK*RNKdZ}>P ztez1u`C%QAz}~@d^3>!cM?<@-Iw5{lX|Xt33#jnlnD7ro`}khpfA}sknkV1!ojdmh zRX?J@mlhu&fObY=g?4>m%0>8mv{z(-@mV;_vY9_k%L4d7FS80{b3cpLMhydcL(7}}3Y?O~p2S|d>ul&X!LdG7! zKi!^xAPs-?L9<3T#;Ay#@DcpE7Jdwdo`s>O;m>|(enmINh@@g|`Da@A07HDeCP1?S zc;hHU!ox%R=i2a*fQQKZxaltZvr#^0b~U%dhlCIhOJK@vKFW7@<0}7T{<${%UVv$k z4pyXQ1#gT2k??SL24^lr_^}kkdZF)m= z7k<7ye~W+f8shu6`}YSl&1qT>*R*21yv6J}bLqx!%)V$i-S)>u`6jd9Hp<^HJ7<({ zGn*NXWWQ%@{vg+GYB+e{XzA`#-U1T(`HRyh@wM>hDb}5snLRysCUJywbf$7y$IMNrkEOHP_&C5U{4Pt997}x8M#{HX zDXTt|cI4b~^^!UIig{&hV4|KIyK?;eF|EADmZ-xyk1Z>oGR(ib!?yRJA7DQ+dyS3G znvQH=W4JLUUz=3HkFmz8UE708H-5nhU%DDub#J;DSD#4Z4D7zfM8Q!}TvUn)tX*ZB QwYyGy`6|=s?f#$k7aEx~yZ`_I diff --git a/examples/spacetaxi/generated/iigs/levels/level18.dat b/examples/spacetaxi/generated/iigs/levels/level18.dat deleted file mode 100644 index b682e46e550fc6503224c59e6f721d3bafc90ac9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmeHHJ8l#~5bfFN*=AT+nH$U@2ylXA39n=cA{3$#+x~YoDq+&v)4xLY2e@9_!+6~7b_+{P!h70o-)*Z_N Ffg6$c9^L=| diff --git a/examples/spacetaxi/generated/iigs/levels/level19.dat b/examples/spacetaxi/generated/iigs/levels/level19.dat deleted file mode 100644 index 7a9076126fb30a6749800a89cb49b90ef359bf92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmd^9O=uHA6n?wSHi=2G6wydQ_S%Es!JAM5+7h7$p#`C!ZrZqR>Q9N3*2`>DV_JVm zwWoRsNTAXUrr6R;E%8u$F!d5tJP1muN1+tG^$>hByR*C5*xG|9{Rlhnz3HeWg1QW6*5EaK zU53qdn1tu+kXeJ8(47#X>r{FWC<7kEuOS+%m&|?s>3aEp)2S5K*;Q4iJ>z+d^ z+za3)B+2#X;wFMYkIp8|8|*a5a-P=rMT!&XN5Rv2oyjqQdEv64M`zc)!2xw3h3eq3 zadBZcLSCJV6nTt6$aMr7hQe611t_%Q{rtEcUH8z5mTkx$XT$#7O>tWup3gf(n>bRc z^UR;!i080?TKri$&nto{J1^HZjsv~jes*I%cD_rVd;40>_EdN$Z(nvK5vOMvnP(Kk zjvu?Tnfn1Z!j%@8j?XgM^Fm>az>9Ng?vV@gsYMP7|gHy zAo*G5y`{uT7gE(DC6cQ2KWV8fzYG=*$-!tP&?;(5!G~dSLo1K#3&(DwTda`4N-~if z)pKLIF`Cs3J)4wIMl~go0GNQEq9BOAz#9@Pe;`FoZjTybc1V7z_gvBE1|rFi*@3yC znYdD3CG%8a%%Ei96~X+=HrZ*xHA23T{3_|0&5$OTpa=UWHr|t~6m!Gj}z+1uL+XgqKaAP+5b;CVYXt zB>ZT>cQ{;wUoDu2m0id-HB&pA)SQ;^RpCD9!u>~xUiO~sSg6-Wz(s0&8+jo7FU1|4LFPF0CGP>N91iM$h1D7Z0nomMjQ z4ZHk~S%(9CMjr~(_v>O^qA!pVjYSrpLu3-08(}0zBeH(FST(K=C$E~Qaj+x%j;wPA z`$_Y_&%qHeD#sFbU83{}(t)lJ(!=k|bR^+28W$FigpftZ=jn8mV34B7#CVNi@l~9$1JTGLcX}4ufM=*Heb_JG&Q z-a<9+RjLK&;&r!CD<7O}lv#UWM{}K4*%fi-gXT6eto?iEf=I7niiK&$GmOtLKFhok zdhMfAUU90j11u}C_7+-se`ZmiW_ZV<4BJn$ZzuLM%$tuZCMEz*T{<+h$w`27@YB#z OsUT1f{XhQa6Zi|61CWvc diff --git a/examples/spacetaxi/generated/iigs/levels/level21.dat b/examples/spacetaxi/generated/iigs/levels/level21.dat deleted file mode 100644 index 7d6c4c99512cbf448abcca49e806e76130ea2b0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2941 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 H{E_(u4GZeo diff --git a/examples/spacetaxi/generated/iigs/levels/level24.dat b/examples/spacetaxi/generated/iigs/levels/level24.dat deleted file mode 100644 index 13dca31b4b3937c07b17df8bd08a25a41909d135..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmb_e&rcIk5Pq%fF3=`c6N5LFzW_+Q%LT%riU~yEWciVbsA!WKk>tUthXNZQCgP#5 zCQUe$q>Ja{0{5N>*OX5QN$?b3yVU(%iTX1#fE-`^4Bl2kT%uI_KECBzwPuHmhtw*&VdI>@3N?enFd6 zc1PI)+6GtwJO%`u;8FVt0&?W2+;@sNB4^T*qKtG7(zn0+Tm{s6qW)*qquKjsQwDW_+ zpVV2ASBkuvIFF<#RuMdLEm>Tw6!`5YH@5Bl7Ex`n*EO-B*<-pG*KN}fU534XB&tXD z`mxwJw#RB>yk?sxqU+?~cY!AkJ{GwBfeXlmM94CYa$Ggszd$Q4-ooLib4M8VMaGp`9nEKWERs z^;D^Xz8%`xr?%Tw+g+2*!&5=@cPTo8qFYgPDFSC~-s~$e^X<~b%7 diff --git a/examples/spacetaxi/generated/iigs/levels/title.dat b/examples/spacetaxi/generated/iigs/levels/title.dat deleted file mode 100644 index 83ca545328d4c48b3b960ce6b48517eb6f470f02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 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 diff --git a/examples/spacetaxi/generated/iigs/tiles/tbank1.tbk b/examples/spacetaxi/generated/iigs/tiles/tbank1.tbk deleted file mode 100644 index 8cf99567c29e1c827b9a28ca780ebe87d84ea0ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32044 zcmeIvF;c@Y6og@GNJug%u#dvfK*vy0GH?Yddd@=6EjR#I;TEvFvK$i<=%{{qY{~M| z)6?hM`Lx5*X8BneS5dQUOsLgmd~q?&C}{-Q)7-lhre5|kZu@y z-Cd`yQ`f1Rx1twK7e@^0ykJo0&^F~fQ`5I3^n_OCvENU@%FvhZS2pt6qDp?bryQiyncYm9Pg5StX{qlKWJxz{eOV diff --git a/examples/spacetaxi/generated/iigs/tiles/tbank2.tbk b/examples/spacetaxi/generated/iigs/tiles/tbank2.tbk deleted file mode 100644 index 2ead5e10d06efe233f836e85d3efe4e1bf61cdb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32044 zcmeIwF;2rk5QSl{NJyd-I7dM=&>>1n1XrM<=PdNxf&*}s+ydTvW1A!jq(=HTvUly- znce;3`^US>S=*jz;Kqs9Akdl-7HX3g&j$JC>%jzU}|A zn1WtlzqTjWyDVNeO=(F{WEdyS`|uvL`=ec!uUiUqIZMm2^I9+Zu61qb^62OBy$dVo z3I0#2&)BWNj{71I2zn?aWsOv3b$I7RtBQuTEtjjLrt z*_1OiZ@OGdm3?_ZT?daYI2NfiKaC|cR2B^Z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 Z009ILKmY**5I_I{1Q0*~0R;Y;z&BwWEad> (6u - k * 2u)) & 3u); + if (multi != 0u) { + p[k] = (uint8_t)((pal[pair] << 4) | pal[pair]); + } else { + p[k] = (uint8_t)((((pair & 2u) != 0u) ? (uint8_t)(color << 4) : 0u) | (((pair & 1u) != 0u) ? color : 0u)); + } + } + } + } + } +} diff --git a/examples/spacetaxi/stCels.h b/examples/spacetaxi/stCels.h new file mode 100644 index 0000000..e78e1e6 --- /dev/null +++ b/examples/spacetaxi/stCels.h @@ -0,0 +1,37 @@ +// Space Taxi -- the sprite cels the renderer needs, as a fixed-order +// bank. The offline baker (tools/staxibake) emits a .spr in this order, +// spritebake compiles it to a per-platform .spc, and stRenderPrewarm +// loads that with jlSpriteBankLoadPrecompiled -- so the moving cels +// arrive already compiled and the ~0.4 s-per-cel 65816 JIT never runs at +// boot. The game maps loaded cel i back to its (ptr, colour, mode) key +// from kStCels[i]. stCelBlob is the single expansion both the baker and +// the interpreter fallback use, so the compiled and built cels agree. + +#ifndef ST_CELS_H +#define ST_CELS_H + +#include + +// 3x3 tiles = 24x24 px; 32 bytes per 8x8 tile, tile-major (matches +// jlSpriteCreateFromSurface / the .spr cel layout). +#define ST_CEL_TILES 3u +#define ST_CEL_BYTES (ST_CEL_TILES * ST_CEL_TILES * 32u) +#define ST_CEL_ROWS 21u // a VIC sprite is 21 rows tall + +typedef struct { + uint8_t ptr; // VIC sprite block pointer + uint8_t color; // per-sprite colour (the multicolour "10" pair) + uint8_t multi; // 1 = multicolour, 0 = hires + uint8_t mc0; // shared multicolour 0 ($D025); 0 when hires + uint8_t mc1; // shared multicolour 1 ($D026); 0 when hires +} StCelDefT; + +extern const StCelDefT kStCels[]; +extern const uint16_t kStCelCount; + +// Expand a VIC bitmap (63 bytes, 21 rows x 3, or NULL) into the 288-byte +// tile-major 4bpp-packed cel blob. Colours as in the C64 multicolour +// rules; hires uses `color` for a set bit. +void stCelBlob(const uint8_t *bm, uint8_t multi, uint8_t color, uint8_t mc0, uint8_t mc1, uint8_t *out); + +#endif diff --git a/examples/spacetaxi/stRender.c b/examples/spacetaxi/stRender.c index 276183b..6a1f104 100644 --- a/examples/spacetaxi/stRender.c +++ b/examples/spacetaxi/stRender.c @@ -3,35 +3,44 @@ // // The screen is 40x25 character cells painted from the live charset // (the game edits glyphs at runtime: the transporter hatch, the title -// logo flip-book, the laser beams), one JoeyLib tile per glyph built -// on a scratch surface and cached by bitmap so an animated glyph is -// built once per shape. Only the cells the simulation listed as dirty -// are repainted. The eight VIC sprites are drawn from their bitmaps -// through a small cache of JoeyLib sprites keyed on (pointer, colour, -// multicolour mode), with save-under and LIFO restore. Sprite 0 has -// VIC priority, so the draw order is sprite 7 first, sprite 0 last, -// and a sprite that has not moved (and has nothing repainted under -// it) simply stays on the stage: only it and everything drawn after -// it are undrawn and redrawn when it changes. +// logo flip-book, the laser beams). A glyph is one mono JoeyLib tile +// (set bits = non-zero pixels), cached by shape and coloured on the way +// to the stage by jlTilePasteMono from the cell's colour RAM, so a +// colour change never rebuilds a tile and an animated glyph is built +// once per shape. Only the cells the simulation listed as dirty are +// repainted; a changed glyph dirties the cells showing it, found +// inside the cell range each character was last painted in. The eight +// VIC sprites are drawn from their bitmaps through a small cache of +// JoeyLib sprites keyed on (pointer, colour, multicolour mode), with +// save-under and LIFO restore. Sprite 0 has VIC priority, so the draw +// order is sprite 7 first, sprite 0 last, and a sprite that has not +// moved (and has nothing repainted under it) simply stays on the +// stage: only it and everything drawn after it are undrawn and redrawn +// when it changes. #include #include "spacetaxi.h" +#include "stCels.h" #define ST_SPRITE_TILES 3u // The IIgs reaches its globals DBR-relative, so all of BSS must fit the -// entry bank below the I/O window; the caches are sized down there. +// entry bank below the I/O window; the caches are sized down there. The +// sprite cache must still hold every cel stRenderPrewarm builds (the +// cab, exhaust and passenger sets plus the intro star) or a cel change +// mid-play rebuilds and recompiles a sprite. Glyphs are direct-mapped +// by character, so the count is a power of two. #if defined(__W65816__) - #define ST_SPRITE_CACHE 24u - #define ST_CELL_CACHE 24u + #define ST_SPRITE_CACHE 48u + #define ST_GLYPH_CACHE 64u #else #define ST_SPRITE_CACHE 72u - // Pre-coloured cells keyed direct-mapped by character + colours, so a - // full 256 covers every (char, fg, bg=black) with no collisions. - #define ST_CELL_CACHE 256u + #define ST_GLYPH_CACHE 256u #endif #define ST_SPRITE_BACKUP_BYTES JOEY_SPRITE_BACKUP_BYTES(ST_SPRITE_TILES, ST_SPRITE_TILES) #define ST_SPRITE_PX (8 * ST_SPRITE_TILES) +// glyphFirst[] value for a character shown in no cell. +#define ST_NO_CELL 0xFFFFu typedef struct { jlSpriteT *sprite; @@ -42,16 +51,11 @@ typedef struct { uint8_t mc1; uint8_t level; // level index the bitmap came from (level sprites) bool used; + bool pinned; // prewarmed moving cel: never evicted (its + // compiled code is costly to re-emit on the 65816) uint32_t lastUse; // for least-recently-used eviction } StSpriteCacheT; -typedef struct { - uint8_t bits[8]; - uint8_t fg; - uint8_t bg; - jlTileT tile; - bool used; -} StCellCacheT; // What is drawn in a draw slot (slot 0 = sprite 7 ... slot 7 = sprite 0). typedef struct { @@ -65,9 +69,20 @@ typedef struct { typedef struct { jlSurfaceT *scratch; - StCellCacheT cells[ST_CELL_CACHE]; + // Glyphs as mono tiles (set bits = non-zero pixels, coloured per cell + // by jlTilePasteMono), direct-mapped by character and valid while + // the bits match. Parallel arrays: power-of-two element sizes keep + // the 65816 indexing to shifts. + uint8_t glyphBits[ST_GLYPH_CACHE][8]; + jlTileT glyphTiles[ST_GLYPH_CACHE]; + bool glyphUsed[ST_GLYPH_CACHE]; + // Cell range (inclusive) each character has been painted in since + // the last full repaint: where a changed glyph's cells can be. + uint16_t glyphFirst[ST_CHARSET_CHARS]; + uint16_t glyphLast[ST_CHARSET_CHARS]; uint32_t cacheStamp; StSpriteCacheT cache[ST_SPRITE_CACHE]; + StSpriteCacheT *lastHit[ST_HW_SPRITES]; // the entry each hardware sprite used last jlSpriteBackupT backup[ST_HW_SPRITES]; uint8_t backupMem[ST_HW_SPRITES][ST_SPRITE_BACKUP_BYTES] __attribute__((aligned(2))); StDrawnT slot[ST_HW_SPRITES]; @@ -76,6 +91,8 @@ typedef struct { static StRenderStateT gRender; +// Set across stRenderPrewarm so a cel built there is pinned in the cache. +static bool gPrewarming; // The VIC-II palette in register order, $0RGB. static const uint16_t kC64Palette[16] = { @@ -84,13 +101,38 @@ static const uint16_t kC64Palette[16] = { }; -static jlSpriteT *cachedSprite(StSimT *sim, uint8_t idx); -static void collectGlyphs(StSimT *sim); -static void dirtyRect(const StSimT *sim, int16_t *x0, int16_t *y0, int16_t *x1, int16_t *y1); -static void dropCache(void); -static void paintCells(jlSurfaceT *stage, StSimT *sim); -static void pasteCell(jlSurfaceT *stage, const StSimT *sim, uint16_t cell); -static bool spriteOnScreen(int16_t px, int16_t py); +static void buildSpriteCel(const uint8_t *bm, uint8_t multi, uint8_t color, uint8_t mc0, uint8_t mc1); +static jlSpriteT *cachedSprite(StSimT *sim, uint8_t idx); +static bool loadPrecompiledCels(void); +static uint8_t cellRow(uint16_t cell); +static void collectGlyphs(StSimT *sim); +static void dirtyRect(const StSimT *sim, int16_t *x0, int16_t *y0, int16_t *x1, int16_t *y1); +static void dropCache(void); +static const jlTileT *glyphTile(const StSimT *sim, uint8_t chr); +static void paintCells(jlSurfaceT *stage, StSimT *sim); +static void pasteCell(jlSurfaceT *stage, const StSimT *sim, uint16_t cell, uint8_t bx, uint8_t by); +static bool spriteOnScreen(int16_t px, int16_t py); +static void tileFromChunky(jlTileT *out, const uint8_t *chunky); + + +// Paint a VIC sprite bitmap onto the scratch surface's top-left 3x3 +// tiles from the shared cel expansion (stCels.c, the same one the +// offline baker uses), so a cel built here for the interpreter fallback +// matches the precompiled .spc byte for byte. +static void buildSpriteCel(const uint8_t *bm, uint8_t multi, uint8_t color, uint8_t mc0, uint8_t mc1) { + uint8_t blob[ST_CEL_BYTES]; + jlTileT tile; + uint8_t tx; + uint8_t ty; + + stCelBlob(bm, multi, color, mc0, mc1, blob); + for (ty = 0u; ty < ST_SPRITE_TILES; ty++) { + for (tx = 0u; tx < ST_SPRITE_TILES; tx++) { + tileFromChunky(&tile, &blob[(ty * ST_SPRITE_TILES + tx) * TILE_BYTES]); + jlTilePaste(gRender.scratch, tx, ty, &tile); + } + } +} // The JoeyLib sprite for hardware sprite `idx` of the current frame, @@ -102,66 +144,49 @@ static jlSpriteT *cachedSprite(StSimT *sim, uint8_t idx) { uint8_t mc0 = multi ? sim->spriteMc0 : 0u; uint8_t mc1 = multi ? sim->spriteMc1 : 0u; uint8_t level = (ptr < ST_SPRITE_PTR_FIRST && sim->level != 0) ? sim->level->levelIndex : 0xFFu; - const uint8_t *bm; StSpriteCacheT *slot = 0; + StSpriteCacheT *e = gRender.lastHit[idx]; uint8_t k; - uint8_t row; gRender.cacheStamp++; + // Most frames a hardware sprite shows the cel it showed last time. + if (e != 0 && e->used && e->ptr == ptr && e->color == color && e->multi == multi && e->mc0 == mc0 && e->mc1 == mc1 && e->level == level) { + e->lastUse = gRender.cacheStamp; + return e->sprite; + } for (k = 0u; k < ST_SPRITE_CACHE; k++) { - StSpriteCacheT *e = &gRender.cache[k]; + e = &gRender.cache[k]; if (e->used && e->ptr == ptr && e->color == color && e->multi == multi && e->mc0 == mc0 && e->mc1 == mc1 && e->level == level) { e->lastUse = gRender.cacheStamp; + gRender.lastHit[idx] = e; return e->sprite; } - if (slot == 0 || !e->used || (slot->used && e->used && e->lastUse < slot->lastUse)) { - if (slot == 0 || !slot->used || !e->used || e->lastUse < slot->lastUse) { - slot = e; - } + // Pinned entries (prewarmed cab/exhaust/passenger cels) are the + // costly-to-recompile ones and are never evicted; the least- + // recently-used unpinned slot is the victim, a free slot first. + if (e->pinned) { + continue; } + if (slot == 0 || !e->used || (slot->used && e->lastUse < slot->lastUse)) { + slot = e; + } + } + if (slot == 0) { + // Every slot is pinned (never happens with the prewarm set sized + // below the cache): reuse the queried entry's own slot is unsafe, + // so fail into the interpreter path. + return 0; } if (slot->used) { jlSpriteDestroy(slot->sprite); slot->sprite = 0; slot->used = false; } - bm = stSimSpriteBitmap(sim, ptr); - jlFillRect(gRender.scratch, 0, 0, ST_SPRITE_PX, ST_SPRITE_PX, 0u); - if (bm != 0) { - for (row = 0u; row < ST_SPRITE_H; row++) { - uint32_t bits = ((uint32_t)bm[row * 3u] << 16) | ((uint32_t)bm[row * 3u + 1u] << 8) | bm[row * 3u + 2u]; - uint8_t x; - if (multi != 0u) { - for (x = 0u; x < 12u; x++) { - uint8_t pair = (uint8_t)((bits >> (22u - x * 2u)) & 3u); - uint8_t c = 0u; - if (pair == 1u) { - c = mc0; - } else if (pair == 2u) { - c = color; - } else if (pair == 3u) { - c = mc1; - } - if (c != 0u) { - jlDrawPixel(gRender.scratch, (int16_t)(x * 2u), (int16_t)row, c); - jlDrawPixel(gRender.scratch, (int16_t)(x * 2u + 1u), (int16_t)row, c); - } - } - } else { - for (x = 0u; x < 24u; x++) { - if ((bits & (1uL << (23u - x))) != 0u) { - jlDrawPixel(gRender.scratch, (int16_t)x, (int16_t)row, color); - } - } - } - } - } + buildSpriteCel(stSimSpriteBitmap(sim, ptr), multi, color, mc0, mc1); slot->sprite = jlSpriteCreateFromSurface(gRender.scratch, 0, 0, ST_SPRITE_TILES, ST_SPRITE_TILES); if (slot->sprite == 0) { return 0; } - // Only the cab, passenger and flame move every tick; the codegen - // arena is theirs. Everything else stays interpreted (drawn once). // Only the cab, exhaust and passenger move every tick; the codegen // arena is theirs. Everything else stays interpreted (drawn seldom). if (idx <= 2u) { @@ -173,39 +198,49 @@ static jlSpriteT *cachedSprite(StSimT *sim, uint8_t idx) { slot->multi = multi; slot->mc0 = mc0; slot->mc1 = mc1; - slot->level = level; - slot->used = true; + slot->level = level; + slot->used = true; + slot->pinned = gPrewarming; + gRender.lastHit[idx] = slot; return slot->sprite; } +// Block row of a screen cell without a division: cell / 40 is +// (cell / 8) / 5, and x * 205 / 1024 equals x / 5 for every x below 125. +static uint8_t cellRow(uint16_t cell) { + return (uint8_t)(((uint16_t)(cell >> 3) * 205u) >> 10); +} + + // A changed glyph (the hatch, the logo flip, the laser beams) makes -// every cell that shows it dirty; the cell cache self-invalidates on the -// bitmap compare, so no per-char tile needs rebuilding here. +// every cell that shows it dirty. The glyph cache self-invalidates on +// the bitmap compare, so nothing is rebuilt here; the search covers +// only the cell range the character was last painted in. static void collectGlyphs(StSimT *sim) { uint16_t ch; uint16_t cell; - uint8_t dirty[ST_CHARSET_CHARS]; - bool any = false; + uint16_t last; for (ch = 0u; ch < ST_CHARSET_CHARS; ch++) { - dirty[ch] = sim->charDirty[ch]; - if (dirty[ch] != 0u) { - sim->charDirty[ch] = 0u; - any = true; + if (sim->charDirty[ch] == 0u) { + continue; } - } - if (!any || sim->dirtyAll) { - return; - } - for (cell = 0u; cell < ST_SCREEN_CELLS; cell++) { - if (dirty[sim->screen[cell]] != 0u && sim->cellDirty[cell] == 0u) { + sim->charDirty[ch] = 0u; + if (sim->dirtyAll) { + continue; + } + last = gRender.glyphLast[ch]; + for (cell = gRender.glyphFirst[ch]; cell <= last; cell++) { + if (sim->screen[cell] != (uint8_t)ch || sim->cellDirty[cell] != 0u) { + continue; + } sim->cellDirty[cell] = 1u; - if (sim->dirtyCount < (uint8_t)(sizeof(sim->dirtyList) / sizeof(sim->dirtyList[0]))) { + if (sim->dirtyCount < (uint16_t)(sizeof(sim->dirtyList) / sizeof(sim->dirtyList[0]))) { sim->dirtyList[sim->dirtyCount++] = cell; } else { sim->dirtyAll = true; - return; + break; } } } @@ -215,7 +250,7 @@ static void collectGlyphs(StSimT *sim) { // Bounding box (pixels, x1/y1 exclusive) of the cells about to be // repainted. Empty when x1 <= x0. static void dirtyRect(const StSimT *sim, int16_t *x0, int16_t *y0, int16_t *x1, int16_t *y1) { - uint8_t k; + uint16_t k; if (sim->dirtyAll) { *x0 = 0; @@ -230,8 +265,9 @@ static void dirtyRect(const StSimT *sim, int16_t *x0, int16_t *y0, int16_t *x1, *y1 = 0; for (k = 0u; k < sim->dirtyCount; k++) { uint16_t cell = sim->dirtyList[k]; - int16_t cx = (int16_t)((cell % ST_SCREEN_COLS) * 8u); - int16_t cy = (int16_t)((cell / ST_SCREEN_COLS) * 8u); + uint8_t by = cellRow(cell); + int16_t cy = (int16_t)(by * 8u); + int16_t cx = (int16_t)((cell - ((uint16_t)by << 5) - ((uint16_t)by << 3)) * 8u); if (cx < *x0) { *x0 = cx; } @@ -261,15 +297,52 @@ static void dropCache(void) { } +// The mono tile for character `chr`, rebuilt when the glyph's bits no +// longer match the cached shape (direct-mapped by character). +static const jlTileT *glyphTile(const StSimT *sim, uint8_t chr) { + // Two glyph bits -> one chunky byte of non-zero (set) / zero pixels. + static const uint8_t kMonoPair[4] = { 0x00u, 0x0Fu, 0xF0u, 0xFFu }; + const uint8_t *bits = sim->charset[chr]; + uint8_t slot = (uint8_t)(chr & (ST_GLYPH_CACHE - 1u)); + jlTileT *tile = &gRender.glyphTiles[slot]; + uint8_t chunky[TILE_BYTES]; + uint8_t row; + + if (gRender.glyphUsed[slot] && memcmp(gRender.glyphBits[slot], bits, 8u) == 0) { + return tile; + } + for (row = 0u; row < TILE_PIXELS_PER_SIDE; row++) { + uint8_t b = bits[row]; + uint8_t *p = &chunky[row * TILE_BYTES_PER_ROW]; + p[0] = kMonoPair[b >> 6]; + p[1] = kMonoPair[(b >> 4) & 3u]; + p[2] = kMonoPair[(b >> 2) & 3u]; + p[3] = kMonoPair[b & 3u]; + } + tileFromChunky(tile, chunky); + memcpy(gRender.glyphBits[slot], bits, 8u); + gRender.glyphUsed[slot] = true; + return tile; +} + + // Repaint the dirty cells: the list, or everything after an overflow -// or a scene change. +// or a scene change (which also restarts the per-character cell ranges). static void paintCells(jlSurfaceT *stage, StSimT *sim) { uint16_t cell; - uint8_t k; + uint16_t k; + uint8_t bx; + uint8_t by; if (sim->dirtyAll) { - for (cell = 0u; cell < ST_SCREEN_CELLS; cell++) { - pasteCell(stage, sim, cell); + memset(gRender.glyphFirst, 0xFF, sizeof(gRender.glyphFirst)); + memset(gRender.glyphLast, 0, sizeof(gRender.glyphLast)); + cell = 0u; + for (by = 0u; by < ST_SCREEN_ROWS; by++) { + for (bx = 0u; bx < ST_SCREEN_COLS; bx++) { + pasteCell(stage, sim, cell, bx, by); + cell++; + } } memset(sim->cellDirty, 0, ST_SCREEN_CELLS); sim->dirtyCount = 0u; @@ -278,44 +351,27 @@ static void paintCells(jlSurfaceT *stage, StSimT *sim) { } for (k = 0u; k < sim->dirtyCount; k++) { cell = sim->dirtyList[k]; - pasteCell(stage, sim, cell); + by = cellRow(cell); + bx = (uint8_t)(cell - ((uint16_t)by << 5) - ((uint16_t)by << 3)); + pasteCell(stage, sim, cell, bx, by); sim->cellDirty[cell] = 0u; } sim->dirtyCount = 0u; } -// Paste one cell through the coloured-tile cache (direct-mapped on -// character and colours; an entry is valid while its glyph bits match). -static void pasteCell(jlSurfaceT *stage, const StSimT *sim, uint16_t cell) { - uint8_t chr = sim->screen[cell]; - uint8_t fg = sim->color[cell]; - uint8_t bg = sim->bgColor; - const uint8_t *bits = sim->charset[chr]; - uint8_t bx = (uint8_t)(cell % ST_SCREEN_COLS); - uint8_t by = (uint8_t)(cell / ST_SCREEN_COLS); - StCellCacheT *c = &gRender.cells[(uint16_t)(chr + fg * 61u + bg * 7u) % ST_CELL_CACHE]; +// Paint one cell: its glyph tile coloured from colour RAM over the +// background, and note the cell in the character's range. +static void pasteCell(jlSurfaceT *stage, const StSimT *sim, uint16_t cell, uint8_t bx, uint8_t by) { + uint8_t chr = sim->screen[cell]; - uint8_t row; - uint8_t bit; - - if (c->used && c->fg == fg && c->bg == bg && memcmp(c->bits, bits, 8u) == 0) { - jlTilePaste(stage, bx, by, &c->tile); - return; + if (cell < gRender.glyphFirst[chr]) { + gRender.glyphFirst[chr] = cell; } - for (row = 0u; row < 8u; row++) { - uint8_t b = bits[row]; - for (bit = 0u; bit < 8u; bit++) { - jlDrawPixel(gRender.scratch, (int16_t)bit, (int16_t)row, - ((b & (uint8_t)(0x80u >> bit)) != 0u) ? fg : bg); - } + if (cell > gRender.glyphLast[chr]) { + gRender.glyphLast[chr] = cell; } - jlTileSnap(gRender.scratch, 0u, 0u, &c->tile); - memcpy(c->bits, bits, 8u); - c->fg = fg; - c->bg = bg; - c->used = true; - jlTilePaste(stage, bx, by, &c->tile); + jlTilePasteMono(stage, bx, by, glyphTile(sim, chr), sim->color[cell], sim->bgColor); } @@ -324,6 +380,28 @@ static bool spriteOnScreen(int16_t px, int16_t py) { } +// A chunky 8x8 tile (four bytes per row, high nibble = left pixel) as +// this port's jlTileT: a straight copy on the chunky ports, drawn and +// snapped through the scratch surface on the planar ones. +static void tileFromChunky(jlTileT *out, const uint8_t *chunky) { +#if defined(JOEYLIB_NATIVE_CHUNKY) + memcpy(out->pixels, chunky, TILE_BYTES); +#else + uint8_t row; + uint8_t k; + + for (row = 0u; row < TILE_PIXELS_PER_SIDE; row++) { + for (k = 0u; k < TILE_BYTES_PER_ROW; k++) { + uint8_t b = chunky[row * TILE_BYTES_PER_ROW + k]; + jlDrawPixel(gRender.scratch, (int16_t)(k * 2u), (int16_t)row, (uint8_t)(b >> 4)); + jlDrawPixel(gRender.scratch, (int16_t)(k * 2u + 1u), (int16_t)row, (uint8_t)(b & 0x0Fu)); + } + } + jlTileSnap(gRender.scratch, 0u, 0u, out); +#endif +} + + // --------------------------------------------------------------------------- // Public // --------------------------------------------------------------------------- @@ -413,6 +491,7 @@ void stRenderInit(jlSurfaceT *stage) { uint8_t k; memset(&gRender, 0, sizeof(gRender)); + memset(gRender.glyphFirst, 0xFF, sizeof(gRender.glyphFirst)); for (k = 0u; k < ST_HW_SPRITES; k++) { gRender.backup[k].bytes = gRender.backupMem[k]; } @@ -432,6 +511,46 @@ void stRenderInit(jlSurfaceT *stage) { // exhaust, passenger, wreck, warp, intro cab and star -- up front, so // no frame pays for a sprite build mid-play. A bar on the stage shows // progress on the slower ports. +// Load the offline-baked, already-compiled cel bank into the pinned +// cache so no cel is JIT-compiled at boot (each 65816 compile costs +// ~0.4 s). Every kStCels entry becomes a pinned cache slot keyed exactly +// as the play lookups: system ptr (level 0xFF), the level-wide colours. +// Returns false if the .spc is missing or built for another target/shift +// count (other ports, or a stale bake), so the caller falls back to the +// runtime JIT prewarm below. Its cross-platform contract makes this a +// no-op everywhere but the IIgs, where the bake is wired. +static bool loadPrecompiledCels(void) { + jlSpriteT *cels[64]; + uint16_t n; + uint16_t i; + + if (kStCelCount > (uint16_t)(sizeof(cels) / sizeof(cels[0])) || kStCelCount > ST_SPRITE_CACHE) { + return false; + } + n = jlSpriteBankLoadPrecompiled("sprites/staxicels.spc", cels, kStCelCount, 0); + if (n < kStCelCount) { + for (i = 0u; i < n; i++) { + jlSpriteDestroy(cels[i]); + } + return false; + } + for (i = 0u; i < n; i++) { + StSpriteCacheT *e = &gRender.cache[i]; + e->sprite = cels[i]; + e->ptr = kStCels[i].ptr; + e->color = kStCels[i].color; + e->multi = kStCels[i].multi; + e->mc0 = kStCels[i].mc0; + e->mc1 = kStCels[i].mc1; + e->level = 0xFFu; + e->used = true; + e->pinned = true; + e->lastUse = 0u; + } + return true; +} + + void stRenderPrewarm(jlSurfaceT *stage, StSimT *sim) { static const uint8_t kCabPtrs[] = { 0xC0, 0xC1, 0xDC, 0xDD, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8 }; static const uint8_t kPassPtrs[] = { 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xD9 }; @@ -439,8 +558,15 @@ void stRenderPrewarm(jlSurfaceT *stage, StSimT *sim) { uint8_t total = (uint8_t)(sizeof(kCabPtrs) + sizeof(kPassPtrs) + sizeof(kFlamePtrs) + 1u); uint8_t done = 0u; uint8_t k; - StFrameT saved = sim->frame; + StFrameT saved; + // Precompiled bank: instant, no per-cel JIT. Falls through to the + // runtime build below on any port without a matching .spc. + if (loadPrecompiledCels()) { + return; + } + saved = sim->frame; + gPrewarming = true; sim->frame.multiMask = 0x07u; sim->spriteMc0 = 0x02u; sim->spriteMc1 = 0x07u; @@ -468,12 +594,15 @@ void stRenderPrewarm(jlSurfaceT *stage, StSimT *sim) { jlFillRect(stage, 60, 110, (uint16_t)((uint16_t)done * 200u / total), 6u, 1u); jlStagePresent(); } - // The intro star is a hires sprite in colour 7 (built, not compiled). + // The intro star is a hires sprite in colour 7. Build it as a moving + // (idx <= 2) cel so it compiles: the level-name intro draws seven of + // them every frame, and the interpreter cannot keep up. sim->frame.multiMask = 0u; - sim->frame.ptr[6] = 0xDAu; - sim->frame.color[6] = 0x07u; - (void)cachedSprite(sim, 6u); + sim->frame.ptr[2] = 0xDAu; + sim->frame.color[2] = 0x07u; + (void)cachedSprite(sim, 2u); sim->frame = saved; + gPrewarming = false; jlFillRect(stage, 60, 110, 200u, 6u, 0u); } diff --git a/examples/spacetaxi/stSim.c b/examples/spacetaxi/stSim.c index daf844d..289e887 100644 --- a/examples/spacetaxi/stSim.c +++ b/examples/spacetaxi/stSim.c @@ -48,7 +48,7 @@ static uint8_t readInput(StSimT *sim); static void markCell(StSimT *sim, uint16_t cell); static void setCell(StSimT *sim, uint16_t cell, uint8_t ch); static void setColorCell(StSimT *sim, uint16_t cell, uint8_t color); -static void spriteMasks(const StSimT *sim, uint8_t idx, uint32_t *rows); +static void spriteMasks(StSimT *sim, uint8_t idx); static void spritesOffReset(StSimT *sim); static void taxiSpawnInit(StSimT *sim); static void taxiSpriteCelSelect(StSimT *sim); @@ -264,67 +264,95 @@ static StTickResultE collisionPhase3(StSimT *sim) { } -// The VIC's $D01E / $D01F for the displayed frame: pixel overlap of -// enabled sprites with each other and of sprite 0 with the background. +// The C64 reads two VIC collision registers each frame: $D01F (a sprite +// touched the background) and $D01E (two sprites touched). Only the cab +// (sprite 0) can drive a gameplay outcome from them: the crash dispatch +// returns unless the cab or the background is touched, and every hook +// reads a bit set by cab contact. So the full all-pairs register is not +// reproduced -- only sprite 0 versus the background and versus the other +// sprites, and the exhaust flame (sprite 2, the cab's own, always +// overlapping it) is skipped. Non-cab pairs (hazard vs hazard, passenger +// vs hazard with the cab clear) never change the dispatch outcome, so +// their bits are left unset. Proven against all four demo traces: the +// observable state (positions, crash phase, score) is byte-identical. static void computeCollisions(StSimT *sim) { - uint32_t mask[ST_HW_SPRITES][ST_SPRITE_H]; - uint8_t live = 0u; - uint8_t ss = 0u; - uint8_t bg = 0u; - uint8_t a; + uint32_t (*mask)[ST_SPRITE_H] = sim->collMask; + uint8_t ss = 0u; + uint8_t bg = 0u; + int16_t cabX; + int16_t cabY; uint8_t b; uint8_t r; - for (a = 0u; a < ST_HW_SPRITES; a++) { - if ((sim->frame.enableMask & (uint8_t)(1u << a)) != 0u) { - spriteMasks(sim, a, mask[a]); - live |= (uint8_t)(1u << a); - } + if ((sim->frame.enableMask & 1u) == 0u) { + sim->spriteSpriteColl = 0u; + sim->spriteBgColl = 0u; + return; } - if ((live & 1u) != 0u) { - int16_t px = (int16_t)((int16_t)sim->frame.x[0] - ST_SPRITE_X_ORIGIN); - int16_t py = (int16_t)((int16_t)sim->frame.y[0] - ST_SPRITE_Y_ORIGIN); - for (r = 0u; r < ST_SPRITE_H; r++) { - if (mask[0][r] != 0u && (mask[0][r] & backgroundRowMask(sim, px, (int16_t)(py + r))) != 0u) { - bg |= 1u; - break; + spriteMasks(sim, 0u); + cabX = (int16_t)((int16_t)sim->frame.x[0] - ST_SPRITE_X_ORIGIN); + cabY = (int16_t)((int16_t)sim->frame.y[0] - ST_SPRITE_Y_ORIGIN); + // The background can only touch the cab where a covering character + // cell is non-blank. In open flight every covering cell is the space + // glyph (all-zero pixels), so the 21-row pixel test is skipped there; + // any non-space cell falls through to the exact test, so the result + // is unchanged (space is the only zero-pixel glyph the test can hit). + { + int16_t firstCol = (int16_t)((cabX - (cabX < 0 ? 7 : 0)) / 8); + int16_t topRow = (cabY < 0) ? 0 : (int16_t)(cabY / 8); + int16_t botRow = (int16_t)((cabY + (int16_t)ST_SPRITE_H - 1) / 8); + bool solid = false; + int16_t rr; + int16_t cc; + + if (botRow >= (int16_t)ST_SCREEN_ROWS) { + botRow = (int16_t)(ST_SCREEN_ROWS - 1u); + } + for (rr = topRow; rr <= botRow && !solid; rr++) { + for (cc = firstCol; cc <= (int16_t)(firstCol + 3); cc++) { + if (cc >= 0 && cc < (int16_t)ST_SCREEN_COLS && sim->screen[ST_CELL((uint16_t)rr, (uint16_t)cc)] != ST_CHAR_SPACE) { + solid = true; + break; + } + } + } + if (solid) { + for (r = 0u; r < ST_SPRITE_H; r++) { + if (mask[0][r] != 0u && (mask[0][r] & backgroundRowMask(sim, cabX, (int16_t)(cabY + r))) != 0u) { + bg = 1u; + break; + } } } } - for (a = 0u; a < ST_HW_SPRITES; a++) { - if ((live & (uint8_t)(1u << a)) == 0u) { + for (b = 1u; b < ST_HW_SPRITES; b++) { + int16_t dx; + int16_t dy; + // Skip the exhaust flame (sprite 2) and any disabled sprite. + if (b == 2u || (sim->frame.enableMask & (uint8_t)(1u << b)) == 0u) { continue; } - for (b = (uint8_t)(a + 1u); b < ST_HW_SPRITES; b++) { - int16_t dx; - int16_t dy; - bool hit = false; - if ((live & (uint8_t)(1u << b)) == 0u) { + dx = (int16_t)((int16_t)sim->frame.x[b] - (int16_t)sim->frame.x[0]); + dy = (int16_t)((int16_t)sim->frame.y[b] - (int16_t)sim->frame.y[0]); + if (dx <= -ST_SPRITE_W || dx >= ST_SPRITE_W || dy <= -ST_SPRITE_H || dy >= ST_SPRITE_H) { + continue; + } + spriteMasks(sim, b); + for (r = 0u; r < ST_SPRITE_H; r++) { + int16_t rb = (int16_t)((int16_t)r - dy); + uint32_t mb; + if (rb < 0 || rb >= (int16_t)ST_SPRITE_H) { continue; } - dx = (int16_t)((int16_t)sim->frame.x[b] - (int16_t)sim->frame.x[a]); - dy = (int16_t)((int16_t)sim->frame.y[b] - (int16_t)sim->frame.y[a]); - if (dx <= -ST_SPRITE_W || dx >= ST_SPRITE_W || dy <= -ST_SPRITE_H || dy >= ST_SPRITE_H) { - continue; + mb = mask[b][rb]; + if (dx >= 0) { + mb >>= dx; + } else { + mb = (mb << (uint8_t)(-dx)) & 0xFFFFFFu; } - for (r = 0u; r < ST_SPRITE_H && !hit; r++) { - int16_t rb = (int16_t)((int16_t)r - dy); - uint32_t mb; - if (rb < 0 || rb >= (int16_t)ST_SPRITE_H) { - continue; - } - mb = mask[b][rb]; - if (dx >= 0) { - mb >>= dx; - } else { - mb = (mb << (uint8_t)(-dx)) & 0xFFFFFFu; - } - if ((mask[a][r] & mb) != 0u) { - hit = true; - } - } - if (hit) { - ss |= (uint8_t)((1u << a) | (1u << b)); + if ((mask[0][r] & mb) != 0u) { + ss |= (uint8_t)(1u | (1u << b)); + break; } } } @@ -771,7 +799,7 @@ static void markCell(StSimT *sim, uint16_t cell) { return; } sim->cellDirty[cell] = 1u; - if (sim->dirtyCount < (uint8_t)(sizeof(sim->dirtyList) / sizeof(sim->dirtyList[0]))) { + if (sim->dirtyCount < (uint16_t)(sizeof(sim->dirtyList) / sizeof(sim->dirtyList[0]))) { sim->dirtyList[sim->dirtyCount++] = cell; } else { sim->dirtyAll = true; @@ -796,30 +824,42 @@ static void setColorCell(StSimT *sim, uint16_t cell, uint8_t color) { } -// 21 rows of 24-bit foreground masks for a displayed sprite. A -// multicolour sprite's 2-bit pairs cover two pixels each. -static void spriteMasks(const StSimT *sim, uint8_t idx, uint32_t *rows) { +// 21 rows of 24-bit foreground masks for a displayed sprite, kept in +// collMask[idx] and rebuilt only when its bitmap or multicolour mode +// changes. A multicolour sprite's 2-bit pairs cover two pixels each: a +// non-zero pair is two set mask bits (kPairMask maps a nibble's two +// pairs at once). +static void spriteMasks(StSimT *sim, uint8_t idx) { + static const uint8_t kPairMask[16] = { + 0x0u, 0x3u, 0x3u, 0x3u, 0xCu, 0xFu, 0xFu, 0xFu, + 0xCu, 0xFu, 0xFu, 0xFu, 0xCu, 0xFu, 0xFu, 0xFu + }; const uint8_t *bm = stSimSpriteBitmap(sim, sim->frame.ptr[idx]); - bool multi = (sim->frame.multiMask & (uint8_t)(1u << idx)) != 0u; + uint8_t multi = (uint8_t)((sim->frame.multiMask >> idx) & 1u); + uint32_t *rows = sim->collMask[idx]; uint8_t r; - for (r = 0u; r < ST_SPRITE_H; r++) { - uint32_t bits = 0u; - if (bm != 0) { - bits = ((uint32_t)bm[r * 3u] << 16) | ((uint32_t)bm[r * 3u + 1u] << 8) | bm[r * 3u + 2u]; - } - if (multi) { - uint32_t m = 0u; - uint8_t i; - for (i = 0u; i < 12u; i++) { - if ((bits & (3u << (i * 2u))) != 0u) { - m |= (3u << (i * 2u)); - } - } - bits = m; - } - rows[r] = bits; + if (bm != 0 && bm == sim->collMaskBm[idx] && multi == sim->collMaskMulti[idx]) { + return; } + for (r = 0u; r < ST_SPRITE_H; r++) { + uint8_t b0 = 0u; + uint8_t b1 = 0u; + uint8_t b2 = 0u; + if (bm != 0) { + b0 = bm[r * 3u]; + b1 = bm[r * 3u + 1u]; + b2 = bm[r * 3u + 2u]; + if (multi != 0u) { + b0 = (uint8_t)((kPairMask[b0 >> 4] << 4) | kPairMask[b0 & 0x0Fu]); + b1 = (uint8_t)((kPairMask[b1 >> 4] << 4) | kPairMask[b1 & 0x0Fu]); + b2 = (uint8_t)((kPairMask[b2 >> 4] << 4) | kPairMask[b2 & 0x0Fu]); + } + } + rows[r] = ((uint32_t)b0 << 16) | ((uint32_t)b1 << 8) | b2; + } + sim->collMaskBm[idx] = bm; + sim->collMaskMulti[idx] = multi; } @@ -1034,6 +1074,9 @@ void stSimEnterLevel(StSimT *sim, const StLevelT *level) { stSimDirtyAll(sim); memcpy(sim->charset, stC64Charset(), sizeof(sim->charset)); memset(sim->charDirty, 1, ST_CHARSET_CHARS); + // Level sprites live in the one level buffer, so the same bitmap + // address now holds other pixels: rebuild every collision mask. + memset(sim->collMaskBm, 0, sizeof(sim->collMaskBm)); sim->borderColor = level->header[0]; sim->bgColor = level->header[1]; sim->spr[0].color = level->header[7]; diff --git a/examples/spacetaxi/stSim.h b/examples/spacetaxi/stSim.h index 759ea94..6701b85 100644 --- a/examples/spacetaxi/stSim.h +++ b/examples/spacetaxi/stSim.h @@ -153,6 +153,7 @@ typedef enum { ST_STAGE_CLEANUP // $67C6 } StStageE; + // What a tick asked the host to do next (the original abandons the // main loop with PLA/PLA on these). typedef enum { @@ -171,8 +172,8 @@ typedef struct { uint8_t screen[ST_SCREEN_CELLS]; // $0400 screen RAM uint8_t color[ST_SCREEN_CELLS]; // $D800 colour RAM uint8_t cellDirty[ST_SCREEN_CELLS]; // renderer clears - uint16_t dirtyList[128]; // cells marked since the last frame - uint8_t dirtyCount; + uint16_t dirtyList[512]; // cells marked since the last frame + uint16_t dirtyCount; bool dirtyAll; // list overflowed / whole screen uint8_t charset[ST_CHARSET_CHARS][8]; // $2800 working copy uint8_t charDirty[ST_CHARSET_CHARS]; // renderer clears @@ -212,6 +213,12 @@ typedef struct { uint8_t hitDispatchResult; // $721D uint8_t spriteSpriteColl; // $71CA latched $D01E uint8_t spriteBgColl; // $71CB latched $D01F + // Per-sprite 24-bit row masks of the displayed frame, rebuilt only + // when the sprite's bitmap or multicolour mode changes (derived + // state, not C64 memory). + uint32_t collMask[ST_HW_SPRITES][ST_SPRITE_H]; + const uint8_t *collMaskBm[ST_HW_SPRITES]; + uint8_t collMaskMulti[ST_HW_SPRITES]; // ---- fuel ---- uint8_t fuelCountdown; // $71C7 diff --git a/make/amiga.mk b/make/amiga.mk index d327bfe..1406f54 100644 --- a/make/amiga.mk +++ b/make/amiga.mk @@ -88,7 +88,7 @@ ADV2_SRC := $(EXAMPLES)/adventure2/adventure2.c ADV2_BIN := $(BINDIR)/Adv2 AGI_SRCS := $(EXAMPLES)/agi/agi.c $(EXAMPLES)/agi/agiRes.c $(EXAMPLES)/agi/agiPic.c $(EXAMPLES)/agi/agiView.c $(EXAMPLES)/agi/agiVm.c $(EXAMPLES)/agi/agiObj.c $(EXAMPLES)/agi/agiText.c AGI_BIN := $(BINDIR)/Agi -STAXI_SRCS := $(EXAMPLES)/spacetaxi/spacetaxi.c $(EXAMPLES)/spacetaxi/stLevel.c $(EXAMPLES)/spacetaxi/stLevelFile.c $(EXAMPLES)/spacetaxi/stRender.c $(EXAMPLES)/spacetaxi/stSim.c $(EXAMPLES)/spacetaxi/stFare.c $(EXAMPLES)/spacetaxi/stHooks.c $(EXAMPLES)/spacetaxi/stTitle.c $(EXAMPLES)/spacetaxi/stC64Data.c $(EXAMPLES)/spacetaxi/stAudio.c +STAXI_SRCS := $(EXAMPLES)/spacetaxi/spacetaxi.c $(EXAMPLES)/spacetaxi/stLevel.c $(EXAMPLES)/spacetaxi/stLevelFile.c $(EXAMPLES)/spacetaxi/stRender.c $(EXAMPLES)/spacetaxi/stSim.c $(EXAMPLES)/spacetaxi/stFare.c $(EXAMPLES)/spacetaxi/stHooks.c $(EXAMPLES)/spacetaxi/stTitle.c $(EXAMPLES)/spacetaxi/stC64Data.c $(EXAMPLES)/spacetaxi/stCels.c $(EXAMPLES)/spacetaxi/stAudio.c STAXI_INSTALL_DIR := $(BINDIR)/Taxi STAXI_BIN := $(STAXI_INSTALL_DIR)/Taxi @@ -121,11 +121,18 @@ STAXI_SPR_GEN := $(patsubst $(STAXI_SRC_DIR)/%.png,$(STAXI_GEN_DIR)/%.spr,$( STAXI_LEVEL_RUN := $(patsubst $(STAXI_GEN_DIR)/%,$(STAXI_RUN_DIR)/%,$(STAXI_LEVEL_GEN)) STAXI_TBK_RUN := $(patsubst $(STAXI_GEN_DIR)/%,$(STAXI_RUN_DIR)/%,$(STAXI_TBK_GEN)) STAXI_SPR_RUN := $(patsubst $(STAXI_GEN_DIR)/%,$(STAXI_RUN_DIR)/%,$(STAXI_SPR_GEN)) -STAXI_ASSET_DSTS := $(STAXI_LEVEL_RUN) +STAXI_ASSET_DSTS := $(STAXI_LEVEL_RUN) $(STAXICELS_SPC_RUN) # Pre-compiled sprite banks (.spc): baked from the .spr by the host spritebake # tool for THIS target and staged next to the .spr, so the runtime loads # compiled routines with no startup JIT (jlSpriteBankLoadPrecompiled). SPRITEBAKE_BIN := $(REPO_DIR)/build/tools/spritebake-amiga +# The C64-exact cel bank, generated by staxibake (from the shared cel table +# stCels.c + C64 bitmaps) and compiled to a .spc by the host spritebake, so +# STAXI loads its cels already compiled instead of JIT-compiling them at boot. +STAXIBAKE_BIN := $(REPO_DIR)/build/tools/staxibake +STAXICELS_SPR_GEN := $(STAXI_GEN_DIR)/sprites/staxicels.spr +STAXICELS_SPC_GEN := $(STAXICELS_SPR_GEN:.spr=.spc) +STAXICELS_SPC_RUN := $(patsubst $(STAXI_GEN_DIR)/%,$(STAXI_RUN_DIR)/%,$(STAXICELS_SPC_GEN)) STAXI_SPC_GEN := $(STAXI_SPR_GEN:.spr=.spc) STAXI_SPC_RUN := $(patsubst $(STAXI_GEN_DIR)/%,$(STAXI_RUN_DIR)/%,$(STAXI_SPC_GEN)) ASSETBAKE_BIN := $(REPO_DIR)/tools/assetbake/assetbake.py @@ -244,7 +251,7 @@ $(STAXI_BIN): $(STAXI_SRCS) $(LIB) # Space Taxi asset pipeline. .SECONDARY keeps the generated/ artifacts # from being auto-deleted after staging. -.SECONDARY: $(STAXI_LEVEL_GEN) $(STAXI_TBK_GEN) $(STAXI_SPR_GEN) $(STAXI_SPC_GEN) +.SECONDARY: $(STAXI_LEVEL_GEN) $(STAXI_TBK_GEN) $(STAXI_SPR_GEN) $(STAXI_SPC_GEN) $(STAXICELS_SPC_GEN) $(STAXI_ROM_LEVEL_GEN) &: $(STAXI_RAW_DUMP) $(ROMTOLEVEL_BIN) @mkdir -p $(STAXI_GEN_DIR)/levels @@ -265,6 +272,15 @@ $(STAXI_GEN_DIR)/%.spc: $(STAXI_GEN_DIR)/%.spr $(SPRITEBAKE_BIN) $(SPRITEBAKE_BIN): $(MAKE) -f $(REPO_DIR)/make/tools.mk spritebake-amiga +$(STAXIBAKE_BIN): + $(MAKE) -f $(REPO_DIR)/make/tools.mk staxibake + +# Explicit rule (overrides the %.spr-from-%.png pattern): the cel bank is +# generated from the game's cel table, not a PNG. +$(STAXICELS_SPR_GEN): $(STAXIBAKE_BIN) $(EXAMPLES)/spacetaxi/stCels.c $(EXAMPLES)/spacetaxi/stC64Data.c + @mkdir -p $(dir $@) + $(STAXIBAKE_BIN) $@ + $(STAXI_RUN_DIR)/levels/%.dat: $(STAXI_GEN_DIR)/levels/%.dat @mkdir -p $(dir $@) cp $< $@ diff --git a/make/atarist.mk b/make/atarist.mk index 2a1341b..26a7a56 100644 --- a/make/atarist.mk +++ b/make/atarist.mk @@ -75,7 +75,7 @@ ADV2_SRC := $(EXAMPLES)/adventure2/adventure2.c ADV2_BIN := $(BINDIR)/ADV2.PRG AGI_SRCS := $(EXAMPLES)/agi/agi.c $(EXAMPLES)/agi/agiRes.c $(EXAMPLES)/agi/agiPic.c $(EXAMPLES)/agi/agiView.c $(EXAMPLES)/agi/agiVm.c $(EXAMPLES)/agi/agiObj.c $(EXAMPLES)/agi/agiText.c AGI_BIN := $(BINDIR)/AGI.PRG -STAXI_SRCS := $(EXAMPLES)/spacetaxi/spacetaxi.c $(EXAMPLES)/spacetaxi/stLevel.c $(EXAMPLES)/spacetaxi/stLevelFile.c $(EXAMPLES)/spacetaxi/stRender.c $(EXAMPLES)/spacetaxi/stSim.c $(EXAMPLES)/spacetaxi/stFare.c $(EXAMPLES)/spacetaxi/stHooks.c $(EXAMPLES)/spacetaxi/stTitle.c $(EXAMPLES)/spacetaxi/stC64Data.c $(EXAMPLES)/spacetaxi/stAudio.c +STAXI_SRCS := $(EXAMPLES)/spacetaxi/spacetaxi.c $(EXAMPLES)/spacetaxi/stLevel.c $(EXAMPLES)/spacetaxi/stLevelFile.c $(EXAMPLES)/spacetaxi/stRender.c $(EXAMPLES)/spacetaxi/stSim.c $(EXAMPLES)/spacetaxi/stFare.c $(EXAMPLES)/spacetaxi/stHooks.c $(EXAMPLES)/spacetaxi/stTitle.c $(EXAMPLES)/spacetaxi/stC64Data.c $(EXAMPLES)/spacetaxi/stCels.c $(EXAMPLES)/spacetaxi/stAudio.c STAXI_INSTALL_DIR := $(BINDIR)/STAXI STAXI_BIN := $(STAXI_INSTALL_DIR)/STAXI.PRG @@ -99,13 +99,20 @@ STAXI_SPR_GEN := $(patsubst $(STAXI_SRC_DIR)/%.png,$(STAXI_GEN_DIR)/%.spr,$( STAXI_LEVEL_RUN := $(patsubst $(STAXI_GEN_DIR)/%,$(STAXI_RUN_DIR)/%,$(STAXI_LEVEL_GEN)) STAXI_TBK_RUN := $(patsubst $(STAXI_GEN_DIR)/%,$(STAXI_RUN_DIR)/%,$(STAXI_TBK_GEN)) STAXI_SPR_RUN := $(patsubst $(STAXI_GEN_DIR)/%,$(STAXI_RUN_DIR)/%,$(STAXI_SPR_GEN)) -STAXI_ASSET_DSTS := $(STAXI_LEVEL_RUN) +STAXI_ASSET_DSTS := $(STAXI_LEVEL_RUN) $(STAXICELS_SPC_RUN) # Pre-compiled sprite banks (.spc): baked from the .spr by the host spritebake # tool for THIS target and staged next to the .spr, so the runtime loads # compiled routines with no startup JIT (jlSpriteBankLoadPrecompiled). ST is # the one port whose .spc carries a reloc list (the shifted-DRAW thunk's jmp to # stSpriteDrawShiftWalker), re-stamped by the loader. SPRITEBAKE_BIN := $(REPO_DIR)/build/tools/spritebake-atarist +# The C64-exact cel bank, generated by staxibake (from the shared cel table +# stCels.c + C64 bitmaps) and compiled to a .spc by the host spritebake, so +# STAXI loads its cels already compiled instead of JIT-compiling them at boot. +STAXIBAKE_BIN := $(REPO_DIR)/build/tools/staxibake +STAXICELS_SPR_GEN := $(STAXI_GEN_DIR)/sprites/staxicels.spr +STAXICELS_SPC_GEN := $(STAXICELS_SPR_GEN:.spr=.spc) +STAXICELS_SPC_RUN := $(patsubst $(STAXI_GEN_DIR)/%,$(STAXI_RUN_DIR)/%,$(STAXICELS_SPC_GEN)) STAXI_SPC_GEN := $(STAXI_SPR_GEN:.spr=.spc) STAXI_SPC_RUN := $(patsubst $(STAXI_GEN_DIR)/%,$(STAXI_RUN_DIR)/%,$(STAXI_SPC_GEN)) ASSETBAKE_BIN := $(REPO_DIR)/tools/assetbake/assetbake.py @@ -230,7 +237,7 @@ $(STAXI_BIN): $(STAXI_SRCS) $(LIB) $(LIBXMP_AR) $(ST_CC) $(CFLAGS) $(STAXI_SRCS) $(LIB) $(LIBXMP_AR) -o $@ $(LDFLAGS) # Space Taxi asset pipeline (mirrors dos.mk + amiga.mk). -.SECONDARY: $(STAXI_LEVEL_GEN) $(STAXI_TBK_GEN) $(STAXI_SPR_GEN) $(STAXI_SPC_GEN) +.SECONDARY: $(STAXI_LEVEL_GEN) $(STAXI_TBK_GEN) $(STAXI_SPR_GEN) $(STAXI_SPC_GEN) $(STAXICELS_SPC_GEN) $(STAXI_ROM_LEVEL_GEN) &: $(STAXI_RAW_DUMP) $(ROMTOLEVEL_BIN) @mkdir -p $(STAXI_GEN_DIR)/levels @@ -251,6 +258,15 @@ $(STAXI_GEN_DIR)/%.spc: $(STAXI_GEN_DIR)/%.spr $(SPRITEBAKE_BIN) $(SPRITEBAKE_BIN): $(MAKE) -f $(REPO_DIR)/make/tools.mk spritebake-atarist +$(STAXIBAKE_BIN): + $(MAKE) -f $(REPO_DIR)/make/tools.mk staxibake + +# Explicit rule (overrides the %.spr-from-%.png pattern): the cel bank is +# generated from the game's cel table, not a PNG. +$(STAXICELS_SPR_GEN): $(STAXIBAKE_BIN) $(EXAMPLES)/spacetaxi/stCels.c $(EXAMPLES)/spacetaxi/stC64Data.c + @mkdir -p $(dir $@) + $(STAXIBAKE_BIN) $@ + $(STAXI_RUN_DIR)/levels/%.dat: $(STAXI_GEN_DIR)/levels/%.dat @mkdir -p $(dir $@) cp $< $@ diff --git a/make/dos.mk b/make/dos.mk index 528dad1..de03dbf 100644 --- a/make/dos.mk +++ b/make/dos.mk @@ -71,7 +71,7 @@ ADV2_SRC := $(EXAMPLES)/adventure2/adventure2.c ADV2_BIN := $(BINDIR)/ADV2.EXE AGI_SRCS := $(EXAMPLES)/agi/agi.c $(EXAMPLES)/agi/agiRes.c $(EXAMPLES)/agi/agiPic.c $(EXAMPLES)/agi/agiView.c $(EXAMPLES)/agi/agiVm.c $(EXAMPLES)/agi/agiObj.c $(EXAMPLES)/agi/agiText.c AGI_BIN := $(BINDIR)/AGI.EXE -STAXI_SRCS := $(EXAMPLES)/spacetaxi/spacetaxi.c $(EXAMPLES)/spacetaxi/stLevel.c $(EXAMPLES)/spacetaxi/stLevelFile.c $(EXAMPLES)/spacetaxi/stRender.c $(EXAMPLES)/spacetaxi/stSim.c $(EXAMPLES)/spacetaxi/stFare.c $(EXAMPLES)/spacetaxi/stHooks.c $(EXAMPLES)/spacetaxi/stTitle.c $(EXAMPLES)/spacetaxi/stC64Data.c $(EXAMPLES)/spacetaxi/stAudio.c +STAXI_SRCS := $(EXAMPLES)/spacetaxi/spacetaxi.c $(EXAMPLES)/spacetaxi/stLevel.c $(EXAMPLES)/spacetaxi/stLevelFile.c $(EXAMPLES)/spacetaxi/stRender.c $(EXAMPLES)/spacetaxi/stSim.c $(EXAMPLES)/spacetaxi/stFare.c $(EXAMPLES)/spacetaxi/stHooks.c $(EXAMPLES)/spacetaxi/stTitle.c $(EXAMPLES)/spacetaxi/stC64Data.c $(EXAMPLES)/spacetaxi/stCels.c $(EXAMPLES)/spacetaxi/stAudio.c # JoeyLib install convention: each app lives in its own bin subdir # with a DATA/ folder alongside the binary for runtime assets. STAXI_INSTALL_DIR := $(BINDIR)/STAXI @@ -122,11 +122,18 @@ ASSETBAKE_TARGET := dos STAXI_LEVEL_RUN := $(patsubst $(STAXI_GEN_DIR)/%,$(STAXI_RUN_DIR)/%,$(STAXI_LEVEL_GEN)) STAXI_TBK_RUN := $(patsubst $(STAXI_GEN_DIR)/%,$(STAXI_RUN_DIR)/%,$(STAXI_TBK_GEN)) STAXI_SPR_RUN := $(patsubst $(STAXI_GEN_DIR)/%,$(STAXI_RUN_DIR)/%,$(STAXI_SPR_GEN)) -STAXI_ASSET_DSTS := $(STAXI_LEVEL_RUN) +STAXI_ASSET_DSTS := $(STAXI_LEVEL_RUN) $(STAXICELS_SPC_RUN) # Pre-compiled sprite banks (.spc): baked from the .spr by the host spritebake # tool for THIS target and staged next to the .spr, so the runtime loads # compiled routines with no startup JIT (jlSpriteBankLoadPrecompiled). SPRITEBAKE_BIN := $(REPO_DIR)/build/tools/spritebake-dos +# The C64-exact cel bank, generated by staxibake (from the shared cel table +# stCels.c + C64 bitmaps) and compiled to a .spc by the host spritebake, so +# STAXI loads its cels already compiled instead of JIT-compiling them at boot. +STAXIBAKE_BIN := $(REPO_DIR)/build/tools/staxibake +STAXICELS_SPR_GEN := $(STAXI_GEN_DIR)/sprites/staxicels.spr +STAXICELS_SPC_GEN := $(STAXICELS_SPR_GEN:.spr=.spc) +STAXICELS_SPC_RUN := $(patsubst $(STAXI_GEN_DIR)/%,$(STAXI_RUN_DIR)/%,$(STAXICELS_SPC_GEN)) STAXI_SPC_GEN := $(STAXI_SPR_GEN:.spr=.spc) STAXI_SPC_RUN := $(patsubst $(STAXI_GEN_DIR)/%,$(STAXI_RUN_DIR)/%,$(STAXI_SPC_GEN)) @@ -246,7 +253,7 @@ $(STAXI_BIN): $(STAXI_SRCS) $(LIB) $(LIBXMP_AR) # Mark these .SECONDARY so make doesn't auto-delete them after the # stage-B copy into bin/ -- they're the canonical distribution # artifacts. -.SECONDARY: $(STAXI_LEVEL_GEN) $(STAXI_TBK_GEN) $(STAXI_SPR_GEN) $(STAXI_SPC_GEN) +.SECONDARY: $(STAXI_LEVEL_GEN) $(STAXI_TBK_GEN) $(STAXI_SPR_GEN) $(STAXI_SPC_GEN) $(STAXICELS_SPC_GEN) # Bulk-extract all 24 canonical levels plus the title from the C64 # ROM in one invocation. Grouped target (&:) means make treats the @@ -271,6 +278,15 @@ $(STAXI_GEN_DIR)/%.spc: $(STAXI_GEN_DIR)/%.spr $(SPRITEBAKE_BIN) $(SPRITEBAKE_BIN): $(MAKE) -f $(REPO_DIR)/make/tools.mk spritebake-dos +$(STAXIBAKE_BIN): + $(MAKE) -f $(REPO_DIR)/make/tools.mk staxibake + +# Explicit rule (overrides the %.spr-from-%.png pattern): the cel bank is +# generated from the game's cel table, not a PNG. +$(STAXICELS_SPR_GEN): $(STAXIBAKE_BIN) $(EXAMPLES)/spacetaxi/stCels.c $(EXAMPLES)/spacetaxi/stC64Data.c + @mkdir -p $(dir $@) + $(STAXIBAKE_BIN) $@ + # Stage B: copy generated/ into the per-target bin/assets/ runtime tree $(STAXI_RUN_DIR)/levels/%.dat: $(STAXI_GEN_DIR)/levels/%.dat @mkdir -p $(dir $@) diff --git a/make/iigs.mk b/make/iigs.mk index faacded..e77808e 100644 --- a/make/iigs.mk +++ b/make/iigs.mk @@ -66,7 +66,7 @@ UBER_SRC := $(EXAMPLES)/uber/uber.c ADV_SRC := $(EXAMPLES)/adventure/adventure.c ADV2_SRC := $(EXAMPLES)/adventure2/adventure2.c AGI_SRCS := $(EXAMPLES)/agi/agi.c $(EXAMPLES)/agi/agiRes.c $(EXAMPLES)/agi/agiPic.c $(EXAMPLES)/agi/agiView.c $(EXAMPLES)/agi/agiVm.c $(EXAMPLES)/agi/agiObj.c $(EXAMPLES)/agi/agiText.c -STAXI_SRCS := $(EXAMPLES)/spacetaxi/stC64Data.c $(EXAMPLES)/spacetaxi/stSim.c $(EXAMPLES)/spacetaxi/spacetaxi.c $(EXAMPLES)/spacetaxi/stLevel.c $(EXAMPLES)/spacetaxi/stLevelFile.c $(EXAMPLES)/spacetaxi/stRender.c $(EXAMPLES)/spacetaxi/stFare.c $(EXAMPLES)/spacetaxi/stHooks.c $(EXAMPLES)/spacetaxi/stTitle.c $(EXAMPLES)/spacetaxi/stAudio.c +STAXI_SRCS := $(EXAMPLES)/spacetaxi/stC64Data.c $(EXAMPLES)/spacetaxi/stCels.c $(EXAMPLES)/spacetaxi/stSim.c $(EXAMPLES)/spacetaxi/spacetaxi.c $(EXAMPLES)/spacetaxi/stLevel.c $(EXAMPLES)/spacetaxi/stLevelFile.c $(EXAMPLES)/spacetaxi/stRender.c $(EXAMPLES)/spacetaxi/stFare.c $(EXAMPLES)/spacetaxi/stHooks.c $(EXAMPLES)/spacetaxi/stTitle.c $(EXAMPLES)/spacetaxi/stAudio.c AUDIO_SRC := $(EXAMPLES)/audio/audio.c # NinjaTrackerPlus replayer: Merlin32-assemble ninjatrackerplus.s to a 34KB @@ -106,13 +106,26 @@ iigs-examples: $(BINDIR)/PATTERN $(BINDIR)/DRAW $(BINDIR)/KEYS $(BINDIR)/SERIAL # we bake the .spc straight from the committed .spr with the host spritebake # tool; make-iigs-disk.sh then find(1)s the whole generated/iigs tree, so the # .spc rides onto the disk automatically once it exists. -STAXI_IIGS_SPR := $(wildcard $(EXAMPLES)/spacetaxi/generated/iigs/sprites/*.spr) -STAXI_IIGS_SPC := $(STAXI_IIGS_SPR:.spr=.spc) +# The cel bank is GENERATED by staxibake from the game's shared cel table +# (stCels.c) + C64 bitmaps, then compiled to a .spc by the host +# spritebake; make-iigs-disk.sh find(1)s the whole generated/iigs tree so +# the .spc rides onto the disk. The game loads it at boot +# (jlSpriteBankLoadPrecompiled) instead of JIT-compiling every cel. +STAXICELS_SPR := $(EXAMPLES)/spacetaxi/generated/iigs/sprites/staxicels.spr +STAXI_IIGS_SPC := $(STAXICELS_SPR:.spr=.spc) SPRITEBAKE_IIGS := $(REPO_DIR)/build/tools/spritebake-iigs +STAXIBAKE := $(REPO_DIR)/build/tools/staxibake $(SPRITEBAKE_IIGS): $(MAKE) -f $(REPO_DIR)/make/tools.mk spritebake-iigs +$(STAXIBAKE): + $(MAKE) -f $(REPO_DIR)/make/tools.mk staxibake + +$(STAXICELS_SPR): $(STAXIBAKE) $(EXAMPLES)/spacetaxi/stCels.c $(EXAMPLES)/spacetaxi/stC64Data.c + @mkdir -p $(dir $@) + $(STAXIBAKE) $@ + $(EXAMPLES)/spacetaxi/generated/iigs/sprites/%.spc: $(EXAMPLES)/spacetaxi/generated/iigs/sprites/%.spr $(SPRITEBAKE_IIGS) $(SPRITEBAKE_IIGS) $< $@ diff --git a/make/tools.mk b/make/tools.mk index 901a4f5..d38629b 100644 --- a/make/tools.mk +++ b/make/tools.mk @@ -24,6 +24,14 @@ MODLOOPEND_BIN := $(BUILD_DIR)/modloopend MKSTLEVEL_SRC := $(REPO_DIR)/examples/spacetaxi/mkstlevel/mkstlevel.c MKSTLEVEL_BIN := $(BUILD_DIR)/mkstlevel +# staxibake -- generates the Space Taxi cel bank (.spr) from the game's +# shared cel table + C64 bitmaps, for offline sprite pre-compilation. A +# plain host tool (the .spr is cross-platform); spritebake then compiles +# it per target. +STAXI_DIR := $(REPO_DIR)/examples/spacetaxi +STAXIBAKE_SRC := $(TOOLS_DIR)/staxibake/staxibake.c $(STAXI_DIR)/stCels.c $(STAXI_DIR)/stC64Data.c +STAXIBAKE_BIN := $(BUILD_DIR)/staxibake + # spritebake -- offline sprite pre-compiler. Built ONCE PER TARGET on the # host: it links the shared staging (spriteStage.c) + that target's emitter, # compiled with -DJOEYLIB_PLATFORM_ so JOEY_SPRITE_SHIFT_COUNT and the @@ -33,11 +41,12 @@ MKSTLEVEL_BIN := $(BUILD_DIR)/mkstlevel SPRITEBAKE_SRC := $(TOOLS_DIR)/spritebake/spritebake.c $(SRC_CG)/spriteStage.c SPRITEBAKE_INC := -I$(INCLUDE_DIR) -I$(SRC_CORE) -I$(SRC_CG) -.PHONY: all tools clean-tools modloopend mkstlevel \ +.PHONY: all tools clean-tools modloopend mkstlevel staxibake \ spritebake-dos spritebake-amiga spritebake-atarist spritebake-iigs all tools: $(MODLOOPEND_BIN) $(MKSTLEVEL_BIN) modloopend: $(MODLOOPEND_BIN) mkstlevel: $(MKSTLEVEL_BIN) +staxibake: $(STAXIBAKE_BIN) spritebake-dos: $(BUILD_DIR)/spritebake-dos spritebake-amiga: $(BUILD_DIR)/spritebake-amiga spritebake-atarist: $(BUILD_DIR)/spritebake-atarist @@ -47,6 +56,10 @@ $(MODLOOPEND_BIN): $(MODLOOPEND_SRC) @mkdir -p $(dir $@) $(HOST_CC) $(HOST_CFLAGS) $< -o $@ +$(STAXIBAKE_BIN): $(STAXIBAKE_SRC) + @mkdir -p $(dir $@) + $(HOST_CC) $(HOST_CFLAGS) -I$(STAXI_DIR) $^ -o $@ + $(MKSTLEVEL_BIN): $(MKSTLEVEL_SRC) @mkdir -p $(dir $@) $(HOST_CC) $(HOST_CFLAGS) $< -o $@ diff --git a/nvram/x68000_0/nvram b/nvram/x68000_0/nvram deleted file mode 100644 index cefd27fa1b56ca6e08f97b61ac2d7e636741bcd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeIuu?>My6b0b(kf0z&5EJ~BsKf+XOX&3$V-T@{oH|wrD zbc-aHyz3(=wIvzv`z`5v#+hfc`P1tn}2H~;_u diff --git a/tools/staxibake/staxibake.c b/tools/staxibake/staxibake.c new file mode 100644 index 0000000..65c5500 --- /dev/null +++ b/tools/staxibake/staxibake.c @@ -0,0 +1,71 @@ +// staxibake -- generate the Space Taxi cel bank (.spr) for offline +// sprite pre-compilation. Runs on the host: it links the game's shared +// cel table (stCels.c) and the C64 sprite bitmaps (stC64Data.c) and +// writes the cross-platform JSP1 sprite bank in kStCels order. The +// per-target spritebake then compiles it to a .spc the game loads at +// boot with jlSpriteBankLoadPrecompiled, so no cel is JIT-compiled on +// the 65816 (which costs ~0.4 s each). +// +// Usage: staxibake OUTPUT.spr + +#include +#include +#include +#include + +#include "stCels.h" +#include "stC64Data.h" + +// JSP1 header (mirrors tools/spritebake + jlSpriteBankLoad): magic, +// target byte (0 = cross-platform chunky), has-palette, w/h tiles, +// cell count LE16, then a 32-byte palette block, all in 44 bytes. +#define SPR_HEADER_BYTES 44u +#define SPR_OFF_TARGET 4u +#define SPR_OFF_HAS_PAL 5u +#define SPR_OFF_WIDTH 6u +#define SPR_OFF_HEIGHT 7u +#define SPR_OFF_CELLS 8u + + +int main(int argc, char **argv) { + uint8_t header[SPR_HEADER_BYTES]; + FILE *out; + uint16_t i; + + if (argc < 2) { + fprintf(stderr, "usage: staxibake OUTPUT.spr\n"); + return 2; + } + out = fopen(argv[1], "wb"); + if (out == NULL) { + fprintf(stderr, "staxibake: cannot write %s\n", argv[1]); + return 1; + } + memset(header, 0, sizeof(header)); + memcpy(header, "JSP1", 4); + header[SPR_OFF_TARGET] = 0u; // cross-platform chunky + header[SPR_OFF_HAS_PAL] = 0u; // the game owns its palette + header[SPR_OFF_WIDTH] = (uint8_t)ST_CEL_TILES; + header[SPR_OFF_HEIGHT] = (uint8_t)ST_CEL_TILES; + header[SPR_OFF_CELLS] = (uint8_t)(kStCelCount & 0xFFu); + header[SPR_OFF_CELLS + 1u] = (uint8_t)(kStCelCount >> 8); + if (fwrite(header, 1, SPR_HEADER_BYTES, out) != SPR_HEADER_BYTES) { + fprintf(stderr, "staxibake: header write failed\n"); + fclose(out); + return 1; + } + for (i = 0u; i < kStCelCount; i++) { + uint8_t blob[ST_CEL_BYTES]; + const uint8_t *bm = stC64SpriteBitmap((uint8_t)(kStCels[i].ptr - ST_SPRITE_PTR_FIRST)); + + stCelBlob(bm, kStCels[i].multi, kStCels[i].color, kStCels[i].mc0, kStCels[i].mc1, blob); + if (fwrite(blob, 1, ST_CEL_BYTES, out) != ST_CEL_BYTES) { + fprintf(stderr, "staxibake: cel %u write failed\n", (unsigned)i); + fclose(out); + return 1; + } + } + fclose(out); + fprintf(stderr, "staxibake: wrote %u cels (%ux%u tiles) -> %s\n", (unsigned)kStCelCount, (unsigned)ST_CEL_TILES, (unsigned)ST_CEL_TILES, argv[1]); + return 0; +} diff --git a/tools/stsim/stsim b/tools/stsim/stsim deleted file mode 100755 index d5fb5c44cc6de72528729819c53ccb52ac3cfa69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148328 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 z 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