OSDN Git Service

4aa683123983b7a265791184bd17ffd519f0244d
[proj16/16.git] / src / lib / hb / c3_debug.c
1 /* Catacomb 3-D Source Code\r
2  * Copyright (C) 1993-2014 Flat Rock Software\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 // C3_DEBUG.C\r
20 \r
21 #include "C3_DEF.H"\r
22 #pragma hdrstop\r
23 \r
24 /*\r
25 =============================================================================\r
26 \r
27                                                  LOCAL CONSTANTS\r
28 \r
29 =============================================================================\r
30 */\r
31 \r
32 #define VIEWTILEX       20\r
33 #define VIEWTILEY       (VIEWHEIGHT/16)\r
34 \r
35 /*\r
36 =============================================================================\r
37 \r
38                                                  GLOBAL VARIABLES\r
39 \r
40 =============================================================================\r
41 */\r
42 \r
43 \r
44 /*\r
45 =============================================================================\r
46 \r
47                                                  LOCAL VARIABLES\r
48 \r
49 =============================================================================\r
50 */\r
51 \r
52 \r
53 int     maporgx;\r
54 int     maporgy;\r
55 enum {mapview,tilemapview,actoratview,visview}  viewtype;\r
56 \r
57 void ViewMap (void);\r
58 \r
59 //===========================================================================\r
60 \r
61 \r
62 \r
63 /*\r
64 ==================\r
65 =\r
66 = DebugMemory\r
67 =\r
68 ==================\r
69 */\r
70 \r
71 void DebugMemory (void)\r
72 {\r
73         int     i;\r
74         char    scratch[80],str[10];\r
75         long    mem;\r
76         spritetype _seg *block;\r
77 \r
78         VW_FixRefreshBuffer ();\r
79         US_CenterWindow (16,7);\r
80 \r
81 #if 0\r
82         CA_OpenDebug ();\r
83         for (i=0;i<NUMCHUNKS;i++)\r
84         {\r
85                 if (grsegs[i])\r
86                 {\r
87                         strcpy (scratch,"Chunk:");\r
88                         itoa (i,str,10);\r
89                         strcat (scratch,str);\r
90                         strcat (scratch,"\n");\r
91                         write (debughandle,scratch,strlen(scratch));\r
92                 }\r
93         }\r
94         CA_CloseDebug ();\r
95 #endif\r
96 \r
97         US_CPrint ("Memory Usage");\r
98         US_CPrint ("------------");\r
99         US_Print ("Total     :");\r
100         US_PrintUnsigned (mminfo.mainmem/1024);\r
101         US_Print ("k\nFree      :");\r
102         US_PrintUnsigned (MM_UnusedMemory()/1024);\r
103         US_Print ("k\nWith purge:");\r
104         US_PrintUnsigned (MM_TotalFree()/1024);\r
105         US_Print ("k\n");\r
106         VW_UpdateScreen();\r
107         IN_Ack ();\r
108 }\r
109 \r
110 //===========================================================================\r
111 \r
112 /*\r
113 ================\r
114 =\r
115 = PicturePause\r
116 =\r
117 ================\r
118 */\r
119 \r
120 void PicturePause (void)\r
121 {\r
122         int     y;\r
123         unsigned        source;\r
124 \r
125         source = displayofs+panadjust;\r
126 \r
127         VW_ColorBorder (15);\r
128         VW_SetLineWidth (40);\r
129         VW_SetScreen (0,0);\r
130 \r
131         if (source<0x10000l-200*64)\r
132         {\r
133         //\r
134         // copy top line first\r
135         //\r
136                 for (y=0;y<200;y++)\r
137                         VW_ScreenToScreen (source+y*64,y*40,40,1);\r
138         }\r
139         else\r
140         {\r
141         //\r
142         // copy bottom line first\r
143         //\r
144                 for (y=199;y>=0;y--)\r
145                         VW_ScreenToScreen (source+y*64,y*40,40,1);\r
146         }\r
147 \r
148         IN_Shutdown ();\r
149 \r
150         VW_WaitVBL(70);\r
151         bioskey(0);\r
152         VW_WaitVBL(70);\r
153         Quit (NULL);\r
154 }\r
155 \r
156 \r
157 //===========================================================================\r
158 \r
159 /*\r
160 ================\r
161 =\r
162 = ShapeTest\r
163 =\r
164 ================\r
165 */\r
166 \r
167 void ShapeTest (void)\r
168 {\r
169 \r
170 }\r
171 \r
172 \r
173 //===========================================================================\r
174 \r
175 #define sc_1                    0x02\r
176 #define sc_2                    0x03\r
177 #define sc_3                    0x04\r
178 #define sc_4                    0x05\r
179 #define sc_5                    0x06\r
180 #define sc_6                    0x07\r
181 #define sc_7                    0x08\r
182 #define sc_8                    0x09\r
183 #define sc_9                    0x0a\r
184 #define sc_0                    0x0b\r
185 \r
186 \r
187 \r
188 /*\r
189 ================\r
190 =\r
191 = DebugKeys\r
192 =\r
193 ================\r
194 */\r
195 \r
196 int DebugKeys (void)\r
197 {\r
198         boolean esc;\r
199         int level,i;\r
200 \r
201         if (Keyboard[sc_B])             // B = border color\r
202         {\r
203                 CenterWindow(24,3);\r
204                 PrintY+=6;\r
205                 US_Print(" Border color (0-15):");\r
206                 VW_UpdateScreen();\r
207                 esc = !US_LineInput (px,py,str,NULL,true,2,0);\r
208                 if (!esc)\r
209                 {\r
210                         level = atoi (str);\r
211                         if (level>=0 && level<=15)\r
212                                 VW_ColorBorder (level);\r
213                 }\r
214                 return 1;\r
215         }\r
216 \r
217 #if 0\r
218 \r
219         if (Keyboard[sc_C])             // C = count objects\r
220         {\r
221                 CountObjects();\r
222                 return 1;\r
223         }\r
224 \r
225 \r
226         if (Keyboard[sc_D])             // D = start / end demo record\r
227         {\r
228                 if (DemoMode == demo_Off)\r
229                         StartDemoRecord ();\r
230                 else if (DemoMode == demo_Record)\r
231                 {\r
232                         EndDemoRecord ();\r
233                         playstate = ex_completed;\r
234                 }\r
235                 return 1;\r
236         }\r
237 \r
238 #endif\r
239 \r
240         if (Keyboard[sc_E])             // E = quit level\r
241         {\r
242                 if (tedlevel)\r
243                         TEDDeath();\r
244                 playstate = ex_warped;\r
245                 gamestate.mapon++;\r
246         }\r
247 \r
248         if (Keyboard[sc_F])             // F = facing spot\r
249         {\r
250                 CenterWindow (12,4);\r
251                 US_Print ("X:");\r
252                 US_PrintUnsigned (player->x);\r
253                 US_Print ("Y:");\r
254                 US_PrintUnsigned (player->y);\r
255                 US_Print ("A:");\r
256                 US_PrintUnsigned (player->angle);\r
257                 VW_UpdateScreen();\r
258                 IN_Ack();\r
259                 return 1;\r
260         }\r
261 \r
262         if (Keyboard[sc_G])             // G = god mode\r
263         {\r
264                 CenterWindow (12,2);\r
265                 if (godmode)\r
266                   US_PrintCentered ("God mode OFF");\r
267                 else\r
268                   US_PrintCentered ("God mode ON");\r
269                 VW_UpdateScreen();\r
270                 IN_Ack();\r
271                 godmode ^= 1;\r
272                 return 1;\r
273         }\r
274         if (Keyboard[sc_H])             // H = hurt self\r
275         {\r
276                 TakeDamage (5);\r
277         }\r
278         else if (Keyboard[sc_I])                        // I = item cheat\r
279         {\r
280                 CenterWindow (12,3);\r
281                 US_PrintCentered ("Free items!");\r
282                 VW_UpdateScreen();\r
283                 for (i=0;i<4;i++)\r
284                 {\r
285                         GiveBolt ();\r
286                         GiveNuke ();\r
287                         GivePotion ();\r
288                         if (!gamestate.keys[i])\r
289                                 GiveKey (i);\r
290                 }\r
291                 for (i=0;i<8;i++)\r
292                         GiveScroll (i,false);\r
293 \r
294                 IN_Ack ();\r
295                 return 1;\r
296         }\r
297         else if (Keyboard[sc_M])                        // M = memory info\r
298         {\r
299                 DebugMemory();\r
300                 return 1;\r
301         }\r
302         else if (Keyboard[sc_O])                        // O = overhead\r
303         {\r
304                 ViewMap();\r
305                 return 1;\r
306         }\r
307         else if (Keyboard[sc_P])                        // P = pause with no screen disruptioon\r
308         {\r
309                 PicturePause ();\r
310                 return 1;\r
311         }\r
312         else if (Keyboard[sc_S])        // S = slow motion\r
313         {\r
314                 singlestep^=1;\r
315                 CenterWindow (18,3);\r
316                 if (singlestep)\r
317                         US_PrintCentered ("Slow motion ON");\r
318                 else\r
319                         US_PrintCentered ("Slow motion OFF");\r
320                 VW_UpdateScreen();\r
321                 IN_Ack ();\r
322                 return 1;\r
323         }\r
324         else if (Keyboard[sc_S])        // T = shape test\r
325         {\r
326                 ShapeTest ();\r
327                 return 1;\r
328         }\r
329         else if (Keyboard[sc_V])                        // V = extra VBLs\r
330         {\r
331                 CenterWindow(30,3);\r
332                 PrintY+=6;\r
333                 US_Print("  Add how many extra VBLs(0-8):");\r
334                 VW_UpdateScreen();\r
335                 esc = !US_LineInput (px,py,str,NULL,true,2,0);\r
336                 if (!esc)\r
337                 {\r
338                         level = atoi (str);\r
339                         if (level>=0 && level<=8)\r
340                                 extravbls = level;\r
341                 }\r
342                 return 1;\r
343         }\r
344         else if (Keyboard[sc_W])        // W = warp to level\r
345         {\r
346                 CenterWindow(26,3);\r
347                 PrintY+=6;\r
348                 US_Print("  Warp to which level(1-21):");\r
349                 VW_UpdateScreen();\r
350                 esc = !US_LineInput (px,py,str,NULL,true,2,0);\r
351                 if (!esc)\r
352                 {\r
353                         level = atoi (str);\r
354                         if (level>0 && level<21)\r
355                         {\r
356                                 gamestate.mapon = level-1;\r
357                                 playstate = ex_warped;\r
358                         }\r
359                 }\r
360                 return 1;\r
361         }\r
362         else if (Keyboard[sc_X])                        // X = item cheat\r
363         {\r
364                 CenterWindow (12,3);\r
365                 US_PrintCentered ("Extra stuff!");\r
366                 VW_UpdateScreen();\r
367                 for (i=0;i<4;i++)\r
368                 {\r
369                         GiveBolt ();\r
370                         GiveNuke ();\r
371                         GivePotion ();\r
372                 }\r
373                 IN_Ack ();\r
374                 return 1;\r
375         }\r
376         else if (Keyboard[sc_Z])                        // Z = game over\r
377         {\r
378 \r
379         }\r
380         else if (LastScan >= sc_1 && LastScan <= sc_8)  // free scrolls\r
381         {\r
382                 GiveScroll (LastScan-sc_1,false);\r
383                 IN_ClearKeysDown ();\r
384         }\r
385 \r
386         return 0;\r
387 }\r
388 \r
389 \r
390 /*\r
391 =====================\r
392 =\r
393 = LatchDrawChar\r
394 =\r
395 =====================\r
396 */\r
397 \r
398 void LatchDrawChar (unsigned x, unsigned y, unsigned picnum)\r
399 {\r
400         unsigned        source, dest;\r
401 \r
402         dest = bufferofs + ylookup[y]+x;\r
403         source = latchpics[0]+picnum*8;\r
404 \r
405         EGAWRITEMODE(1);\r
406         EGAMAPMASK(15);\r
407 \r
408 asm     mov     bx,[linewidth]\r
409 asm     dec     bx\r
410 \r
411 asm     mov     ax,[screenseg]\r
412 asm     mov     es,ax\r
413 asm     mov     ds,ax\r
414 \r
415 asm     mov     si,[source]\r
416 asm     mov     di,[dest]\r
417 \r
418 asm     movsb\r
419 asm     add     di,bx\r
420 asm     movsb\r
421 asm     add     di,bx\r
422 asm     movsb\r
423 asm     add     di,bx\r
424 asm     movsb\r
425 asm     add     di,bx\r
426 asm     movsb\r
427 asm     add     di,bx\r
428 asm     movsb\r
429 asm     add     di,bx\r
430 asm     movsb\r
431 asm     add     di,bx\r
432 asm     movsb\r
433 \r
434 asm     mov     ax,ss\r
435 asm     mov     ds,ax                                   // restore turbo's data segment\r
436 \r
437         EGAWRITEMODE(0);\r
438 }\r
439 \r
440 \r
441 /*\r
442 =====================\r
443 =\r
444 = LatchDrawTile\r
445 =\r
446 =====================\r
447 */\r
448 \r
449 void LatchDrawTile (unsigned x, unsigned y, unsigned picnum)\r
450 {\r
451         unsigned        source, dest;\r
452 \r
453         dest = bufferofs + ylookup[y]+x;\r
454         source = tileoffsets[picnum];\r
455 \r
456         EGAWRITEMODE(1);\r
457         EGAMAPMASK(15);\r
458 \r
459 asm     mov     bx,[linewidth]\r
460 asm     sub     bx,2\r
461 \r
462 asm     mov     ax,[screenseg]\r
463 asm     mov     es,ax\r
464 asm     mov     ds,ax\r
465 \r
466 asm     mov     si,[source]\r
467 asm     mov     di,[dest]\r
468 asm     mov     dx,16\r
469 \r
470 lineloop:\r
471 asm     movsb\r
472 asm     movsb\r
473 asm     add     di,bx\r
474 \r
475 asm     dec     dx\r
476 asm     jnz     lineloop\r
477 \r
478 asm     mov     ax,ss\r
479 asm     mov     ds,ax                                   // restore turbo's data segment\r
480 \r
481         EGAWRITEMODE(0);\r
482 }\r
483 \r
484 \r
485 /*\r
486 ===================\r
487 =\r
488 = OverheadRefresh\r
489 =\r
490 ===================\r
491 */\r
492 \r
493 void OverheadRefresh (void)\r
494 {\r
495         unsigned        x,y,endx,endy,sx,sy;\r
496         unsigned        tile;\r
497 \r
498 \r
499         if (++screenpage == 3)\r
500                 screenpage = 0;\r
501 \r
502         bufferofs = screenloc[screenpage];\r
503 \r
504         endx = maporgx+VIEWTILEX;\r
505         endy = maporgy+VIEWTILEY;\r
506 \r
507         for (y=maporgy;y<endy;y++)\r
508                 for (x=maporgx;x<endx;x++)\r
509                 {\r
510                         sx = (x-maporgx)*2;\r
511                         sy = (y-maporgy)*16;\r
512 \r
513                         switch (viewtype)\r
514                         {\r
515                         case mapview:\r
516                                 tile = *(mapsegs[0]+farmapylookup[y]+x);\r
517                                 break;\r
518 \r
519                         case tilemapview:\r
520                                 tile = tilemap[x][y];\r
521                                 break;\r
522 \r
523                         case actoratview:\r
524                                 tile = (unsigned)actorat[x][y];\r
525                                 break;\r
526 \r
527                         case visview:\r
528                                 tile = spotvis[x][y];\r
529                                 break;\r
530 \r
531                         }\r
532 \r
533                         if (tile<NUMTILE16)\r
534                                 LatchDrawTile(sx,sy,tile);\r
535                         else\r
536                         {\r
537                                 LatchDrawChar(sx,sy,NUMBERCHARS+((tile&0xf000)>>12));\r
538                                 LatchDrawChar(sx+1,sy,NUMBERCHARS+((tile&0x0f00)>>8));\r
539                                 LatchDrawChar(sx,sy+8,NUMBERCHARS+((tile&0x00f0)>>4));\r
540                                 LatchDrawChar(sx+1,sy+8,NUMBERCHARS+(tile&0x000f));\r
541                         }\r
542                 }\r
543 \r
544         VW_SetScreen (bufferofs,0);\r
545         displayofs = bufferofs;\r
546 }\r
547 \r
548 \r
549 /*\r
550 ===================\r
551 =\r
552 = ViewMap\r
553 =\r
554 ===================\r
555 */\r
556 \r
557 void ViewMap (void)\r
558 {\r
559         boolean         button0held;\r
560 \r
561         viewtype = actoratview;\r
562         button0held = false;\r
563 \r
564 \r
565         maporgx = player->tilex - VIEWTILEX/2;\r
566         if (maporgx<0)\r
567                 maporgx = 0;\r
568         maporgy = player->tiley - VIEWTILEY/2;\r
569         if (maporgy<0)\r
570                 maporgy = 0;\r
571 \r
572         do\r
573         {\r
574 //\r
575 // let user pan around\r
576 //\r
577                 IN_ReadControl(0,&c);\r
578                 if (c.xaxis == -1 && maporgx>0)\r
579                         maporgx--;\r
580                 if (c.xaxis == 1 && maporgx<mapwidth-VIEWTILEX)\r
581                         maporgx++;\r
582                 if (c.yaxis == -1 && maporgy>0)\r
583                         maporgy--;\r
584                 if (c.yaxis == 1 && maporgy<mapheight-VIEWTILEY)\r
585                         maporgy++;\r
586 \r
587                 if (c.button0 && !button0held)\r
588                 {\r
589                         button0held = true;\r
590                         viewtype++;\r
591                         if (viewtype>visview)\r
592                                 viewtype = mapview;\r
593                 }\r
594                 if (!c.button0)\r
595                         button0held = false;\r
596 \r
597 \r
598                 OverheadRefresh ();\r
599 \r
600         } while (!Keyboard[sc_Escape]);\r
601 \r
602         IN_ClearKeysDown ();\r
603         DrawPlayScreen ();\r
604 }\r
605 \r
606 \r