From: sparky4 Date: Wed, 31 May 2017 21:36:14 +0000 (-0500) Subject: BROKEN ON REAL HW comitted to see what was changed X-Git-Url: http://4ch.mooo.com/gitweb/?p=16.git;a=commitdiff_plain;h=8c5ce6d6e768ba3dfac7f4e2e95d68152ab42aaa BROKEN ON REAL HW comitted to see what was changed --- diff --git a/16/modex16/bitmap.h b/16/modex16/bitmap.h index 4c4af98e..5ba53c81 100755 --- a/16/modex16/bitmap.h +++ b/16/modex16/bitmap.h @@ -4,20 +4,38 @@ #ifndef BITMAP_H #define BITMAP_H #include "types.h" +typedef struct { + byte *data; + word width; + word height; + byte *palette; + word offset; +} bitmap_t; +/* typedef struct { byte *data; word width; word height; byte *palette; } bitmap_t; +*/ +typedef struct { + byte far **data; + word ntiles; // the number of tiles + word twidth; // width of the tiles + word theight; // height of the tiles + byte *palette; // palette for the tile set +} tileset_t; +/* typedef struct { byte **data; - word ntiles; /* the number of tiles */ - word twidth; /* width of the tiles */ - word theight; /* height of the tiles */ - byte *palette; /* palette for the tile set */ + word ntiles; // the number of tiles + word twidth; // width of the tiles + word theight; // height of the tiles + byte *palette; // palette for the tile set } tileset_t; +*/ bitmap_t bitmapLoadPcx(char *filename); tileset_t bitmapLoadPcxTiles(char *filename, word twidth, word theight); diff --git a/16/modex16/modex16.h b/16/modex16/modex16.h index 77573105..5ce666df 100755 --- a/16/modex16/modex16.h +++ b/16/modex16/modex16.h @@ -34,6 +34,7 @@ void modexDrawBmp(page_t *page, int x, int y, bitmap_t *bmp); void modexDrawBmpRegion(page_t *page, int x, int y, int rx, int ry, int rw, int rh, bitmap_t *bmp); void modexDrawSprite(page_t *page, int x, int y, bitmap_t *bmp); void modexDrawSpriteRegion(page_t *page, int x, int y, int rx, int ry, int rw, int rh, bitmap_t *bmp); +void modexCopyPageRegion(page_t *dest, page_t *src, word sx, word sy, word dx, word dy, word width, word height); /* Palette fade and flash effects */ void modexFadeOn(word fade, byte *palette); diff --git a/src/lib/16_vrs.c b/16/src/lib/16_vrs.c similarity index 100% rename from src/lib/16_vrs.c rename to 16/src/lib/16_vrs.c diff --git a/src/lib/16_vrs.h b/16/src/lib/16_vrs.h similarity index 100% rename from src/lib/16_vrs.h rename to 16/src/lib/16_vrs.h diff --git a/1croll.exe b/1croll.exe deleted file mode 100755 index beb750e1..00000000 Binary files a/1croll.exe and /dev/null differ diff --git a/DEBUG.16W b/DEBUG.16W new file mode 100755 index 00000000..257ae9ff --- /dev/null +++ b/DEBUG.16W @@ -0,0 +1,210 @@ +Seg:0 Size:10306 Owner:0x0 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++00 +Seg:2896 Size:76 Owner:0x0 +0 +Seg:28e2 Size:256 Owner:0x6120 +0 +Seg:29e2 Size:256 Owner:0x1f62 +0 +Seg:2ae2 Size:256 Owner:0x1f64 +0 +Seg:2be2 Size:256 Owner:0x1f66 +0 +Seg:2ce2 Size:256 Owner:0x1f68 +0 +Seg:2de2 Size:256 Owner:0x1f6a +0 +Seg:2ee2 Size:256 Owner:0x1f6c +0 +Seg:2fe2 Size:256 Owner:0x1f6e +0 +Seg:30e2 Size:256 Owner:0x1f70 +0 +Seg:31e2 Size:256 Owner:0x1f72 +0 +Seg:32e2 Size:256 Owner:0x1f74 +0 +Seg:33e2 Size:256 Owner:0x1f76 +0 +Seg:34e2 Size:256 Owner:0x1f78 +0 +Seg:35e2 Size:256 Owner:0x1f7a +0 +Seg:36e2 Size:256 Owner:0x1f7c +0 +Seg:37e2 Size:256 Owner:0x1f7e +0 +Seg:38e2 Size:256 Owner:0x1f80 +0 +Seg:39e2 Size:256 Owner:0x1f82 +0 +Seg:3ae2 Size:256 Owner:0x1f84 +0 +Seg:3be2 Size:256 Owner:0x1f86 +0 +Seg:3ce2 Size:256 Owner:0x1f88 +0 +Seg:3de2 Size:256 Owner:0x1f8a +0 +Seg:3ee2 Size:256 Owner:0x1f8c +0 +Seg:3fe2 Size:256 Owner:0x1f8e +0 +Seg:40e2 Size:256 Owner:0x1f90 +0 +Seg:41e2 Size:256 Owner:0x1f92 +0 +Seg:42e2 Size:256 Owner:0x1f94 +0 +Seg:43e2 Size:256 Owner:0x1f96 +0 +Seg:44e2 Size:256 Owner:0x1f98 +0 +Seg:45e2 Size:256 Owner:0x1f9a +0 +Seg:46e2 Size:256 Owner:0x1f9c +0 +Seg:47e2 Size:256 Owner:0x1f9e +0 +Seg:48e2 Size:256 Owner:0x1fa0 +0 +Seg:49e2 Size:256 Owner:0x1fa2 +0 +Seg:4ae2 Size:256 Owner:0x1fa4 +0 +Seg:4be2 Size:256 Owner:0x1fa6 +0 +Seg:4ce2 Size:256 Owner:0x1fa8 +0 +Seg:4de2 Size:256 Owner:0x1faa +0 +Seg:4ee2 Size:256 Owner:0x1fac +0 +Seg:4fe2 Size:256 Owner:0x1fae +0 +Seg:50e2 Size:256 Owner:0x1fb0 +0 +Seg:51e2 Size:256 Owner:0x1fb2 +0 +Seg:52e2 Size:256 Owner:0x1fb4 +0 +Seg:53e2 Size:256 Owner:0x1fb6 +0 +Seg:54e2 Size:256 Owner:0x1fb8 +0 +Seg:55e2 Size:256 Owner:0x1fba +0 +Seg:56e2 Size:256 Owner:0x1fbc +0 +Seg:57e2 Size:256 Owner:0x1fbe +0 +Seg:58e2 Size:256 Owner:0x1fc0 +0 +Seg:59e2 Size:256 Owner:0x1fc2 +0 +Seg:5ae2 Size:256 Owner:0x1fc4 +0 +Seg:5be2 Size:256 Owner:0x1fc6 +0 +Seg:5ce2 Size:256 Owner:0x1fc8 +0 +Seg:5de2 Size:256 Owner:0x1fca +0 +Seg:5ee2 Size:256 Owner:0x1fcc +0 +Seg:5fe2 Size:256 Owner:0x1fce +0 +Seg:60e2 Size:256 Owner:0x1fd0 +0 +Seg:61e2 Size:256 Owner:0x1fd2 +0 +Seg:62e2 Size:256 Owner:0x1fd4 +0 +Seg:63e2 Size:256 Owner:0x1fd6 +0 +Seg:64e2 Size:256 Owner:0x1fd8 +0 +Seg:65e2 Size:256 Owner:0x1fda +0 +Seg:66e2 Size:256 Owner:0x1fdc +0 +Seg:67e2 Size:256 Owner:0x1fde +0 +Seg:68e2 Size:256 Owner:0x1fe0 +0 +Seg:69e2 Size:256 Owner:0x1fe2 +0 +Seg:6ae2 Size:256 Owner:0x1fe4 +0 +Seg:6be2 Size:256 Owner:0x1fe6 +0 +Seg:6ce2 Size:256 Owner:0x1fe8 +0 +Seg:6de2 Size:256 Owner:0x1fea +0 +Seg:6ee2 Size:256 Owner:0x1fec +0 +Seg:6fe2 Size:256 Owner:0x1fee +0 +Seg:70e2 Size:256 Owner:0x1ff0 +0 +Seg:71e2 Size:256 Owner:0x1ff2 +0 +Seg:72e2 Size:256 Owner:0x1ff4 +0 +Seg:73e2 Size:256 Owner:0x1ff6 +0 +Seg:74e2 Size:256 Owner:0x1ff8 +0 +Seg:75e2 Size:256 Owner:0x1ffa +0 +Seg:76e2 Size:256 Owner:0x1ffc +0 +Seg:77e2 Size:256 Owner:0x1ffe +0 +Seg:78e2 Size:256 Owner:0x2000 +0 +Seg:79e2 Size:256 Owner:0x2002 +0 +Seg:7ae2 Size:256 Owner:0x2004 +0 +Seg:7be2 Size:256 Owner:0x2006 +0 +Seg:7ce2 Size:256 Owner:0x2008 +0 +Seg:7de2 Size:256 Owner:0x200a +0 +Seg:7ee2 Size:256 Owner:0x200c +0 +Seg:7fe2 Size:256 Owner:0x200e +0 +Seg:80e2 Size:256 Owner:0x2010 +0 +Seg:81e2 Size:256 Owner:0x2012 +0 +Seg:82e2 Size:256 Owner:0x2014 +0 +Seg:83e2 Size:256 Owner:0x2016 +0 +Seg:84e2 Size:256 Owner:0x2018 +0 +Seg:85e2 Size:256 Owner:0x201a +0 +Seg:86e2 Size:256 Owner:0x201c +0 +Seg:87e2 Size:256 Owner:0x201e +0 +Seg:88e2 Size:256 Owner:0x2020 +0 +Seg:89e2 Size:256 Owner:0x2022 +0 +Seg:8ae2 Size:256 Owner:0x2024 +0 +Seg:8be2 Size:256 Owner:0x2026 +0 +Seg:8ce2 Size:256 Owner:0x2028 +0 +Seg:8de2 Size:273 Owner:0x6120 +000000000000000000000000000000000000000000000000 +Seg:9dc1 Size:25150 Owner:0x0 + \ No newline at end of file diff --git a/HEAP.16W b/HEAP.16W index 7307e0f1..8f8a02d6 100755 --- a/HEAP.16W +++ b/HEAP.16W @@ -1,79 +1,81 @@ == default == - USED block at 2e770016 of size 6146 - USED block at 2e771818 of size 20 - USED block at 2e77182c of size 66 - USED block at 2e77186e of size 50 - USED block at 2e7718a0 of size 50 - USED block at 2e7718d2 of size 50 - USED block at 2e771904 of size 50 - USED block at 2e771936 of size 50 - USED block at 2e771968 of size 50 - USED block at 2e77199a of size 50 - USED block at 2e7719cc of size 50 - USED block at 2e7719fe of size 50 - USED block at 2e771a30 of size 50 - USED block at 2e771a62 of size 50 - USED block at 2e771a94 of size 50 - FREE block at 2e771ac6 of size 29618 - USED block at 2e778e78 of size 1202 - USED block at 2e77932a of size 1202 - USED block at 2e7797dc of size 1202 - USED block at 2e779c8e of size 136 - USED block at 2e779d16 of size 22 - FREE block at 2e779d2c of size 8202 + USED block at 2ed20016 of size 4098 + USED block at 2ed21018 of size 20 + USED block at 2ed2102c of size 66 + USED block at 2ed2106e of size 50 + USED block at 2ed210a0 of size 50 + USED block at 2ed210d2 of size 50 + USED block at 2ed21104 of size 50 + USED block at 2ed21136 of size 50 + USED block at 2ed21168 of size 50 + USED block at 2ed2119a of size 50 + USED block at 2ed211cc of size 50 + USED block at 2ed211fe of size 50 + USED block at 2ed21230 of size 50 + USED block at 2ed21262 of size 50 + USED block at 2ed21294 of size 50 + FREE block at 2ed212c6 of size 29552 + USED block at 2ed28636 of size 1202 + USED block at 2ed28ae8 of size 1202 + USED block at 2ed28f9a of size 1202 + USED block at 2ed2944c of size 136 + USED block at 2ed294d4 of size 22 + FREE block at 2ed294ea of size 8202 + FREE block at 2ed2b4f4 of size 0 ERROR - bad node in heap == near == - FREE block at 1e76f9a6 of size 12 - FREE block at 1e76f9b2 of size 320 - FREE block at 1e76faf2 of size 52 - FREE block at 1e76fb26 of size 20 - FREE block at 1e76fb3a of size 20 - FREE block at 1e76fb4e of size 20 - FREE block at 1e76fb62 of size 20 - FREE block at 1e76fb76 of size 20 - FREE block at 1e76fb8a of size 1138 + FREE block at 1ed1f9f6 of size 12 + FREE block at 1ed1fa02 of size 320 + FREE block at 1ed1fb42 of size 52 + FREE block at 1ed1fb76 of size 20 + FREE block at 1ed1fb8a of size 20 + FREE block at 1ed1fb9e of size 20 + FREE block at 1ed1fbb2 of size 20 + FREE block at 1ed1fbc6 of size 20 + FREE block at 1ed1fbda of size 1058 OK - end of heap == far == - FREE block at 2e770016 of size 6146 - FREE block at 2e771818 of size 20 - FREE block at 2e77182c of size 66 - FREE block at 2e77186e of size 50 - FREE block at 2e7718a0 of size 50 - FREE block at 2e7718d2 of size 50 - FREE block at 2e771904 of size 50 - FREE block at 2e771936 of size 50 - FREE block at 2e771968 of size 50 - FREE block at 2e77199a of size 50 - FREE block at 2e7719cc of size 50 - FREE block at 2e7719fe of size 50 - FREE block at 2e771a30 of size 50 - FREE block at 2e771a62 of size 50 - FREE block at 2e771a94 of size 50 - FREE block at 2e771ac6 of size 29618 - FREE block at 2e778e78 of size 1202 - FREE block at 2e77932a of size 1202 - FREE block at 2e7797dc of size 1202 - FREE block at 2e779c8e of size 136 - FREE block at 2e779d16 of size 22 - FREE block at 2e779d2c of size 8202 + FREE block at 2ed20016 of size 4098 + FREE block at 2ed21018 of size 20 + FREE block at 2ed2102c of size 66 + FREE block at 2ed2106e of size 50 + FREE block at 2ed210a0 of size 50 + FREE block at 2ed210d2 of size 50 + FREE block at 2ed21104 of size 50 + FREE block at 2ed21136 of size 50 + FREE block at 2ed21168 of size 50 + FREE block at 2ed2119a of size 50 + FREE block at 2ed211cc of size 50 + FREE block at 2ed211fe of size 50 + FREE block at 2ed21230 of size 50 + FREE block at 2ed21262 of size 50 + FREE block at 2ed21294 of size 50 + FREE block at 2ed212c6 of size 29552 + FREE block at 2ed28636 of size 1202 + FREE block at 2ed28ae8 of size 1202 + FREE block at 2ed28f9a of size 1202 + FREE block at 2ed2944c of size 136 + FREE block at 2ed294d4 of size 22 + FREE block at 2ed294ea of size 8202 + FREE block at 2ed2b4f4 of size 0 ERROR - bad node in heap Memory Type Total Used Free ---------------- -------- -------- -------- -Default 48416 10596 37820 -Near 1622 484 1138 -Far 48416 10596 37820 +Default 46302 8548 37754 +Near 1542 484 1058 +Far 46302 8548 37754 ---------------- -------- -------- -------- -HC_coreleft = 1136 -HC_farcoreleft = 417792 -HC_GetFreeSize = 37820 -HC_GetNearFreeSize = 1138 -HC_GetFarFreeSize = 37820 -memavl = 1136 +HC_coreleft = 1056 +HC_farcoreleft = 415744 +HC_GetFreeSize = 37754 +HC_GetNearFreeSize = 1058 +HC_GetFarFreeSize = 37754 +memavl = 1056 stackavail = 31484 diff --git a/MMDUMP.16W b/MMDUMP.16W index 53b3a1de..276718ef 100755 Binary files a/MMDUMP.16W and b/MMDUMP.16W differ diff --git a/XCROLL.16W b/XCROLL.16W new file mode 100755 index 00000000..32f5ab2d Binary files /dev/null and b/XCROLL.16W differ diff --git a/XCROLL1.16W b/XCROLL1.16W index 2346cfed..10ab33c3 100755 Binary files a/XCROLL1.16W and b/XCROLL1.16W differ diff --git a/XCROLL2.16W b/XCROLL2.16W index 85dca0f0..276718ef 100755 Binary files a/XCROLL2.16W and b/XCROLL2.16W differ diff --git a/XCROLL3.16W b/XCROLL3.16W index 85dca0f0..276718ef 100755 Binary files a/XCROLL3.16W and b/XCROLL3.16W differ diff --git a/XCROLL4.16W b/XCROLL4.16W index 53b3a1de..32f5ab2d 100755 Binary files a/XCROLL4.16W and b/XCROLL4.16W differ diff --git a/makefile b/makefile index 55a314c3..bc868580 100755 --- a/makefile +++ b/makefile @@ -145,7 +145,7 @@ LIBFLAGS=$(WLIBQ) -b -n # VGMSNDOBJ = vgmSnd.$(OBJ) OLDLIBOBJS=bitmap.$(OBJ) 16render.$(OBJ) -GFXLIBOBJS = 16_vl.$(OBJ) 16_vl_1.$(OBJ) 16_vl_2.$(OBJ) 16_vlpal.$(OBJ) 16text.$(OBJ) scroll16.$(OBJ) 16_vrs.$(OBJ) 16_spri.$(OBJ) +GFXLIBOBJS = 16_vl.$(OBJ) 16_vl_1.$(OBJ) 16_vl_2.$(OBJ) 16_vlpal.$(OBJ) 16text.$(OBJ) scroll16.$(OBJ) 16_spri.$(OBJ) 16LIBOBJS = 16_mm.$(OBJ) 16_pm.$(OBJ) 16_ca.$(OBJ) 16_tail.$(OBJ) 16_head.$(OBJ) 16_enti.$(OBJ) 16_dbg.$(OBJ) 16_in.$(OBJ) kitten.$(OBJ) 16_hc.$(OBJ) 16_wcpu.$(OBJ) 16_timer.$(OBJ) jsmn.$(OBJ) 16_map.$(OBJ) 16_sd.$(OBJ) 16_tail_.$(OBJ) 16_dbg_1.$(OBJ) DOSLIBOBJ = adlib.$(OBJ) 8254.$(OBJ) 8259.$(OBJ) dos.$(OBJ) cpu.$(OBJ) !ifeq DEBUGSERIAL 1 @@ -204,6 +204,7 @@ TESTEXEC = & sountest.exe & xcroll.exe & 0croll.exe & + 1croll.exe & inputest.exe & vrstest.exe & tesuto.exe & @@ -266,7 +267,7 @@ bakapi.exe: bakapi.$(OBJ) 16_vl.$(OBJ) 16_vl_1.$(OBJ) 16text.$(OBJ) bakapee.$(O # scroll.exe: scroll.$(OBJ) $(16LIB) gfx.lib $(DOSLIB) scroll.$(OBJ): $(SRC)/scroll.c -xcroll.exe: xcroll.$(OBJ) $(16LIB) gfx.lib $(DOSLIB) +xcroll.exe: xcroll.$(OBJ) $(16LIB) gfx.lib $(DOSLIB) #bitmapl.$(OBJ) xcroll.$(OBJ): $(SRC)/xcroll.c zcroll.exe: zcroll.$(OBJ) $(16LIB) gfx.lib $(DOSLIB) zcroll.$(OBJ): $(SRC)/zcroll.c @@ -387,7 +388,7 @@ opltest.exe: 16_vlpal.$(OBJ): $(SRCLIB)/16_vlpa_.c $(SRCLIB)/16_vlpal.c $(SRCLIB)/16_vlpal.h bakapee.$(OBJ): $(SRCLIB)/bakapee.c $(SRCLIB)/bakapee.h 16planar.$(OBJ): $(MODEXLIB16)/16planar.c $(MODEXLIB16)/16planar.h -16_vrs.$(OBJ): $(SRCLIB)/16_vrs.c $(SRCLIB)/16_vrs.h $(DOSLIB) +#16_vrs.$(OBJ): $(SRCLIB)/16_vrs.c $(SRCLIB)/16_vrs.h $(DOSLIB) 16_spri.$(OBJ): $(SRCLIB)/16_spri.c $(SRCLIB)/16_spri.h planar.$(OBJ): $(SRCLIB)/planar.c $(SRCLIB)/planar.h scroll16.$(OBJ): $(SRCLIB)/scroll16.c $(SRCLIB)/scroll16.h @@ -414,10 +415,11 @@ kitten.$(OBJ): $(NYANLIB)/kitten.c $(NYANLIB)/kitten.h vgmSnd.$(OBJ): $(VGMSNDLIB)/vgmSnd.c $(VGMSNDLIB)/vgmSnd.h 16_wcpu.$(OBJ): $(WCPULIB)/16_wcpu.c $(WCPULIB)/16_wcpu.h #memory.$(OBJ): $(EXMMLIB)/memory.c $(EXMMLIB)/memory.h -midi.$(OBJ): $(SRCLIB)/midi.c +#midi.$(OBJ): $(SRCLIB)/midi.c c_utils.$(OBJ): $(MODEXLIB)/c_utils.asm modex.$(OBJ): $(MODEXLIB)/modex.asm ll.$(OBJ): $(SRCLIB)/ll.c $(SRCLIB)/ll.h +bitmapl.$(OBJ): $(SRCLIB)/bitmapl.c $(SRCLIB)/bitmapl.h # # old 16 lib @@ -426,6 +428,10 @@ ll.$(OBJ): $(SRCLIB)/ll.c $(SRCLIB)/ll.h wcl -0 $(WCLQ) 0croll.$(OBJ) modex16.obj dos_kb.obj bitmap.obj# omodex16.$(OBJ) bitmap.$(OBJ)# 16_ino.$(OBJ) 0croll.$(OBJ): $(SRC)/0croll.c wcl -0 $(WCLQ) -i"src/lib/doslib" -fo=.$(OBJ) -c src/0croll.c +1croll.exe: 1croll.$(OBJ) modex16.obj dos_kb.obj bitmap.obj# $(OLDLIBOBJS) omodex16.$(OBJ)# 16_ino.$(OBJ) + wcl -0 $(WCLQ) 1croll.$(OBJ) modex16.obj dos_kb.obj bitmap.obj# omodex16.$(OBJ) bitmap.$(OBJ)# 16_ino.$(OBJ) +1croll.$(OBJ): $(SRC)/1croll.c + wcl -0 $(WCLQ) -i"src/lib/doslib" -fo=.$(OBJ) -c src/1croll.c #16render.$(OBJ): $(OLDMODEX16LIBDIR)/16render.c $(OLDMODEX16LIBDIR)/16render.h # wcl -0 $(WCLQ) -i"src/lib/doslib" -fo=.$(OBJ) -c $(OLDMODEX16LIBDIR)/16render.c bitmap.$(OBJ): $(OLDMODEX16LIBDIR)/bitmap.c $(OLDMODEX16LIBDIR)/bitmap.h diff --git a/src/1croll.c b/src/1croll.c index 48868809..a4ebb87d 100755 --- a/src/1croll.c +++ b/src/1croll.c @@ -1,8 +1,8 @@ -#include "src\lib\modex16.h" +#include "16/modex16/modex16.h" #include #include -#include "src\lib\dos_kb.h" -#include "src\lib\wtest\wtest.c" +#include "16/modex16/dos_kb.h" +//#include "src/lib/wtest/wtest.h" //word far *clock= (word far*) 0x046C; /* 18.2hz clock */ @@ -69,7 +69,7 @@ void animatePlayer(map_view_t *src, map_view_t *dest, /*map_view_t *top, */short void main() { bitmap_t ptmp; // player sprite word q=1; - const char *cpus; +//++++ const char *cpus; static int persist_aniframe = 0; /* gonna be increased to 1 before being used, so 0 is ok for default */ page_t screen, screen2, screen3; map_t map; @@ -87,7 +87,7 @@ void main() { /* draw the tiles */ ptr = map.data; /*data\\*/ - ptmp = bitmapLoadPcx("ptmp.pcx"); // load sprite + ptmp = bitmapLoadPcx("data/chikyuu.pcx"); // load sprite setkb(1); modexEnter(); modexPalUpdate(ptmp.palette); @@ -343,6 +343,8 @@ break; printf("temporary player sprite 0: http://www.pixiv.net/member_illust.php?mode=medium&illust_id=45556867\n"); printf("temporary player sprite 1: http://www.pixiv.net/member_illust.php?mode=medium&illust_id=44606385\n"); printf("\n"); +#if 0 + //++++ switch(detectcpu()) { case 0: cpus = "8086/8088 or 186/88"; break; @@ -351,6 +353,7 @@ break; default: cpus = "internal error"; break; } printf("detected CPU type: %s\n", cpus); +#endif } @@ -611,5 +614,5 @@ animatePlayer(map_view_t *src, map_view_t *dest, /*map_view_t *top, */short d1, //modexClearRegion(top->page, 66, 66, 2, 40, 0); //modexCopyPageRegion(dest->page, top->page, 66, 66, 66, 66, 2, 40); //turn this off if XT - if(detectcpu() > 0) modexWaitBorder(); +//++++ if(detectcpu() > 0) modexWaitBorder(); } diff --git a/src/inputest.c b/src/inputest.c index 4df28afe..d802ab52 100755 --- a/src/inputest.c +++ b/src/inputest.c @@ -45,7 +45,7 @@ ctrl_Keyboard1); gvar.player[0].enti.q=1; gvar.player[0].enti.d=2; - gvar.player[0].enti.speed=4; + gvar.player[0].enti.spt=4; //0000 nibbletest(); //0000 booleantest(); @@ -58,7 +58,7 @@ ctrl_Keyboard1); { //right movement case 3: - if(gvar.player[0].enti.q<=(TILEWH/(gvar.player[0].enti.speed))) + if(gvar.player[0].enti.q<=(TILEWH/(gvar.player[0].enti.spt))) { gvar.player[0].enti.q++; } else { gvar.player[0].enti.q = 1; gvar.player[0].enti.d = 2; } @@ -66,7 +66,7 @@ ctrl_Keyboard1); //left movement case 1: - if(gvar.player[0].enti.q<=(TILEWH/(gvar.player[0].enti.speed))) + if(gvar.player[0].enti.q<=(TILEWH/(gvar.player[0].enti.spt))) { gvar.player[0].enti.q++; } else { gvar.player[0].enti.q = 1; gvar.player[0].enti.d = 2; } @@ -74,7 +74,7 @@ ctrl_Keyboard1); //down movement case 4: - if(gvar.player[0].enti.q<=(TILEWH/(gvar.player[0].enti.speed))) + if(gvar.player[0].enti.q<=(TILEWH/(gvar.player[0].enti.spt))) { gvar.player[0].enti.q++; } else { gvar.player[0].enti.q = 1; gvar.player[0].enti.d = 2; } @@ -82,7 +82,7 @@ ctrl_Keyboard1); //up movement case 0: - if(gvar.player[0].enti.q<=(TILEWH/(gvar.player[0].enti.speed))) + if(gvar.player[0].enti.q<=(TILEWH/(gvar.player[0].enti.spt))) { gvar.player[0].enti.q++; } else { gvar.player[0].enti.q = 1; gvar.player[0].enti.d = 2; } diff --git a/src/lib/16_enti.c b/src/lib/16_enti.c index 7210e6d3..713187c6 100755 --- a/src/lib/16_enti.c +++ b/src/lib/16_enti.c @@ -35,9 +35,9 @@ void EN_initentity(entity_t *enti, video_t *video) enti->d = 2;//dir var enti->pred = 4;//previous dir enti->hp = 4;//hit points - enti->speed = 4;//walkspeed + enti->spt = 4;//walkspeed enti->persist_aniframe = enti->q; - enti->spt=(TILEWH/(enti->speed)); //speed per tile wwww + enti->spt=(TILEWH/(enti->spt)); //speed per tile wwww enti->overdraww = 0; enti->overdrawh = 4; diff --git a/src/lib/16_mm.c b/src/lib/16_mm.c index 94fe16e7..e2e38ca1 100755 --- a/src/lib/16_mm.c +++ b/src/lib/16_mm.c @@ -1734,6 +1734,14 @@ void MM_DumpData (global_game_variables_t *gvar) } while (lowest != 0xffff); fclose (dumpfile); + + //reset filename +#ifdef __BORLANDC__ + strcpy(gvar->handle.datadumpfilename, "mmdump.16b"); +#endif +#ifdef __WATCOMC__ + strcpy(gvar->handle.datadumpfilename, "mmdump.16w"); +#endif //00 printf ("MMDUMP.16 created.\n"); } diff --git a/src/lib/16_spri.c b/src/lib/16_spri.c index 502ed4a4..326be10b 100755 --- a/src/lib/16_spri.c +++ b/src/lib/16_spri.c @@ -22,6 +22,193 @@ #include "src/lib/16_spri.h" #include + +#define VRS_USECAMMPM + +void VRS_ReadVRS(char *filename, entity_t *enti, global_game_variables_t *gvar){ VRS_OpenVRS(filename, enti, 1, gvar); } +void VRS_LoadVRS(char *filename, entity_t *enti, global_game_variables_t *gvar){ VRS_OpenVRS(filename, enti, 0, gvar); } +void VRS_OpenVRS(char *filename, entity_t *enti, boolean rlsw, global_game_variables_t *gvar) +{ +#ifndef VRS_USECAMMPM + vrl1_vgax_offset_t **vrl_line_offsets; +#endif + uint16_t far *vrl_id_iter; + uint32_t far *vrl_headers_offsets; + struct vrl1_vgax_header far *curr_vrl; + uint16_t vrl_size; + int num_of_vrl,i; + + switch(rlsw) + { + case 1: +//TODO ++++ CA_ReadFile(filename, &gvar->ca.spribuff, gvar); + CA_ReadFile(filename, MEMPTRCONV enti->spri.spritesheet.spribuff, gvar); + break; + case 0: +//TODO ++++ CA_LoadFile(filename, &gvar->ca.spribuff, gvar); + CA_LoadFile(filename, MEMPTRCONV enti->spri.spritesheet.spribuff, gvar); + break; + } + + // Insert sanity cheks later +//TODO ++++ enti->spri.spritesheet.buffer = gvar->ca.spribuff; + enti->spri.spritesheet.buffer = enti->spri.spritesheet.spribuff; //TODO: merge these 2 vars into 1 + enti->spri.spritesheet.data_size = sizeof(enti->spri.spritesheet.buffer) - sizeof(struct vrl1_vgax_header); + num_of_vrl = 0; + vrl_id_iter = (uint16_t far *)(enti->spri.spritesheet.buffer + enti->spri.spritesheet.vrs_hdr->offset_table[VRS_HEADER_OFFSET_SPRITE_ID_LIST]); + while(vrl_id_iter[num_of_vrl]){ + num_of_vrl++; + } + + // Allocate memory for vrl line offsets table +#ifndef VRS_USECAMMPM + vrl_line_offsets = malloc(sizeof(vrl1_vgax_offset_t *)*num_of_vrl);//TODO: USE MM_ CA_ AND PM_ +#else + switch(rlsw) + { + case 0: +#ifdef __DEBUG_MM__ + dbg_debugmm=0; +#endif +// MM_GetPtr(MEMPTRCONV gvar->ca.grsegs, sizeof(vrl1_vgax_offset_t *)*num_of_vrl, gvar); +// enti->spri.spritesheet.vrl_line_offsets = (vrl1_vgax_offset_t **)gvar->ca.grsegs; + MM_GetPtr(gvar->ca.spribuff, sizeof(vrl1_vgax_offset_t *)*num_of_vrl, gvar); + enti->spri.spritesheet.vrl_line_offsets = (vrl1_vgax_offset_t **)(gvar->ca.spribuff); +// MM_GetPtr(spribuff, sizeof(vrl1_vgax_offset_t *)*num_of_vrl, gvar); +// enti->spri.spritesheet.vrl_line_offsets = (vrl1_vgax_offset_t **)spribuff; + break; + } +#endif + + vrl_headers_offsets = (uint32_t far *)(enti->spri.spritesheet.buffer + enti->spri.spritesheet.vrs_hdr->offset_table[VRS_HEADER_OFFSET_VRS_LIST]); + // Calculate line offsets for each vrl + for(i = 0; i < num_of_vrl; i++){ + curr_vrl = (struct vrl1_vgax_header far *)(enti->spri.spritesheet.buffer + vrl_headers_offsets[i]); + + // Calc. vrl size as (next_offset - curr_offset) + if (i != num_of_vrl - 1){ + vrl_size = vrl_headers_offsets[i+1] - vrl_headers_offsets[i] - sizeof(struct vrl1_vgax_header); + } + // If it's the last vrl, size is (next_vrs_struct_offset - curr_offset) + else{ + vrl_size = enti->spri.spritesheet.vrs_hdr->offset_table[VRS_HEADER_OFFSET_SPRITE_ID_LIST] - vrl_headers_offsets[i] - sizeof(struct vrl1_vgax_header); + } +#ifndef VRS_USECAMMPM + vrl_line_offsets[i] = vrl1_vgax_genlineoffsets(curr_vrl, (byte *)curr_vrl + sizeof(struct vrl1_vgax_header), vrl_size); +#else + enti->spri.spritesheet.vrl_line_offsets[i] = vrl1_vgax_genlineoffsets(curr_vrl, (byte *)curr_vrl + sizeof(struct vrl1_vgax_header), vrl_size); +#endif + } +#ifndef VRS_USECAMMPM + enti->spri.spritesheet.vrl_line_offsets = vrl_line_offsets; +#endif +// printf("VRS_OpenVRS\n"); +// printf(" vrl_size=%lu\n\n",vrl_size); +} + +#if 0 +// +void VRS_ReadVRL(char *filename, entity_t *enti, global_game_variables_t *gvar){ VRS_OpenVRL(filename, enti, 1, gvar); } +void VRS_LoadVRL(char *filename, entity_t *enti, global_game_variables_t *gvar){ VRS_OpenVRL(filename, enti, 0, gvar); } +void VRS_OpenVRL(char *filename, entity_t *enti, boolean rlsw, global_game_variables_t *gvar) +{ +#ifndef VRL_USECAMMPM + vrl1_vgax_offset_t *line_offsets; +#endif +// uint32_t far *vrl_headers_offsets; + struct vrl1_vgax_header far *curr_vrl; + + switch(rlsw) + { + case 1: + CA_ReadFile(filename, &enti->spri.spritesheet.spribuff, gvar); + break; + case 0: + CA_LoadFile(filename, &enti->spri.spritesheet.spribuff, gvar); + break; + } + + // Insert sanity cheks later + enti->spri.sprite_vrl_cont.buffer = enti->spri.spritesheet.spribuff; + enti->spri.sprite_vrl_cont.data_size = sizeof(enti->spri.spritesheet.buffer) - sizeof(struct vrl1_vgax_header); + + // Allocate memory for vrl line offsets table +#ifndef VRL_USECAMMPM + line_offsets = malloc(sizeof(vrl1_vgax_offset_t *));//TODO: USE MM_ CA_ AND PM_ +#else + MM_GetPtr(MEMPTRCONV gvar->ca.grsegs[0], sizeof(vrl1_vgax_offset_t *), gvar); + enti->spri.sprite_vrl_cont.line_offsets = (vrl1_vgax_offset_t *)gvar->ca.grsegs[0]; +#endif + + //vrl_headers_offsets = (uint32_t far *)(enti->spri.sprite_vrl_cont.buffer + enti->spri.sprite_vrl_cont.vrs_hdr->offset_table[VRL_HEADER_OFFSET_VRL_LIST]); + // Calculate line offsets for each vrl + curr_vrl = (struct vrl1_vgax_header far *)(enti->spri.sprite_vrl_cont.buffer);// + vrl_headers_offsets); + +#ifndef VRL_USECAMMPM + line_offsets = vrl1_vgax_genlineoffsets(curr_vrl, (byte *)curr_vrl + sizeof(struct vrl1_vgax_header), sizeof(enti->spri.spritesheet.buffer)); +#else + enti->spri.sprite_vrl_cont.line_offsets = vrl1_vgax_genlineoffsets(curr_vrl, (byte *)curr_vrl + sizeof(struct vrl1_vgax_header), sizeof(enti->spri.spritesheet.buffer)); +#endif + +#ifndef VRL_USECAMMPM + enti->spri.sprite_vrl_cont.line_offsets = line_offsets; +#endif + printf("VRS_OpenVRL\n"); + printf(" vrl_size=%lu\n\n",sizeof(enti->spri.spritesheet.buffer)); +} +// +#endif + +// Seek and return a specified .vrl blob from .vrs blob in far memory +int get_vrl_by_id(struct vrs_container far *vrs_cont, uint16_t id, struct vrl_container *vrl_cont){ + uint16_t far *ids; + uint32_t far *vrl_offs_list; + int counter = 0; + + // If id is invalid, return -1 + if(id == 0){ + // Probably add an error message? + return -1; + } + + // Get id list from .vrs blob (base + offset) + ids = (uint16_t far*)(vrs_cont->buffer + + vrs_cont->vrs_hdr->offset_table[VRS_HEADER_OFFSET_SPRITE_ID_LIST]); + + // Loop through the id list until we found the right one or hit the end of the list + // Counter is keeping track of the offset(in ids/vrl blobs) + while(ids[counter] != id && ids[counter]){ + counter++; + } + // Return -2 if we couldn't find the requested id + if(!ids[counter]){ + // Error message? + return -2; + } + + // Get vrl offsets list from .vrs blob (base + offset) + vrl_offs_list = (uint32_t far *)(vrs_cont->buffer + + vrs_cont->vrs_hdr->offset_table[VRS_HEADER_OFFSET_VRS_LIST]); + + // Get vrl_header from .vrs (base + offset from vrl_list) + // Counter is number of vrls to skip (ids and vrls are aligned according to the .vrs specification) + vrl_cont->vrl_header = (struct vrl1_vgax_header far *)(vrs_cont->buffer + vrl_offs_list[counter]); + + // Get .vrl size by integer arithmetics (next vrl offset - current vrl offset) + if(ids[counter+1]){ + vrl_cont->data_size = vrl_offs_list[counter+1] - vrl_offs_list[counter] - sizeof(struct vrl1_vgax_header); + } + // If we are retriving the last vrl, size is ids_list offset - current vrl offset, as next vrl offs is 0 + else{ + vrl_cont->data_size = vrs_cont->vrs_hdr->offset_table[VRS_HEADER_OFFSET_SPRITE_ID_LIST] - vrl_offs_list[counter] - sizeof(struct vrl1_vgax_header); + } + + // Retrive line offsets form .vrs + vrl_cont->line_offsets = vrs_cont->vrl_line_offsets[counter]; + + return 0; +} + //void draw_vrl1_vgax_modex_strip(unsigned char far *draw,unsigned char far *s); //=========================================================================== @@ -159,7 +346,6 @@ void animate_spri(entity_t *enti, video_t *video) #define INC_PER_FRAME if(enti->q&1) enti->persist_aniframe++; if(enti->persist_aniframe>4) enti->persist_aniframe = 1; unsigned int i,o,o2; int j; int x,y,rx,ry,w,h; - static struct glob_game_vars *ggvv; VGA_RAM_PTR omemptr = (VGA_RAM_PTR)video->page[0].data;// save original mem ptr x=enti->spri.x; @@ -264,7 +450,11 @@ void animate_spri(entity_t *enti, video_t *video) // if(ggvv->player[0].enti.q<5) if(dbg_delayanimation) { - IN_Ack(ggvv);// delay(250);//{ while(!IN_KeyDown(sc_Space)/* && !IN_KeyDown(sc_Escape)*/){} delay(250); } + { + delay(250); + // static struct glob_game_vars *ggvv; IN_Ack(ggvv); + // { while(!IN_KeyDown(sc_Space)/* && !IN_KeyDown(sc_Escape)*/){} delay(250); } + } } #endif if(!video->vga_state.rss) diff --git a/src/lib/16_spri.h b/src/lib/16_spri.h index a170795a..0d23f3c8 100755 --- a/src/lib/16_spri.h +++ b/src/lib/16_spri.h @@ -22,9 +22,67 @@ #ifndef __16_SPRI__ #define __16_SPRI__ -#include "src/lib/16_vrs.h" +//#include "src/lib/16_vrs.h" +#include "src/lib/16_vl.h" +//#include +//#include +#include +#include "src/lib/16_ca.h" #include "src/lib/scroll16.h" + +/* +struct vrs_container{ + // Size of a .vrs lob in memory + // minus header + dword data_size; + union{ + byte far *buffer; + struct vrs_header far *vrs_hdr; + }; + // Array of corresponding vrl line offsets + vrl1_vgax_offset_t **vrl_line_offsets; +}; +*//* +struct vrl_container{ + // Size of a .vrl blob in memory + // minus header + dword data_size; + union{ + byte far *buffer; + struct vrl1_vgax_header far *vrl_header; + }; + // Pointer to a corresponding vrl line offsets struct + vrl1_vgax_offset_t *line_offsets; +}; +*/ +/* Read .vrs file into memory +* In: +* + char *filename - name of the file to load +* + struct vrs_container *vrs_cont - pointer to the vrs_container +* to load the file into +* Out: +* + int - 0 on succes, 1 on failure +*/ +void VRS_ReadVRS(char *filename, entity_t *enti, global_game_variables_t *gvar); +void VRS_LoadVRS(char *filename, entity_t *enti, global_game_variables_t *gvar); +void VRS_OpenVRS(char *filename, entity_t *enti, boolean rlsw, global_game_variables_t *gvar); +void VRS_ReadVRL(char *filename, entity_t *enti, global_game_variables_t *gvar); +void VRS_LoadVRL(char *filename, entity_t *enti, global_game_variables_t *gvar); +void VRS_OpenVRL(char *filename, entity_t *enti, boolean rlsw, global_game_variables_t *gvar); + +/* Seek and return a specified .vrl blob from .vrs blob in memory +* In: +* + struct vrs_container *vrs_cont - pointer to the vrs_container +* with a loaded .vrs file +* + uint16_t id - id of the vrl to retrive +* + struct vrl_container * vrl_cont - pointer to vrl_container to load to +* Out: +* int - operation status +* to the requested .vrl blob +*/ +int get_vrl_by_id(struct vrs_container *vrs_cont, uint16_t id, struct vrl_container * vrl_cont); + void DrawVRL (unsigned int x,unsigned int y,struct vrl1_vgax_header *hdr,vrl1_vgax_offset_t *lineoffs/*array hdr->width long*/,unsigned char *data,unsigned int datasz); //moved to 16_tdef.h diff --git a/src/lib/16_tail.h b/src/lib/16_tail.h index 70649493..d3df2e45 100755 --- a/src/lib/16_tail.h +++ b/src/lib/16_tail.h @@ -118,10 +118,10 @@ if(gvar.in.inst->Keyboard[sc_I]){ dbg_maptext=!dbg_maptext; IN_UserInput(1, &gvar); } \ if(gvar.in.inst->Keyboard[sc_PgDn]){ \ rotateR(gvar.video.palette, sizeof(gvar.video.palette)/sizeof(gvar.video.palette[0])); \ - VL_UpdatePaletteWrite(&gvar.video.palette, 0, &gvar); IN_UserInput(1, &gvar); } \ + VL_UpdatePaletteWrite(&gvar.video.palette, 0, 255, &gvar); IN_UserInput(1, &gvar); } \ if(gvar.in.inst->Keyboard[sc_PgUp]){ \ rotateL(gvar.video.palette, sizeof(gvar.video.palette)/sizeof(gvar.video.palette[0])); \ - VL_UpdatePaletteWrite(&gvar.video.palette, 0, &gvar); IN_UserInput(1, &gvar); } + VL_UpdatePaletteWrite(&gvar.video.palette, 0, 255, &gvar); IN_UserInput(1, &gvar); } #ifdef __BORLANDC__ #define PAL_WRITE_REG 0x03C8 /* Color register, write address */ #define PAL_DATA_REG 0x03C9 /* Color register, data port */ diff --git a/src/lib/16_tdef.h b/src/lib/16_tdef.h index 10e28b48..8eeaefd7 100755 --- a/src/lib/16_tdef.h +++ b/src/lib/16_tdef.h @@ -46,22 +46,6 @@ /* * typedefs of the game variables! */ -typedef struct { - byte *data; - word width; - word height; - byte *palette; - word offset; -} bitmap_t; - -typedef struct { - byte far **data; - word ntiles; // the number of tiles - word twidth; // width of the tiles - word theight; // height of the tiles - byte *palette; // palette for the tile set -} tileset_t; - typedef struct { byte far *plane[4]; // 4 planes of image data word width; // width of the image (spread across 4 planes) @@ -138,7 +122,7 @@ typedef struct nibble pred; //prev. direction for animation changing word dire; //sprite in use nibble q; //loop variable for anumation and locking the playing to compleate the animation cycle to prevent issues with misalignment www - word speed; //entity speed! +// word speed; //entity speed! word spt; //speed per tile #ifdef __WATCOMC__ sprite_t spri; // sprite used by entity @@ -801,6 +785,7 @@ typedef struct glob_game_vars in_info_t in; // 16_in info player_t player[MaxPlayers]; // player vars map_view_t mv[4]; + map_t map; // sw_t sw; boolean DLStarted; } global_game_variables_t; diff --git a/src/lib/16_vl.c b/src/lib/16_vl.c index ec88898e..106f7192 100755 --- a/src/lib/16_vl.c +++ b/src/lib/16_vl.c @@ -916,6 +916,8 @@ modexLoadPalFile(byte *filename, byte *palette) { fclose(file); } +#define COREPALSIZE 9//27 //3*9 + void VLL_LoadPalFilewithoffset(const char *filename, byte *palette, word o, word palsize, global_game_variables_t *gvar) { int fd; @@ -923,36 +925,36 @@ void VLL_LoadPalFilewithoffset(const char *filename, byte *palette, word o, word fd = open(filename,O_RDONLY|O_BINARY); if (fd >= 0) { - read(fd,palette, palsize); + read(fd,palette, palsize*3); close(fd); - if(palsize==27) newpalette = palette; else{ //if core then load it + if(palsize==COREPALSIZE) newpalette = palette; else{ //if core then load it newpalette = &palette[3]; //skip overscan color if(!o) o++; } - VL_UpdatePaletteWrite(newpalette, o, gvar); + VL_UpdatePaletteWrite(newpalette, o, palsize, gvar); } } void VL_LoadPalFile(const char *filename, byte *palette, global_game_variables_t *gvar) { VLL_LoadPalFilewithoffset(filename, palette, - 0, //overwrite core/system palette -// 9, //preserved core/system palette - PAL_SIZE, gvar); + 0, //overwrite core/system palette +// COREPALSIZE, //preserved core/system palette + PAL_SIZE/3, gvar); } void VL_LoadPalFileCore(byte *palette, global_game_variables_t *gvar) { - VLL_LoadPalFilewithoffset("data/16.pal", palette, 0, 27, gvar); + VLL_LoadPalFilewithoffset("data/16.pal", palette, 0, COREPALSIZE, gvar); } -void VL_UpdatePaletteWrite(byte *palette, word o, global_game_variables_t *gvar) +void VL_UpdatePaletteWrite(byte *palette, word o, word p, global_game_variables_t *gvar) { word i; vga_palette_lseek(o); - for (i=0;i < 255-o;i++) + for (i=0;i < p-o;i++) vga_palette_write(palette[(i*3)+0]>>2,palette[(i*3)+1]>>2,palette[(i*3)+2]>>2); VL_PaletteSync(gvar); diff --git a/src/lib/16_vl.h b/src/lib/16_vl.h index 7e63079d..b3e7de2b 100755 --- a/src/lib/16_vl.h +++ b/src/lib/16_vl.h @@ -205,7 +205,7 @@ void modexLoadPalFile(char *filename, byte *palette); void VL_LoadPalFile(const char *filename, byte *palette, global_game_variables_t *gvar); void VL_LoadPalFileCore(byte *palette, global_game_variables_t *gvar); //void VLL_LoadPalFilewithoffset(const char *filename, byte *palette, word o, global_game_variables_t *gvar); -void VL_UpdatePaletteWrite(byte *palette, word o, global_game_variables_t *gvar); +void VL_UpdatePaletteWrite(byte *palette, word o, word palsize, global_game_variables_t *gvar); void VL_PaletteSync(global_game_variables_t *gvar); void modexSavePalFile(char *filename, byte *palette); #define MenuFadeIn() VL_FadeIn(0,255,&gamepal,10) diff --git a/src/lib/16_vlpal.h b/src/lib/16_vlpal.h index aa81d33e..aa6e1c3d 100755 --- a/src/lib/16_vlpal.h +++ b/src/lib/16_vlpal.h @@ -3,6 +3,7 @@ #include "src/lib/16_vl.h" #include "src/lib/16_vlpld.h" +#include "16/modex16/bitmap.h" typedef struct diff --git a/src/lib/bitmapl.c b/src/lib/bitmapl.c new file mode 100755 index 00000000..1d2e61ab --- /dev/null +++ b/src/lib/bitmapl.c @@ -0,0 +1,176 @@ +#include +#include +#include "src/lib/bitmapl.h" +#include +//#include "modex16.h" + +static struct pcxHeader { + byte id; + byte version; + byte encoding; + byte bpp; + word xmin; + word ymin; + word xmax; + word ymax; + word hres; + word vres; + byte pal16[48]; + byte res1; + word bpplane; + word palType; + word hScreenSize; + word vScreenSize; + byte padding[54]; +} head; + +byte * +modexNewPal() { + byte *ptr; + ptr = _fmalloc(768); + + /* handle errors */ + if(!ptr) { + printf("Could not allocate palette.\n"); + exit(-1); + } + + return ptr; +} + +static void loadPcxStage1(FILE *file, bitmap_t *result) { +// long bufSize; +// int index; +// byte count, val; +// long int pos; + + /* read the header */ + fread(&head, sizeof(char), sizeof(struct pcxHeader), file); + + /* get the width and height */ + result->width = head.xmax - head.xmin + 1; + result->height = head.ymax - head.ymin + 1; + + /* make sure this is 8bpp */ + if(head.bpp != 8) { + printf("I only know how to handle 8bpp pcx files!\n"); + fclose(file); + exit(-2); + } +} + + +static void loadPcxPalette(FILE *file, bitmap_t *result) { + byte val; + int index; + + /* handle the palette */ + fseek(file, -769, SEEK_END); + val = fgetc(file); + result->palette = modexNewPal(); + if(head.version == 5 && val == 12) { + /* use the vga palette */ + for(index=0; !feof(file) && index < 768; index++) { + val = fgetc(file); + result->palette[index] = val >> 2; + } + } else { + /* use the 16 color palette */ + for(index=0; index<48; index++) { + result->palette[index] = head.pal16[index]; + } + } +} + + +bitmap_t +bitmapLoadPcx(char *filename) { + FILE *file; + bitmap_t result; + long bufSize; + int index; + byte count, val; + + /* open the PCX file for reading */ + file = fopen(filename, "rb"); + if(!file) { + printf("Could not open %s for reading.\n", filename); + //return result;//exit(-2); + } + + /* load the first part of the pcx file */ + loadPcxStage1(file, &result); + + /* allocate the buffer */ + bufSize = result.width * result.height; + result.data = malloc(bufSize); + if(!result.data) { + printf("Could not allocate memory for bitmap data."); + fclose(file); + return result;//exit(-1); + } + + /* read the buffer in */ + index = 0; + do { + /* get the run length and the value */ + count = fgetc(file); + if(0xC0 == (count & 0xC0)) { /* this is the run count */ + count &= 0x3f; + val = fgetc(file); + } else { + val = count; + count = 1; + } + + /* write the pixel the specified number of times */ + for(; count && index < bufSize; count--,index++) { + result.data[index] = val; + } + } while(index < bufSize); + + loadPcxPalette(file, &result); + + fclose(file); + + return result; +} + + +tileset_t +bitmapLoadPcxTiles(char *filename, word twidth, word theight) { + tileset_t ts; + FILE *file; + bitmap_t result; + int i; + + /* open the PCX file for reading */ + file = fopen(filename, "rb"); + if(!file) { + printf("Could not open %s for reading.\n", filename); + exit(-2); + } + + /* load the first part of the pcx file */ + loadPcxStage1(file, &result); + + /* get the number of tiles and set up the result structure */ + ts.twidth = twidth; + ts.theight = theight; + ts.ntiles = (result.width/twidth) * (result.height/theight); + ts.palette = result.palette; + + /* allocate the pixel storage for the tiles */ + ts.data = _fmalloc(sizeof(byte*) * ts.ntiles); + ts.data[0] = _fmalloc(sizeof(byte) * ts.ntiles * twidth * theight); + for(i=1; i < ts.ntiles; i++) { + ts.data[i] = ts.data[i-1] + twidth * theight; + } + + /* finish off the file */ + loadPcxPalette(file, &result); + + fclose(file); + + return ts; +} diff --git a/src/lib/bitmapl.h b/src/lib/bitmapl.h new file mode 100755 index 00000000..b401811b --- /dev/null +++ b/src/lib/bitmapl.h @@ -0,0 +1,42 @@ +/* + * Functions and types for loading and manipulating bitmaps. + */ +#ifndef BITMAPL_H +#define BITMAPL_H +#include "src/lib/16_t.h" +typedef struct { + byte *data; + word width; + word height; + byte *palette; + word offset; +} bitmap_t; +/* +typedef struct { + byte *data; + word width; + word height; + byte *palette; +} bitmap_t; +*/ + +typedef struct { + byte far **data; + word ntiles; // the number of tiles + word twidth; // width of the tiles + word theight; // height of the tiles + byte *palette; // palette for the tile set +} tileset_t; +/* +typedef struct { + byte **data; + word ntiles; // the number of tiles + word twidth; // width of the tiles + word theight; // height of the tiles + byte *palette; // palette for the tile set +} tileset_t; +*/ + +bitmap_t bitmapLoadPcx(char *filename); +tileset_t bitmapLoadPcxTiles(char *filename, word twidth, word theight); +#endif diff --git a/src/lib/scroll16.c b/src/lib/scroll16.c index a6cbcff5..a3f28541 100755 --- a/src/lib/scroll16.c +++ b/src/lib/scroll16.c @@ -162,7 +162,7 @@ void ZC_walk(global_game_variables_t *gvar, word pn) gvar->player[pn].walktype=1; if(gvar->player[pn].enti.q<=gvar->player[pn].enti.spt) { - gvar->player[pn].enti.x+=(gvar->player[pn].enti.speed); + gvar->player[pn].enti.x+=(gvar->player[pn].enti.spt); ZC_animatePlayer(gvar->mv, gvar->player, pn); gvar->player[pn].enti.q++; #ifdef OLDWALKSHOWPAGESTUFF @@ -205,7 +205,7 @@ void ZC_walk(global_game_variables_t *gvar, word pn) gvar->player[pn].walktype=1; if(gvar->player[pn].enti.q<=gvar->player[pn].enti.spt) { - gvar->player[pn].enti.x-=(gvar->player[pn].enti.speed); + gvar->player[pn].enti.x-=(gvar->player[pn].enti.spt); ZC_animatePlayer(gvar->mv, gvar->player, pn); gvar->player[pn].enti.q++; #ifdef OLDWALKSHOWPAGESTUFF @@ -248,7 +248,7 @@ void ZC_walk(global_game_variables_t *gvar, word pn) gvar->player[pn].walktype=1; if(gvar->player[pn].enti.q<=gvar->player[pn].enti.spt) { - gvar->player[pn].enti.y+=(gvar->player[pn].enti.speed); + gvar->player[pn].enti.y+=(gvar->player[pn].enti.spt); ZC_animatePlayer(gvar->mv, gvar->player, pn); gvar->player[pn].enti.q++; #ifdef OLDWALKSHOWPAGESTUFF @@ -291,7 +291,7 @@ void ZC_walk(global_game_variables_t *gvar, word pn) gvar->player[pn].walktype=1; if(gvar->player[pn].enti.q<=gvar->player[pn].enti.spt) { - gvar->player[pn].enti.y-=(gvar->player[pn].enti.speed); + gvar->player[pn].enti.y-=(gvar->player[pn].enti.spt); ZC_animatePlayer(gvar->mv, gvar->player, pn); gvar->player[pn].enti.q++; #ifdef OLDWALKSHOWPAGESTUFF @@ -756,7 +756,7 @@ void near mapDrawRow(map_view_t *mv, int tx, int ty, word y, player_t *player, w #ifdef __DEBUG_RF__ if(dbg_pagedelayrendermap) if(!y) y+=TILEWH; else y-=TILEWH; #endif - poopoffset%=player[0].enti.speed; + poopoffset%=player[0].enti.spt; //printf("y: %d\n", poopoffset); #ifdef __DEBUG_RF__ if(dbg_pagedelayrendermap){ sprintf(global_temp_status_text, "%-3u", mv->dx); modexprint(mv[0].page, player[0].enti.x, player[0].enti.y-28-(poopoffset*8) , 1, 0, PALMAPDRAWW, 1, 1, global_temp_status_text); } @@ -785,7 +785,7 @@ void near mapDrawCol(map_view_t *mv, int tx, int ty, word x, player_t *player, w #ifdef __DEBUG_RF__ if(dbg_pagedelayrendermap) if(!x) x+=TILEWH; else x-=TILEWH; #endif - poopoffset%=player[0].enti.speed; + poopoffset%=player[0].enti.spt; //printf("x: %d\n", poopoffset); #ifdef __DEBUG_RF__ if(dbg_pagedelayrendermap){ sprintf(global_temp_status_text, "%-3u", mv->dy); modexprint(mv[0].page, player[0].enti.x, player[0].enti.y-28-(poopoffset*8) , 1, 0, PALMAPDRAWW, 1, global_temp_status_text); } @@ -942,7 +942,7 @@ void near ZC_animatePlayer(map_view_t *pip, player_t *player, word pn) break; case 2: dd = 1; - qq = player[pn].enti.q*player[pn].enti.speed; + qq = player[pn].enti.q*player[pn].enti.spt; break; } x-=4; diff --git a/src/lib/scroll16.h b/src/lib/scroll16.h index 0cd71b63..f7db2a7a 100755 --- a/src/lib/scroll16.h +++ b/src/lib/scroll16.h @@ -86,7 +86,7 @@ printf("size of mmblocktype: %u ", sizeof(mmblocktype));\ printf("\n\n");\ printf("player vars:\n");\ - printf(" xy: %dx%d", gvar.player[0].enti.x, gvar.player[0].enti.y); printf(" txy: %dx%d", gvar.player[0].enti.tx, gvar.player[0].enti.ty); printf(" triggxy: %dx%d", gvar.player[0].enti.triggerx, gvar.player[0].enti.triggery); printf(" value: %d\n", gvar.mv[1].map->layerdata[0].data[(gvar.player[0].enti.triggerx-1)+(map.width*(gvar.player[0].enti.triggery-1))]);\ + printf(" xy: %dx%d", gvar.player[0].enti.x, gvar.player[0].enti.y); printf(" txy: %dx%d", gvar.player[0].enti.tx, gvar.player[0].enti.ty); printf(" triggxy: %dx%d", gvar.player[0].enti.triggerx, gvar.player[0].enti.triggery); printf(" value: %d\n", gvar.mv[1].map->layerdata[0].data[(gvar.player[0].enti.triggerx-1)+(gvar.map.width*(gvar.player[0].enti.triggery-1))]);\ printf(" hp: %d", (gvar.player[0].enti.hp)); printf(" q: %u", gvar.player[0].enti.q); printf(" info.dir: %u", gvar.player[0].info.dir); printf(" d: %u", gvar.player[0].enti.d); printf(" dire: %u", gvar.player[0].enti.dire);\ printf(" pdir: %u\n", gvar.player[0].pdir); printf(" delay=%u", gvar.player[0].enti.spri.delay);\ printf("\n\n");\ @@ -133,7 +133,7 @@ void mapDrawWCol(map_view_t *mv, int tx, int ty, word x); inline void near ScrollRight(map_view_t *mv, player_t *pl, word id, word plid) { /* increment the pixel position and update the page */ - mv[id].page->dx += pl[plid].enti.speed; + mv[id].page->dx += pl[plid].enti.spt; /* check to see if this changes the tile */ if(mv[id].page->dx >= mv[id].dxThresh ) @@ -150,7 +150,7 @@ inline void near ScrollRight(map_view_t *mv, player_t *pl, word id, word plid) inline void near ScrollLeft(map_view_t *mv, player_t *pl, word id, word plid) { /* decrement the pixel position and update the page */ - mv[id].page->dx -= pl[plid].enti.speed; + mv[id].page->dx -= pl[plid].enti.spt; /* check to see if this changes the tile */ if(mv[id].page->dx == 0) @@ -167,7 +167,7 @@ inline void near ScrollLeft(map_view_t *mv, player_t *pl, word id, word plid) inline void near ScrollUp(map_view_t *mv, player_t *pl, word id, word plid) { /* decrement the pixel position and update the page */ - mv[id].page->dy -= pl[plid].enti.speed; + mv[id].page->dy -= pl[plid].enti.spt; /* check to see if this changes the tile */ if(mv[id].page->dy == 0 ) @@ -184,7 +184,7 @@ inline void near ScrollUp(map_view_t *mv, player_t *pl, word id, word plid) inline void near ScrollDown(map_view_t *mv, player_t *pl, word id, word plid) { /* increment the pixel position and update the page */ - mv[id].page->dy += pl[plid].enti.speed; + mv[id].page->dy += pl[plid].enti.spt; /* check to see if this changes the tile */ if(mv[id].page->dy >= mv[id].dyThresh ) diff --git a/src/xcroll.c b/src/xcroll.c index 00f869c4..816c600e 100755 --- a/src/xcroll.c +++ b/src/xcroll.c @@ -23,18 +23,30 @@ #include "src/lib/scroll16.h" #include "src/lib/16_timer.h" //#include "src/lib/16_dbg.h" -//HC_heapdump +#define FADE +//#define NOMAPLOAD +//#define OLDPLAYERSPRITESTUFF #ifdef __DEBUG__ -#define SCROLLEXEDEBUG +//#define SCROLLEXEDEBUG boolean dbg_nointest=1; #endif -#define FADE -//#define NOMAPLOAD - -static map_t map; +//static map_t map; +#ifdef OLDPLAYERSPRITESTUFF +#include "src/lib/bitmapl.h" +static int persist_aniframe = 0; /* gonna be increased to 1 before being used, so 0 is ok for default */ +#define INC_PER_FRAME if(gvar->player[pn].enti.q&1) persist_aniframe++; if(persist_aniframe>4) persist_aniframe = 1; + +void modexDrawSprite(page_t *page, int x, int y, bitmap_t *bmp); +void modexDrawSpriteRegion(page_t *page, int x, int y, int rx, int ry, int rw, int rh, bitmap_t *bmp); +boolean ZCL_ScreenMidPosChk(map_view_t *map_v, nibble dir, int tx, int ty); +boolean ZCL_CollCheck(map_view_t *map_v, nibble dir, int tx, int ty); +boolean ZCL_mapEdgeChk(map_view_t *map_v, nibble dir, int tx, int ty, boolean pansw, boolean noscrollsw); +void oldwalk(global_game_variables_t *gvar, word pn, bitmap_t *pbmp); +void animatePlayer(global_game_variables_t *gvar, /*map_view_t *top, */short d1, short d2, int x, int y, int ls, int lp, bitmap_t *bmp); +#endif float t; //debugswitches @@ -58,6 +70,9 @@ boolean spriteswitch=0; void main(int argc, char *argv[]) { +#ifdef OLDPLAYERSPRITESTUFF + bitmap_t ptmp; // player sprite +#endif static global_game_variables_t gvar; struct glob_game_vars *ggvv; @@ -81,15 +96,15 @@ void main(int argc, char *argv[]) // create the map #ifdef SCROLLEXEDEBUG strcpy(gvar.handle.datadumpfilename, "xcroll1.16w"); MM_DumpData (&gvar); - fprintf(stderr, "testing map load~ "); + //fprintf(stderr, "testing map load~ "); #endif - CA_loadmap("data/test.map", &map, &gvar); + CA_loadmap("data/test.map", &gvar.map, &gvar); #ifndef NOMAPLOAD - chkmap(&map, 0); + chkmap(&gvar.map, 0); #else - chkmap(&map, 1); + chkmap(&gvar.map, 1); #endif - //initMap(&map); + //initMap(&gvar.map); #ifdef SCROLLEXEDEBUG printf("chkmap ok\n"); // fprintf(stderr, "yay map loaded~~\n"); @@ -97,6 +112,10 @@ void main(int argc, char *argv[]) #endif // data +#ifdef OLDPLAYERSPRITESTUFF + ptmp = bitmapLoadPcx("data/chikyuu.pcx"); // load sprite + modexPalUpdate(ptmp.palette); +#else #ifdef SCROLLEXEDEBUG fprintf(stderr, "VRS_LoadVRS~ "); strcpy(gvar.handle.datadumpfilename, "xcroll3.16w"); MM_DumpData (&gvar); @@ -107,6 +126,7 @@ void main(int argc, char *argv[]) strcpy(gvar.handle.datadumpfilename, "xcroll4.16w"); MM_DumpData (&gvar); #endif strcpy(gvar.handle.datadumpfilename, "xcroll.16w"); +#endif // input! IN_Default(0, &gvar.player[0],ctrl_Keyboard1, &gvar); @@ -140,7 +160,7 @@ void main(int argc, char *argv[]) // setup camera and screen~ modexHiganbanaPageSetup(&gvar); - ZC_MVSetup(&gvar.mv, &map, &gvar); + ZC_MVSetup(&gvar.mv, &gvar.map, &gvar); #ifdef FADE modexFadeOn(4, &gvar.video.palette); @@ -157,6 +177,8 @@ void main(int argc, char *argv[]) ZC_PlayerXYpos(0, 0, &gvar.player[0], &gvar.mv, 1); EN_initPlayer(&gvar.player[0], &gvar.video); +#ifdef SPRITE +#ifndef OLDPLAYERSPRITESTUFF //print_anim_ids(gvar.player[0].enti.spri); if (gvar.video.sprifilei == -1) { @@ -168,6 +190,8 @@ void main(int argc, char *argv[]) modexFadeOn(4, &gvar.video.dpal); #endif } +#endif +#endif // while(!gvar.in.inst->Keyboard[sc_Escape) && !gvar.in.inst->Keyboard[sc_Space) && !gvar.in.inst->Keyboard[sc_Enter]){ FUNCTIONKEYSHOWMV } gvar.video.page[0].tlx=gvar.mv[0].tx*TILEWH; @@ -196,7 +220,11 @@ void main(int argc, char *argv[]) if(!panswitch){ //ZC_walk2(gvar.player[0].ent, mv); //ZC_walk(&gvar.mv, &gvar.player, 0); +#ifdef OLDPLAYERSPRITESTUFF + oldwalk(&gvar, 0, &ptmp); +#else ZC_walk(&gvar, 0); +#endif }else{ TAIL_PANKEYFUNZC; //printf(" gvar.player[0].enti.q: %d", gvar.player[0].enti.q); printf(" gvar.player[0].d: %d\n", gvar.player[0].d); @@ -204,7 +232,7 @@ void main(int argc, char *argv[]) //the scripting stuff.... //if(((gvar.player[0].enti.triggerx == TRIGGX && gvar.player[0].enti.triggery == TRIGGY) && gvar.in.inst->Keyboard[0x1C))||(gvar.player[0].enti.tx == 5 && gvar.player[0].enti.ty == 5)) - if(((gvar.mv[0].map->layerdata[0].data[(gvar.player[0].enti.triggerx-1)+(map.width*(gvar.player[0].enti.triggery-1))] == 0) && gvar.in.inst->Keyboard[0x1C])||(gvar.player[0].enti.tx == 5 && gvar.player[0].enti.ty == 5)) + if(((gvar.mv[0].map->layerdata[0].data[(gvar.player[0].enti.triggerx-1)+(gvar.map.width*(gvar.player[0].enti.triggery-1))] == 0) && gvar.in.inst->Keyboard[0x1C])||(gvar.player[0].enti.tx == 5 && gvar.player[0].enti.ty == 5)) { short i; for(i=800; i>=400; i--) @@ -213,9 +241,10 @@ void main(int argc, char *argv[]) } nosound(); } - if(gvar.player[0].enti.q == (TILEWH/(gvar.player[0].enti.speed))+1 && gvar.player[0].info.dir != 2 && (gvar.player[0].enti.triggerx == 5 && gvar.player[0].enti.triggery == 5)){ gvar.player[0].enti.hp--; } + if(gvar.player[0].enti.q == (TILEWH/(gvar.player[0].enti.spt))+1 && gvar.player[0].info.dir != 2 && (gvar.player[0].enti.triggerx == 5 && gvar.player[0].enti.triggery == 5)){ gvar.player[0].enti.hp--; } //debugging binds! // if(gvar.in.inst->Keyboard[24]){ VL_modexPalScramble(&gvar.video.palette); /*paloffset=0;*/ VL_LoadPalFileCore(&gvar.video.palette, &gvar); modexpdump(gvar.mv[0].page); IN_UserInput(1, &gvar); } //o + if(gvar.in.inst->Keyboard[sc_O]){ VL_LoadPalFileCore(&gvar.video.palette, &gvar); modexpdump(gvar.video.sp, &gvar); IN_UserInput(1, &gvar); } //o if(gvar.in.inst->Keyboard[22]){ VL_modexPalScramble(&gvar.video.palette); VL_LoadPalFileCore(&gvar.video.palette, &gvar); } //u TAIL_FUNCTIONKEYFUNCTIONS @@ -239,6 +268,18 @@ void main(int argc, char *argv[]) #endif //=============================================================================== +#ifdef OLDPLAYERSPRITESTUFF + if(gvar.in.inst->Keyboard[sc_J])// || gvar.in.inst->Keyboard[sc_K]) + { +// sprintf(global_temp_status_text2, "%Fp", &ptmp.data); +// modexprint(&(gvar.video.page[0]), gvar.video.page[0].sw/2, gvar.video.page[0].sh/2, 1, 1, 3/*ccolor*/, 8, gvar.video.VL_Started, global_temp_status_text2); + modexDrawSprite(&gvar.video.page[0], 16, 16, &ptmp); + } + if(gvar.in.inst->Keyboard[sc_K]) + { + _fmemset(ptmp.data, 4, (ptmp.width)*ptmp.height); + } +#else if(gvar.in.inst->Keyboard[sc_J])// || gvar.in.inst->Keyboard[sc_K]) { if(spriteswitch)//gvar.in.inst->Keyboard[sc_J]) @@ -261,6 +302,7 @@ void main(int argc, char *argv[]) ZC_animatePlayer(&gvar.mv, &gvar.player, 0); IN_UserInput(1, &gvar); }//JK +#endif //#ifdef FADE // if(gvar.in.inst->Keyboard[10]){ modexPalOverscan(rand()%56); modexPalUpdate(gvar.video.dpal); IN_UserInput(1, &gvar); } //#endif @@ -279,7 +321,7 @@ void main(int argc, char *argv[]) modexFadeOff(4, &gvar.video.palette); #endif #ifdef SCROLLEXEDEBUG - MM_Reset(&gvar); MM_DumpData (&gvar); + MM_DumpData (&gvar); HC_heapdump (&gvar); #endif Shutdown16(&gvar); @@ -291,3 +333,311 @@ void main(int argc, char *argv[]) modexFadeOn(4, gvar.video.dpal); #endif } + +#ifdef OLDPLAYERSPRITESTUFF +void +modexDrawSprite(page_t *page, int x, int y, bitmap_t *bmp) { + /* draw the whole sprite */ + modexDrawSpriteRegion(page, x, y, 0, 0, bmp->width, bmp->height, bmp); +// sprintf(global_temp_status_text2, "%Fp", &bmp->data); +// modexprint(page, page->sw/2, (page->sh/2)+8, 1, 1, 3/*ccolor*/, 8, gvar->video.VL_Started, global_temp_status_text2); +} + +void +modexDrawSpriteRegion(page_t *page, int x, int y, + int rx, int ry, int rw, int rh, bitmap_t *bmp) { + word poffset = (word)page->data + y*(page->width/4) + x/4; + byte *data = bmp->data; + word bmpOffset = (word) data + ry * bmp->width + rx; + word width = rw; + word height = rh; + byte plane = 1 << ((byte) x & 0x03); + word scanCount = width/4 + (width%4 ? 1 :0); + word nextPageRow = page->width/4 - scanCount; + word nextBmpRow = (word) bmp->width - width; + word rowCounter=0; + byte planeCounter = 4; + +// sprintf(global_temp_status_text2, "%Fp", bmp->data); +// modexprint(page, page->sw/2, (page->sh/2)+8, 1, 1, 3/*ccolor*/, 8, ggvv->video.VL_Started, global_temp_status_text2); +// sprintf(global_temp_status_text2, "%Fp", data); +// modexprint(page, page->sw/2, (page->sh/2)+16, 1, 1, 3/*ccolor*/, 8, ggvv->video.VL_Started, global_temp_status_text2); + + __asm { + MOV AX, SCREEN_SEG ; go to the VGA memory + MOV ES, AX + + MOV DX, SC_INDEX ; point at the map mask register + MOV AL, SC_MAPMASK ; + OUT DX, AL ; + + PLANE_LOOP: + MOV DX, SC_DATA ; select the current plane + MOV AL, plane ; + OUT DX, AL ; + + ;-- begin plane painting + MOV AX, height ; start the row counter + MOV rowCounter, AX ; + MOV DI, poffset ; go to the first pixel + MOV SI, bmpOffset ; go to the bmp pixel + ROW_LOOP: + MOV CX, width ; count the columns + SCAN_LOOP: + LODSB + DEC SI + CMP AL, 0 + JNE DRAW_PIXEL ; draw non-zero pixels + + INC DI ; skip the transparent pixel + ADD SI, 1 + JMP NEXT_PIXEL + DRAW_PIXEL: + MOVSB ; copy the pixel + NEXT_PIXEL: + SUB CX, 3 ; we skip the next 3 + ADD SI, 3 ; skip the bmp pixels + LOOP SCAN_LOOP ; finish the scan + + MOV AX, nextPageRow + ADD DI, AX ; go to the next row on screen + MOV AX, nextBmpRow + ADD SI, AX ; go to the next row on bmp + + DEC rowCounter + JNZ ROW_LOOP ; do all the rows + ;-- end plane painting + + MOV AL, plane ; advance to the next plane + SHL AL, 1 ; + AND AL, 0x0f ; mask the plane properly + MOV plane, AL ; store the plane + + INC bmpOffset ; start bmp at the right spot + + DEC planeCounter + JNZ PLANE_LOOP ; do all 4 planes + } +} + +void oldwalk(global_game_variables_t *gvar, word pn, bitmap_t *pbmp) +{ + switch(gvar->player[pn].enti.d) + { + //no direction + case 2: + //0000gvar->mv[0].video->startclk = (*clockw); + break; + //right movement + case 3: + if(ZCL_ScreenMidPosChk(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty) && + ZCL_CollCheck(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty))//!(gvar->player[pn].enti.tx+1 == TRIGGX && gvar->player[pn].enti.ty == TRIGGY)) //collision detection! + { + gvar->player[pn].walktype=2; + if(gvar->player[pn].enti.q<=gvar->player[pn].enti.spt) + { + INC_PER_FRAME; + animatePlayer(gvar, 1, 1, gvar->player[pn].enti.x, gvar->player[pn].enti.y, persist_aniframe, gvar->player[pn].enti.q, pbmp); + ZC_mapScroll(gvar->mv, gvar->player, pn); + gvar->player[pn].enti.q++; + //0000gvar->mv[0].video->clk = ((*clockw)-gvar->mv[0].video->startclk)/18.2; + modexShowPage(&gvar->video.page[0]); + } else { gvar->player[pn].enti.q = 1; gvar->player[pn].enti.d = 2; gvar->player[pn].enti.tx++; } + } + else if(ZCL_mapEdgeChk(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty, 0, 1) && + ZCL_CollCheck(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty))//!(gvar->player[pn].enti.tx+1 == TRIGGX && gvar->player[pn].enti.ty == TRIGGY)) + { + gvar->player[pn].walktype=1; + if(gvar->player[pn].enti.q<=gvar->player[pn].enti.spt) + { + INC_PER_FRAME; + gvar->player[pn].enti.x+=(gvar->player[pn].enti.spt); + animatePlayer(gvar, 1, 0, gvar->player[pn].enti.x, gvar->player[pn].enti.y, persist_aniframe, gvar->player[pn].enti.q, pbmp); + gvar->player[pn].enti.q++; + modexShowPage(&gvar->video.page[0]); + } else { gvar->player[pn].enti.q = 1; gvar->player[pn].enti.d = 2; gvar->player[pn].enti.tx++; } + } + else + { + gvar->player[pn].walktype=0; + //ZC_animatePlayer(gvar->mv, gvar->player, pn); + modexShowPage(&gvar->video.page[0]); + gvar->player[pn].enti.d = 2; + } + gvar->player[pn].enti.triggerx = gvar->player[pn].enti.tx+1; + gvar->player[pn].enti.triggery = gvar->player[pn].enti.ty; + break; + //left movement + case 1: + if(ZCL_ScreenMidPosChk(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty) && + ZCL_CollCheck(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty))//!(gvar->player[pn].enti.tx-1 == TRIGGX && gvar->player[pn].enti.ty == TRIGGY)) //collision detection! + { + gvar->player[pn].walktype=2; + if(gvar->player[pn].enti.q<=gvar->player[pn].enti.spt) + { + INC_PER_FRAME; + animatePlayer(gvar, 1, 1, gvar->player[pn].enti.x, gvar->player[pn].enti.y, persist_aniframe, gvar->player[pn].enti.q, pbmp); + ZC_mapScroll(gvar->mv, gvar->player, pn); + gvar->player[pn].enti.q++; + //0000gvar->mv[0].video->clk = ((*clockw)-gvar->mv[0].video->startclk)/18.2; + modexShowPage(&gvar->video.page[0]); + } else { gvar->player[pn].enti.q = 1; gvar->player[pn].enti.d = 2; gvar->player[pn].enti.tx--; } + } + else if(ZCL_mapEdgeChk(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty, 0, 1) && + ZCL_CollCheck(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty))//!(gvar->player[pn].enti.tx-1 == TRIGGX && gvar->player[pn].enti.ty == TRIGGY)) + { + gvar->player[pn].walktype=1; + if(gvar->player[pn].enti.q<=gvar->player[pn].enti.spt) + { + INC_PER_FRAME; + gvar->player[pn].enti.x-=(gvar->player[pn].enti.spt); + animatePlayer(gvar, 1, 0, gvar->player[pn].enti.x, gvar->player[pn].enti.y, persist_aniframe, gvar->player[pn].enti.q, pbmp); + gvar->player[pn].enti.q++; + modexShowPage(&gvar->video.page[0]); + } else { gvar->player[pn].enti.q = 1; gvar->player[pn].enti.d = 2; gvar->player[pn].enti.tx--; } + } + else + { + gvar->player[pn].walktype=0; + //ZC_animatePlayer(gvar->mv, gvar->player, pn); + modexShowPage(&gvar->video.page[0]); + gvar->player[pn].enti.d = 2; + } + gvar->player[pn].enti.triggerx = gvar->player[pn].enti.tx-1; + gvar->player[pn].enti.triggery = gvar->player[pn].enti.ty; + break; + //down movement + case 4: + if(ZCL_ScreenMidPosChk(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty) && + ZCL_CollCheck(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty))//!(gvar->player[pn].enti.tx == TRIGGX && gvar->player[pn].enti.ty+1 == TRIGGY)) //collision detection! + { + gvar->player[pn].walktype=2; + if(gvar->player[pn].enti.q<=gvar->player[pn].enti.spt) + { + INC_PER_FRAME; + animatePlayer(gvar, 1, 1, gvar->player[pn].enti.x, gvar->player[pn].enti.y, persist_aniframe, gvar->player[pn].enti.q, pbmp); + ZC_mapScroll(gvar->mv, gvar->player, pn); + gvar->player[pn].enti.q++; + //0000gvar->mv[0].video->clk = ((*clockw)-gvar->mv[0].video->startclk)/18.2; + modexShowPage(&gvar->video.page[0]); + } else { gvar->player[pn].enti.q = 1; gvar->player[pn].enti.d = 2; gvar->player[pn].enti.ty++; } + } + else if(ZCL_mapEdgeChk(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty, 0, 1) && + ZCL_CollCheck(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty))//!(gvar->player[pn].enti.tx == TRIGGX && gvar->player[pn].enti.ty+1 == TRIGGY)) + { + gvar->player[pn].walktype=1; + if(gvar->player[pn].enti.q<=gvar->player[pn].enti.spt) + { + INC_PER_FRAME; + gvar->player[pn].enti.y+=(gvar->player[pn].enti.spt); + animatePlayer(gvar, 1, 0, gvar->player[pn].enti.x, gvar->player[pn].enti.y, persist_aniframe, gvar->player[pn].enti.q, pbmp); + gvar->player[pn].enti.q++; + modexShowPage(&gvar->video.page[0]); + } else { gvar->player[pn].enti.q = 1; gvar->player[pn].enti.d = 2; gvar->player[pn].enti.ty++; } + } + else + { + gvar->player[pn].walktype=0; + //ZC_animatePlayer(gvar->mv, gvar->player, pn); + modexShowPage(&gvar->video.page[0]); + gvar->player[pn].enti.d = 2; + } + gvar->player[pn].enti.triggerx = gvar->player[pn].enti.tx; + gvar->player[pn].enti.triggery = gvar->player[pn].enti.ty+1; + break; + //up movement + case 0: + if(ZCL_ScreenMidPosChk(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty) && + ZCL_CollCheck(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty))//!(gvar->player[pn].enti.tx == TRIGGX && gvar->player[pn].enti.ty-1 == TRIGGY)) //collision detection! + { + gvar->player[pn].walktype=2; + if(gvar->player[pn].enti.q<=gvar->player[pn].enti.spt) + { + INC_PER_FRAME; + animatePlayer(gvar, 1, 1, gvar->player[pn].enti.x, gvar->player[pn].enti.y, persist_aniframe, gvar->player[pn].enti.q, pbmp); + ZC_mapScroll(gvar->mv, gvar->player, pn); + gvar->player[pn].enti.q++; + //0000gvar->mv[0].video->clk = ((*clockw)-gvar->mv[0].video->startclk)/18.2; + modexShowPage(&gvar->video.page[0]); + } else { gvar->player[pn].enti.q = 1; gvar->player[pn].enti.d = 2; gvar->player[pn].enti.ty--; } + } + else if(ZCL_mapEdgeChk(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty, 0, 1) && + ZCL_CollCheck(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty))//!(gvar->player[pn].enti.tx == TRIGGX && gvar->player[pn].enti.ty-1 == TRIGGY)) + { + gvar->player[pn].walktype=1; + if(gvar->player[pn].enti.q<=gvar->player[pn].enti.spt) + { + INC_PER_FRAME; + gvar->player[pn].enti.y-=(gvar->player[pn].enti.spt); + animatePlayer(gvar, 1, 0, gvar->player[pn].enti.x, gvar->player[pn].enti.y, persist_aniframe, gvar->player[pn].enti.q, pbmp); + gvar->player[pn].enti.q++; + modexShowPage(&gvar->video.page[0]); + } else { gvar->player[pn].enti.q = 1; gvar->player[pn].enti.d = 2; gvar->player[pn].enti.ty--; } + } + else + { + gvar->player[pn].walktype=0; + //ZC_animatePlayer(gvar->mv, gvar->player, pn); + modexShowPage(&gvar->video.page[0]); + gvar->player[pn].enti.d = 2; + } + gvar->player[pn].enti.triggerx = gvar->player[pn].enti.tx; + gvar->player[pn].enti.triggery = gvar->player[pn].enti.ty-1; + break; + } +} + +void animatePlayer(global_game_variables_t *gvar, /*map_view_t *top, */short d1, short d2, int x, int y, int ls, int lp, bitmap_t *bmp) +{ + short dire=32*d1; //direction + short qq; //scroll offset + + if(d2==0) qq = 0; + else qq = ((lp)*gvar->player[0].enti.spt); + switch (d1) + { + case 0: + //up + x=x-4; + y=y-qq-TILEWH; + break; + case 1: + // right + x=x+qq-4; + y=y-TILEWH; + break; + case 2: + //down + x=x-4; + y=y+qq-TILEWH; + break; + case 3: + //left + x=x-qq-4; + y=y-TILEWH; + break; + } + modexCopyPageRegion(gvar->mv[0].page, gvar->mv[1].page, x-4, y-4, x-4, y-4, 28, 40); + if(2>ls && ls>=1) { modexDrawSpriteRegion(gvar->mv[0].page, x, y, 48, dire, 24, 32, bmp); }else + if(3>ls && ls>=2) { modexDrawSpriteRegion(gvar->mv[0].page, x, y, 24, dire, 24, 32, bmp); }else + if(4>ls && ls>=3) { modexDrawSpriteRegion(gvar->mv[0].page, x, y, 0, dire, 24, 32, bmp); }else + if(5>ls && ls>=4) { modexDrawSpriteRegion(gvar->mv[0].page, x, y, 24, dire, 24, 32, bmp); } + //TODO: mask copy //modexCopyPageRegion(gvar->mv[0].page, gvar->mv[0].page, x-4, y-4, x-4, y-4, 28, 40); + //modexClearRegion(top->page, 66, 66, 2, 40, 0); + //modexCopyPageRegion(gvar->mv[0].page, top->page, 66, 66, 66, 66, 2, 40); + //turn this off if XT + //if(detectcpu() > 0) modexWaitBorder(); + switch(gvar->kurokku.fpscap) + { + case 0: //turn this off if XT + //modexprint(&(gv->video.page[0]), x, y+8, type, 1, col, bgcol, "sanic!"); + gvar->kurokku.frames_per_second=1; + break; + case 1: + modexWaitBorder(); + gvar->kurokku.frames_per_second=FPSVALUE; + break; + } + PM_NextFrame(gvar); +} +#endif