rott/rott/rt_debug.c

1685 lines
34 KiB
C
Executable File

/*
Copyright (C) 1994-1995 Apogee Software, Ltd.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "rt_def.h"
#include "rt_debug.h"
#include "isr.h"
#include "rt_game.h"
#include "rt_menu.h"
#include "rt_build.h"
#include "rt_str.h"
#include "rt_vid.h"
#include "rt_playr.h"
#include "rt_main.h"
#include "rt_util.h"
#include "rt_draw.h"
#include "rt_in.h"
#include "z_zone.h"
#include "rt_ted.h"
#include "rt_view.h"
#include "develop.h"
#include "rt_msg.h"
#include "rt_net.h"
#include "rt_sound.h"
#include "rt_stat.h"
#include "rt_map.h"
#include <stdlib.h>
#include <ctype.h>
//MED
#include "memcheck.h"
#include "w_wad.h"
extern int iDemoNames;
extern boolean iG_aimCross;
extern void DisplayMessage (int num,int position);
typedef struct {
char code[15];
byte length;
} CodeStruct;
enum
{
ENABLECHEAT, // enable cheats
ENABLECHEATALT, // enable cheats
SOMEITEMS, // three keys, more health
SOMEITEMSALT, // three keys, more health
INVULNERABLE, // normal god mode
INVULNERABLEALT, // normal god mode
WARP, // warp
WARPALT, // warp
ITEMS, // all keys, armor, 100% health
ITEMSALT, // all keys, armor, 100% health
GODMODEPWUP, // god mode powerup
GODMODEPWUPALT, // god mode powerup
#if (SHAREWARE == 0)
DOGMODEPWUP, // dog mode powerup
DOGMODEPWUPALT, // dog mode powerup
#endif
MERCURYPWUP, // mercury mode powerup
MERCURYPWUPALT, // mercury mode powerup
SHROOMSPWUP, // shrooms mode powerup
SHROOMSPWUPALT, // shrooms mode powerup
ELASTOPWUP, // elasto mode powerup
ELASTOPWUPALT, // elasto mode powerup
RESTARTGAME, // warp to level 1, start with pistol
RESTARTGAMEALT, // warp to level 1, start with pistol
HURTPLAYER, // hurt player 10%
HURTPLAYERALT, // hurt player 10%
TOMHALLMODE, // run fast all the time
TOMHALLMODEALT, // run fast all the time
NORMAL, // back to normal
NORMALALT, // back to normal
LIGHTDIMON, // light diminishing on
LIGHTDIMONALT, // light diminishing on
LIGHTDIMOFF, // light diminishing off
LIGHTDIMOFFALT, // light diminishing off
FOGON, // fog on (0x00 - 0x80 minmax)
FOGONALT, // fog on (0x00 - 0x80 minmax)
FOGOFF, // fog off (0x80 - 0xFF minmax)
FOGOFFALT, // fog off (0x80 - 0xFF minmax)
QUITGAME, // blow out of game
QUITGAMEALT, // blow out of game
ENDLEVEL, // end the current level
ENDLEVELALT, // end the current level
FANDCOFF, // floor and ceiling off
FANDCOFFALT, // floor and ceiling off
FANDCON, // floor and ceiling on
FANDCONALT, // floor and ceiling on
BULLETARMOR, // bullet proof armor
BULLETARMORALT, // bullet proof armor
FIREARMOR, // fire proof armor
FIREARMORALT, // fire proof armor
GASMASK, // gas mask
GASMASKALT, // gas mask
OUTFIT, // all keys, armor, 100% health, MP40, heatseek
OUTFITALT, // all keys, armor, 100% health, MP40, heatseek
KILLPLAYER, // kill player
KILLPLAYERALT, // kill player
RESTARTLEVEL, // re-enter level
RESTARTLEVELALT, // re-enter level
WEAPONTWOPISTOL, // give double pistol
WEAPONTWOPISTOLALT, // give double pistol
WEAPONMP40, // give mp40
WEAPONMP40ALT, // give mp40
WEAPONBAZOOKA, // give bazooka
WEAPONBAZOOKAALT, // give bazooka
WEAPONHEAT, // give heatseeker
WEAPONHEATALT, // give heatseeker
WEAPONDRUNK, // give drunk missile
WEAPONDRUNKALT, // give drunk missile
WEAPONFIREBOMB, // give firebomb
WEAPONFIREBOMBALT, // give firebomb
WEAPONFIREWALL, // give firewall
WEAPONFIREWALLALT, // give firewall
WEAPONGOD, // give godhand
WEAPONGODALT, // give godhand
AIMCROSS, // bna++
AIMCROSSALT, // give bna++
#if (SHAREWARE == 0)
WEAPONSPLIT, // give split missile
WEAPONSPLITALT, // give split missile
WEAPONKES, // give kes
WEAPONKESALT, // give kes
WEAPONBAT, // give bat
WEAPONBATALT, // give bat
WEAPONDOG, // give dogmode
WEAPONDOGALT, // give dogmode
#endif
MISSILECAMTOGGLE, // Turn missile cam on/off
MISSILECAMTOGGLEALT, // Turn missile cam on/off
HUDTOGGLE, // Turn HUD on/off
HUDTOGGLEALT, // Turn HUD on/off
ROTATIONFUN, // Rotation fun
DEMORECORD, // Start recording demo
DEMOEND, // End recording demo
DEMOPLAYBACK, // Playback demo
CRAZYGIBS, // Engine Killing Gibs
JUKEBOX, // JukeBox
JUKEBOXALT, // JukeBox
MAPCHEAT, // Map Cheat
MAPCHEATALT, // Map Cheat Alt
MAXCODES
};
CodeStruct Codes[MAXCODES + 6] =
{
{"KCITSPID", 8}, // enable cheats
{"CCE\\", 4}, // enable cheats
{"REKCALS", 7}, // three keys, more health
{"MUB\\", 4}, // three keys, more health
{"NIJOHC", 6}, // normal god mode
{"WWW\\", 4}, // normal god mode
{"OTOG", 4}, // warp
{"LTG\\", 4}, // warp
{"SYOTXIS", 7}, // all keys, armor, 100% health
{"IAG\\", 4}, // all keys, armor, 100% health
{"DASOOT", 6}, // god mode powerup
{"DOG\\", 4}, // god mode powerup
#if (SHAREWARE == 0)
{"FOOW", 4}, // dog mode powerup
{"GOD\\", 4}, // dog mode powerup
#endif
{"YOBYLF", 6}, // mercury mode powerup
{"REM\\", 4}, // mercury mode powerup
{"PIRTDAB", 7}, // shrooms mode powerup
{"RHS\\", 4}, // shrooms mode powerup
{"GNIOB", 5}, // elasto mode powerup
{"ALE\\", 4}, // elasto mode powerup
{"SREBOOG", 7}, // warp to level 1, start with pistol
{"OOG\\", 4}, // warp to level 1, start with pistol
{"KCAHW", 5}, // hurt player 10%
{"FOO\\", 4}, // hurt player 10%
{"DEEPS", 5}, // run fast all the time
{"AFR\\", 4}, // run fast all the time
{"CINAP", 5}, // back to normal
{"NAP\\", 4}, // back to normal
{"NOMID", 5}, // light diminishing on
{"NOD\\", 4}, // light diminishing on
{"FFOMID", 6}, // light diminishing off
{"FOD\\", 4}, // light diminishing off
{"NODNOL", 6}, // fog on (0x00 - 0x80 minmax)
{"NOF\\", 4}, // fog on (0x00 - 0x80 minmax)
{"LONDON", 6}, // fog off (0x80 - 0xFF minmax)
{"FOF\\", 4}, // fog off (0x80 - 0xFF minmax)
{"SETAGOG", 7}, // blow out of game
{"R8L\\", 4}, // blow out of game
{"HCRAOG", 6}, // end the current level
{"LCE\\", 4}, // end the current level
{"683ATOG", 7}, // floor and ceiling off
{"NOC\\", 4}, // floor and ceiling off
{"684ATOG", 7}, // floor and ceiling on
{"FOC\\", 4}, // floor and ceiling on
{"EMTOOHS", 7}, // bullet proof armor
{"RAB\\", 4}, // bullet proof armor
{"EMNRUB", 6}, // fire proof armor
{"RAF\\", 4}, // fire proof armor
{"GNUDGNUL", 8}, // gas mask
{"RAG\\", 4}, // gas mask
{"KCAPTNUH", 8}, // all keys, armor, 100% health, MP40, heatseek
{"PFO\\", 4}, // all keys, armor, 100% health, MP40, heatseek
{"EM68", 4}, // kill player
{"EID\\", 4}, // kill player
{"REEN", 4}, // re-enter level
{"LER\\", 4}, // re-enter level
{"OOWNHOJ", 7}, // give double pistol
{"2WG\\", 4}, // give double pistol
{"EMGULP", 6}, // give mp40
{"3WG\\", 4}, // give mp40
{"ALLINAV", 7}, // give bazooka
{"4WG\\", 4}, // give bazooka
{"SEMITTOH", 8}, // give heatseeker
{"5WG\\", 4}, // give heatseeker
{"EZOOB", 5}, // give drunk missile
{"6WG\\", 4}, // give drunk missile
{"BMOBERIF", 8}, // give firebomb
{"7WG\\", 4}, // give firebomb
{"SENOB", 5}, // give firewall
{"8WG\\", 4}, // give firewall
{"AYEES", 5}, // give god hand
{"9WG\\", 4}, // give god hand
{"MIA", 3}, // give aim bna++
{"MIA\\", 4}, // give aim bna++
#if (SHAREWARE == 0)
{"TILPS", 5}, // give split missile
{"AWG\\", 4}, // give split missile
{"HTAEDFOSEK", 10}, // give kes
{"BWG\\", 4}, // give kes
{"NUREMOH", 8}, // give bat
{"CWG\\", 4}, // give bat
{"OJUC", 4}, // give dog weapon
{"DWG\\", 4}, // give dog weapon
#endif
{"EDIR", 4}, // give MISSILE CAM
{"MAC\\", 4}, // give Missile Cam
{"EREHW", 5}, // turn where am i on/off
{"DUH\\", 4}, // give hud
{"NUF\\", 4}, // Rotation fun
{"DROCER", 6}, // Demo RECORD
{"POTS", 4}, // Demo stop recording
{"YALP", 4}, // Demo Playback
{"GKE\\", 4}, // Engine Killing Gibs
{"ORTSEAM", 7}, // JukeBox
{"EEL\\", 4}, // JukeBox
{"REITRAC", 7}, // Map Cheat
{"PAM\\", 4}, // Map Cheat
{"UOY\\", 4}, // Secret Message
{"EVAH", 4}, // Secret Message
{"ON\\", 3}, // Secret Message
{"EFIL", 4}, // Secret Message
};
/*
================
=
= CheatSpawnItem
=
================
*/
void CheatSpawnItem (int item)
{
SpawnStatic(player->tilex, player->tiley, item,-1);
LASTSTAT->z = player->z;
MakeStatActive(LASTSTAT);
LASTSTAT->flags|=FL_ABP;
}
/*
================
=
= FixupPowerupsY
=
================
*/
void FixupPowerupsY (void)
{
player->z = nominalheight;
}
/*
================
=
= EnableCheatCodes
=
================
*/
void EnableCheatCodes (void)
{
DebugOk ^= 1;
if (DebugOk)
AddMessage ("Cheat Codes \\cENABLED!", MSG_CHEAT);
else
AddMessage ("Cheat Codes \\cDISABLED!", MSG_CHEAT);
}
/*
================
=
= ResetCheatCodes
=
================
*/
void ResetCheatCodes (void)
{
// godmode = false;
}
/*
================
=
= DoMapCheat
=
================
*/
void DoMapCheat (void)
{
AddMessage ("Entire Map Revealed!", MSG_CHEAT);
CheatMap ();
}
/*
================
=
= DoGodMode
=
================
*/
void DoGodMode (void)
{
if (godmode)
AddMessage ("Woundless With Weapons \\cOFF", MSG_CHEAT);
else
AddMessage ("Woundless With Weapons \\cON", MSG_CHEAT);
godmode ^= 1;
}
/*
================
=
= DoWarp
=
================
*/
#include "byteordr.h"//bna++
void DoWarp (void)
{
/*
char str[10];
boolean esc;
int level;
CurrentFont = smallfont;
US_CenterWindow(26,3);
PrintY+=6;
US_Print(" Warp to level(1-99):");
VW_UpdateScreen();
ShutdownClientControls();
esc = !US_LineInput (px, py, str, NULL, true, 2, 25, 13);
if (!esc)
{
level = ParseNum (str);
if (level>0 && level<=99)
{
gamestate.mapon = level-1;
playstate = ex_warped;
gamestate.episode = GetEpisode (gamestate.mapon);
}
}
while (Keyboard[sc_Escape])
IN_UpdateKeyboard ();
IN_ClearKeyboardQueue ();
*/
int level;
EnableScreenStretch();//bna++ shut on streech mode
MU_StoreSongPosition();
MU_StartSong( song_secretmenu);
StopWind();
ShutdownClientControls();
SetupMenuBuf();
SetUpControlPanel ();
level = CP_LevelSelectionMenu();
CleanUpControlPanel();
ShutdownMenuBuf();
//bna++ section
if (( playstate == ex_stillplaying )&&(iGLOBAL_SCREENWIDTH > 320)){
pic_t *shape;
shape = ( pic_t * )W_CacheLumpName( "backtile", PU_CACHE, Cvt_pic_t, 1 );
DrawTiledRegion( 0, 16, iGLOBAL_SCREENWIDTH, iGLOBAL_SCREENHEIGHT - 32, 0, 16, shape );
DisableScreenStretch();//dont strech when we go BACK TO GAME
DrawPlayScreen(true);//repaint ammo and life stat
VW_UpdateScreen ();//update screen
}
//bna section end
EnableScreenStretch();//bna++ shut on streech mode
while( Keyboard[ sc_Escape ] )
{
IN_UpdateKeyboard();
}
IN_ClearKeyboardQueue();
if ((level == -1) || (level == gamestate.mapon))
{
MU_StartSong(song_level);
MU_RestoreSongPosition();
}
if ( level >= 0 )
{
playstate = ex_warped;
gamestate.mapon = level;
GetEpisode( gamestate.mapon );
VL_FadeOut (0, 255, 0, 0, 0, 20);
}
else
{
DisableScreenStretch();//dont strech when we go BACK TO GAME
SetupScreen(true);
}
StartupClientControls();
}
/*
================
=
= DoJukeBox
=
================
*/
void DoJukeBox (void)
{
if (iGLOBAL_SCREENWIDTH > 320) {
EnableScreenStretch();//bna++ shut on streech mode
}
StopWind();
ShutdownClientControls();
SetupMenuBuf();
SetUpControlPanel ();
MU_JukeBoxMenu();
CleanUpControlPanel();
ShutdownMenuBuf();
//bna++ section
if (( playstate == ex_stillplaying )&&(iGLOBAL_SCREENWIDTH > 320)){
pic_t *shape;
shape = ( pic_t * )W_CacheLumpName( "backtile", PU_CACHE, Cvt_pic_t, 1 );
DrawTiledRegion( 0, 16, iGLOBAL_SCREENWIDTH, iGLOBAL_SCREENHEIGHT - 32, 0, 16, shape );
DisableScreenStretch();//dont strech when we go BACK TO GAME
DrawPlayScreen(true);//repaint ammo and life stat
VW_UpdateScreen ();//update screen
}
//bna section end
SetupScreen(true);
while( Keyboard[ sc_Escape ] )
{
IN_UpdateKeyboard();
}
IN_ClearKeyboardQueue();
StartupClientControls();
}
/*
================
=
= DoNormalThing
=
================
*/
void DoNormalThing (void)
{
AddMessage ("BACK TO NORMAL. AH.", MSG_CHEAT);
player->flags &= ~(FL_BPV|FL_AV|FL_GASMASK);
locplayerstate->protectiontime = 0;
if (player->flags & FL_ELASTO)
player->flags &= ~FL_NOFRICTION;
player->flags &= ~(FL_SHROOMS|FL_ELASTO|FL_FLEET);
locplayerstate->poweruptime = 0;
InitializeWeapons(locplayerstate);
locplayerstate->keys = 0;
DrawPlayScreen (false);
}
/*
================
=
= DoItemCheat
=
================
*/
void DoItemCheat (void)
{
AddMessage ("Items Aplenty!", MSG_CHEAT);
GivePoints (100000);
HealPlayer (99, player);
locplayerstate->keys = 0xF;
DrawKeys (false);
player->flags &= ~(FL_GASMASK|FL_BPV|FL_AV);
CheatSpawnItem(stat_bulletproof);
/*
player->flags |= FL_BPV;
player->flags &= ~(FL_GASMASK|FL_AV);
locplayerstate->protectiontime = POWERUPTICS;
GM_DrawBonus (stat_bulletproof);
*/
}
/*
================
=
= DoSomeItemCheat
=
================
*/
void DoSomeItemCheat (void)
{
AddMessage ("Slacker pack!", MSG_CHEAT);
HealPlayer (40, player);
locplayerstate->keys = 0x7;
DrawKeys (false);
}
/*
================
=
= DoGodModePowerup
=
================
*/
void DoGodModePowerup (void)
{
if (PLAYER[0]->flags & FL_GODMODE)
return;
CheatSpawnItem(stat_godmode);
}
/*
================
=
= DoDogModePowerup
=
================
*/
void DoDogModePowerup (void)
{
if (PLAYER[0]->flags & FL_DOGMODE)
return;
CheatSpawnItem(stat_dogmode);
}
/*
================
=
= DoMercuryModePowerup
=
================
*/
void DoMercuryModePowerup (void)
{
if (PLAYER[0]->flags & FL_FLEET)
return;
CheatSpawnItem(stat_fleetfeet);
}
/*
================
=
= DoElastoModePowerup
=
================
*/
void DoElastoModePowerup (void)
{
if (PLAYER[0]->flags & FL_ELASTO)
return;
CheatSpawnItem(stat_elastic);
}
/*
================
=
= DoShroomsModePowerup
=
================
*/
void DoShroomsModePowerup (void)
{
if (PLAYER[0]->flags & FL_SHROOMS)
return;
AddMessage ("SHROOMS MODE POWERDOWN!", MSG_CHEAT);
CheatSpawnItem(stat_mushroom);
}
/*
================
=
= RestartNormal
=
================
*/
void RestartNormal (void)
{
EnableScreenStretch();//bna
DoNormalThing ();
AddMessage ("Restart to level 1", MSG_CHEAT);
gamestate.mapon = 0;
playstate = ex_warped;
GetEpisode (gamestate.mapon);
}
/*
================
=
= HurtPlayer
=
================
*/
void HurtPlayer (void)
{
int oldhitpoints;
oldhitpoints = player->hitpoints;
DamageThing (player, MaxHitpointsForCharacter(locplayerstate) / 10);
if (player->hitpoints < oldhitpoints)
AddMessage ("OUCH!!!!", MSG_CHEAT);
Collision(player,player,0,0);
}
/*
================
=
= SetLightDiminish
=
================
*/
void SetLightDiminish (boolean off)
{
if (off)
{
AddMessage ("Light Diminishing \\cOff", MSG_CHEAT);
fulllight = 1;
}
else
{
AddMessage ("Light Diminishing \\cOn", MSG_CHEAT);
fulllight = 0;
}
}
/*
================
=
= SetFog
=
================
*/
void SetFog (boolean on)
{
if (on)
{
AddMessage ("Fog \\cOn", MSG_CHEAT);
MAPSPOT(2,0,1)=105;
MAPSPOT(3,0,1)=0;
SetupLightLevels ();
}
else
{
AddMessage ("Fog \\cOff", MSG_CHEAT);
MAPSPOT(2,0,1)=104;
SetupLightLevels ();
}
}
/*
================
=
= ToggleMissileCam
=
================
*/
void ToggleMissileCam (void)
{
if (missilecam==false)
{
missilecam=true;
AddMessage ("Missile Cam \\cOn", MSG_CHEAT);
}
else
{
missilecam=false;
AddMessage ("Missile Cam \\cOff", MSG_CHEAT);
}
}
/*
================
=
= ToggleHUD
=
================
*/
void ToggleHUD (void)
{
if (HUD==false)
{
HUD=true;
AddMessage ("HUD \\cOn", MSG_CHEAT);
}
else
{
HUD=false;
AddMessage ("HUD \\cOff", MSG_CHEAT);
}
}
/*
================
=
= EndLevel
=
================
*/
void EndLevel (void)
{
AddMessage ("End Level", MSG_CHEAT);
playstate = ex_skiplevel;
}
/*
================
=
= FloorandCeiling
=
================
*/
void FloorandCeiling (boolean off)
{
if (off)
{
AddMessage ("Floor and Ceiling \\cON", MSG_CHEAT);
fandc = 1;
}
else
{
AddMessage ("Floor and Ceiling \\cOFF", MSG_CHEAT);
fandc = 0;
}
}
/*
================
=
= GiveGasMask
=
================
*/
void GiveGasMask ()
{
if (PLAYER[0]->flags & FL_GASMASK)
return;
CheatSpawnItem(stat_gasmask);
}
/*
================
=
= GiveBulletProofArmor
=
================
*/
void GiveBulletProofArmor ()
{
if (PLAYER[0]->flags & FL_BPV)
return;
CheatSpawnItem(stat_bulletproof);
}
/*
================
=
= GiveAsbestoArmor
=
================
*/
void GiveAsbestoArmor ()
{
if (PLAYER[0]->flags & FL_AV)
return;
CheatSpawnItem(stat_asbesto);
}
/*
================
=
= OutfitPlayer
=
================
*/
void OutfitPlayer ()
{
AddMessage ("Outfit Player!", MSG_CHEAT);
locplayerstate->keys = 0xF;
DrawKeys (false);
HealPlayer (99, player);
/*
player->flags |= FL_BPV;
player->flags &= ~(FL_GASMASK|FL_AV);
locplayerstate->protectiontime = POWERUPTICS;
GM_DrawBonus (stat_bulletproof);
GiveWeapon (player,wp_mp40);
*/
#if (SHAREWARE == 0)
CheatSpawnItem(stat_splitmissile);
#else
CheatSpawnItem(stat_heatseeker);
#endif
}
/*
================
=
= KillPlayer
=
================
*/
void KillPlayer ()
{
AddMessage ("Say Goodnight.", MSG_CHEAT);
playstate = ex_died;
}
/*
================
=
= RestartCurrentLevel
=
================
*/
void RestartCurrentLevel (void)
{
playstate = ex_warped;
GetEpisode (gamestate.mapon);
}
/*
================
=
= EndDemo
=
================
*/
void EndDemo ( void )
{
char str[10];
boolean esc;
int demonumber;
if (demorecord==false)
return;
ShutdownClientControls();
CurrentFont = smallfont;
demorecord = false;
US_CenterWindow (26, 4);
US_CPrint ("Save demo as:");
US_Print ("\n");
US_CPrint ("Demo Number (1-4):");
VW_UpdateScreen();
esc = !US_LineInput (px, py, str, NULL, true, 1, 25, 13);
if (!esc)
{
demonumber = ParseNum (str);
if ((demonumber > 0) && (demonumber < 5))
{
SaveDemo (demonumber);
}
}
IN_ClearKeysDown ();
while (Keyboard[sc_Enter])
IN_UpdateKeyboard ();
while (Keyboard[sc_Escape])
IN_UpdateKeyboard ();
IN_ClearKeyboardQueue ();
StartupClientControls();
DisableScreenStretch();
}
/*
================
=
= RecordDemoQuery
=
================
*/
void RecordDemoQuery ( void )
{
char str[10];
boolean esc;
int level;
ShutdownClientControls();
CurrentFont = smallfont;
US_CenterWindow (26, 5);
PrintY += 6;
US_CPrint ("Record Demo");
US_Print ("\n");
#if (SHAREWARE==0)
US_CPrint ("Which level (1-36):");
#else
US_CPrint ("Which level (1-8):");
#endif
VW_UpdateScreen();
esc = !US_LineInput (px, py, str, NULL, true, 2, 25, 13);
if (!esc)
{
level = ParseNum (str);
#if (SHAREWARE==0)
if ((level > 0) && (level < 37))
#else
if ((level > 0) && (level < 9))
#endif
{
EnableScreenStretch();//bna
gamestate.mapon = level-1;
playstate = ex_demorecord;
}
}
while (Keyboard[sc_Enter])
IN_UpdateKeyboard ();
while (Keyboard[sc_Escape])
IN_UpdateKeyboard ();
IN_ClearKeyboardQueue ();
StartupClientControls();
}
/*
================
=
= PlaybackDemoQuery
=
================
*/
void PlaybackDemoQuery ( void )
{
char str[10];
boolean esc;
int level;
ShutdownClientControls();
CurrentFont = smallfont;
US_CenterWindow (33, 4);
US_CPrint ("Playback demo");
US_Print ("\n");
US_CPrint ("Enter demo number (1-4):");
VW_UpdateScreen ();
esc = !US_LineInput (px, py, str, NULL, true, 1, 25, 13);
if (!esc)
{
level = ParseNum (str);
if ((level > 0) && (level < 5))
{
if (DemoExists (level) == true)
LoadDemo (level);
}
}
while (Keyboard[sc_Enter])
IN_UpdateKeyboard ();
while (Keyboard[sc_Escape])
IN_UpdateKeyboard ();
IN_ClearKeyboardQueue ();
StartupClientControls();
EnableScreenStretch();
}
/*
================
=
= DebugKeys
=
================
*/
int DebugKeys (void)
{
#if (DEVELOPMENT == 1)
char str[10];
boolean esc;
int level;
int i,f,temp;
static int whichpowerup = 0;
static int whichprotection = 0;
if (Keyboard[sc_G]) // G = god mode
{
DoGodMode ();
while (Keyboard[sc_G])
IN_UpdateKeyboard ();
return 1;
}
else if (Keyboard[sc_Q]) // Q = fast quit
QuitGame ();
else if (Keyboard[sc_W]) // W = warp to level
{
DoWarp ();
return 1;
}
else if (Keyboard[sc_F]) // F = FPS
{
f=0;
for (i=0;i<VBLCOUNTER*10;i+=tics)
{
ThreeDRefresh();
DoSprites();
CalcTics ();
f++;
}
CurrentFont = smallfont;
US_CenterWindow (12,2);
temp=f*10;
SoftError("fps = %2ld.%2ld\n",temp/100,temp%100);
US_Print ("FPS=");
US_PrintUnsigned (temp/100);
US_Print (".");
US_PrintUnsigned (temp%100);
VW_UpdateScreen();
IN_Ack();
return 1;
}
else if (Keyboard[sc_H]) // H = hurt self
{
IN_ClearKeysDown ();
HurtPlayer ();
}
else if (Keyboard[sc_Z]) // Z = end level
{
EndLevel ();
}
else if (Keyboard[sc_P]) // P = step through powerups
{
whichpowerup++;
if (whichpowerup == 6)
whichpowerup = 0;
switch (whichpowerup)
{
case 0: // nothing
if (player->flags & FL_ELASTO)
player->flags &= ~FL_NOFRICTION;
player->flags &= ~(FL_SHROOMS|FL_ELASTO|FL_FLEET|FL_GODMODE|FL_DOGMODE);
locplayerstate->poweruptime = 0;
GM_UpdateBonus (0, true);
break;
case 1: // god mode
DoGodModePowerup ();
break;
case 2: // dog mode
DoDogModePowerup ();
break;
case 3: // fleet feet
DoMercuryModePowerup ();
break;
case 4: // elasto
DoElastoModePowerup ();
break;
case 5: // shrooms
DoShroomsModePowerup ();
break;
}
while (Keyboard[sc_P])
IN_UpdateKeyboard ();
}
else if (Keyboard[sc_A]) // step through armor
{
whichprotection++;
if (whichprotection == 4)
whichprotection = 0;
switch (whichprotection)
{
case 0: // nothing
player->flags &= ~(FL_BPV|FL_AV|FL_GASMASK);
locplayerstate->protectiontime = 0;
GM_UpdateBonus (0, false);
break;
case 1: // gas mask
GiveGasMask ();
break;
case 2: // armor
GiveBulletProofArmor ();
break;
case 3: // fire vest
GiveAsbestoArmor ();
break;
}
while (Keyboard[sc_A])
IN_UpdateKeyboard ();
}
else if (Keyboard[sc_O]) // O = outfit player
{
OutfitPlayer ();
IN_ClearKeysDown ();
IN_Ack ();
return 1;
}
else if (Keyboard[sc_K]) // K = kill self
{
IN_ClearKeysDown ();
locplayerstate->lives = -1;
KillPlayer ();
}
else if (Keyboard[sc_I]) // I = item cheat
{
DoItemCheat ();
return 1;
}
else if (Keyboard[53]) // \ = back to normal
{
DoNormalThing ();
return 1;
}
else if (Keyboard[sc_R])
{
RecordDemoQuery();
}
else if (Keyboard[sc_E])
{
EndDemo();
}
else if (Keyboard[sc_D])
{
PlaybackDemoQuery();
}
#endif
return (0);
}
/*
================
=
= WeaponCheat
=
================
*/
void WeaponCheat (int weapon)
{
if ((player->flags & FL_GODMODE) || (player->flags & FL_DOGMODE))
return;
if ((weapon <= wp_mp40) && (PLAYERSTATE[0].HASBULLETWEAPON[weapon]))
return;
CheatSpawnItem(GetItemForWeapon(weapon));
}
/*
================
=
= CheckCode ()
=
================
*/
void CheckCode (int which)
{
int pos = (LastLetter-1)&(MAXLETTERS-1);
int num = 0;
int start;
start = pos;
while ((toupper(LetterQueue[pos]) == Codes[which].code[num]) &&
(num < Codes[which].length))
{
pos = (pos-1)&(MAXLETTERS-1);
num++;
}
if (num == Codes[which].length)
{
// Kill last letter so the debug rtn will not keep triggering
LetterQueue[start] = 0;
switch (which)
{
case ENABLECHEAT:
case ENABLECHEATALT:
EnableCheatCodes ();
break;
case INVULNERABLE:
case INVULNERABLEALT:
DoGodMode ();
break;
case WARP:
case WARPALT:
DoWarp ();
break;
case ITEMS:
case ITEMSALT:
DoItemCheat ();
break;
case SOMEITEMS:
case SOMEITEMSALT:
DoSomeItemCheat ();
break;
case GODMODEPWUP:
case GODMODEPWUPALT:
DoGodModePowerup ();
break;
#if (SHAREWARE == 0)
case DOGMODEPWUP:
case DOGMODEPWUPALT:
DoDogModePowerup ();
break;
#endif
case MERCURYPWUP:
case MERCURYPWUPALT:
DoMercuryModePowerup ();
break;
case SHROOMSPWUP:
case SHROOMSPWUPALT:
DoShroomsModePowerup ();
break;
case ELASTOPWUP:
case ELASTOPWUPALT:
DoElastoModePowerup ();
break;
case RESTARTGAME:
case RESTARTGAMEALT:
RestartNormal ();
break;
case HURTPLAYER:
case HURTPLAYERALT:
HurtPlayer ();
break;
case TOMHALLMODE:
case TOMHALLMODEALT:
gamestate.autorun = true;
AddMessage("Autorun enabled!",MSG_CHEAT);
break;
case NORMAL:
case NORMALALT:
DoNormalThing ();
break;
case LIGHTDIMON:
case LIGHTDIMONALT:
SetLightDiminish (false);
break;
case LIGHTDIMOFF:
case LIGHTDIMOFFALT:
SetLightDiminish (true);
break;
case FOGON:
case FOGONALT:
SetFog (true);
break;
case FOGOFF:
case FOGOFFALT:
SetFog (false);
break;
case QUITGAME:
case QUITGAMEALT:
QuitGame ();
break;
case ENDLEVEL:
case ENDLEVELALT:
EndLevel ();
break;
case FANDCOFF:
case FANDCOFFALT:
FloorandCeiling (false);
break;
case FANDCON:
case FANDCONALT:
FloorandCeiling (true);
break;
case AIMCROSS:
case AIMCROSSALT:
if (iG_aimCross == 0) {
iG_aimCross = 1;
AddMessage("Crosshair on",MSG_GAME);
}else{
iG_aimCross = 0;
AddMessage("Crosshair off",MSG_GAME);
}
break;
case BULLETARMOR:
case BULLETARMORALT:
GiveBulletProofArmor ();
break;
case FIREARMOR:
case FIREARMORALT:
GiveAsbestoArmor ();
break;
case GASMASK:
case GASMASKALT:
GiveGasMask ();
break;
case OUTFIT:
case OUTFITALT:
OutfitPlayer ();
break;
case KILLPLAYER:
case KILLPLAYERALT:
KillPlayer ();
break;
case RESTARTLEVEL:
case RESTARTLEVELALT:
RestartCurrentLevel ();
break;
case WEAPONTWOPISTOL:
case WEAPONTWOPISTOLALT:
WeaponCheat(wp_twopistol);
break;
case WEAPONMP40:
case WEAPONMP40ALT:
WeaponCheat(wp_mp40);
break;
case WEAPONBAZOOKA:
case WEAPONBAZOOKAALT:
WeaponCheat(wp_bazooka);
break;
case WEAPONFIREBOMB:
case WEAPONFIREBOMBALT:
WeaponCheat(wp_firebomb);
break;
case WEAPONHEAT:
case WEAPONHEATALT:
WeaponCheat(wp_heatseeker);
break;
case WEAPONDRUNK:
case WEAPONDRUNKALT:
WeaponCheat(wp_drunk);
break;
case WEAPONFIREWALL:
case WEAPONFIREWALLALT:
WeaponCheat(wp_firewall);
break;
case WEAPONGOD:
case WEAPONGODALT:
WeaponCheat(wp_godhand);
break;
#if (SHAREWARE == 0)
case WEAPONSPLIT:
case WEAPONSPLITALT:
WeaponCheat(wp_split);
break;
case WEAPONKES:
case WEAPONKESALT:
WeaponCheat(wp_kes);
break;
case WEAPONBAT:
case WEAPONBATALT:
WeaponCheat(wp_bat);
break;
case WEAPONDOG:
case WEAPONDOGALT:
WeaponCheat(wp_dog);
break;
#endif
case MISSILECAMTOGGLE:
case MISSILECAMTOGGLEALT:
ToggleMissileCam();
break;
case HUDTOGGLE:
case HUDTOGGLEALT:
ToggleHUD();
break;
case ROTATIONFUN:
ShutdownClientControls();
RotationFun();
StartupClientControls();
SetupScreen( true );
break;
case DEMORECORD:
RecordDemoQuery();
break;
case DEMOEND:
EndDemo();
break;
case DEMOPLAYBACK:
PlaybackDemoQuery();
break;
case CRAZYGIBS:
if (gamestate.violence == vl_excessive)
{
ludicrousgibs ^= 1;
if (ludicrousgibs == true)
AddMessage("EKG mode on!",MSG_GAME);
else
AddMessage("EKG mode off!",MSG_GAME);
}
break;
case JUKEBOX:
case JUKEBOXALT:
DoJukeBox();
break;
case MAPCHEAT:
case MAPCHEATALT:
DoMapCheat();
break;
}
}
}
/*
================
=
= CheckDebug ()
=
================
*/
void CheckDebug (void)
{
int which;
if (DebugOk == false)
{
CheckCode (0); // Check for Debug switch only
CheckCode (1); // Check for Debug switch only
CheckCode (2); // Check for Slacker pack
CheckCode (3); // Check for Slacker pack
}
else
{
if (demoplayback==true)
{
return;
}
else if (demorecord==true)
{
CheckCode (DEMORECORD);
CheckCode (DEMOEND);
}
else
{
for (which = 0; which < MAXCODES; which++) // Check all debug codes
CheckCode (which);
}
}
}