X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=src%2Flib%2F16_rf.c;h=86f40456532ee01fe1185806ee259882ce1b3b16;hb=dfc654032431622dd08145496b8bb4e5e63c8776;hp=05ea5ae597463a0086b87789c56a8f8ffd276ae8;hpb=968b6bcf1d7f19f8902e1ae00f2a80ab78d399cc;p=16.git diff --git a/src/lib/16_rf.c b/src/lib/16_rf.c index 05ea5ae5..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 */ + /* ============================================================================= @@ -76,6 +79,8 @@ unsigned SX_T_SHIFT; // screen x >> ?? = tile EGA = 1, CGA = 2; #define UPDATESPARESIZE (UPDATEWIDE*2+4) #define UPDATESIZE (UPDATESCREENSIZE+2*UPDATESPARESIZE) +#define MAXSCROLLEDGES 6 + /* ============================================================================= @@ -230,7 +235,9 @@ void RFL_NewTile (unsigned updateoffset); void RFL_MaskForegroundTiles (void); void RFL_UpdateTiles (void); +void RFL_BoundScroll (int x, int y);//++++?? void RFL_CalcOriginStuff (long x, long y); +void RFL_ClearScrollBlocks (void);//++++?? void RFL_InitSpriteList (void); void RFL_InitAnimList (void); void RFL_CheckForAnimTile (unsigned x, unsigned y); @@ -338,6 +345,40 @@ void RF_Shutdown (void) } +//=========================================================================== + + +/* +===================== += += RF_FixOfs += += Sets bufferofs,displayofs, and masterofs to regular values, for the += occasions when you have moved them around manually += +===================== +*/ + +void RF_FixOfs (global_game_variables_t *gvar) +{ +// if (grmode == EGAGR) +// { + screenpage = 0; + otherpage = 1; + 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]; +/*++++ VL_SetScreen (displayofs,0); + } + else + { + bufferofs = 0; + masterofs = 0x8000; + }*/ +} + + //=========================================================================== /* @@ -364,6 +405,8 @@ void RF_NewMap (void) // // make a lookup table for the maps left edge // + if (mapheight > MAXMAPHEIGHT) + 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]; @@ -472,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!"); } } @@ -508,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]; @@ -522,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!"); } } @@ -586,10 +633,10 @@ void RFL_CheckForAnimTile (unsigned x, unsigned y) // map = mapsegs[0]+offset; tile = *map; - if (tinf[ANIM+tile]) + 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 @@ -611,10 +658,10 @@ void RFL_CheckForAnimTile (unsigned x, unsigned y) // map = mapsegs[1]+offset; tile = *map; - if (tinf[MANIM+tile]) + 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 @@ -696,6 +743,37 @@ void RFL_RemoveAnimsOnY (unsigned y) } +/* +==================== += += RFL_RemoveAnimsInBlock += +==================== +*/ + +void RFL_RemoveAnimsInBlock (unsigned x, unsigned y, unsigned width, unsigned height) +{ + animtiletype *current,*next; + + current = animhead; + while (current) + { + if (current->x - x < width && current->y - y < height) + { + *(void **)current->prevptr = current->nexttile; + if (current->nexttile) + current->nexttile->prevptr = current->prevptr; + next = current->nexttile; + current->nexttile = animfreeptr; + animfreeptr = current; + current = next; + } + else + current = current->nexttile; + } +} + + /* ==================== = @@ -766,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 @@ -837,22 +915,133 @@ 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 + */ + +} + +/* +================= += += RFL_ClearScrollBlocks += +================= +*/ + +void RFL_ClearScrollBlocks (void) +{ + gvar->video.ofs.pan.hscrollblocks = gvar->video.ofs.pan.vscrollblocks = 0; +} + + +/* +================= += += RF_SetScrollBlock += += Sets a horizontal or vertical scroll block += a horizontal block is ----, meaning it blocks up/down movement += +================= +*/ + +void RF_SetScrollBlock (int x, int y, boolean horizontal) +{ + if (horizontal) + { + 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 + { + 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"); + } } + +/* +================= += += RFL_BoundScroll += += Bound a given x/y movement to scroll blocks += +================= +*/ + +void RFL_BoundScroll (int x, int y) +{ + int check,newxtile,newytile; + + originxglobal += x; + originyglobal += y; + + newxtile= originxglobal >> G_T_SHIFT; + newytile = originyglobal >> G_T_SHIFT; + + 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; + } + } + 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; + } + } + + + 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; + } + } + 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; + } + } + + + RFL_CalcOriginStuff (originxglobal, originyglobal); +} + + //=========================================================================== /* @@ -869,6 +1058,7 @@ void RF_SetRefreshHook (void (*func) (void) ) } +//=========================================================================== /* ================= @@ -926,8 +1116,8 @@ void RFL_NewRow (int dir) ystep = 1; count = PORTTILESHIGH; break; - //default: - //Quit ("RFL_NewRow: Bad dir!"); + default: + Quit (gvar, "RFL_NewRow: Bad dir!"); } while (count--) @@ -957,7 +1147,337 @@ void RF_ForceRefresh (void) RF_Refresh (); } +//=========================================================================== + +/* +===================== += += RF_MapToMap += += Copies a block of tiles (all three planes) from one point += in the map to another, accounting for animating tiles += +===================== +*/ +/*++++ +void RF_MapToMap (unsigned srcx, unsigned srcy, + unsigned destx, unsigned desty, + unsigned width, unsigned height) +{ + int x,y; + unsigned source,destofs,xspot,yspot; + unsigned linedelta,p0,p1,p2,updatespot; + unsigned far *source0, far *source1, far *source2; + unsigned far *dest0, far *dest1, far *dest2; + boolean changed; + + RFL_RemoveAnimsInBlock (destx,desty,width,height); + + source = mapbwidthtable[srcy]/2 + srcx; + + source0 = mapsegs[0]+source; + source1 = mapsegs[1]+source; + source2 = mapsegs[2]+source; + + destofs = mapbwidthtable[desty]/2 + destx; + destofs -= source; + + linedelta = mapwidth - width; + + for (y=0;yoriginxmax) + orgx=originxmax; + + if (orgyoriginymax) + orgy=originymax; + + originxtile = orgx>>G_T_SHIFT; + originytile = orgy>>G_T_SHIFT; + + for (check=0;checkvideo.ofs.pan.vscrollblocks;check++) + { + edge = gvar->video.ofs.pan.vscrolledge[check]; + if (edge>=originxtile && edge <=originxtile+10) + { + orgx = (edge+1)*TILEGLOBAL; + break; + } + if (edge>=originxtile+11 && edge <=originxtile+20) + { + orgx = (edge-20)*TILEGLOBAL; + break; + } + } + + for (check=0;checkvideo.ofs.pan.hscrollblocks;check++) + { + edge = gvar->video.ofs.pan.hscrolledge[check]; + if (edge>=originytile && edge <=originytile+6) + { + orgy = (edge+1)*TILEGLOBAL; + break; + } + if (edge>=originytile+7 && edge <=originytile+13) + { + orgy = (edge-13)*TILEGLOBAL; + break; + } + } + + + RFL_CalcOriginStuff (orgx,orgy); +} + +//=========================================================================== + +/* +===================== += += RF_ClearBlock += += Posts erase blocks to clear a certain area of the screen to the master += screen, to erase text or something draw directly to the screen += += Parameters in pixels, but erasure is byte bounded += +===================== +*/ + +void RF_ClearBlock (int x, int y, int width, int height) +{ +// eraseblocktype block; + +#if GRMODE == EGAGR + block.screenx = x/8+originxscreen; + block.screeny = y+originyscreen; + block.width = (width+(x&7)+7)/8; + block.height = height; + memcpy (eraselistptr[0]++,&block,sizeof(block)); + memcpy (eraselistptr[1]++,&block,sizeof(block)); +#endif + +#if GRMODE == CGAGR + block.screenx = x/4+originxscreen; + block.screeny = y+originyscreen; + block.width = (width+(x&3)+3)/4; + block.height = height; + memcpy (eraselistptr[0]++,&block,sizeof(block)); +#endif + +} + +//=========================================================================== + +/* +===================== += += RF_RedrawBlock += += Causes a number of tiles to be redrawn to the master screen and updated += += Parameters in pixels, but erasure is tile bounded += +===================== +*/ + +void RF_RedrawBlock (int x, int y, int width, int height) +{ + int xx,yy,xl,xh,yl,yh; + + 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); +} + + +//=========================================================================== + +/* +===================== += += RF_CalcTics += +===================== +*/ + +void RF_CalcTics (void) +{ + long newtime;//,oldtimecount; + word TimeCount = *clockw; + +// +// calculate tics since last refresh for adaptive timing +// + if (lasttimecount > TimeCount) + TimeCount = lasttimecount; // if the game was paused a LONG time + +/*++++ if (DemoMode) // demo recording and playback needs + { // to be constant +// +// take DEMOTICS or more tics, and modify Timecount to reflect time taken +// + oldtimecount = lasttimecount; + while (TimeCountMAXTICS) + { + TimeCount -= (tics-MAXTICS); + tics = MAXTICS; + } +// } +} /* ============================================================================= @@ -969,6 +1489,39 @@ void RF_ForceRefresh (void) #if GRMODE == EGAGR +/* +===================== += += RF_FindFreeBuffer += += Finds the start of unused, non visable buffer space += +===================== +*/ + +unsigned RF_FindFreeBuffer (void) +{ + unsigned spot,i,j; + boolean ok; + + for (i=0;i<3;i++) + { + spot = screenstart[i]+SCREENSPACE; + ok = true; + for (j=0;j<3;j++) + if (spot == screenstart[j]) + { + ok = false; + break; + } + if (ok) + return spot; + } + + return 0; // never get here... +} + +//=========================================================================== /* ===================== @@ -984,7 +1537,8 @@ void RF_NewPosition (unsigned x, unsigned y) byte *page0ptr,*page1ptr; unsigned updatenum; -// + RFL_BoundNewOrigin (x,y); + // calculate new origin related globals // RFL_CalcOriginStuff (x,y); @@ -1001,6 +1555,7 @@ void RF_NewPosition (unsigned x, unsigned y) updatestart[0] = baseupdatestart[0]; updatestart[1] = baseupdatestart[1]; + updateptr = updatestart[otherpage]; page0ptr = updatestart[0]+PORTTILESWIDE; // used to stick "0"s after rows page1ptr = updatestart[1]+PORTTILESWIDE; @@ -1082,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); @@ -1127,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]; @@ -1233,10 +1788,11 @@ void RF_PlaceSprite (void **user,unsigned globalx,unsigned globaly, { spritelisttype register *sprite,*next; spritetabletype far *spr; - spritetype /*_seg*/ *block; + spritetype _seg *block; unsigned shift,pixx; + char str[80],str2[10]; - if (!spritenumber) + if (!spritenumber || spritenumber == (unsigned)-1) { RF_RemoveSprite (user); return; @@ -1276,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; @@ -1294,7 +1850,15 @@ linknewspot: // write the new info to the sprite // spr = &spritetable[spritenumber-STARTSPRITES]; - block = (spritetype /*_seg*/ *)grsegs[spritenumber]; + block = (spritetype _seg *)grsegs[spritenumber]; + + if (!block) + { + strcpy (str,"RF_PlaceSprite: Placed an uncached sprite:"); + itoa (spritenumber,str2,10); + strcat (str,str2); + Quit (str); + } globaly+=spr->orgy; globalx+=spr->orgx; @@ -1454,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); // @@ -1598,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; @@ -1646,7 +2210,6 @@ redraw: void RF_Refresh (void) { byte *newupdate; - long newtime; updateptr = updatestart[otherpage]; @@ -1678,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 @@ -1703,28 +2266,7 @@ asm mov [WORD PTR es:di],UPDATETERMINATE // // calculate tics since last refresh for adaptive timing // - if (lasttimecount > TimeCount) - lasttimecount = TimeCount; // if the game was paused a LONG time - do - { - newtime = TimeCount; - tics = newtime-lasttimecount; - } while (ticsMAXTICS) - { - TimeCount -= (tics-MAXTICS); - tics = MAXTICS; - } + RF_CalcTics (); } #endif // GRMODE == EGAGR @@ -1754,7 +2296,8 @@ void RF_NewPosition (unsigned x, unsigned y) byte *spotptr; unsigned updatenum; -// + RFL_BoundNewOrigin (x,y); + // calculate new origin related globals // RFL_CalcOriginStuff (x,y); @@ -1922,10 +2465,11 @@ void RF_PlaceSprite (void **user,unsigned globalx,unsigned globaly, { spritelisttype register *sprite,*next; spritetabletype far *spr; - spritetype /*_seg*/ *block; + spritetype _seg *block; unsigned shift,pixx; + char str[80],str2[10]; - if (!spritenumber) + if (!spritenumber || spritenumber == (unsigned)-1) { RF_RemoveSprite (user); return; @@ -1961,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; @@ -1979,7 +2523,16 @@ linknewspot: // write the new info to the sprite // spr = &spritetable[spritenumber-STARTSPRITES]; - block = (spritetype /*_seg*/ *)grsegs[spritenumber]; + block = (spritetype _seg *)grsegs[spritenumber]; + + if (!block) + { + strcpy (str,"RF_PlaceSprite: Placed an uncached sprite!"); + itoa (spritenumber,str2,10); + strcat (str,str2); + Quit (str); + } + globaly+=spr->orgy; globalx+=spr->orgx; @@ -2126,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); // @@ -2264,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) { @@ -2336,29 +2890,7 @@ void RF_Refresh (void) // // calculate tics since last refresh for adaptive timing // - if (lasttimecount > TimeCount) - lasttimecount = TimeCount; // if the game was paused a LONG time - do - { - newtime = TimeCount; - tics = newtime-lasttimecount; - } while (ticsMAXTICS) - tics = MAXTICS; - + RF_CalcTics (); } #endif // GRMODE == CGAGR