--- /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_DEMO.C\r
+\r
+#include <dir.h>\r
+#include "KD_DEF.H"\r
+\r
+#pragma hdrstop\r
+\r
+#define RLETAG 0xABCD\r
+\r
+/*\r
+=============================================================================\r
+\r
+ LOCAL CONSTANTS\r
+\r
+=============================================================================\r
+*/\r
+\r
+/*\r
+=============================================================================\r
+\r
+ GLOBAL VARIABLES\r
+\r
+=============================================================================\r
+*/\r
+\r
+\r
+/*\r
+=============================================================================\r
+\r
+ LOCAL VARIABLES\r
+\r
+=============================================================================\r
+*/\r
+\r
+//===========================================================================\r
+\r
+/*\r
+=====================\r
+=\r
+= NewGame\r
+=\r
+= Set up new game to start from the beginning\r
+=\r
+=====================\r
+*/\r
+\r
+void NewGame (void)\r
+{\r
+ word i;\r
+\r
+ gamestate.worldx = 0; // spawn keen at starting spot\r
+\r
+ gamestate.mapon = 0;\r
+ gamestate.score = 0;\r
+ gamestate.nextextra = 20000;\r
+ gamestate.lives = 3;\r
+ gamestate.flowerpowers = gamestate.boobusbombs = 0;\r
+ for (i = 0;i < GAMELEVELS;i++)\r
+ gamestate.leveldone[i] = false;\r
+}\r
+\r
+//===========================================================================\r
+\r
+/*\r
+=====================\r
+=\r
+= WaitOrKey\r
+=\r
+=====================\r
+*/\r
+\r
+int WaitOrKey (int vbls)\r
+{\r
+ while (vbls--)\r
+ {\r
+ IN_ReadControl(0,&c); // get player input\r
+ if (LastScan || c.button0 || c.button1)\r
+ {\r
+ IN_ClearKeysDown ();\r
+ return 1;\r
+ }\r
+ VW_WaitVBL(1);\r
+ }\r
+ return 0;\r
+}\r
+\r
+//===========================================================================\r
+\r
+/*\r
+=====================\r
+=\r
+= GameOver\r
+=\r
+=====================\r
+*/\r
+\r
+void\r
+GameOver (void)\r
+{\r
+ VW_InitDoubleBuffer ();\r
+ US_CenterWindow (16,3);\r
+\r
+ US_PrintCentered("Game Over!");\r
+\r
+ VW_UpdateScreen ();\r
+ IN_ClearKeysDown ();\r
+ IN_Ack ();\r
+\r
+}\r
+\r
+\r
+//===========================================================================\r
+\r
+/*\r
+==================\r
+=\r
+= StatusWindow\r
+=\r
+==================\r
+*/\r
+\r
+void StatusWindow (void)\r
+{\r
+ word x;\r
+\r
+ // DEBUG - make this look better\r
+\r
+ US_CenterWindow(22,7);\r
+ US_CPrint("Status Window");\r
+\r
+ WindowX += 8;\r
+ WindowW -= 8;\r
+ WindowY += 20;\r
+ WindowH -= 20;\r
+ PrintX = WindowX;\r
+ PrintY = WindowY;\r
+\r
+ VWB_DrawTile8(PrintX,PrintY,26);\r
+ VWB_DrawTile8(PrintX + 8,PrintY,27);\r
+ PrintX += 24;\r
+ US_PrintUnsigned(gamestate.lives);\r
+ US_Print("\n");\r
+\r
+ VWB_DrawTile8(PrintX,PrintY,32);\r
+ VWB_DrawTile8(PrintX + 8,PrintY,33);\r
+ VWB_DrawTile8(PrintX,PrintY + 8,34);\r
+ VWB_DrawTile8(PrintX + 8,PrintY + 8,35);\r
+ PrintX += 24;\r
+ US_PrintUnsigned(gamestate.boobusbombs);\r
+ US_Print("\n");\r
+\r
+ WindowX += 50;\r
+ WindowW -= 50;\r
+ PrintX = WindowX;\r
+ PrintY = WindowY;\r
+\r
+ fontcolor = F_FIRSTCOLOR;\r
+ US_Print("Next ");\r
+ fontcolor = F_BLACK;\r
+ x = PrintX;\r
+ VWB_DrawTile8(PrintX,PrintY,26);\r
+ VWB_DrawTile8(PrintX + 8,PrintY,27);\r
+ PrintX += 24;\r
+ US_PrintUnsigned(gamestate.nextextra);\r
+ US_Print("\n");\r
+\r
+ PrintX = x;\r
+ VWB_DrawTile8(PrintX,PrintY,24);\r
+ VWB_DrawTile8(PrintX + 8,PrintY,25);\r
+ PrintX += 24;\r
+ US_PrintUnsigned(gamestate.keys);\r
+ US_Print("\n");\r
+\r
+ // DEBUG - add flower powers (#36)\r
+\r
+ VW_UpdateScreen();\r
+ IN_Ack();\r
+}\r
+\r
+boolean\r
+SaveGame(int file)\r
+{\r
+ word i,size,compressed,expanded;\r
+ objtype *o;\r
+ memptr bigbuffer;\r
+\r
+ if (!CA_FarWrite(file,(void far *)&gamestate,sizeof(gamestate)))\r
+ return(false);\r
+\r
+ expanded = mapwidth * mapheight * 2;\r
+ MM_GetPtr (&bigbuffer,expanded);\r
+\r
+ for (i = 0;i < 3;i++) // Write all three planes of the map\r
+ {\r
+//\r
+// leave a word at start of compressed data for compressed length\r
+//\r
+ compressed = CA_RLEWCompress ((unsigned huge *)mapsegs[i]\r
+ ,expanded,((unsigned huge *)bigbuffer)+1,RLETAG);\r
+\r
+ *(unsigned huge *)bigbuffer = compressed;\r
+\r
+ if (!CA_FarWrite(file,(void far *)bigbuffer,compressed+2) )\r
+ {\r
+ MM_FreePtr (&bigbuffer);\r
+ return(false);\r
+ }\r
+ }\r
+\r
+ for (o = player;o;o = o->next)\r
+ if (!CA_FarWrite(file,(void far *)o,sizeof(objtype)))\r
+ {\r
+ MM_FreePtr (&bigbuffer);\r
+ return(false);\r
+ }\r
+\r
+ MM_FreePtr (&bigbuffer);\r
+ return(true);\r
+}\r
+\r
+\r
+boolean\r
+LoadGame(int file)\r
+{\r
+ word i,j,size;\r
+ objtype *o;\r
+ int orgx,orgy;\r
+ objtype *prev,*next,*followed;\r
+ unsigned compressed,expanded;\r
+ memptr bigbuffer;\r
+\r
+ if (!CA_FarRead(file,(void far *)&gamestate,sizeof(gamestate)))\r
+ return(false);\r
+\r
+// drop down a cache level and mark everything, so when the option screen\r
+// is exited it will be cached\r
+\r
+ ca_levelbit >>= 1;\r
+ ca_levelnum--;\r
+\r
+ SetupGameLevel (false); // load in and cache the base old level\r
+ titleptr[ca_levelnum] = levelnames[mapon];\r
+\r
+ ca_levelbit <<= 1;\r
+ ca_levelnum ++;\r
+\r
+ expanded = mapwidth * mapheight * 2;\r
+ MM_GetPtr (&bigbuffer,expanded);\r
+\r
+ for (i = 0;i < 3;i++) // Read all three planes of the map\r
+ {\r
+ if (!CA_FarRead(file,(void far *)&compressed,sizeof(compressed)) )\r
+ {\r
+ MM_FreePtr (&bigbuffer);\r
+ return(false);\r
+ }\r
+\r
+ if (!CA_FarRead(file,(void far *)bigbuffer,compressed) )\r
+ {\r
+ MM_FreePtr (&bigbuffer);\r
+ return(false);\r
+ }\r
+\r
+ CA_RLEWexpand ((unsigned huge *)bigbuffer,\r
+ (unsigned huge *)mapsegs[i],compressed,RLETAG);\r
+ }\r
+\r
+ MM_FreePtr (&bigbuffer);\r
+\r
+ // Read the object list back in - assumes at least one object in list\r
+\r
+ InitObjArray ();\r
+ new = player;\r
+ prev = new->prev;\r
+ next = new->next;\r
+ if (!CA_FarRead(file,(void far *)new,sizeof(objtype)))\r
+ return(false);\r
+ new->prev = prev;\r
+ new->next = next;\r
+ new->needtoreact = true;\r
+ new->sprite = NULL;\r
+ new = scoreobj;\r
+ while (true)\r
+ {\r
+ prev = new->prev;\r
+ next = new->next;\r
+ if (!CA_FarRead(file,(void far *)new,sizeof(objtype)))\r
+ return(false);\r
+ followed = new->next;\r
+ new->prev = prev;\r
+ new->next = next;\r
+ new->needtoreact = true;\r
+ new->sprite = NULL;\r
+\r
+ if (followed)\r
+ GetNewObj (false);\r
+ else\r
+ break;\r
+ }\r
+\r
+ *((long *)&(scoreobj->temp1)) = -1; // force score to be updated\r
+ scoreobj->temp3 = -1; // and flower power\r
+ scoreobj->temp4 = -1; // and lives\r
+\r
+ return(true);\r
+}\r
+\r
+void\r
+ResetGame(void)\r
+{\r
+ NewGame ();\r
+\r
+ ca_levelnum--;\r
+ CA_ClearMarks();\r
+ titleptr[ca_levelnum] = NULL; // don't reload old level\r
+ ca_levelnum++;\r
+}\r
+\r
+#if FRILLS\r
+void\r
+TEDDeath(void)\r
+{\r
+ ShutdownId();\r
+ execlp("TED5.EXE","TED5.EXE","/LAUNCH","KDREAMS",NULL);\r
+}\r
+#endif\r
+\r
+static boolean\r
+MoveTitleTo(int offset)\r
+{\r
+ boolean done;\r
+ int dir,\r
+ chunk,\r
+ move;\r
+ longword lasttime,delay;\r
+\r
+ if (offset < originxglobal)\r
+ dir = -1;\r
+ else\r
+ dir = +1;\r
+\r
+ chunk = dir * PIXGLOBAL;\r
+\r
+ done = false;\r
+ delay = 1;\r
+ while (!done)\r
+ {\r
+ lasttime = TimeCount;\r
+ move = delay * chunk;\r
+ if (chunk < 0)\r
+ done = originxglobal + move <= offset;\r
+ else\r
+ done = originxglobal + move >= offset;\r
+ if (!done)\r
+ {\r
+ RF_Scroll(move,0);\r
+ RF_Refresh();\r
+ }\r
+ if (IN_IsUserInput())\r
+ return(true);\r
+ delay = TimeCount - lasttime;\r
+ }\r
+ if (originxglobal != offset)\r
+ {\r
+ RF_Scroll(offset - originxglobal,0);\r
+ RF_Refresh();\r
+ }\r
+ return(false);\r
+}\r
+\r
+static boolean\r
+Wait(longword time)\r
+{\r
+ time += TimeCount;\r
+ while ((TimeCount < time) && (!IN_IsUserInput()))\r
+ {\r
+ if (!(TimeCount % MINTICS))\r
+ RF_Refresh();\r
+ }\r
+ return(IN_IsUserInput());\r
+}\r
+\r
+static boolean\r
+ShowText(int offset,WindowRec *wr,char *s)\r
+{\r
+ if (MoveTitleTo(offset))\r
+ return(true);\r
+\r
+ US_RestoreWindow(wr);\r
+ US_CPrint(s);\r
+ VW_UpdateScreen();\r
+\r
+ if (Wait(TickBase * 5))\r
+ return(true);\r
+\r
+ US_RestoreWindow(wr);\r
+ US_CPrint(s);\r
+ VW_UpdateScreen();\r
+ return(false);\r
+}\r
+\r
+/*\r
+=====================\r
+=\r
+= DemoLoop\r
+=\r
+=====================\r
+*/\r
+\r
+void\r
+DemoLoop (void)\r
+{\r
+ char *s;\r
+ word move;\r
+ longword lasttime;\r
+ char *FileName1;\r
+ struct Shape FileShape1;\r
+#if CREDITS\r
+ char *FileName2;\r
+ struct Shape FileShape2;\r
+#endif\r
+ struct ffblk ffblk;\r
+ WindowRec mywin;\r
+ int bufsave = bufferofs;\r
+ int dissave = displayofs;\r
+\r
+\r
+#if FRILLS\r
+//\r
+// check for launch from ted\r
+//\r
+ if (tedlevel)\r
+ {\r
+ NewGame();\r
+ gamestate.mapon = tedlevelnum;\r
+ GameLoop();\r
+ TEDDeath();\r
+ }\r
+#endif\r
+\r
+//\r
+// demo loop\r
+//\r
+ US_SetLoadSaveHooks(LoadGame,SaveGame,ResetGame);\r
+ restartgame = gd_Continue;\r
+\r
+ if (findfirst("KDREAMS.CMP", &ffblk, 0) == -1)\r
+ Quit("Couldn't find KDREAMS.CMP");\r
+\r
+ while (true)\r
+ {\r
+\r
+ loadedgame = false;\r
+\r
+ FileName1 = "TITLESCR.LBM";\r
+ if (LoadLIBShape("KDREAMS.CMP", FileName1, &FileShape1))\r
+ Quit("Can't load TITLE SCREEN");\r
+#if CREDITS\r
+ FileName2 = "CREDITS.LBM";\r
+ if (LoadLIBShape("KDREAMS.CMP", FileName2, &FileShape2))\r
+ Quit("Can't load CREDITS SCREEN");\r
+#endif\r
+\r
+ while (!restartgame && !loadedgame)\r
+ {\r
+\r
+ VW_InitDoubleBuffer();\r
+ IN_ClearKeysDown();\r
+\r
+ while (true)\r
+ {\r
+\r
+ VW_SetScreen(0, 0);\r
+ MoveGfxDst(0, 200);\r
+ UnpackEGAShapeToScreen(&FileShape1, 0, 0);\r
+ VW_ScreenToScreen (64*200,0,40,200);\r
+\r
+#if CREDITS\r
+ if (IN_UserInput(TickBase * 8, false))\r
+ break;\r
+#else\r
+ if (IN_UserInput(TickBase * 4, false))\r
+ break;\r
+#endif\r
+\r
+#if CREDITS\r
+ MoveGfxDst(0, 200);\r
+ UnpackEGAShapeToScreen(&FileShape2, 0, 0);\r
+ VW_ScreenToScreen (64*200,0,40,200);\r
+\r
+ if (IN_UserInput(TickBase * 7, false))\r
+ break;\r
+#else\r
+ MoveGfxDst(0, 200);\r
+ UnpackEGAShapeToScreen(&FileShape1, 0, 0);\r
+ VW_ScreenToScreen (64*200,0,40,200);\r
+\r
+ if (IN_UserInput(TickBase * 3, false))\r
+ break;\r
+#endif\r
+\r
+ displayofs = 0;\r
+ VWB_Bar(0,0,320,200,FIRSTCOLOR);\r
+ US_DisplayHighScores(-1);\r
+\r
+ if (IN_UserInput(TickBase * 6, false))\r
+ break;\r
+\r
+ }\r
+\r
+ bufferofs = bufsave;\r
+ displayofs = dissave;\r
+\r
+ VW_FixRefreshBuffer();\r
+ US_ControlPanel ();\r
+ }\r
+\r
+ if (!loadedgame)\r
+ NewGame();\r
+\r
+ FreeShape(&FileShape1);\r
+#if CREDITS\r
+ FreeShape(&FileShape2);\r
+#endif\r
+ GameLoop();\r
+ }\r
+}\r