--- /dev/null
+/* Keen Dreams Source Code\r
+ * Copyright (C) 2014 Javier M. Chavez\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
+// KD_MAIN.C\r
+/*\r
+=============================================================================\r
+\r
+ KEEN DREAMS\r
+\r
+ An Id Software production\r
+\r
+=============================================================================\r
+*/\r
+\r
+#include "mem.h"\r
+#include "string.h"\r
+\r
+#include "KD_DEF.H"\r
+#pragma hdrstop\r
+\r
+/*\r
+=============================================================================\r
+\r
+ LOCAL CONSTANTS\r
+\r
+=============================================================================\r
+*/\r
+\r
+/*\r
+=============================================================================\r
+\r
+ GLOBAL VARIABLES\r
+\r
+=============================================================================\r
+*/\r
+\r
+char str[80],str2[20];\r
+boolean singlestep,jumpcheat,godmode,tedlevel;\r
+unsigned tedlevelnum;\r
+\r
+/*\r
+=============================================================================\r
+\r
+ LOCAL VARIABLES\r
+\r
+=============================================================================\r
+*/\r
+\r
+void DebugMemory (void);\r
+void TestSprites(void);\r
+int DebugKeys (void);\r
+void ShutdownId (void);\r
+void Quit (char *error);\r
+void InitGame (void);\r
+void main (void);\r
+\r
+//===========================================================================\r
+\r
+#if FRILLS\r
+\r
+/*\r
+==================\r
+=\r
+= DebugMemory\r
+=\r
+==================\r
+*/\r
+\r
+void DebugMemory (void)\r
+{\r
+ VW_FixRefreshBuffer ();\r
+ US_CenterWindow (16,7);\r
+\r
+ US_CPrint ("Memory Usage");\r
+ US_CPrint ("------------");\r
+ US_Print ("Total :");\r
+ US_PrintUnsigned (mminfo.mainmem/1024);\r
+ US_Print ("k\nFree :");\r
+ US_PrintUnsigned (MM_UnusedMemory()/1024);\r
+ US_Print ("k\nWith purge:");\r
+ US_PrintUnsigned (MM_TotalFree()/1024);\r
+ US_Print ("k\n");\r
+ VW_UpdateScreen();\r
+ IN_Ack ();\r
+#if GRMODE == EGAGR\r
+ MM_ShowMemory ();\r
+#endif\r
+}\r
+\r
+/*\r
+===================\r
+=\r
+= TestSprites\r
+=\r
+===================\r
+*/\r
+\r
+#define DISPWIDTH 110\r
+#define TEXTWIDTH 40\r
+void TestSprites(void)\r
+{\r
+ int hx,hy,sprite,oldsprite,bottomy,topx,shift;\r
+ spritetabletype far *spr;\r
+ spritetype _seg *block;\r
+ unsigned mem,scan;\r
+\r
+\r
+ VW_FixRefreshBuffer ();\r
+ US_CenterWindow (30,17);\r
+\r
+ US_CPrint ("Sprite Test");\r
+ US_CPrint ("-----------");\r
+\r
+ hy=PrintY;\r
+ hx=(PrintX+56)&(~7);\r
+ topx = hx+TEXTWIDTH;\r
+\r
+ US_Print ("Chunk:\nWidth:\nHeight:\nOrgx:\nOrgy:\nXl:\nYl:\nXh:\nYh:\n"\r
+ "Shifts:\nMem:\n");\r
+\r
+ bottomy = PrintY;\r
+\r
+ sprite = STARTSPRITES;\r
+ shift = 0;\r
+\r
+ do\r
+ {\r
+ if (sprite>=STARTTILE8)\r
+ sprite = STARTTILE8-1;\r
+ else if (sprite<STARTSPRITES)\r
+ sprite = STARTSPRITES;\r
+\r
+ spr = &spritetable[sprite-STARTSPRITES];\r
+ block = (spritetype _seg *)grsegs[sprite];\r
+\r
+ VWB_Bar (hx,hy,TEXTWIDTH,bottomy-hy,WHITE);\r
+\r
+ PrintX=hx;\r
+ PrintY=hy;\r
+ US_PrintUnsigned (sprite);US_Print ("\n");PrintX=hx;\r
+ US_PrintUnsigned (spr->width);US_Print ("\n");PrintX=hx;\r
+ US_PrintUnsigned (spr->height);US_Print ("\n");PrintX=hx;\r
+ US_PrintSigned (spr->orgx);US_Print ("\n");PrintX=hx;\r
+ US_PrintSigned (spr->orgy);US_Print ("\n");PrintX=hx;\r
+ US_PrintSigned (spr->xl);US_Print ("\n");PrintX=hx;\r
+ US_PrintSigned (spr->yl);US_Print ("\n");PrintX=hx;\r
+ US_PrintSigned (spr->xh);US_Print ("\n");PrintX=hx;\r
+ US_PrintSigned (spr->yh);US_Print ("\n");PrintX=hx;\r
+ US_PrintSigned (spr->shifts);US_Print ("\n");PrintX=hx;\r
+ if (!block)\r
+ {\r
+ US_Print ("-----");\r
+ }\r
+ else\r
+ {\r
+ mem = block->sourceoffset[3]+5*block->planesize[3];\r
+ mem = (mem+15)&(~15); // round to paragraphs\r
+ US_PrintUnsigned (mem);\r
+ }\r
+\r
+ oldsprite = sprite;\r
+ do\r
+ {\r
+ //\r
+ // draw the current shift, then wait for key\r
+ //\r
+ VWB_Bar(topx,hy,DISPWIDTH,bottomy-hy,WHITE);\r
+ if (block)\r
+ {\r
+ PrintX = topx;\r
+ PrintY = hy;\r
+ US_Print ("Shift:");\r
+ US_PrintUnsigned (shift);\r
+ US_Print ("\n");\r
+ VWB_DrawSprite (topx+16+shift*2,PrintY,sprite);\r
+ }\r
+\r
+ VW_UpdateScreen();\r
+\r
+ scan = IN_WaitForKey ();\r
+\r
+ switch (scan)\r
+ {\r
+ case sc_UpArrow:\r
+ sprite++;\r
+ break;\r
+ case sc_DownArrow:\r
+ sprite--;\r
+ break;\r
+ case sc_LeftArrow:\r
+ if (--shift == -1)\r
+ shift = 3;\r
+ break;\r
+ case sc_RightArrow:\r
+ if (++shift == 4)\r
+ shift = 0;\r
+ break;\r
+ case sc_Escape:\r
+ return;\r
+ }\r
+\r
+ } while (sprite == oldsprite);\r
+\r
+ } while (1);\r
+\r
+\r
+}\r
+\r
+#endif\r
+\r
+\r
+/*\r
+================\r
+=\r
+= DebugKeys\r
+=\r
+================\r
+*/\r
+int DebugKeys (void)\r
+{\r
+ boolean esc;\r
+ int level;\r
+\r
+#if FRILLS\r
+ if (Keyboard[0x12] && ingame) // DEBUG: end + 'E' to quit level\r
+ {\r
+ if (tedlevel)\r
+ TEDDeath();\r
+ playstate = levelcomplete;\r
+ }\r
+#endif\r
+\r
+ if (Keyboard[0x22] && ingame) // G = god mode\r
+ {\r
+ VW_FixRefreshBuffer ();\r
+ US_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
+ else if (Keyboard[0x17]) // I = item cheat\r
+ {\r
+ VW_FixRefreshBuffer ();\r
+ US_CenterWindow (12,3);\r
+ US_PrintCentered ("Free items!");\r
+ gamestate.boobusbombs=99;\r
+ gamestate.flowerpowers=99;\r
+ gamestate.keys=99;\r
+ VW_UpdateScreen();\r
+ IN_Ack ();\r
+ return 1;\r
+ }\r
+ else if (Keyboard[0x24]) // J = jump cheat\r
+ {\r
+ jumpcheat^=1;\r
+ VW_FixRefreshBuffer ();\r
+ US_CenterWindow (18,3);\r
+ if (jumpcheat)\r
+ US_PrintCentered ("Jump cheat ON");\r
+ else\r
+ US_PrintCentered ("Jump cheat OFF");\r
+ VW_UpdateScreen();\r
+ IN_Ack ();\r
+ return 1;\r
+ }\r
+#if FRILLS\r
+ else if (Keyboard[0x32]) // M = memory info\r
+ {\r
+ DebugMemory();\r
+ return 1;\r
+ }\r
+#endif\r
+ else if (Keyboard[0x19]) // P = pause with no screen disruptioon\r
+ {\r
+ IN_Ack();\r
+ }\r
+ else if (Keyboard[0x1f] && ingame) // S = slow motion\r
+ {\r
+ singlestep^=1;\r
+ VW_FixRefreshBuffer ();\r
+ US_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
+#if FRILLS\r
+ else if (Keyboard[0x14]) // T = sprite test\r
+ {\r
+ TestSprites();\r
+ return 1;\r
+ }\r
+#endif\r
+ else if (Keyboard[0x11] && ingame) // W = warp to level\r
+ {\r
+ VW_FixRefreshBuffer ();\r
+ US_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<=16)\r
+ {\r
+ gamestate.mapon = level;\r
+ playstate = warptolevel;\r
+ }\r
+ }\r
+ return 1;\r
+ }\r
+ return 0;\r
+}\r
+\r
+//===========================================================================\r
+\r
+/*\r
+==========================\r
+=\r
+= ShutdownId\r
+=\r
+= Shuts down all ID_?? managers\r
+=\r
+==========================\r
+*/\r
+\r
+void ShutdownId (void)\r
+{\r
+ US_Shutdown ();\r
+ SD_Shutdown ();\r
+ IN_Shutdown ();\r
+ RF_Shutdown ();\r
+ VW_Shutdown ();\r
+ CA_Shutdown ();\r
+ MM_Shutdown ();\r
+}\r
+\r
+//===========================================================================\r
+\r
+/*\r
+==========================\r
+=\r
+= Quit\r
+=\r
+==========================\r
+*/\r
+\r
+void Quit (char *error)\r
+{\r
+ ShutdownId ();\r
+ if (error && *error)\r
+ {\r
+ clrscr();\r
+ puts(error);\r
+ puts("\n");\r
+ exit(1);\r
+ }\r
+ exit (0);\r
+}\r
+\r
+//===========================================================================\r
+\r
+/*\r
+==========================\r
+=\r
+= InitGame\r
+=\r
+= Load a few things right away\r
+=\r
+==========================\r
+*/\r
+\r
+#if 0\r
+#include "piracy.h"\r
+#endif\r
+\r
+void InitGame (void)\r
+{\r
+ int i;\r
+\r
+ MM_Startup ();\r
+\r
+\r
+#if 0\r
+ // Handle piracy screen...\r
+ //\r
+ movedata(FP_SEG(PIRACY),(unsigned)PIRACY,0xb800,displayofs,4000);\r
+ while ((bioskey(0)>>8) != sc_Return);\r
+#endif\r
+\r
+\r
+#if GRMODE == EGAGR\r
+ if (mminfo.mainmem < 335l*1024)\r
+ {\r
+#pragma warn -pro\r
+#pragma warn -nod\r
+ clrscr(); // we can't include CONIO because of a name conflict\r
+#pragma warn +nod\r
+#pragma warn +pro\r
+ puts ("There is not enough memory available to play the game reliably. You can");\r
+ puts ("play anyway, but an out of memory condition will eventually pop up. The");\r
+ puts ("correct solution is to unload some TSRs or rename your CONFIG.SYS and");\r
+ puts ("AUTOEXEC.BAT to free up more memory.\n");\r
+ puts ("Do you want to (Q)uit, or (C)ontinue?");\r
+ i = bioskey (0);\r
+ if ( (i>>8) != sc_C)\r
+ Quit ("");\r
+ }\r
+#endif\r
+\r
+ US_TextScreen();\r
+\r
+ VW_Startup ();\r
+ RF_Startup ();\r
+ IN_Startup ();\r
+ SD_Startup ();\r
+ US_Startup ();\r
+\r
+// US_UpdateTextScreen();\r
+\r
+ CA_Startup ();\r
+ US_Setup ();\r
+\r
+//\r
+// load in and lock down some basic chunks\r
+//\r
+\r
+ CA_ClearMarks ();\r
+\r
+ CA_MarkGrChunk(STARTFONT);\r
+ CA_MarkGrChunk(STARTFONTM);\r
+ CA_MarkGrChunk(STARTTILE8);\r
+ CA_MarkGrChunk(STARTTILE8M);\r
+ for (i=KEEN_LUMP_START;i<=KEEN_LUMP_END;i++)\r
+ CA_MarkGrChunk(i);\r
+\r
+ CA_CacheMarks (NULL, 0);\r
+\r
+ MM_SetLock (&grsegs[STARTFONT],true);\r
+ MM_SetLock (&grsegs[STARTFONTM],true);\r
+ MM_SetLock (&grsegs[STARTTILE8],true);\r
+ MM_SetLock (&grsegs[STARTTILE8M],true);\r
+ for (i=KEEN_LUMP_START;i<=KEEN_LUMP_END;i++)\r
+ MM_SetLock (&grsegs[i],true);\r
+\r
+ CA_LoadAllSounds ();\r
+\r
+ fontcolor = WHITE;\r
+\r
+ US_FinishTextScreen();\r
+\r
+ VW_SetScreenMode (GRMODE);\r
+ VW_ClearVideo (BLACK);\r
+}\r
+\r
+\r
+\r
+//===========================================================================\r
+\r
+/*\r
+==========================\r
+=\r
+= main\r
+=\r
+==========================\r
+*/\r
+\r
+void main (void)\r
+{\r
+ short i;\r
+\r
+ if (stricmp(_argv[1], "/VER") == 0)\r
+ {\r
+ printf("\nKeen Dreams version 1.93 (Rev 1)\n");\r
+ printf("developed for use with 100%% IBM compatibles\n");\r
+ printf("that have 640K memory, DOS version 3.3 or later,\n");\r
+ printf("and an EGA or VGA display adapter.\n");\r
+ printf("Copyright 1991-1993 Softdisk Publishing.\n");\r
+ printf("Commander Keen is a trademark of Id Software.\n");\r
+ exit(0);\r
+ }\r
+\r
+ if (stricmp(_argv[1], "/?") == 0)\r
+ {\r
+ printf("\nKeen Dreams version 1.93\n");\r
+ printf("Copyright 1991-1993 Softdisk Publishing.\n\n");\r
+ printf("Commander Keen is a trademark of Id Software.\n");\r
+ printf("Type KDREAMS from the DOS prompt to run.\n\n");\r
+ printf("KDREAMS /COMP for SVGA compatibility mode\n");\r
+ printf("KDREAMS /NODR stops program hang with the drive still on\n");\r
+ printf("KDREAMS /NOAL disables AdLib and Sound Blaster detection\n");\r
+ printf("KDREAMS /NOSB disables Sound Blaster detection\n");\r
+ printf("KDREAMS /NOJOYS ignores joystick\n");\r
+ printf("KDREAMS /NOMOUSE ignores mouse\n");\r
+ printf("KDREAMS /HIDDENCARD overrides video card detection\n");\r
+ printf("KDREAMS /VER for version and compatibility information\n");\r
+ printf("KDREAMS /? for this help information\n");\r
+ exit(0);\r
+ }\r
+\r
+ textcolor(7);\r
+ textbackground(0);\r
+\r
+ InitGame();\r
+\r
+ DemoLoop(); // DemoLoop calls Quit when everything is done\r
+ Quit("Demo loop exited???");\r
+}\r
+\r