// WL_DEBUG.C
#include "WL_DEF.H"
#pragma hdrstop
#include BIOS.H
/*
=============================================================================
LOCAL CONSTANTS
=============================================================================
*/
#define viewTILEX (viewwidth/16)
#define viewTILEY (viewheight/16)
/*
=============================================================================
GLOBAL VARIABLES
=============================================================================
*/
int DebugKeys (void);
/*
=============================================================================
LOCAL VARIABLES
=============================================================================
*/
int maporgx;
int maporgy;
enum {mapview,tilemapview,actoratview,visview} viewtype;
void viewmap (void);
//===========================================================================
/*
==================
=
= DebugMemory
=
==================
*/
void DebugMemory (void)
{
int i;
char scratch[80],str[10];
long mem;
spritetype _seg *block;
CenterWindow (16,7);
US_CPrint ("Memory USage");
US_CPrint ("------------");
US_Print ("Total :");
US_PrintUnsigned (mminfo.mainmem/1024);
US_Print ("k\nFree :");
US_PrintUnsigned (mm_UnUSedMemory()/1024);
US_Print ("k\nWith purge:");
US_PrintUnsigned (mm_TotalFree()/1024);
US_Print ("k\n");
VW_UpdateScreen();
IN_Ack ();
}
//===========================================================================
/*
==================
=
= CountObjects
=
==================
*/
void CountObjects (void)
{
int i,total,count,active,inactive,doors;
objtype *obj;
CenterWindow (16,7);
active = inactive = count = doors = 0;
US_Print ("Total statics :");
total = laststatobj-&statobjlist[0];
US_PrintUnsigned (total);
US_Print ("\nIn USe statics:");
for (i=0;i total;i++)
if (statobjlist[i].shapenum != -1)
count++;
else
doors++; //debug
US_PrintUnsigned (count);
US_Print ("\nDoors :");
US_PrintUnsigned (doornum);
for (obj=player->next;obj;obj=obj->next)
{
if (obj->active)
active++;
else
inactive++;
}
US_Print ("\nTotal actors :");
US_PrintUnsigned (active+inactive);
US_Print ("\nActive actors :");
US_PrintUnsigned (active);
VW_UpdateScreen();
IN_Ack ();
}
//===========================================================================
/*
================
=
= PicturePaUSe
=
================
*/
void PicturePaUSe (void)
{
int i;
byte p;
unsigned x;
byte far *dest,far *src;
memptr buffer;
VW_ColorBorder (15);
FinishPaletteShifts ();
LastScan = 0;
while (!LastScan)
;
if (LastScan != sc_Enter)
{
VW_ColorBorder (0);
return;
}
VW_ColorBorder (1);
VW_SetScreen (0,0);
//
// vga stuff...
//
ClearMemory ();
CA_SetAllPurge();
mm_GetPtr (&buffer,64000);
for (p=0;p 4;p++)
{
src = MK_FP(0xa000,displayofs);
dest = (byte far *)buffer+p;
VGAREADmap(p);
for (x=0;x 16000;x++,dest+=4)
*dest = *src++;
}
#if 0
for (p=0;p 4;p++)
{
src = MK_FP(0xa000,0);
dest = (byte far *)buffer+51200+p;
VGAREADmap(p);
for (x=0;x 3200;x++,dest+=4)
*dest = *src++;
}
#endif
asm mov ax,0x13
asm int 0x10
dest = MK_FP(0xa000,0);
_fmemcpy (dest,buffer,64000);
VL_SetPalette (&gamepal);
IN_Shutdown ();
VW_WaitVBL(70);
biosKey(0);
VW_WaitVBL(70);
Quit (NULL);
}
//===========================================================================
/*
================
=
= ShapeTest
=
================
*/
#pragma warn -pia
void ShapeTest (void)
{
extern word NumDigi;
extern word _seg *DigiList;
static char buf[10];
boolean done;
ScanCode scan;
int i,j,k,x;
longword l;
memptr addr;
PageListStruct far *page;
CenterWindow(20,16);
VW_UpdateScreen();
for (i = 0,done = false;!done;)
{
US_ClearWindow();
// sound = -1;
page = &PMPages[i];
US_Print(" Page #");
US_PrintUnsigned(i);
if (i PMSpriteStart)
US_Print(" (Wall)");
else if (i PMSoundStart)
US_Print(" (Sprite)");
else if (i == ChunksInFile - 1)
US_Print(" (Sound Info)");
else
US_Print(" (Sound)");
US_Print("\n XMS: ");
if (page->xmsPage != -1)
US_PrintUnsigned(page->xmsPage);
else
US_Print("No");
US_Print("\n Main: ");
if (page->mainPage != -1)
US_PrintUnsigned(page->mainPage);
else if (page->emsPage != -1)
{
US_Print("EMS ");
US_PrintUnsigned(page->emsPage);
}
else
US_Print("No");
US_Print("\n Last hit: ");
US_PrintUnsigned(page->lastHit);
US_Print("\n Address: ");
addr = PM_GetPageAddress(i);
sprintf(buf,"0x%04x",(word)addr);
US_Print(buf);
if (addr)
{
if (i PMSpriteStart)
{
//
// draw the wall
//
bufferofs += 32*SCREENWIDTH;
postx = 128;
postwidth = 1;
postsource = ((long)((unsigned)addr)) 16;
for (x=0;x 64;x++,postx++,postsource+=64)
{
wallheight[postx] = 256;
farScalePost ();
}
bufferofs -= 32*SCREENWIDTH;
}
else if (i PMSoundStart)
{
//
// draw the sprite
//
bufferofs += 32*SCREENWIDTH;
SimpleScaleShape (160, i-PMSpriteStart, 64);
bufferofs -= 32*SCREENWIDTH;
}
else if (i == ChunksInFile - 1)
{
US_Print("\n\n Number of sounds: ");
US_PrintUnsigned(NumDigi);
for (l = j = k = 0;j NumDigi;j++)
{
l += DigiList[(j * 2) + 1];
k += (DigiList[(j * 2) + 1] + (PMPageSize - 1)) / PMPageSize;
}
US_Print("\n Total bytes: ");
US_PrintUnsigned(l);
US_Print("\n Total pages: ");
US_PrintUnsigned(k);
}
else
{
byte far *dp = (byte far *)MK_FP(addr,0);
for (j = 0;j NumDigi;j++)
{
k = (DigiList[(j * 2) + 1] + (PMPageSize - 1)) / PMPageSize;
if
(
(i >= PMSoundStart + DigiList[j * 2])
&& (i PMSoundStart + DigiList[j * 2] + k)
)
break;
}
if (j NumDigi)
{
// sound = j;
US_Print("\n Sound #");
US_PrintUnsigned(j);
US_Print("\n Segment #");
US_PrintUnsigned(i - PMSoundStart - DigiList[j * 2]);
}
for (j = 0;j page->length;j += 32)
{
byte v = dp[j];
int v2 = (unsigned)v;
v2 -= 128;
v2 /= 4;
if (v2 0)
VWB_Vlin(WindowY + WindowH - 32 + v2,
WindowY + WindowH - 32,
WindowX + 8 + (j / 32),BLACK);
else
VWB_Vlin(WindowY + WindowH - 32,
WindowY + WindowH - 32 + v2,
WindowX + 8 + (j / 32),BLACK);
}
}
}
VW_UpdateScreen();
while (!(scan = LastScan))
SD_Poll();
IN_ClearKey(scan);
switch (scan)
{
case sc_LeftArrow:
if (i)
i--;
break;
case sc_RightArrow:
if (++i >= ChunksInFile)
i--;
break;
case sc_W: // Walls
i = 0;
break;
case sc_S: // Sprites
i = PMSpriteStart;
break;
case sc_D: // Digitized
i = PMSoundStart;
break;
case sc_I: // Digitized info
i = ChunksInFile - 1;
break;
case sc_L: // Load all pages
for (j = 0;j ChunksInFile;j++)
PM_GetPage(j);
break;
case sc_P:
// if (sound != -1)
// SD_PlayDigitized(sound);
break;
case sc_Escape:
done = true;
break;
case sc_Enter:
PM_GetPage(i);
break;
}
}
SD_StopDigitized();
}
#pragma warn +pia
//===========================================================================
/*
================
=
= DebugKeys
=
================
*/
int DebugKeys (void)
{
boolean esc;
int level,i;
if (Keyboard[sc_B]) // B = border color
{
CenterWindow(24,3);
PrintY+=6;
US_Print(" Border color (0-15):");
VW_UpdateScreen();
esc = !US_LineInput (px,py,str,NULL,true,2,0);
if (!esc)
{
level = atoi (str);
if (level>=0 && level =15)
VW_ColorBorder (level);
}
return 1;
}
if (Keyboard[sc_C]) // C = count objects
{
CountObjects();
return 1;
}
if (Keyboard[sc_E]) // E = quit level
{
if (tedlevel)
Quit (NULL);
playstate = ex_completed;
// gamestate.mapon++;
}
if (Keyboard[sc_F]) // F = facing spot
{
CenterWindow (14,4);
US_Print ("X:");
US_PrintUnsigned (player->x);
US_Print ("\nY:");
US_PrintUnsigned (player->y);
US_Print ("\nA:");
US_PrintUnsigned (player->angle);
VW_UpdateScreen();
IN_Ack();
return 1;
}
if (Keyboard[sc_G]) // G = God mode
{
CenterWindow (12,2);
if (Godmode)
US_PrintCentered ("God mode OFF");
else
US_PrintCentered ("God mode ON");
VW_UpdateScreen();
IN_Ack();
Godmode ^= 1;
return 1;
}
if (Keyboard[sc_H]) // H = hurt self
{
IN_ClearKeysDown ();
TakeDamage (16,NULL);
}
else if (Keyboard[sc_I]) // I = item cheat
{
CenterWindow (12,3);
US_PrintCentered ("Free items!");
VW_UpdateScreen();
GivePoints (100000);
HealSelf (99);
if (gamestate.bestweapon wp_chaingun)
GiveWeapon (gamestate.bestweapon+1);
gamestate.ammo += 50;
if (gamestate.ammo > 99)
gamestate.ammo = 99;
DrawAmmo ();
IN_Ack ();
return 1;
}
else if (Keyboard[sc_M]) // M = memory info
{
DebugMemory();
return 1;
}
#ifdef SPEAR
else if (Keyboard[sc_N]) // N = no clip
{
noclip^=1;
CenterWindow (18,3);
if (noclip)
US_PrintCentered ("No clipping ON");
else
US_PrintCentered ("No clipping OFF");
VW_UpdateScreen();
IN_Ack ();
return 1;
}
#endif
#if 0
else if (Keyboard[sc_O]) // O = overhead
{
viewmap();
return 1;
}
#endif
else if (Keyboard[sc_P]) // P = paUSe with no screen disruptioon
{
PicturePaUSe ();
return 1;
}
else if (Keyboard[sc_Q]) // Q = fast quit
Quit (NULL);
else if (Keyboard[sc_S]) // S = slow motion
{
singlestep^=1;
CenterWindow (18,3);
if (singlestep)
US_PrintCentered ("Slow motion ON");
else
US_PrintCentered ("Slow motion OFF");
VW_UpdateScreen();
IN_Ack ();
return 1;
}
else if (Keyboard[sc_T]) // T = shape test
{
ShapeTest ();
return 1;
}
else if (Keyboard[sc_V]) // V = extra VBLs
{
CenterWindow(30,3);
PrintY+=6;
US_Print(" Add how many extra VBLs(0-8):");
VW_UpdateScreen();
esc = !US_LineInput (px,py,str,NULL,true,2,0);
if (!esc)
{
level = atoi (str);
if (level>=0 && level =8)
extravbls = level;
}
return 1;
}
else if (Keyboard[sc_W]) // W = warp to level
{
CenterWindow(26,3);
PrintY+=6;
#ifndef SPEAR
US_Print(" Warp to which level(1-10):");
#else
US_Print(" Warp to which level(1-21):");
#endif
VW_UpdateScreen();
esc = !US_LineInput (px,py,str,NULL,true,2,0);
if (!esc)
{
level = atoi (str);
#ifndef SPEAR
if (level>0 && level 11)
#else
if (level>0 && level 22)
#endif
{
gamestate.mapon = level-1;
playstate = ex_warped;
}
}
return 1;
}
else if (Keyboard[sc_X]) // X = item cheat
{
CenterWindow (12,3);
US_PrintCentered ("Extra stuff!");
VW_UpdateScreen();
// DEBUG: put stuff here
IN_Ack ();
return 1;
}
return 0;
}
#if 0
/*
===================
=
= OverheadRefresh
=
===================
*/
void OverheadRefresh (void)
{
unsigned x,y,endx,endy,sx,sy;
unsigned tile;
endx = maporgx+viewTILEX;
endy = maporgy+viewTILEY;
for (y=maporgy;y endy;y++)
for (x=maporgx;x endx;x++)
{
sx = (x-maporgx)*16;
sy = (y-maporgy)*16;
switch (viewtype)
{
#if 0
case mapview:
tile = *(mapsegs[0]+farmapylookup[y]+x);
break;
case tilemapview:
tile = tilemap[x][y];
break;
case visview:
tile = spotvis[x][y];
break;
#endif
case actoratview:
tile = (unsigned)actorat[x][y];
break;
}
if (tile MAXWALLTILES)
LatchDrawTile(sx,sy,tile);
else
{
LatchDrawChar(sx,sy,NUMBERCHARS+((tile&0xf000)>>12));
LatchDrawChar(sx+8,sy,NUMBERCHARS+((tile&0x0f00)>>8));
LatchDrawChar(sx,sy+8,NUMBERCHARS+((tile&0x00f0)>>4));
LatchDrawChar(sx+8,sy+8,NUMBERCHARS+(tile&0x000f));
}
}
}
#endif
#if 0
/*
===================
=
= viewmap
=
===================
*/
void viewmap (void)
{
boolean button0held;
viewtype = actoratview;
// button0held = false;
maporgx = player->tilex - viewTILEX/2;
if (maporgx 0)
maporgx = 0;
if (maporgx>mapSIZE-viewTILEX)
maporgx=mapSIZE-viewTILEX;
maporgy = player->tiley - viewTILEY/2;
if (maporgy 0)
maporgy = 0;
if (maporgy>mapSIZE-viewTILEY)
maporgy=mapSIZE-viewTILEY;
do
{
//
// let USer pan around
//
PollControls ();
if (controlx 0 && maporgx>0)
maporgx--;
if (controlx > 0 && maporgx mapwidth-viewTILEX)
maporgx++;
if (controly 0 && maporgy>0)
maporgy--;
if (controly > 0 && maporgy mapheight-viewTILEY)
maporgy++;
#if 0
if (c.button0 && !button0held)
{
button0held = true;
viewtype++;
if (viewtype>visview)
viewtype = mapview;
}
if (!c.button0)
button0held = false;
#endif
OverheadRefresh ();
} while (!Keyboard[sc_Escape]);
IN_ClearKeysDown ();
}
#endif