OSDN Git Service

dd4674b1dbfc554ee54098204da996d14f2f52ec
[proj16/16.git] / src / lib / hb / wl_debug.c
1 // WL_DEBUG.C\r
2 \r
3 #include "WL_DEF.H"\r
4 #pragma hdrstop\r
5 #include <BIOS.H>\r
6 \r
7 /*\r
8 =============================================================================\r
9 \r
10                                                  LOCAL CONSTANTS\r
11 \r
12 =============================================================================\r
13 */\r
14 \r
15 #define VIEWTILEX       (viewwidth/16)\r
16 #define VIEWTILEY       (viewheight/16)\r
17 \r
18 /*\r
19 =============================================================================\r
20 \r
21                                                  GLOBAL VARIABLES\r
22 \r
23 =============================================================================\r
24 */\r
25 \r
26 \r
27 int DebugKeys (void);\r
28 \r
29 /*\r
30 =============================================================================\r
31 \r
32                                                  LOCAL VARIABLES\r
33 \r
34 =============================================================================\r
35 */\r
36 \r
37 \r
38 int     maporgx;\r
39 int     maporgy;\r
40 enum {mapview,tilemapview,actoratview,visview}  viewtype;\r
41 \r
42 void ViewMap (void);\r
43 \r
44 //===========================================================================\r
45 \r
46 /*\r
47 ==================\r
48 =\r
49 = DebugMemory\r
50 =\r
51 ==================\r
52 */\r
53 \r
54 void DebugMemory (void)\r
55 {\r
56         int     i;\r
57         char    scratch[80],str[10];\r
58         long    mem;\r
59         spritetype _seg *block;\r
60 \r
61         CenterWindow (16,7);\r
62 \r
63         US_CPrint ("Memory Usage");\r
64         US_CPrint ("------------");\r
65         US_Print ("Total     :");\r
66         US_PrintUnsigned (mminfo.mainmem/1024);\r
67         US_Print ("k\nFree      :");\r
68         US_PrintUnsigned (MM_UnusedMemory()/1024);\r
69         US_Print ("k\nWith purge:");\r
70         US_PrintUnsigned (MM_TotalFree()/1024);\r
71         US_Print ("k\n");\r
72         VW_UpdateScreen();\r
73         IN_Ack ();\r
74 }\r
75 \r
76 //===========================================================================\r
77 \r
78 /*\r
79 ==================\r
80 =\r
81 = CountObjects\r
82 =\r
83 ==================\r
84 */\r
85 \r
86 void CountObjects (void)\r
87 {\r
88         int     i,total,count,active,inactive,doors;\r
89         objtype *obj;\r
90 \r
91         CenterWindow (16,7);\r
92         active = inactive = count = doors = 0;\r
93 \r
94         US_Print ("Total statics :");\r
95         total = laststatobj-&statobjlist[0];\r
96         US_PrintUnsigned (total);\r
97 \r
98         US_Print ("\nIn use statics:");\r
99         for (i=0;i<total;i++)\r
100                 if (statobjlist[i].shapenum != -1)\r
101                         count++;\r
102                 else\r
103                         doors++;        //debug\r
104         US_PrintUnsigned (count);\r
105 \r
106         US_Print ("\nDoors         :");\r
107         US_PrintUnsigned (doornum);\r
108 \r
109         for (obj=player->next;obj;obj=obj->next)\r
110         {\r
111                 if (obj->active)\r
112                         active++;\r
113                 else\r
114                         inactive++;\r
115         }\r
116 \r
117         US_Print ("\nTotal actors  :");\r
118         US_PrintUnsigned (active+inactive);\r
119 \r
120         US_Print ("\nActive actors :");\r
121         US_PrintUnsigned (active);\r
122 \r
123         VW_UpdateScreen();\r
124         IN_Ack ();\r
125 }\r
126 \r
127 //===========================================================================\r
128 \r
129 /*\r
130 ================\r
131 =\r
132 = PicturePause\r
133 =\r
134 ================\r
135 */\r
136 \r
137 void PicturePause (void)\r
138 {\r
139         int                     i;\r
140         byte            p;\r
141         unsigned        x;\r
142         byte            far     *dest,far *src;\r
143         memptr          buffer;\r
144 \r
145         VW_ColorBorder (15);\r
146         FinishPaletteShifts ();\r
147 \r
148         LastScan = 0;\r
149         while (!LastScan)\r
150         ;\r
151         if (LastScan != sc_Enter)\r
152         {\r
153                 VW_ColorBorder (0);\r
154                 return;\r
155         }\r
156 \r
157         VW_ColorBorder (1);\r
158         VW_SetScreen (0,0);\r
159 //\r
160 // vga stuff...\r
161 //\r
162 \r
163         ClearMemory ();\r
164         CA_SetAllPurge();\r
165         MM_GetPtr (&buffer,64000);\r
166         for (p=0;p<4;p++)\r
167         {\r
168            src = MK_FP(0xa000,displayofs);\r
169            dest = (byte far *)buffer+p;\r
170            VGAREADMAP(p);\r
171            for (x=0;x<16000;x++,dest+=4)\r
172                    *dest = *src++;\r
173         }\r
174 \r
175 \r
176 #if 0\r
177         for (p=0;p<4;p++)\r
178         {\r
179                 src = MK_FP(0xa000,0);\r
180                 dest = (byte far *)buffer+51200+p;\r
181                 VGAREADMAP(p);\r
182                 for (x=0;x<3200;x++,dest+=4)\r
183                         *dest = *src++;\r
184         }\r
185 #endif\r
186 \r
187         asm     mov     ax,0x13\r
188         asm     int     0x10\r
189 \r
190         dest = MK_FP(0xa000,0);\r
191         _fmemcpy (dest,buffer,64000);\r
192 \r
193         VL_SetPalette (&gamepal);\r
194 \r
195 \r
196         IN_Shutdown ();\r
197 \r
198         VW_WaitVBL(70);\r
199         bioskey(0);\r
200         VW_WaitVBL(70);\r
201         Quit (NULL);\r
202 }\r
203 \r
204 \r
205 //===========================================================================\r
206 \r
207 \r
208 /*\r
209 ================\r
210 =\r
211 = ShapeTest\r
212 =\r
213 ================\r
214 */\r
215 \r
216 #pragma warn -pia\r
217 void ShapeTest (void)\r
218 {\r
219 extern  word    NumDigi;\r
220 extern  word    _seg *DigiList;\r
221 static  char    buf[10];\r
222 \r
223         boolean                 done;\r
224         ScanCode                scan;\r
225         int                             i,j,k,x;\r
226         longword                l;\r
227         memptr                  addr;\r
228         PageListStruct  far *page;\r
229 \r
230         CenterWindow(20,16);\r
231         VW_UpdateScreen();\r
232         for (i = 0,done = false;!done;)\r
233         {\r
234                 US_ClearWindow();\r
235 //              sound = -1;\r
236 \r
237                 page = &PMPages[i];\r
238                 US_Print(" Page #");\r
239                 US_PrintUnsigned(i);\r
240                 if (i < PMSpriteStart)\r
241                         US_Print(" (Wall)");\r
242                 else if (i < PMSoundStart)\r
243                         US_Print(" (Sprite)");\r
244                 else if (i == ChunksInFile - 1)\r
245                         US_Print(" (Sound Info)");\r
246                 else\r
247                         US_Print(" (Sound)");\r
248 \r
249                 US_Print("\n XMS: ");\r
250                 if (page->xmsPage != -1)\r
251                         US_PrintUnsigned(page->xmsPage);\r
252                 else\r
253                         US_Print("No");\r
254 \r
255                 US_Print("\n Main: ");\r
256                 if (page->mainPage != -1)\r
257                         US_PrintUnsigned(page->mainPage);\r
258                 else if (page->emsPage != -1)\r
259                 {\r
260                         US_Print("EMS ");\r
261                         US_PrintUnsigned(page->emsPage);\r
262                 }\r
263                 else\r
264                         US_Print("No");\r
265 \r
266                 US_Print("\n Last hit: ");\r
267                 US_PrintUnsigned(page->lastHit);\r
268 \r
269                 US_Print("\n Address: ");\r
270                 addr = PM_GetPageAddress(i);\r
271                 sprintf(buf,"0x%04x",(word)addr);\r
272                 US_Print(buf);\r
273 \r
274                 if (addr)\r
275                 {\r
276                         if (i < PMSpriteStart)\r
277                         {\r
278                         //\r
279                         // draw the wall\r
280                         //\r
281                                 bufferofs += 32*SCREENWIDTH;\r
282                                 postx = 128;\r
283                                 postwidth = 1;\r
284                                 postsource = ((long)((unsigned)addr))<<16;\r
285                                 for (x=0;x<64;x++,postx++,postsource+=64)\r
286                                 {\r
287                                         wallheight[postx] = 256;\r
288                                         FarScalePost ();\r
289                                 }\r
290                                 bufferofs -= 32*SCREENWIDTH;\r
291                         }\r
292                         else if (i < PMSoundStart)\r
293                         {\r
294                         //\r
295                         // draw the sprite\r
296                         //\r
297                                 bufferofs += 32*SCREENWIDTH;\r
298                                 SimpleScaleShape (160, i-PMSpriteStart, 64);\r
299                                 bufferofs -= 32*SCREENWIDTH;\r
300                         }\r
301                         else if (i == ChunksInFile - 1)\r
302                         {\r
303                                 US_Print("\n\n Number of sounds: ");\r
304                                 US_PrintUnsigned(NumDigi);\r
305                                 for (l = j = k = 0;j < NumDigi;j++)\r
306                                 {\r
307                                         l += DigiList[(j * 2) + 1];\r
308                                         k += (DigiList[(j * 2) + 1] + (PMPageSize - 1)) / PMPageSize;\r
309                                 }\r
310                                 US_Print("\n Total bytes: ");\r
311                                 US_PrintUnsigned(l);\r
312                                 US_Print("\n Total pages: ");\r
313                                 US_PrintUnsigned(k);\r
314                         }\r
315                         else\r
316                         {\r
317                                 byte far *dp = (byte far *)MK_FP(addr,0);\r
318                                 for (j = 0;j < NumDigi;j++)\r
319                                 {\r
320                                         k = (DigiList[(j * 2) + 1] + (PMPageSize - 1)) / PMPageSize;\r
321                                         if\r
322                                         (\r
323                                                 (i >= PMSoundStart + DigiList[j * 2])\r
324                                         &&      (i < PMSoundStart + DigiList[j * 2] + k)\r
325                                         )\r
326                                                 break;\r
327                                 }\r
328                                 if (j < NumDigi)\r
329                                 {\r
330 //                                      sound = j;\r
331                                         US_Print("\n Sound #");\r
332                                         US_PrintUnsigned(j);\r
333                                         US_Print("\n Segment #");\r
334                                         US_PrintUnsigned(i - PMSoundStart - DigiList[j * 2]);\r
335                                 }\r
336                                 for (j = 0;j < page->length;j += 32)\r
337                                 {\r
338                                         byte v = dp[j];\r
339                                         int v2 = (unsigned)v;\r
340                                         v2 -= 128;\r
341                                         v2 /= 4;\r
342                                         if (v2 < 0)\r
343                                                 VWB_Vlin(WindowY + WindowH - 32 + v2,\r
344                                                                 WindowY + WindowH - 32,\r
345                                                                 WindowX + 8 + (j / 32),BLACK);\r
346                                         else\r
347                                                 VWB_Vlin(WindowY + WindowH - 32,\r
348                                                                 WindowY + WindowH - 32 + v2,\r
349                                                                 WindowX + 8 + (j / 32),BLACK);\r
350                                 }\r
351                         }\r
352                 }\r
353 \r
354                 VW_UpdateScreen();\r
355 \r
356                 while (!(scan = LastScan))\r
357                         SD_Poll();\r
358 \r
359                 IN_ClearKey(scan);\r
360                 switch (scan)\r
361                 {\r
362                 case sc_LeftArrow:\r
363                         if (i)\r
364                                 i--;\r
365                         break;\r
366                 case sc_RightArrow:\r
367                         if (++i >= ChunksInFile)\r
368                                 i--;\r
369                         break;\r
370                 case sc_W:      // Walls\r
371                         i = 0;\r
372                         break;\r
373                 case sc_S:      // Sprites\r
374                         i = PMSpriteStart;\r
375                         break;\r
376                 case sc_D:      // Digitized\r
377                         i = PMSoundStart;\r
378                         break;\r
379                 case sc_I:      // Digitized info\r
380                         i = ChunksInFile - 1;\r
381                         break;\r
382                 case sc_L:      // Load all pages\r
383                         for (j = 0;j < ChunksInFile;j++)\r
384                                 PM_GetPage(j);\r
385                         break;\r
386                 case sc_P:\r
387 //                      if (sound != -1)\r
388 //                              SD_PlayDigitized(sound);\r
389                         break;\r
390                 case sc_Escape:\r
391                         done = true;\r
392                         break;\r
393                 case sc_Enter:\r
394                         PM_GetPage(i);\r
395                         break;\r
396                 }\r
397         }\r
398         SD_StopDigitized();\r
399 }\r
400 #pragma warn +pia\r
401 \r
402 \r
403 \r
404 //===========================================================================\r
405 \r
406 \r
407 /*\r
408 ================\r
409 =\r
410 = DebugKeys\r
411 =\r
412 ================\r
413 */\r
414 \r
415 int DebugKeys (void)\r
416 {\r
417         boolean esc;\r
418         int level,i;\r
419 \r
420         if (Keyboard[sc_B])             // B = border color\r
421         {\r
422                 CenterWindow(24,3);\r
423                 PrintY+=6;\r
424                 US_Print(" Border color (0-15):");\r
425                 VW_UpdateScreen();\r
426                 esc = !US_LineInput (px,py,str,NULL,true,2,0);\r
427                 if (!esc)\r
428                 {\r
429                         level = atoi (str);\r
430                         if (level>=0 && level<=15)\r
431                                 VW_ColorBorder (level);\r
432                 }\r
433                 return 1;\r
434         }\r
435 \r
436         if (Keyboard[sc_C])             // C = count objects\r
437         {\r
438                 CountObjects();\r
439                 return 1;\r
440         }\r
441 \r
442         if (Keyboard[sc_E])             // E = quit level\r
443         {\r
444                 if (tedlevel)\r
445                         Quit (NULL);\r
446                 playstate = ex_completed;\r
447 //              gamestate.mapon++;\r
448         }\r
449 \r
450         if (Keyboard[sc_F])             // F = facing spot\r
451         {\r
452                 CenterWindow (14,4);\r
453                 US_Print ("X:");\r
454                 US_PrintUnsigned (player->x);\r
455                 US_Print ("\nY:");\r
456                 US_PrintUnsigned (player->y);\r
457                 US_Print ("\nA:");\r
458                 US_PrintUnsigned (player->angle);\r
459                 VW_UpdateScreen();\r
460                 IN_Ack();\r
461                 return 1;\r
462         }\r
463 \r
464         if (Keyboard[sc_G])             // G = god mode\r
465         {\r
466                 CenterWindow (12,2);\r
467                 if (godmode)\r
468                   US_PrintCentered ("God mode OFF");\r
469                 else\r
470                   US_PrintCentered ("God mode ON");\r
471                 VW_UpdateScreen();\r
472                 IN_Ack();\r
473                 godmode ^= 1;\r
474                 return 1;\r
475         }\r
476         if (Keyboard[sc_H])             // H = hurt self\r
477         {\r
478                 IN_ClearKeysDown ();\r
479                 TakeDamage (16,NULL);\r
480         }\r
481         else if (Keyboard[sc_I])                        // I = item cheat\r
482         {\r
483                 CenterWindow (12,3);\r
484                 US_PrintCentered ("Free items!");\r
485                 VW_UpdateScreen();\r
486                 GivePoints (100000);\r
487                 HealSelf (99);\r
488                 if (gamestate.bestweapon<wp_chaingun)\r
489                         GiveWeapon (gamestate.bestweapon+1);\r
490                 gamestate.ammo += 50;\r
491                 if (gamestate.ammo > 99)\r
492                         gamestate.ammo = 99;\r
493                 DrawAmmo ();\r
494                 IN_Ack ();\r
495                 return 1;\r
496         }\r
497         else if (Keyboard[sc_M])                        // M = memory info\r
498         {\r
499                 DebugMemory();\r
500                 return 1;\r
501         }\r
502 #ifdef SPEAR\r
503         else if (Keyboard[sc_N])                        // N = no clip\r
504         {\r
505                 noclip^=1;\r
506                 CenterWindow (18,3);\r
507                 if (noclip)\r
508                         US_PrintCentered ("No clipping ON");\r
509                 else\r
510                         US_PrintCentered ("No clipping OFF");\r
511                 VW_UpdateScreen();\r
512                 IN_Ack ();\r
513                 return 1;\r
514         }\r
515 #endif\r
516 #if 0\r
517         else if (Keyboard[sc_O])                        // O = overhead\r
518         {\r
519                 ViewMap();\r
520                 return 1;\r
521         }\r
522 #endif\r
523         else if (Keyboard[sc_P])                        // P = pause with no screen disruptioon\r
524         {\r
525                 PicturePause ();\r
526                 return 1;\r
527         }\r
528         else if (Keyboard[sc_Q])                        // Q = fast quit\r
529                 Quit (NULL);\r
530         else if (Keyboard[sc_S])                        // S = slow motion\r
531         {\r
532                 singlestep^=1;\r
533                 CenterWindow (18,3);\r
534                 if (singlestep)\r
535                         US_PrintCentered ("Slow motion ON");\r
536                 else\r
537                         US_PrintCentered ("Slow motion OFF");\r
538                 VW_UpdateScreen();\r
539                 IN_Ack ();\r
540                 return 1;\r
541         }\r
542         else if (Keyboard[sc_T])                        // T = shape test\r
543         {\r
544                 ShapeTest ();\r
545                 return 1;\r
546         }\r
547         else if (Keyboard[sc_V])                        // V = extra VBLs\r
548         {\r
549                 CenterWindow(30,3);\r
550                 PrintY+=6;\r
551                 US_Print("  Add how many extra VBLs(0-8):");\r
552                 VW_UpdateScreen();\r
553                 esc = !US_LineInput (px,py,str,NULL,true,2,0);\r
554                 if (!esc)\r
555                 {\r
556                         level = atoi (str);\r
557                         if (level>=0 && level<=8)\r
558                                 extravbls = level;\r
559                 }\r
560                 return 1;\r
561         }\r
562         else if (Keyboard[sc_W])                        // W = warp to level\r
563         {\r
564                 CenterWindow(26,3);\r
565                 PrintY+=6;\r
566 #ifndef SPEAR\r
567                 US_Print("  Warp to which level(1-10):");\r
568 #else\r
569                 US_Print("  Warp to which level(1-21):");\r
570 #endif\r
571                 VW_UpdateScreen();\r
572                 esc = !US_LineInput (px,py,str,NULL,true,2,0);\r
573                 if (!esc)\r
574                 {\r
575                         level = atoi (str);\r
576 #ifndef SPEAR\r
577                         if (level>0 && level<11)\r
578 #else\r
579                         if (level>0 && level<22)\r
580 #endif\r
581                         {\r
582                                 gamestate.mapon = level-1;\r
583                                 playstate = ex_warped;\r
584                         }\r
585                 }\r
586                 return 1;\r
587         }\r
588         else if (Keyboard[sc_X])                        // X = item cheat\r
589         {\r
590                 CenterWindow (12,3);\r
591                 US_PrintCentered ("Extra stuff!");\r
592                 VW_UpdateScreen();\r
593                 // DEBUG: put stuff here\r
594                 IN_Ack ();\r
595                 return 1;\r
596         }\r
597 \r
598         return 0;\r
599 }\r
600 \r
601 \r
602 #if 0\r
603 /*\r
604 ===================\r
605 =\r
606 = OverheadRefresh\r
607 =\r
608 ===================\r
609 */\r
610 \r
611 void OverheadRefresh (void)\r
612 {\r
613         unsigned        x,y,endx,endy,sx,sy;\r
614         unsigned        tile;\r
615 \r
616 \r
617         endx = maporgx+VIEWTILEX;\r
618         endy = maporgy+VIEWTILEY;\r
619 \r
620         for (y=maporgy;y<endy;y++)\r
621                 for (x=maporgx;x<endx;x++)\r
622                 {\r
623                         sx = (x-maporgx)*16;\r
624                         sy = (y-maporgy)*16;\r
625 \r
626                         switch (viewtype)\r
627                         {\r
628 #if 0\r
629                         case mapview:\r
630                                 tile = *(mapsegs[0]+farmapylookup[y]+x);\r
631                                 break;\r
632 \r
633                         case tilemapview:\r
634                                 tile = tilemap[x][y];\r
635                                 break;\r
636 \r
637                         case visview:\r
638                                 tile = spotvis[x][y];\r
639                                 break;\r
640 #endif\r
641                         case actoratview:\r
642                                 tile = (unsigned)actorat[x][y];\r
643                                 break;\r
644                         }\r
645 \r
646                         if (tile<MAXWALLTILES)\r
647                                 LatchDrawTile(sx,sy,tile);\r
648                         else\r
649                         {\r
650                                 LatchDrawChar(sx,sy,NUMBERCHARS+((tile&0xf000)>>12));\r
651                                 LatchDrawChar(sx+8,sy,NUMBERCHARS+((tile&0x0f00)>>8));\r
652                                 LatchDrawChar(sx,sy+8,NUMBERCHARS+((tile&0x00f0)>>4));\r
653                                 LatchDrawChar(sx+8,sy+8,NUMBERCHARS+(tile&0x000f));\r
654                         }\r
655                 }\r
656 \r
657 }\r
658 #endif\r
659 \r
660 #if 0\r
661 /*\r
662 ===================\r
663 =\r
664 = ViewMap\r
665 =\r
666 ===================\r
667 */\r
668 \r
669 void ViewMap (void)\r
670 {\r
671         boolean         button0held;\r
672 \r
673         viewtype = actoratview;\r
674 //      button0held = false;\r
675 \r
676 \r
677         maporgx = player->tilex - VIEWTILEX/2;\r
678         if (maporgx<0)\r
679                 maporgx = 0;\r
680         if (maporgx>MAPSIZE-VIEWTILEX)\r
681                 maporgx=MAPSIZE-VIEWTILEX;\r
682         maporgy = player->tiley - VIEWTILEY/2;\r
683         if (maporgy<0)\r
684                 maporgy = 0;\r
685         if (maporgy>MAPSIZE-VIEWTILEY)\r
686                 maporgy=MAPSIZE-VIEWTILEY;\r
687 \r
688         do\r
689         {\r
690 //\r
691 // let user pan around\r
692 //\r
693                 PollControls ();\r
694                 if (controlx < 0 && maporgx>0)\r
695                         maporgx--;\r
696                 if (controlx > 0 && maporgx<mapwidth-VIEWTILEX)\r
697                         maporgx++;\r
698                 if (controly < 0 && maporgy>0)\r
699                         maporgy--;\r
700                 if (controly > 0 && maporgy<mapheight-VIEWTILEY)\r
701                         maporgy++;\r
702 \r
703 #if 0\r
704                 if (c.button0 && !button0held)\r
705                 {\r
706                         button0held = true;\r
707                         viewtype++;\r
708                         if (viewtype>visview)\r
709                                 viewtype = mapview;\r
710                 }\r
711                 if (!c.button0)\r
712                         button0held = false;\r
713 #endif\r
714 \r
715                 OverheadRefresh ();\r
716 \r
717         } while (!Keyboard[sc_Escape]);\r
718 \r
719         IN_ClearKeysDown ();\r
720 }\r
721 #endif\r
722 \r