]> 4ch.mooo.com Git - 16.git/blobdiff - src/lib/16_rf.c
porting and tweaking sd more i added a cuted code file and a xxdiff friendlyer versio...
[16.git] / src / lib / 16_rf.c
index 46400385631dd51e43858d4839d72842b245e047..86f40456532ee01fe1185806ee259882ce1b3b16 100755 (executable)
@@ -35,6 +35,9 @@ updated
 #include "src/lib/16_rf.h"\r
 #pragma hdrstop\r
 \r
+struct glob_game_vars *gvar;\r
+static word far* clockw= (word far*) 0x046C; /* 18.2hz clock */\r
+\r
 /*\r
 =============================================================================\r
 \r
@@ -356,23 +359,23 @@ void RF_Shutdown (void)
 =====================\r
 */\r
 \r
-void RF_FixOfs (void)\r
+void RF_FixOfs (global_game_variables_t *gvar)\r
 {\r
-       if (grmode == EGAGR)\r
-       {\r
+//     if (grmode == EGAGR)\r
+//     {\r
                screenpage = 0;\r
                otherpage = 1;\r
-               panx = pany = pansx = pansy = panadjust = 0;\r
+               gvar->video.ofs.pan.panx = gvar->video.ofs.pan.pany = gvar->video.ofs.pan.pansx = gvar->video.ofs.pan.pansy = gvar->video.ofs.pan.panadjust = 0;\r
                displayofs = screenstart[screenpage];\r
                bufferofs = screenstart[otherpage];\r
                masterofs = screenstart[2];\r
-               VW_SetScreen (displayofs,0);\r
+/*++++         VL_SetScreen (displayofs,0);\r
        }\r
        else\r
        {\r
                bufferofs = 0;\r
                masterofs = 0x8000;\r
-       }\r
+       }*/\r
 }\r
 \r
 \r
@@ -403,7 +406,7 @@ void RF_NewMap (void)
 // make a lookup table for the maps left edge\r
 //\r
        if (mapheight > MAXMAPHEIGHT)\r
-       Quit ("RF_NewMap: Map too tall!");\r
+       Quit (gvar, "RF_NewMap: Map too tall!");\r
        spot = 0;\r
        for (i=0;i<mapheight;i++)\r
        {\r
@@ -502,7 +505,7 @@ void RF_MarkTileGraphics (void)
                                // new chain of animating tiles\r
 \r
                                if (i>=MAXANIMTYPES)\r
-                                       Quit ("RF_MarkTileGraphics: Too many unique animated tiles!");\r
+                                       Quit (gvar, "RF_MarkTileGraphics: Too many unique animated tiles!");\r
                                allanims[i].current = tile;\r
                                allanims[i].count = tinf[SPEED+tile];\r
 \r
@@ -516,7 +519,7 @@ void RF_MarkTileGraphics (void)
                                        CA_MarkGrChunk(STARTTILE16+next);\r
                                        next += (signed char)(tinf[ANIM+next]);\r
                                        if (++anims > 20)\r
-                                               Quit ("MarkTileGraphics: Unending animation!");\r
+                                               Quit (gvar, "MarkTileGraphics: Unending animation!");\r
                                }\r
 \r
                        }\r
@@ -552,7 +555,7 @@ nextback:
                                // new chain of animating tiles\r
 \r
                                if (i>=MAXANIMTYPES)\r
-                                       Quit ("RF_MarkTileGraphics: Too many unique animated tiles!");\r
+                                       Quit (gvar, "RF_MarkTileGraphics: Too many unique animated tiles!");\r
                                allanims[i].current = tilehigh;\r
                                allanims[i].count = tinf[MSPEED+tile];\r
 \r
@@ -566,7 +569,7 @@ nextback:
                                        CA_MarkGrChunk(STARTTILE16M+next);\r
                                        next += (signed char)(tinf[MANIM+next]);\r
                                        if (++anims > 20)\r
-                                               Quit ("MarkTileGraphics: Unending animation!");\r
+                                               Quit (gvar, "MarkTileGraphics: Unending animation!");\r
                                }\r
 \r
                        }\r
@@ -633,7 +636,7 @@ void RFL_CheckForAnimTile (unsigned x, unsigned y)
        if (tinf[ANIM+tile] && tinf[SPEED+tile])\r
        {\r
                if (!animfreeptr)\r
-                       Quit ("RF_CheckForAnimTile: No free spots in tilearray!");\r
+                       Quit (gvar, "RF_CheckForAnimTile: No free spots in tilearray!");\r
                anim = animfreeptr;\r
                animfreeptr = animfreeptr->nexttile;\r
                next = animhead;                                // stick it at the start of the list\r
@@ -658,7 +661,7 @@ void RFL_CheckForAnimTile (unsigned x, unsigned y)
        if (tinf[MANIM+tile] && tinf[MSPEED+tile])\r
        {\r
                if (!animfreeptr)\r
-                       Quit ("RF_CheckForAnimTile: No free spots in tilearray!");\r
+                       Quit (gvar, "RF_CheckForAnimTile: No free spots in tilearray!");\r
                anim = animfreeptr;\r
                animfreeptr = animfreeptr->nexttile;\r
                next = animhead;                                // stick it at the start of the list\r
@@ -841,7 +844,7 @@ void RFL_AnimateTiles (void)
                        y = current->y-originytile;\r
 \r
                        if (x>=PORTTILESWIDE || y>=PORTTILESHIGH)\r
-                               Quit ("RFL_AnimateTiles: Out of bounds!");\r
+                               Quit (gvar, "RFL_AnimateTiles: Out of bounds!");\r
 \r
                        updateofs = uwidthtable[y] + x;\r
                        RFL_NewTile(updateofs);                         // puts "1"s in both pages\r
@@ -912,19 +915,21 @@ void RFL_CalcOriginStuff (long x, long y)
        originyscreen = originytile<<SY_T_SHIFT;\r
        originmap = mapbwidthtable[originytile] + originxtile*2;\r
 \r
-#if GRMODE == EGAGR\r
-       panx = (originxglobal>>G_P_SHIFT) & 15;\r
-       pansx = panx & 8;\r
-       pany = pansy = (originyglobal>>G_P_SHIFT) & 15;\r
-       panadjust = panx/8 + ylookup[pany];\r
-#endif\r
+//#if GRMODE == EGAGR\r
+       gvar->video.ofs.pan.panx = (originxglobal>>G_P_SHIFT) & 15;\r
+       gvar->video.ofs.pan.pansx = gvar->video.ofs.pan.panx & 8;\r
+       gvar->video.ofs.pan.pany = gvar->video.ofs.pan.pansy = (originyglobal>>G_P_SHIFT) & 15;\r
+//     gvar->video.ofs.pan.panadjust = gvar->video.ofs.pan.panx/8 + gvar->video.ofs.ylookup[gvar->video.ofs.pan.pany];\r
+       gvar->video.ofs.pan.panadjust = gvar->video.ofs.pan.panx/8 + (gvar->video.ofs.pan.pany*gvar->video.page[0].stridew);\r
+/*#endif\r
 \r
 #if GRMODE == CGAGR\r
-       panx = (originxglobal>>G_P_SHIFT) & 15;\r
-       pansx = panx & 12;\r
-       pany = pansy = (originyglobal>>G_P_SHIFT) & 15;\r
-       panadjust = pansx/4 + ylookup[pansy];\r
+       gvar->video.ofs.pan.panx = (originxglobal>>G_P_SHIFT) & 15;\r
+       gvar->video.ofs.pan.pansx = gvar->video.ofs.pan.panx & 12;\r
+       gvar->video.ofs.pan.pany = gvar->video.ofs.pan.pansy = (originyglobal>>G_P_SHIFT) & 15;\r
+       gvar->video.ofs.pan.panadjust = gvar->video.ofs.pan.pansx/4 + gvar->video.ofs.ylookup[gvar->video.ofs.pan.pansy];\r
 #endif\r
+       */\r
 \r
 }\r
 \r
@@ -939,7 +944,7 @@ void RFL_CalcOriginStuff (long x, long y)
 \r
 void RFL_ClearScrollBlocks (void)\r
 {\r
-       hscrollblocks = vscrollblocks = 0;\r
+       gvar->video.ofs.pan.hscrollblocks = gvar->video.ofs.pan.vscrollblocks = 0;\r
 }\r
 \r
 \r
@@ -958,15 +963,15 @@ void RF_SetScrollBlock (int x, int y, boolean horizontal)
 {\r
        if (horizontal)\r
        {\r
-               hscrolledge[hscrollblocks] = y;\r
-               if (hscrollblocks++ == MAXSCROLLEDGES)\r
-                       Quit ("RF_SetScrollBlock: Too many horizontal scroll blocks");\r
+               gvar->video.ofs.pan.hscrolledge[gvar->video.ofs.pan.hscrollblocks] = y;\r
+               if (gvar->video.ofs.pan.hscrollblocks++ == MAXSCROLLEDGES)\r
+                       Quit (gvar, "RF_SetScrollBlock: Too many horizontal scroll blocks");\r
        }\r
        else\r
        {\r
-               vscrolledge[vscrollblocks] = x;\r
-               if (vscrollblocks++ == MAXSCROLLEDGES)\r
-                       Quit ("RF_SetScrollBlock: Too many vertical scroll blocks");\r
+               gvar->video.ofs.pan.vscrolledge[gvar->video.ofs.pan.vscrollblocks] = x;\r
+               if (gvar->video.ofs.pan.vscrollblocks++ == MAXSCROLLEDGES)\r
+                       Quit (gvar, "RF_SetScrollBlock: Too many vertical scroll blocks");\r
        }\r
 }\r
 \r
@@ -994,8 +999,8 @@ void RFL_BoundScroll (int x, int y)
        if (x>0)\r
        {\r
                newxtile+=SCREENTILESWIDE;\r
-               for (check=0;check<vscrollblocks;check++)\r
-                       if (vscrolledge[check] == newxtile)\r
+               for (check=0;check<gvar->video.ofs.pan.vscrollblocks;check++)\r
+                       if (gvar->video.ofs.pan.vscrolledge[check] == newxtile)\r
                        {\r
                                originxglobal = originxglobal&0xff00;\r
                                break;\r
@@ -1003,8 +1008,8 @@ void RFL_BoundScroll (int x, int y)
        }\r
        else if (x<0)\r
        {\r
-               for (check=0;check<vscrollblocks;check++)\r
-                       if (vscrolledge[check] == newxtile)\r
+               for (check=0;check<gvar->video.ofs.pan.vscrollblocks;check++)\r
+                       if (gvar->video.ofs.pan.vscrolledge[check] == newxtile)\r
                        {\r
                                originxglobal = (originxglobal&0xff00)+0x100;\r
                                break;\r
@@ -1015,8 +1020,8 @@ void RFL_BoundScroll (int x, int y)
        if (y>0)\r
        {\r
                newytile+=SCREENTILESHIGH;\r
-               for (check=0;check<hscrollblocks;check++)\r
-                       if (hscrolledge[check] == newytile)\r
+               for (check=0;check<gvar->video.ofs.pan.hscrollblocks;check++)\r
+                       if (gvar->video.ofs.pan.hscrolledge[check] == newytile)\r
                        {\r
                                originyglobal = originyglobal&0xff00;\r
                                break;\r
@@ -1024,8 +1029,8 @@ void RFL_BoundScroll (int x, int y)
        }\r
        else if (y<0)\r
        {\r
-               for (check=0;check<hscrollblocks;check++)\r
-                       if (hscrolledge[check] == newytile)\r
+               for (check=0;check<gvar->video.ofs.pan.hscrollblocks;check++)\r
+                       if (gvar->video.ofs.pan.hscrolledge[check] == newytile)\r
                        {\r
                                originyglobal = (originyglobal&0xff00)+0x100;\r
                                break;\r
@@ -1112,7 +1117,7 @@ void      RFL_NewRow (int dir)
                count = PORTTILESHIGH;\r
                break;\r
        default:\r
-               Quit ("RFL_NewRow: Bad dir!");\r
+               Quit (gvar, "RFL_NewRow: Bad dir!");\r
        }\r
 \r
        while (count--)\r
@@ -1154,7 +1159,7 @@ void RF_ForceRefresh (void)
 =\r
 =====================\r
 */\r
-\r
+/*++++\r
 void RF_MapToMap (unsigned srcx, unsigned srcy,\r
                                  unsigned destx, unsigned desty,\r
                                  unsigned width, unsigned height)\r
@@ -1219,7 +1224,7 @@ void RF_MapToMap (unsigned srcx, unsigned srcy,
                        }\r
                }\r
 }\r
-\r
+*/\r
 //===========================================================================\r
 \r
 \r
@@ -1233,7 +1238,7 @@ void RF_MapToMap (unsigned srcx, unsigned srcy,
 =\r
 =====================\r
 */\r
-\r
+/*++++\r
 void RF_MemToMap (unsigned far *source, unsigned plane,\r
                                  unsigned destx, unsigned desty,\r
                                  unsigned width, unsigned height)\r
@@ -1276,7 +1281,7 @@ void RF_MemToMap (unsigned far *source, unsigned plane,
                                RFL_CheckForAnimTile (destx+x,desty+y);\r
                        }\r
                }\r
-}\r
+}*/\r
 \r
 //===========================================================================\r
 \r
@@ -1312,9 +1317,9 @@ void RFL_BoundNewOrigin (unsigned orgx,unsigned orgy)
        originxtile = orgx>>G_T_SHIFT;\r
        originytile = orgy>>G_T_SHIFT;\r
 \r
-       for (check=0;check<vscrollblocks;check++)\r
+       for (check=0;check<gvar->video.ofs.pan.vscrollblocks;check++)\r
        {\r
-               edge = vscrolledge[check];\r
+               edge = gvar->video.ofs.pan.vscrolledge[check];\r
                if (edge>=originxtile && edge <=originxtile+10)\r
                {\r
                        orgx = (edge+1)*TILEGLOBAL;\r
@@ -1327,9 +1332,9 @@ void RFL_BoundNewOrigin (unsigned orgx,unsigned orgy)
                }\r
        }\r
 \r
-       for (check=0;check<hscrollblocks;check++)\r
+       for (check=0;check<gvar->video.ofs.pan.hscrollblocks;check++)\r
        {\r
-               edge = hscrolledge[check];\r
+               edge = gvar->video.ofs.pan.hscrolledge[check];\r
                if (edge>=originytile && edge <=originytile+6)\r
                {\r
                        orgy = (edge+1)*TILEGLOBAL;\r
@@ -1364,7 +1369,7 @@ void RFL_BoundNewOrigin (unsigned orgx,unsigned orgy)
 \r
 void RF_ClearBlock (int        x, int y, int width, int height)\r
 {\r
-       eraseblocktype block;\r
+//     eraseblocktype block;\r
 \r
 #if GRMODE == EGAGR\r
        block.screenx = x/8+originxscreen;\r
@@ -1403,10 +1408,10 @@ void RF_RedrawBlock (int x, int y, int width, int height)
 {\r
        int     xx,yy,xl,xh,yl,yh;\r
 \r
-       xl=(x+panx)/16;\r
-       xh=(x+panx+width+15)/16;\r
-       yl=(y+pany)/16;\r
-       yh=(y+pany+height+15)/16;\r
+       xl=(x+gvar->video.ofs.pan.panx)/16;\r
+       xh=(x+gvar->video.ofs.pan.panx+width+15)/16;\r
+       yl=(y+gvar->video.ofs.pan.pany)/16;\r
+       yh=(y+gvar->video.ofs.pan.pany+height+15)/16;\r
        for (yy=yl;yy<=yh;yy++)\r
                for (xx=xl;xx<=xh;xx++)\r
                        RFL_NewTile (yy*UPDATEWIDE+xx);\r
@@ -1425,7 +1430,8 @@ void RF_RedrawBlock (int x, int y, int width, int height)
 \r
 void RF_CalcTics (void)\r
 {\r
-       long    newtime,oldtimecount;\r
+       long    newtime;//,oldtimecount;\r
+       word TimeCount = *clockw;\r
 \r
 //\r
 // calculate tics since last refresh for adaptive timing\r
@@ -1433,7 +1439,7 @@ void RF_CalcTics (void)
        if (lasttimecount > TimeCount)\r
                TimeCount = lasttimecount;              // if the game was paused a LONG time\r
 \r
-       if (DemoMode)                                   // demo recording and playback needs\r
+/*++++ if (DemoMode)                                   // demo recording and playback needs\r
        {                                                               // to be constant\r
 //\r
 // take DEMOTICS or more tics, and modify Timecount to reflect time taken\r
@@ -1446,7 +1452,7 @@ void RF_CalcTics (void)
                tics = DEMOTICS;\r
        }\r
        else\r
-       {\r
+       {*/\r
 //\r
 // non demo, so report actual time\r
 //\r
@@ -1470,7 +1476,7 @@ void RF_CalcTics (void)
                        TimeCount -= (tics-MAXTICS);\r
                        tics = MAXTICS;\r
                }\r
-       }\r
+//     }\r
 }\r
 \r
 /*\r
@@ -1532,10 +1538,10 @@ void RF_NewPosition (unsigned x, unsigned y)
        unsigned        updatenum;\r
 \r
        RFL_BoundNewOrigin (x,y);\r
-/*??\r
+\r
 // calculate new origin related globals\r
 //\r
-       RFL_CalcOriginStuff (x,y);*/\r
+       RFL_CalcOriginStuff (x,y);\r
 \r
 //\r
 // clear out all animating tiles\r
@@ -1545,7 +1551,7 @@ void RF_NewPosition (unsigned x, unsigned y)
 //\r
 // set up the new update arrays at base position\r
 //\r
-//??   memset (tilecache,0,sizeof(tilecache));         // old cache is invalid\r
+       memset (tilecache,0,sizeof(tilecache));         // old cache is invalid\r
 \r
        updatestart[0] = baseupdatestart[0];\r
        updatestart[1] = baseupdatestart[1];\r
@@ -1631,14 +1637,14 @@ void RF_Scroll (int x, int y)
        int                     oldxt,oldyt,move,yy;\r
        unsigned        updatespot;\r
        byte            *update0,*update1;\r
-       unsigned        oldpanx,oldpanadjust,oldoriginmap,oldscreen,newscreen,screencopy;\r
+       unsigned        oldgvar->video.ofs.pan.panx,oldgvar->video.ofs.pan.panadjust,oldoriginmap,oldscreen,newscreen,screencopy;\r
        int                     screenmove;\r
 \r
        oldxt = originxtile;\r
        oldyt = originytile;\r
        oldoriginmap = originmap;\r
-       oldpanadjust = panadjust;\r
-       oldpanx = panx;\r
+       oldgvar->video.ofs.pan.panadjust = gvar->video.ofs.pan.panadjust;\r
+       oldgvar->video.ofs.pan.panx = gvar->video.ofs.pan.panx;\r
 \r
        RFL_CalcOriginStuff ((long)originxglobal + x,(long)originyglobal + y);\r
 \r
@@ -1676,11 +1682,11 @@ void RF_Scroll (int x, int y)
                        oldscreen = screenstart[i] - screenmove;\r
                        newscreen = oldscreen + screencopy;\r
                        screenstart[i] = newscreen + screenmove;\r
-                       VW_ScreenToScreen (oldscreen,newscreen,\r
+//++++                 VW_ScreenToScreen (oldscreen,newscreen,\r
                                PORTTILESWIDE*2,PORTTILESHIGH*16);\r
 \r
-                       if (i==screenpage)\r
-                               VW_SetScreen(newscreen+oldpanadjust,oldpanx & xpanmask);\r
+//++++                 if (i==screenpage)\r
+//++++                         VL_SetScreen(newscreen+oldgvar->video.ofs.pan.panadjust,oldgvar->video.ofs.pan.panx & xpanmask);\r
                }\r
        }\r
        bufferofs = screenstart[otherpage];\r
@@ -1826,7 +1832,7 @@ void RF_PlaceSprite (void **user,unsigned globalx,unsigned globaly,
        // this is a brand new sprite, so allocate a block from the array\r
 \r
                if (!spritefreeptr)\r
-                       Quit ("RF_PlaceSprite: No free spots in spritearray!");\r
+                       Quit (gvar, "RF_PlaceSprite: No free spots in spritearray!");\r
 \r
                sprite = spritefreeptr;\r
                spritefreeptr = spritefreeptr->nextsprite;\r
@@ -2012,8 +2018,8 @@ void RFL_EraseBlocks (void)
        //\r
        // erase the block by copying from the master screen\r
        //\r
-               pos = ylookup[block->screeny]+block->screenx;\r
-               VW_ScreenToScreen (masterofs+pos,bufferofs+pos,\r
+               pos = gvar->video.ofs.ylookup[block->screeny]+block->screenx;\r
+//++++         VW_ScreenToScreen (masterofs+pos,bufferofs+pos,\r
                        block->width,block->height);\r
 \r
        //\r
@@ -2156,12 +2162,12 @@ redraw:
                                height = PORTSCREENHIGH - porty;    // clip bottom off\r
                        }\r
 \r
-                       dest = bufferofs + ylookup[porty] + portx;\r
+                       dest = bufferofs + gvar->video.ofs.ylookup[porty] + portx;\r
 \r
                        switch (sprite->draw)\r
                        {\r
                        case spritedraw:\r
-                               VW_MaskBlock(grsegs[sprite->grseg], sourceofs,\r
+//++++                         VW_MaskBlock(grsegs[sprite->grseg], sourceofs,\r
                                        dest,sprite->width,height,sprite->planesize);\r
                                break;\r
 \r
@@ -2235,7 +2241,7 @@ void RF_Refresh (void)
 //\r
 // display the changed screen\r
 //\r
-       VW_SetScreen(bufferofs+panadjust,panx & xpanmask);\r
+       VL_SetScreen(bufferofs+gvar->video.ofs.pan.panadjust,gvar->video.ofs.pan.panx & xpanmask);\r
 \r
 //\r
 // prepare for next refresh\r
@@ -2291,10 +2297,10 @@ void RF_NewPosition (unsigned x, unsigned y)
        unsigned        updatenum;\r
 \r
        RFL_BoundNewOrigin (x,y);\r
-/*??\r
+\r
 // calculate new origin related globals\r
 //\r
-       RFL_CalcOriginStuff (x,y);*/\r
+       RFL_CalcOriginStuff (x,y);\r
 \r
 //\r
 // clear out all animating tiles\r
@@ -2499,7 +2505,7 @@ void RF_PlaceSprite (void **user,unsigned globalx,unsigned globaly,
        // this is a brand new sprite, so allocate a block from the array\r
 \r
                if (!spritefreeptr)\r
-                       Quit ("RF_PlaceSprite: No free spots in spritearray!");\r
+                       Quit (gvar, "RF_PlaceSprite: No free spots in spritearray!");\r
 \r
                sprite = spritefreeptr;\r
                spritefreeptr = spritefreeptr->nextsprite;\r
@@ -2673,10 +2679,11 @@ void RFL_EraseBlocks (void)
        //\r
        // erase the block by copying from the master screen\r
        //\r
-               pos = ylookup[block->screeny]+block->screenx;\r
+//----         pos = gvar->video.ofs.ylookup[block->screeny]+block->screenx;\r
+               pos = (block->screeny*gvar->video.page[0].stridew)+block->screenx;\r
                block->width = (block->width + (pos&1) + 1)& ~1;\r
                pos &= ~1;                              // make sure a word copy gets used\r
-               VW_ScreenToScreen (masterofs+pos,bufferofs+pos,\r
+//++++         VW_ScreenToScreen (masterofs+pos,bufferofs+pos,\r
                        block->width,block->height);\r
 \r
        //\r
@@ -2811,7 +2818,7 @@ redraw:
                                height = PORTSCREENHIGH - porty;    // clip bottom off\r
                        }\r
 \r
-                       dest = bufferofs + ylookup[porty] + portx;\r
+                       dest = bufferofs + gvar->video.ofs.ylookup[porty] + portx;\r
 \r
                        switch (sprite->draw)\r
                        {\r