]> 4ch.mooo.com Git - 16.git/blob - 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
1 /* Keen Dreams Source Code\r
2  * Copyright (C) 2014 Javier M. Chavez\r
3  *\r
4  * This program is free software; you can redistribute it and/or modify\r
5  * it under the terms of the GNU General Public License as published by\r
6  * the Free Software Foundation; either version 2 of the License, or\r
7  * (at your option) any later version.\r
8  *\r
9  * This program is distributed in the hope that it will be useful,\r
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
12  * GNU General Public License for more details.\r
13  *\r
14  * You should have received a copy of the GNU General Public License along\r
15  * with this program; if not, write to the Free Software Foundation, Inc.,\r
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
17  */\r
18 \r
19 // KD_DEMO.C\r
20 \r
21 #include <dir.h>\r
22 #include "KD_DEF.H"\r
23 \r
24 #pragma hdrstop\r
25 \r
26 #define RLETAG  0xABCD\r
27 \r
28 /*\r
29 =============================================================================\r
30 \r
31                                                  LOCAL CONSTANTS\r
32 \r
33 =============================================================================\r
34 */\r
35 \r
36 /*\r
37 =============================================================================\r
38 \r
39                                                  GLOBAL VARIABLES\r
40 \r
41 =============================================================================\r
42 */\r
43 \r
44 \r
45 /*\r
46 =============================================================================\r
47 \r
48                                                  LOCAL VARIABLES\r
49 \r
50 =============================================================================\r
51 */\r
52 \r
53 //===========================================================================\r
54 \r
55 /*\r
56 =====================\r
57 =\r
58 = NewGame\r
59 =\r
60 = Set up new game to start from the beginning\r
61 =\r
62 =====================\r
63 */\r
64 \r
65 void NewGame (void)\r
66 {\r
67         word    i;\r
68 \r
69         gamestate.worldx = 0;           // spawn keen at starting spot\r
70 \r
71         gamestate.mapon = 0;\r
72         gamestate.score = 0;\r
73         gamestate.nextextra = 20000;\r
74         gamestate.lives = 3;\r
75         gamestate.flowerpowers = gamestate.boobusbombs = 0;\r
76         for (i = 0;i < GAMELEVELS;i++)\r
77                 gamestate.leveldone[i] = false;\r
78 }\r
79 \r
80 //===========================================================================\r
81 \r
82 /*\r
83 =====================\r
84 =\r
85 = WaitOrKey\r
86 =\r
87 =====================\r
88 */\r
89 \r
90 int WaitOrKey (int vbls)\r
91 {\r
92         while (vbls--)\r
93         {\r
94                 IN_ReadControl(0,&c);           // get player input\r
95                 if (LastScan || c.button0 || c.button1)\r
96                 {\r
97                         IN_ClearKeysDown ();\r
98                         return 1;\r
99                 }\r
100                 VW_WaitVBL(1);\r
101         }\r
102         return 0;\r
103 }\r
104 \r
105 //===========================================================================\r
106 \r
107 /*\r
108 =====================\r
109 =\r
110 = GameOver\r
111 =\r
112 =====================\r
113 */\r
114 \r
115 void\r
116 GameOver (void)\r
117 {\r
118         VW_InitDoubleBuffer ();\r
119         US_CenterWindow (16,3);\r
120 \r
121         US_PrintCentered("Game Over!");\r
122 \r
123         VW_UpdateScreen ();\r
124         IN_ClearKeysDown ();\r
125         IN_Ack ();\r
126 \r
127 }\r
128 \r
129 \r
130 //===========================================================================\r
131 \r
132 /*\r
133 ==================\r
134 =\r
135 = StatusWindow\r
136 =\r
137 ==================\r
138 */\r
139 \r
140 void StatusWindow (void)\r
141 {\r
142         word    x;\r
143 \r
144         // DEBUG - make this look better\r
145 \r
146         US_CenterWindow(22,7);\r
147         US_CPrint("Status Window");\r
148 \r
149         WindowX += 8;\r
150         WindowW -= 8;\r
151         WindowY += 20;\r
152         WindowH -= 20;\r
153         PrintX = WindowX;\r
154         PrintY = WindowY;\r
155 \r
156         VWB_DrawTile8(PrintX,PrintY,26);\r
157         VWB_DrawTile8(PrintX + 8,PrintY,27);\r
158         PrintX += 24;\r
159         US_PrintUnsigned(gamestate.lives);\r
160         US_Print("\n");\r
161 \r
162         VWB_DrawTile8(PrintX,PrintY,32);\r
163         VWB_DrawTile8(PrintX + 8,PrintY,33);\r
164         VWB_DrawTile8(PrintX,PrintY + 8,34);\r
165         VWB_DrawTile8(PrintX + 8,PrintY + 8,35);\r
166         PrintX += 24;\r
167         US_PrintUnsigned(gamestate.boobusbombs);\r
168         US_Print("\n");\r
169 \r
170         WindowX += 50;\r
171         WindowW -= 50;\r
172         PrintX = WindowX;\r
173         PrintY = WindowY;\r
174 \r
175         fontcolor = F_FIRSTCOLOR;\r
176         US_Print("Next ");\r
177         fontcolor = F_BLACK;\r
178         x = PrintX;\r
179         VWB_DrawTile8(PrintX,PrintY,26);\r
180         VWB_DrawTile8(PrintX + 8,PrintY,27);\r
181         PrintX += 24;\r
182         US_PrintUnsigned(gamestate.nextextra);\r
183         US_Print("\n");\r
184 \r
185         PrintX = x;\r
186         VWB_DrawTile8(PrintX,PrintY,24);\r
187         VWB_DrawTile8(PrintX + 8,PrintY,25);\r
188         PrintX += 24;\r
189         US_PrintUnsigned(gamestate.keys);\r
190         US_Print("\n");\r
191 \r
192         // DEBUG - add flower powers (#36)\r
193 \r
194         VW_UpdateScreen();\r
195         IN_Ack();\r
196 }\r
197 \r
198 boolean\r
199 SaveGame(int file)\r
200 {\r
201         word    i,size,compressed,expanded;\r
202         objtype *o;\r
203         memptr  bigbuffer;\r
204 \r
205         if (!CA_FarWrite(file,(void far *)&gamestate,sizeof(gamestate)))\r
206                 return(false);\r
207 \r
208         expanded = mapwidth * mapheight * 2;\r
209         MM_GetPtr (&bigbuffer,expanded);\r
210 \r
211         for (i = 0;i < 3;i++)   // Write all three planes of the map\r
212         {\r
213 //\r
214 // leave a word at start of compressed data for compressed length\r
215 //\r
216                 compressed = CA_RLEWCompress ((unsigned huge *)mapsegs[i]\r
217                         ,expanded,((unsigned huge *)bigbuffer)+1,RLETAG);\r
218 \r
219                 *(unsigned huge *)bigbuffer = compressed;\r
220 \r
221                 if (!CA_FarWrite(file,(void far *)bigbuffer,compressed+2) )\r
222                 {\r
223                         MM_FreePtr (&bigbuffer);\r
224                         return(false);\r
225                 }\r
226         }\r
227 \r
228         for (o = player;o;o = o->next)\r
229                 if (!CA_FarWrite(file,(void far *)o,sizeof(objtype)))\r
230                 {\r
231                         MM_FreePtr (&bigbuffer);\r
232                         return(false);\r
233                 }\r
234 \r
235         MM_FreePtr (&bigbuffer);\r
236         return(true);\r
237 }\r
238 \r
239 \r
240 boolean\r
241 LoadGame(int file)\r
242 {\r
243         word    i,j,size;\r
244         objtype *o;\r
245         int orgx,orgy;\r
246         objtype         *prev,*next,*followed;\r
247         unsigned        compressed,expanded;\r
248         memptr  bigbuffer;\r
249 \r
250         if (!CA_FarRead(file,(void far *)&gamestate,sizeof(gamestate)))\r
251                 return(false);\r
252 \r
253 // drop down a cache level and mark everything, so when the option screen\r
254 // is exited it will be cached\r
255 \r
256         ca_levelbit >>= 1;\r
257         ca_levelnum--;\r
258 \r
259         SetupGameLevel (false);         // load in and cache the base old level\r
260         titleptr[ca_levelnum] = levelnames[mapon];\r
261 \r
262         ca_levelbit <<= 1;\r
263         ca_levelnum ++;\r
264 \r
265         expanded = mapwidth * mapheight * 2;\r
266         MM_GetPtr (&bigbuffer,expanded);\r
267 \r
268         for (i = 0;i < 3;i++)   // Read all three planes of the map\r
269         {\r
270                 if (!CA_FarRead(file,(void far *)&compressed,sizeof(compressed)) )\r
271                 {\r
272                         MM_FreePtr (&bigbuffer);\r
273                         return(false);\r
274                 }\r
275 \r
276                 if (!CA_FarRead(file,(void far *)bigbuffer,compressed) )\r
277                 {\r
278                         MM_FreePtr (&bigbuffer);\r
279                         return(false);\r
280                 }\r
281 \r
282                 CA_RLEWexpand ((unsigned huge *)bigbuffer,\r
283                         (unsigned huge *)mapsegs[i],compressed,RLETAG);\r
284         }\r
285 \r
286         MM_FreePtr (&bigbuffer);\r
287 \r
288         // Read the object list back in - assumes at least one object in list\r
289 \r
290         InitObjArray ();\r
291         new = player;\r
292         prev = new->prev;\r
293         next = new->next;\r
294         if (!CA_FarRead(file,(void far *)new,sizeof(objtype)))\r
295                 return(false);\r
296         new->prev = prev;\r
297         new->next = next;\r
298         new->needtoreact = true;\r
299         new->sprite = NULL;\r
300         new = scoreobj;\r
301         while (true)\r
302         {\r
303                 prev = new->prev;\r
304                 next = new->next;\r
305                 if (!CA_FarRead(file,(void far *)new,sizeof(objtype)))\r
306                         return(false);\r
307                 followed = new->next;\r
308                 new->prev = prev;\r
309                 new->next = next;\r
310                 new->needtoreact = true;\r
311                 new->sprite = NULL;\r
312 \r
313                 if (followed)\r
314                         GetNewObj (false);\r
315                 else\r
316                         break;\r
317         }\r
318 \r
319         *((long *)&(scoreobj->temp1)) = -1;             // force score to be updated\r
320         scoreobj->temp3 = -1;                   // and flower power\r
321         scoreobj->temp4 = -1;                   // and lives\r
322 \r
323         return(true);\r
324 }\r
325 \r
326 void\r
327 ResetGame(void)\r
328 {\r
329         NewGame ();\r
330 \r
331         ca_levelnum--;\r
332         CA_ClearMarks();\r
333         titleptr[ca_levelnum] = NULL;           // don't reload old level\r
334         ca_levelnum++;\r
335 }\r
336 \r
337 #if FRILLS\r
338 void\r
339 TEDDeath(void)\r
340 {\r
341         ShutdownId();\r
342         execlp("TED5.EXE","TED5.EXE","/LAUNCH","KDREAMS",NULL);\r
343 }\r
344 #endif\r
345 \r
346 static boolean\r
347 MoveTitleTo(int offset)\r
348 {\r
349         boolean         done;\r
350         int                     dir,\r
351                                 chunk,\r
352                                 move;\r
353         longword        lasttime,delay;\r
354 \r
355         if (offset < originxglobal)\r
356                 dir = -1;\r
357         else\r
358                 dir = +1;\r
359 \r
360         chunk = dir * PIXGLOBAL;\r
361 \r
362         done = false;\r
363         delay = 1;\r
364         while (!done)\r
365         {\r
366                 lasttime = TimeCount;\r
367                 move = delay * chunk;\r
368                 if (chunk < 0)\r
369                         done = originxglobal + move <= offset;\r
370                 else\r
371                         done = originxglobal + move >= offset;\r
372                 if (!done)\r
373                 {\r
374                         RF_Scroll(move,0);\r
375                         RF_Refresh();\r
376                 }\r
377                 if (IN_IsUserInput())\r
378                         return(true);\r
379                 delay = TimeCount - lasttime;\r
380         }\r
381         if (originxglobal != offset)\r
382         {\r
383                 RF_Scroll(offset - originxglobal,0);\r
384                 RF_Refresh();\r
385         }\r
386         return(false);\r
387 }\r
388 \r
389 static boolean\r
390 Wait(longword time)\r
391 {\r
392         time += TimeCount;\r
393         while ((TimeCount < time) && (!IN_IsUserInput()))\r
394         {\r
395                 if (!(TimeCount % MINTICS))\r
396                         RF_Refresh();\r
397         }\r
398         return(IN_IsUserInput());\r
399 }\r
400 \r
401 static boolean\r
402 ShowText(int offset,WindowRec *wr,char *s)\r
403 {\r
404         if (MoveTitleTo(offset))\r
405                 return(true);\r
406 \r
407         US_RestoreWindow(wr);\r
408         US_CPrint(s);\r
409         VW_UpdateScreen();\r
410 \r
411         if (Wait(TickBase * 5))\r
412                 return(true);\r
413 \r
414         US_RestoreWindow(wr);\r
415         US_CPrint(s);\r
416         VW_UpdateScreen();\r
417         return(false);\r
418 }\r
419 \r
420 /*\r
421 =====================\r
422 =\r
423 = DemoLoop\r
424 =\r
425 =====================\r
426 */\r
427 \r
428 void\r
429 DemoLoop (void)\r
430 {\r
431         char            *s;\r
432         word            move;\r
433         longword        lasttime;\r
434         char *FileName1;\r
435         struct Shape FileShape1;\r
436 #if CREDITS\r
437         char *FileName2;\r
438         struct Shape FileShape2;\r
439 #endif\r
440         struct ffblk ffblk;\r
441         WindowRec       mywin;\r
442         int bufsave     = bufferofs;\r
443         int dissave     = displayofs;\r
444 \r
445 \r
446 #if FRILLS\r
447 //\r
448 // check for launch from ted\r
449 //\r
450         if (tedlevel)\r
451         {\r
452                 NewGame();\r
453                 gamestate.mapon = tedlevelnum;\r
454                 GameLoop();\r
455                 TEDDeath();\r
456         }\r
457 #endif\r
458 \r
459 //\r
460 // demo loop\r
461 //\r
462         US_SetLoadSaveHooks(LoadGame,SaveGame,ResetGame);\r
463         restartgame = gd_Continue;\r
464 \r
465         if (findfirst("KDREAMS.CMP", &ffblk, 0) == -1)\r
466                 Quit("Couldn't find KDREAMS.CMP");\r
467 \r
468         while (true)\r
469         {\r
470 \r
471                 loadedgame = false;\r
472 \r
473                 FileName1 = "TITLESCR.LBM";\r
474                 if (LoadLIBShape("KDREAMS.CMP", FileName1, &FileShape1))\r
475                         Quit("Can't load TITLE SCREEN");\r
476 #if CREDITS\r
477                 FileName2 = "CREDITS.LBM";\r
478                 if (LoadLIBShape("KDREAMS.CMP", FileName2, &FileShape2))\r
479                         Quit("Can't load CREDITS SCREEN");\r
480 #endif\r
481 \r
482                 while (!restartgame && !loadedgame)\r
483                 {\r
484 \r
485                         VW_InitDoubleBuffer();\r
486                         IN_ClearKeysDown();\r
487 \r
488                         while (true)\r
489                         {\r
490 \r
491                                 VW_SetScreen(0, 0);\r
492                                 MoveGfxDst(0, 200);\r
493                                 UnpackEGAShapeToScreen(&FileShape1, 0, 0);\r
494                                 VW_ScreenToScreen (64*200,0,40,200);\r
495 \r
496 #if CREDITS\r
497                                 if (IN_UserInput(TickBase * 8, false))\r
498                                         break;\r
499 #else\r
500                                 if (IN_UserInput(TickBase * 4, false))\r
501                                         break;\r
502 #endif\r
503 \r
504 #if CREDITS\r
505                                 MoveGfxDst(0, 200);\r
506                                 UnpackEGAShapeToScreen(&FileShape2, 0, 0);\r
507                                 VW_ScreenToScreen (64*200,0,40,200);\r
508 \r
509                                 if (IN_UserInput(TickBase * 7, false))\r
510                                         break;\r
511 #else\r
512                                 MoveGfxDst(0, 200);\r
513                                 UnpackEGAShapeToScreen(&FileShape1, 0, 0);\r
514                                 VW_ScreenToScreen (64*200,0,40,200);\r
515 \r
516                                 if (IN_UserInput(TickBase * 3, false))\r
517                                         break;\r
518 #endif\r
519 \r
520                                 displayofs = 0;\r
521                                 VWB_Bar(0,0,320,200,FIRSTCOLOR);\r
522                                 US_DisplayHighScores(-1);\r
523 \r
524                                 if (IN_UserInput(TickBase * 6, false))\r
525                                         break;\r
526 \r
527                         }\r
528 \r
529                         bufferofs = bufsave;\r
530                         displayofs = dissave;\r
531 \r
532                         VW_FixRefreshBuffer();\r
533                         US_ControlPanel ();\r
534                 }\r
535 \r
536                 if (!loadedgame)\r
537                         NewGame();\r
538 \r
539                 FreeShape(&FileShape1);\r
540 #if CREDITS\r
541                 FreeShape(&FileShape2);\r
542 #endif\r
543                 GameLoop();\r
544         }\r
545 }\r