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