1 /**
2  * @file debug.cpp
3  *
4  * Implementation of debug functions.
5  */
6 #include "all.h"
7 
8 DEVILUTION_BEGIN_NAMESPACE
9 
10 #ifdef _DEBUG
11 BOOL update_seed_check = FALSE;
12 
13 #define DEBUGSEEDS 4096
14 int seed_index;
15 int level_seeds[NUMLEVELS + 1];
16 int seed_table[DEBUGSEEDS];
17 
18 BYTE *pSquareCel;
19 char dMonsDbg[NUMLEVELS][MAXDUNX][MAXDUNY];
20 char dFlagDbg[NUMLEVELS][MAXDUNX][MAXDUNY];
21 
LoadDebugGFX()22 void LoadDebugGFX()
23 {
24 	if (visiondebug)
25 		pSquareCel = LoadFileInMem("Data\\Square.CEL", NULL);
26 }
27 
FreeDebugGFX()28 void FreeDebugGFX()
29 {
30 	MemFreeDbg(pSquareCel);
31 }
32 
CheckDungeonClear()33 void CheckDungeonClear()
34 {
35 	int i, j;
36 
37 	for (j = 0; j < MAXDUNY; j++) {
38 		for (i = 0; i < MAXDUNX; i++) {
39 			if (dMonster[i][j] != 0)
40 				app_fatal("Monsters not cleared");
41 			if (dPlayer[i][j] != 0)
42 				app_fatal("Players not cleared");
43 
44 			dMonsDbg[currlevel][i][j] = dFlags[i][j] & BFLAG_VISIBLE;
45 			dFlagDbg[currlevel][i][j] = dFlags[i][j] & BFLAG_POPULATED;
46 		}
47 	}
48 }
49 
GiveGoldCheat()50 void GiveGoldCheat()
51 {
52 	int i, ni;
53 
54 	for (i = 0; i < NUM_INV_GRID_ELEM; i++) {
55 		if (plr[myplr].InvGrid[i] == 0) {
56 			ni = plr[myplr]._pNumInv++;
57 			SetPlrHandItem(&plr[myplr].InvList[ni], IDI_GOLD);
58 			GetPlrHandSeed(&plr[myplr].InvList[ni]);
59 			plr[myplr].InvList[ni]._ivalue = GOLD_MAX_LIMIT;
60 			plr[myplr].InvList[ni]._iCurs = ICURS_GOLD_LARGE;
61 			plr[myplr]._pGold += GOLD_MAX_LIMIT;
62 			plr[myplr].InvGrid[i] = plr[myplr]._pNumInv;
63 		}
64 	}
65 }
66 
TakeGoldCheat()67 void TakeGoldCheat()
68 {
69 	int i;
70 	char ig;
71 
72 	for (i = 0; i < NUM_INV_GRID_ELEM; i++) {
73 		ig = plr[myplr].InvGrid[i];
74 		if (ig > 0 && plr[myplr].InvList[ig - 1]._itype == ITYPE_GOLD)
75 			RemoveInvItem(myplr, ig - 1);
76 	}
77 
78 	for (i = 0; i < MAXBELTITEMS; i++) {
79 		if (plr[myplr].SpdList[i]._itype == ITYPE_GOLD)
80 			plr[myplr].SpdList[i]._itype = ITYPE_NONE;
81 	}
82 
83 	plr[myplr]._pGold = 0;
84 }
85 
MaxSpellsCheat()86 void MaxSpellsCheat()
87 {
88 	for (int i = SPL_FIREBOLT; i < MAX_SPELLS; i++) {
89 		if (GetSpellBookLevel((spell_id)i) != -1) {
90 			plr[myplr]._pMemSpells |= GetSpellBitmask(i);
91 			plr[myplr]._pSplLvl[i] = 10;
92 		}
93 	}
94 }
95 
SetSpellLevelCheat(char spl,int spllvl)96 void SetSpellLevelCheat(char spl, int spllvl)
97 {
98 	plr[myplr]._pMemSpells |= GetSpellBitmask(spl);
99 	plr[myplr]._pSplLvl[spl] = spllvl;
100 }
101 
SetAllSpellsCheat()102 void SetAllSpellsCheat()
103 {
104 	SetSpellLevelCheat(SPL_FIREBOLT, 8);
105 	SetSpellLevelCheat(SPL_CBOLT, 11);
106 	SetSpellLevelCheat(SPL_HBOLT, 10);
107 	SetSpellLevelCheat(SPL_HEAL, 7);
108 	SetSpellLevelCheat(SPL_HEALOTHER, 5);
109 	SetSpellLevelCheat(SPL_LIGHTNING, 9);
110 	SetSpellLevelCheat(SPL_FIREWALL, 5);
111 	SetSpellLevelCheat(SPL_TELEKINESIS, 3);
112 	SetSpellLevelCheat(SPL_TOWN, 3);
113 	SetSpellLevelCheat(SPL_FLASH, 3);
114 	SetSpellLevelCheat(SPL_RNDTELEPORT, 2);
115 	SetSpellLevelCheat(SPL_MANASHIELD, 2);
116 	SetSpellLevelCheat(SPL_WAVE, 4);
117 	SetSpellLevelCheat(SPL_FIREBALL, 3);
118 	SetSpellLevelCheat(SPL_STONE, 1);
119 	SetSpellLevelCheat(SPL_CHAIN, 1);
120 	SetSpellLevelCheat(SPL_GUARDIAN, 4);
121 	SetSpellLevelCheat(SPL_ELEMENT, 3);
122 	SetSpellLevelCheat(SPL_NOVA, 1);
123 	SetSpellLevelCheat(SPL_GOLEM, 2);
124 	SetSpellLevelCheat(SPL_FLARE, 1);
125 	SetSpellLevelCheat(SPL_BONESPIRIT, 1);
126 }
127 
128 int dbgplr;
129 
PrintDebugPlayer(BOOL bNextPlayer)130 void PrintDebugPlayer(BOOL bNextPlayer)
131 {
132 	char dstr[128];
133 
134 	if (bNextPlayer)
135 		dbgplr = ((BYTE)dbgplr + 1) & 3;
136 
137 	sprintf(dstr, "Plr %i : Active = %i", dbgplr, plr[dbgplr].plractive);
138 	NetSendCmdString(1 << myplr, dstr);
139 
140 	if (plr[dbgplr].plractive) {
141 		sprintf(dstr, "  Plr %i is %s", dbgplr, plr[dbgplr]._pName);
142 		NetSendCmdString(1 << myplr, dstr);
143 		sprintf(dstr, "  Lvl = %i : Change = %i", plr[dbgplr].plrlevel, plr[dbgplr]._pLvlChanging);
144 		NetSendCmdString(1 << myplr, dstr);
145 		sprintf(dstr, "  x = %i, y = %i : tx = %i, ty = %i", plr[dbgplr]._px, plr[dbgplr]._py, plr[dbgplr]._ptargx, plr[dbgplr]._ptargy);
146 		NetSendCmdString(1 << myplr, dstr);
147 		sprintf(dstr, "  mode = %i : daction = %i : walk[0] = %i", plr[dbgplr]._pmode, plr[dbgplr].destAction, plr[dbgplr].walkpath[0]);
148 		NetSendCmdString(1 << myplr, dstr);
149 		sprintf(dstr, "  inv = %i : hp = %i", plr[dbgplr]._pInvincible, plr[dbgplr]._pHitPoints);
150 		NetSendCmdString(1 << myplr, dstr);
151 	}
152 }
153 
154 int dbgqst;
155 
PrintDebugQuest()156 void PrintDebugQuest()
157 {
158 	char dstr[128];
159 
160 	sprintf(dstr, "Quest %i :  Active = %i, Var1 = %i", dbgqst, quests[dbgqst]._qactive, quests[dbgqst]._qvar1);
161 	NetSendCmdString(1 << myplr, dstr);
162 
163 	dbgqst++;
164 	if (dbgqst == MAXQUESTS)
165 		dbgqst = 0;
166 }
167 
PrintDebugMonster(int m)168 void PrintDebugMonster(int m)
169 {
170 	BOOL bActive;
171 	int i;
172 	char dstr[128];
173 
174 	sprintf(dstr, "Monster %i = %s", m, monster[m].mName);
175 	NetSendCmdString(1 << myplr, dstr);
176 	sprintf(dstr, "X = %i, Y = %i", monster[m]._mx, monster[m]._my);
177 	NetSendCmdString(1 << myplr, dstr);
178 	sprintf(dstr, "Enemy = %i, HP = %i", monster[m]._menemy, monster[m]._mhitpoints);
179 	NetSendCmdString(1 << myplr, dstr);
180 	sprintf(dstr, "Mode = %i, Var1 = %i", monster[m]._mmode, monster[m]._mVar1);
181 	NetSendCmdString(1 << myplr, dstr);
182 
183 	bActive = FALSE;
184 
185 	for (i = 0; i < nummonsters; i++) {
186 		if (monstactive[i] == m)
187 			bActive = TRUE;
188 	}
189 
190 	sprintf(dstr, "Active List = %i, Squelch = %i", bActive, monster[m]._msquelch);
191 	NetSendCmdString(1 << myplr, dstr);
192 }
193 
194 int dbgmon;
195 
GetDebugMonster()196 void GetDebugMonster()
197 {
198 	int mi1, mi2;
199 
200 	mi1 = pcursmonst;
201 	if (mi1 == -1) {
202 		mi2 = dMonster[cursmx][cursmy];
203 		if (mi2 != 0) {
204 			mi1 = mi2 - 1;
205 			if (mi2 <= 0)
206 				mi1 = -(mi2 + 1);
207 		} else {
208 			mi1 = dbgmon;
209 		}
210 	}
211 	PrintDebugMonster(mi1);
212 }
213 
NextDebugMonster()214 void NextDebugMonster()
215 {
216 	char dstr[128];
217 
218 	dbgmon++;
219 	if (dbgmon == MAXMONSTERS)
220 		dbgmon = 0;
221 
222 	sprintf(dstr, "Current debug monster = %i", dbgmon);
223 	NetSendCmdString(1 << myplr, dstr);
224 }
225 #endif
226 
227 DEVILUTION_END_NAMESPACE
228