2 //**************************************************************************
4 //** sb_bar.c : Heretic 2 : Raven Software, Corp.
11 //**************************************************************************
13 // HEADER FILES ------------------------------------------------------------
18 #include "i_cdmus.h" /* jim for CD track cheat */
23 #define INVALID_PATCH 0
24 #define W_CacheLumpName(a,b) W_GetNumForName(a)
25 #define WR_CacheLumpNum(a,b) a
26 #define V_DrawPatch(x,y,p) OGL_DrawPatch(x,y,p)
27 #define V_DrawFuzzPatch(x,y,p) OGL_DrawFuzzPatch(x,y,p)
28 #define V_DrawAltFuzzPatch(x,y,p) OGL_DrawAltFuzzPatch(x,y,p)
30 #define PATCH_REF patch_t*
31 #define INVALID_PATCH 0
32 #define WR_CacheLumpNum(a,b) W_CacheLumpNum(a,b)
36 // MACROS ------------------------------------------------------------------
38 #define CHEAT_ENCRYPT(a) \
48 // TYPES -------------------------------------------------------------------
50 typedef struct Cheat_s
52 void (*func)(player_t *player, struct Cheat_s *cheat);
59 // EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
61 // PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
63 void SB_PaletteFlash(boolean forceChange);
65 // PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
67 static void DrawSoundInfo(void);
68 static void DrINumber(signed int val, int x, int y);
69 static void DrRedINumber(signed int val, int x, int y);
70 static void DrBNumber(signed int val, int x, int y);
71 static void DrawCommonBar(void);
72 static void DrawMainBar(void);
73 static void DrawInventoryBar(void);
74 static void DrawKeyBar(void);
75 static void DrawWeaponPieces(void);
76 static void DrawFullScreenStuff(void);
77 static void DrawAnimatedIcons(void);
78 static boolean HandleCheats(byte key);
79 static boolean CheatAddKey(Cheat_t *cheat, byte key, boolean *eat);
80 static void CheatGodFunc(player_t *player, Cheat_t *cheat);
81 static void CheatNoClipFunc(player_t *player, Cheat_t *cheat);
82 static void CheatWeaponsFunc(player_t *player, Cheat_t *cheat);
83 static void CheatHealthFunc(player_t *player, Cheat_t *cheat);
84 static void CheatKeysFunc(player_t *player, Cheat_t *cheat);
85 static void CheatSoundFunc(player_t *player, Cheat_t *cheat);
86 static void CheatTickerFunc(player_t *player, Cheat_t *cheat);
87 static void CheatArtifactAllFunc(player_t *player, Cheat_t *cheat);
88 static void CheatPuzzleFunc(player_t *player, Cheat_t *cheat);
89 static void CheatWarpFunc(player_t *player, Cheat_t *cheat);
90 static void CheatPigFunc(player_t *player, Cheat_t *cheat);
91 static void CheatMassacreFunc(player_t *player, Cheat_t *cheat);
92 static void CheatIDKFAFunc(player_t *player, Cheat_t *cheat);
93 static void CheatQuickenFunc1(player_t *player, Cheat_t *cheat);
94 static void CheatQuickenFunc2(player_t *player, Cheat_t *cheat);
95 static void CheatQuickenFunc3(player_t *player, Cheat_t *cheat);
96 static void CheatClassFunc1(player_t *player, Cheat_t *cheat);
97 static void CheatClassFunc2(player_t *player, Cheat_t *cheat);
98 static void CheatInitFunc(player_t *player, Cheat_t *cheat);
99 static void CheatInitFunc(player_t *player, Cheat_t *cheat);
100 static void CheatVersionFunc(player_t *player, Cheat_t *cheat);
101 static void CheatDebugFunc(player_t *player, Cheat_t *cheat);
102 static void CheatScriptFunc1(player_t *player, Cheat_t *cheat);
103 static void CheatScriptFunc2(player_t *player, Cheat_t *cheat);
104 static void CheatScriptFunc3(player_t *player, Cheat_t *cheat);
105 static void CheatRevealFunc(player_t *player, Cheat_t *cheat);
106 static void CheatTrackFunc1(player_t *player, Cheat_t *cheat);
107 static void CheatTrackFunc2(player_t *player, Cheat_t *cheat);
109 // EXTERNAL DATA DECLARATIONS ----------------------------------------------
112 extern int ArmorIncrement[NUMCLASSES][NUMARMOR];
113 extern int AutoArmorSave[NUMCLASSES];
116 extern boolean i_CDMusic;
117 extern int i_CDMusicLength;
118 extern int i_CDTrack;
119 extern int i_CDCurrentTrack;
122 // PUBLIC DATA DECLARATIONS ------------------------------------------------
124 boolean DebugSound; // Debug flag for displaying sound info
130 boolean i_CDMusic; // in Watcom, defined in i_ibm
133 // PRIVATE DATA DEFINITIONS ------------------------------------------------
135 static byte CheatLookup[256];
136 static int HealthMarker;
137 //static int ChainWiggle;
138 static player_t *CPlayer;
139 static int SpinFlylump;
140 static int SpinMinotaurLump;
141 static int SpinSpeedLump;
142 static int SpinDefenseLump;
144 static int FontBNumBase;
145 static int PlayPalette;
147 static PATCH_REF PatchH2BAR;
148 static PATCH_REF PatchH2TOP;
149 static PATCH_REF PatchLFEDGE;
150 static PATCH_REF PatchRTEDGE;
151 static PATCH_REF PatchARMCLEAR;
152 static PATCH_REF PatchARTICLEAR;
153 static PATCH_REF PatchMANACLEAR;
154 static PATCH_REF PatchKILLS;
155 static PATCH_REF PatchMANAVIAL1;
156 static PATCH_REF PatchMANAVIAL2;
157 static PATCH_REF PatchMANAVIALDIM1;
158 static PATCH_REF PatchMANAVIALDIM2;
159 static PATCH_REF PatchMANADIM1;
160 static PATCH_REF PatchMANADIM2;
161 static PATCH_REF PatchMANABRIGHT1;
162 static PATCH_REF PatchMANABRIGHT2;
163 static PATCH_REF PatchCHAIN;
164 static PATCH_REF PatchSTATBAR;
165 static PATCH_REF PatchKEYBAR;
166 static PATCH_REF PatchLIFEGEM;
167 static PATCH_REF PatchSELECTBOX;
168 static PATCH_REF PatchINumbers[10];
169 static PATCH_REF PatchNEGATIVE;
170 static PATCH_REF PatchSmNumbers[10];
171 static PATCH_REF PatchINVBAR;
172 static PATCH_REF PatchWEAPONSLOT;
173 static PATCH_REF PatchWEAPONFULL;
174 static PATCH_REF PatchPIECE1;
175 static PATCH_REF PatchPIECE2;
176 static PATCH_REF PatchPIECE3;
177 static PATCH_REF PatchINVLFGEM1;
178 static PATCH_REF PatchINVLFGEM2;
179 static PATCH_REF PatchINVRTGEM1;
180 static PATCH_REF PatchINVRTGEM2;
183 static byte CheatGodSeq[] =
193 // Toggle no clipping mode
194 static byte CheatNoClipSeq[] =
205 // Get all weapons and mana
206 static byte CheatWeaponsSeq[] =
215 static byte CheatHealthSeq[] =
228 static byte CheatKeysSeq[] =
242 // Toggle sound debug info
243 static byte CheatSoundSeq[] =
254 static byte CheatTickerSeq[] =
266 static byte CheatArtifactAllSeq[] =
278 // Get all puzzle pieces
279 static byte CheatPuzzleSeq[] =
293 static byte CheatWarpSeq[] =
304 static byte CheatPigSeq[] =
321 static byte CheatMassacreSeq[] =
333 static byte CheatIDKFASeq[] =
343 static byte CheatQuickenSeq1[] =
354 static byte CheatQuickenSeq2[] =
371 static byte CheatQuickenSeq3[] =
395 static byte CheatClass1Seq[] =
412 static byte CheatClass2Seq[] =
429 static byte CheatInitSeq[] =
438 static byte CheatVersionSeq[] =
450 static byte CheatDebugSeq[] =
460 static byte CheatScriptSeq1[] =
469 static byte CheatScriptSeq2[] =
478 static byte CheatScriptSeq3[] =
487 static byte CheatRevealSeq[] =
498 static byte CheatTrackSeq1[] =
504 static byte CheatTrackSeq2[] =
510 /* jim added {} around args field (aren't keyboard macros great?) */
511 static Cheat_t Cheats[] =
513 { CheatTrackFunc1, CheatTrackSeq1, NULL, {0, 0}, 0 },
514 { CheatTrackFunc2, CheatTrackSeq2, NULL, {0, 0}, 0 },
515 { CheatGodFunc, CheatGodSeq, NULL, {0, 0}, 0 },
516 { CheatNoClipFunc, CheatNoClipSeq, NULL, {0, 0}, 0 },
517 { CheatWeaponsFunc, CheatWeaponsSeq, NULL, {0, 0}, 0 },
518 { CheatHealthFunc, CheatHealthSeq, NULL, {0, 0}, 0 },
519 { CheatKeysFunc, CheatKeysSeq, NULL, {0, 0}, 0 },
520 { CheatSoundFunc, CheatSoundSeq, NULL, {0, 0}, 0 },
521 { CheatTickerFunc, CheatTickerSeq, NULL, {0, 0}, 0 },
522 { CheatArtifactAllFunc, CheatArtifactAllSeq, NULL, {0, 0}, 0 },
523 { CheatPuzzleFunc, CheatPuzzleSeq, NULL, {0, 0}, 0 },
524 { CheatWarpFunc, CheatWarpSeq, NULL, {0, 0}, 0 },
525 { CheatPigFunc, CheatPigSeq, NULL, {0, 0}, 0 },
526 { CheatMassacreFunc, CheatMassacreSeq, NULL, {0, 0}, 0 },
527 { CheatIDKFAFunc, CheatIDKFASeq, NULL, {0, 0}, 0 },
528 { CheatQuickenFunc1, CheatQuickenSeq1, NULL, {0, 0}, 0 },
529 { CheatQuickenFunc2, CheatQuickenSeq2, NULL, {0, 0}, 0 },
530 { CheatQuickenFunc3, CheatQuickenSeq3, NULL, {0, 0}, 0 },
531 { CheatClassFunc1, CheatClass1Seq, NULL, {0, 0}, 0 },
532 { CheatClassFunc2, CheatClass2Seq, NULL, {0, 0}, 0 },
533 { CheatInitFunc, CheatInitSeq, NULL, {0, 0}, 0 },
534 { CheatVersionFunc, CheatVersionSeq, NULL, {0, 0}, 0 },
535 { CheatDebugFunc, CheatDebugSeq, NULL, {0, 0}, 0 },
536 { CheatScriptFunc1, CheatScriptSeq1, NULL, {0, 0}, 0 },
537 { CheatScriptFunc2, CheatScriptSeq2, NULL, {0, 0}, 0 },
538 { CheatScriptFunc3, CheatScriptSeq3, NULL, {0, 0}, 0 },
539 { CheatRevealFunc, CheatRevealSeq, NULL, {0, 0}, 0 },
540 { NULL, NULL, NULL, {0, 0}, 0 } // Terminator
543 // CODE --------------------------------------------------------------------
545 //==========================================================================
549 //==========================================================================
556 PatchH2BAR = W_CacheLumpName("H2BAR", PU_STATIC);
557 PatchH2TOP = W_CacheLumpName("H2TOP", PU_STATIC);
558 PatchINVBAR = W_CacheLumpName("INVBAR", PU_STATIC);
559 PatchLFEDGE = W_CacheLumpName("LFEDGE", PU_STATIC);
560 PatchRTEDGE = W_CacheLumpName("RTEDGE", PU_STATIC);
561 PatchSTATBAR = W_CacheLumpName("STATBAR", PU_STATIC);
562 PatchKEYBAR = W_CacheLumpName("KEYBAR", PU_STATIC);
563 PatchSELECTBOX = W_CacheLumpName("SELECTBOX", PU_STATIC);
564 PatchARTICLEAR = W_CacheLumpName("ARTICLS", PU_STATIC);
565 PatchARMCLEAR = W_CacheLumpName("ARMCLS", PU_STATIC);
566 PatchMANACLEAR = W_CacheLumpName("MANACLS", PU_STATIC);
567 PatchMANAVIAL1 = W_CacheLumpName("MANAVL1", PU_STATIC);
568 PatchMANAVIAL2 = W_CacheLumpName("MANAVL2", PU_STATIC);
569 PatchMANAVIALDIM1 = W_CacheLumpName("MANAVL1D", PU_STATIC);
570 PatchMANAVIALDIM2 = W_CacheLumpName("MANAVL2D", PU_STATIC);
571 PatchMANADIM1 = W_CacheLumpName("MANADIM1", PU_STATIC);
572 PatchMANADIM2 = W_CacheLumpName("MANADIM2", PU_STATIC);
573 PatchMANABRIGHT1 = W_CacheLumpName("MANABRT1", PU_STATIC);
574 PatchMANABRIGHT2 = W_CacheLumpName("MANABRT2", PU_STATIC);
575 PatchINVLFGEM1 = W_CacheLumpName("invgeml1", PU_STATIC);
576 PatchINVLFGEM2 = W_CacheLumpName("invgeml2", PU_STATIC);
577 PatchINVRTGEM1 = W_CacheLumpName("invgemr1", PU_STATIC);
578 PatchINVRTGEM2 = W_CacheLumpName("invgemr2", PU_STATIC);
580 // PatchCHAINBACK = W_CacheLumpName("CHAINBACK", PU_STATIC);
581 startLump = W_GetNumForName("IN0");
582 for(i = 0; i < 10; i++)
584 PatchINumbers[i] = WR_CacheLumpNum(startLump+i, PU_STATIC);
586 PatchNEGATIVE = W_CacheLumpName("NEGNUM", PU_STATIC);
587 FontBNumBase = W_GetNumForName("FONTB16");
588 startLump = W_GetNumForName("SMALLIN0");
589 for(i = 0; i < 10; i++)
591 PatchSmNumbers[i] = WR_CacheLumpNum(startLump+i, PU_STATIC);
593 PlayPalette = W_GetNumForName("PLAYPAL");
594 SpinFlylump = W_GetNumForName("SPFLY0");
595 SpinMinotaurLump = W_GetNumForName("SPMINO0");
596 SpinSpeedLump = W_GetNumForName("SPBOOT0");
597 SpinDefenseLump = W_GetNumForName("SPSHLD0");
599 for(i = 0; i < 256; i++)
601 CheatLookup[i] = CHEAT_ENCRYPT(i);
606 PatchKILLS = W_CacheLumpName("KILLS", PU_STATIC);
611 //==========================================================================
615 //==========================================================================
617 void SB_SetClassData(void)
621 if(PlayerClass[consoleplayer] != PCLASS_ASS)
623 class = PlayerClass[consoleplayer]; // original player class (not pig)
626 class = 0; // Use FIghter chain and gem for now
628 PatchWEAPONSLOT = WR_CacheLumpNum(W_GetNumForName("wpslot0")
630 PatchWEAPONFULL = WR_CacheLumpNum(W_GetNumForName("wpfull0")
632 PatchPIECE1 = WR_CacheLumpNum(W_GetNumForName("wpiecef1")
634 PatchPIECE2 = WR_CacheLumpNum(W_GetNumForName("wpiecef2")
636 PatchPIECE3 = WR_CacheLumpNum(W_GetNumForName("wpiecef3")
638 PatchCHAIN = WR_CacheLumpNum(W_GetNumForName("chain")
641 { // single player game uses red life gem (the second gem)
642 PatchLIFEGEM = WR_CacheLumpNum(W_GetNumForName("lifegem")
643 +4*class+1, PU_STATIC);
647 PatchLIFEGEM = WR_CacheLumpNum(W_GetNumForName("lifegem")
648 +MAXPLAYERS*class+consoleplayer, PU_STATIC);
651 UpdateState |= I_FULLSCRN;
654 //==========================================================================
658 //==========================================================================
665 curHealth = players[consoleplayer].mo->health;
670 if(curHealth < HealthMarker)
672 delta = (HealthMarker-curHealth)>>2;
681 HealthMarker -= delta;
683 else if(curHealth > HealthMarker)
685 delta = (curHealth-HealthMarker)>>2;
694 HealthMarker += delta;
698 //==========================================================================
702 // Draws a three digit number.
704 //==========================================================================
706 static void DrINumber(signed int val, int x, int y)
721 patch = PatchINumbers[val/10];
722 V_DrawPatch(x+8, y, patch);
723 V_DrawPatch(x, y, PatchNEGATIVE);
727 V_DrawPatch(x+8, y, PatchNEGATIVE);
730 patch = PatchINumbers[val];
731 V_DrawPatch(x+16, y, patch);
736 patch = PatchINumbers[val/100];
737 V_DrawPatch(x, y, patch);
740 if(val > 9 || oldval > 99)
742 patch = PatchINumbers[val/10];
743 V_DrawPatch(x+8, y, patch);
746 patch = PatchINumbers[val];
747 V_DrawPatch(x+16, y, patch);
750 //==========================================================================
754 // Draws a three digit number using the red font
756 //==========================================================================
758 static void DrRedINumber(signed int val, int x, int y)
770 patch = WR_CacheLumpNum(W_GetNumForName("inred0")+val/100, PU_CACHE);
771 V_DrawPatch(x, y, patch);
774 if(val > 9 || oldval > 99)
776 patch = WR_CacheLumpNum(W_GetNumForName("inred0")+val/10, PU_CACHE);
777 V_DrawPatch(x+8, y, patch);
780 patch = WR_CacheLumpNum(W_GetNumForName("inred0")+val, PU_CACHE);
781 V_DrawPatch(x+16, y, patch);
784 //==========================================================================
788 // Draws a three digit number using FontB
790 //==========================================================================
792 static void DrBNumber(signed int val, int x, int y)
806 patch = W_CacheLumpNum(FontBNumBase+val/100, PU_CACHE);
808 OGL_DrawShadowedPatch(xpos+6-patch->width/2, y, FontBNumBase+val/100);
810 V_DrawShadowedPatch(xpos+6-patch->width/2, y, patch);
815 if(val > 9 || oldval > 99)
817 patch = W_CacheLumpNum(FontBNumBase+val/10, PU_CACHE);
819 OGL_DrawShadowedPatch(xpos+6-patch->width/2, y, FontBNumBase+val/10);
821 V_DrawShadowedPatch(xpos+6-patch->width/2, y, patch);
826 patch = W_CacheLumpNum(FontBNumBase+val, PU_CACHE);
828 OGL_DrawShadowedPatch(xpos+6-patch->width/2, y, FontBNumBase+val/1);
830 V_DrawShadowedPatch(xpos+6-patch->width/2, y, patch);
834 //==========================================================================
838 // Draws a small two digit number.
840 //==========================================================================
842 static void DrSmallNumber(int val, int x, int y)
856 patch = PatchSmNumbers[val/100];
857 V_DrawPatch(x, y, patch);
858 patch = PatchSmNumbers[(val%100)/10];
859 V_DrawPatch(x+4, y, patch);
863 patch = PatchSmNumbers[val/10];
864 V_DrawPatch(x+4, y, patch);
867 patch = PatchSmNumbers[val];
868 V_DrawPatch(x+8, y, patch);
872 //==========================================================================
876 //==========================================================================
878 static void ShadeLine(int x, int y, int height, int shade)
883 shades = colormaps+9*256+shade*2*256;
884 dest = screen+y*SCREENWIDTH+x;
887 *(dest) = *(shades+*dest);
892 //==========================================================================
896 //==========================================================================
898 static void ShadeChain(void)
902 for(i = 0; i < 16; i++)
904 ShadeLine(277+i, 190, 10, i/2);
905 ShadeLine(19+i, 190, 10, 7-(i/2));
910 //==========================================================================
914 // Displays sound debugging information.
916 //==========================================================================
918 static void DrawSoundInfo(void)
926 int xPos[7] = {1, 75, 112, 156, 200, 230, 260};
930 MN_DrTextA("*** SOUND DEBUG INFO ***", xPos[0], 20);
932 S_GetChannelInfo(&s);
933 if(s.channelCount == 0)
938 MN_DrTextA("NAME", xPos[x++], 30);
939 MN_DrTextA("MO.T", xPos[x++], 30);
940 MN_DrTextA("MO.X", xPos[x++], 30);
941 MN_DrTextA("MO.Y", xPos[x++], 30);
942 MN_DrTextA("ID", xPos[x++], 30);
943 MN_DrTextA("PRI", xPos[x++], 30);
944 MN_DrTextA("DIST", xPos[x++], 30);
945 for(i = 0; i < s.channelCount; i++)
951 { // Channel is unused
952 MN_DrTextA("------", xPos[0], y);
955 sprintf(text, "%s", c->name);
956 M_ForceUppercase(text);
957 MN_DrTextA(text, xPos[x++], y);
958 sprintf(text, "%d", c->mo->type);
959 MN_DrTextA(text, xPos[x++], y);
960 sprintf(text, "%d", c->mo->x>>FRACBITS);
961 MN_DrTextA(text, xPos[x++], y);
962 sprintf(text, "%d", c->mo->y>>FRACBITS);
963 MN_DrTextA(text, xPos[x++], y);
964 sprintf(text, "%ld", c->id); /* jim added 'l' */
965 MN_DrTextA(text, xPos[x++], y);
966 sprintf(text, "%d", c->priority);
967 MN_DrTextA(text, xPos[x++], y);
968 sprintf(text, "%d", c->distance);
969 MN_DrTextA(text, xPos[x++], y);
971 UpdateState |= I_FULLSCRN;
972 BorderNeedRefresh = true;
975 //==========================================================================
979 //==========================================================================
981 char patcharti[][10] =
983 { "ARTIBOX" }, // none
984 { "ARTIINVU" }, // invulnerability
985 { "ARTIPTN2" }, // health
986 { "ARTISPHL" }, // superhealth
987 { "ARTIHRAD" }, // healing radius
988 { "ARTISUMN" }, // summon maulator
989 { "ARTITRCH" }, // torch
990 { "ARTIPORK" }, // egg
991 { "ARTISOAR" }, // fly
992 { "ARTIBLST" }, // blast radius
993 { "ARTIPSBG" }, // poison bag
994 { "ARTITELO" }, // teleport other
995 { "ARTISPED" }, // speed
996 { "ARTIBMAN" }, // boost mana
997 { "ARTIBRAC" }, // boost armor
998 { "ARTIATLP" }, // teleport
999 { "ARTISKLL" }, // arti_puzzskull
1000 { "ARTIBGEM" }, // arti_puzzgembig
1001 { "ARTIGEMR" }, // arti_puzzgemred
1002 { "ARTIGEMG" }, // arti_puzzgemgreen1
1003 { "ARTIGMG2" }, // arti_puzzgemgreen2
1004 { "ARTIGEMB" }, // arti_puzzgemblue1
1005 { "ARTIGMB2" }, // arti_puzzgemblue2
1006 { "ARTIBOK1" }, // arti_puzzbook1
1007 { "ARTIBOK2" }, // arti_puzzbook2
1008 { "ARTISKL2" }, // arti_puzzskull2
1009 { "ARTIFWEP" }, // arti_puzzfweapon
1010 { "ARTICWEP" }, // arti_puzzcweapon
1011 { "ARTIMWEP" }, // arti_puzzmweapon
1012 { "ARTIGEAR" }, // arti_puzzgear1
1013 { "ARTIGER2" }, // arti_puzzgear2
1014 { "ARTIGER3" }, // arti_puzzgear3
1015 { "ARTIGER4" }, // arti_puzzgear4
1020 static int oldfrags = -9999;
1021 static int oldmana1 = -1;
1022 static int oldmana2 = -1;
1023 static int oldhealth = -1;
1024 static int oldlife = -1;
1025 static int oldpieces = -1;
1026 static int oldweapon = -1;
1028 static int oldarti = 0;
1029 static int oldartiCount = 0;
1030 static int oldkeys = -1;
1031 static int oldarmor = -1;
1033 extern boolean automapactive;
1035 void SB_Drawer(void)
1037 // Sound info debug stuff
1038 if(DebugSound == true)
1042 CPlayer = &players[consoleplayer];
1043 if(viewheight == SCREENHEIGHT && !automapactive)
1045 DrawFullScreenStuff();
1054 V_DrawPatch(0, 134, PatchH2BAR);
1070 V_DrawPatch(38, 162, PatchSTATBAR);
1074 V_DrawPatch(38, 162, PatchKEYBAR);
1082 oldfrags = -9999; //can't use -1, 'cuz of negative frags
1104 SB_PaletteFlash(false);
1105 DrawAnimatedIcons();
1108 //==========================================================================
1110 // DrawAnimatedIcons
1112 //==========================================================================
1114 static void DrawAnimatedIcons(void)
1117 static boolean hitCenterFrame;
1120 if(CPlayer->powers[pw_flight])
1122 if(CPlayer->powers[pw_flight] > BLINKTHRESHOLD
1123 || !(CPlayer->powers[pw_flight]&16))
1125 frame = (leveltime/3)&15;
1126 if(CPlayer->mo->flags2&MF2_FLY)
1128 if(hitCenterFrame && (frame != 15 && frame != 0))
1130 V_DrawPatch(20, 19, WR_CacheLumpNum(SpinFlylump+15,
1135 V_DrawPatch(20, 19, WR_CacheLumpNum(SpinFlylump+frame,
1137 hitCenterFrame = false;
1142 if(!hitCenterFrame && (frame != 15 && frame != 0))
1144 V_DrawPatch(20, 19, WR_CacheLumpNum(SpinFlylump+frame,
1146 hitCenterFrame = false;
1150 V_DrawPatch(20, 19, WR_CacheLumpNum(SpinFlylump+15,
1152 hitCenterFrame = true;
1156 BorderTopRefresh = true;
1157 UpdateState |= I_MESSAGES;
1161 if(CPlayer->powers[pw_speed])
1163 if(CPlayer->powers[pw_speed] > BLINKTHRESHOLD
1164 || !(CPlayer->powers[pw_speed]&16))
1166 frame = (leveltime/3)&15;
1167 V_DrawPatch(60, 19, WR_CacheLumpNum(SpinSpeedLump+frame,
1170 BorderTopRefresh = true;
1171 UpdateState |= I_MESSAGES;
1175 if(CPlayer->powers[pw_invulnerability])
1177 if(CPlayer->powers[pw_invulnerability] > BLINKTHRESHOLD
1178 || !(CPlayer->powers[pw_invulnerability]&16))
1180 frame = (leveltime/3)&15;
1181 V_DrawPatch(260, 19, WR_CacheLumpNum(SpinDefenseLump+frame,
1184 BorderTopRefresh = true;
1185 UpdateState |= I_MESSAGES;
1189 if(CPlayer->powers[pw_minotaur])
1191 if(CPlayer->powers[pw_minotaur] > BLINKTHRESHOLD
1192 || !(CPlayer->powers[pw_minotaur]&16))
1194 frame = (leveltime/3)&15;
1195 V_DrawPatch(300, 19, WR_CacheLumpNum(SpinMinotaurLump+frame,
1198 BorderTopRefresh = true;
1199 UpdateState |= I_MESSAGES;
1203 //==========================================================================
1207 // Sets the new palette based upon the current values of
1208 // consoleplayer->damagecount and consoleplayer->bonuscount.
1210 //==========================================================================
1212 void SB_PaletteFlash(boolean forceChange)
1214 static int sb_palette = 0;
1224 if(gamestate == GS_LEVEL)
1226 CPlayer = &players[consoleplayer];
1227 if(CPlayer->poisoncount)
1230 palette = (CPlayer->poisoncount+7)>>3;
1231 if(palette >= NUMPOISONPALS)
1233 palette = NUMPOISONPALS-1;
1235 palette += STARTPOISONPALS;
1237 else if(CPlayer->damagecount)
1239 palette = (CPlayer->damagecount+7)>>3;
1240 if(palette >= NUMREDPALS)
1242 palette = NUMREDPALS-1;
1244 palette += STARTREDPALS;
1246 else if(CPlayer->bonuscount)
1248 palette = (CPlayer->bonuscount+7)>>3;
1249 if(palette >= NUMBONUSPALS)
1251 palette = NUMBONUSPALS-1;
1253 palette += STARTBONUSPALS;
1255 else if(CPlayer->mo->flags2&MF2_ICEDAMAGE)
1257 palette = STARTICEPAL;
1268 if(palette != sb_palette)
1270 sb_palette = palette;
1272 OGL_SetFilter( palette );
1274 pal = (byte *)WR_CacheLumpNum(PlayPalette, PU_CACHE)+palette*768;
1280 //==========================================================================
1284 //==========================================================================
1286 void DrawCommonBar(void)
1291 V_DrawPatch(0, 134, PatchH2TOP);
1293 if(oldhealth != HealthMarker)
1295 oldhealth = HealthMarker;
1297 healthPos = HealthMarker;
1306 V_DrawPatch(28+(((healthPos*196)/100)%9), 193, PatchCHAIN);
1307 V_DrawPatch(7+((healthPos*11)/5), 193, PatchLIFEGEM);
1308 V_DrawPatch(0, 193, PatchLFEDGE);
1309 V_DrawPatch(277, 193, PatchRTEDGE);
1312 UpdateState |= I_STATBAR;
1317 //==========================================================================
1321 //==========================================================================
1323 void DrawMainBar(void)
1327 PATCH_REF manaPatch1;
1328 PATCH_REF manaPatch2;
1329 PATCH_REF manaVialPatch1;
1330 PATCH_REF manaVialPatch2;
1332 manaPatch1 = INVALID_PATCH;
1333 manaPatch2 = INVALID_PATCH;
1334 manaVialPatch1 = INVALID_PATCH;
1335 manaVialPatch2 = INVALID_PATCH;
1341 V_DrawPatch(144, 160, PatchARTICLEAR);
1343 V_DrawPatch(148, 164, WR_CacheLumpNum(W_GetNumForName("useartia")
1344 + ArtifactFlash - 1, PU_CACHE));
1346 oldarti = -1; // so that the correct artifact fills in after the flash
1347 UpdateState |= I_STATBAR;
1349 else if(oldarti != CPlayer->readyArtifact
1350 || oldartiCount != CPlayer->inventory[inv_ptr].count)
1353 V_DrawPatch(144, 160, PatchARTICLEAR);
1355 if(CPlayer->readyArtifact > 0)
1357 V_DrawPatch(143, 163,
1358 W_CacheLumpName(patcharti[CPlayer->readyArtifact], PU_CACHE));
1359 if(CPlayer->inventory[inv_ptr].count > 1)
1361 DrSmallNumber(CPlayer->inventory[inv_ptr].count, 162, 184);
1365 oldarti = CPlayer->readyArtifact;
1366 oldartiCount = CPlayer->inventory[inv_ptr].count;
1367 UpdateState |= I_STATBAR;
1375 for(i = 0; i < MAXPLAYERS; i++)
1377 temp += CPlayer->frags[i];
1380 if(temp != oldfrags)
1383 V_DrawPatch(38, 162, PatchKILLS);
1384 DrINumber(temp, 40, 176);
1387 UpdateState |= I_STATBAR;
1393 temp = HealthMarker;
1407 V_DrawPatch(41, 178, PatchARMCLEAR);
1410 DrINumber(temp, 40, 176);
1414 DrRedINumber(temp, 40, 176);
1417 UpdateState |= I_STATBAR;
1422 temp = CPlayer->mana[0];
1424 if(oldmana1 != temp)
1427 V_DrawPatch(77, 178, PatchMANACLEAR);
1428 DrSmallNumber(temp, 79, 181);
1430 manaVialPatch1 = (patch_t *)1; // force a vial update
1433 { // Draw Dim Mana icon
1434 manaPatch1 = PatchMANADIM1;
1437 else if(oldmana1 == 0)
1439 manaPatch1 = PatchMANABRIGHT1;
1442 UpdateState |= I_STATBAR;
1445 temp = CPlayer->mana[1];
1447 if(oldmana2 != temp)
1450 V_DrawPatch(109, 178, PatchMANACLEAR);
1451 DrSmallNumber(temp, 111, 181);
1453 manaVialPatch1 = (patch_t *)1; // force a vial update
1456 { // Draw Dim Mana icon
1457 manaPatch2 = PatchMANADIM2;
1460 else if(oldmana2 == 0)
1462 manaPatch2 = PatchMANABRIGHT2;
1465 UpdateState |= I_STATBAR;
1469 if(oldweapon != CPlayer->readyweapon || manaPatch1 || manaPatch2
1471 { // Update mana graphics based upon mana count/weapon type
1473 if(CPlayer->readyweapon == WP_FIRST)
1475 manaPatch1 = PatchMANADIM1;
1476 manaPatch2 = PatchMANADIM2;
1477 manaVialPatch1 = PatchMANAVIALDIM1;
1478 manaVialPatch2 = PatchMANAVIALDIM2;
1480 else if(CPlayer->readyweapon == WP_SECOND)
1484 manaPatch1 = PatchMANABRIGHT1;
1486 manaVialPatch1 = PatchMANAVIAL1;
1487 manaPatch2 = PatchMANADIM2;
1488 manaVialPatch2 = PatchMANAVIALDIM2;
1490 else if(CPlayer->readyweapon == WP_THIRD)
1492 manaPatch1 = PatchMANADIM1;
1493 manaVialPatch1 = PatchMANAVIALDIM1;
1496 manaPatch2 = PatchMANABRIGHT2;
1498 manaVialPatch2 = PatchMANAVIAL2;
1502 manaVialPatch1 = PatchMANAVIAL1;
1503 manaVialPatch2 = PatchMANAVIAL2;
1506 manaPatch1 = PatchMANABRIGHT1;
1510 manaPatch2 = PatchMANABRIGHT2;
1513 V_DrawPatch(77, 164, manaPatch1);
1514 V_DrawPatch(110, 164, manaPatch2);
1515 V_DrawPatch(94, 164, manaVialPatch1);
1517 for(i = 165; i < 187-(22*CPlayer->mana[0])/MAX_MANA; i++)
1519 screen[i*SCREENWIDTH+95] = 0;
1520 screen[i*SCREENWIDTH+96] = 0;
1521 screen[i*SCREENWIDTH+97] = 0;
1524 V_DrawPatch(102, 164, manaVialPatch2);
1526 for(i = 165; i < 187-(22*CPlayer->mana[1])/MAX_MANA; i++)
1528 screen[i*SCREENWIDTH+103] = 0;
1529 screen[i*SCREENWIDTH+104] = 0;
1530 screen[i*SCREENWIDTH+105] = 0;
1532 oldweapon = CPlayer->readyweapon;
1533 UpdateState |= I_STATBAR;
1538 temp = AutoArmorSave[CPlayer->class]
1539 +CPlayer->armorpoints[ARMOR_ARMOR]+CPlayer->armorpoints[ARMOR_SHIELD]
1540 +CPlayer->armorpoints[ARMOR_HELMET]+CPlayer->armorpoints[ARMOR_AMULET];
1542 if(oldarmor != temp)
1546 V_DrawPatch(255, 178, PatchARMCLEAR);
1547 DrINumber(FixedDiv(temp, 5*FRACUNIT)>>FRACBITS, 250, 176);
1549 UpdateState |= I_STATBAR;
1555 if(oldpieces != CPlayer->pieces)
1560 oldpieces = CPlayer->pieces;
1561 UpdateState |= I_STATBAR;
1566 //==========================================================================
1570 //==========================================================================
1572 void DrawInventoryBar(void)
1578 UpdateState |= I_STATBAR;
1579 V_DrawPatch(38, 162, PatchINVBAR);
1580 for(i = 0; i < 7; i++)
1582 //V_DrawPatch(50+i*31, 160, W_CacheLumpName("ARTIBOX", PU_CACHE));
1583 if(CPlayer->inventorySlotNum > x+i
1584 && CPlayer->inventory[x+i].type != arti_none)
1586 V_DrawPatch(50+i*31, 163, W_CacheLumpName(
1587 patcharti[CPlayer->inventory[x+i].type], PU_CACHE));
1588 if(CPlayer->inventory[x+i].count > 1)
1590 DrSmallNumber(CPlayer->inventory[x+i].count, 68+i*31, 185);
1594 V_DrawPatch(50+curpos*31, 163, PatchSELECTBOX);
1597 V_DrawPatch(42, 163, !(leveltime&4) ? PatchINVLFGEM1 :
1600 if(CPlayer->inventorySlotNum-x > 7)
1602 V_DrawPatch(269, 163, !(leveltime&4) ? PatchINVRTGEM1 :
1607 //==========================================================================
1611 //==========================================================================
1613 void DrawKeyBar(void)
1620 if(oldkeys != CPlayer->keys)
1624 for(i = 0; i < NUMKEYS && xPosition <= 126; i++)
1626 if(CPlayer->keys&(1<<i))
1628 V_DrawPatch(xPosition, 164,
1629 WR_CacheLumpNum(W_GetNumForName("keyslot1")+i, PU_CACHE));
1634 oldkeys = CPlayer->keys;
1635 UpdateState |= I_STATBAR;
1638 temp = AutoArmorSave[CPlayer->class]
1639 +CPlayer->armorpoints[ARMOR_ARMOR]+CPlayer->armorpoints[ARMOR_SHIELD]
1640 +CPlayer->armorpoints[ARMOR_HELMET]+CPlayer->armorpoints[ARMOR_AMULET];
1642 if(oldarmor != temp)
1645 for(i = 0; i < NUMARMOR; i++)
1647 if(!CPlayer->armorpoints[i])
1651 if(CPlayer->armorpoints[i] <=
1652 (ArmorIncrement[CPlayer->class][i]>>2))
1654 V_DrawFuzzPatch(150+31*i, 164,
1655 WR_CacheLumpNum(W_GetNumForName("armslot1")+i, PU_CACHE));
1657 else if(CPlayer->armorpoints[i] <=
1658 (ArmorIncrement[CPlayer->class][i]>>1))
1660 V_DrawAltFuzzPatch(150+31*i, 164,
1661 WR_CacheLumpNum(W_GetNumForName("armslot1")+i, PU_CACHE));
1665 V_DrawPatch(150+31*i, 164,
1666 WR_CacheLumpNum(W_GetNumForName("armslot1")+i, PU_CACHE));
1671 UpdateState |= I_STATBAR;
1676 //==========================================================================
1680 //==========================================================================
1682 static int PieceX[NUMCLASSES][3] =
1688 { 190, 205, 224 }, // Use mage xpositions for now
1690 { 0, 0, 0 } // Pig is never used
1693 static void DrawWeaponPieces(void)
1695 if(CPlayer->pieces == 7)
1697 V_DrawPatch(190, 162, PatchWEAPONFULL);
1700 V_DrawPatch(190, 162, PatchWEAPONSLOT);
1701 if(CPlayer->pieces&WPIECE1)
1703 V_DrawPatch(PieceX[PlayerClass[consoleplayer]][0], 162, PatchPIECE1);
1705 if(CPlayer->pieces&WPIECE2)
1707 V_DrawPatch(PieceX[PlayerClass[consoleplayer]][1], 162, PatchPIECE2);
1709 if(CPlayer->pieces&WPIECE3)
1711 V_DrawPatch(PieceX[PlayerClass[consoleplayer]][2], 162, PatchPIECE3);
1715 //==========================================================================
1717 // DrawFullScreenStuff
1719 //==========================================================================
1721 void DrawFullScreenStuff(void)
1727 UpdateState |= I_FULLSCRN;
1728 if(CPlayer->mo->health > 0)
1730 DrBNumber(CPlayer->mo->health, 5, 180);
1734 DrBNumber(0, 5, 180);
1739 for(i=0; i<MAXPLAYERS; i++)
1743 temp += CPlayer->frags[i];
1746 DrINumber(temp, 45, 185);
1750 if(CPlayer->readyArtifact > 0)
1752 V_DrawFuzzPatch(286, 170, W_CacheLumpName("ARTIBOX",
1754 V_DrawPatch(284, 169,
1755 W_CacheLumpName(patcharti[CPlayer->readyArtifact], PU_CACHE));
1756 if(CPlayer->inventory[inv_ptr].count > 1)
1758 DrSmallNumber(CPlayer->inventory[inv_ptr].count, 302, 192);
1765 for(i = 0; i < 7; i++)
1767 V_DrawFuzzPatch(50+i*31, 168, W_CacheLumpName("ARTIBOX",
1769 if(CPlayer->inventorySlotNum > x+i
1770 && CPlayer->inventory[x+i].type != arti_none)
1772 V_DrawPatch(49+i*31, 167, W_CacheLumpName(
1773 patcharti[CPlayer->inventory[x+i].type], PU_CACHE));
1774 if(CPlayer->inventory[x+i].count > 1)
1776 DrSmallNumber(CPlayer->inventory[x+i].count, 66+i*31,
1781 V_DrawPatch(50+curpos*31, 167, PatchSELECTBOX);
1784 V_DrawPatch(40, 167, !(leveltime&4) ? PatchINVLFGEM1 :
1787 if(CPlayer->inventorySlotNum-x > 7)
1789 V_DrawPatch(268, 167, !(leveltime&4) ?
1790 PatchINVRTGEM1 : PatchINVRTGEM2);
1796 //==========================================================================
1798 // Draw_TeleportIcon
1800 //==========================================================================
1801 void Draw_TeleportIcon(void)
1804 patch = WR_CacheLumpNum(W_GetNumForName("teleicon"), PU_CACHE);
1805 V_DrawPatch(100, 68, patch);
1806 UpdateState |= I_FULLSCRN;
1808 UpdateState |= I_FULLSCRN;
1811 //==========================================================================
1815 //==========================================================================
1816 void Draw_SaveIcon(void)
1819 patch = WR_CacheLumpNum(W_GetNumForName("saveicon"), PU_CACHE);
1820 V_DrawPatch(100, 68, patch);
1821 UpdateState |= I_FULLSCRN;
1823 UpdateState |= I_FULLSCRN;
1826 //==========================================================================
1830 //==========================================================================
1831 void Draw_LoadIcon(void)
1834 patch = WR_CacheLumpNum(W_GetNumForName("loadicon"), PU_CACHE);
1835 V_DrawPatch(100, 68, patch);
1836 UpdateState |= I_FULLSCRN;
1838 UpdateState |= I_FULLSCRN;
1843 //==========================================================================
1847 //==========================================================================
1849 boolean SB_Responder(event_t *event)
1851 if(event->type == ev_keydown)
1853 if(HandleCheats(event->data1))
1854 { // Need to eat the key
1861 //==========================================================================
1865 // Returns true if the caller should eat the key.
1867 //==========================================================================
1869 static boolean HandleCheats(byte key)
1874 if(gameskill == sk_nightmare)
1875 { // Can't cheat in nightmare mode
1879 { // change CD track is the only cheat available in deathmatch
1883 if(CheatAddKey(&Cheats[0], key, &eat))
1885 Cheats[0].func(&players[consoleplayer], &Cheats[0]);
1886 S_StartSound(NULL, SFX_PLATFORM_STOP);
1888 if(CheatAddKey(&Cheats[1], key, &eat))
1890 Cheats[1].func(&players[consoleplayer], &Cheats[1]);
1891 S_StartSound(NULL, SFX_PLATFORM_STOP);
1896 if(players[consoleplayer].health <= 0)
1897 { // Dead players can't cheat
1901 for(i = 0; Cheats[i].func != NULL; i++)
1903 if(CheatAddKey(&Cheats[i], key, &eat))
1905 Cheats[i].func(&players[consoleplayer], &Cheats[i]);
1906 S_StartSound(NULL, SFX_PLATFORM_STOP);
1912 //==========================================================================
1916 // Returns true if the added key completed the cheat, false otherwise.
1918 //==========================================================================
1920 static boolean CheatAddKey(Cheat_t *cheat, byte key, boolean *eat)
1924 cheat->pos = cheat->sequence;
1925 cheat->currentArg = 0;
1927 if(*cheat->pos == 0)
1930 cheat->args[cheat->currentArg++] = key;
1933 else if(CheatLookup[key] == *cheat->pos)
1939 cheat->pos = cheat->sequence;
1940 cheat->currentArg = 0;
1942 if(*cheat->pos == 0xff)
1944 cheat->pos = cheat->sequence;
1945 cheat->currentArg = 0;
1951 //==========================================================================
1955 //==========================================================================
1957 static void CheatGodFunc(player_t *player, Cheat_t *cheat)
1959 player->cheats ^= CF_GODMODE;
1960 if(player->cheats&CF_GODMODE)
1962 P_SetMessage(player, TXT_CHEATGODON, true);
1966 P_SetMessage(player, TXT_CHEATGODOFF, true);
1971 static void CheatNoClipFunc(player_t *player, Cheat_t *cheat)
1973 player->cheats ^= CF_NOCLIP;
1974 if(player->cheats&CF_NOCLIP)
1976 P_SetMessage(player, TXT_CHEATNOCLIPON, true);
1980 P_SetMessage(player, TXT_CHEATNOCLIPOFF, true);
1984 static void CheatWeaponsFunc(player_t *player, Cheat_t *cheat)
1987 //extern boolean *WeaponInShareware;
1989 for(i = 0; i < NUMARMOR; i++)
1991 player->armorpoints[i] = ArmorIncrement[player->class][i];
1993 for(i = 0; i < NUMWEAPONS; i++)
1995 player->weaponowned[i] = true;
1997 for(i = 0; i < NUMMANA; i++)
1999 player->mana[i] = MAX_MANA;
2001 P_SetMessage(player, TXT_CHEATWEAPONS, true);
2004 static void CheatHealthFunc(player_t *player, Cheat_t *cheat)
2006 if(player->morphTics)
2008 player->health = player->mo->health = MAXMORPHHEALTH;
2012 player->health = player->mo->health = MAXHEALTH;
2014 P_SetMessage(player, TXT_CHEATHEALTH, true);
2017 static void CheatKeysFunc(player_t *player, Cheat_t *cheat)
2019 player->keys = 2047;
2020 P_SetMessage(player, TXT_CHEATKEYS, true);
2023 static void CheatSoundFunc(player_t *player, Cheat_t *cheat)
2025 DebugSound = !DebugSound;
2028 P_SetMessage(player, TXT_CHEATSOUNDON, true);
2032 P_SetMessage(player, TXT_CHEATSOUNDOFF, true);
2036 static void CheatTickerFunc(player_t *player, Cheat_t *cheat)
2038 extern int DisplayTicker;
2040 DisplayTicker = !DisplayTicker;
2043 P_SetMessage(player, TXT_CHEATTICKERON, true);
2047 P_SetMessage(player, TXT_CHEATTICKEROFF, true);
2051 static void CheatArtifactAllFunc(player_t *player, Cheat_t *cheat)
2056 for(i = arti_none+1; i < arti_firstpuzzitem; i++)
2058 for(j = 0; j < 25; j++)
2060 P_GiveArtifact(player, i, NULL);
2063 P_SetMessage(player, TXT_CHEATARTIFACTS3, true);
2066 static void CheatPuzzleFunc(player_t *player, Cheat_t *cheat)
2070 for(i = arti_firstpuzzitem; i < NUMARTIFACTS; i++)
2072 P_GiveArtifact(player, i, NULL);
2074 P_SetMessage(player, TXT_CHEATARTIFACTS3, true);
2077 static void CheatInitFunc(player_t *player, Cheat_t *cheat)
2079 G_DeferedInitNew(gameskill, gameepisode, gamemap);
2080 P_SetMessage(player, TXT_CHEATWARP, true);
2083 static void CheatWarpFunc(player_t *player, Cheat_t *cheat)
2092 tens = cheat->args[0]-'0';
2093 ones = cheat->args[1]-'0';
2094 if(tens < 0 || tens > 9 || ones < 0 || ones > 9)
2096 P_SetMessage(player, TXT_CHEATBADINPUT, true);
2099 map = P_TranslateMap((cheat->args[0]-'0')*10+cheat->args[1]-'0');
2102 P_SetMessage(player, TXT_CHEATNOMAP, true);
2106 { // Don't try to teleport to current map
2107 P_SetMessage(player, TXT_CHEATBADINPUT, true);
2111 { // Search map development directory
2112 sprintf(auxName, "%sMAP%02d.WAD", DevMapsDir, map);
2113 fp = fopen(auxName, "rb");
2120 P_SetMessage(player, TXT_CHEATNOMAP, true);
2125 { // Search primary lumps
2126 sprintf(mapName, "MAP%02d", map);
2127 if(W_CheckNumForName(mapName) == -1)
2129 P_SetMessage(player, TXT_CHEATNOMAP, true);
2133 P_SetMessage(player, TXT_CHEATWARP, true);
2134 G_TeleportNewMap(map, 0);
2137 static void CheatPigFunc(player_t *player, Cheat_t *cheat)
2139 extern boolean P_UndoPlayerMorph(player_t *player);
2141 if(player->morphTics)
2143 P_UndoPlayerMorph(player);
2147 P_MorphPlayer(player);
2149 P_SetMessage(player, "SQUEAL!!", true);
2152 static void CheatMassacreFunc(player_t *player, Cheat_t *cheat)
2157 count = P_Massacre();
2158 sprintf(buffer, "%d MONSTERS KILLED\n", count);
2159 P_SetMessage(player, buffer, true);
2162 static void CheatIDKFAFunc(player_t *player, Cheat_t *cheat)
2165 if(player->morphTics)
2169 for(i = 1; i < 8; i++)
2171 player->weaponowned[i] = false;
2173 player->pendingweapon = WP_FIRST;
2174 P_SetMessage(player, TXT_CHEATIDKFA, true);
2177 static void CheatQuickenFunc1(player_t *player, Cheat_t *cheat)
2179 P_SetMessage(player, "TRYING TO CHEAT? THAT'S ONE....", true);
2182 static void CheatQuickenFunc2(player_t *player, Cheat_t *cheat)
2184 P_SetMessage(player, "THAT'S TWO....", true);
2187 static void CheatQuickenFunc3(player_t *player, Cheat_t *cheat)
2189 P_DamageMobj(player->mo, NULL, player->mo, 10000);
2190 P_SetMessage(player, "THAT'S THREE! TIME TO DIE.", true);
2193 static void CheatClassFunc1(player_t *player, Cheat_t *cheat)
2196 P_SetMessage(player, "ENTER NEW PLAYER CLASS (0 - 3)", true);
2198 P_SetMessage(player, "ENTER NEW PLAYER CLASS (0 - 2)", true);
2202 static void CheatClassFunc2(player_t *player, Cheat_t *cheat)
2207 if(player->morphTics)
2208 { // don't change class if the player is morphed
2211 class = cheat->args[0]-'0';
2213 if(class > 3 || class < 0)
2215 if(class > 2 || class < 0)
2218 P_SetMessage(player, "INVALID PLAYER CLASS", true);
2221 player->class = class;
2222 for(i = 0; i < NUMARMOR; i++)
2224 player->armorpoints[i] = 0;
2226 PlayerClass[consoleplayer] = class;
2227 P_PostMorphWeapon(player, WP_FIRST);
2230 UpdateState |= I_FULLSCRN;
2233 static void CheatVersionFunc(player_t *player, Cheat_t *cheat)
2235 P_SetMessage(player, VERSIONTEXT, true);
2238 static void CheatDebugFunc(player_t *player, Cheat_t *cheat)
2240 char textBuffer[50];
2241 sprintf(textBuffer, "MAP %d (%d) X:%5d Y:%5d Z:%5d",
2242 P_GetMapWarpTrans(gamemap),
2244 player->mo->x >> FRACBITS,
2245 player->mo->y >> FRACBITS,
2246 player->mo->z >> FRACBITS);
2247 P_SetMessage(player, textBuffer, true);
2250 static void CheatScriptFunc1(player_t *player, Cheat_t *cheat)
2252 P_SetMessage(player, "RUN WHICH SCRIPT(01-99)?", true);
2255 static void CheatScriptFunc2(player_t *player, Cheat_t *cheat)
2257 P_SetMessage(player, "RUN WHICH SCRIPT(01-99)?", true);
2260 static void CheatScriptFunc3(player_t *player, Cheat_t *cheat)
2265 char textBuffer[40];
2267 tens = cheat->args[0]-'0';
2268 ones = cheat->args[1]-'0';
2269 script = tens*10 + ones;
2270 if (script < 1) return;
2271 if (script > 99) return;
2272 args[0]=args[1]=args[2]=0;
2274 if(P_StartACS(script, 0, args, player->mo, NULL, 0))
2276 sprintf(textBuffer, "RUNNING SCRIPT %.2d", script);
2277 P_SetMessage(player, textBuffer, true);
2281 extern int cheating;
2283 static void CheatRevealFunc(player_t *player, Cheat_t *cheat)
2285 cheating = (cheating+1) % 3;
2288 //===========================================================================
2292 //===========================================================================
2294 static void CheatTrackFunc1(player_t *player, Cheat_t *cheat)
2302 if(I_CDMusInit() == -1)
2304 P_SetMessage(player, "ERROR INITIALIZING CD", true);
2306 sprintf(buffer, "ENTER DESIRED CD TRACK (%.2d - %.2d):\n",
2307 I_CDMusFirstTrack(), I_CDMusLastTrack());
2308 P_SetMessage(player, buffer, true);
2311 //===========================================================================
2315 //===========================================================================
2317 static void CheatTrackFunc2(player_t *player, Cheat_t *cheat)
2326 track = (cheat->args[0]-'0')*10+(cheat->args[1]-'0');
2327 if(track < I_CDMusFirstTrack() || track > I_CDMusLastTrack())
2329 P_SetMessage(player, "INVALID TRACK NUMBER\n", true);
2332 if(track == i_CDCurrentTrack)
2336 if(I_CDMusPlay(track))
2338 sprintf(buffer, "ERROR WHILE TRYING TO PLAY CD TRACK: %.2d\n", track);
2339 P_SetMessage(player, buffer, true);
2342 { // No error encountered while attempting to play the track
2343 sprintf(buffer, "PLAYING TRACK: %.2d\n", track);
2344 P_SetMessage(player, buffer, true);
2345 // i_CDMusicLength = 35*I_CDMusTrackLength(track);
2346 // oldTic = gametic;
2348 i_CDCurrentTrack = track;