]> 4ch.mooo.com Git - 16.git/blobdiff - src/lib/scroll16.c
optimized scrolling ww
[16.git] / src / lib / scroll16.c
index 057ecf06c3d13d0c79250311a43c407c5c98e8a4..735b76fc1950d69274828bc43691db087f5fafcc 100755 (executable)
@@ -66,11 +66,11 @@ void walk(map_view_t *pip, player_t *player, word pn)
                        }
                        else
                        {
-                               if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].x-4, player[pn].y-TILEWH, player[pn].x-4, player[pn].y-TILEWH, 24, 32);
+                               if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].x, player[pn].y-TILEWH, player[pn].x, player[pn].y-TILEWH, 16, 32);
 #ifdef SPRITE
-                               PBUFSFUN(pip[1].page, player[pn].x-4, player[pn].y-TILEWH, 24, 32, 24, 32, PLAYERBMPDATA);
+                               PBUFSFUN(pip[1].page, player[pn].x, player[pn].y-TILEWH, 16, 32, 16, 32, PLAYERBMPDATA);
 #else
-                               modexClearRegion(pip[1].page, player[pn].x-4, player[pn].y-TILEWH, 24, 32, 14);
+                               modexClearRegion(pip[1].page, player[pn].x, player[pn].y-TILEWH, 16, 32, 14);
 #endif
                                if(!pageflipflop) modexShowPage(pip[1].page);
                                player[pn].d = 2;
@@ -110,11 +110,11 @@ void walk(map_view_t *pip, player_t *player, word pn)
                        }
                        else
                        {
-                               if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].x-4, player[pn].y-TILEWH, player[pn].x-4, player[pn].y-TILEWH, 24, 32);
+                               if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].x, player[pn].y-TILEWH, player[pn].x, player[pn].y-TILEWH, 16, 32);
 #ifdef SPRITE
-                               PBUFSFUN(pip[1].page, player[pn].x-4, player[pn].y-TILEWH, 24, 96, 24, 32, PLAYERBMPDATA);
+                               PBUFSFUN(pip[1].page, player[pn].x, player[pn].y-TILEWH, 16, 96, 16, 32, PLAYERBMPDATA);
 #else
-                               modexClearRegion(pip[1].page, player[pn].x-4, player[pn].y-TILEWH, 24, 32, 10);
+                               modexClearRegion(pip[1].page, player[pn].x, player[pn].y-TILEWH, 16, 32, 10);
 #endif
                                if(!pageflipflop) modexShowPage(pip[1].page);
                                player[pn].d = 2;
@@ -154,11 +154,11 @@ void walk(map_view_t *pip, player_t *player, word pn)
                        }
                        else
                        {
-                               if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].x-4, player[pn].y-TILEWH, player[pn].x-4, player[pn].y-TILEWH, 24, 32);
+                               if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].x, player[pn].y-TILEWH, player[pn].x, player[pn].y-TILEWH, 16, 32);
 #ifdef SPRITE
-                               PBUFSFUN(pip[1].page, player[pn].x-4, player[pn].y-TILEWH, 24, 64, 24, 32, PLAYERBMPDATA);
+                               PBUFSFUN(pip[1].page, player[pn].x, player[pn].y-TILEWH, 16, 64, 16, 32, PLAYERBMPDATA);
 #else
-                               modexClearRegion(pip[1].page, player[pn].x-4, player[pn].y-TILEWH, 24, 32, 9);
+                               modexClearRegion(pip[1].page, player[pn].x, player[pn].y-TILEWH, 16, 32, 9);
 #endif
                                if(!pageflipflop) modexShowPage(pip[1].page);
                                player[pn].d = 2;
@@ -198,11 +198,11 @@ void walk(map_view_t *pip, player_t *player, word pn)
                        }
                        else
                        {
-                               if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].x-4, player[pn].y-TILEWH, player[pn].x-4, player[pn].y-TILEWH, 24, 32);
+                               if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].x, player[pn].y-TILEWH, player[pn].x, player[pn].y-TILEWH, 16, 32);
 #ifdef SPRITE
-                               PBUFSFUN(pip[1].page, player[pn].x-4, player[pn].y-TILEWH, 24, 0, 24, 32, PLAYERBMPDATA);
+                               PBUFSFUN(pip[1].page, player[pn].x, player[pn].y-TILEWH, 16, 0, 16, 32, PLAYERBMPDATA);
 #else
-                               modexClearRegion(pip[1].page, player[pn].x-4, player[pn].y-TILEWH, 24, 32, 12);
+                               modexClearRegion(pip[1].page, player[pn].x, player[pn].y-TILEWH, 16, 32, 12);
 #endif
                                if(!pageflipflop) modexShowPage(pip[1].page);
                                player[pn].d = 2;
@@ -380,12 +380,12 @@ void near mapScrollRight(map_view_t *mv, player_t *player, word id, word plid)
        /* draw the next column */
        x= mv[0].page->sw + mv[id].map->tiles->tileWidth;
        if(player[plid].q%4)
-               if(!pageflipflop){
                if(id==0)
                        mapDrawCol(&mv[0], mv[0].tx + mv[0].page->tw, mv[0].ty-1, x, player, mv->page->dx);
                else
-                       modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[id].map->tiles->tileWidth, mv[id].map->tiles->tileHeight*(mv[0].page->th+2));
-               }else mapDrawCol(&mv[(!mv[0].video->p)], mv[0].tx + mv[0].page->tw, mv[0].ty-1, x, player, mv->page->dx);
+                       if(!pageflipflop)
+                               modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[id].map->tiles->tileWidth, mv[id].map->tiles->tileHeight*(mv[0].page->th+2));
+                       else    mv[0].video->r=1;
 }
 
 
@@ -401,7 +401,6 @@ void near mapScrollLeft(map_view_t *mv, player_t *player, word id, word plid)
        {
        /* go backward one tile */
        mv[id].tx--;
-
        /* Snap the origin backward */
        mv[id].page->data -= 4;
        mv[id].page->dx = mv[id].map->tiles->tileWidth;
@@ -410,12 +409,12 @@ void near mapScrollLeft(map_view_t *mv, player_t *player, word id, word plid)
        /* draw the next column */
        x= 0;
        if(player[plid].q%4)
-               if(!pageflipflop){
                if(id==0)
                        mapDrawCol(&mv[0], mv[0].tx - 1, mv[0].ty-1, x, player, mv->page->dx);
                else
-                       modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[id].map->tiles->tileWidth, mv[id].map->tiles->tileHeight*(mv[0].page->th+2));
-       }else mapDrawCol(&mv[(!mv[0].video->p)], mv[0].tx - 1, mv[0].ty-1, x, player, mv->page->dx);
+                       if(!pageflipflop)
+                               modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[id].map->tiles->tileWidth, mv[id].map->tiles->tileHeight*(mv[0].page->th+2));
+                       else    mv[0].video->r=1;
 }
 
 
@@ -439,12 +438,12 @@ void near mapScrollUp(map_view_t *mv, player_t *player, word id, word plid)
        /* draw the next row */
        y= 0;
        if(player[plid].q%3)
-               if(!pageflipflop){
                if(id==0)
                        mapDrawRow(&mv[0], mv[0].tx - 1, mv[0].ty-1, y, player, mv->page->dy);
                else
-                       modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[id].map->tiles->tileWidth*(mv[0].page->tw+2), mv[id].map->tiles->tileHeight);
-       }else mapDrawRow(&mv[(!mv[0].video->p)], mv[0].tx - 1, mv[0].ty-1, y, player, mv->page->dy);
+                       if(!pageflipflop)
+                               modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[id].map->tiles->tileWidth*(mv[0].page->tw+2), mv[id].map->tiles->tileHeight);
+                       else    mv[0].video->r=1;
 }
 
 void near mapScrollDown(map_view_t *mv, player_t *player, word id, word plid)
@@ -467,12 +466,12 @@ void near mapScrollDown(map_view_t *mv, player_t *player, word id, word plid)
        /* draw the next row */
        y= mv[0].page->sh + mv[id].map->tiles->tileHeight;
        if(player[plid].q%3)
-               if(!pageflipflop){
                if(id==0)
                        mapDrawRow(&mv[0], mv[0].tx - 1, mv[0].ty+mv[0].page->th, y, player, mv->page->dy);
                else
-                       modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[id].map->tiles->tileWidth*(mv[0].page->tw+2), mv[id].map->tiles->tileHeight);
-       }else mapDrawRow(&mv[(!mv[0].video->p)], mv[0].tx - 1, mv[0].ty+mv[0].page->th, y, player, mv->page->dy);
+                       if(!pageflipflop)
+                               modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[id].map->tiles->tileWidth*(mv[0].page->tw+2), mv[id].map->tiles->tileHeight);
+                       else    mv[0].video->r=1;
 }
 
 
@@ -487,6 +486,13 @@ void near ScrollRight(map_view_t *mv, player_t *player, word id, word plid)
        {
                /* block copy pattern to where we will draw the sprite */
                vga_setup_wm1_block_copy();
+//             {
+//                     word i;
+//                     byte o,o2;
+//                     o2 = *mv[0].video->page[id].data+4;
+//                     o = *mv[0].video->page[id].data;
+//                     for (i=0;i < mv[0].video->page[id].height;i++,o += mv[0].video->page[id].width+vga_state.vga_stride,o2 += (*mv[0].video->page[id].data >> 2)) vga_wm1_mem_block_copy(o2,o,*mv[0].video->page[id].data >> 2);
+//             }
                _fmemmove(mv[0].video->page[id].data+4, mv[0].video->page[id].data, mv[0].video->page[id].pagesize);
                /* must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally */
                vga_restore_rm0wm0();
@@ -496,7 +502,6 @@ void near ScrollRight(map_view_t *mv, player_t *player, word id, word plid)
        }
 }
 
-
 void near ScrollLeft(map_view_t *mv, player_t *player, word id, word plid)
 {
        /* decrement the pixel position and update the page */
@@ -507,6 +512,13 @@ void near ScrollLeft(map_view_t *mv, player_t *player, word id, word plid)
        {
                /* block copy pattern to where we will draw the sprite */
                vga_setup_wm1_block_copy();
+//             {
+//                     word i;
+//                     byte o,o2;
+//                     o2 = *mv[0].video->page[id].data-4;
+//                     o = *mv[0].video->page[id].data;
+//                     for (i=0;i < mv[0].video->page[id].height;i++,o += mv[0].video->page[id].width+vga_state.vga_stride,o2 += (*mv[0].video->page[id].data >> 2)) vga_wm1_mem_block_copy(o2,o,*mv[0].video->page[id].data >> 2);
+//             }
                _fmemmove(mv[0].video->page[id].data-4, mv[0].video->page[id].data, mv[0].video->page[id].pagesize);
                /* must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally */
                vga_restore_rm0wm0();
@@ -526,6 +538,13 @@ void near ScrollUp(map_view_t *mv, player_t *player, word id, word plid)
        {
                /* block copy pattern to where we will draw the sprite */
                vga_setup_wm1_block_copy();
+//             {
+//                     word i;
+//                     byte o,o2;
+//                     o2 = *mv[0].video->page[id].data-mv[0].video->page[id].pi;
+//                     o = *mv[0].video->page[id].data;
+//                     for (i=0;i < mv[0].video->page[id].height;i++,o += mv[0].video->page[id].width+vga_state.vga_stride,o2 += (*mv[0].video->page[id].data >> 2)) vga_wm1_mem_block_copy(o2,o,*mv[0].video->page[id].data >> 2);
+//             }
                _fmemmove(mv[0].video->page[id].data-mv[0].video->page[id].pi, mv[0].video->page[id].data, mv[0].video->page[id].pagesize);
                /* must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally */
                vga_restore_rm0wm0();
@@ -545,6 +564,13 @@ void near ScrollDown(map_view_t *mv, player_t *player, word id, word plid)
        {
                /* block copy pattern to where we will draw the sprite */
                vga_setup_wm1_block_copy();
+//             {
+//                     word i;
+//                     byte o,o2;
+//                     o2 = *mv[0].video->page[id].data+mv[0].video->page[id].pi;
+//                     o = *mv[0].video->page[id].data;
+//                     for (i=0;i < mv[0].video->page[id].height;i++,o += mv[0].video->page[id].width+vga_state.vga_stride,o2 += (*mv[0].video->page[id].data >> 2)) vga_wm1_mem_block_copy(o2,o,*mv[0].video->page[id].data >> 2);
+//             }
                _fmemmove(mv[0].video->page[id].data+mv[0].video->page[id].pi, mv[0].video->page[id].data, mv[0].video->page[id].pagesize);
                /* must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally */
                vga_restore_rm0wm0();
@@ -622,17 +648,17 @@ void mapGoTo(map_view_t *mv, int tx, int ty)
        i+=mv->map->width - tx;
        }
        modexCopyPageRegion(mv[1].page, mv[0].page, 0, 0, 0, 0, mv[0].page->width, mv[0].page->height);
-       {
-               unsigned int k,j,o;
-               /* fill screen with a distinctive pattern */
-               for (k=0;k < vga_state.vga_width;k++) {
-                       o = k >> 2;
-                       vga_write_sequencer(0x02/*map mask*/,1 << (k&3));
-                               for (j=0;j < (mv[0].page->height)+(mv[1].page->height)+(mv[2].page->height)+(mv[3].page->height);j++,o += vga_state.vga_stride)
-                                       vga_state.vga_graphics_ram[o] = (k^j)&15; // VRL samples put all colors in first 15!
-               }
-       }
-       modexCopyPageRegion(mv[3].page, mv[!(mv->video->p)].page, 0/**/, 0/**/, 0, 128, 28, 36);
+//     {
+//             unsigned int k,j,o;
+//             /* fill screen with a distinctive pattern */
+//             for (k=0;k < vga_state.vga_width;k++) {
+//                     o = k >> 2;
+//                     vga_write_sequencer(0x02/*map mask*/,1 << (k&3));
+//                             for (j=0;j < (mv[0].page->height)+(mv[1].page->height)+(mv[2].page->height)+(mv[3].page->height);j++,o += vga_state.vga_stride)
+//                                     vga_state.vga_graphics_ram[o] = (k^j)&15; // VRL samples put all colors in first 15!
+//             }
+//     }
+       modexCopyPageRegion(mv[3].page, mv[!(mv->video->p)].page, 0/**/, 0/**/, 0, 128, 20, 36);
 }
 
 
@@ -805,24 +831,22 @@ void shinku(global_game_variables_t *gv)
        switch(gv->kurokku.fpscap)
        {
                case 0:
-                       modexprint(&(gv->video.page[shinku_fps_indicator_page]), x, y+8, type, col, bgcol, "sanic!");
+                       //modexprint(&(gv->video.page[shinku_fps_indicator_page]), x, y+8, type, col, bgcol, "sanic!");
                        gv->kurokku.frames_per_second=1;
                break;
                case 1:
                        //turn this off if XT
-                       //modexWaitBorder();
-                       vga_wait_for_vsync();
+                       modexWaitBorder();
+                       //vga_wait_for_vsync();
                        gv->kurokku.frames_per_second=60;
                break;
        }
        if(pageflipflop){
        if(gv->video.r){
-               /* block copy pattern to where we will draw the sprite */
                //vga_setup_wm1_block_copy();
-               //_fmemmove((gv->video.page[(gv->video.p)]).data, (gv->video.page[(!gv->video.p)]).data, gv->video.page[(!gv->video.p)].pagesize);
-               modexCopyPageRegion(&(gv->video.page[(gv->video.p)]), &(gv->video.page[(!gv->video.p)]), 0, 0, 0, 0, gv->video.page[gv->video.p].width, gv->video.page[!gv->video.p].height);
-               /* must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally */
+               //_fmemcpy((gv->video.page[(gv->video.p)]).data, (gv->video.page[(!gv->video.p)]).data, gv->video.page[(!gv->video.p)].pagesize);
                //vga_restore_rm0wm0();
+               modexCopyPageRegion(&(gv->video.page[(gv->video.p)]), &(gv->video.page[(!gv->video.p)]), 0, 0, 0, 0, gv->video.page[gv->video.p].width, gv->video.page[!gv->video.p].height);
                modexShowPage(&(gv->video.page[gv->video.p]));
                gv->video.p=!gv->video.p;
                gv->video.r=!gv->video.r;
@@ -835,17 +859,20 @@ void near animatePlayer(map_view_t *pip, player_t *player, word pn, sword scroll
 {
        sword x = player[pn].x;
        sword y = player[pn].y;
-#ifdef SPRITE
        word dire=32; //direction
-#else
-       word dire=8; //direction
-#endif
        sword qq; //scroll offset
        word ls = player[pn].persist_aniframe;
 
-       if(scrollswitch==0) qq = 0;
-       else qq = ((player[pn].q)*(player[pn].speed));
-       x-=4;
+       switch(scrollswitch)
+       {
+               case 0:
+                       qq = 0;
+               break;
+               default:
+                       qq = ((player[pn].q)*(player[pn].speed));
+               break;
+       }
+       //x-=4;
        y-=TILEWH;
        switch (player[pn].d)
        {
@@ -872,22 +899,21 @@ void near animatePlayer(map_view_t *pip, player_t *player, word pn, sword scroll
                        x-=qq;
                break;
        }
-
        //modexCopyPageRegion(pip[!(pip->video->p)].page, pip[3].page, 0, 128, x-4, y-4, 28, 36);
 #ifdef SPRITE
-// #define FRAME1 PBUFSFUN(pip[1].page, x, y, 48, dire, 24, 32,        PLAYERBMPDATA);
-// #define FRAME2 PBUFSFUN(pip[1].page, x, y, 24, dire, 24, 32,        PLAYERBMPDATA);
-// #define FRAME3 PBUFSFUN(pip[1].page, x, y, 0, dire, 24, 32, PLAYERBMPDATA);
-// #define FRAME4 PBUFSFUN(pip[1].page, x, y, 24, dire, 24, 32,        PLAYERBMPDATA);
-#define FRAME1 PBUFSFUN(pip[!(pip->video->p)].page, x, y, 48, dire, 24, 32,    PLAYERBMPDATA);
-#define FRAME2 PBUFSFUN(pip[!(pip->video->p)].page, x, y, 24, dire, 24, 32,    PLAYERBMPDATA);
-#define FRAME3 PBUFSFUN(pip[!(pip->video->p)].page, x, y, 0, dire, 24, 32,     PLAYERBMPDATA);
-#define FRAME4 PBUFSFUN(pip[!(pip->video->p)].page, x, y, 24, dire, 24, 32,    PLAYERBMPDATA);
+// #define FRAME1 PBUFSFUN(pip[1].page, x, y, 32, dire, 16, 32,        PLAYERBMPDATA);
+// #define FRAME2 PBUFSFUN(pip[1].page, x, y, 16, dire, 16, 32,        PLAYERBMPDATA);
+// #define FRAME3 PBUFSFUN(pip[1].page, x, y, 0, dire, 16, 32, PLAYERBMPDATA);
+// #define FRAME4 PBUFSFUN(pip[1].page, x, y, 16, dire, 16, 32,        PLAYERBMPDATA);
+#define FRAME1 PBUFSFUN(pip[!(pip->video->p)].page, x, y, 32, dire, 16, 32,    PLAYERBMPDATA);
+#define FRAME2 PBUFSFUN(pip[!(pip->video->p)].page, x, y, 16, dire, 16, 32,    PLAYERBMPDATA);
+#define FRAME3 PBUFSFUN(pip[!(pip->video->p)].page, x, y, 0, dire, 16, 32,     PLAYERBMPDATA);
+#define FRAME4 PBUFSFUN(pip[!(pip->video->p)].page, x, y, 16, dire, 16, 32,    PLAYERBMPDATA);
 #else
-#define FRAME1 modexClearRegion(pip[!(pip->video->p)].page, x, y, 24, 32, 2+dire);
-#define FRAME2 modexClearRegion(pip[!(pip->video->p)].page, x, y, 24, 32, 1+dire);
-#define FRAME3 modexClearRegion(pip[!(pip->video->p)].page, x, y, 24, 32, dire);
-#define FRAME4 modexClearRegion(pip[!(pip->video->p)].page, x, y, 24, 32, 1+dire);
+#define FRAME1 modexClearRegion(pip[!(pip->video->p)].page, x, y, 16, 32, 2+dire);
+#define FRAME2 modexClearRegion(pip[!(pip->video->p)].page, x, y, 16, 32, 1+dire);
+#define FRAME3 modexClearRegion(pip[!(pip->video->p)].page, x, y, 16, 32, dire);
+#define FRAME4 modexClearRegion(pip[!(pip->video->p)].page, x, y, 16, 32, 1+dire);
        #endif
        if(!pageflipflop)
                modexCopyPageRegion(pip[1].page, pip[0].page, x-4, y-4, x-4, y-4, 28, 36);