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)
620 if(PlayerClass[consoleplayer] != PCLASS_ASS)
621 class = PlayerClass[consoleplayer]; // original player class (not pig)
623 class = 0; // Use FIghter chain and gem for now
624 PatchWEAPONSLOT = WR_CacheLumpNum(W_GetNumForName("wpslot0")
626 PatchWEAPONFULL = WR_CacheLumpNum(W_GetNumForName("wpfull0")
628 PatchPIECE1 = WR_CacheLumpNum(W_GetNumForName("wpiecef1")
630 PatchPIECE2 = WR_CacheLumpNum(W_GetNumForName("wpiecef2")
632 PatchPIECE3 = WR_CacheLumpNum(W_GetNumForName("wpiecef3")
634 PatchCHAIN = WR_CacheLumpNum(W_GetNumForName("chain")
637 { // single player game uses red life gem (the second gem)
638 PatchLIFEGEM = WR_CacheLumpNum(W_GetNumForName("lifegem")
639 +4*class+1, PU_STATIC);
643 PatchLIFEGEM = WR_CacheLumpNum(W_GetNumForName("lifegem")
644 +MAXPLAYERS*class+consoleplayer, PU_STATIC);
647 UpdateState |= I_FULLSCRN;
650 //==========================================================================
654 //==========================================================================
661 curHealth = players[consoleplayer].mo->health;
666 if(curHealth < HealthMarker)
668 delta = (HealthMarker-curHealth)>>2;
677 HealthMarker -= delta;
679 else if(curHealth > HealthMarker)
681 delta = (curHealth-HealthMarker)>>2;
690 HealthMarker += delta;
694 //==========================================================================
698 // Draws a three digit number.
700 //==========================================================================
702 static void DrINumber(signed int val, int x, int y)
717 patch = PatchINumbers[val/10];
718 V_DrawPatch(x+8, y, patch);
719 V_DrawPatch(x, y, PatchNEGATIVE);
723 V_DrawPatch(x+8, y, PatchNEGATIVE);
726 patch = PatchINumbers[val];
727 V_DrawPatch(x+16, y, patch);
732 patch = PatchINumbers[val/100];
733 V_DrawPatch(x, y, patch);
736 if(val > 9 || oldval > 99)
738 patch = PatchINumbers[val/10];
739 V_DrawPatch(x+8, y, patch);
742 patch = PatchINumbers[val];
743 V_DrawPatch(x+16, y, patch);
746 //==========================================================================
750 // Draws a three digit number using the red font
752 //==========================================================================
754 static void DrRedINumber(signed int val, int x, int y)
766 patch = WR_CacheLumpNum(W_GetNumForName("inred0")+val/100, PU_CACHE);
767 V_DrawPatch(x, y, patch);
770 if(val > 9 || oldval > 99)
772 patch = WR_CacheLumpNum(W_GetNumForName("inred0")+val/10, PU_CACHE);
773 V_DrawPatch(x+8, y, patch);
776 patch = WR_CacheLumpNum(W_GetNumForName("inred0")+val, PU_CACHE);
777 V_DrawPatch(x+16, y, patch);
780 //==========================================================================
784 // Draws a three digit number using FontB
786 //==========================================================================
788 static void DrBNumber(signed int val, int x, int y)
802 patch = W_CacheLumpNum(FontBNumBase+val/100, PU_CACHE);
804 OGL_DrawShadowedPatch(xpos+6-patch->width/2, y, FontBNumBase+val/100);
806 V_DrawShadowedPatch(xpos+6-patch->width/2, y, patch);
811 if(val > 9 || oldval > 99)
813 patch = W_CacheLumpNum(FontBNumBase+val/10, PU_CACHE);
815 OGL_DrawShadowedPatch(xpos+6-patch->width/2, y, FontBNumBase+val/10);
817 V_DrawShadowedPatch(xpos+6-patch->width/2, y, patch);
822 patch = W_CacheLumpNum(FontBNumBase+val, PU_CACHE);
824 OGL_DrawShadowedPatch(xpos+6-patch->width/2, y, FontBNumBase+val/1);
826 V_DrawShadowedPatch(xpos+6-patch->width/2, y, patch);
830 //==========================================================================
834 // Draws a small two digit number.
836 //==========================================================================
838 static void DrSmallNumber(int val, int x, int y)
852 patch = PatchSmNumbers[val/100];
853 V_DrawPatch(x, y, patch);
854 patch = PatchSmNumbers[(val%100)/10];
855 V_DrawPatch(x+4, y, patch);
859 patch = PatchSmNumbers[val/10];
860 V_DrawPatch(x+4, y, patch);
863 patch = PatchSmNumbers[val];
864 V_DrawPatch(x+8, y, patch);
868 //==========================================================================
872 //==========================================================================
874 static void ShadeLine(int x, int y, int height, int shade)
879 shades = colormaps+9*256+shade*2*256;
880 dest = screen+y*SCREENWIDTH+x;
883 *(dest) = *(shades+*dest);
888 //==========================================================================
892 //==========================================================================
894 static void ShadeChain(void)
898 for(i = 0; i < 16; i++)
900 ShadeLine(277+i, 190, 10, i/2);
901 ShadeLine(19+i, 190, 10, 7-(i/2));
906 //==========================================================================
910 // Displays sound debugging information.
912 //==========================================================================
914 static void DrawSoundInfo(void)
922 int xPos[7] = {1, 75, 112, 156, 200, 230, 260};
926 MN_DrTextA("*** SOUND DEBUG INFO ***", xPos[0], 20);
928 S_GetChannelInfo(&s);
929 if(s.channelCount == 0)
934 MN_DrTextA("NAME", xPos[x++], 30);
935 MN_DrTextA("MO.T", xPos[x++], 30);
936 MN_DrTextA("MO.X", xPos[x++], 30);
937 MN_DrTextA("MO.Y", xPos[x++], 30);
938 MN_DrTextA("ID", xPos[x++], 30);
939 MN_DrTextA("PRI", xPos[x++], 30);
940 MN_DrTextA("DIST", xPos[x++], 30);
941 for(i = 0; i < s.channelCount; i++)
947 { // Channel is unused
948 MN_DrTextA("------", xPos[0], y);
951 sprintf(text, "%s", c->name);
952 M_ForceUppercase(text);
953 MN_DrTextA(text, xPos[x++], y);
954 sprintf(text, "%d", c->mo->type);
955 MN_DrTextA(text, xPos[x++], y);
956 sprintf(text, "%d", c->mo->x>>FRACBITS);
957 MN_DrTextA(text, xPos[x++], y);
958 sprintf(text, "%d", c->mo->y>>FRACBITS);
959 MN_DrTextA(text, xPos[x++], y);
960 sprintf(text, "%ld", c->id); /* jim added 'l' */
961 MN_DrTextA(text, xPos[x++], y);
962 sprintf(text, "%d", c->priority);
963 MN_DrTextA(text, xPos[x++], y);
964 sprintf(text, "%d", c->distance);
965 MN_DrTextA(text, xPos[x++], y);
967 UpdateState |= I_FULLSCRN;
968 BorderNeedRefresh = true;
971 //==========================================================================
975 //==========================================================================
977 char patcharti[][10] =
979 { "ARTIBOX" }, // none
980 { "ARTIINVU" }, // invulnerability
981 { "ARTIPTN2" }, // health
982 { "ARTISPHL" }, // superhealth
983 { "ARTIHRAD" }, // healing radius
984 { "ARTISUMN" }, // summon maulator
985 { "ARTITRCH" }, // torch
986 { "ARTIPORK" }, // egg
987 { "ARTISOAR" }, // fly
988 { "ARTIBLST" }, // blast radius
989 { "ARTIPSBG" }, // poison bag
990 { "ARTITELO" }, // teleport other
991 { "ARTISPED" }, // speed
992 { "ARTIBMAN" }, // boost mana
993 { "ARTIBRAC" }, // boost armor
994 { "ARTIATLP" }, // teleport
995 { "ARTISKLL" }, // arti_puzzskull
996 { "ARTIBGEM" }, // arti_puzzgembig
997 { "ARTIGEMR" }, // arti_puzzgemred
998 { "ARTIGEMG" }, // arti_puzzgemgreen1
999 { "ARTIGMG2" }, // arti_puzzgemgreen2
1000 { "ARTIGEMB" }, // arti_puzzgemblue1
1001 { "ARTIGMB2" }, // arti_puzzgemblue2
1002 { "ARTIBOK1" }, // arti_puzzbook1
1003 { "ARTIBOK2" }, // arti_puzzbook2
1004 { "ARTISKL2" }, // arti_puzzskull2
1005 { "ARTIFWEP" }, // arti_puzzfweapon
1006 { "ARTICWEP" }, // arti_puzzcweapon
1007 { "ARTIMWEP" }, // arti_puzzmweapon
1008 { "ARTIGEAR" }, // arti_puzzgear1
1009 { "ARTIGER2" }, // arti_puzzgear2
1010 { "ARTIGER3" }, // arti_puzzgear3
1011 { "ARTIGER4" }, // arti_puzzgear4
1016 static int oldfrags = -9999;
1017 static int oldmana1 = -1;
1018 static int oldmana2 = -1;
1019 static int oldhealth = -1;
1020 static int oldlife = -1;
1021 static int oldpieces = -1;
1022 static int oldweapon = -1;
1024 static int oldarti = 0;
1025 static int oldartiCount = 0;
1026 static int oldkeys = -1;
1027 static int oldarmor = -1;
1029 extern boolean automapactive;
1031 void SB_Drawer(void)
1033 // Sound info debug stuff
1034 if(DebugSound == true)
1038 CPlayer = &players[consoleplayer];
1039 if(viewheight == SCREENHEIGHT && !automapactive)
1041 DrawFullScreenStuff();
1050 V_DrawPatch(0, 134, PatchH2BAR);
1066 V_DrawPatch(38, 162, PatchSTATBAR);
1070 V_DrawPatch(38, 162, PatchKEYBAR);
1078 oldfrags = -9999; //can't use -1, 'cuz of negative frags
1100 SB_PaletteFlash(false);
1101 DrawAnimatedIcons();
1104 //==========================================================================
1106 // DrawAnimatedIcons
1108 //==========================================================================
1110 static void DrawAnimatedIcons(void)
1113 static boolean hitCenterFrame;
1116 if(CPlayer->powers[pw_flight])
1118 if(CPlayer->powers[pw_flight] > BLINKTHRESHOLD
1119 || !(CPlayer->powers[pw_flight]&16))
1121 frame = (leveltime/3)&15;
1122 if(CPlayer->mo->flags2&MF2_FLY)
1124 if(hitCenterFrame && (frame != 15 && frame != 0))
1126 V_DrawPatch(20, 19, WR_CacheLumpNum(SpinFlylump+15,
1131 V_DrawPatch(20, 19, WR_CacheLumpNum(SpinFlylump+frame,
1133 hitCenterFrame = false;
1138 if(!hitCenterFrame && (frame != 15 && frame != 0))
1140 V_DrawPatch(20, 19, WR_CacheLumpNum(SpinFlylump+frame,
1142 hitCenterFrame = false;
1146 V_DrawPatch(20, 19, WR_CacheLumpNum(SpinFlylump+15,
1148 hitCenterFrame = true;
1152 BorderTopRefresh = true;
1153 UpdateState |= I_MESSAGES;
1157 if(CPlayer->powers[pw_speed])
1159 if(CPlayer->powers[pw_speed] > BLINKTHRESHOLD
1160 || !(CPlayer->powers[pw_speed]&16))
1162 frame = (leveltime/3)&15;
1163 V_DrawPatch(60, 19, WR_CacheLumpNum(SpinSpeedLump+frame,
1166 BorderTopRefresh = true;
1167 UpdateState |= I_MESSAGES;
1171 if(CPlayer->powers[pw_invulnerability])
1173 if(CPlayer->powers[pw_invulnerability] > BLINKTHRESHOLD
1174 || !(CPlayer->powers[pw_invulnerability]&16))
1176 frame = (leveltime/3)&15;
1177 V_DrawPatch(260, 19, WR_CacheLumpNum(SpinDefenseLump+frame,
1180 BorderTopRefresh = true;
1181 UpdateState |= I_MESSAGES;
1185 if(CPlayer->powers[pw_minotaur])
1187 if(CPlayer->powers[pw_minotaur] > BLINKTHRESHOLD
1188 || !(CPlayer->powers[pw_minotaur]&16))
1190 frame = (leveltime/3)&15;
1191 V_DrawPatch(300, 19, WR_CacheLumpNum(SpinMinotaurLump+frame,
1194 BorderTopRefresh = true;
1195 UpdateState |= I_MESSAGES;
1199 //==========================================================================
1203 // Sets the new palette based upon the current values of
1204 // consoleplayer->damagecount and consoleplayer->bonuscount.
1206 //==========================================================================
1208 void SB_PaletteFlash(boolean forceChange)
1210 static int sb_palette = 0;
1220 if(gamestate == GS_LEVEL)
1222 CPlayer = &players[consoleplayer];
1223 if(CPlayer->poisoncount)
1226 palette = (CPlayer->poisoncount+7)>>3;
1227 if(palette >= NUMPOISONPALS)
1229 palette = NUMPOISONPALS-1;
1231 palette += STARTPOISONPALS;
1233 else if(CPlayer->damagecount)
1235 palette = (CPlayer->damagecount+7)>>3;
1236 if(palette >= NUMREDPALS)
1238 palette = NUMREDPALS-1;
1240 palette += STARTREDPALS;
1242 else if(CPlayer->bonuscount)
1244 palette = (CPlayer->bonuscount+7)>>3;
1245 if(palette >= NUMBONUSPALS)
1247 palette = NUMBONUSPALS-1;
1249 palette += STARTBONUSPALS;
1251 else if(CPlayer->mo->flags2&MF2_ICEDAMAGE)
1253 palette = STARTICEPAL;
1264 if(palette != sb_palette)
1266 sb_palette = palette;
1268 OGL_SetFilter( palette );
1270 pal = (byte *)WR_CacheLumpNum(PlayPalette, PU_CACHE)+palette*768;
1276 //==========================================================================
1280 //==========================================================================
1282 void DrawCommonBar(void)
1287 V_DrawPatch(0, 134, PatchH2TOP);
1289 if(oldhealth != HealthMarker)
1291 oldhealth = HealthMarker;
1293 healthPos = HealthMarker;
1302 V_DrawPatch(28+(((healthPos*196)/100)%9), 193, PatchCHAIN);
1303 V_DrawPatch(7+((healthPos*11)/5), 193, PatchLIFEGEM);
1304 V_DrawPatch(0, 193, PatchLFEDGE);
1305 V_DrawPatch(277, 193, PatchRTEDGE);
1308 UpdateState |= I_STATBAR;
1313 //==========================================================================
1317 //==========================================================================
1319 void DrawMainBar(void)
1323 PATCH_REF manaPatch1;
1324 PATCH_REF manaPatch2;
1325 PATCH_REF manaVialPatch1;
1326 PATCH_REF manaVialPatch2;
1328 manaPatch1 = INVALID_PATCH;
1329 manaPatch2 = INVALID_PATCH;
1330 manaVialPatch1 = INVALID_PATCH;
1331 manaVialPatch2 = INVALID_PATCH;
1337 V_DrawPatch(144, 160, PatchARTICLEAR);
1339 V_DrawPatch(148, 164, WR_CacheLumpNum(W_GetNumForName("useartia")
1340 + ArtifactFlash - 1, PU_CACHE));
1342 oldarti = -1; // so that the correct artifact fills in after the flash
1343 UpdateState |= I_STATBAR;
1345 else if(oldarti != CPlayer->readyArtifact
1346 || oldartiCount != CPlayer->inventory[inv_ptr].count)
1349 V_DrawPatch(144, 160, PatchARTICLEAR);
1351 if(CPlayer->readyArtifact > 0)
1353 V_DrawPatch(143, 163,
1354 W_CacheLumpName(patcharti[CPlayer->readyArtifact], PU_CACHE));
1355 if(CPlayer->inventory[inv_ptr].count > 1)
1357 DrSmallNumber(CPlayer->inventory[inv_ptr].count, 162, 184);
1361 oldarti = CPlayer->readyArtifact;
1362 oldartiCount = CPlayer->inventory[inv_ptr].count;
1363 UpdateState |= I_STATBAR;
1371 for(i = 0; i < MAXPLAYERS; i++)
1373 temp += CPlayer->frags[i];
1376 if(temp != oldfrags)
1379 V_DrawPatch(38, 162, PatchKILLS);
1380 DrINumber(temp, 40, 176);
1383 UpdateState |= I_STATBAR;
1389 temp = HealthMarker;
1403 V_DrawPatch(41, 178, PatchARMCLEAR);
1406 DrINumber(temp, 40, 176);
1410 DrRedINumber(temp, 40, 176);
1413 UpdateState |= I_STATBAR;
1418 temp = CPlayer->mana[0];
1420 if(oldmana1 != temp)
1423 V_DrawPatch(77, 178, PatchMANACLEAR);
1424 DrSmallNumber(temp, 79, 181);
1426 manaVialPatch1 = (patch_t *)1; // force a vial update
1429 { // Draw Dim Mana icon
1430 manaPatch1 = PatchMANADIM1;
1433 else if(oldmana1 == 0)
1435 manaPatch1 = PatchMANABRIGHT1;
1438 UpdateState |= I_STATBAR;
1441 temp = CPlayer->mana[1];
1443 if(oldmana2 != temp)
1446 V_DrawPatch(109, 178, PatchMANACLEAR);
1447 DrSmallNumber(temp, 111, 181);
1449 manaVialPatch1 = (patch_t *)1; // force a vial update
1452 { // Draw Dim Mana icon
1453 manaPatch2 = PatchMANADIM2;
1456 else if(oldmana2 == 0)
1458 manaPatch2 = PatchMANABRIGHT2;
1461 UpdateState |= I_STATBAR;
1465 if(oldweapon != CPlayer->readyweapon || manaPatch1 || manaPatch2
1467 { // Update mana graphics based upon mana count/weapon type
1469 if(CPlayer->readyweapon == WP_FIRST)
1471 manaPatch1 = PatchMANADIM1;
1472 manaPatch2 = PatchMANADIM2;
1473 manaVialPatch1 = PatchMANAVIALDIM1;
1474 manaVialPatch2 = PatchMANAVIALDIM2;
1476 else if(CPlayer->readyweapon == WP_SECOND)
1480 manaPatch1 = PatchMANABRIGHT1;
1482 manaVialPatch1 = PatchMANAVIAL1;
1483 manaPatch2 = PatchMANADIM2;
1484 manaVialPatch2 = PatchMANAVIALDIM2;
1486 else if(CPlayer->readyweapon == WP_THIRD)
1488 manaPatch1 = PatchMANADIM1;
1489 manaVialPatch1 = PatchMANAVIALDIM1;
1492 manaPatch2 = PatchMANABRIGHT2;
1494 manaVialPatch2 = PatchMANAVIAL2;
1498 manaVialPatch1 = PatchMANAVIAL1;
1499 manaVialPatch2 = PatchMANAVIAL2;
1502 manaPatch1 = PatchMANABRIGHT1;
1506 manaPatch2 = PatchMANABRIGHT2;
1509 V_DrawPatch(77, 164, manaPatch1);
1510 V_DrawPatch(110, 164, manaPatch2);
1511 V_DrawPatch(94, 164, manaVialPatch1);
1513 for(i = 165; i < 187-(22*CPlayer->mana[0])/MAX_MANA; i++)
1515 screen[i*SCREENWIDTH+95] = 0;
1516 screen[i*SCREENWIDTH+96] = 0;
1517 screen[i*SCREENWIDTH+97] = 0;
1520 V_DrawPatch(102, 164, manaVialPatch2);
1522 for(i = 165; i < 187-(22*CPlayer->mana[1])/MAX_MANA; i++)
1524 screen[i*SCREENWIDTH+103] = 0;
1525 screen[i*SCREENWIDTH+104] = 0;
1526 screen[i*SCREENWIDTH+105] = 0;
1528 oldweapon = CPlayer->readyweapon;
1529 UpdateState |= I_STATBAR;
1534 temp = AutoArmorSave[CPlayer->class]
1535 +CPlayer->armorpoints[ARMOR_ARMOR]+CPlayer->armorpoints[ARMOR_SHIELD]
1536 +CPlayer->armorpoints[ARMOR_HELMET]+CPlayer->armorpoints[ARMOR_AMULET];
1538 if(oldarmor != temp)
1542 V_DrawPatch(255, 178, PatchARMCLEAR);
1543 DrINumber(FixedDiv(temp, 5*FRACUNIT)>>FRACBITS, 250, 176);
1545 UpdateState |= I_STATBAR;
1551 if(oldpieces != CPlayer->pieces)
1556 oldpieces = CPlayer->pieces;
1557 UpdateState |= I_STATBAR;
1562 //==========================================================================
1566 //==========================================================================
1568 void DrawInventoryBar(void)
1574 UpdateState |= I_STATBAR;
1575 V_DrawPatch(38, 162, PatchINVBAR);
1576 for(i = 0; i < 7; i++)
1578 //V_DrawPatch(50+i*31, 160, W_CacheLumpName("ARTIBOX", PU_CACHE));
1579 if(CPlayer->inventorySlotNum > x+i
1580 && CPlayer->inventory[x+i].type != arti_none)
1582 V_DrawPatch(50+i*31, 163, W_CacheLumpName(
1583 patcharti[CPlayer->inventory[x+i].type], PU_CACHE));
1584 if(CPlayer->inventory[x+i].count > 1)
1586 DrSmallNumber(CPlayer->inventory[x+i].count, 68+i*31, 185);
1590 V_DrawPatch(50+curpos*31, 163, PatchSELECTBOX);
1593 V_DrawPatch(42, 163, !(leveltime&4) ? PatchINVLFGEM1 :
1596 if(CPlayer->inventorySlotNum-x > 7)
1598 V_DrawPatch(269, 163, !(leveltime&4) ? PatchINVRTGEM1 :
1603 //==========================================================================
1607 //==========================================================================
1609 void DrawKeyBar(void)
1616 if(oldkeys != CPlayer->keys)
1620 for(i = 0; i < NUMKEYS && xPosition <= 126; i++)
1622 if(CPlayer->keys&(1<<i))
1624 V_DrawPatch(xPosition, 164,
1625 WR_CacheLumpNum(W_GetNumForName("keyslot1")+i, PU_CACHE));
1630 oldkeys = CPlayer->keys;
1631 UpdateState |= I_STATBAR;
1634 temp = AutoArmorSave[CPlayer->class]
1635 +CPlayer->armorpoints[ARMOR_ARMOR]+CPlayer->armorpoints[ARMOR_SHIELD]
1636 +CPlayer->armorpoints[ARMOR_HELMET]+CPlayer->armorpoints[ARMOR_AMULET];
1638 if(oldarmor != temp)
1641 for(i = 0; i < NUMARMOR; i++)
1643 if(!CPlayer->armorpoints[i])
1647 if(CPlayer->armorpoints[i] <=
1648 (ArmorIncrement[CPlayer->class][i]>>2))
1650 V_DrawFuzzPatch(150+31*i, 164,
1651 WR_CacheLumpNum(W_GetNumForName("armslot1")+i, PU_CACHE));
1653 else if(CPlayer->armorpoints[i] <=
1654 (ArmorIncrement[CPlayer->class][i]>>1))
1656 V_DrawAltFuzzPatch(150+31*i, 164,
1657 WR_CacheLumpNum(W_GetNumForName("armslot1")+i, PU_CACHE));
1661 V_DrawPatch(150+31*i, 164,
1662 WR_CacheLumpNum(W_GetNumForName("armslot1")+i, PU_CACHE));
1667 UpdateState |= I_STATBAR;
1672 //==========================================================================
1676 //==========================================================================
1678 static int PieceX[NUMCLASSES][3] =
1683 { 190, 205, 224 }, // Use mage xpositions for now
1684 { 0, 0, 0 } // Pig is never used
1687 static void DrawWeaponPieces(void)
1689 if(CPlayer->pieces == 7)
1691 V_DrawPatch(190, 162, PatchWEAPONFULL);
1694 V_DrawPatch(190, 162, PatchWEAPONSLOT);
1695 if(CPlayer->pieces&WPIECE1)
1697 V_DrawPatch(PieceX[PlayerClass[consoleplayer]][0], 162, PatchPIECE1);
1699 if(CPlayer->pieces&WPIECE2)
1701 V_DrawPatch(PieceX[PlayerClass[consoleplayer]][1], 162, PatchPIECE2);
1703 if(CPlayer->pieces&WPIECE3)
1705 V_DrawPatch(PieceX[PlayerClass[consoleplayer]][2], 162, PatchPIECE3);
1709 //==========================================================================
1711 // DrawFullScreenStuff
1713 //==========================================================================
1715 void DrawFullScreenStuff(void)
1721 UpdateState |= I_FULLSCRN;
1722 if(CPlayer->mo->health > 0)
1724 DrBNumber(CPlayer->mo->health, 5, 180);
1728 DrBNumber(0, 5, 180);
1733 for(i=0; i<MAXPLAYERS; i++)
1737 temp += CPlayer->frags[i];
1740 DrINumber(temp, 45, 185);
1744 if(CPlayer->readyArtifact > 0)
1746 V_DrawFuzzPatch(286, 170, W_CacheLumpName("ARTIBOX",
1748 V_DrawPatch(284, 169,
1749 W_CacheLumpName(patcharti[CPlayer->readyArtifact], PU_CACHE));
1750 if(CPlayer->inventory[inv_ptr].count > 1)
1752 DrSmallNumber(CPlayer->inventory[inv_ptr].count, 302, 192);
1759 for(i = 0; i < 7; i++)
1761 V_DrawFuzzPatch(50+i*31, 168, W_CacheLumpName("ARTIBOX",
1763 if(CPlayer->inventorySlotNum > x+i
1764 && CPlayer->inventory[x+i].type != arti_none)
1766 V_DrawPatch(49+i*31, 167, W_CacheLumpName(
1767 patcharti[CPlayer->inventory[x+i].type], PU_CACHE));
1768 if(CPlayer->inventory[x+i].count > 1)
1770 DrSmallNumber(CPlayer->inventory[x+i].count, 66+i*31,
1775 V_DrawPatch(50+curpos*31, 167, PatchSELECTBOX);
1778 V_DrawPatch(40, 167, !(leveltime&4) ? PatchINVLFGEM1 :
1781 if(CPlayer->inventorySlotNum-x > 7)
1783 V_DrawPatch(268, 167, !(leveltime&4) ?
1784 PatchINVRTGEM1 : PatchINVRTGEM2);
1790 //==========================================================================
1792 // Draw_TeleportIcon
1794 //==========================================================================
1795 void Draw_TeleportIcon(void)
1798 patch = WR_CacheLumpNum(W_GetNumForName("teleicon"), PU_CACHE);
1799 V_DrawPatch(100, 68, patch);
1800 UpdateState |= I_FULLSCRN;
1802 UpdateState |= I_FULLSCRN;
1805 //==========================================================================
1809 //==========================================================================
1810 void Draw_SaveIcon(void)
1813 patch = WR_CacheLumpNum(W_GetNumForName("saveicon"), PU_CACHE);
1814 V_DrawPatch(100, 68, patch);
1815 UpdateState |= I_FULLSCRN;
1817 UpdateState |= I_FULLSCRN;
1820 //==========================================================================
1824 //==========================================================================
1825 void Draw_LoadIcon(void)
1828 patch = WR_CacheLumpNum(W_GetNumForName("loadicon"), PU_CACHE);
1829 V_DrawPatch(100, 68, patch);
1830 UpdateState |= I_FULLSCRN;
1832 UpdateState |= I_FULLSCRN;
1837 //==========================================================================
1841 //==========================================================================
1843 boolean SB_Responder(event_t *event)
1845 if(event->type == ev_keydown)
1847 if(HandleCheats(event->data1))
1848 { // Need to eat the key
1855 //==========================================================================
1859 // Returns true if the caller should eat the key.
1861 //==========================================================================
1863 static boolean HandleCheats(byte key)
1868 if(gameskill == sk_nightmare)
1869 { // Can't cheat in nightmare mode
1873 { // change CD track is the only cheat available in deathmatch
1877 if(CheatAddKey(&Cheats[0], key, &eat))
1879 Cheats[0].func(&players[consoleplayer], &Cheats[0]);
1880 S_StartSound(NULL, SFX_PLATFORM_STOP);
1882 if(CheatAddKey(&Cheats[1], key, &eat))
1884 Cheats[1].func(&players[consoleplayer], &Cheats[1]);
1885 S_StartSound(NULL, SFX_PLATFORM_STOP);
1890 if(players[consoleplayer].health <= 0)
1891 { // Dead players can't cheat
1895 for(i = 0; Cheats[i].func != NULL; i++)
1897 if(CheatAddKey(&Cheats[i], key, &eat))
1899 Cheats[i].func(&players[consoleplayer], &Cheats[i]);
1900 S_StartSound(NULL, SFX_PLATFORM_STOP);
1906 //==========================================================================
1910 // Returns true if the added key completed the cheat, false otherwise.
1912 //==========================================================================
1914 static boolean CheatAddKey(Cheat_t *cheat, byte key, boolean *eat)
1918 cheat->pos = cheat->sequence;
1919 cheat->currentArg = 0;
1921 if(*cheat->pos == 0)
1924 cheat->args[cheat->currentArg++] = key;
1927 else if(CheatLookup[key] == *cheat->pos)
1933 cheat->pos = cheat->sequence;
1934 cheat->currentArg = 0;
1936 if(*cheat->pos == 0xff)
1938 cheat->pos = cheat->sequence;
1939 cheat->currentArg = 0;
1945 //==========================================================================
1949 //==========================================================================
1951 static void CheatGodFunc(player_t *player, Cheat_t *cheat)
1953 player->cheats ^= CF_GODMODE;
1954 if(player->cheats&CF_GODMODE)
1956 P_SetMessage(player, TXT_CHEATGODON, true);
1960 P_SetMessage(player, TXT_CHEATGODOFF, true);
1965 static void CheatNoClipFunc(player_t *player, Cheat_t *cheat)
1967 player->cheats ^= CF_NOCLIP;
1968 if(player->cheats&CF_NOCLIP)
1970 P_SetMessage(player, TXT_CHEATNOCLIPON, true);
1974 P_SetMessage(player, TXT_CHEATNOCLIPOFF, true);
1978 static void CheatWeaponsFunc(player_t *player, Cheat_t *cheat)
1981 //extern boolean *WeaponInShareware;
1983 for(i = 0; i < NUMARMOR; i++)
1985 player->armorpoints[i] = ArmorIncrement[player->class][i];
1987 for(i = 0; i < NUMWEAPONS; i++)
1989 player->weaponowned[i] = true;
1991 for(i = 0; i < NUMMANA; i++)
1993 player->mana[i] = MAX_MANA;
1995 P_SetMessage(player, TXT_CHEATWEAPONS, true);
1998 static void CheatHealthFunc(player_t *player, Cheat_t *cheat)
2000 if(player->morphTics)
2002 player->health = player->mo->health = MAXMORPHHEALTH;
2006 player->health = player->mo->health = MAXHEALTH;
2008 P_SetMessage(player, TXT_CHEATHEALTH, true);
2011 static void CheatKeysFunc(player_t *player, Cheat_t *cheat)
2013 player->keys = 2047;
2014 P_SetMessage(player, TXT_CHEATKEYS, true);
2017 static void CheatSoundFunc(player_t *player, Cheat_t *cheat)
2019 DebugSound = !DebugSound;
2022 P_SetMessage(player, TXT_CHEATSOUNDON, true);
2026 P_SetMessage(player, TXT_CHEATSOUNDOFF, true);
2030 static void CheatTickerFunc(player_t *player, Cheat_t *cheat)
2032 extern int DisplayTicker;
2034 DisplayTicker = !DisplayTicker;
2037 P_SetMessage(player, TXT_CHEATTICKERON, true);
2041 P_SetMessage(player, TXT_CHEATTICKEROFF, true);
2045 static void CheatArtifactAllFunc(player_t *player, Cheat_t *cheat)
2050 for(i = arti_none+1; i < arti_firstpuzzitem; i++)
2052 for(j = 0; j < 25; j++)
2054 P_GiveArtifact(player, i, NULL);
2057 P_SetMessage(player, TXT_CHEATARTIFACTS3, true);
2060 static void CheatPuzzleFunc(player_t *player, Cheat_t *cheat)
2064 for(i = arti_firstpuzzitem; i < NUMARTIFACTS; i++)
2066 P_GiveArtifact(player, i, NULL);
2068 P_SetMessage(player, TXT_CHEATARTIFACTS3, true);
2071 static void CheatInitFunc(player_t *player, Cheat_t *cheat)
2073 G_DeferedInitNew(gameskill, gameepisode, gamemap);
2074 P_SetMessage(player, TXT_CHEATWARP, true);
2077 static void CheatWarpFunc(player_t *player, Cheat_t *cheat)
2086 tens = cheat->args[0]-'0';
2087 ones = cheat->args[1]-'0';
2088 if(tens < 0 || tens > 9 || ones < 0 || ones > 9)
2090 P_SetMessage(player, TXT_CHEATBADINPUT, true);
2093 map = P_TranslateMap((cheat->args[0]-'0')*10+cheat->args[1]-'0');
2096 P_SetMessage(player, TXT_CHEATNOMAP, true);
2100 { // Don't try to teleport to current map
2101 P_SetMessage(player, TXT_CHEATBADINPUT, true);
2105 { // Search map development directory
2106 sprintf(auxName, "%sMAP%02d.WAD", DevMapsDir, map);
2107 fp = fopen(auxName, "rb");
2114 P_SetMessage(player, TXT_CHEATNOMAP, true);
2119 { // Search primary lumps
2120 sprintf(mapName, "MAP%02d", map);
2121 if(W_CheckNumForName(mapName) == -1)
2123 P_SetMessage(player, TXT_CHEATNOMAP, true);
2127 P_SetMessage(player, TXT_CHEATWARP, true);
2128 G_TeleportNewMap(map, 0);
2131 static void CheatPigFunc(player_t *player, Cheat_t *cheat)
2133 extern boolean P_UndoPlayerMorph(player_t *player);
2135 if(player->morphTics)
2137 P_UndoPlayerMorph(player);
2141 P_MorphPlayer(player);
2143 P_SetMessage(player, "SQUEAL!!", true);
2146 static void CheatMassacreFunc(player_t *player, Cheat_t *cheat)
2151 count = P_Massacre();
2152 sprintf(buffer, "%d MONSTERS KILLED\n", count);
2153 P_SetMessage(player, buffer, true);
2156 static void CheatIDKFAFunc(player_t *player, Cheat_t *cheat)
2159 if(player->morphTics)
2163 for(i = 1; i < 8; i++)
2165 player->weaponowned[i] = false;
2167 player->pendingweapon = WP_FIRST;
2168 P_SetMessage(player, TXT_CHEATIDKFA, true);
2171 static void CheatQuickenFunc1(player_t *player, Cheat_t *cheat)
2173 P_SetMessage(player, "TRYING TO CHEAT? THAT'S ONE....", true);
2176 static void CheatQuickenFunc2(player_t *player, Cheat_t *cheat)
2178 P_SetMessage(player, "THAT'S TWO....", true);
2181 static void CheatQuickenFunc3(player_t *player, Cheat_t *cheat)
2183 P_DamageMobj(player->mo, NULL, player->mo, 10000);
2184 P_SetMessage(player, "THAT'S THREE! TIME TO DIE.", true);
2187 static void CheatClassFunc1(player_t *player, Cheat_t *cheat)
2190 P_SetMessage(player, "ENTER NEW PLAYER CLASS (0 - 3)", true);
2192 P_SetMessage(player, "ENTER NEW PLAYER CLASS (0 - 2)", true);
2196 static void CheatClassFunc2(player_t *player, Cheat_t *cheat)
2201 if(player->morphTics)
2202 { // don't change class if the player is morphed
2205 class = cheat->args[0]-'0';
2207 if(class > 3 || class < 0)
2209 if(class > 2 || class < 0)
2212 P_SetMessage(player, "INVALID PLAYER CLASS", true);
2215 player->class = class;
2216 for(i = 0; i < NUMARMOR; i++)
2218 player->armorpoints[i] = 0;
2220 PlayerClass[consoleplayer] = class;
2221 P_PostMorphWeapon(player, WP_FIRST);
2224 UpdateState |= I_FULLSCRN;
2227 static void CheatVersionFunc(player_t *player, Cheat_t *cheat)
2229 P_SetMessage(player, VERSIONTEXT, true);
2232 static void CheatDebugFunc(player_t *player, Cheat_t *cheat)
2234 char textBuffer[50];
2235 sprintf(textBuffer, "MAP %d (%d) X:%5d Y:%5d Z:%5d",
2236 P_GetMapWarpTrans(gamemap),
2238 player->mo->x >> FRACBITS,
2239 player->mo->y >> FRACBITS,
2240 player->mo->z >> FRACBITS);
2241 P_SetMessage(player, textBuffer, true);
2244 static void CheatScriptFunc1(player_t *player, Cheat_t *cheat)
2246 P_SetMessage(player, "RUN WHICH SCRIPT(01-99)?", true);
2249 static void CheatScriptFunc2(player_t *player, Cheat_t *cheat)
2251 P_SetMessage(player, "RUN WHICH SCRIPT(01-99)?", true);
2254 static void CheatScriptFunc3(player_t *player, Cheat_t *cheat)
2259 char textBuffer[40];
2261 tens = cheat->args[0]-'0';
2262 ones = cheat->args[1]-'0';
2263 script = tens*10 + ones;
2264 if (script < 1) return;
2265 if (script > 99) return;
2266 args[0]=args[1]=args[2]=0;
2268 if(P_StartACS(script, 0, args, player->mo, NULL, 0))
2270 sprintf(textBuffer, "RUNNING SCRIPT %.2d", script);
2271 P_SetMessage(player, textBuffer, true);
2275 extern int cheating;
2277 static void CheatRevealFunc(player_t *player, Cheat_t *cheat)
2279 cheating = (cheating+1) % 3;
2282 //===========================================================================
2286 //===========================================================================
2288 static void CheatTrackFunc1(player_t *player, Cheat_t *cheat)
2296 if(I_CDMusInit() == -1)
2298 P_SetMessage(player, "ERROR INITIALIZING CD", true);
2300 sprintf(buffer, "ENTER DESIRED CD TRACK (%.2d - %.2d):\n",
2301 I_CDMusFirstTrack(), I_CDMusLastTrack());
2302 P_SetMessage(player, buffer, true);
2305 //===========================================================================
2309 //===========================================================================
2311 static void CheatTrackFunc2(player_t *player, Cheat_t *cheat)
2320 track = (cheat->args[0]-'0')*10+(cheat->args[1]-'0');
2321 if(track < I_CDMusFirstTrack() || track > I_CDMusLastTrack())
2323 P_SetMessage(player, "INVALID TRACK NUMBER\n", true);
2326 if(track == i_CDCurrentTrack)
2330 if(I_CDMusPlay(track))
2332 sprintf(buffer, "ERROR WHILE TRYING TO PLAY CD TRACK: %.2d\n", track);
2333 P_SetMessage(player, buffer, true);
2336 { // No error encountered while attempting to play the track
2337 sprintf(buffer, "PLAYING TRACK: %.2d\n", track);
2338 P_SetMessage(player, buffer, true);
2339 // i_CDMusicLength = 35*I_CDMusTrackLength(track);
2340 // oldTic = gametic;
2342 i_CDCurrentTrack = track;