wolf3d

The original open source release of Wolfenstein 3D
Log | Files | Refs

WL_DEBUG.C (12682B)


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