1 /* Keen Dreams Source Code
\r
2 * Copyright (C) 2014 Javier M. Chavez
\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
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
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
26 #define RLETAG 0xABCD
\r
29 =============================================================================
\r
33 =============================================================================
\r
37 =============================================================================
\r
41 =============================================================================
\r
46 =============================================================================
\r
50 =============================================================================
\r
53 //===========================================================================
\r
56 =====================
\r
60 = Set up new game to start from the beginning
\r
62 =====================
\r
69 gamestate.worldx = 0; // spawn keen at starting spot
\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
80 //===========================================================================
\r
83 =====================
\r
87 =====================
\r
90 int WaitOrKey (int vbls)
\r
94 IN_ReadControl(0,&c); // get player input
\r
95 if (LastScan || c.button0 || c.button1)
\r
97 IN_ClearKeysDown ();
\r
105 //===========================================================================
\r
108 =====================
\r
112 =====================
\r
118 VW_InitDoubleBuffer ();
\r
119 US_CenterWindow (16,3);
\r
121 US_PrintCentered("Game Over!");
\r
123 VW_UpdateScreen ();
\r
124 IN_ClearKeysDown ();
\r
130 //===========================================================================
\r
140 void StatusWindow (void)
\r
144 // DEBUG - make this look better
\r
146 US_CenterWindow(22,7);
\r
147 US_CPrint("Status Window");
\r
156 VWB_DrawTile8(PrintX,PrintY,26);
\r
157 VWB_DrawTile8(PrintX + 8,PrintY,27);
\r
159 US_PrintUnsigned(gamestate.lives);
\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
167 US_PrintUnsigned(gamestate.boobusbombs);
\r
175 fontcolor = F_FIRSTCOLOR;
\r
177 fontcolor = F_BLACK;
\r
179 VWB_DrawTile8(PrintX,PrintY,26);
\r
180 VWB_DrawTile8(PrintX + 8,PrintY,27);
\r
182 US_PrintUnsigned(gamestate.nextextra);
\r
186 VWB_DrawTile8(PrintX,PrintY,24);
\r
187 VWB_DrawTile8(PrintX + 8,PrintY,25);
\r
189 US_PrintUnsigned(gamestate.keys);
\r
192 // DEBUG - add flower powers (#36)
\r
201 word i,size,compressed,expanded;
\r
205 if (!CA_FarWrite(file,(void far *)&gamestate,sizeof(gamestate)))
\r
208 expanded = mapwidth * mapheight * 2;
\r
209 MM_GetPtr (&bigbuffer,expanded);
\r
211 for (i = 0;i < 3;i++) // Write all three planes of the map
\r
214 // leave a word at start of compressed data for compressed length
\r
216 compressed = CA_RLEWCompress ((unsigned huge *)mapsegs[i]
\r
217 ,expanded,((unsigned huge *)bigbuffer)+1,RLETAG);
\r
219 *(unsigned huge *)bigbuffer = compressed;
\r
221 if (!CA_FarWrite(file,(void far *)bigbuffer,compressed+2) )
\r
223 MM_FreePtr (&bigbuffer);
\r
228 for (o = player;o;o = o->next)
\r
229 if (!CA_FarWrite(file,(void far *)o,sizeof(objtype)))
\r
231 MM_FreePtr (&bigbuffer);
\r
235 MM_FreePtr (&bigbuffer);
\r
246 objtype *prev,*next,*followed;
\r
247 unsigned compressed,expanded;
\r
250 if (!CA_FarRead(file,(void far *)&gamestate,sizeof(gamestate)))
\r
253 // drop down a cache level and mark everything, so when the option screen
\r
254 // is exited it will be cached
\r
259 SetupGameLevel (false); // load in and cache the base old level
\r
260 titleptr[ca_levelnum] = levelnames[mapon];
\r
265 expanded = mapwidth * mapheight * 2;
\r
266 MM_GetPtr (&bigbuffer,expanded);
\r
268 for (i = 0;i < 3;i++) // Read all three planes of the map
\r
270 if (!CA_FarRead(file,(void far *)&compressed,sizeof(compressed)) )
\r
272 MM_FreePtr (&bigbuffer);
\r
276 if (!CA_FarRead(file,(void far *)bigbuffer,compressed) )
\r
278 MM_FreePtr (&bigbuffer);
\r
282 CA_RLEWexpand ((unsigned huge *)bigbuffer,
\r
283 (unsigned huge *)mapsegs[i],compressed,RLETAG);
\r
286 MM_FreePtr (&bigbuffer);
\r
288 // Read the object list back in - assumes at least one object in list
\r
294 if (!CA_FarRead(file,(void far *)new,sizeof(objtype)))
\r
298 new->needtoreact = true;
\r
299 new->sprite = NULL;
\r
305 if (!CA_FarRead(file,(void far *)new,sizeof(objtype)))
\r
307 followed = new->next;
\r
310 new->needtoreact = true;
\r
311 new->sprite = NULL;
\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
333 titleptr[ca_levelnum] = NULL; // don't reload old level
\r
342 execlp("TED5.EXE","TED5.EXE","/LAUNCH","KDREAMS",NULL);
\r
347 MoveTitleTo(int offset)
\r
353 longword lasttime,delay;
\r
355 if (offset < originxglobal)
\r
360 chunk = dir * PIXGLOBAL;
\r
366 lasttime = TimeCount;
\r
367 move = delay * chunk;
\r
369 done = originxglobal + move <= offset;
\r
371 done = originxglobal + move >= offset;
\r
377 if (IN_IsUserInput())
\r
379 delay = TimeCount - lasttime;
\r
381 if (originxglobal != offset)
\r
383 RF_Scroll(offset - originxglobal,0);
\r
390 Wait(longword time)
\r
393 while ((TimeCount < time) && (!IN_IsUserInput()))
\r
395 if (!(TimeCount % MINTICS))
\r
398 return(IN_IsUserInput());
\r
402 ShowText(int offset,WindowRec *wr,char *s)
\r
404 if (MoveTitleTo(offset))
\r
407 US_RestoreWindow(wr);
\r
411 if (Wait(TickBase * 5))
\r
414 US_RestoreWindow(wr);
\r
421 =====================
\r
425 =====================
\r
435 struct Shape FileShape1;
\r
438 struct Shape FileShape2;
\r
440 struct ffblk ffblk;
\r
442 int bufsave = bufferofs;
\r
443 int dissave = displayofs;
\r
448 // check for launch from ted
\r
453 gamestate.mapon = tedlevelnum;
\r
462 US_SetLoadSaveHooks(LoadGame,SaveGame,ResetGame);
\r
463 restartgame = gd_Continue;
\r
465 if (findfirst("KDREAMS.CMP", &ffblk, 0) == -1)
\r
466 Quit("Couldn't find KDREAMS.CMP");
\r
471 loadedgame = false;
\r
473 FileName1 = "TITLESCR.LBM";
\r
474 if (LoadLIBShape("KDREAMS.CMP", FileName1, &FileShape1))
\r
475 Quit("Can't load TITLE SCREEN");
\r
477 FileName2 = "CREDITS.LBM";
\r
478 if (LoadLIBShape("KDREAMS.CMP", FileName2, &FileShape2))
\r
479 Quit("Can't load CREDITS SCREEN");
\r
482 while (!restartgame && !loadedgame)
\r
485 VW_InitDoubleBuffer();
\r
486 IN_ClearKeysDown();
\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
497 if (IN_UserInput(TickBase * 8, false))
\r
500 if (IN_UserInput(TickBase * 4, false))
\r
505 MoveGfxDst(0, 200);
\r
506 UnpackEGAShapeToScreen(&FileShape2, 0, 0);
\r
507 VW_ScreenToScreen (64*200,0,40,200);
\r
509 if (IN_UserInput(TickBase * 7, false))
\r
512 MoveGfxDst(0, 200);
\r
513 UnpackEGAShapeToScreen(&FileShape1, 0, 0);
\r
514 VW_ScreenToScreen (64*200,0,40,200);
\r
516 if (IN_UserInput(TickBase * 3, false))
\r
521 VWB_Bar(0,0,320,200,FIRSTCOLOR);
\r
522 US_DisplayHighScores(-1);
\r
524 if (IN_UserInput(TickBase * 6, false))
\r
529 bufferofs = bufsave;
\r
530 displayofs = dissave;
\r
532 VW_FixRefreshBuffer();
\r
533 US_ControlPanel ();
\r
539 FreeShape(&FileShape1);
\r
541 FreeShape(&FileShape2);
\r