OSDN Git Service

updated copyleft and need to test and fix newer version of open watcom
[proj16/16.git] / src / xcroll.c
index d06850c..6792683 100755 (executable)
@@ -1,5 +1,5 @@
 /* Project 16 Source Code~\r
- * Copyright (C) 2012-2017 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
+ * Copyright (C) 2012-2022 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
  *\r
  * This file is part of Project 16.\r
  *\r
 #include "src/lib/16_timer.h"\r
 #include "src/lib/16_dbg.h"\r
 \r
-#define FADE\r
+//#define FADE\r
+\r
 //#define NOMAPLOAD\r
+//#define OLDPLAYERSPRITESTUFF\r
+#define XC_CTRLTYPE ctrl_Keyboard//ctrl_Joystick1//ctrl_Mouse\r
+#ifdef __DEBUG__\r
+#define SCROLLEXEDEBUG\r
+#endif\r
+\r
+//static map_t map;\r
+#ifdef OLDPLAYERSPRITESTUFF\r
+#include "src/lib/bitmapl.h"\r
+static int persist_aniframe = 0;    /* gonna be increased to 1 before being used, so 0 is ok for default */\r
+#define INC_PER_FRAME if(gvar->player[pn].enti.q&1) persist_aniframe++; if(persist_aniframe>4) persist_aniframe = 1;\r
 \r
-//map_view_t mv[4];\r
-static map_t map;\r
+void modexDrawSprite(page_t *page, int x, int y, bitmap_t *bmp);\r
+void modexDrawSpriteRegion(page_t *page, int x, int y, int rx, int ry, int rw, int rh, bitmap_t *bmp);\r
+boolean ZCL_ScreenMidPosChk(map_view_t *map_v, nibble dir, int tx, int ty);\r
+boolean ZCL_CollCheck(map_view_t *map_v, nibble dir, int tx, int ty);\r
+boolean ZCL_mapEdgeChk(map_view_t *map_v, nibble dir, int tx, int ty, boolean pansw, boolean noscrollsw);\r
+void oldwalk(global_game_variables_t *gvar, word pn, bitmap_t *pbmp);\r
+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);\r
+#endif\r
 float t;\r
 \r
 //debugswitches\r
@@ -41,27 +59,38 @@ unsigned int i;
 //static word paloffset=0;\r
 #endif\r
 byte *ptr;\r
-memptr pal;\r
+//memptr pal;\r
+boolean spriteswitch=0;\r
 \r
 #define FILENAME_1     "data/spri/chikyuu.vrs"\r
 #define FILENAME_1P    "data/spri/chikyuu.pal"\r
 #define FILENAME_2     "data/spri/me.vrs"\r
 #define FILENAME_2P    "data/spri/me.pal"\r
+//#define FILENAME_3   "data/spri/chistnd.vrl"\r
 \r
 void main(int argc, char *argv[])\r
 {\r
+#ifdef OLDPLAYERSPRITESTUFF\r
+       bitmap_t ptmp; // player sprite\r
+#endif\r
        static global_game_variables_t gvar;\r
        struct glob_game_vars *ggvv;\r
-       char bakapee1[64] = FILENAME_1;\r
-       char bakapee1p[64] = FILENAME_1P;\r
+\r
+       char bakapee[64] = FILENAME_1;\r
+       char bakapeep[64] = FILENAME_1P;\r
+//     char bakapee3[64] = FILENAME_3;\r
+#ifdef __DEBUG__\r
+       dbg_nointest=0;\r
+       dbg_joymousedelta=0;\r
+#endif\r
 \r
        Startup16(&gvar);\r
 \r
        ggvv=&gvar;\r
 \r
        if (argc >= 2) {\r
-               if(argv[1]){ strcpy(bakapee1, argv[1]);\r
-               if(argv[2]) strcpy(bakapee1p, argv[2]); }\r
+               if(argv[1]){ strcpy(bakapee, argv[1]);\r
+               if(argv[2]) strcpy(bakapeep, argv[2]); }\r
        }\r
 \r
        // OK, this one takes hellova time and needs to be done in farmalloc or MM_...\r
@@ -69,22 +98,46 @@ void main(int argc, char *argv[])
        //----gvar.player[0].enti.spri.spritesheet = malloc(sizeof(struct vrs_container));\r
 \r
        // create the map\r
-//     fprintf(stderr, "testing map load~      ");\r
-       CA_loadmap("data/test.map", &map, &gvar);\r
+               #ifdef SCROLLEXEDEBUG\r
+       //strcpy(gvar.handle.datadumpfilename, "mmdump1.16w");  MM_DumpData (&gvar);\r
+       //strcpy(gvar.handle.heapdumpfilename, "heap1.16w");            HC_heapdump(&gvar);\r
+       //fprintf(stderr, "testing map load~    ");\r
+               #endif\r
 #ifndef NOMAPLOAD\r
-       chkmap(&map, 0);\r
-//     initMap(&map);\r
-//     printf("chkmap ok       ");\r
-//     fprintf(stderr, "yay map loaded~~\n");\r
+       CA_loadmap("data/test.map", &gvar.map, &gvar);\r
+       chkmap(&gvar.map, 0);\r
 #else\r
-       chkmap(&map, 1);\r
-       //initMap(&map);\r
+       chkmap(&gvar.map, 1);\r
 #endif\r
+       //initMap(&gvar.map);\r
+               #ifdef SCROLLEXEDEBUG\r
+       printf("chkmap ok\n");\r
+//     fprintf(stderr, "yay map loaded~~\n");\r
+       //strcpy(gvar.handle.datadumpfilename, "mmdump2.16w");  MM_DumpData (&gvar);\r
+       //strcpy(gvar.handle.heapdumpfilename, "heap2.16w");            HC_heapdump(&gvar);\r
+               #endif\r
+\r
        // data\r
-       VRS_LoadVRS(bakapee1, &gvar.player[0].enti, &gvar);\r
+#ifdef OLDPLAYERSPRITESTUFF\r
+       ptmp = bitmapLoadPcx("data/chikyuu.pcx"); // load sprite\r
+       modexPalUpdate(ptmp.palette);\r
+#else\r
+               #ifdef SCROLLEXEDEBUG\r
+       fprintf(stderr, "VRS_LoadVRS~   ");\r
+       //strcpy(gvar.handle.datadumpfilename, "mmdump3.16w");  MM_DumpData (&gvar);\r
+       //strcpy(gvar.handle.heapdumpfilename, "heap3.16w");            HC_heapdump(&gvar);\r
+               #endif\r
+       VRS_LoadVRS(bakapee, &gvar.player[0].enti, &gvar);\r
+               #ifdef SCROLLEXEDEBUG\r
+       printf("VRS load OK~\n");\r
+       //strcpy(gvar.handle.datadumpfilename, "mmdump4.16w");  MM_DumpData (&gvar);\r
+       //strcpy(gvar.handle.heapdumpfilename, "heap4.16w");            HC_heapdump(&gvar);\r
+               #endif\r
+#endif\r
 \r
        // input!\r
-       IN_Default(0, &gvar.player[0],ctrl_Keyboard1, &gvar);\r
+       IN_Default(0, &gvar.player[0],XC_CTRLTYPE, &gvar);\r
+       IN_SetControlType(&gvar.player[0],XC_CTRLTYPE);\r
 \r
        // save the palette\r
 #ifdef FADE\r
@@ -104,7 +157,7 @@ void main(int argc, char *argv[])
        //printf("1:    %d\n", paloffset);\r
        map.tiles->data->offset=(paloffset/3);\r
        modexPalUpdate(map.tiles->data, &paloffset, 0, 0);*/\r
-       VL_LoadPalFile(bakapee1p, &gvar.video.palette, &gvar);\r
+       VL_LoadPalFile(bakapeep, &gvar.video.palette, &gvar);\r
        //VL_LoadPalFile("data/default.pal", &gvar.video.palette);\r
 \r
 #ifdef FADE\r
@@ -115,13 +168,13 @@ void main(int argc, char *argv[])
 \r
        // setup camera and screen~\r
        modexHiganbanaPageSetup(&gvar);\r
-       ZC_MVSetup(&gvar.mv, &map, &gvar);\r
+       ZC_MVSetup(&gvar.mv, &gvar.map, &gvar);\r
 \r
 #ifdef FADE\r
        modexFadeOn(4, &gvar.video.palette);\r
 #endif\r
 \r
-       IN_StartAck (&gvar);    MM_ShowMemory(&gvar);   while (!IN_CheckAck (&gvar)){}\r
+//0000 IN_StartAck (&gvar);    MM_ShowMemory(&gvar);   while (!IN_CheckAck (&gvar)){}\r
 #ifdef FADE\r
        modexPalBlack();        //so player will not see loadings~\r
 #endif\r
@@ -130,8 +183,10 @@ void main(int argc, char *argv[])
        //TODO: LOAD map data and position the map in the middle of the screen if smaller then screen\r
        mapGoTo(&gvar.mv, 0, 0);\r
 \r
-       ZC_PlayerXYpos(0, 0, &gvar.player, &gvar.mv, 0, 1);\r
+       ZC_PlayerXYpos(0, 0, &gvar.player[0], &gvar.mv, 1);\r
        EN_initPlayer(&gvar.player[0], &gvar.video);\r
+#ifdef SPRITE\r
+#ifndef OLDPLAYERSPRITESTUFF\r
        //print_anim_ids(gvar.player[0].enti.spri);\r
        if (gvar.video.sprifilei == -1)\r
        {\r
@@ -143,11 +198,17 @@ void main(int argc, char *argv[])
                modexFadeOn(4, &gvar.video.dpal);\r
 #endif\r
        }\r
+#endif\r
+#endif\r
 \r
 //     while(!gvar.in.inst->Keyboard[sc_Escape) && !gvar.in.inst->Keyboard[sc_Space) && !gvar.in.inst->Keyboard[sc_Enter]){ FUNCTIONKEYSHOWMV }\r
        gvar.video.page[0].tlx=gvar.mv[0].tx*TILEWH;\r
        gvar.video.page[0].tly=gvar.mv[0].ty*TILEWH;\r
 \r
+#ifdef OLDWALKSHOWPAGESTUFF\r
+       VL_ShowPage(&(gvar.video.page[gvar.video.sp]), gvar.kurokku.fpscap, 0);\r
+#endif\r
+\r
        shinku(&gvar);\r
 //modexpdump(gvar.mv[0].page);\r
 #ifdef FADE\r
@@ -166,7 +227,12 @@ void main(int argc, char *argv[])
                IN_ReadControl(&gvar.player[0], &gvar);\r
                if(!panswitch){\r
                        //ZC_walk2(gvar.player[0].ent, mv);\r
-                       ZC_walk(&gvar.mv, &gvar.player, 0);\r
+                       //ZC_walk(&gvar.mv, &gvar.player, 0);\r
+#ifdef OLDPLAYERSPRITESTUFF\r
+                       oldwalk(&gvar, 0, &ptmp);\r
+#else\r
+                       ZC_walk(&gvar, 0);\r
+#endif\r
                }else{\r
                        TAIL_PANKEYFUNZC;\r
                        //printf("      gvar.player[0].enti.q: %d", gvar.player[0].enti.q);     printf("        gvar.player[0].d: %d\n", gvar.player[0].d);\r
@@ -174,7 +240,7 @@ void main(int argc, char *argv[])
 \r
                //the scripting stuff....\r
                //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))\r
-               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))\r
+               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))\r
                {\r
                        short i;\r
                        for(i=800; i>=400; i--)\r
@@ -183,43 +249,77 @@ void main(int argc, char *argv[])
                        }\r
                        nosound();\r
                }\r
-               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--; }\r
+               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--; }\r
                //debugging binds!\r
-\r
-               if(gvar.in.inst->Keyboard[24]){ VL_modexPalScramble(&gvar.video.palette); /*paloffset=0;*/ modexpdump(gvar.mv[0].page); IN_UserInput(1, &gvar); } //o\r
-               if(gvar.in.inst->Keyboard[22]){ VL_modexPalScramble(&gvar.video.palette); } //u\r
+//             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\r
+               if(gvar.in.inst->Keyboard[sc_O]){ VL_LoadPalFileCore(&gvar.video.palette, &gvar); modexpdump(gvar.video.sp, &gvar); IN_UserInput(1, &gvar); } //o\r
+               if(gvar.in.inst->Keyboard[22]){ VL_modexPalScramble(&gvar.video.palette); VL_LoadPalFileCore(&gvar.video.palette, &gvar); } //u\r
 \r
                TAIL_FUNCTIONKEYFUNCTIONS\r
                TAIL_FUNCTIONKEYDRAWJUNK\r
                if(gvar.in.inst->Keyboard[sc_L]){ modexClearRegion(&gvar.video.page[0], gvar.player[0].enti.x, gvar.player[0].enti.y, 16, 16, 1); }\r
-               if(gvar.in.inst->Keyboard[sc_J] || gvar.in.inst->Keyboard[sc_K])\r
+\r
+//===============================================================================\r
+#if 0\r
+               if(gvar.in.inst->Keyboard[sc_BackSlash]){\r
+                       VRS_ReadVRL(bakapee3, &gvar.player[0].enti, &gvar);\r
+                       DrawVRL(\r
+                               gvar.player[0].enti.x,\r
+                               gvar.player[0].enti.y,\r
+                               gvar.player[0].enti.spri.sprite_vrl_cont.vrl_header,\r
+                               gvar.player[0].enti.spri.sprite_vrl_cont.line_offsets,\r
+                               gvar.player[0].enti.spri.sprite_vrl_cont.buffer + sizeof(struct vrl1_vgax_header),\r
+                               gvar.player[0].enti.spri.sprite_vrl_cont.data_size\r
+                       );      while (!IN_CheckAck (&gvar)){}\r
+                       VRS_ReadVRS(bakapee, &gvar.player[0].enti, &gvar);\r
+               IN_UserInput(1, &gvar); }\r
+#endif\r
+//===============================================================================\r
+\r
+#ifdef OLDPLAYERSPRITESTUFF\r
+               if(gvar.in.inst->Keyboard[sc_J])// || gvar.in.inst->Keyboard[sc_K])\r
+               {\r
+//                     sprintf(global_temp_status_text2, "%Fp", &ptmp.data);\r
+//                     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);\r
+                       modexDrawSprite(&gvar.video.page[0], 16, 16, &ptmp);\r
+               }\r
+               if(gvar.in.inst->Keyboard[sc_K])\r
                {\r
-                       if(gvar.in.inst->Keyboard[sc_J])\r
+                       _fmemset(ptmp.data, 4, (ptmp.width)*ptmp.height);\r
+               }\r
+#else\r
+               if(gvar.in.inst->Keyboard[sc_J])// || gvar.in.inst->Keyboard[sc_K])\r
+               {\r
+                       if(spriteswitch)//gvar.in.inst->Keyboard[sc_J])\r
                        {\r
-//                             bakapee1=FILENAME_1;\r
-//                             bakapee1p=FILENAME_1P;\r
-                               strcpy(bakapee1, FILENAME_1);\r
-                               strcpy(bakapee1p, FILENAME_1P);\r
+                               strcpy(bakapee, FILENAME_1);\r
+                               strcpy(bakapeep, FILENAME_1P);\r
                                gvar.player[0].enti.overdraww=0;\r
                        }\r
-                       if(gvar.in.inst->Keyboard[sc_K])\r
+                       else//if(gvar.in.inst->Keyboard[sc_K])\r
                        {\r
-//                             bakapee1=FILENAME_2;\r
-//                             bakapee1p=FILENAME_2P;\r
-                               strcpy(bakapee1, FILENAME_2);\r
-                               strcpy(bakapee1p, FILENAME_2P);\r
+                               strcpy(bakapee, FILENAME_2);\r
+                               strcpy(bakapeep, FILENAME_2P);\r
                                gvar.player[0].enti.overdraww=2;\r
                        }\r
-                       //read_vrs(&gvar, bakapee1, gvar.player[0].enti.spri->spritesheet);\r
-                       VRS_ReadVRS(bakapee1, &gvar.player[0].enti, &gvar);\r
-                       VL_LoadPalFile(bakapee1p, &gvar.video.palette, &gvar);\r
+                       spriteswitch=!spriteswitch;\r
+\r
+                       //read_vrs(&gvar, bakapee, gvar.player[0].enti.spri->spritesheet);\r
+                       VRS_ReadVRS(bakapee, &gvar.player[0].enti, &gvar);\r
+                       VL_LoadPalFile(bakapeep, &gvar.video.palette, &gvar);\r
+                       ZC_animatePlayer(&gvar.mv, &gvar.player, 0);\r
+                       IN_UserInput(1, &gvar);\r
                }//JK\r
-#ifdef FADE\r
-               if(gvar.in.inst->Keyboard[10]){ modexPalOverscan(rand()%56); modexPalUpdate(gvar.video.dpal); IN_UserInput(1, &gvar); }\r
 #endif\r
-               if(gvar.in.inst->Keyboard[sc_R]){ modexPalOverscan(rand()%56); } //r\r
+//#ifdef FADE\r
+//             if(gvar.in.inst->Keyboard[10]){ modexPalOverscan(rand()%56); modexPalUpdate(gvar.video.dpal); IN_UserInput(1, &gvar); }\r
+//#endif\r
+               if(gvar.in.inst->Keyboard[sc_R]){ VL_modexPalOverscan(&gvar.video.palette, rand()%32); } //r\r
+               if(gvar.in.inst->Keyboard[sc_F]){ VL_SetPalette(&gamepal, &gvar.video); } //f\r
+\r
 \r
-               if((gvar.player[0].enti.q==1) && !(gvar.player[0].enti.x%TILEWH==0 && gvar.player[0].enti.y%TILEWH==0)) Quit (&gvar, "PLAYER OFF THE RAILS!");//break;  //incase things go out of sync!\r
+               //if((gvar.player[0].enti.q==1) && !(gvar.player[0].enti.x%TILEWH==0 && gvar.player[0].enti.y%TILEWH==0)) Quit (&gvar, "PLAYER OFF THE RAILS!");//break;        //incase things go out of sync!\r
+               ZC_GirdChk(&gvar, &gvar.player[0]);\r
        }\r
 \r
        /* fade back to text mode */\r
@@ -229,6 +329,10 @@ void main(int argc, char *argv[])
        modexSavePalFile("data/g.pal", &gvar.video.palette);\r
        modexFadeOff(4, &gvar.video.palette);\r
 #endif\r
+               #ifdef SCROLLEXEDEBUG\r
+       MM_DumpData (&gvar);\r
+       HC_heapdump (&gvar);\r
+               #endif\r
        Shutdown16(&gvar);\r
        printf("\nProject 16 xcroll.exe. This is just a test file!\n");\r
        printf("version %s\n", VERSION);\r
@@ -238,3 +342,321 @@ void main(int argc, char *argv[])
        modexFadeOn(4, gvar.video.dpal);\r
 #endif\r
 }\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+#ifdef OLDPLAYERSPRITESTUFF\r
+void\r
+modexDrawSprite(page_t *page, int x, int y, bitmap_t *bmp) {\r
+    /* draw the whole sprite */\r
+    modexDrawSpriteRegion(page, x, y, 0, 0, bmp->width, bmp->height, bmp);\r
+//     sprintf(global_temp_status_text2, "%Fp", &bmp->data);\r
+//     modexprint(page, page->sw/2, (page->sh/2)+8, 1, 1, 3/*ccolor*/, 8, gvar->video.VL_Started, global_temp_status_text2);\r
+}\r
+\r
+void\r
+modexDrawSpriteRegion(page_t *page, int x, int y,\r
+                     int rx, int ry, int rw, int rh, bitmap_t *bmp) {\r
+    word poffset = (word)page->data + y*(page->width/4) + x/4;\r
+    byte *data = bmp->data;\r
+    word bmpOffset = (word) data + ry * bmp->width + rx;\r
+    word width = rw;\r
+    word height = rh;\r
+    byte plane = 1 << ((byte) x & 0x03);\r
+    word scanCount = width/4 + (width%4 ? 1 :0);\r
+    word nextPageRow = page->width/4 - scanCount;\r
+    word nextBmpRow = (word) bmp->width - width;\r
+    word rowCounter=0;\r
+    byte planeCounter = 4;\r
+\r
+//     sprintf(global_temp_status_text2, "%Fp", bmp->data);\r
+//     modexprint(page, page->sw/2, (page->sh/2)+8, 1, 1, 3/*ccolor*/, 8, ggvv->video.VL_Started, global_temp_status_text2);\r
+//     sprintf(global_temp_status_text2, "%Fp", data);\r
+//     modexprint(page, page->sw/2, (page->sh/2)+16, 1, 1, 3/*ccolor*/, 8, ggvv->video.VL_Started, global_temp_status_text2);\r
+\r
+    __asm {\r
+               MOV AX, SCREEN_SEG      ; go to the VGA memory\r
+               MOV ES, AX\r
+\r
+               MOV DX, SC_INDEX        ; point at the map mask register\r
+               MOV AL, SC_MAPMASK      ;\r
+               OUT DX, AL              ;\r
+\r
+       PLANE_LOOP:\r
+               MOV DX, SC_DATA         ; select the current plane\r
+               MOV AL, plane           ;\r
+               OUT DX, AL              ;\r
+\r
+               ;-- begin plane painting\r
+               MOV AX, height          ; start the row counter\r
+               MOV rowCounter, AX      ;\r
+               MOV DI, poffset         ; go to the first pixel\r
+               MOV SI, bmpOffset       ; go to the bmp pixel\r
+       ROW_LOOP:\r
+               MOV CX, width           ; count the columns\r
+       SCAN_LOOP:\r
+               LODSB\r
+               DEC SI\r
+               CMP AL, 0\r
+               JNE DRAW_PIXEL          ; draw non-zero pixels\r
+\r
+               INC DI                  ; skip the transparent pixel\r
+               ADD SI, 1\r
+               JMP NEXT_PIXEL\r
+       DRAW_PIXEL:\r
+               MOVSB                   ; copy the pixel\r
+       NEXT_PIXEL:\r
+               SUB CX, 3               ; we skip the next 3\r
+               ADD SI, 3               ; skip the bmp pixels\r
+               LOOP SCAN_LOOP          ; finish the scan\r
+\r
+               MOV AX, nextPageRow\r
+               ADD DI, AX              ; go to the next row on screen\r
+               MOV AX, nextBmpRow\r
+               ADD SI, AX              ; go to the next row on bmp\r
+\r
+               DEC rowCounter\r
+               JNZ ROW_LOOP            ; do all the rows\r
+               ;-- end plane painting\r
+\r
+               MOV AL, plane           ; advance to the next plane\r
+               SHL AL, 1               ;\r
+               AND AL, 0x0f            ; mask the plane properly\r
+               MOV plane, AL           ; store the plane\r
+\r
+               INC bmpOffset           ; start bmp at the right spot\r
+\r
+               DEC planeCounter\r
+               JNZ PLANE_LOOP          ; do all 4 planes\r
+    }\r
+}\r
+\r
+void oldwalk(global_game_variables_t *gvar, word pn, bitmap_t *pbmp)\r
+{\r
+       switch(gvar->player[pn].enti.d)\r
+       {\r
+               //no direction\r
+               case 2:\r
+                       //0000gvar->mv[0].video->startclk = (*clockw);\r
+               break;\r
+               //right movement\r
+               case 3:\r
+                       if(ZCL_ScreenMidPosChk(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty) &&\r
+                       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!\r
+                       {\r
+                               gvar->player[pn].walktype=2;\r
+                               if(gvar->player[pn].enti.q<=gvar->player[pn].enti.spt)\r
+                               {\r
+                                       INC_PER_FRAME;\r
+                                       animatePlayer(gvar, 1, 1, gvar->player[pn].enti.x, gvar->player[pn].enti.y, persist_aniframe, gvar->player[pn].enti.q, pbmp);\r
+                                       ZC_mapScroll(gvar->mv, gvar->player, pn);\r
+                                       gvar->player[pn].enti.q++;\r
+                                       //0000gvar->mv[0].video->clk = ((*clockw)-gvar->mv[0].video->startclk)/18.2;\r
+                                       modexShowPage(&gvar->video.page[0]);\r
+                               } else { gvar->player[pn].enti.q = 1; gvar->player[pn].enti.d = 2; gvar->player[pn].enti.tx++; }\r
+                       }\r
+                       else if(ZCL_mapEdgeChk(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty, 0, 1) &&\r
+                       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))\r
+                       {\r
+                               gvar->player[pn].walktype=1;\r
+                               if(gvar->player[pn].enti.q<=gvar->player[pn].enti.spt)\r
+                               {\r
+                                       INC_PER_FRAME;\r
+                                       gvar->player[pn].enti.x+=(gvar->player[pn].enti.spt);\r
+                                       animatePlayer(gvar, 1, 0, gvar->player[pn].enti.x, gvar->player[pn].enti.y, persist_aniframe, gvar->player[pn].enti.q, pbmp);\r
+                                       gvar->player[pn].enti.q++;\r
+                                       modexShowPage(&gvar->video.page[0]);\r
+                               } else { gvar->player[pn].enti.q = 1; gvar->player[pn].enti.d = 2; gvar->player[pn].enti.tx++; }\r
+                       }\r
+                       else\r
+                       {\r
+                               gvar->player[pn].walktype=0;\r
+                               //ZC_animatePlayer(gvar->mv, gvar->player, pn);\r
+                               modexShowPage(&gvar->video.page[0]);\r
+                               gvar->player[pn].enti.d = 2;\r
+                       }\r
+                       gvar->player[pn].enti.triggerx = gvar->player[pn].enti.tx+1;\r
+                       gvar->player[pn].enti.triggery = gvar->player[pn].enti.ty;\r
+               break;\r
+               //left movement\r
+               case 1:\r
+                       if(ZCL_ScreenMidPosChk(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty) &&\r
+                       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!\r
+                       {\r
+                               gvar->player[pn].walktype=2;\r
+                               if(gvar->player[pn].enti.q<=gvar->player[pn].enti.spt)\r
+                               {\r
+                                       INC_PER_FRAME;\r
+                                       animatePlayer(gvar, 1, 1, gvar->player[pn].enti.x, gvar->player[pn].enti.y, persist_aniframe, gvar->player[pn].enti.q, pbmp);\r
+                                       ZC_mapScroll(gvar->mv, gvar->player, pn);\r
+                                       gvar->player[pn].enti.q++;\r
+                                       //0000gvar->mv[0].video->clk = ((*clockw)-gvar->mv[0].video->startclk)/18.2;\r
+                                       modexShowPage(&gvar->video.page[0]);\r
+                               } else { gvar->player[pn].enti.q = 1; gvar->player[pn].enti.d = 2; gvar->player[pn].enti.tx--; }\r
+                       }\r
+                       else if(ZCL_mapEdgeChk(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty, 0, 1) &&\r
+                       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))\r
+                       {\r
+                               gvar->player[pn].walktype=1;\r
+                               if(gvar->player[pn].enti.q<=gvar->player[pn].enti.spt)\r
+                               {\r
+                                       INC_PER_FRAME;\r
+                                       gvar->player[pn].enti.x-=(gvar->player[pn].enti.spt);\r
+                                       animatePlayer(gvar, 1, 0, gvar->player[pn].enti.x, gvar->player[pn].enti.y, persist_aniframe, gvar->player[pn].enti.q, pbmp);\r
+                                       gvar->player[pn].enti.q++;\r
+                                       modexShowPage(&gvar->video.page[0]);\r
+                               } else { gvar->player[pn].enti.q = 1; gvar->player[pn].enti.d = 2; gvar->player[pn].enti.tx--; }\r
+                       }\r
+                       else\r
+                       {\r
+                               gvar->player[pn].walktype=0;\r
+                               //ZC_animatePlayer(gvar->mv, gvar->player, pn);\r
+                               modexShowPage(&gvar->video.page[0]);\r
+                               gvar->player[pn].enti.d = 2;\r
+                       }\r
+                       gvar->player[pn].enti.triggerx = gvar->player[pn].enti.tx-1;\r
+                       gvar->player[pn].enti.triggery = gvar->player[pn].enti.ty;\r
+               break;\r
+               //down movement\r
+               case 4:\r
+                       if(ZCL_ScreenMidPosChk(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty) &&\r
+                       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!\r
+                       {\r
+                               gvar->player[pn].walktype=2;\r
+                               if(gvar->player[pn].enti.q<=gvar->player[pn].enti.spt)\r
+                               {\r
+                                       INC_PER_FRAME;\r
+                                       animatePlayer(gvar, 1, 1, gvar->player[pn].enti.x, gvar->player[pn].enti.y, persist_aniframe, gvar->player[pn].enti.q, pbmp);\r
+                                       ZC_mapScroll(gvar->mv, gvar->player, pn);\r
+                                       gvar->player[pn].enti.q++;\r
+                                       //0000gvar->mv[0].video->clk = ((*clockw)-gvar->mv[0].video->startclk)/18.2;\r
+                                       modexShowPage(&gvar->video.page[0]);\r
+                               } else { gvar->player[pn].enti.q = 1; gvar->player[pn].enti.d = 2; gvar->player[pn].enti.ty++; }\r
+                       }\r
+                       else if(ZCL_mapEdgeChk(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty, 0, 1) &&\r
+                       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))\r
+                       {\r
+                               gvar->player[pn].walktype=1;\r
+                               if(gvar->player[pn].enti.q<=gvar->player[pn].enti.spt)\r
+                               {\r
+                                       INC_PER_FRAME;\r
+                                       gvar->player[pn].enti.y+=(gvar->player[pn].enti.spt);\r
+                                       animatePlayer(gvar, 1, 0, gvar->player[pn].enti.x, gvar->player[pn].enti.y, persist_aniframe, gvar->player[pn].enti.q, pbmp);\r
+                                       gvar->player[pn].enti.q++;\r
+                                       modexShowPage(&gvar->video.page[0]);\r
+                               } else { gvar->player[pn].enti.q = 1; gvar->player[pn].enti.d = 2; gvar->player[pn].enti.ty++; }\r
+                       }\r
+                       else\r
+                       {\r
+                               gvar->player[pn].walktype=0;\r
+                               //ZC_animatePlayer(gvar->mv, gvar->player, pn);\r
+                               modexShowPage(&gvar->video.page[0]);\r
+                               gvar->player[pn].enti.d = 2;\r
+                       }\r
+                       gvar->player[pn].enti.triggerx = gvar->player[pn].enti.tx;\r
+                       gvar->player[pn].enti.triggery = gvar->player[pn].enti.ty+1;\r
+               break;\r
+               //up movement\r
+               case 0:\r
+                       if(ZCL_ScreenMidPosChk(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty) &&\r
+                       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!\r
+                       {\r
+                               gvar->player[pn].walktype=2;\r
+                               if(gvar->player[pn].enti.q<=gvar->player[pn].enti.spt)\r
+                               {\r
+                                       INC_PER_FRAME;\r
+                                       animatePlayer(gvar, 1, 1, gvar->player[pn].enti.x, gvar->player[pn].enti.y, persist_aniframe, gvar->player[pn].enti.q, pbmp);\r
+                                       ZC_mapScroll(gvar->mv, gvar->player, pn);\r
+                                       gvar->player[pn].enti.q++;\r
+                                       //0000gvar->mv[0].video->clk = ((*clockw)-gvar->mv[0].video->startclk)/18.2;\r
+                                       modexShowPage(&gvar->video.page[0]);\r
+                               } else { gvar->player[pn].enti.q = 1; gvar->player[pn].enti.d = 2; gvar->player[pn].enti.ty--; }\r
+                       }\r
+                       else if(ZCL_mapEdgeChk(gvar->mv, gvar->player[pn].enti.d, gvar->player[pn].enti.tx, gvar->player[pn].enti.ty, 0, 1) &&\r
+                       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))\r
+                       {\r
+                               gvar->player[pn].walktype=1;\r
+                               if(gvar->player[pn].enti.q<=gvar->player[pn].enti.spt)\r
+                               {\r
+                                       INC_PER_FRAME;\r
+                                       gvar->player[pn].enti.y-=(gvar->player[pn].enti.spt);\r
+                                       animatePlayer(gvar, 1, 0, gvar->player[pn].enti.x, gvar->player[pn].enti.y, persist_aniframe, gvar->player[pn].enti.q, pbmp);\r
+                                       gvar->player[pn].enti.q++;\r
+                                       modexShowPage(&gvar->video.page[0]);\r
+                               } else { gvar->player[pn].enti.q = 1; gvar->player[pn].enti.d = 2; gvar->player[pn].enti.ty--; }\r
+                       }\r
+                       else\r
+                       {\r
+                               gvar->player[pn].walktype=0;\r
+                               //ZC_animatePlayer(gvar->mv, gvar->player, pn);\r
+                               modexShowPage(&gvar->video.page[0]);\r
+                               gvar->player[pn].enti.d = 2;\r
+                       }\r
+                       gvar->player[pn].enti.triggerx = gvar->player[pn].enti.tx;\r
+                       gvar->player[pn].enti.triggery = gvar->player[pn].enti.ty-1;\r
+               break;\r
+       }\r
+}\r
+\r
+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)\r
+{\r
+       short dire=32*d1; //direction\r
+       short qq; //scroll offset\r
+\r
+       if(d2==0) qq = 0;\r
+       else qq = ((lp)*gvar->player[0].enti.spt);\r
+       switch (d1)\r
+       {\r
+               case 0:\r
+                       //up\r
+                       x=x-4;\r
+                       y=y-qq-TILEWH;\r
+               break;\r
+               case 1:\r
+                       // right\r
+                       x=x+qq-4;\r
+                       y=y-TILEWH;\r
+               break;\r
+               case 2:\r
+                       //down\r
+                       x=x-4;\r
+                       y=y+qq-TILEWH;\r
+               break;\r
+               case 3:\r
+                       //left\r
+                       x=x-qq-4;\r
+                       y=y-TILEWH;\r
+               break;\r
+       }\r
+       modexCopyPageRegion(gvar->mv[0].page, gvar->mv[1].page, x-4, y-4, x-4, y-4, 28, 40);\r
+       if(2>ls && ls>=1) { modexDrawSpriteRegion(gvar->mv[0].page, x, y, 48, dire, 24, 32, bmp); }else\r
+       if(3>ls && ls>=2) { modexDrawSpriteRegion(gvar->mv[0].page, x, y, 24, dire, 24, 32, bmp); }else\r
+       if(4>ls && ls>=3) { modexDrawSpriteRegion(gvar->mv[0].page, x, y, 0, dire, 24, 32, bmp); }else\r
+       if(5>ls && ls>=4) { modexDrawSpriteRegion(gvar->mv[0].page, x, y, 24, dire, 24, 32, bmp); }\r
+       //TODO: mask copy //modexCopyPageRegion(gvar->mv[0].page, gvar->mv[0].page, x-4, y-4, x-4, y-4, 28, 40);\r
+       //modexClearRegion(top->page, 66, 66, 2, 40, 0);\r
+       //modexCopyPageRegion(gvar->mv[0].page, top->page, 66, 66, 66, 66, 2, 40);\r
+       //turn this off if XT\r
+       //if(detectcpu() > 0) modexWaitBorder();\r
+       switch(gvar->kurokku.fpscap)\r
+       {\r
+               case 0: //turn this off if XT\r
+                       //modexprint(&(gv->video.page[0]), x, y+8, type, 1, col, bgcol, "sanic!");\r
+                       gvar->kurokku.frames_per_second=1;\r
+               break;\r
+               case 1:\r
+                       modexWaitBorder();\r
+                       gvar->kurokku.frames_per_second=FPSVALUE;\r
+               break;\r
+       }\r
+       PM_NextFrame(gvar);\r
+}\r
+#endif\r