diff options
Diffstat (limited to 'src/hexen/sb_bar.c')
-rw-r--r-- | src/hexen/sb_bar.c | 1990 |
1 files changed, 1990 insertions, 0 deletions
diff --git a/src/hexen/sb_bar.c b/src/hexen/sb_bar.c new file mode 100644 index 00000000..13b41ae3 --- /dev/null +++ b/src/hexen/sb_bar.c @@ -0,0 +1,1990 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 1993-2008 Raven Software +// Copyright(C) 2008 Simon Howard +// +// 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. +// +//----------------------------------------------------------------------------- + + +// HEADER FILES ------------------------------------------------------------ + +#include "h2def.h" +#include "i_video.h" +#include "m_bbox.h" +#include "m_cheat.h" +#include "m_misc.h" +#include "p_local.h" +#include "s_sound.h" +#include "v_video.h" + +#include "i_sound.h" // For CD stuff + +// TYPES ------------------------------------------------------------------- + +typedef struct Cheat_s +{ + void (*func) (player_t * player, struct Cheat_s * cheat); + cheatseq_t *seq; +} Cheat_t; + +// EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- + +// PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- + +void SB_PaletteFlash(boolean forceChange); + +// PRIVATE FUNCTION PROTOTYPES --------------------------------------------- + +static void DrawSoundInfo(void); +static void DrINumber(signed int val, int x, int y); +static void DrRedINumber(signed int val, int x, int y); +static void DrBNumber(signed int val, int x, int y); +static void DrawCommonBar(void); +static void DrawMainBar(void); +static void DrawInventoryBar(void); +static void DrawKeyBar(void); +static void DrawWeaponPieces(void); +static void DrawFullScreenStuff(void); +static void DrawAnimatedIcons(void); +static boolean HandleCheats(byte key); +static boolean CheatAddKey(Cheat_t * cheat, byte key, boolean * eat); +static void CheatGodFunc(player_t * player, Cheat_t * cheat); +static void CheatNoClipFunc(player_t * player, Cheat_t * cheat); +static void CheatWeaponsFunc(player_t * player, Cheat_t * cheat); +static void CheatHealthFunc(player_t * player, Cheat_t * cheat); +static void CheatKeysFunc(player_t * player, Cheat_t * cheat); +static void CheatSoundFunc(player_t * player, Cheat_t * cheat); +static void CheatTickerFunc(player_t * player, Cheat_t * cheat); +static void CheatArtifactAllFunc(player_t * player, Cheat_t * cheat); +static void CheatPuzzleFunc(player_t * player, Cheat_t * cheat); +static void CheatWarpFunc(player_t * player, Cheat_t * cheat); +static void CheatPigFunc(player_t * player, Cheat_t * cheat); +static void CheatMassacreFunc(player_t * player, Cheat_t * cheat); +static void CheatIDKFAFunc(player_t * player, Cheat_t * cheat); +static void CheatQuickenFunc1(player_t * player, Cheat_t * cheat); +static void CheatQuickenFunc2(player_t * player, Cheat_t * cheat); +static void CheatQuickenFunc3(player_t * player, Cheat_t * cheat); +static void CheatClassFunc1(player_t * player, Cheat_t * cheat); +static void CheatClassFunc2(player_t * player, Cheat_t * cheat); +static void CheatInitFunc(player_t * player, Cheat_t * cheat); +static void CheatInitFunc(player_t * player, Cheat_t * cheat); +static void CheatVersionFunc(player_t * player, Cheat_t * cheat); +static void CheatDebugFunc(player_t * player, Cheat_t * cheat); +static void CheatScriptFunc1(player_t * player, Cheat_t * cheat); +static void CheatScriptFunc2(player_t * player, Cheat_t * cheat); +static void CheatScriptFunc3(player_t * player, Cheat_t * cheat); +static void CheatRevealFunc(player_t * player, Cheat_t * cheat); +static void CheatTrackFunc1(player_t * player, Cheat_t * cheat); +static void CheatTrackFunc2(player_t * player, Cheat_t * cheat); + +// EXTERNAL DATA DECLARATIONS ---------------------------------------------- + +extern int ArmorIncrement[NUMCLASSES][NUMARMOR]; +extern int AutoArmorSave[NUMCLASSES]; + +// haleyjd FIXME: CDMUSIC +#ifdef __WATCOMC__ +extern boolean i_CDMusic; +extern int i_CDMusicLength; +extern int i_CDTrack; +extern int i_CDCurrentTrack; +extern int oldTic; +#endif + +// PUBLIC DATA DECLARATIONS ------------------------------------------------ + +boolean DebugSound; // Debug flag for displaying sound info +boolean inventory; +int curpos; +int inv_ptr; +int ArtifactFlash; + +// haleyjd FIXME: CDMUSIC +#ifndef __WATCOMC__ +boolean i_CDMusic; // in Watcom, defined in i_ibm +#endif + +// PRIVATE DATA DEFINITIONS ------------------------------------------------ + +static int DisplayTicker = 0; +static int HealthMarker; +//static int ChainWiggle; +static player_t *CPlayer; +static int SpinFlylump; +static int SpinMinotaurLump; +static int SpinSpeedLump; +static int SpinDefenseLump; + +static int FontBNumBase; +static int PlayPalette; + +static patch_t *PatchH2BAR; +static patch_t *PatchH2TOP; +static patch_t *PatchLFEDGE; +static patch_t *PatchRTEDGE; +static patch_t *PatchARMCLEAR; +static patch_t *PatchARTICLEAR; +static patch_t *PatchMANACLEAR; +static patch_t *PatchKILLS; +static patch_t *PatchMANAVIAL1; +static patch_t *PatchMANAVIAL2; +static patch_t *PatchMANAVIALDIM1; +static patch_t *PatchMANAVIALDIM2; +static patch_t *PatchMANADIM1; +static patch_t *PatchMANADIM2; +static patch_t *PatchMANABRIGHT1; +static patch_t *PatchMANABRIGHT2; +static patch_t *PatchCHAIN; +static patch_t *PatchSTATBAR; +static patch_t *PatchKEYBAR; +static patch_t *PatchLIFEGEM; +static patch_t *PatchSELECTBOX; +static patch_t *PatchINumbers[10]; +static patch_t *PatchNEGATIVE; +static patch_t *PatchSmNumbers[10]; +static patch_t *PatchINVBAR; +static patch_t *PatchWEAPONSLOT; +static patch_t *PatchWEAPONFULL; +static patch_t *PatchPIECE1; +static patch_t *PatchPIECE2; +static patch_t *PatchPIECE3; +static patch_t *PatchINVLFGEM1; +static patch_t *PatchINVLFGEM2; +static patch_t *PatchINVRTGEM1; +static patch_t *PatchINVRTGEM2; + +// Toggle god mode +cheatseq_t CheatGodSeq = CHEAT("satan", 0); + +// Toggle no clipping mode +cheatseq_t CheatNoClipSeq = CHEAT("casper", 0); + +// Get all weapons and mana +cheatseq_t CheatWeaponsSeq = CHEAT("nra", 0); + +// Get full health +cheatseq_t CheatHealthSeq = CHEAT("clubmed", 0); + +// Get all keys +cheatseq_t CheatKeysSeq = CHEAT("locksmith", 0); + +// Toggle sound debug info +cheatseq_t CheatSoundSeq = CHEAT("noise", 0); + +// Toggle ticker +cheatseq_t CheatTickerSeq = CHEAT("ticker", 0); + +// Get all artifacts +cheatseq_t CheatArtifactAllSeq = CHEAT("indiana", 0); + +// Get all puzzle pieces +cheatseq_t CheatPuzzleSeq = CHEAT("sherlock", 0); + +// Warp to new level +cheatseq_t CheatWarpSeq = CHEAT("visit", 2); + +// Become a pig +cheatseq_t CheatPigSeq = CHEAT("deliverance", 0); + +// Kill all monsters +cheatseq_t CheatMassacreSeq = CHEAT("butcher", 0); + +cheatseq_t CheatIDKFASeq = CHEAT("conan", 0); + +cheatseq_t CheatQuickenSeq1 = CHEAT("martek", 0); + +cheatseq_t CheatQuickenSeq2 = CHEAT("martekmartek", 0); + +cheatseq_t CheatQuickenSeq3 = CHEAT("martekmartekmartek", 0); + +// New class +cheatseq_t CheatClass1Seq = CHEAT("shadowcaster", 0); + +cheatseq_t CheatClass2Seq = CHEAT("shadowcaster", 1); + +cheatseq_t CheatInitSeq = CHEAT("init", 0); + +cheatseq_t CheatVersionSeq = CHEAT("mrjones", 0); + +cheatseq_t CheatDebugSeq = CHEAT("where", 0); + +cheatseq_t CheatScriptSeq1 = CHEAT("puke", 0); + +cheatseq_t CheatScriptSeq2 = CHEAT("puke", 1); + +cheatseq_t CheatScriptSeq3 = CHEAT("puke", 2); + +cheatseq_t CheatRevealSeq = CHEAT("mapsco", 0); + +cheatseq_t CheatTrackSeq1 = CHEAT("`", 0); + +cheatseq_t CheatTrackSeq2 = CHEAT("`", 2); + +static Cheat_t Cheats[] = { + {CheatTrackFunc1, &CheatTrackSeq1}, + {CheatTrackFunc2, &CheatTrackSeq2}, + {CheatGodFunc, &CheatGodSeq}, + {CheatNoClipFunc, &CheatNoClipSeq}, + {CheatWeaponsFunc, &CheatWeaponsSeq}, + {CheatHealthFunc, &CheatHealthSeq}, + {CheatKeysFunc, &CheatKeysSeq}, + {CheatSoundFunc, &CheatSoundSeq}, + {CheatTickerFunc, &CheatTickerSeq}, + {CheatArtifactAllFunc, &CheatArtifactAllSeq}, + {CheatPuzzleFunc, &CheatPuzzleSeq}, + {CheatWarpFunc, &CheatWarpSeq}, + {CheatPigFunc, &CheatPigSeq}, + {CheatMassacreFunc, &CheatMassacreSeq}, + {CheatIDKFAFunc, &CheatIDKFASeq}, + {CheatQuickenFunc1, &CheatQuickenSeq1}, + {CheatQuickenFunc2, &CheatQuickenSeq2}, + {CheatQuickenFunc3, &CheatQuickenSeq3}, + {CheatClassFunc1, &CheatClass1Seq}, + {CheatClassFunc2, &CheatClass2Seq}, + {CheatInitFunc, &CheatInitSeq}, + {CheatVersionFunc, &CheatVersionSeq}, + {CheatDebugFunc, &CheatDebugSeq}, + {CheatScriptFunc1, &CheatScriptSeq1}, + {CheatScriptFunc2, &CheatScriptSeq2}, + {CheatScriptFunc3, &CheatScriptSeq3}, + {CheatRevealFunc, &CheatRevealSeq}, +}; + +// CODE -------------------------------------------------------------------- + +//========================================================================== +// +// SB_Init +// +//========================================================================== + +void SB_Init(void) +{ + int i; + int startLump; + + PatchH2BAR = W_CacheLumpName("H2BAR", PU_STATIC); + PatchH2TOP = W_CacheLumpName("H2TOP", PU_STATIC); + PatchINVBAR = W_CacheLumpName("INVBAR", PU_STATIC); + PatchLFEDGE = W_CacheLumpName("LFEDGE", PU_STATIC); + PatchRTEDGE = W_CacheLumpName("RTEDGE", PU_STATIC); + PatchSTATBAR = W_CacheLumpName("STATBAR", PU_STATIC); + PatchKEYBAR = W_CacheLumpName("KEYBAR", PU_STATIC); + PatchSELECTBOX = W_CacheLumpName("SELECTBOX", PU_STATIC); + PatchARTICLEAR = W_CacheLumpName("ARTICLS", PU_STATIC); + PatchARMCLEAR = W_CacheLumpName("ARMCLS", PU_STATIC); + PatchMANACLEAR = W_CacheLumpName("MANACLS", PU_STATIC); + PatchMANAVIAL1 = W_CacheLumpName("MANAVL1", PU_STATIC); + PatchMANAVIAL2 = W_CacheLumpName("MANAVL2", PU_STATIC); + PatchMANAVIALDIM1 = W_CacheLumpName("MANAVL1D", PU_STATIC); + PatchMANAVIALDIM2 = W_CacheLumpName("MANAVL2D", PU_STATIC); + PatchMANADIM1 = W_CacheLumpName("MANADIM1", PU_STATIC); + PatchMANADIM2 = W_CacheLumpName("MANADIM2", PU_STATIC); + PatchMANABRIGHT1 = W_CacheLumpName("MANABRT1", PU_STATIC); + PatchMANABRIGHT2 = W_CacheLumpName("MANABRT2", PU_STATIC); + PatchINVLFGEM1 = W_CacheLumpName("invgeml1", PU_STATIC); + PatchINVLFGEM2 = W_CacheLumpName("invgeml2", PU_STATIC); + PatchINVRTGEM1 = W_CacheLumpName("invgemr1", PU_STATIC); + PatchINVRTGEM2 = W_CacheLumpName("invgemr2", PU_STATIC); + +// PatchCHAINBACK = W_CacheLumpName("CHAINBACK", PU_STATIC); + startLump = W_GetNumForName("IN0"); + for (i = 0; i < 10; i++) + { + PatchINumbers[i] = W_CacheLumpNum(startLump + i, PU_STATIC); + } + PatchNEGATIVE = W_CacheLumpName("NEGNUM", PU_STATIC); + FontBNumBase = W_GetNumForName("FONTB16"); + startLump = W_GetNumForName("SMALLIN0"); + for (i = 0; i < 10; i++) + { + PatchSmNumbers[i] = W_CacheLumpNum(startLump + i, PU_STATIC); + } + PlayPalette = W_GetNumForName("PLAYPAL"); + SpinFlylump = W_GetNumForName("SPFLY0"); + SpinMinotaurLump = W_GetNumForName("SPMINO0"); + SpinSpeedLump = W_GetNumForName("SPBOOT0"); + SpinDefenseLump = W_GetNumForName("SPSHLD0"); + + if (deathmatch) + { + PatchKILLS = W_CacheLumpName("KILLS", PU_STATIC); + } + SB_SetClassData(); +} + +//========================================================================== +// +// SB_SetClassData +// +//========================================================================== + +void SB_SetClassData(void) +{ + int class; + + class = PlayerClass[consoleplayer]; // original player class (not pig) + PatchWEAPONSLOT = W_CacheLumpNum(W_GetNumForName("wpslot0") + + class, PU_STATIC); + PatchWEAPONFULL = W_CacheLumpNum(W_GetNumForName("wpfull0") + + class, PU_STATIC); + PatchPIECE1 = W_CacheLumpNum(W_GetNumForName("wpiecef1") + + class, PU_STATIC); + PatchPIECE2 = W_CacheLumpNum(W_GetNumForName("wpiecef2") + + class, PU_STATIC); + PatchPIECE3 = W_CacheLumpNum(W_GetNumForName("wpiecef3") + + class, PU_STATIC); + PatchCHAIN = W_CacheLumpNum(W_GetNumForName("chain") + class, PU_STATIC); + if (!netgame) + { // single player game uses red life gem (the second gem) + PatchLIFEGEM = W_CacheLumpNum(W_GetNumForName("lifegem") + + MAXPLAYERS * class + 1, PU_STATIC); + } + else + { + PatchLIFEGEM = W_CacheLumpNum(W_GetNumForName("lifegem") + + MAXPLAYERS * class + consoleplayer, + PU_STATIC); + } + SB_state = -1; + UpdateState |= I_FULLSCRN; +} + +//========================================================================== +// +// SB_Ticker +// +//========================================================================== + +void SB_Ticker(void) +{ + int delta; + int curHealth; + + curHealth = players[consoleplayer].mo->health; + if (curHealth < 0) + { + curHealth = 0; + } + if (curHealth < HealthMarker) + { + delta = (HealthMarker - curHealth) >> 2; + if (delta < 1) + { + delta = 1; + } + else if (delta > 6) + { + delta = 6; + } + HealthMarker -= delta; + } + else if (curHealth > HealthMarker) + { + delta = (curHealth - HealthMarker) >> 2; + if (delta < 1) + { + delta = 1; + } + else if (delta > 6) + { + delta = 6; + } + HealthMarker += delta; + } +} + +//========================================================================== +// +// DrINumber +// +// Draws a three digit number. +// +//========================================================================== + +static void DrINumber(signed int val, int x, int y) +{ + patch_t *patch; + int oldval; + + oldval = val; + if (val < 0) + { + val = -val; + if (val > 99) + { + val = 99; + } + if (val > 9) + { + patch = PatchINumbers[val / 10]; + V_DrawPatch(x + 8, y, patch); + V_DrawPatch(x, y, PatchNEGATIVE); + } + else + { + V_DrawPatch(x + 8, y, PatchNEGATIVE); + } + val = val % 10; + patch = PatchINumbers[val]; + V_DrawPatch(x + 16, y, patch); + return; + } + if (val > 99) + { + patch = PatchINumbers[val / 100]; + V_DrawPatch(x, y, patch); + } + val = val % 100; + if (val > 9 || oldval > 99) + { + patch = PatchINumbers[val / 10]; + V_DrawPatch(x + 8, y, patch); + } + val = val % 10; + patch = PatchINumbers[val]; + V_DrawPatch(x + 16, y, patch); +} + +//========================================================================== +// +// DrRedINumber +// +// Draws a three digit number using the red font +// +//========================================================================== + +static void DrRedINumber(signed int val, int x, int y) +{ + patch_t *patch; + int oldval; + + oldval = val; + if (val < 0) + { + val = 0; + } + if (val > 99) + { + patch = + W_CacheLumpNum(W_GetNumForName("inred0") + val / 100, PU_CACHE); + V_DrawPatch(x, y, patch); + } + val = val % 100; + if (val > 9 || oldval > 99) + { + patch = + W_CacheLumpNum(W_GetNumForName("inred0") + val / 10, PU_CACHE); + V_DrawPatch(x + 8, y, patch); + } + val = val % 10; + patch = W_CacheLumpNum(W_GetNumForName("inred0") + val, PU_CACHE); + V_DrawPatch(x + 16, y, patch); +} + +//========================================================================== +// +// DrBNumber +// +// Draws a three digit number using FontB +// +//========================================================================== + +static void DrBNumber(signed int val, int x, int y) +{ + patch_t *patch; + int xpos; + int oldval; + + oldval = val; + xpos = x; + if (val < 0) + { + val = 0; + } + if (val > 99) + { + patch = W_CacheLumpNum(FontBNumBase + val / 100, PU_CACHE); + V_DrawShadowedPatch(xpos + 6 - patch->width / 2, y, patch); + } + val = val % 100; + xpos += 12; + if (val > 9 || oldval > 99) + { + patch = W_CacheLumpNum(FontBNumBase + val / 10, PU_CACHE); + V_DrawShadowedPatch(xpos + 6 - patch->width / 2, y, patch); + } + val = val % 10; + xpos += 12; + patch = W_CacheLumpNum(FontBNumBase + val, PU_CACHE); + V_DrawShadowedPatch(xpos + 6 - patch->width / 2, y, patch); +} + +//========================================================================== +// +// DrSmallNumber +// +// Draws a small two digit number. +// +//========================================================================== + +static void DrSmallNumber(int val, int x, int y) +{ + patch_t *patch; + + if (val <= 0) + { + return; + } + if (val > 999) + { + val %= 1000; + } + if (val > 99) + { + patch = PatchSmNumbers[val / 100]; + V_DrawPatch(x, y, patch); + patch = PatchSmNumbers[(val % 100) / 10]; + V_DrawPatch(x + 4, y, patch); + } + else if (val > 9) + { + patch = PatchSmNumbers[val / 10]; + V_DrawPatch(x + 4, y, patch); + } + val %= 10; + patch = PatchSmNumbers[val]; + V_DrawPatch(x + 8, y, patch); +} + +/* +//========================================================================== +// +// ShadeLine +// +//========================================================================== + +static void ShadeLine(int x, int y, int height, int shade) +{ + byte *dest; + byte *shades; + + shades = colormaps+9*256+shade*2*256; + dest = I_VideoBuffer+y*SCREENWIDTH+x; + while(height--) + { + *(dest) = *(shades+*dest); + dest += SCREENWIDTH; + } +} + +//========================================================================== +// +// ShadeChain +// +//========================================================================== + +static void ShadeChain(void) +{ + int i; + + for(i = 0; i < 16; i++) + { + ShadeLine(277+i, 190, 10, i/2); + ShadeLine(19+i, 190, 10, 7-(i/2)); + } +} +*/ + +//========================================================================== +// +// DrawSoundInfo +// +// Displays sound debugging information. +// +//========================================================================== + +static void DrawSoundInfo(void) +{ + int i; + SoundInfo_t s; + ChanInfo_t *c; + char text[32]; + int x; + int y; + int xPos[7] = { 1, 75, 112, 156, 200, 230, 260 }; + + if (leveltime & 16) + { + MN_DrTextA("*** SOUND DEBUG INFO ***", xPos[0], 20); + } + S_GetChannelInfo(&s); + if (s.channelCount == 0) + { + return; + } + x = 0; + MN_DrTextA("NAME", xPos[x++], 30); + MN_DrTextA("MO.T", xPos[x++], 30); + MN_DrTextA("MO.X", xPos[x++], 30); + MN_DrTextA("MO.Y", xPos[x++], 30); + MN_DrTextA("ID", xPos[x++], 30); + MN_DrTextA("PRI", xPos[x++], 30); + MN_DrTextA("DIST", xPos[x++], 30); + for (i = 0; i < s.channelCount; i++) + { + c = &s.chan[i]; + x = 0; + y = 40 + i * 10; + if (c->mo == NULL) + { // Channel is unused + MN_DrTextA("------", xPos[0], y); + continue; + } + sprintf(text, "%s", c->name); + M_ForceUppercase(text); + MN_DrTextA(text, xPos[x++], y); + sprintf(text, "%d", c->mo->type); + MN_DrTextA(text, xPos[x++], y); + sprintf(text, "%d", c->mo->x >> FRACBITS); + MN_DrTextA(text, xPos[x++], y); + sprintf(text, "%d", c->mo->y >> FRACBITS); + MN_DrTextA(text, xPos[x++], y); + sprintf(text, "%d", (int) c->id); + MN_DrTextA(text, xPos[x++], y); + sprintf(text, "%d", c->priority); + MN_DrTextA(text, xPos[x++], y); + sprintf(text, "%d", c->distance); + MN_DrTextA(text, xPos[x++], y); + } + UpdateState |= I_FULLSCRN; + BorderNeedRefresh = true; +} + +//========================================================================== +// +// SB_Drawer +// +//========================================================================== + +char patcharti[][10] = { + {"ARTIBOX"}, // none + {"ARTIINVU"}, // invulnerability + {"ARTIPTN2"}, // health + {"ARTISPHL"}, // superhealth + {"ARTIHRAD"}, // healing radius + {"ARTISUMN"}, // summon maulator + {"ARTITRCH"}, // torch + {"ARTIPORK"}, // egg + {"ARTISOAR"}, // fly + {"ARTIBLST"}, // blast radius + {"ARTIPSBG"}, // poison bag + {"ARTITELO"}, // teleport other + {"ARTISPED"}, // speed + {"ARTIBMAN"}, // boost mana + {"ARTIBRAC"}, // boost armor + {"ARTIATLP"}, // teleport + {"ARTISKLL"}, // arti_puzzskull + {"ARTIBGEM"}, // arti_puzzgembig + {"ARTIGEMR"}, // arti_puzzgemred + {"ARTIGEMG"}, // arti_puzzgemgreen1 + {"ARTIGMG2"}, // arti_puzzgemgreen2 + {"ARTIGEMB"}, // arti_puzzgemblue1 + {"ARTIGMB2"}, // arti_puzzgemblue2 + {"ARTIBOK1"}, // arti_puzzbook1 + {"ARTIBOK2"}, // arti_puzzbook2 + {"ARTISKL2"}, // arti_puzzskull2 + {"ARTIFWEP"}, // arti_puzzfweapon + {"ARTICWEP"}, // arti_puzzcweapon + {"ARTIMWEP"}, // arti_puzzmweapon + {"ARTIGEAR"}, // arti_puzzgear1 + {"ARTIGER2"}, // arti_puzzgear2 + {"ARTIGER3"}, // arti_puzzgear3 + {"ARTIGER4"}, // arti_puzzgear4 +}; + +int SB_state = -1; +static int oldarti = 0; +static int oldartiCount = 0; +static int oldfrags = -9999; +static int oldmana1 = -1; +static int oldmana2 = -1; +static int oldarmor = -1; +static int oldhealth = -1; +static int oldlife = -1; +static int oldpieces = -1; +static int oldweapon = -1; +static int oldkeys = -1; + +extern boolean automapactive; + +void SB_Drawer(void) +{ + // Sound info debug stuff + if (DebugSound == true) + { + DrawSoundInfo(); + } + CPlayer = &players[consoleplayer]; + if (viewheight == SCREENHEIGHT && !automapactive) + { + DrawFullScreenStuff(); + SB_state = -1; + } + else + { + if (SB_state == -1) + { + V_DrawPatch(0, 134, PatchH2BAR); + oldhealth = -1; + } + DrawCommonBar(); + if (!inventory) + { + if (SB_state != 0) + { + // Main interface + if (!automapactive) + { + V_DrawPatch(38, 162, PatchSTATBAR); + } + else + { + V_DrawPatch(38, 162, PatchKEYBAR); + } + oldarti = 0; + oldmana1 = -1; + oldmana2 = -1; + oldarmor = -1; + oldpieces = -1; + oldfrags = -9999; //can't use -1, 'cuz of negative frags + oldlife = -1; + oldweapon = -1; + oldkeys = -1; + } + if (!automapactive) + { + DrawMainBar(); + } + else + { + DrawKeyBar(); + } + SB_state = 0; + } + else + { + DrawInventoryBar(); + SB_state = 1; + } + } + SB_PaletteFlash(false); + DrawAnimatedIcons(); +} + +//========================================================================== +// +// DrawAnimatedIcons +// +//========================================================================== + +static void DrawAnimatedIcons(void) +{ + int frame; + static boolean hitCenterFrame; + + // Wings of wrath + if (CPlayer->powers[pw_flight]) + { + if (CPlayer->powers[pw_flight] > BLINKTHRESHOLD + || !(CPlayer->powers[pw_flight] & 16)) + { + frame = (leveltime / 3) & 15; + if (CPlayer->mo->flags2 & MF2_FLY) + { + if (hitCenterFrame && (frame != 15 && frame != 0)) + { + V_DrawPatch(20, 19, W_CacheLumpNum(SpinFlylump + 15, + PU_CACHE)); + } + else + { + V_DrawPatch(20, 19, W_CacheLumpNum(SpinFlylump + frame, + PU_CACHE)); + hitCenterFrame = false; + } + } + else + { + if (!hitCenterFrame && (frame != 15 && frame != 0)) + { + V_DrawPatch(20, 19, W_CacheLumpNum(SpinFlylump + frame, + PU_CACHE)); + hitCenterFrame = false; + } + else + { + V_DrawPatch(20, 19, W_CacheLumpNum(SpinFlylump + 15, + PU_CACHE)); + hitCenterFrame = true; + } + } + } + BorderTopRefresh = true; + UpdateState |= I_MESSAGES; + } + + // Speed Boots + if (CPlayer->powers[pw_speed]) + { + if (CPlayer->powers[pw_speed] > BLINKTHRESHOLD + || !(CPlayer->powers[pw_speed] & 16)) + { + frame = (leveltime / 3) & 15; + V_DrawPatch(60, 19, W_CacheLumpNum(SpinSpeedLump + frame, + PU_CACHE)); + } + BorderTopRefresh = true; + UpdateState |= I_MESSAGES; + } + + // Defensive power + if (CPlayer->powers[pw_invulnerability]) + { + if (CPlayer->powers[pw_invulnerability] > BLINKTHRESHOLD + || !(CPlayer->powers[pw_invulnerability] & 16)) + { + frame = (leveltime / 3) & 15; + V_DrawPatch(260, 19, W_CacheLumpNum(SpinDefenseLump + frame, + PU_CACHE)); + } + BorderTopRefresh = true; + UpdateState |= I_MESSAGES; + } + + // Minotaur Active + if (CPlayer->powers[pw_minotaur]) + { + if (CPlayer->powers[pw_minotaur] > BLINKTHRESHOLD + || !(CPlayer->powers[pw_minotaur] & 16)) + { + frame = (leveltime / 3) & 15; + V_DrawPatch(300, 19, W_CacheLumpNum(SpinMinotaurLump + frame, + PU_CACHE)); + } + BorderTopRefresh = true; + UpdateState |= I_MESSAGES; + } +} + +//========================================================================== +// +// SB_PaletteFlash +// +// Sets the new palette based upon the current values of +// consoleplayer->damagecount and consoleplayer->bonuscount. +// +//========================================================================== + +void SB_PaletteFlash(boolean forceChange) +{ + static int sb_palette = 0; + int palette; + byte *pal; + + if (forceChange) + { + sb_palette = -1; + } + if (gamestate == GS_LEVEL) + { + CPlayer = &players[consoleplayer]; + if (CPlayer->poisoncount) + { + palette = 0; + palette = (CPlayer->poisoncount + 7) >> 3; + if (palette >= NUMPOISONPALS) + { + palette = NUMPOISONPALS - 1; + } + palette += STARTPOISONPALS; + } + else if (CPlayer->damagecount) + { + palette = (CPlayer->damagecount + 7) >> 3; + if (palette >= NUMREDPALS) + { + palette = NUMREDPALS - 1; + } + palette += STARTREDPALS; + } + else if (CPlayer->bonuscount) + { + palette = (CPlayer->bonuscount + 7) >> 3; + if (palette >= NUMBONUSPALS) + { + palette = NUMBONUSPALS - 1; + } + palette += STARTBONUSPALS; + } + else if (CPlayer->mo->flags2 & MF2_ICEDAMAGE) + { // Frozen player + palette = STARTICEPAL; + } + else + { + palette = 0; + } + } + else + { + palette = 0; + } + if (palette != sb_palette) + { + sb_palette = palette; + pal = (byte *) W_CacheLumpNum(PlayPalette, PU_CACHE) + palette * 768; + I_SetPalette(pal); + } +} + +//========================================================================== +// +// DrawCommonBar +// +//========================================================================== + +void DrawCommonBar(void) +{ + int healthPos; + + V_DrawPatch(0, 134, PatchH2TOP); + + if (oldhealth != HealthMarker) + { + oldhealth = HealthMarker; + healthPos = HealthMarker; + if (healthPos < 0) + { + healthPos = 0; + } + if (healthPos > 100) + { + healthPos = 100; + } + V_DrawPatch(28 + (((healthPos * 196) / 100) % 9), 193, PatchCHAIN); + V_DrawPatch(7 + ((healthPos * 11) / 5), 193, PatchLIFEGEM); + V_DrawPatch(0, 193, PatchLFEDGE); + V_DrawPatch(277, 193, PatchRTEDGE); +// ShadeChain(); + UpdateState |= I_STATBAR; + } +} + +//========================================================================== +// +// DrawMainBar +// +//========================================================================== + +void DrawMainBar(void) +{ + int i; + int temp; + patch_t *manaPatch1, *manaPatch2; + patch_t *manaVialPatch1, *manaVialPatch2; + + manaPatch1 = NULL; + manaPatch2 = NULL; + manaVialPatch1 = NULL; + manaVialPatch2 = NULL; + + // Ready artifact + if (ArtifactFlash) + { + V_DrawPatch(144, 160, PatchARTICLEAR); + V_DrawPatch(148, 164, W_CacheLumpNum(W_GetNumForName("useartia") + + ArtifactFlash - 1, PU_CACHE)); + ArtifactFlash--; + oldarti = -1; // so that the correct artifact fills in after the flash + UpdateState |= I_STATBAR; + } + else if (oldarti != CPlayer->readyArtifact + || oldartiCount != CPlayer->inventory[inv_ptr].count) + { + V_DrawPatch(144, 160, PatchARTICLEAR); + if (CPlayer->readyArtifact > 0) + { + V_DrawPatch(143, 163, + W_CacheLumpName(patcharti[CPlayer->readyArtifact], + PU_CACHE)); + if (CPlayer->inventory[inv_ptr].count > 1) + { + DrSmallNumber(CPlayer->inventory[inv_ptr].count, 162, 184); + } + } + oldarti = CPlayer->readyArtifact; + oldartiCount = CPlayer->inventory[inv_ptr].count; + UpdateState |= I_STATBAR; + } + + // Frags + if (deathmatch) + { + temp = 0; + for (i = 0; i < MAXPLAYERS; i++) + { + temp += CPlayer->frags[i]; + } + if (temp != oldfrags) + { + V_DrawPatch(38, 162, PatchKILLS); + DrINumber(temp, 40, 176); + oldfrags = temp; + UpdateState |= I_STATBAR; + } + } + else + { + temp = HealthMarker; + if (temp < 0) + { + temp = 0; + } + else if (temp > 100) + { + temp = 100; + } + if (oldlife != temp) + { + oldlife = temp; + V_DrawPatch(41, 178, PatchARMCLEAR); + if (temp >= 25) + { + DrINumber(temp, 40, 176); + } + else + { + DrRedINumber(temp, 40, 176); + } + UpdateState |= I_STATBAR; + } + } + // Mana + temp = CPlayer->mana[0]; + if (oldmana1 != temp) + { + V_DrawPatch(77, 178, PatchMANACLEAR); + DrSmallNumber(temp, 79, 181); + manaVialPatch1 = (patch_t *) 1; // force a vial update + if (temp == 0) + { // Draw Dim Mana icon + manaPatch1 = PatchMANADIM1; + } + else if (oldmana1 == 0) + { + manaPatch1 = PatchMANABRIGHT1; + } + oldmana1 = temp; + UpdateState |= I_STATBAR; + } + temp = CPlayer->mana[1]; + if (oldmana2 != temp) + { + V_DrawPatch(109, 178, PatchMANACLEAR); + DrSmallNumber(temp, 111, 181); + manaVialPatch1 = (patch_t *) 1; // force a vial update + if (temp == 0) + { // Draw Dim Mana icon + manaPatch2 = PatchMANADIM2; + } + else if (oldmana2 == 0) + { + manaPatch2 = PatchMANABRIGHT2; + } + oldmana2 = temp; + UpdateState |= I_STATBAR; + } + if (oldweapon != CPlayer->readyweapon || manaPatch1 || manaPatch2 + || manaVialPatch1) + { // Update mana graphics based upon mana count/weapon type + if (CPlayer->readyweapon == WP_FIRST) + { + manaPatch1 = PatchMANADIM1; + manaPatch2 = PatchMANADIM2; + manaVialPatch1 = PatchMANAVIALDIM1; + manaVialPatch2 = PatchMANAVIALDIM2; + } + else if (CPlayer->readyweapon == WP_SECOND) + { + if (!manaPatch1) + { + manaPatch1 = PatchMANABRIGHT1; + } + manaVialPatch1 = PatchMANAVIAL1; + manaPatch2 = PatchMANADIM2; + manaVialPatch2 = PatchMANAVIALDIM2; + } + else if (CPlayer->readyweapon == WP_THIRD) + { + manaPatch1 = PatchMANADIM1; + manaVialPatch1 = PatchMANAVIALDIM1; + if (!manaPatch2) + { + manaPatch2 = PatchMANABRIGHT2; + } + manaVialPatch2 = PatchMANAVIAL2; + } + else + { + manaVialPatch1 = PatchMANAVIAL1; + manaVialPatch2 = PatchMANAVIAL2; + if (!manaPatch1) + { + manaPatch1 = PatchMANABRIGHT1; + } + if (!manaPatch2) + { + manaPatch2 = PatchMANABRIGHT2; + } + } + V_DrawPatch(77, 164, manaPatch1); + V_DrawPatch(110, 164, manaPatch2); + V_DrawPatch(94, 164, manaVialPatch1); + for (i = 165; i < 187 - (22 * CPlayer->mana[0]) / MAX_MANA; i++) + { + I_VideoBuffer[i * SCREENWIDTH + 95] = 0; + I_VideoBuffer[i * SCREENWIDTH + 96] = 0; + I_VideoBuffer[i * SCREENWIDTH + 97] = 0; + } + V_DrawPatch(102, 164, manaVialPatch2); + for (i = 165; i < 187 - (22 * CPlayer->mana[1]) / MAX_MANA; i++) + { + I_VideoBuffer[i * SCREENWIDTH + 103] = 0; + I_VideoBuffer[i * SCREENWIDTH + 104] = 0; + I_VideoBuffer[i * SCREENWIDTH + 105] = 0; + } + oldweapon = CPlayer->readyweapon; + UpdateState |= I_STATBAR; + } + // Armor + temp = AutoArmorSave[CPlayer->class] + + CPlayer->armorpoints[ARMOR_ARMOR] + + CPlayer->armorpoints[ARMOR_SHIELD] + + CPlayer->armorpoints[ARMOR_HELMET] + + CPlayer->armorpoints[ARMOR_AMULET]; + if (oldarmor != temp) + { + oldarmor = temp; + V_DrawPatch(255, 178, PatchARMCLEAR); + DrINumber(FixedDiv(temp, 5 * FRACUNIT) >> FRACBITS, 250, 176); + UpdateState |= I_STATBAR; + } + // Weapon Pieces + if (oldpieces != CPlayer->pieces) + { + DrawWeaponPieces(); + oldpieces = CPlayer->pieces; + UpdateState |= I_STATBAR; + } +} + +//========================================================================== +// +// DrawInventoryBar +// +//========================================================================== + +void DrawInventoryBar(void) +{ + int i; + int x; + + x = inv_ptr - curpos; + UpdateState |= I_STATBAR; + V_DrawPatch(38, 162, PatchINVBAR); + for (i = 0; i < 7; i++) + { + //V_DrawPatch(50+i*31, 160, W_CacheLumpName("ARTIBOX", PU_CACHE)); + if (CPlayer->inventorySlotNum > x + i + && CPlayer->inventory[x + i].type != arti_none) + { + V_DrawPatch(50 + i * 31, 163, + W_CacheLumpName(patcharti + [CPlayer->inventory[x + i].type], + PU_CACHE)); + if (CPlayer->inventory[x + i].count > 1) + { + DrSmallNumber(CPlayer->inventory[x + i].count, 68 + i * 31, + 185); + } + } + } + V_DrawPatch(50 + curpos * 31, 163, PatchSELECTBOX); + if (x != 0) + { + V_DrawPatch(42, 163, !(leveltime & 4) ? PatchINVLFGEM1 : + PatchINVLFGEM2); + } + if (CPlayer->inventorySlotNum - x > 7) + { + V_DrawPatch(269, 163, !(leveltime & 4) ? PatchINVRTGEM1 : + PatchINVRTGEM2); + } +} + +//========================================================================== +// +// DrawKeyBar +// +//========================================================================== + +void DrawKeyBar(void) +{ + int i; + int xPosition; + int temp; + + if (oldkeys != CPlayer->keys) + { + xPosition = 46; + for (i = 0; i < NUMKEYS && xPosition <= 126; i++) + { + if (CPlayer->keys & (1 << i)) + { + V_DrawPatch(xPosition, 164, + W_CacheLumpNum(W_GetNumForName("keyslot1") + i, + PU_CACHE)); + xPosition += 20; + } + } + oldkeys = CPlayer->keys; + UpdateState |= I_STATBAR; + } + temp = AutoArmorSave[CPlayer->class] + + CPlayer->armorpoints[ARMOR_ARMOR] + + CPlayer->armorpoints[ARMOR_SHIELD] + + CPlayer->armorpoints[ARMOR_HELMET] + + CPlayer->armorpoints[ARMOR_AMULET]; + if (oldarmor != temp) + { + for (i = 0; i < NUMARMOR; i++) + { + if (!CPlayer->armorpoints[i]) + { + continue; + } + if (CPlayer->armorpoints[i] <= + (ArmorIncrement[CPlayer->class][i] >> 2)) + { + V_DrawTLPatch(150 + 31 * i, 164, + W_CacheLumpNum(W_GetNumForName("armslot1") + + i, PU_CACHE)); + } + else if (CPlayer->armorpoints[i] <= + (ArmorIncrement[CPlayer->class][i] >> 1)) + { + V_DrawAltTLPatch(150 + 31 * i, 164, + W_CacheLumpNum(W_GetNumForName("armslot1") + + i, PU_CACHE)); + } + else + { + V_DrawPatch(150 + 31 * i, 164, + W_CacheLumpNum(W_GetNumForName("armslot1") + i, + PU_CACHE)); + } + } + oldarmor = temp; + UpdateState |= I_STATBAR; + } +} + +//========================================================================== +// +// DrawWeaponPieces +// +//========================================================================== + +static int PieceX[NUMCLASSES][3] = { + {190, 225, 234}, + {190, 212, 225}, + {190, 205, 224}, + {0, 0, 0} // Pig is never used +}; + +static void DrawWeaponPieces(void) +{ + if (CPlayer->pieces == 7) + { + V_DrawPatch(190, 162, PatchWEAPONFULL); + return; + } + V_DrawPatch(190, 162, PatchWEAPONSLOT); + if (CPlayer->pieces & WPIECE1) + { + V_DrawPatch(PieceX[PlayerClass[consoleplayer]][0], 162, PatchPIECE1); + } + if (CPlayer->pieces & WPIECE2) + { + V_DrawPatch(PieceX[PlayerClass[consoleplayer]][1], 162, PatchPIECE2); + } + if (CPlayer->pieces & WPIECE3) + { + V_DrawPatch(PieceX[PlayerClass[consoleplayer]][2], 162, PatchPIECE3); + } +} + +//========================================================================== +// +// DrawFullScreenStuff +// +//========================================================================== + +void DrawFullScreenStuff(void) +{ + int i; + int x; + int temp; + + UpdateState |= I_FULLSCRN; + if (CPlayer->mo->health > 0) + { + DrBNumber(CPlayer->mo->health, 5, 180); + } + else + { + DrBNumber(0, 5, 180); + } + if (deathmatch) + { + temp = 0; + for (i = 0; i < MAXPLAYERS; i++) + { + if (playeringame[i]) + { + temp += CPlayer->frags[i]; + } + } + DrINumber(temp, 45, 185); + } + if (!inventory) + { + if (CPlayer->readyArtifact > 0) + { + V_DrawTLPatch(286, 170, W_CacheLumpName("ARTIBOX", PU_CACHE)); + V_DrawPatch(284, 169, + W_CacheLumpName(patcharti[CPlayer->readyArtifact], + PU_CACHE)); + if (CPlayer->inventory[inv_ptr].count > 1) + { + DrSmallNumber(CPlayer->inventory[inv_ptr].count, 302, 192); + } + } + } + else + { + x = inv_ptr - curpos; + for (i = 0; i < 7; i++) + { + V_DrawTLPatch(50 + i * 31, 168, W_CacheLumpName("ARTIBOX", + PU_CACHE)); + if (CPlayer->inventorySlotNum > x + i + && CPlayer->inventory[x + i].type != arti_none) + { + V_DrawPatch(49 + i * 31, 167, + W_CacheLumpName(patcharti + [CPlayer->inventory[x + i].type], + PU_CACHE)); + if (CPlayer->inventory[x + i].count > 1) + { + DrSmallNumber(CPlayer->inventory[x + i].count, + 66 + i * 31, 188); + } + } + } + V_DrawPatch(50 + curpos * 31, 167, PatchSELECTBOX); + if (x != 0) + { + V_DrawPatch(40, 167, !(leveltime & 4) ? PatchINVLFGEM1 : + PatchINVLFGEM2); + } + if (CPlayer->inventorySlotNum - x > 7) + { + V_DrawPatch(268, 167, !(leveltime & 4) ? + PatchINVRTGEM1 : PatchINVRTGEM2); + } + } +} + + +//========================================================================== +// +// Draw_TeleportIcon +// +//========================================================================== +void Draw_TeleportIcon(void) +{ + patch_t *patch; + patch = W_CacheLumpNum(W_GetNumForName("teleicon"), PU_CACHE); + V_DrawPatch(100, 68, patch); + UpdateState |= I_FULLSCRN; + I_FinishUpdate(); + UpdateState |= I_FULLSCRN; +} + +//========================================================================== +// +// Draw_SaveIcon +// +//========================================================================== +void Draw_SaveIcon(void) +{ + patch_t *patch; + patch = W_CacheLumpNum(W_GetNumForName("saveicon"), PU_CACHE); + V_DrawPatch(100, 68, patch); + UpdateState |= I_FULLSCRN; + I_FinishUpdate(); + UpdateState |= I_FULLSCRN; +} + +//========================================================================== +// +// Draw_LoadIcon +// +//========================================================================== +void Draw_LoadIcon(void) +{ + patch_t *patch; + patch = W_CacheLumpNum(W_GetNumForName("loadicon"), PU_CACHE); + V_DrawPatch(100, 68, patch); + UpdateState |= I_FULLSCRN; + I_FinishUpdate(); + UpdateState |= I_FULLSCRN; +} + + + +//========================================================================== +// +// SB_Responder +// +//========================================================================== + +boolean SB_Responder(event_t * event) +{ + if (event->type == ev_keydown) + { + if (HandleCheats(event->data1)) + { // Need to eat the key + return (true); + } + } + return (false); +} + +//========================================================================== +// +// HandleCheats +// +// Returns true if the caller should eat the key. +// +//========================================================================== + +static boolean HandleCheats(byte key) +{ + int i; + boolean eat; + + if (gameskill == sk_nightmare) + { // Can't cheat in nightmare mode + return (false); + } + else if (netgame) + { // change CD track is the only cheat available in deathmatch + eat = false; + if (i_CDMusic) + { + if (CheatAddKey(&Cheats[0], key, &eat)) + { + Cheats[0].func(&players[consoleplayer], &Cheats[0]); + S_StartSound(NULL, SFX_PLATFORM_STOP); + } + if (CheatAddKey(&Cheats[1], key, &eat)) + { + Cheats[1].func(&players[consoleplayer], &Cheats[1]); + S_StartSound(NULL, SFX_PLATFORM_STOP); + } + } + return eat; + } + if (players[consoleplayer].health <= 0) + { // Dead players can't cheat + return (false); + } + eat = false; + for (i = 0; i<arrlen(Cheats); ++i) + { + if (CheatAddKey(&Cheats[i], key, &eat)) + { + Cheats[i].func(&players[consoleplayer], &Cheats[i]); + S_StartSound(NULL, SFX_PLATFORM_STOP); + } + } + return (eat); +} + +//========================================================================== +// +// CheatAddkey +// +// Returns true if the added key completed the cheat, false otherwise. +// +//========================================================================== + +static boolean CheatAddKey(Cheat_t * cheat, byte key, boolean * eat) +{ +/* + if (!cheat->pos) + { + cheat->pos = cheat->sequence; + cheat->currentArg = 0; + } + if (*cheat->pos == 0) + { + *eat = true; + cheat->args[cheat->currentArg++] = key; + cheat->pos++; + } + else if (CheatLookup[key] == *cheat->pos) + { + cheat->pos++; + } + else + { + cheat->pos = cheat->sequence; + cheat->currentArg = 0; + } + if (*cheat->pos == 0xff) + { + cheat->pos = cheat->sequence; + cheat->currentArg = 0; + return (true); + } + return (false); + */ + + *eat = cht_CheckCheat(cheat->seq, key); + + return *eat; +} + +//========================================================================== +// +// CHEAT FUNCTIONS +// +//========================================================================== + +static void CheatGodFunc(player_t * player, Cheat_t * cheat) +{ + player->cheats ^= CF_GODMODE; + if (player->cheats & CF_GODMODE) + { + P_SetMessage(player, TXT_CHEATGODON, true); + } + else + { + P_SetMessage(player, TXT_CHEATGODOFF, true); + } + SB_state = -1; +} + +static void CheatNoClipFunc(player_t * player, Cheat_t * cheat) +{ + player->cheats ^= CF_NOCLIP; + if (player->cheats & CF_NOCLIP) + { + P_SetMessage(player, TXT_CHEATNOCLIPON, true); + } + else + { + P_SetMessage(player, TXT_CHEATNOCLIPOFF, true); + } +} + +static void CheatWeaponsFunc(player_t * player, Cheat_t * cheat) +{ + int i; + //extern boolean *WeaponInShareware; + + for (i = 0; i < NUMARMOR; i++) + { + player->armorpoints[i] = ArmorIncrement[player->class][i]; + } + for (i = 0; i < NUMWEAPONS; i++) + { + player->weaponowned[i] = true; + } + for (i = 0; i < NUMMANA; i++) + { + player->mana[i] = MAX_MANA; + } + P_SetMessage(player, TXT_CHEATWEAPONS, true); +} + +static void CheatHealthFunc(player_t * player, Cheat_t * cheat) +{ + if (player->morphTics) + { + player->health = player->mo->health = MAXMORPHHEALTH; + } + else + { + player->health = player->mo->health = MAXHEALTH; + } + P_SetMessage(player, TXT_CHEATHEALTH, true); +} + +static void CheatKeysFunc(player_t * player, Cheat_t * cheat) +{ + player->keys = 2047; + P_SetMessage(player, TXT_CHEATKEYS, true); +} + +static void CheatSoundFunc(player_t * player, Cheat_t * cheat) +{ + DebugSound = !DebugSound; + if (DebugSound) + { + P_SetMessage(player, TXT_CHEATSOUNDON, true); + } + else + { + P_SetMessage(player, TXT_CHEATSOUNDOFF, true); + } +} + +static void CheatTickerFunc(player_t * player, Cheat_t * cheat) +{ + DisplayTicker = !DisplayTicker; + if (DisplayTicker) + { + P_SetMessage(player, TXT_CHEATTICKERON, true); + } + else + { + P_SetMessage(player, TXT_CHEATTICKEROFF, true); + } + + I_DisplayFPSDots(DisplayTicker); +} + +static void CheatArtifactAllFunc(player_t * player, Cheat_t * cheat) +{ + int i; + int j; + + for (i = arti_none + 1; i < arti_firstpuzzitem; i++) + { + for (j = 0; j < 25; j++) + { + P_GiveArtifact(player, i, NULL); + } + } + P_SetMessage(player, TXT_CHEATARTIFACTS3, true); +} + +static void CheatPuzzleFunc(player_t * player, Cheat_t * cheat) +{ + int i; + + for (i = arti_firstpuzzitem; i < NUMARTIFACTS; i++) + { + P_GiveArtifact(player, i, NULL); + } + P_SetMessage(player, TXT_CHEATARTIFACTS3, true); +} + +static void CheatInitFunc(player_t * player, Cheat_t * cheat) +{ + G_DeferedInitNew(gameskill, gameepisode, gamemap); + P_SetMessage(player, TXT_CHEATWARP, true); +} + +static void CheatWarpFunc(player_t * player, Cheat_t * cheat) +{ + int tens; + int ones; + int map; + char mapName[9]; + char args[2]; + + cht_GetParam(cheat->seq, args); + + tens = args[0] - '0'; + ones = args[1] - '0'; + if (tens < 0 || tens > 9 || ones < 0 || ones > 9) + { // Bad map + P_SetMessage(player, TXT_CHEATBADINPUT, true); + return; + } + map = P_TranslateMap((args[0] - '0') * 10 + args[1] - '0'); + if (map == -1) + { // Not found + P_SetMessage(player, TXT_CHEATNOMAP, true); + return; + } + if (map == gamemap) + { // Don't try to teleport to current map + P_SetMessage(player, TXT_CHEATBADINPUT, true); + return; + } + sprintf(mapName, "MAP%02d", map); + if (W_CheckNumForName(mapName) == -1) + { // Can't find + P_SetMessage(player, TXT_CHEATNOMAP, true); + return; + } + P_SetMessage(player, TXT_CHEATWARP, true); + G_TeleportNewMap(map, 0); +} + +static void CheatPigFunc(player_t * player, Cheat_t * cheat) +{ + extern boolean P_UndoPlayerMorph(player_t * player); + + if (player->morphTics) + { + P_UndoPlayerMorph(player); + } + else + { + P_MorphPlayer(player); + } + P_SetMessage(player, "SQUEAL!!", true); +} + +static void CheatMassacreFunc(player_t * player, Cheat_t * cheat) +{ + int count; + char buffer[80]; + + count = P_Massacre(); + sprintf(buffer, "%d MONSTERS KILLED\n", count); + P_SetMessage(player, buffer, true); +} + +static void CheatIDKFAFunc(player_t * player, Cheat_t * cheat) +{ + int i; + if (player->morphTics) + { + return; + } + for (i = 1; i < 8; i++) + { + player->weaponowned[i] = false; + } + player->pendingweapon = WP_FIRST; + P_SetMessage(player, TXT_CHEATIDKFA, true); +} + +static void CheatQuickenFunc1(player_t * player, Cheat_t * cheat) +{ + P_SetMessage(player, "TRYING TO CHEAT? THAT'S ONE....", true); +} + +static void CheatQuickenFunc2(player_t * player, Cheat_t * cheat) +{ + P_SetMessage(player, "THAT'S TWO....", true); +} + +static void CheatQuickenFunc3(player_t * player, Cheat_t * cheat) +{ + P_DamageMobj(player->mo, NULL, player->mo, 10000); + P_SetMessage(player, "THAT'S THREE! TIME TO DIE.", true); +} + +static void CheatClassFunc1(player_t * player, Cheat_t * cheat) +{ + P_SetMessage(player, "ENTER NEW PLAYER CLASS (0 - 2)", true); +} + +static void CheatClassFunc2(player_t * player, Cheat_t * cheat) +{ + int i; + int class; + char args[2]; + + cht_GetParam(cheat->seq, args); + + if (player->morphTics) + { // don't change class if the player is morphed + return; + } + class = args[0] - '0'; + if (class > 2 || class < 0) + { + P_SetMessage(player, "INVALID PLAYER CLASS", true); + return; + } + player->class = class; + for (i = 0; i < NUMARMOR; i++) + { + player->armorpoints[i] = 0; + } + PlayerClass[consoleplayer] = class; + P_PostMorphWeapon(player, WP_FIRST); + SB_SetClassData(); + SB_state = -1; + UpdateState |= I_FULLSCRN; +} + +static void CheatVersionFunc(player_t * player, Cheat_t * cheat) +{ + P_SetMessage(player, HEXEN_VERSIONTEXT, true); +} + +static void CheatDebugFunc(player_t * player, Cheat_t * cheat) +{ + char textBuffer[50]; + sprintf(textBuffer, "MAP %d (%d) X:%5d Y:%5d Z:%5d", + P_GetMapWarpTrans(gamemap), + gamemap, + player->mo->x >> FRACBITS, + player->mo->y >> FRACBITS, player->mo->z >> FRACBITS); + P_SetMessage(player, textBuffer, true); +} + +static void CheatScriptFunc1(player_t * player, Cheat_t * cheat) +{ + P_SetMessage(player, "RUN WHICH SCRIPT(01-99)?", true); +} + +static void CheatScriptFunc2(player_t * player, Cheat_t * cheat) +{ + P_SetMessage(player, "RUN WHICH SCRIPT(01-99)?", true); +} + +static void CheatScriptFunc3(player_t * player, Cheat_t * cheat) +{ + int script; + byte script_args[3]; + int tens, ones; + char textBuffer[40]; + char args[2]; + + cht_GetParam(cheat->seq, args); + + tens = args[0] - '0'; + ones = args[1] - '0'; + script = tens * 10 + ones; + if (script < 1) + return; + if (script > 99) + return; + script_args[0] = script_args[1] = script_args[2] = 0; + + if (P_StartACS(script, 0, script_args, player->mo, NULL, 0)) + { + sprintf(textBuffer, "RUNNING SCRIPT %.2d", script); + P_SetMessage(player, textBuffer, true); + } +} + +extern int cheating; + +static void CheatRevealFunc(player_t * player, Cheat_t * cheat) +{ + cheating = (cheating + 1) % 3; +} + +//=========================================================================== +// +// CheatTrackFunc1 +// +//=========================================================================== + +static void CheatTrackFunc1(player_t * player, Cheat_t * cheat) +{ + // haleyjd FIXME: CDMUSIC +#ifdef __WATCOMC__ + char buffer[80]; + + if (!i_CDMusic) + { + return; + } + if (I_CDMusInit() == -1) + { + P_SetMessage(player, "ERROR INITIALIZING CD", true); + } + sprintf(buffer, "ENTER DESIRED CD TRACK (%.2d - %.2d):\n", + I_CDMusFirstTrack(), I_CDMusLastTrack()); + P_SetMessage(player, buffer, true); +#endif +} + +//=========================================================================== +// +// CheatTrackFunc2 +// +//=========================================================================== + +static void CheatTrackFunc2(player_t * player, Cheat_t * cheat) +{ + // haleyjd FIXME: CDMUSIC +#ifdef __WATCOMC__ + char buffer[80]; + int track; + char args[2]; + + cht_GetParam(cheat->seq, args); + + if (!i_CDMusic) + { + return; + } + track = (args[0] - '0') * 10 + (args[1] - '0'); + if (track < I_CDMusFirstTrack() || track > I_CDMusLastTrack()) + { + P_SetMessage(player, "INVALID TRACK NUMBER\n", true); + return; + } + if (track == i_CDCurrentTrack) + { + return; + } + if (I_CDMusPlay(track)) + { + sprintf(buffer, "ERROR WHILE TRYING TO PLAY CD TRACK: %.2d\n", track); + P_SetMessage(player, buffer, true); + } + else + { // No error encountered while attempting to play the track + sprintf(buffer, "PLAYING TRACK: %.2d\n", track); + P_SetMessage(player, buffer, true); + i_CDMusicLength = 35 * I_CDMusTrackLength(track); + oldTic = gametic; + i_CDTrack = track; + i_CDCurrentTrack = track; + } +#endif +} |