]> 4ch.mooo.com Git - 16.git/blobdiff - src/lib/hb/kd_demo.c
[16_ca needs huge amounts of work and I should remember what needs to be done soon...
[16.git] / src / lib / hb / kd_demo.c
diff --git a/src/lib/hb/kd_demo.c b/src/lib/hb/kd_demo.c
new file mode 100755 (executable)
index 0000000..4469a92
--- /dev/null
@@ -0,0 +1,545 @@
+/* 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