From 8c5ce6d6e768ba3dfac7f4e2e95d68152ab42aaa Mon Sep 17 00:00:00 2001 From: sparky4 Date: Wed, 31 May 2017 16:36:14 -0500 Subject: [PATCH] BROKEN ON REAL HW comitted to see what was changed --- 16/modex16/bitmap.h | 26 ++- 16/modex16/modex16.h | 1 + {src => 16/src}/lib/16_vrs.c | 0 {src => 16/src}/lib/16_vrs.h | 0 1croll.exe | Bin 48784 -> 0 bytes DEBUG.16W | 210 +++++++++++++++++++ HEAP.16W | 126 ++++++------ MMDUMP.16W | Bin 2288 -> 2244 bytes XCROLL.16W | Bin 0 -> 2288 bytes XCROLL1.16W | Bin 2222 -> 2222 bytes XCROLL2.16W | Bin 2244 -> 2244 bytes XCROLL3.16W | Bin 2244 -> 2244 bytes XCROLL4.16W | Bin 2288 -> 2288 bytes makefile | 14 +- src/1croll.c | 15 +- src/inputest.c | 10 +- src/lib/16_enti.c | 4 +- src/lib/16_mm.c | 8 + src/lib/16_spri.c | 194 +++++++++++++++++- src/lib/16_spri.h | 60 +++++- src/lib/16_tail.h | 4 +- src/lib/16_tdef.h | 19 +- src/lib/16_vl.c | 20 +- src/lib/16_vl.h | 2 +- src/lib/16_vlpal.h | 1 + src/lib/bitmapl.c | 176 ++++++++++++++++ src/lib/bitmapl.h | 42 ++++ src/lib/scroll16.c | 14 +- src/lib/scroll16.h | 10 +- src/xcroll.c | 380 +++++++++++++++++++++++++++++++++-- 30 files changed, 1194 insertions(+), 142 deletions(-) rename {src => 16/src}/lib/16_vrs.c (100%) rename {src => 16/src}/lib/16_vrs.h (100%) delete mode 100755 1croll.exe create mode 100755 DEBUG.16W create mode 100755 XCROLL.16W create mode 100755 src/lib/bitmapl.c create mode 100755 src/lib/bitmapl.h 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 beb750e10bff701c878770117947e1dcc1df9742..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48784 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 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 53b3a1de9a6b1c880959ebf51092e6c981638fae..276718ef91cb1f13c1aedf751a472b98ad369144 100755 GIT binary patch literal 2244 zcmZwJyG=tu5I|94BzkzE2`sHGdp}6@KnwdVfQa&0OAz^_H<^>nXu?kj*YR;lwH~MQ z_xtgAgtyo5SJ$l{r>~c%I#ut1^~!oBfXo9WH;7J3W4h2BDMp|{Xm=q>bCdMmw^-b!z! z_i-Pd_pQ=f>235jdK0R_LdKbNm-bL@CchS4xy@mkquJG;(@2>Ff3h%D)?h5a& R^j_$_z#A`*Y3KjHRZ=<)-+vsidc6vL#o!(Awr?=DF>Fx9mdI!CO-a+r6 zchEcN9rR9mC%u#2}@>CNDox6oVYE%X+8 o3%!NjjoyvkjoyvkjoyvkjouC3OFX8XZ~i5hc)Sefzw2-1AI;Rus{jB1 diff --git a/XCROLL.16W b/XCROLL.16W new file mode 100755 index 0000000000000000000000000000000000000000..32f5ab2d6e7eb68e1b8f824a0ec43b301ef8d7c6 GIT binary patch literal 2288 zcmZwJJ5B>J6hKiVIwbZmWhf$fqQv$fu?M!`@n->4Y=a%+ky0h6y@lU#;ZOJt;nF_W zRLXKX|9mW8OL%_^_uBXCtgjDsT}@>CNDox6pgs8qepg&|B!;>D}o)ZlmXEJH0!-JH0!-JH3_ON^hmN(p%}R z^j3N+y^Y>RZ=<)-+vsidHhLSqo!(Awr?=DF>FxA(dON*?-a+r6chEcN9rO-*2fUXM r;GGrTS>c@(-dW+D72a9lot55|-WA@s9@EYb|B|>K@5TA={#*G6x8&3> literal 0 HcmV?d00001 diff --git a/XCROLL1.16W b/XCROLL1.16W index 2346cfedc4d806054c6eaf628ea6775bb0c0d35e..10ab33c3c0c6a1c17a23d0c3507419fc8188b3d3 100755 GIT binary patch delta 253 zcmW;C!3n}Z5Jq8lQG|#{Aah@DdJraIcV-YQ!V<)o8f+ujN5InTz}f%u4v%kXmv+Z* z=3%_{Q-03JF6Ni_^V@doekwyfC8L6xHDBzl+-0wnv|9sv?P(8BYt2Fk|-5Uq44XN4zyrxf!e@AtRc^Vh@6 z?emtN9@BrlSO@D;y%KA%R@OT!y%)U~y%)Wm-cE0)x6|9{?eunfJH3P6LGPe<&^zcI z^bUFly_4Qa@1%FqJL#SDPI@Q3i{3@=qIc1|=w0+KdKbN$-c9eOchkG+-SlpHH@uM& zyr;r@D!iw{dn&xA!h0&br_!70&Gcq^GrgJKOmC()(;M^#y+Lo#8}tUfL2uAo=q>aX zdJDaU-a>Dox6oVZt@KuUE4`K8N^hmN(%a~5^fr1My^Y>RZ=<)td(XdXuYbSf2Wr^8 A{Qv*} diff --git a/XCROLL2.16W b/XCROLL2.16W index 85dca0f00405de74e38305e9a8c625f34a390206..276718ef91cb1f13c1aedf751a472b98ad369144 100755 GIT binary patch delta 275 zcmXxf!3n}Z5QSlPQ4~QWkiBnidJuL)c4iPP!V-d-0zBD9umVf4hcsjd&OG$;GYsG5 zP1RI2>5)=Grda`!bsd@(1#9COl_g;3=d(wN-d(zwJZS*#J8@-L*MsK6H z(c9_m^mckXy`A1pZ>P7@JLnzs4tfW@gWf^!pm)$a>7DdWdMCY;-bwGIchbA)UGy$` zZ};JT-xj@#-bL?%H-!N2uJG;(@2>Ff3h%D)?h5a&^hSCky^-EXZ=^TU8|jVoCVCUS ziQYtSqBqf-=uPxydNaM5-b`<%H`ANx&GZ&}3%!NjLT{nB&|By&^j3N+y_McdZ>6`= QTj{OvUgK@r%l}{U3t9ETtpET3 diff --git a/XCROLL3.16W b/XCROLL3.16W index 85dca0f00405de74e38305e9a8c625f34a390206..276718ef91cb1f13c1aedf751a472b98ad369144 100755 GIT binary patch delta 275 zcmXxf!3n}Z5QSlPQ4~QWkiBnidJuL)c4iPP!V-d-0zBD9umVf4hcsjd&OG$;GYsG5 zP1RI2>5)=Grda`!bsd@(1#9COl_g;3=d(wN-d(zwJZS*#J8@-L*MsK6H z(c9_m^mckXy`A1pZ>P7@JLnzs4tfW@gWf^!pm)$a>7DdWdMCY;-bwGIchbA)UGy$` zZ};JT-xj@#-bL?%H-!N2uJG;(@2>Ff3h%D)?h5a&^hSCky^-EXZ=^TU8|jVoCVCUS ziQYtSqBqf-=uPxydNaM5-b`<%H`ANx&GZ&}3%!NjLT{nB&|By&^j3N+y_McdZ>6`= QTj{OvUgK@r%l}{U3t9ETtpET3 diff --git a/XCROLL4.16W b/XCROLL4.16W index 53b3a1de9a6b1c880959ebf51092e6c981638fae..32f5ab2d6e7eb68e1b8f824a0ec43b301ef8d7c6 100755 GIT binary patch literal 2288 zcmZwJJ5B>J6hKiVIwbZmWhf$fqQv$fu?M!`@n->4Y=a%+ky0h6y@lU#;ZOJt;nF_W zRLXKX|9mW8OL%_^_uBXCtgjDsT}@>CNDox6pgs8qepg&|B!;>D}o)ZlmXEJH0!-JH0!-JH3_ON^hmN(p%}R z^j3N+y^Y>RZ=<)-+vsidHhLSqo!(Awr?=DF>FxA(dON*?-a+r6chEcN9rO-*2fUXM r;GGrTS>c@(-dW+D72a9lot55|-WA@s9@EYb|B|>K@5TA={#*G6x8&3> literal 2288 zcmZwJxlIHy7=TeEG9-G~5Q3F_&2mWeKnvrm03zC;V?5GEyD$9$|IdMs@EbzvpYd&8 zPA})5*VET2JU@kNogu9Hcw0Z-PcPpOcXelNtV4BQ)9%;Z6Ki2zyTA(c?)2{T?(|lA zE4`K8N^hmN(p%}R^fr1My^Y>RZ=<)-+vsidc6vL#o!(Awr?=DF>Fx9mdI!CO-a+r6 zchEcN9rR9mC%u#2}@>CNDox6oVYE%X+8 o3%!NjjoyvkjoyvkjoyvkjouC3OFX8XZ~i5hc)Sefzw2-1AI;Rus{jB1 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 -- 2.39.2