OSDN Git Service

going on vacation >.<
[proj16/16.git] / src / lib / hb / main / kd_main.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_MAIN.C\r
20 /*\r
21 =============================================================================\r
22 \r
23                                                         KEEN DREAMS\r
24 \r
25                                         An Id Software production\r
26 \r
27 =============================================================================\r
28 */\r
29 \r
30 #include "mem.h"\r
31 #include "string.h"\r
32 \r
33 #include "KD_DEF.H"\r
34 #pragma hdrstop\r
35 \r
36 /*\r
37 =============================================================================\r
38 \r
39                                                  LOCAL CONSTANTS\r
40 \r
41 =============================================================================\r
42 */\r
43 \r
44 /*\r
45 =============================================================================\r
46 \r
47                                                  GLOBAL VARIABLES\r
48 \r
49 =============================================================================\r
50 */\r
51 \r
52 char            str[80],str2[20];\r
53 boolean         singlestep,jumpcheat,godmode,tedlevel;\r
54 unsigned        tedlevelnum;\r
55 \r
56 /*\r
57 =============================================================================\r
58 \r
59                                                  LOCAL VARIABLES\r
60 \r
61 =============================================================================\r
62 */\r
63 \r
64 void    DebugMemory (void);\r
65 void    TestSprites(void);\r
66 int             DebugKeys (void);\r
67 void    ShutdownId (void);\r
68 void    Quit (char *error);\r
69 void    InitGame (void);\r
70 void    main (void);\r
71 \r
72 //===========================================================================\r
73 \r
74 #if FRILLS\r
75 \r
76 /*\r
77 ==================\r
78 =\r
79 = DebugMemory\r
80 =\r
81 ==================\r
82 */\r
83 \r
84 void DebugMemory (void)\r
85 {\r
86         VW_FixRefreshBuffer ();\r
87         US_CenterWindow (16,7);\r
88 \r
89         US_CPrint ("Memory Usage");\r
90         US_CPrint ("------------");\r
91         US_Print ("Total     :");\r
92         US_PrintUnsigned (mminfo.mainmem/1024);\r
93         US_Print ("k\nFree      :");\r
94         US_PrintUnsigned (MM_UnusedMemory()/1024);\r
95         US_Print ("k\nWith purge:");\r
96         US_PrintUnsigned (MM_TotalFree()/1024);\r
97         US_Print ("k\n");\r
98         VW_UpdateScreen();\r
99         IN_Ack ();\r
100 #if GRMODE == EGAGR\r
101         MM_ShowMemory ();\r
102 #endif\r
103 }\r
104 \r
105 /*\r
106 ===================\r
107 =\r
108 = TestSprites\r
109 =\r
110 ===================\r
111 */\r
112 \r
113 #define DISPWIDTH       110\r
114 #define TEXTWIDTH   40\r
115 void TestSprites(void)\r
116 {\r
117         int hx,hy,sprite,oldsprite,bottomy,topx,shift;\r
118         spritetabletype far *spr;\r
119         spritetype _seg *block;\r
120         unsigned        mem,scan;\r
121 \r
122 \r
123         VW_FixRefreshBuffer ();\r
124         US_CenterWindow (30,17);\r
125 \r
126         US_CPrint ("Sprite Test");\r
127         US_CPrint ("-----------");\r
128 \r
129         hy=PrintY;\r
130         hx=(PrintX+56)&(~7);\r
131         topx = hx+TEXTWIDTH;\r
132 \r
133         US_Print ("Chunk:\nWidth:\nHeight:\nOrgx:\nOrgy:\nXl:\nYl:\nXh:\nYh:\n"\r
134                           "Shifts:\nMem:\n");\r
135 \r
136         bottomy = PrintY;\r
137 \r
138         sprite = STARTSPRITES;\r
139         shift = 0;\r
140 \r
141         do\r
142         {\r
143                 if (sprite>=STARTTILE8)\r
144                         sprite = STARTTILE8-1;\r
145                 else if (sprite<STARTSPRITES)\r
146                         sprite = STARTSPRITES;\r
147 \r
148                 spr = &spritetable[sprite-STARTSPRITES];\r
149                 block = (spritetype _seg *)grsegs[sprite];\r
150 \r
151                 VWB_Bar (hx,hy,TEXTWIDTH,bottomy-hy,WHITE);\r
152 \r
153                 PrintX=hx;\r
154                 PrintY=hy;\r
155                 US_PrintUnsigned (sprite);US_Print ("\n");PrintX=hx;\r
156                 US_PrintUnsigned (spr->width);US_Print ("\n");PrintX=hx;\r
157                 US_PrintUnsigned (spr->height);US_Print ("\n");PrintX=hx;\r
158                 US_PrintSigned (spr->orgx);US_Print ("\n");PrintX=hx;\r
159                 US_PrintSigned (spr->orgy);US_Print ("\n");PrintX=hx;\r
160                 US_PrintSigned (spr->xl);US_Print ("\n");PrintX=hx;\r
161                 US_PrintSigned (spr->yl);US_Print ("\n");PrintX=hx;\r
162                 US_PrintSigned (spr->xh);US_Print ("\n");PrintX=hx;\r
163                 US_PrintSigned (spr->yh);US_Print ("\n");PrintX=hx;\r
164                 US_PrintSigned (spr->shifts);US_Print ("\n");PrintX=hx;\r
165                 if (!block)\r
166                 {\r
167                         US_Print ("-----");\r
168                 }\r
169                 else\r
170                 {\r
171                         mem = block->sourceoffset[3]+5*block->planesize[3];\r
172                         mem = (mem+15)&(~15);           // round to paragraphs\r
173                         US_PrintUnsigned (mem);\r
174                 }\r
175 \r
176                 oldsprite = sprite;\r
177                 do\r
178                 {\r
179                 //\r
180                 // draw the current shift, then wait for key\r
181                 //\r
182                         VWB_Bar(topx,hy,DISPWIDTH,bottomy-hy,WHITE);\r
183                         if (block)\r
184                         {\r
185                                 PrintX = topx;\r
186                                 PrintY = hy;\r
187                                 US_Print ("Shift:");\r
188                                 US_PrintUnsigned (shift);\r
189                                 US_Print ("\n");\r
190                                 VWB_DrawSprite (topx+16+shift*2,PrintY,sprite);\r
191                         }\r
192 \r
193                         VW_UpdateScreen();\r
194 \r
195                         scan = IN_WaitForKey ();\r
196 \r
197                         switch (scan)\r
198                         {\r
199                         case sc_UpArrow:\r
200                                 sprite++;\r
201                                 break;\r
202                         case sc_DownArrow:\r
203                                 sprite--;\r
204                                 break;\r
205                         case sc_LeftArrow:\r
206                                 if (--shift == -1)\r
207                                         shift = 3;\r
208                                 break;\r
209                         case sc_RightArrow:\r
210                                 if (++shift == 4)\r
211                                         shift = 0;\r
212                                 break;\r
213                         case sc_Escape:\r
214                                 return;\r
215                         }\r
216 \r
217                 } while (sprite == oldsprite);\r
218 \r
219   } while (1);\r
220 \r
221 \r
222 }\r
223 \r
224 #endif\r
225 \r
226 \r
227 /*\r
228 ================\r
229 =\r
230 = DebugKeys\r
231 =\r
232 ================\r
233 */\r
234 int DebugKeys (void)\r
235 {\r
236         boolean esc;\r
237         int level;\r
238 \r
239 #if FRILLS\r
240         if (Keyboard[0x12] && ingame)   // DEBUG: end + 'E' to quit level\r
241         {\r
242                 if (tedlevel)\r
243                         TEDDeath();\r
244                 playstate = levelcomplete;\r
245         }\r
246 #endif\r
247 \r
248         if (Keyboard[0x22] && ingame)           // G = god mode\r
249         {\r
250                 VW_FixRefreshBuffer ();\r
251                 US_CenterWindow (12,2);\r
252                 if (godmode)\r
253                   US_PrintCentered ("God mode OFF");\r
254                 else\r
255                   US_PrintCentered ("God mode ON");\r
256                 VW_UpdateScreen();\r
257                 IN_Ack();\r
258                 godmode ^= 1;\r
259                 return 1;\r
260         }\r
261         else if (Keyboard[0x17])                        // I = item cheat\r
262         {\r
263                 VW_FixRefreshBuffer ();\r
264                 US_CenterWindow (12,3);\r
265                 US_PrintCentered ("Free items!");\r
266                 gamestate.boobusbombs=99;\r
267                 gamestate.flowerpowers=99;\r
268                 gamestate.keys=99;\r
269                 VW_UpdateScreen();\r
270                 IN_Ack ();\r
271                 return 1;\r
272         }\r
273         else if (Keyboard[0x24])                        // J = jump cheat\r
274         {\r
275                 jumpcheat^=1;\r
276                 VW_FixRefreshBuffer ();\r
277                 US_CenterWindow (18,3);\r
278                 if (jumpcheat)\r
279                         US_PrintCentered ("Jump cheat ON");\r
280                 else\r
281                         US_PrintCentered ("Jump cheat OFF");\r
282                 VW_UpdateScreen();\r
283                 IN_Ack ();\r
284                 return 1;\r
285         }\r
286 #if FRILLS\r
287         else if (Keyboard[0x32])                        // M = memory info\r
288         {\r
289                 DebugMemory();\r
290                 return 1;\r
291         }\r
292 #endif\r
293         else if (Keyboard[0x19])                        // P = pause with no screen disruptioon\r
294         {\r
295                 IN_Ack();\r
296         }\r
297         else if (Keyboard[0x1f] && ingame)      // S = slow motion\r
298         {\r
299                 singlestep^=1;\r
300                 VW_FixRefreshBuffer ();\r
301                 US_CenterWindow (18,3);\r
302                 if (singlestep)\r
303                         US_PrintCentered ("Slow motion ON");\r
304                 else\r
305                         US_PrintCentered ("Slow motion OFF");\r
306                 VW_UpdateScreen();\r
307                 IN_Ack ();\r
308                 return 1;\r
309         }\r
310 #if FRILLS\r
311         else if (Keyboard[0x14])                        // T = sprite test\r
312         {\r
313                 TestSprites();\r
314                 return 1;\r
315         }\r
316 #endif\r
317         else if (Keyboard[0x11] && ingame)      // W = warp to level\r
318         {\r
319                 VW_FixRefreshBuffer ();\r
320                 US_CenterWindow(26,3);\r
321                 PrintY+=6;\r
322                 US_Print("  Warp to which level(0-16):");\r
323                 VW_UpdateScreen();\r
324                 esc = !US_LineInput (px,py,str,NULL,true,2,0);\r
325                 if (!esc)\r
326                 {\r
327                         level = atoi (str);\r
328                         if (level>=0 && level<=16)\r
329                         {\r
330                                 gamestate.mapon = level;\r
331                                 playstate = warptolevel;\r
332                         }\r
333                 }\r
334                 return 1;\r
335         }\r
336         return 0;\r
337 }\r
338 \r
339 //===========================================================================\r
340 \r
341 /*\r
342 ==========================\r
343 =\r
344 = ShutdownId\r
345 =\r
346 = Shuts down all ID_?? managers\r
347 =\r
348 ==========================\r
349 */\r
350 \r
351 void ShutdownId (void)\r
352 {\r
353   US_Shutdown ();\r
354   SD_Shutdown ();\r
355   IN_Shutdown ();\r
356   RF_Shutdown ();\r
357   VW_Shutdown ();\r
358   CA_Shutdown ();\r
359   MM_Shutdown ();\r
360 }\r
361 \r
362 //===========================================================================\r
363 \r
364 /*\r
365 ==========================\r
366 =\r
367 = Quit\r
368 =\r
369 ==========================\r
370 */\r
371 \r
372 void Quit (char *error)\r
373 {\r
374   ShutdownId ();\r
375   if (error && *error)\r
376   {\r
377         clrscr();\r
378         puts(error);\r
379         puts("\n");\r
380         exit(1);\r
381   }\r
382         exit (0);\r
383 }\r
384 \r
385 //===========================================================================\r
386 \r
387 /*\r
388 ==========================\r
389 =\r
390 = InitGame\r
391 =\r
392 = Load a few things right away\r
393 =\r
394 ==========================\r
395 */\r
396 \r
397 #if 0\r
398 #include "piracy.h"\r
399 #endif\r
400 \r
401 void InitGame (void)\r
402 {\r
403         int i;\r
404 \r
405         MM_Startup ();\r
406 \r
407 \r
408 #if 0\r
409         // Handle piracy screen...\r
410         //\r
411         movedata(FP_SEG(PIRACY),(unsigned)PIRACY,0xb800,displayofs,4000);\r
412         while ((bioskey(0)>>8) != sc_Return);\r
413 #endif\r
414 \r
415 \r
416 #if GRMODE == EGAGR\r
417         if (mminfo.mainmem < 335l*1024)\r
418         {\r
419 #pragma warn    -pro\r
420 #pragma warn    -nod\r
421                 clrscr();                       // we can't include CONIO because of a name conflict\r
422 #pragma warn    +nod\r
423 #pragma warn    +pro\r
424                 puts ("There is not enough memory available to play the game reliably.  You can");\r
425                 puts ("play anyway, but an out of memory condition will eventually pop up.  The");\r
426                 puts ("correct solution is to unload some TSRs or rename your CONFIG.SYS and");\r
427                 puts ("AUTOEXEC.BAT to free up more memory.\n");\r
428                 puts ("Do you want to (Q)uit, or (C)ontinue?");\r
429                 i = bioskey (0);\r
430                 if ( (i>>8) != sc_C)\r
431                         Quit ("");\r
432         }\r
433 #endif\r
434 \r
435         US_TextScreen();\r
436 \r
437         VW_Startup ();\r
438         RF_Startup ();\r
439         IN_Startup ();\r
440         SD_Startup ();\r
441         US_Startup ();\r
442 \r
443 //      US_UpdateTextScreen();\r
444 \r
445         CA_Startup ();\r
446         US_Setup ();\r
447 \r
448 //\r
449 // load in and lock down some basic chunks\r
450 //\r
451 \r
452         CA_ClearMarks ();\r
453 \r
454         CA_MarkGrChunk(STARTFONT);\r
455         CA_MarkGrChunk(STARTFONTM);\r
456         CA_MarkGrChunk(STARTTILE8);\r
457         CA_MarkGrChunk(STARTTILE8M);\r
458         for (i=KEEN_LUMP_START;i<=KEEN_LUMP_END;i++)\r
459                 CA_MarkGrChunk(i);\r
460 \r
461         CA_CacheMarks (NULL, 0);\r
462 \r
463         MM_SetLock (&grsegs[STARTFONT],true);\r
464         MM_SetLock (&grsegs[STARTFONTM],true);\r
465         MM_SetLock (&grsegs[STARTTILE8],true);\r
466         MM_SetLock (&grsegs[STARTTILE8M],true);\r
467         for (i=KEEN_LUMP_START;i<=KEEN_LUMP_END;i++)\r
468                 MM_SetLock (&grsegs[i],true);\r
469 \r
470         CA_LoadAllSounds ();\r
471 \r
472         fontcolor = WHITE;\r
473 \r
474         US_FinishTextScreen();\r
475 \r
476         VW_SetScreenMode (GRMODE);\r
477         VW_ClearVideo (BLACK);\r
478 }\r
479 \r
480 \r
481 \r
482 //===========================================================================\r
483 \r
484 /*\r
485 ==========================\r
486 =\r
487 = main\r
488 =\r
489 ==========================\r
490 */\r
491 \r
492 void main (void)\r
493 {\r
494         short i;\r
495 \r
496         if (stricmp(_argv[1], "/VER") == 0)\r
497         {\r
498                 printf("\nKeen Dreams version 1.93  (Rev 1)\n");\r
499                 printf("developed for use with 100%% IBM compatibles\n");\r
500                 printf("that have 640K memory, DOS version 3.3 or later,\n");\r
501                 printf("and an EGA or VGA display adapter.\n");\r
502                 printf("Copyright 1991-1993 Softdisk Publishing.\n");\r
503                 printf("Commander Keen is a trademark of Id Software.\n");\r
504                 exit(0);\r
505         }\r
506 \r
507         if (stricmp(_argv[1], "/?") == 0)\r
508         {\r
509                 printf("\nKeen Dreams version 1.93\n");\r
510                 printf("Copyright 1991-1993 Softdisk Publishing.\n\n");\r
511                 printf("Commander Keen is a trademark of Id Software.\n");\r
512                 printf("Type KDREAMS from the DOS prompt to run.\n\n");\r
513                 printf("KDREAMS /COMP for SVGA compatibility mode\n");\r
514                 printf("KDREAMS /NODR stops program hang with the drive still on\n");\r
515                 printf("KDREAMS /NOAL disables AdLib and Sound Blaster detection\n");\r
516                 printf("KDREAMS /NOSB disables Sound Blaster detection\n");\r
517                 printf("KDREAMS /NOJOYS ignores joystick\n");\r
518                 printf("KDREAMS /NOMOUSE ignores mouse\n");\r
519                 printf("KDREAMS /HIDDENCARD overrides video card detection\n");\r
520                 printf("KDREAMS /VER  for version and compatibility information\n");\r
521                 printf("KDREAMS /? for this help information\n");\r
522                 exit(0);\r
523         }\r
524 \r
525         textcolor(7);\r
526         textbackground(0);\r
527 \r
528         InitGame();\r
529 \r
530         DemoLoop();                                     // DemoLoop calls Quit when everything is done\r
531         Quit("Demo loop exited???");\r
532 }\r
533 \r