OSDN Git Service

[16_ca needs huge amounts of work and I should remember what needs to be done soon...
authorsparky4 <sparky4@cock.li>
Wed, 29 Mar 2017 17:47:52 +0000 (12:47 -0500)
committersparky4 <sparky4@cock.li>
Wed, 29 Mar 2017 17:47:52 +0000 (12:47 -0500)
16/wf3d8086/.id_ca.c.kate-swp [deleted file]
_rf_use.txt
src/lib/16_ca.c
src/lib/16_rf.c
src/lib/16_tdef.h
src/maptest.c

diff --git a/16/wf3d8086/.id_ca.c.kate-swp b/16/wf3d8086/.id_ca.c.kate-swp
deleted file mode 100755 (executable)
index ed0e0fc..0000000
Binary files a/16/wf3d8086/.id_ca.c.kate-swp and /dev/null differ
index a103cba..0d903a9 100755 (executable)
@@ -31,3 +31,213 @@ kd_play.c:                                          RF_RemoveSprite (&obj->sprite);
 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          ===============
index 58114c6..a41fb06 100755 (executable)
@@ -2024,7 +2024,7 @@ void CA_ClearMarks (global_game_variables_t *gvar)
        int i;\r
 \r
        for (i=0;i<NUMCHUNKS;i++)\r
-               gvar->video.grneeded[i]&=~gvar->ca.ca_levelbit;\r
+               gvar->ca.grneeded[i]&=~gvar->ca.ca_levelbit;\r
 }\r
 \r
 //===========================================================================\r
@@ -2041,7 +2041,7 @@ void CA_ClearMarks (global_game_variables_t *gvar)
 \r
 void CA_ClearAllMarks (global_game_variables_t *gvar)\r
 {\r
-       _fmemset (gvar->video.grneeded,0,sizeof(gvar->video.grneeded));\r
+       _fmemset (gvar->ca.grneeded,0,sizeof(gvar->ca.grneeded));\r
        gvar->ca.ca_levelbit = 1;\r
        gvar->ca.ca_levelnum = 0;\r
 }\r
index 05ea5ae..4640038 100755 (executable)
@@ -76,6 +76,8 @@ unsigned      SX_T_SHIFT;             // screen x >> ?? = tile EGA = 1, CGA = 2;
 #define        UPDATESPARESIZE         (UPDATEWIDE*2+4)\r
 #define UPDATESIZE                     (UPDATESCREENSIZE+2*UPDATESPARESIZE)\r
 \r
+#define MAXSCROLLEDGES 6\r
+\r
 /*\r
 =============================================================================\r
 \r
@@ -230,7 +232,9 @@ void RFL_NewTile (unsigned updateoffset);
 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
@@ -340,6 +344,40 @@ void RF_Shutdown (void)
 \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
 =\r
@@ -364,6 +402,8 @@ void RF_NewMap (void)
 //\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
@@ -379,7 +419,6 @@ void RF_NewMap (void)
                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
@@ -396,6 +435,11 @@ void RF_NewMap (void)
 //\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
@@ -458,7 +502,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 ("RF_MarkTileGraphics: Too many unique animated tiles!");\r
                                allanims[i].current = tile;\r
                                allanims[i].count = tinf[SPEED+tile];\r
 \r
@@ -472,7 +516,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 ("MarkTileGraphics: Unending animation!");\r
                                }\r
 \r
                        }\r
@@ -508,7 +552,7 @@ nextback:
                                // 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
@@ -522,7 +566,7 @@ nextback:
                                        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
@@ -586,10 +630,10 @@ void RFL_CheckForAnimTile (unsigned x, unsigned y)
 //\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
@@ -611,10 +655,10 @@ void RFL_CheckForAnimTile (unsigned x, unsigned y)
 //\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
@@ -699,6 +743,37 @@ void RFL_RemoveAnimsOnY (unsigned y)
 /*\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
 = RFL_AnimateTiles\r
 =\r
 ====================\r
@@ -766,7 +841,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 ("RFL_AnimateTiles: Out of bounds!");\r
 \r
                        updateofs = uwidthtable[y] + x;\r
                        RFL_NewTile(updateofs);                         // puts "1"s in both pages\r
@@ -853,6 +928,115 @@ void RFL_CalcOriginStuff (long x, long y)
 \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
@@ -869,6 +1053,7 @@ void RF_SetRefreshHook (void (*func) (void) )
 }\r
 \r
 \r
+//===========================================================================\r
 \r
 /*\r
 =================\r
@@ -926,8 +1111,8 @@ void       RFL_NewRow (int dir)
                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
@@ -957,7 +1142,336 @@ void RF_ForceRefresh (void)
        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
@@ -969,6 +1483,39 @@ void RF_ForceRefresh (void)
 \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
@@ -984,10 +1531,11 @@ void RF_NewPosition (unsigned x, unsigned y)
        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
@@ -997,10 +1545,11 @@ 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
+       updateptr = updatestart[otherpage];\r
 \r
        page0ptr = updatestart[0]+PORTTILESWIDE;        // used to stick "0"s after rows\r
        page1ptr = updatestart[1]+PORTTILESWIDE;\r
@@ -1233,10 +1782,11 @@ void RF_PlaceSprite (void **user,unsigned globalx,unsigned globaly,
 {\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
@@ -1276,7 +1826,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 ("RF_PlaceSprite: No free spots in spritearray!");\r
 \r
                sprite = spritefreeptr;\r
                spritefreeptr = spritefreeptr->nextsprite;\r
@@ -1294,7 +1844,15 @@ linknewspot:
 // 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
@@ -1646,7 +2204,6 @@ redraw:
 void RF_Refresh (void)\r
 {\r
        byte    *newupdate;\r
-       long    newtime;\r
 \r
        updateptr = updatestart[otherpage];\r
 \r
@@ -1703,28 +2260,7 @@ asm      mov     [WORD PTR es:di],UPDATETERMINATE
 //\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
@@ -1754,10 +2290,11 @@ void RF_NewPosition (unsigned x, unsigned y)
        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
@@ -1922,10 +2459,11 @@ void RF_PlaceSprite (void **user,unsigned globalx,unsigned globaly,
 {\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
@@ -1961,7 +2499,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 ("RF_PlaceSprite: No free spots in spritearray!");\r
 \r
                sprite = spritefreeptr;\r
                spritefreeptr = spritefreeptr->nextsprite;\r
@@ -1979,7 +2517,16 @@ linknewspot:
 // 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
@@ -2336,29 +2883,7 @@ void RF_Refresh (void)
 //\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
index e9f19bb..0b6de0b 100755 (executable)
@@ -171,11 +171,11 @@ typedef struct {
        byte    *data;                  //TODO: 16_mm and 16_ca must handle this\r
 } mapl_t;      //map layer array type def\r
 \r
-#define MAP_LAYERS 3\r
+#define MAPPLANES              3\r
 typedef struct {\r
        //long          planestart[3];\r
        //unsigned      planelength[3];\r
-       mapl_t layerdata[MAP_LAYERS];   // mapdata for multilayer (map index values for rendering which image on the tile)\r
+       mapl_t layerdata[MAPPLANES];    // mapdata for multilayer (map index values for rendering which image on the tile)\r
        tiles_t *tiles;         //TODO: 16_mm and 16_ca must handle this        // tilesets for layers (currently ony 4 can be loaded wwww)\r
        int width, height;              //this has to be signed!\r
        byte name[16];\r
@@ -390,7 +390,7 @@ typedef struct
        //0000word startclk; float clk, tickclk;        //timer\r
 //newer vars\r
 //TODO: find out how they are used\r
-       byte grneeded[NUMCHUNKS];\r
+//     byte grneeded[NUMCHUNKS];\r
 } video_t;\r
 \r
 //from scroll16\r
@@ -581,7 +581,6 @@ typedef struct
 //==========================================================================\r
 \r
 #define NUMMAPS                4//39\r
-#define MAPPLANES              3\r
 #define NUMSNDCHUNKS           84\r
 \r
 typedef struct\r
@@ -589,10 +588,18 @@ typedef struct
   word bit0,bit1;      // 0-255 is a character, > is a pointer to a node\r
 } huffnode;\r
 \r
+typedef        struct\r
+{\r
+       long            planestart[3];\r
+       unsigned        planelength[3];\r
+       unsigned        width,height;\r
+       char            name[16];\r
+} maptype;\r
+\r
 typedef struct\r
 {\r
        int             mapon, mapnum;\r
-       //maptype               _seg    *mapheaderseg[NUMMAPS];\r
+       maptype         _seg    *mapheaderseg[NUMMAPS];\r
 } ca_mapinfo_t;\r
 \r
 typedef struct\r
@@ -602,27 +609,22 @@ typedef struct
        int                     audiohandle[4]; // handle to AUDIOT / AUDIO\r
 } ca_handle_t;\r
 /*\r
- 16/wf3d8086/id_ca.c:byte              _seg    *tinf;\r
-16/wf3d8086/id_ca.c:unsigned   _seg    *mapsegs[MAPPLANES];\r
-16/wf3d8086/id_ca.c:maptype            _seg    *mapheaderseg[NUMMAPS];\r
-16/wf3d8086/id_ca.c:byte               _seg    *audiosegs[NUMSNDCHUNKS];\r
-16/wf3d8086/id_ca.c:void               _seg    *grsegs[NUMCHUNKS];\r
-16/wf3d8086/id_ca.c:long               _seg *grstarts; // array of offsets in egagraph, -1 for sparse\r
-16/wf3d8086/id_ca.c:long               _seg *audiostarts;      // array of offsets in audio / audiot\r
 16/wf3d8086/id_ca.c:   grstarts = (long _seg *)FP_SEG(&EGAhead);\r
 16/wf3d8086/id_ca.c:   tinf = (byte _seg *)FP_SEG(&maphead);\r
 16/wf3d8086/id_ca.c:           pos = ((mapfiletype     _seg *)tinf)->headeroffsets[i];\r
 16/wf3d8086/id_ca.c:   audiostarts = (long _seg *)FP_SEG(&audiohead);\r
 16/wf3d8086/id_ca.c:           ((mapfiletype _seg *)tinf)->RLEWtag);\r
 16/wf3d8086/id_ca.c:           ((mapfiletype _seg *)tinf)->RLEWtag);\r
-16/wf3d8086/id_ca.c:                                   source = (byte _seg *)bufferseg+(pos-bufferstart);*/\r
+16/wf3d8086/id_ca.c:                                   source = (byte _seg *)bufferseg+(pos-bufferstart);\r
+*/\r
 typedef struct //TODO: USE THIS!!!!\r
 {\r
        byte    ca_levelbit,ca_levelnum;\r
        ca_handle_t             file;           //files to open\r
        ca_mapinfo_t    camap;\r
 \r
-       unsigned        _seg    *mapsegs[MAP_LAYERS];\r
+       byte            _seg    *tinf[4];//?? where in the id engine is this used and what is it? --sparky4\r
+       unsigned        _seg    *mapsegs[MAPPLANES];\r
        void            _seg    *grsegs[NUMCHUNKS];\r
        byte            far             grneeded[NUMCHUNKS];\r
        word            _seg *audiosegs[NUMSNDCHUNKS];//long\r
@@ -630,9 +632,6 @@ typedef struct      //TODO: USE THIS!!!!
        word            _seg    *grstarts;      // array of offsets in egagraph, -1 for sparse//long\r
        word            _seg    *audiostarts;   // array of offsets in audio / audiot//long\r
 \r
-       //misc memptr\r
-       byte            _seg    *tinf[4];\r
-\r
        huffnode huffnode;\r
 \r
        //TODO: extend! and learn from keen/wolf/catacomb's code wwww\r
index 8a99276..7b53667 100755 (executable)
@@ -59,7 +59,7 @@ main(int argc, char *argv[])
        getch();\r
 #ifdef DUMP_MAP\r
        //if(map.width*map.height != 1200)\r
-       for(k=0;k<MAP_LAYERS;k++)\r
+       for(k=0;k<MAPPLANES;k++)\r
        {\r
                printf("maplayer: %u\n[\n", k);\r
                for(i=0; i<(map.width*map.height); i++)\r