kd_play.c: RF_Refresh();\r
kd_play.c: RF_SetRefreshHook (&FadeAndUnhook);\r
kd_play.c: RF_NewPosition (orgx,orgy);\r
+-------------------------------------------------------------------------------
+ ./qcata.sh start
+-------------------------------------------------------------------------------
+==== 16/Catacomb3D ====
+16/Catacomb3D/C3_MAIN.C:void RF_FixOfs (void)\r
+16/Catacomb3D/ID_RF.C:// RF_Startup\r
+16/Catacomb3D/ID_RF.C:= RF_Startup\r
+16/Catacomb3D/ID_RF.C:void RF_Startup (void)\r
+16/Catacomb3D/ID_RF.C:= RF_Shutdown\r
+16/Catacomb3D/ID_RF.C:void RF_Shutdown (void)\r
+16/Catacomb3D/ID_RF.C:= RF_FixOfs\r
+16/Catacomb3D/ID_RF.C:void RF_FixOfs (void)\r
+16/Catacomb3D/ID_RF.C:= RF_NewMap\r
+16/Catacomb3D/ID_RF.C:void RF_NewMap (void)\r
+16/Catacomb3D/ID_RF.C: Quit ("RF_NewMap: Map too tall!");\r
+16/Catacomb3D/ID_RF.C: RF_SetScrollBlock (0,MAPBORDER-1,true);\r
+16/Catacomb3D/ID_RF.C: RF_SetScrollBlock (0,mapheight-MAPBORDER,true);\r
+16/Catacomb3D/ID_RF.C: RF_SetScrollBlock (MAPBORDER-1,0,false);\r
+16/Catacomb3D/ID_RF.C: RF_SetScrollBlock (mapwidth-MAPBORDER,0,false);\r
+16/Catacomb3D/ID_RF.C:= RF_MarkTileGraphics\r
+16/Catacomb3D/ID_RF.C:void RF_MarkTileGraphics (void)\r
+16/Catacomb3D/ID_RF.C: strcpy (str,"RF_MarkTileGraphics: Background anim of 0:");\r
+16/Catacomb3D/ID_RF.C: Quit ("RF_MarkTileGraphics: Too many unique animated tiles!");\r
+16/Catacomb3D/ID_RF.C: strcpy (str,"RF_MarkTileGraphics: Unending background animation:");\r
+16/Catacomb3D/ID_RF.C: strcpy (str,"RF_MarkTileGraphics: Foreground anim of 0:");\r
+16/Catacomb3D/ID_RF.C: Quit ("RF_MarkTileGraphics: Too many unique animated tiles!");\r
+16/Catacomb3D/ID_RF.C: strcpy (str,"RF_MarkTileGraphics: Unending foreground animation:");\r
+16/Catacomb3D/ID_RF.C: Quit ("RF_CheckForAnimTile: No free spots in tilearray!");\r
+16/Catacomb3D/ID_RF.C: Quit ("RF_CheckForAnimTile: No free spots in tilearray!");\r
+16/Catacomb3D/ID_RF.C:= RF_SetScrollBlock\r
+16/Catacomb3D/ID_RF.C:void RF_SetScrollBlock (int x, int y, boolean horizontal)\r
+16/Catacomb3D/ID_RF.C: Quit ("RF_SetScrollBlock: Too many horizontal scroll blocks");\r
+16/Catacomb3D/ID_RF.C: Quit ("RF_SetScrollBlock: Too many vertical scroll blocks");\r
+16/Catacomb3D/ID_RF.C:= RF_SetRefreshHook\r
+16/Catacomb3D/ID_RF.C:void RF_SetRefreshHook (void (*func) (void) )\r
+16/Catacomb3D/ID_RF.C:= RF_ForceRefresh\r
+16/Catacomb3D/ID_RF.C:void RF_ForceRefresh (void)\r
+16/Catacomb3D/ID_RF.C: RF_NewPosition (originxglobal,originyglobal);\r
+16/Catacomb3D/ID_RF.C: RF_Refresh ();\r
+16/Catacomb3D/ID_RF.C: RF_Refresh ();\r
+16/Catacomb3D/ID_RF.C:= RF_MapToMap\r
+16/Catacomb3D/ID_RF.C:void RF_MapToMap (unsigned srcx, unsigned srcy,\r
+16/Catacomb3D/ID_RF.C:= RF_MemToMap\r
+16/Catacomb3D/ID_RF.C:void RF_MemToMap (unsigned far *source, unsigned plane,\r
+16/Catacomb3D/ID_RF.C:= RF_ClearBlock\r
+16/Catacomb3D/ID_RF.C:void RF_ClearBlock (int x, int y, int width, int height)\r
+16/Catacomb3D/ID_RF.C:= RF_RedrawBlock\r
+16/Catacomb3D/ID_RF.C:void RF_RedrawBlock (int x, int y, int width, int height)\r
+16/Catacomb3D/ID_RF.C:= RF_CalcTics\r
+16/Catacomb3D/ID_RF.C:void RF_CalcTics (void)\r
+16/Catacomb3D/ID_RF.C:= RF_FindFreeBuffer\r
+16/Catacomb3D/ID_RF.C:unsigned RF_FindFreeBuffer (void)\r
+16/Catacomb3D/ID_RF.C:= RF_NewPosition EGA\r
+16/Catacomb3D/ID_RF.C:void RF_NewPosition (unsigned x, unsigned y)\r
+16/Catacomb3D/ID_RF.C:= RF_Scroll EGA\r
+16/Catacomb3D/ID_RF.C:void RF_Scroll (int x, int y)\r
+16/Catacomb3D/ID_RF.C: RF_NewPosition(originxglobal,originyglobal);\r
+16/Catacomb3D/ID_RF.C:= RF_PlaceSprite EGA\r
+16/Catacomb3D/ID_RF.C:void RF_PlaceSprite (void **user,unsigned globalx,unsigned globaly,\r
+16/Catacomb3D/ID_RF.C: RF_RemoveSprite (user);\r
+16/Catacomb3D/ID_RF.C: Quit ("RF_PlaceSprite: No free spots in spritearray!");\r
+16/Catacomb3D/ID_RF.C: strcpy (str,"RF_PlaceSprite: Placed an uncached sprite:");\r
+16/Catacomb3D/ID_RF.C:= RF_RemoveSprite EGA\r
+16/Catacomb3D/ID_RF.C:void RF_RemoveSprite (void **user)\r
+16/Catacomb3D/ID_RF.C:= RF_Refresh EGA\r
+16/Catacomb3D/ID_RF.C:void RF_Refresh (void)\r
+16/Catacomb3D/ID_RF.C: RF_CalcTics ();\r
+16/Catacomb3D/ID_RF.C:= RF_NewPosition CGA\r
+16/Catacomb3D/ID_RF.C:void RF_NewPosition (unsigned x, unsigned y)\r
+16/Catacomb3D/ID_RF.C:= RF_Scroll CGA\r
+16/Catacomb3D/ID_RF.C:void RF_Scroll (int x, int y)\r
+16/Catacomb3D/ID_RF.C: RF_NewPosition(originxglobal,originyglobal);\r
+16/Catacomb3D/ID_RF.C:= RF_PlaceSprite CGA\r
+16/Catacomb3D/ID_RF.C:void RF_PlaceSprite (void **user,unsigned globalx,unsigned globaly,\r
+16/Catacomb3D/ID_RF.C: RF_RemoveSprite (user);\r
+16/Catacomb3D/ID_RF.C: Quit ("RF_PlaceSprite: No free spots in spritearray!");\r
+16/Catacomb3D/ID_RF.C: strcpy (str,"RF_PlaceSprite: Placed an uncached sprite!");\r
+16/Catacomb3D/ID_RF.C:= RF_RemoveSprite CGA\r
+16/Catacomb3D/ID_RF.C:void RF_RemoveSprite (void **user)\r
+16/Catacomb3D/ID_RF.C:= RF_Refresh CGA\r
+16/Catacomb3D/ID_RF.C:void RF_Refresh (void)\r
+16/Catacomb3D/ID_US_2.C: RF_FixOfs();\r
+16/Catacomb3D/ID_RF.H:#define __ID_RF__\r
+16/Catacomb3D/ID_RF.H:void RF_Startup (void);\r
+16/Catacomb3D/ID_RF.H:void RF_Shutdown (void);\r
+16/Catacomb3D/ID_RF.H:void RF_FixOfs (void);\r
+16/Catacomb3D/ID_RF.H:void RF_NewMap (void);\r
+16/Catacomb3D/ID_RF.H:void RF_MarkTileGraphics (void);\r
+16/Catacomb3D/ID_RF.H:void RF_SetScrollBlock (int x, int y, boolean horizontal);\r
+16/Catacomb3D/ID_RF.H:void RF_NewPosition (unsigned x, unsigned y);\r
+16/Catacomb3D/ID_RF.H:void RF_Scroll (int x, int y);\r
+16/Catacomb3D/ID_RF.H:void RF_MapToMap (unsigned srcx, unsigned srcy,\r
+16/Catacomb3D/ID_RF.H:void RF_MemToMap (unsigned far *source, unsigned plane,\r
+16/Catacomb3D/ID_RF.H:void RF_ClearBlock (int x, int y, int width, int height);\r
+16/Catacomb3D/ID_RF.H:void RF_RedrawBlock (int x, int y, int width, int height);\r
+16/Catacomb3D/ID_RF.H:void RF_PlaceSprite (void **user,unsigned globalx,unsigned globaly,\r
+16/Catacomb3D/ID_RF.H:void RF_RemoveSprite (void **user);\r
+16/Catacomb3D/ID_RF.H:void RF_CalcTics (void);\r
+16/Catacomb3D/ID_RF.H:void RF_Refresh (void);\r
+16/Catacomb3D/ID_RF.H:void RF_ForceRefresh (void);\r
+16/Catacomb3D/ID_RF.H:void RF_SetRefreshHook (void (*func) (void) );\r
+16/Catacomb3D/ID_RF.H:unsigned RF_FindFreeBuffer (void);\r
+==== 16/CatacombApocalypse ====
+16/CatacombApocalypse/C6_MAIN.C:void RF_FixOfs (void)\r
+16/CatacombApocalypse/GELIB.C: RF_RemoveSprite(&CurBOBShape->sprite);\r
+16/CatacombApocalypse/GELIB.C: RF_RemoveSprite (&CurBOBShape->sprite);\r
+16/CatacombApocalypse/GELIB.C: RF_PlaceSprite(&Shape->sprite,obj->x+Shape->x_offset,obj->y+Shape->y_offset, Shape->shapenum, spritedraw,Shape->priority,Shape->sprflags);\r
+16/CatacombApocalypse/GELIB.C: RF_NewPosition(0,0);\r
+16/CatacombApocalypse/GELIB.C: RF_Refresh();\r
+16/CatacombApocalypse/GELIB.C: RF_ForceRefresh();\r
+16/CatacombApocalypse/GELIB.C: RF_ForceRefresh();\r
+16/CatacombApocalypse/GELIB.C: RF_Refresh();\r
+16/CatacombApocalypse/ID_RF.C:// RF_Startup\r
+16/CatacombApocalypse/ID_RF.C:= RF_Startup\r
+16/CatacombApocalypse/ID_RF.C:void RF_Startup (void)\r
+16/CatacombApocalypse/ID_RF.C:= RF_Shutdown\r
+16/CatacombApocalypse/ID_RF.C:void RF_Shutdown (void)\r
+16/CatacombApocalypse/ID_RF.C:= RF_FixOfs\r
+16/CatacombApocalypse/ID_RF.C:void RF_FixOfs (void)\r
+16/CatacombApocalypse/ID_RF.C:= RF_NewMap\r
+16/CatacombApocalypse/ID_RF.C:void RF_NewMap (void)\r
+16/CatacombApocalypse/ID_RF.C: Quit ("RF_NewMap: Map too tall!");\r
+16/CatacombApocalypse/ID_RF.C: RF_SetScrollBlock (0,MAPBORDER-1,true);\r
+16/CatacombApocalypse/ID_RF.C: RF_SetScrollBlock (0,mapheight-MAPBORDER,true);\r
+16/CatacombApocalypse/ID_RF.C: RF_SetScrollBlock (MAPBORDER-1,0,false);\r
+16/CatacombApocalypse/ID_RF.C: RF_SetScrollBlock (mapwidth-MAPBORDER,0,false);\r
+16/CatacombApocalypse/ID_RF.C:= RF_MarkTileGraphics\r
+16/CatacombApocalypse/ID_RF.C:void RF_MarkTileGraphics (void)\r
+16/CatacombApocalypse/ID_RF.C: strcpy (str,"RF_MarkTileGraphics: Background anim of 0:");\r
+16/CatacombApocalypse/ID_RF.C: Quit ("RF_MarkTileGraphics: Too many unique animated tiles!");\r
+16/CatacombApocalypse/ID_RF.C: strcpy (str,"RF_MarkTileGraphics: Unending background animation:");\r
+16/CatacombApocalypse/ID_RF.C: strcpy (str,"RF_MarkTileGraphics: Foreground anim of 0:");\r
+16/CatacombApocalypse/ID_RF.C: Quit ("RF_MarkTileGraphics: Too many unique animated tiles!");\r
+16/CatacombApocalypse/ID_RF.C: strcpy (str,"RF_MarkTileGraphics: Unending foreground animation:");\r
+16/CatacombApocalypse/ID_RF.C: Quit ("RF_CheckForAnimTile: No free spots in tilearray!");\r
+16/CatacombApocalypse/ID_RF.C: Quit ("RF_CheckForAnimTile: No free spots in tilearray!");\r
+16/CatacombApocalypse/ID_RF.C:= RF_SetScrollBlock\r
+16/CatacombApocalypse/ID_RF.C:void RF_SetScrollBlock (int x, int y, boolean horizontal)\r
+16/CatacombApocalypse/ID_RF.C: Quit ("RF_SetScrollBlock: Too many horizontal scroll blocks");\r
+16/CatacombApocalypse/ID_RF.C: Quit ("RF_SetScrollBlock: Too many vertical scroll blocks");\r
+16/CatacombApocalypse/ID_RF.C:= RF_SetRefreshHook\r
+16/CatacombApocalypse/ID_RF.C:void RF_SetRefreshHook (void (*func) (void) )\r
+16/CatacombApocalypse/ID_RF.C:= RF_ForceRefresh\r
+16/CatacombApocalypse/ID_RF.C:void RF_ForceRefresh (void)\r
+16/CatacombApocalypse/ID_RF.C: RF_NewPosition (originxglobal,originyglobal);\r
+16/CatacombApocalypse/ID_RF.C: RF_Refresh ();\r
+16/CatacombApocalypse/ID_RF.C: RF_Refresh ();\r
+16/CatacombApocalypse/ID_RF.C:= RF_MapToMap\r
+16/CatacombApocalypse/ID_RF.C:void RF_MapToMap (unsigned srcx, unsigned srcy,\r
+16/CatacombApocalypse/ID_RF.C:= RF_MemToMap\r
+16/CatacombApocalypse/ID_RF.C:void RF_MemToMap (unsigned far *source, unsigned plane,\r
+16/CatacombApocalypse/ID_RF.C:= RF_ClearBlock\r
+16/CatacombApocalypse/ID_RF.C:void RF_ClearBlock (int x, int y, int width, int height)\r
+16/CatacombApocalypse/ID_RF.C:= RF_RedrawBlock\r
+16/CatacombApocalypse/ID_RF.C:void RF_RedrawBlock (int x, int y, int width, int height)\r
+16/CatacombApocalypse/ID_RF.C:= RF_CalcTics\r
+16/CatacombApocalypse/ID_RF.C:void RF_CalcTics (void)\r
+16/CatacombApocalypse/ID_RF.C:= RF_FindFreeBuffer\r
+16/CatacombApocalypse/ID_RF.C:unsigned RF_FindFreeBuffer (void)\r
+16/CatacombApocalypse/ID_RF.C:= RF_NewPosition EGA\r
+16/CatacombApocalypse/ID_RF.C:void RF_NewPosition (unsigned x, unsigned y)\r
+16/CatacombApocalypse/ID_RF.C:= RF_Scroll EGA\r
+16/CatacombApocalypse/ID_RF.C:void RF_Scroll (int x, int y)\r
+16/CatacombApocalypse/ID_RF.C: RF_NewPosition(originxglobal,originyglobal);\r
+16/CatacombApocalypse/ID_RF.C:= RF_PlaceSprite EGA\r
+16/CatacombApocalypse/ID_RF.C:void RF_PlaceSprite (void **user,unsigned globalx,unsigned globaly,\r
+16/CatacombApocalypse/ID_RF.C: RF_RemoveSprite (user);\r
+16/CatacombApocalypse/ID_RF.C: Quit ("RF_PlaceSprite: No free spots in spritearray!");\r
+16/CatacombApocalypse/ID_RF.C: strcpy (str,"RF_PlaceSprite: Placed an uncached sprite:");\r
+16/CatacombApocalypse/ID_RF.C:= RF_RemoveSprite EGA\r
+16/CatacombApocalypse/ID_RF.C:void RF_RemoveSprite (void **user)\r
+16/CatacombApocalypse/ID_RF.C:= RF_Refresh EGA\r
+16/CatacombApocalypse/ID_RF.C:void RF_Refresh (void)\r
+16/CatacombApocalypse/ID_RF.C: RF_CalcTics ();\r
+16/CatacombApocalypse/ID_RF.C:= RF_NewPosition CGA\r
+16/CatacombApocalypse/ID_RF.C:void RF_NewPosition (unsigned x, unsigned y)\r
+16/CatacombApocalypse/ID_RF.C:= RF_Scroll CGA\r
+16/CatacombApocalypse/ID_RF.C:void RF_Scroll (int x, int y)\r
+16/CatacombApocalypse/ID_RF.C: RF_NewPosition(originxglobal,originyglobal);\r
+16/CatacombApocalypse/ID_RF.C:= RF_PlaceSprite CGA\r
+16/CatacombApocalypse/ID_RF.C:void RF_PlaceSprite (void **user,unsigned globalx,unsigned globaly,\r
+16/CatacombApocalypse/ID_RF.C: RF_RemoveSprite (user);\r
+16/CatacombApocalypse/ID_RF.C: Quit ("RF_PlaceSprite: No free spots in spritearray!");\r
+16/CatacombApocalypse/ID_RF.C: strcpy (str,"RF_PlaceSprite: Placed an uncached sprite!");\r
+16/CatacombApocalypse/ID_RF.C:= RF_RemoveSprite CGA\r
+16/CatacombApocalypse/ID_RF.C:void RF_RemoveSprite (void **user)\r
+16/CatacombApocalypse/ID_RF.C:= RF_Refresh CGA\r
+16/CatacombApocalypse/ID_RF.C:void RF_Refresh (void)\r
+16/CatacombApocalypse/ID_US_2.C: RF_FixOfs();\r
+16/CatacombApocalypse/ID_RF.H:#define __ID_RF__\r
+16/CatacombApocalypse/ID_RF.H:void RF_Startup (void);\r
+16/CatacombApocalypse/ID_RF.H:void RF_Shutdown (void);\r
+16/CatacombApocalypse/ID_RF.H:void RF_FixOfs (void);\r
+16/CatacombApocalypse/ID_RF.H:void RF_NewMap (void);\r
+16/CatacombApocalypse/ID_RF.H:void RF_MarkTileGraphics (void);\r
+16/CatacombApocalypse/ID_RF.H:void RF_SetScrollBlock (int x, int y, boolean horizontal);\r
+16/CatacombApocalypse/ID_RF.H:void RF_NewPosition (unsigned x, unsigned y);\r
+16/CatacombApocalypse/ID_RF.H:void RF_Scroll (int x, int y);\r
+16/CatacombApocalypse/ID_RF.H:void RF_MapToMap (unsigned srcx, unsigned srcy,\r
+16/CatacombApocalypse/ID_RF.H:void RF_MemToMap (unsigned far *source, unsigned plane,\r
+16/CatacombApocalypse/ID_RF.H:void RF_ClearBlock (int x, int y, int width, int height);\r
+16/CatacombApocalypse/ID_RF.H:void RF_RedrawBlock (int x, int y, int width, int height);\r
+16/CatacombApocalypse/ID_RF.H:void RF_PlaceSprite (void **user,unsigned globalx,unsigned globaly,\r
+16/CatacombApocalypse/ID_RF.H:void RF_RemoveSprite (void **user);\r
+16/CatacombApocalypse/ID_RF.H:void RF_CalcTics (void);\r
+16/CatacombApocalypse/ID_RF.H:void RF_Refresh (void);\r
+16/CatacombApocalypse/ID_RF.H:void RF_ForceRefresh (void);\r
+16/CatacombApocalypse/ID_RF.H:void RF_SetRefreshHook (void (*func) (void) );\r
+16/CatacombApocalypse/ID_RF.H:unsigned RF_FindFreeBuffer (void);\r
+=============== ./qcata.sh end ===============
#define UPDATESPARESIZE (UPDATEWIDE*2+4)\r
#define UPDATESIZE (UPDATESCREENSIZE+2*UPDATESPARESIZE)\r
\r
+#define MAXSCROLLEDGES 6\r
+\r
/*\r
=============================================================================\r
\r
void RFL_MaskForegroundTiles (void);\r
void RFL_UpdateTiles (void);\r
\r
+void RFL_BoundScroll (int x, int y);//++++??\r
void RFL_CalcOriginStuff (long x, long y);\r
+void RFL_ClearScrollBlocks (void);//++++??\r
void RFL_InitSpriteList (void);\r
void RFL_InitAnimList (void);\r
void RFL_CheckForAnimTile (unsigned x, unsigned y);\r
\r
}\r
\r
+//===========================================================================\r
+\r
+\r
+/*\r
+=====================\r
+=\r
+= RF_FixOfs\r
+=\r
+= Sets bufferofs,displayofs, and masterofs to regular values, for the\r
+= occasions when you have moved them around manually\r
+=\r
+=====================\r
+*/\r
+\r
+void RF_FixOfs (void)\r
+{\r
+ if (grmode == EGAGR)\r
+ {\r
+ screenpage = 0;\r
+ otherpage = 1;\r
+ panx = pany = pansx = pansy = panadjust = 0;\r
+ displayofs = screenstart[screenpage];\r
+ bufferofs = screenstart[otherpage];\r
+ masterofs = screenstart[2];\r
+ VW_SetScreen (displayofs,0);\r
+ }\r
+ else\r
+ {\r
+ bufferofs = 0;\r
+ masterofs = 0x8000;\r
+ }\r
+}\r
+\r
+\r
//===========================================================================\r
\r
/*\r
//\r
// make a lookup table for the maps left edge\r
//\r
+ if (mapheight > MAXMAPHEIGHT)\r
+ Quit ("RF_NewMap: Map too tall!");\r
spot = 0;\r
for (i=0;i<mapheight;i++)\r
{\r
for (x=0;x<UPDATEWIDE;x++)\r
*table++ = mapbwidthtable[y]+x*2;\r
\r
-\r
//\r
// the y max value clips off the bottom half of a tile so a map that is\r
// 13 + MAPBORDER*2 tile high will not scroll at all vertically\r
//\r
RFL_InitSpriteList ();\r
RFL_InitAnimList ();\r
+ RFL_ClearScrollBlocks ();\r
+ RF_SetScrollBlock (0,MAPBORDER-1,true);\r
+ RF_SetScrollBlock (0,mapheight-MAPBORDER,true);\r
+ RF_SetScrollBlock (MAPBORDER-1,0,false);\r
+ RF_SetScrollBlock (mapwidth-MAPBORDER,0,false);\r
\r
\r
lasttimecount = TimeCount; // setup for adaptive timing\r
// new chain of animating tiles\r
\r
if (i>=MAXANIMTYPES)\r
- //Quit ("RF_MarkTileGraphics: Too many unique animated tiles!");\r
+ Quit ("RF_MarkTileGraphics: Too many unique animated tiles!");\r
allanims[i].current = tile;\r
allanims[i].count = tinf[SPEED+tile];\r
\r
CA_MarkGrChunk(STARTTILE16+next);\r
next += (signed char)(tinf[ANIM+next]);\r
if (++anims > 20)\r
- //Quit ("MarkTileGraphics: Unending animation!");\r
+ Quit ("MarkTileGraphics: Unending animation!");\r
}\r
\r
}\r
// new chain of animating tiles\r
\r
if (i>=MAXANIMTYPES)\r
- //Quit ("RF_MarkTileGraphics: Too many unique animated tiles!");\r
+ Quit ("RF_MarkTileGraphics: Too many unique animated tiles!");\r
allanims[i].current = tilehigh;\r
allanims[i].count = tinf[MSPEED+tile];\r
\r
CA_MarkGrChunk(STARTTILE16M+next);\r
next += (signed char)(tinf[MANIM+next]);\r
if (++anims > 20)\r
- //Quit ("MarkTileGraphics: Unending animation!");\r
+ Quit ("MarkTileGraphics: Unending animation!");\r
}\r
\r
}\r
//\r
map = mapsegs[0]+offset;\r
tile = *map;\r
- if (tinf[ANIM+tile])\r
+ if (tinf[ANIM+tile] && tinf[SPEED+tile])\r
{\r
if (!animfreeptr)\r
- //Quit ("RF_CheckForAnimTile: No free spots in tilearray!");\r
+ Quit ("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
//\r
map = mapsegs[1]+offset;\r
tile = *map;\r
- if (tinf[MANIM+tile])\r
+ if (tinf[MANIM+tile] && tinf[MSPEED+tile])\r
{\r
if (!animfreeptr)\r
- //Quit ("RF_CheckForAnimTile: No free spots in tilearray!");\r
+ Quit ("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
}\r
\r
\r
+/*\r
+====================\r
+=\r
+= RFL_RemoveAnimsInBlock\r
+=\r
+====================\r
+*/\r
+\r
+void RFL_RemoveAnimsInBlock (unsigned x, unsigned y, unsigned width, unsigned height)\r
+{\r
+ animtiletype *current,*next;\r
+\r
+ current = animhead;\r
+ while (current)\r
+ {\r
+ if (current->x - x < width && current->y - y < height)\r
+ {\r
+ *(void **)current->prevptr = current->nexttile;\r
+ if (current->nexttile)\r
+ current->nexttile->prevptr = current->prevptr;\r
+ next = current->nexttile;\r
+ current->nexttile = animfreeptr;\r
+ animfreeptr = current;\r
+ current = next;\r
+ }\r
+ else\r
+ current = current->nexttile;\r
+ }\r
+}\r
+\r
+\r
/*\r
====================\r
=\r
y = current->y-originytile;\r
\r
if (x>=PORTTILESWIDE || y>=PORTTILESHIGH)\r
- //Quit ("RFL_AnimateTiles: Out of bounds!");\r
+ Quit ("RFL_AnimateTiles: Out of bounds!");\r
\r
updateofs = uwidthtable[y] + x;\r
RFL_NewTile(updateofs); // puts "1"s in both pages\r
\r
}\r
\r
+\r
+/*\r
+=================\r
+=\r
+= RFL_ClearScrollBlocks\r
+=\r
+=================\r
+*/\r
+\r
+void RFL_ClearScrollBlocks (void)\r
+{\r
+ hscrollblocks = vscrollblocks = 0;\r
+}\r
+\r
+\r
+/*\r
+=================\r
+=\r
+= RF_SetScrollBlock\r
+=\r
+= Sets a horizontal or vertical scroll block\r
+= a horizontal block is ----, meaning it blocks up/down movement\r
+=\r
+=================\r
+*/\r
+\r
+void RF_SetScrollBlock (int x, int y, boolean horizontal)\r
+{\r
+ if (horizontal)\r
+ {\r
+ hscrolledge[hscrollblocks] = y;\r
+ if (hscrollblocks++ == MAXSCROLLEDGES)\r
+ Quit ("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
+ }\r
+}\r
+\r
+\r
+/*\r
+=================\r
+=\r
+= RFL_BoundScroll\r
+=\r
+= Bound a given x/y movement to scroll blocks\r
+=\r
+=================\r
+*/\r
+\r
+void RFL_BoundScroll (int x, int y)\r
+{\r
+ int check,newxtile,newytile;\r
+\r
+ originxglobal += x;\r
+ originyglobal += y;\r
+\r
+ newxtile= originxglobal >> G_T_SHIFT;\r
+ newytile = originyglobal >> G_T_SHIFT;\r
+\r
+ if (x>0)\r
+ {\r
+ newxtile+=SCREENTILESWIDE;\r
+ for (check=0;check<vscrollblocks;check++)\r
+ if (vscrolledge[check] == newxtile)\r
+ {\r
+ originxglobal = originxglobal&0xff00;\r
+ break;\r
+ }\r
+ }\r
+ else if (x<0)\r
+ {\r
+ for (check=0;check<vscrollblocks;check++)\r
+ if (vscrolledge[check] == newxtile)\r
+ {\r
+ originxglobal = (originxglobal&0xff00)+0x100;\r
+ break;\r
+ }\r
+ }\r
+\r
+\r
+ if (y>0)\r
+ {\r
+ newytile+=SCREENTILESHIGH;\r
+ for (check=0;check<hscrollblocks;check++)\r
+ if (hscrolledge[check] == newytile)\r
+ {\r
+ originyglobal = originyglobal&0xff00;\r
+ break;\r
+ }\r
+ }\r
+ else if (y<0)\r
+ {\r
+ for (check=0;check<hscrollblocks;check++)\r
+ if (hscrolledge[check] == newytile)\r
+ {\r
+ originyglobal = (originyglobal&0xff00)+0x100;\r
+ break;\r
+ }\r
+ }\r
+\r
+\r
+ RFL_CalcOriginStuff (originxglobal, originyglobal);\r
+}\r
+\r
+\r
//===========================================================================\r
\r
/*\r
}\r
\r
\r
+//===========================================================================\r
\r
/*\r
=================\r
ystep = 1;\r
count = PORTTILESHIGH;\r
break;\r
- //default:\r
- //Quit ("RFL_NewRow: Bad dir!");\r
+ default:\r
+ Quit ("RFL_NewRow: Bad dir!");\r
}\r
\r
while (count--)\r
RF_Refresh ();\r
}\r
\r
+//===========================================================================\r
+\r
+/*\r
+=====================\r
+=\r
+= RF_MapToMap\r
+=\r
+= Copies a block of tiles (all three planes) from one point\r
+= in the map to another, accounting for animating tiles\r
+=\r
+=====================\r
+*/\r
+\r
+void RF_MapToMap (unsigned srcx, unsigned srcy,\r
+ unsigned destx, unsigned desty,\r
+ unsigned width, unsigned height)\r
+{\r
+ int x,y;\r
+ unsigned source,destofs,xspot,yspot;\r
+ unsigned linedelta,p0,p1,p2,updatespot;\r
+ unsigned far *source0, far *source1, far *source2;\r
+ unsigned far *dest0, far *dest1, far *dest2;\r
+ boolean changed;\r
+\r
+ RFL_RemoveAnimsInBlock (destx,desty,width,height);\r
+\r
+ source = mapbwidthtable[srcy]/2 + srcx;\r
+\r
+ source0 = mapsegs[0]+source;\r
+ source1 = mapsegs[1]+source;\r
+ source2 = mapsegs[2]+source;\r
+\r
+ destofs = mapbwidthtable[desty]/2 + destx;\r
+ destofs -= source;\r
+\r
+ linedelta = mapwidth - width;\r
+\r
+ for (y=0;y<height;y++,source0+=linedelta,source1+=linedelta,source2+=linedelta)\r
+ for (x=0;x<width;x++,source0++,source1++,source2++)\r
+ {\r
+ p0 = *source0;\r
+ p1 = *source1;\r
+ p2 = *source2;\r
+\r
+ dest0 = source0 + destofs;\r
+ dest1 = source1 + destofs;\r
+ dest2 = source2 + destofs;\r
+\r
+//\r
+// only make a new tile if it is different\r
+//\r
+ if (p0 != *dest0 || p1 != *dest1 || p2 != *dest2)\r
+ {\r
+ *dest0 = p0;\r
+ *dest1 = p1;\r
+ *dest2 = p2;\r
+ changed = true;\r
+ }\r
+ else\r
+ changed = false;\r
+\r
+//\r
+// if tile is on the view port\r
+//\r
+ xspot = destx+x-originxtile;\r
+ yspot = desty+y-originytile;\r
+ if (yspot < PORTTILESHIGH && xspot < PORTTILESWIDE)\r
+ {\r
+ if (changed)\r
+ {\r
+ updatespot = uwidthtable[yspot]+xspot;\r
+ RFL_NewTile(updatespot);\r
+ }\r
+ RFL_CheckForAnimTile (destx+x,desty+y);\r
+ }\r
+ }\r
+}\r
+\r
+//===========================================================================\r
+\r
+\r
+/*\r
+=====================\r
+=\r
+= RF_MemToMap\r
+=\r
+= Copies a string of tiles from main memory to the map,\r
+= accounting for animating tiles\r
+=\r
+=====================\r
+*/\r
+\r
+void RF_MemToMap (unsigned far *source, unsigned plane,\r
+ unsigned destx, unsigned desty,\r
+ unsigned width, unsigned height)\r
+{\r
+ int x,y;\r
+ unsigned xspot,yspot;\r
+ unsigned linedelta,updatespot;\r
+ unsigned far *dest,old,new;\r
+ boolean changed;\r
+\r
+ RFL_RemoveAnimsInBlock (destx,desty,width,height);\r
+\r
+ dest = mapsegs[plane] + mapbwidthtable[desty]/2 + destx;\r
+\r
+ linedelta = mapwidth - width;\r
+\r
+ for (y=0;y<height;y++,dest+=linedelta)\r
+ for (x=0;x<width;x++)\r
+ {\r
+ old = *dest;\r
+ new = *source++;\r
+ if (old != new)\r
+ {\r
+ *dest = new;\r
+ changed = true;\r
+ }\r
+ else\r
+ changed = false;\r
+\r
+ dest++;\r
+ xspot = destx+x-originxtile;\r
+ yspot = desty+y-originytile;\r
+ if (yspot < PORTTILESHIGH && xspot < PORTTILESWIDE)\r
+ {\r
+ if (changed)\r
+ {\r
+ updatespot = uwidthtable[yspot]+xspot;\r
+ RFL_NewTile(updatespot);\r
+ }\r
+ RFL_CheckForAnimTile (destx+x,desty+y);\r
+ }\r
+ }\r
+}\r
+\r
+//===========================================================================\r
+\r
+\r
+/*\r
+=====================\r
+=\r
+= RFL_BoundNewOrigin\r
+=\r
+= Copies a string of tiles from main memory to the map,\r
+= accounting for animating tiles\r
+=\r
+=====================\r
+*/\r
+\r
+void RFL_BoundNewOrigin (unsigned orgx,unsigned orgy)\r
+{\r
+ int check,edge;\r
+\r
+//\r
+// calculate new origin related globals\r
+//\r
+ if (orgx<originxmin)\r
+ orgx=originxmin;\r
+ else if (orgx>originxmax)\r
+ orgx=originxmax;\r
+\r
+ if (orgy<originymin)\r
+ orgy=originymin;\r
+ else if (orgy>originymax)\r
+ orgy=originymax;\r
+\r
+ originxtile = orgx>>G_T_SHIFT;\r
+ originytile = orgy>>G_T_SHIFT;\r
+\r
+ for (check=0;check<vscrollblocks;check++)\r
+ {\r
+ edge = vscrolledge[check];\r
+ if (edge>=originxtile && edge <=originxtile+10)\r
+ {\r
+ orgx = (edge+1)*TILEGLOBAL;\r
+ break;\r
+ }\r
+ if (edge>=originxtile+11 && edge <=originxtile+20)\r
+ {\r
+ orgx = (edge-20)*TILEGLOBAL;\r
+ break;\r
+ }\r
+ }\r
+\r
+ for (check=0;check<hscrollblocks;check++)\r
+ {\r
+ edge = hscrolledge[check];\r
+ if (edge>=originytile && edge <=originytile+6)\r
+ {\r
+ orgy = (edge+1)*TILEGLOBAL;\r
+ break;\r
+ }\r
+ if (edge>=originytile+7 && edge <=originytile+13)\r
+ {\r
+ orgy = (edge-13)*TILEGLOBAL;\r
+ break;\r
+ }\r
+ }\r
+\r
+\r
+ RFL_CalcOriginStuff (orgx,orgy);\r
+}\r
+\r
\r
+//===========================================================================\r
+\r
+/*\r
+=====================\r
+=\r
+= RF_ClearBlock\r
+=\r
+= Posts erase blocks to clear a certain area of the screen to the master\r
+= screen, to erase text or something draw directly to the screen\r
+=\r
+= Parameters in pixels, but erasure is byte bounded\r
+=\r
+=====================\r
+*/\r
+\r
+void RF_ClearBlock (int x, int y, int width, int height)\r
+{\r
+ eraseblocktype block;\r
+\r
+#if GRMODE == EGAGR\r
+ block.screenx = x/8+originxscreen;\r
+ block.screeny = y+originyscreen;\r
+ block.width = (width+(x&7)+7)/8;\r
+ block.height = height;\r
+ memcpy (eraselistptr[0]++,&block,sizeof(block));\r
+ memcpy (eraselistptr[1]++,&block,sizeof(block));\r
+#endif\r
+\r
+#if GRMODE == CGAGR\r
+ block.screenx = x/4+originxscreen;\r
+ block.screeny = y+originyscreen;\r
+ block.width = (width+(x&3)+3)/4;\r
+ block.height = height;\r
+ memcpy (eraselistptr[0]++,&block,sizeof(block));\r
+#endif\r
+\r
+}\r
+\r
+//===========================================================================\r
+\r
+/*\r
+=====================\r
+=\r
+= RF_RedrawBlock\r
+=\r
+= Causes a number of tiles to be redrawn to the master screen and updated\r
+=\r
+= Parameters in pixels, but erasure is tile bounded\r
+=\r
+=====================\r
+*/\r
+\r
+void RF_RedrawBlock (int x, int y, int width, int height)\r
+{\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
+ for (yy=yl;yy<=yh;yy++)\r
+ for (xx=xl;xx<=xh;xx++)\r
+ RFL_NewTile (yy*UPDATEWIDE+xx);\r
+}\r
+\r
+\r
+//===========================================================================\r
+\r
+/*\r
+=====================\r
+=\r
+= RF_CalcTics\r
+=\r
+=====================\r
+*/\r
+\r
+void RF_CalcTics (void)\r
+{\r
+ long newtime,oldtimecount;\r
+\r
+//\r
+// calculate tics since last refresh for adaptive timing\r
+//\r
+ if (lasttimecount > TimeCount)\r
+ TimeCount = lasttimecount; // if the game was paused a LONG time\r
+\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
+//\r
+ oldtimecount = lasttimecount;\r
+ while (TimeCount<oldtimecount+DEMOTICS*2)\r
+ ;\r
+ lasttimecount = oldtimecount + DEMOTICS;\r
+ TimeCount = lasttimecount + DEMOTICS;\r
+ tics = DEMOTICS;\r
+ }\r
+ else\r
+ {\r
+//\r
+// non demo, so report actual time\r
+//\r
+ do\r
+ {\r
+ newtime = TimeCount;\r
+ tics = newtime-lasttimecount;\r
+ } while (tics<MINTICS);\r
+ lasttimecount = newtime;\r
+\r
+#ifdef PROFILE\r
+ strcpy (scratch,"\tTics:");\r
+ itoa (tics,str,10);\r
+ strcat (scratch,str);\r
+ strcat (scratch,"\n");\r
+ write (profilehandle,scratch,strlen(scratch));\r
+#endif\r
+\r
+ if (tics>MAXTICS)\r
+ {\r
+ TimeCount -= (tics-MAXTICS);\r
+ tics = MAXTICS;\r
+ }\r
+ }\r
+}\r
\r
/*\r
=============================================================================\r
\r
#if GRMODE == EGAGR\r
\r
+/*\r
+=====================\r
+=\r
+= RF_FindFreeBuffer\r
+=\r
+= Finds the start of unused, non visable buffer space\r
+=\r
+=====================\r
+*/\r
+\r
+unsigned RF_FindFreeBuffer (void)\r
+{\r
+ unsigned spot,i,j;\r
+ boolean ok;\r
+\r
+ for (i=0;i<3;i++)\r
+ {\r
+ spot = screenstart[i]+SCREENSPACE;\r
+ ok = true;\r
+ for (j=0;j<3;j++)\r
+ if (spot == screenstart[j])\r
+ {\r
+ ok = false;\r
+ break;\r
+ }\r
+ if (ok)\r
+ return spot;\r
+ }\r
+\r
+ return 0; // never get here...\r
+}\r
+\r
+//===========================================================================\r
\r
/*\r
=====================\r
byte *page0ptr,*page1ptr;\r
unsigned updatenum;\r
\r
-//\r
+ RFL_BoundNewOrigin (x,y);\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
//\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
+ updateptr = updatestart[otherpage];\r
\r
page0ptr = updatestart[0]+PORTTILESWIDE; // used to stick "0"s after rows\r
page1ptr = updatestart[1]+PORTTILESWIDE;\r
{\r
spritelisttype register *sprite,*next;\r
spritetabletype far *spr;\r
- spritetype /*_seg*/ *block;\r
+ spritetype _seg *block;\r
unsigned shift,pixx;\r
+ char str[80],str2[10];\r
\r
- if (!spritenumber)\r
+ if (!spritenumber || spritenumber == (unsigned)-1)\r
{\r
RF_RemoveSprite (user);\r
return;\r
// 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 ("RF_PlaceSprite: No free spots in spritearray!");\r
\r
sprite = spritefreeptr;\r
spritefreeptr = spritefreeptr->nextsprite;\r
// write the new info to the sprite\r
//\r
spr = &spritetable[spritenumber-STARTSPRITES];\r
- block = (spritetype /*_seg*/ *)grsegs[spritenumber];\r
+ block = (spritetype _seg *)grsegs[spritenumber];\r
+\r
+ if (!block)\r
+ {\r
+ strcpy (str,"RF_PlaceSprite: Placed an uncached sprite:");\r
+ itoa (spritenumber,str2,10);\r
+ strcat (str,str2);\r
+ Quit (str);\r
+ }\r
\r
globaly+=spr->orgy;\r
globalx+=spr->orgx;\r
void RF_Refresh (void)\r
{\r
byte *newupdate;\r
- long newtime;\r
\r
updateptr = updatestart[otherpage];\r
\r
//\r
// calculate tics since last refresh for adaptive timing\r
//\r
- if (lasttimecount > TimeCount)\r
- lasttimecount = TimeCount; // if the game was paused a LONG time\r
- do\r
- {\r
- newtime = TimeCount;\r
- tics = newtime-lasttimecount;\r
- } while (tics<MINTICS);\r
- lasttimecount = newtime;\r
-\r
-#ifdef PROFILE\r
- strcpy (scratch,"\tTics:");\r
- itoa (tics,str,10);\r
- strcat (scratch,str);\r
- strcat (scratch,"\n");\r
- write (profilehandle,scratch,strlen(scratch));\r
-#endif\r
-\r
- if (tics>MAXTICS)\r
- {\r
- TimeCount -= (tics-MAXTICS);\r
- tics = MAXTICS;\r
- }\r
+ RF_CalcTics ();\r
}\r
\r
#endif // GRMODE == EGAGR\r
byte *spotptr;\r
unsigned updatenum;\r
\r
-//\r
+ RFL_BoundNewOrigin (x,y);\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
{\r
spritelisttype register *sprite,*next;\r
spritetabletype far *spr;\r
- spritetype /*_seg*/ *block;\r
+ spritetype _seg *block;\r
unsigned shift,pixx;\r
+ char str[80],str2[10];\r
\r
- if (!spritenumber)\r
+ if (!spritenumber || spritenumber == (unsigned)-1)\r
{\r
RF_RemoveSprite (user);\r
return;\r
// 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 ("RF_PlaceSprite: No free spots in spritearray!");\r
\r
sprite = spritefreeptr;\r
spritefreeptr = spritefreeptr->nextsprite;\r
// write the new info to the sprite\r
//\r
spr = &spritetable[spritenumber-STARTSPRITES];\r
- block = (spritetype /*_seg*/ *)grsegs[spritenumber];\r
+ block = (spritetype _seg *)grsegs[spritenumber];\r
+\r
+ if (!block)\r
+ {\r
+ strcpy (str,"RF_PlaceSprite: Placed an uncached sprite!");\r
+ itoa (spritenumber,str2,10);\r
+ strcat (str,str2);\r
+ Quit (str);\r
+ }\r
+\r
\r
globaly+=spr->orgy;\r
globalx+=spr->orgx;\r
//\r
// calculate tics since last refresh for adaptive timing\r
//\r
- if (lasttimecount > TimeCount)\r
- lasttimecount = TimeCount; // if the game was paused a LONG time\r
- do\r
- {\r
- newtime = TimeCount;\r
- tics = newtime-lasttimecount;\r
- } while (tics<MINTICS);\r
- lasttimecount = newtime;\r
-\r
-#ifdef PROFILE\r
- itoa (tics,str,10);\r
- strcat (str,"\t");\r
- ltoa (TimeCount,str2,10);\r
- strcat (str,str2);\r
- strcat (str,"\t");\r
- ltoa (LocalTime,str2,10);\r
- strcat (str,str2);\r
- strcat (str,"\n");\r
- write (profile,str,strlen(str));\r
-#endif\r
- if (tics>MAXTICS)\r
- tics = MAXTICS;\r
-\r
+ RF_CalcTics ();\r
}\r
\r
#endif // GRMODE == CGAGR\r