diff options
author | Simon Howard | 2008-09-04 23:15:36 +0000 |
---|---|---|
committer | Simon Howard | 2008-09-04 23:15:36 +0000 |
commit | 0df2cb80cf03d7259746834220d209b306a8c503 (patch) | |
tree | fdc5037429c91dcbc8207c3e75fc787ef96e207a /src/hexen/sb_bar.c | |
parent | 6a294daa7859eaf0250aa4a77484dd11550e5c5e (diff) | |
download | chocolate-doom-0df2cb80cf03d7259746834220d209b306a8c503.tar.gz chocolate-doom-0df2cb80cf03d7259746834220d209b306a8c503.tar.bz2 chocolate-doom-0df2cb80cf03d7259746834220d209b306a8c503.zip |
Add GPLed Heretic/Hexen source.
Subversion-branch: /branches/raven-branch
Subversion-revision: 1195
Diffstat (limited to 'src/hexen/sb_bar.c')
-rw-r--r-- | src/hexen/sb_bar.c | 2240 |
1 files changed, 2240 insertions, 0 deletions
diff --git a/src/hexen/sb_bar.c b/src/hexen/sb_bar.c new file mode 100644 index 00000000..7ffe3442 --- /dev/null +++ b/src/hexen/sb_bar.c @@ -0,0 +1,2240 @@ + +//************************************************************************** +//** +//** sb_bar.c : Heretic 2 : Raven Software, Corp. +//** +//** $RCSfile: sb_bar.c,v $ +//** $Revision: 1.94 $ +//** $Date: 95/12/31 21:10:08 $ +//** $Author: bgokey $ +//** +//************************************************************************** + +// HEADER FILES ------------------------------------------------------------ + +#include "h2def.h" +#include "p_local.h" +#include "soundst.h" + +#ifdef __WATCOMC__ +#include "i_sound.h" // For CD stuff +#endif + +// MACROS ------------------------------------------------------------------ + +#define CHEAT_ENCRYPT(a) \ + ((((a)&1)<<2)+ \ + (((a)&2)>>1)+ \ + (((a)&4)<<5)+ \ + (((a)&8)<<2)+ \ + (((a)&16)>>3)+ \ + (((a)&32)<<1)+ \ + (((a)&64)>>3)+ \ + (((a)&128)>>3)) + +// TYPES ------------------------------------------------------------------- + +typedef struct Cheat_s +{ + void (*func)(player_t *player, struct Cheat_s *cheat); + byte *sequence; + byte *pos; + int args[2]; + int currentArg; +} 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 byte *screen; +extern int ArmorIncrement[NUMCLASSES][NUMARMOR]; +extern int AutoArmorSave[NUMCLASSES]; + +#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; + +#ifndef __WATCOMC__ +boolean i_CDMusic; // in Watcom, defined in i_ibm +#endif + +// PRIVATE DATA DEFINITIONS ------------------------------------------------ + +static byte CheatLookup[256]; +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 +static byte CheatGodSeq[] = +{ + CHEAT_ENCRYPT('s'), + CHEAT_ENCRYPT('a'), + CHEAT_ENCRYPT('t'), + CHEAT_ENCRYPT('a'), + CHEAT_ENCRYPT('n'), + 0xff +}; + +// Toggle no clipping mode +static byte CheatNoClipSeq[] = +{ + CHEAT_ENCRYPT('c'), + CHEAT_ENCRYPT('a'), + CHEAT_ENCRYPT('s'), + CHEAT_ENCRYPT('p'), + CHEAT_ENCRYPT('e'), + CHEAT_ENCRYPT('r'), + 0xff +}; + +// Get all weapons and mana +static byte CheatWeaponsSeq[] = +{ + CHEAT_ENCRYPT('n'), + CHEAT_ENCRYPT('r'), + CHEAT_ENCRYPT('a'), + 0xff +}; + +// Get full health +static byte CheatHealthSeq[] = +{ + CHEAT_ENCRYPT('c'), + CHEAT_ENCRYPT('l'), + CHEAT_ENCRYPT('u'), + CHEAT_ENCRYPT('b'), + CHEAT_ENCRYPT('m'), + CHEAT_ENCRYPT('e'), + CHEAT_ENCRYPT('d'), + 0xff +}; + +// Get all keys +static byte CheatKeysSeq[] = +{ + CHEAT_ENCRYPT('l'), + CHEAT_ENCRYPT('o'), + CHEAT_ENCRYPT('c'), + CHEAT_ENCRYPT('k'), + CHEAT_ENCRYPT('s'), + CHEAT_ENCRYPT('m'), + CHEAT_ENCRYPT('i'), + CHEAT_ENCRYPT('t'), + CHEAT_ENCRYPT('h'), + 0xff, 0 +}; + +// Toggle sound debug info +static byte CheatSoundSeq[] = +{ + CHEAT_ENCRYPT('n'), + CHEAT_ENCRYPT('o'), + CHEAT_ENCRYPT('i'), + CHEAT_ENCRYPT('s'), + CHEAT_ENCRYPT('e'), + 0xff +}; + +// Toggle ticker +static byte CheatTickerSeq[] = +{ + CHEAT_ENCRYPT('t'), + CHEAT_ENCRYPT('i'), + CHEAT_ENCRYPT('c'), + CHEAT_ENCRYPT('k'), + CHEAT_ENCRYPT('e'), + CHEAT_ENCRYPT('r'), + 0xff, 0 +}; + +// Get all artifacts +static byte CheatArtifactAllSeq[] = +{ + CHEAT_ENCRYPT('i'), + CHEAT_ENCRYPT('n'), + CHEAT_ENCRYPT('d'), + CHEAT_ENCRYPT('i'), + CHEAT_ENCRYPT('a'), + CHEAT_ENCRYPT('n'), + CHEAT_ENCRYPT('a'), + 0xff, 0 +}; + +// Get all puzzle pieces +static byte CheatPuzzleSeq[] = +{ + CHEAT_ENCRYPT('s'), + CHEAT_ENCRYPT('h'), + CHEAT_ENCRYPT('e'), + CHEAT_ENCRYPT('r'), + CHEAT_ENCRYPT('l'), + CHEAT_ENCRYPT('o'), + CHEAT_ENCRYPT('c'), + CHEAT_ENCRYPT('k'), + 0xff, 0 +}; + +// Warp to new level +static byte CheatWarpSeq[] = +{ + CHEAT_ENCRYPT('v'), + CHEAT_ENCRYPT('i'), + CHEAT_ENCRYPT('s'), + CHEAT_ENCRYPT('i'), + CHEAT_ENCRYPT('t'), + 0, 0, 0xff, 0 +}; + +// Become a pig +static byte CheatPigSeq[] = +{ + CHEAT_ENCRYPT('d'), + CHEAT_ENCRYPT('e'), + CHEAT_ENCRYPT('l'), + CHEAT_ENCRYPT('i'), + CHEAT_ENCRYPT('v'), + CHEAT_ENCRYPT('e'), + CHEAT_ENCRYPT('r'), + CHEAT_ENCRYPT('a'), + CHEAT_ENCRYPT('n'), + CHEAT_ENCRYPT('c'), + CHEAT_ENCRYPT('e'), + 0xff, 0 +}; + +// Kill all monsters +static byte CheatMassacreSeq[] = +{ + CHEAT_ENCRYPT('b'), + CHEAT_ENCRYPT('u'), + CHEAT_ENCRYPT('t'), + CHEAT_ENCRYPT('c'), + CHEAT_ENCRYPT('h'), + CHEAT_ENCRYPT('e'), + CHEAT_ENCRYPT('r'), + 0xff, 0 +}; + +static byte CheatIDKFASeq[] = +{ + CHEAT_ENCRYPT('c'), + CHEAT_ENCRYPT('o'), + CHEAT_ENCRYPT('n'), + CHEAT_ENCRYPT('a'), + CHEAT_ENCRYPT('n'), + 0xff, 0 +}; + +static byte CheatQuickenSeq1[] = +{ + CHEAT_ENCRYPT('m'), + CHEAT_ENCRYPT('a'), + CHEAT_ENCRYPT('r'), + CHEAT_ENCRYPT('t'), + CHEAT_ENCRYPT('e'), + CHEAT_ENCRYPT('k'), + 0xff, 0 +}; + +static byte CheatQuickenSeq2[] = +{ + CHEAT_ENCRYPT('m'), + CHEAT_ENCRYPT('a'), + CHEAT_ENCRYPT('r'), + CHEAT_ENCRYPT('t'), + CHEAT_ENCRYPT('e'), + CHEAT_ENCRYPT('k'), + CHEAT_ENCRYPT('m'), + CHEAT_ENCRYPT('a'), + CHEAT_ENCRYPT('r'), + CHEAT_ENCRYPT('t'), + CHEAT_ENCRYPT('e'), + CHEAT_ENCRYPT('k'), + 0xff, 0 +}; + +static byte CheatQuickenSeq3[] = +{ + CHEAT_ENCRYPT('m'), + CHEAT_ENCRYPT('a'), + CHEAT_ENCRYPT('r'), + CHEAT_ENCRYPT('t'), + CHEAT_ENCRYPT('e'), + CHEAT_ENCRYPT('k'), + CHEAT_ENCRYPT('m'), + CHEAT_ENCRYPT('a'), + CHEAT_ENCRYPT('r'), + CHEAT_ENCRYPT('t'), + CHEAT_ENCRYPT('e'), + CHEAT_ENCRYPT('k'), + CHEAT_ENCRYPT('m'), + CHEAT_ENCRYPT('a'), + CHEAT_ENCRYPT('r'), + CHEAT_ENCRYPT('t'), + CHEAT_ENCRYPT('e'), + CHEAT_ENCRYPT('k'), + 0xff, 0 +}; + +// New class +static byte CheatClass1Seq[] = +{ + CHEAT_ENCRYPT('s'), + CHEAT_ENCRYPT('h'), + CHEAT_ENCRYPT('a'), + CHEAT_ENCRYPT('d'), + CHEAT_ENCRYPT('o'), + CHEAT_ENCRYPT('w'), + CHEAT_ENCRYPT('c'), + CHEAT_ENCRYPT('a'), + CHEAT_ENCRYPT('s'), + CHEAT_ENCRYPT('t'), + CHEAT_ENCRYPT('e'), + CHEAT_ENCRYPT('r'), + 0xff, 0 +}; + +static byte CheatClass2Seq[] = +{ + CHEAT_ENCRYPT('s'), + CHEAT_ENCRYPT('h'), + CHEAT_ENCRYPT('a'), + CHEAT_ENCRYPT('d'), + CHEAT_ENCRYPT('o'), + CHEAT_ENCRYPT('w'), + CHEAT_ENCRYPT('c'), + CHEAT_ENCRYPT('a'), + CHEAT_ENCRYPT('s'), + CHEAT_ENCRYPT('t'), + CHEAT_ENCRYPT('e'), + CHEAT_ENCRYPT('r'), + 0, 0xff, 0 +}; + +static byte CheatInitSeq[] = +{ + CHEAT_ENCRYPT('i'), + CHEAT_ENCRYPT('n'), + CHEAT_ENCRYPT('i'), + CHEAT_ENCRYPT('t'), + 0xff, 0 +}; + +static byte CheatVersionSeq[] = +{ + CHEAT_ENCRYPT('m'), + CHEAT_ENCRYPT('r'), + CHEAT_ENCRYPT('j'), + CHEAT_ENCRYPT('o'), + CHEAT_ENCRYPT('n'), + CHEAT_ENCRYPT('e'), + CHEAT_ENCRYPT('s'), + 0xff, 0 +}; + +static byte CheatDebugSeq[] = +{ + CHEAT_ENCRYPT('w'), + CHEAT_ENCRYPT('h'), + CHEAT_ENCRYPT('e'), + CHEAT_ENCRYPT('r'), + CHEAT_ENCRYPT('e'), + 0xff, 0 +}; + +static byte CheatScriptSeq1[] = +{ + CHEAT_ENCRYPT('p'), + CHEAT_ENCRYPT('u'), + CHEAT_ENCRYPT('k'), + CHEAT_ENCRYPT('e'), + 0xff, 0 +}; + +static byte CheatScriptSeq2[] = +{ + CHEAT_ENCRYPT('p'), + CHEAT_ENCRYPT('u'), + CHEAT_ENCRYPT('k'), + CHEAT_ENCRYPT('e'), + 0, 0xff, 0 +}; + +static byte CheatScriptSeq3[] = +{ + CHEAT_ENCRYPT('p'), + CHEAT_ENCRYPT('u'), + CHEAT_ENCRYPT('k'), + CHEAT_ENCRYPT('e'), + 0, 0, 0xff, +}; + +static byte CheatRevealSeq[] = +{ + CHEAT_ENCRYPT('m'), + CHEAT_ENCRYPT('a'), + CHEAT_ENCRYPT('p'), + CHEAT_ENCRYPT('s'), + CHEAT_ENCRYPT('c'), + CHEAT_ENCRYPT('o'), + 0xff, 0 +}; + +static byte CheatTrackSeq1[] = +{ + CHEAT_ENCRYPT('`'), + 0xff, 0 +}; + +static byte CheatTrackSeq2[] = +{ + CHEAT_ENCRYPT('`'), + 0, 0, 0xff, 0 +}; + +static Cheat_t Cheats[] = +{ + { CheatTrackFunc1, CheatTrackSeq1, NULL, 0, 0, 0 }, + { CheatTrackFunc2, CheatTrackSeq2, NULL, 0, 0, 0 }, + { CheatGodFunc, CheatGodSeq, NULL, 0, 0, 0 }, + { CheatNoClipFunc, CheatNoClipSeq, NULL, 0, 0, 0 }, + { CheatWeaponsFunc, CheatWeaponsSeq, NULL, 0, 0, 0 }, + { CheatHealthFunc, CheatHealthSeq, NULL, 0, 0, 0 }, + { CheatKeysFunc, CheatKeysSeq, NULL, 0, 0, 0 }, + { CheatSoundFunc, CheatSoundSeq, NULL, 0, 0, 0 }, + { CheatTickerFunc, CheatTickerSeq, NULL, 0, 0, 0 }, + { CheatArtifactAllFunc, CheatArtifactAllSeq, NULL, 0, 0, 0 }, + { CheatPuzzleFunc, CheatPuzzleSeq, NULL, 0, 0, 0 }, + { CheatWarpFunc, CheatWarpSeq, NULL, 0, 0, 0 }, + { CheatPigFunc, CheatPigSeq, NULL, 0, 0, 0 }, + { CheatMassacreFunc, CheatMassacreSeq, NULL, 0, 0, 0 }, + { CheatIDKFAFunc, CheatIDKFASeq, NULL, 0, 0, 0 }, + { CheatQuickenFunc1, CheatQuickenSeq1, NULL, 0, 0, 0 }, + { CheatQuickenFunc2, CheatQuickenSeq2, NULL, 0, 0, 0 }, + { CheatQuickenFunc3, CheatQuickenSeq3, NULL, 0, 0, 0 }, + { CheatClassFunc1, CheatClass1Seq, NULL, 0, 0, 0 }, + { CheatClassFunc2, CheatClass2Seq, NULL, 0, 0, 0 }, + { CheatInitFunc, CheatInitSeq, NULL, 0, 0, 0 }, + { CheatVersionFunc, CheatVersionSeq, NULL, 0, 0, 0 }, + { CheatDebugFunc, CheatDebugSeq, NULL, 0, 0, 0 }, + { CheatScriptFunc1, CheatScriptSeq1, NULL, 0, 0, 0 }, + { CheatScriptFunc2, CheatScriptSeq2, NULL, 0, 0, 0 }, + { CheatScriptFunc3, CheatScriptSeq3, NULL, 0, 0, 0 }, + { CheatRevealFunc, CheatRevealSeq, NULL, 0, 0, 0 }, + { NULL, NULL, NULL, 0, 0, 0 } // Terminator +}; + +// 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"); + + for(i = 0; i < 256; i++) + { + CheatLookup[i] = CHEAT_ENCRYPT(i); + } + + 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 = screen+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", 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++) + { + screen[i*SCREENWIDTH+95] = 0; + screen[i*SCREENWIDTH+96] = 0; + screen[i*SCREENWIDTH+97] = 0; + } + V_DrawPatch(102, 164, manaVialPatch2); + for(i = 165; i < 187-(22*CPlayer->mana[1])/MAX_MANA; i++) + { + screen[i*SCREENWIDTH+103] = 0; + screen[i*SCREENWIDTH+104] = 0; + screen[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_DrawFuzzPatch(150+31*i, 164, + W_CacheLumpNum(W_GetNumForName("armslot1")+i, PU_CACHE)); + } + else if(CPlayer->armorpoints[i] <= + (ArmorIncrement[CPlayer->class][i]>>1)) + { + V_DrawAltFuzzPatch(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_DrawFuzzPatch(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_DrawFuzzPatch(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_Update(); + 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_Update(); + 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_Update(); + 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; Cheats[i].func != NULL; 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); +} + +//========================================================================== +// +// 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) +{ + extern int DisplayTicker; + + DisplayTicker = !DisplayTicker; + if(DisplayTicker) + { + P_SetMessage(player, TXT_CHEATTICKERON, true); + } + else + { + P_SetMessage(player, TXT_CHEATTICKEROFF, true); + } +} + +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 auxName[128]; + FILE *fp; + + tens = cheat->args[0]-'0'; + ones = cheat->args[1]-'0'; + if(tens < 0 || tens > 9 || ones < 0 || ones > 9) + { // Bad map + P_SetMessage(player, TXT_CHEATBADINPUT, true); + return; + } + map = P_TranslateMap((cheat->args[0]-'0')*10+cheat->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; + } + if(DevMaps) + { // Search map development directory + sprintf(auxName, "%sMAP%02d.WAD", DevMapsDir, map); + fp = fopen(auxName, "rb"); + if(fp) + { + fclose(fp); + } + else + { // Can't find + P_SetMessage(player, TXT_CHEATNOMAP, true); + return; + } + } + else + { // Search primary lumps + 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; + + if(player->morphTics) + { // don't change class if the player is morphed + return; + } + class = cheat->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, 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 args[3]; + int tens, ones; + char textBuffer[40]; + + tens = cheat->args[0]-'0'; + ones = cheat->args[1]-'0'; + script = tens*10 + ones; + if (script < 1) return; + if (script > 99) return; + args[0]=args[1]=args[2]=0; + + if(P_StartACS(script, 0, 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) +{ +#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) +{ +#ifdef __WATCOMC__ + char buffer[80]; + int track; + + if(!i_CDMusic) + { + return; + } + track = (cheat->args[0]-'0')*10+(cheat->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 +} |