+/* Catacomb Armageddon Source Code\r
+ * Copyright (C) 1993-2014 Flat Rock Software\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along\r
+ * with this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
+ */\r
+\r
+// C3_DEBUG.C\r
+\r
+#include "DEF.H"\r
+#include "gelib.h"\r
+#pragma hdrstop\r
+\r
+/*\r
+=============================================================================\r
+\r
+ LOCAL CONSTANTS\r
+\r
+=============================================================================\r
+*/\r
+\r
+#define DEBUG_OVERHEAD 0\r
+\r
+\r
+#define VIEWTILEX 20\r
+#define VIEWTILEY (VIEWHEIGHT/16)\r
+\r
+/*\r
+=============================================================================\r
+\r
+ GLOBAL VARIABLES\r
+\r
+=============================================================================\r
+*/\r
+\r
+\r
+/*\r
+=============================================================================\r
+\r
+ LOCAL VARIABLES\r
+\r
+=============================================================================\r
+*/\r
+\r
+short colordelay=0;\r
+boolean autofire=false;\r
+int maporgx;\r
+int maporgy;\r
+enum {mapview,tilemapview,actoratview,visview,mapseg2,lastview} viewtype;\r
+\r
+void ViewMap (void);\r
+\r
+//===========================================================================\r
+\r
+#if 0\r
+/*\r
+================\r
+=\r
+= PicturePause\r
+=\r
+================\r
+*/\r
+\r
+void PicturePause (void)\r
+{\r
+ int y;\r
+ unsigned source;\r
+\r
+ source = displayofs+panadjust;\r
+\r
+// VW_ColorBorder (15);\r
+ VW_SetLineWidth (40);\r
+ VW_SetScreen (0,0);\r
+\r
+ if (source<0x10000l-200*64)\r
+ {\r
+ //\r
+ // copy top line first\r
+ //\r
+ for (y=0;y<200;y++)\r
+ VW_ScreenToScreen (source+y*64,y*40,40,1);\r
+ }\r
+ else\r
+ {\r
+ //\r
+ // copy bottom line first\r
+ //\r
+ for (y=199;y>=0;y--)\r
+ VW_ScreenToScreen (source+y*64,y*40,40,1);\r
+ }\r
+\r
+ IN_Shutdown ();\r
+\r
+ VW_WaitVBL(70);\r
+ bioskey(0);\r
+ VW_WaitVBL(70);\r
+ Quit (NULL);\r
+}\r
+#endif\r
+\r
+\r
+//===========================================================================\r
+\r
+//===========================================================================\r
+\r
+#define sc_1 0x02\r
+#define sc_2 0x03\r
+#define sc_3 0x04\r
+#define sc_4 0x05\r
+#define sc_5 0x06\r
+#define sc_6 0x07\r
+#define sc_7 0x08\r
+#define sc_8 0x09\r
+#define sc_9 0x0a\r
+#define sc_0 0x0b\r
+\r
+\r
+\r
+/*\r
+================\r
+=\r
+= DebugKeys\r
+=\r
+================\r
+*/\r
+\r
+int DebugKeys (void)\r
+{\r
+ boolean esc;\r
+ int level,i;\r
+\r
+#if DEBUG_KEYS_AVAILABLE\r
+ if (Keyboard[sc_R])\r
+ {\r
+ CenterWindow (12,2);\r
+ if (autofire)\r
+ US_PrintCentered ("Rapid-Fire OFF");\r
+ else\r
+ US_PrintCentered ("Rapid-Fire ON");\r
+ VW_UpdateScreen();\r
+ IN_Ack();\r
+ autofire ^= 1;\r
+ return 1;\r
+ }\r
+#endif\r
+\r
+#if DEBUG_KEYS_AVAILABLE\r
+ if (Keyboard[sc_A])\r
+ {\r
+ char levelstr[50];\r
+ unsigned org_tile,org_mapon,msgnum;\r
+ boolean newmsg=true,newlevel=false;\r
+\r
+ VW_FixRefreshBuffer ();\r
+ CenterWindow (16,3);\r
+ US_Print("\n");\r
+ US_CPrint("Message Test");\r
+ VW_UpdateScreen();\r
+\r
+ org_mapon = mapon;\r
+ msgnum = (org_tile = *(mapsegs[0]+farmapylookup[player->tiley]+player->tilex))-NAMESTART;\r
+ while (1)\r
+ {\r
+ // Get outta' here\r
+ //\r
+ if (Keyboard[sc_Escape])\r
+ {\r
+ while (Keyboard[sc_Escape]);\r
+ break;\r
+ }\r
+\r
+ // Move to previous message\r
+ //\r
+ if (Keyboard[sc_UpArrow])\r
+ {\r
+ if (msgnum)\r
+ {\r
+ msgnum--;\r
+ newmsg = true;\r
+ }\r
+ }\r
+\r
+ // Move to next message\r
+ //\r
+ if (Keyboard[sc_DownArrow])\r
+ {\r
+ if (msgnum < 24)\r
+ {\r
+ msgnum++;\r
+ newmsg = true;\r
+ }\r
+ }\r
+\r
+ // Move to previous level\r
+ //\r
+ if (Keyboard[sc_LeftArrow])\r
+ {\r
+ if (mapon)\r
+ {\r
+ MM_SetPurge(&grsegs[LEVEL1TEXT+mapon],3);\r
+ mapon--;\r
+ newlevel = true;\r
+ }\r
+ }\r
+\r
+ // Move to next level\r
+ //\r
+ if (Keyboard[sc_RightArrow])\r
+ {\r
+ if (mapon < LASTMAP-1)\r
+ {\r
+ MM_SetPurge(&grsegs[LEVEL1TEXT+mapon],3);\r
+ mapon++;\r
+ newlevel = true;\r
+ }\r
+ }\r
+\r
+ // Load new level text\r
+ //\r
+ if (newlevel)\r
+ {\r
+ CA_CacheGrChunk(LEVEL1TEXT+mapon);\r
+ ScanText();\r
+ newmsg = true;\r
+ newlevel=false;\r
+ }\r
+\r
+ // Display new message text\r
+ //\r
+ if (newmsg)\r
+ {\r
+ *(mapsegs[0]+farmapylookup[player->tiley]+player->tilex) = msgnum+NAMESTART;\r
+ DrawText(true);\r
+ strcpy(levelstr,"Level: ");\r
+ itoa(mapon,levelstr+strlen(levelstr),10);\r
+ strcat(levelstr," Msg: ");\r
+ itoa(msgnum,levelstr+strlen(levelstr),10);\r
+ DisplaySMsg(levelstr,NULL);\r
+ newmsg = false;\r
+\r
+ if (Keyboard[sc_UpArrow] || Keyboard[sc_DownArrow] || Keyboard[sc_LeftArrow] || Keyboard[sc_RightArrow])\r
+ VW_WaitVBL(6);\r
+ }\r
+\r
+ }\r
+// Restore game\r
+//\r
+ MM_SetPurge(&grsegs[LEVEL1TEXT+mapon],3);\r
+ mapon = org_mapon;\r
+ CA_CacheGrChunk(LEVEL1TEXT+mapon);\r
+ ScanText();\r
+ *(mapsegs[0]+farmapylookup[player->tiley]+player->tilex) = org_tile;\r
+ DrawText(true);\r
+ status_flag = 0;\r
+ }\r
+\r
+\r
+ if (Keyboard[sc_V])\r
+ {\r
+ displayofs = bufferofs = screenloc[screenpage];\r
+ CenterWindow (16,4);\r
+ US_CPrint("\n"GAMENAME);\r
+ US_CPrint(VERSION);\r
+ US_CPrint(REVISION);\r
+ VW_UpdateScreen();\r
+ IN_Ack ();\r
+ }\r
+\r
+\r
+ if (Keyboard[sc_Q]) // Q = Insta-Quit!\r
+ Quit("Insta-Quit!");\r
+\r
+ if (Keyboard[sc_Z]) // Z = freeze Time\r
+ {\r
+ if (FreezeTime)\r
+ FreezeTime = 1; // Allow refresh to dec to zero..\r
+ else\r
+ StopTime();\r
+\r
+ IN_Ack();\r
+ return 1;\r
+ }\r
+#endif\r
+\r
+\r
+// if (Keyboard[sc_E])\r
+// FaceDoor((player->x>>16l)+1,(player->y>>16l));\r
+// FaceAngle(90);\r
+\r
+#if 0\r
+ if (Keyboard[sc_B]) // B = border color\r
+ {\r
+ CenterWindow(24,3);\r
+ PrintY+=6;\r
+ US_Print(" Border color (0-15):");\r
+ VW_UpdateScreen();\r
+ esc = !US_LineInput (px,py,str,NULL,true,2,0);\r
+ if (!esc)\r
+ {\r
+ level = atoi (str);\r
+ if (level>=0 && level<=15)\r
+ VW_ColorBorder (level);\r
+ }\r
+ return 1;\r
+ }\r
+#endif\r
+\r
+\r
+#if 1//DEBUG_KEYS_AVAILABLE\r
+ if (Keyboard[sc_O])\r
+ {\r
+ extern unsigned objectcount,latchmemavail;\r
+ unsigned unused,total;\r
+\r
+ CenterWindow (30,13);\r
+ US_Print ("Objects: ");\r
+ US_PrintUnsigned (objectcount);\r
+\r
+ US_Print("\n\nTics: ");\r
+ US_PrintUnsigned (tics);\r
+ US_Print(" Real Tics: ");\r
+ US_PrintUnsigned(realtics);\r
+\r
+ US_Print ("\n\n Total Available: ");\r
+ US_PrintUnsigned (mminfo.mainmem/1024);\r
+ US_Print ("k\n Mem In Use: ");\r
+ unused=MM_UnusedMemory()/1024;\r
+ US_PrintUnsigned (unused);\r
+ US_Print ("k\n Mem After Purge: ");\r
+ total=MM_TotalFree()/1024;\r
+ US_PrintUnsigned (total);\r
+ US_Print ("k (");\r
+ US_PrintUnsigned (total-unused);\r
+\r
+ US_Print (")\n\nLatch Mem Free: ");\r
+ US_PrintUnsigned (latchmemavail);\r
+ US_Print ("\n");\r
+ VW_UpdateScreen();\r
+ IN_Ack();\r
+ }\r
+\r
+ if (colordelay<1)\r
+ {\r
+ if (Keyboard[26])\r
+ {\r
+ extern unsigned *groundcolor,debug_gnd;\r
+\r
+ groundcolor = &debug_gnd;\r
+ debug_gnd += 0x0101;\r
+ if (debug_gnd == 0x1010)\r
+ debug_gnd = 0;\r
+ colordelay = 10;\r
+ }\r
+\r
+ if (Keyboard[27])\r
+ {\r
+ extern unsigned *skycolor,debug_sky;\r
+\r
+ skycolor = &debug_sky;\r
+ debug_sky += 0x0101;\r
+ if (debug_sky == 0x1010)\r
+ debug_sky = 0;\r
+ colordelay = 10;\r
+ }\r
+ }\r
+ else\r
+ colordelay -= realtics;\r
+#endif\r
+\r
+\r
+#if 0\r
+ if (Keyboard[sc_C]) // C = count objects\r
+ {\r
+ CountObjects();\r
+ return 1;\r
+ }\r
+\r
+\r
+ if (Keyboard[sc_D]) // D = start / end demo record\r
+ {\r
+ if (DemoMode == demo_Off)\r
+ StartDemoRecord ();\r
+ else if (DemoMode == demo_Record)\r
+ {\r
+ EndDemoRecord ();\r
+ playstate = ex_completed;\r
+ }\r
+ return 1;\r
+ }\r
+#endif\r
+\r
+#if 0\r
+ if (Keyboard[sc_E]) // E = quit level\r
+ {\r
+ if (tedlevel)\r
+ TEDDeath();\r
+ playstate = ex_warped;\r
+ gamestate.mapon++;\r
+ }\r
+#endif\r
+\r
+#if 0\r
+ if (Keyboard[sc_F]) // F = facing spot\r
+ {\r
+ CenterWindow (12,4);\r
+ US_Print ("X:");\r
+ US_PrintUnsigned (player->x);\r
+ US_Print ("Y:");\r
+ US_PrintUnsigned (player->y);\r
+ US_Print ("A:");\r
+ US_PrintUnsigned (player->angle);\r
+ VW_UpdateScreen();\r
+ IN_Ack();\r
+ return 1;\r
+ }\r
+#endif\r
+\r
+ if (Keyboard[sc_G]) // G = god mode\r
+ {\r
+ CenterWindow (12,2);\r
+ if (godmode)\r
+ US_PrintCentered ("God mode OFF");\r
+ else\r
+ US_PrintCentered ("God mode ON");\r
+ VW_UpdateScreen();\r
+ IN_Ack();\r
+ godmode ^= 1;\r
+ return 1;\r
+ }\r
+\r
+#if 0\r
+ if (Keyboard[sc_H]) // H = hurt self\r
+ {\r
+ TakeDamage (5);\r
+ }\r
+#endif\r
+\r
+ if (Keyboard[sc_I]) // I = item cheat\r
+ {\r
+ extern boolean redraw_gems;\r
+\r
+ CenterWindow (12,3);\r
+ US_PrintCentered ("Free items!");\r
+ VW_UpdateScreen();\r
+ for (i=0;i<4;i++)\r
+ {\r
+ GiveBolt ();\r
+ GiveNuke ();\r
+ GivePotion ();\r
+// if (!gamestate.keys[i])\r
+ GiveKey (i);\r
+ gamestate.gems[i] = GEM_DELAY_TIME;\r
+ }\r
+ gamestate.gems[4] = GEM_DELAY_TIME;\r
+ redraw_gems = true;\r
+///////// for (i=0;i<8;i++)\r
+///////// GiveScroll (i,false);\r
+\r
+ IN_Ack ();\r
+ return 1;\r
+ }\r
+\r
+#if DEBUG_OVERHEAD\r
+ if (Keyboard[sc_Z]) // O is used elsewhere...\r
+ {\r
+ ViewMap();\r
+ return 1;\r
+ }\r
+#endif\r
+\r
+#if 0\r
+ if (Keyboard[sc_P]) // P = pause with no screen disruptioon\r
+ {\r
+ PicturePause ();\r
+ return 1;\r
+ }\r
+#endif\r
+\r
+#if 0\r
+ if (Keyboard[sc_S]) // S = slow motion\r
+ {\r
+ singlestep^=1;\r
+ CenterWindow (18,3);\r
+ if (singlestep)\r
+ US_PrintCentered ("Slow motion ON");\r
+ else\r
+ US_PrintCentered ("Slow motion OFF");\r
+ VW_UpdateScreen();\r
+ IN_Ack ();\r
+ return 1;\r
+ }\r
+#endif\r
+\r
+#if 0\r
+ if (Keyboard[sc_V]) // V = extra VBLs\r
+ {\r
+ CenterWindow(30,3);\r
+ PrintY+=6;\r
+ US_Print(" Add how many extra VBLs(0-8):");\r
+ VW_UpdateScreen();\r
+ esc = !US_LineInput (px,py,str,NULL,true,2,0);\r
+ if (!esc)\r
+ {\r
+ level = atoi (str);\r
+ if (level>=0 && level<=8)\r
+ extravbls = level;\r
+ }\r
+ return 1;\r
+ }\r
+#endif\r
+\r
+ if (Keyboard[sc_W]) // W = warp to level\r
+ {\r
+ CenterWindow(26,3);\r
+ PrintY+=6;\r
+ US_Print(" Warp to which level(0-16):");\r
+ VW_UpdateScreen();\r
+ esc = !US_LineInput (px,py,str,NULL,true,2,0);\r
+ if (!esc)\r
+ {\r
+ level = atoi (str);\r
+ if (level>=0 && level<=LASTMAP-1)\r
+ {\r
+ gamestate.mapon = level;\r
+ playstate = ex_warped;\r
+ lasttext = -1;\r
+ }\r
+ }\r
+ return 1;\r
+ }\r
+\r
+#if 0\r
+ if (Keyboard[sc_X]) // X = item cheat\r
+ {\r
+ CenterWindow (12,3);\r
+ US_PrintCentered ("Extra stuff!");\r
+ VW_UpdateScreen();\r
+ for (i=0;i<4;i++)\r
+ {\r
+ GiveBolt ();\r
+ GiveNuke ();\r
+ GivePotion ();\r
+ }\r
+ IN_Ack ();\r
+ return 1;\r
+ }\r
+#endif\r
+\r
+//////// if (LastScan >= sc_1 && LastScan <= sc_8) // free scrolls\r
+//////// {\r
+//////// GiveScroll (LastScan-sc_1,false);\r
+//////// IN_ClearKeysDown ();\r
+//////// }\r
+\r
+ return 0;\r
+}\r
+\r
+\r
+#if DEBUG_OVERHEAD\r
+\r
+/*\r
+=====================\r
+=\r
+= LatchDrawChar\r
+=\r
+=====================\r
+*/\r
+\r
+void LatchDrawChar (unsigned x, unsigned y, unsigned picnum)\r
+{\r
+ unsigned source, dest;\r
+\r
+ dest = bufferofs + ylookup[y]+x;\r
+ source = latchpics[0]+picnum*8;\r
+\r
+ EGAWRITEMODE(1);\r
+ EGAMAPMASK(15);\r
+\r
+asm mov bx,[linewidth]\r
+asm dec bx\r
+\r
+asm mov ax,[screenseg]\r
+asm mov es,ax\r
+asm mov ds,ax\r
+\r
+asm mov si,[source]\r
+asm mov di,[dest]\r
+\r
+asm movsb\r
+asm add di,bx\r
+asm movsb\r
+asm add di,bx\r
+asm movsb\r
+asm add di,bx\r
+asm movsb\r
+asm add di,bx\r
+asm movsb\r
+asm add di,bx\r
+asm movsb\r
+asm add di,bx\r
+asm movsb\r
+asm add di,bx\r
+asm movsb\r
+\r
+asm mov ax,ss\r
+asm mov ds,ax // restore turbo's data segment\r
+\r
+ EGAWRITEMODE(0);\r
+}\r
+\r
+#endif\r
+\r
+\r
+#if DEBUG_OVERHEAD\r
+/*\r
+=====================\r
+=\r
+= LatchDrawTile\r
+=\r
+=====================\r
+*/\r
+\r
+void LatchDrawTile (unsigned x, unsigned y, unsigned picnum)\r
+{\r
+ unsigned source, dest;\r
+\r
+ dest = bufferofs + ylookup[y]+x;\r
+ source = tileoffsets[picnum];\r
+\r
+ EGAWRITEMODE(1);\r
+ EGAMAPMASK(15);\r
+\r
+asm mov bx,[linewidth]\r
+asm sub bx,2\r
+\r
+asm mov ax,[screenseg]\r
+asm mov es,ax\r
+asm mov ds,ax\r
+\r
+asm mov si,[source]\r
+asm mov di,[dest]\r
+asm mov dx,16\r
+\r
+lineloop:\r
+asm movsb\r
+asm movsb\r
+asm add di,bx\r
+\r
+asm dec dx\r
+asm jnz lineloop\r
+\r
+asm mov ax,ss\r
+asm mov ds,ax // restore turbo's data segment\r
+\r
+ EGAWRITEMODE(0);\r
+}\r
+#endif\r
+\r
+\r
+#if DEBUG_OVERHEAD\r
+/*\r
+===================\r
+=\r
+= OverheadRefresh\r
+=\r
+===================\r
+*/\r
+\r
+void OverheadRefresh (void)\r
+{\r
+ unsigned x,y,endx,endy,sx,sy;\r
+ unsigned tile;\r
+\r
+\r
+ if (++screenpage == 3)\r
+ screenpage = 0;\r
+\r
+ bufferofs = screenloc[screenpage];\r
+\r
+ endx = maporgx+VIEWTILEX;\r
+ endy = maporgy+VIEWTILEY;\r
+\r
+ for (y=maporgy;y<endy;y++)\r
+ for (x=maporgx;x<endx;x++)\r
+ {\r
+ sx = (x-maporgx)*2;\r
+ sy = (y-maporgy)*16;\r
+\r
+ switch (viewtype)\r
+ {\r
+ case mapview:\r
+ tile = *(mapsegs[0]+farmapylookup[y]+x);\r
+ break;\r
+\r
+ case tilemapview:\r
+ tile = tilemap[x][y];\r
+ break;\r
+\r
+ case actoratview:\r
+ tile = (unsigned)actorat[x][y];\r
+ break;\r
+\r
+ case visview:\r
+ tile = spotvis[x][y];\r
+ break;\r
+\r
+ case mapseg2:\r
+ tile = *(mapsegs[2]+farmapylookup[y]+x);\r
+ if (tile < 256)\r
+ tile = *(mapsegs[0]+farmapylookup[y]+x);\r
+ break;\r
+\r
+ }\r
+\r
+ if (tile<NUMTILE16)\r
+ LatchDrawTile(sx,sy,tile);\r
+ else\r
+ {\r
+ LatchDrawChar(sx,sy,NUMBERCHARS+((tile&0xf000)>>12));\r
+ LatchDrawChar(sx+1,sy,NUMBERCHARS+((tile&0x0f00)>>8));\r
+ LatchDrawChar(sx,sy+8,NUMBERCHARS+((tile&0x00f0)>>4));\r
+ LatchDrawChar(sx+1,sy+8,NUMBERCHARS+(tile&0x000f));\r
+ }\r
+ }\r
+\r
+ VW_SetScreen (bufferofs,0);\r
+ displayofs = bufferofs;\r
+}\r
+\r
+\r
+/*\r
+===================\r
+=\r
+= ViewMap\r
+=\r
+===================\r
+*/\r
+\r
+void ViewMap (void)\r
+{\r
+ boolean button0held;\r
+\r
+ viewtype = actoratview;\r
+ button0held = false;\r
+\r
+\r
+ maporgx = player->tilex - VIEWTILEX/2;\r
+ if (maporgx<0)\r
+ maporgx = 0;\r
+ maporgy = player->tiley - VIEWTILEY/2;\r
+ if (maporgy<0)\r
+ maporgy = 0;\r
+\r
+ do\r
+ {\r
+//\r
+// let user pan around\r
+//\r
+ IN_ReadControl(0,&control);\r
+ if (control.xaxis == -1 && maporgx>0)\r
+ maporgx--;\r
+ if (control.xaxis == 1 && maporgx<mapwidth-VIEWTILEX)\r
+ maporgx++;\r
+ if (control.yaxis == -1 && maporgy>0)\r
+ maporgy--;\r
+ if (control.yaxis == 1 && maporgy<mapheight-VIEWTILEY)\r
+ maporgy++;\r
+\r
+ if (control.button0 && !button0held)\r
+ {\r
+ button0held = true;\r
+ viewtype++;\r
+ if (viewtype==lastview)\r
+ viewtype = mapview;\r
+ }\r
+ if (!control.button0)\r
+ button0held = false;\r
+\r
+\r
+ OverheadRefresh ();\r
+\r
+ } while (!Keyboard[sc_Escape]);\r
+\r
+ IN_ClearKeysDown ();\r
+ DrawPlayScreen ();\r
+}\r
+#endif\r
+\r