1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  *
21  */
22 
23 #ifndef ULTIMA_ULTIMA8_ENGINE_DEBUGGER_H
24 #define ULTIMA_ULTIMA8_ENGINE_DEBUGGER_H
25 
26 #include "ultima/ultima8/misc/common_types.h"
27 #include "ultima/shared/engine/debugger.h"
28 #include "ultima/shared/std/containers.h"
29 #include "common/debug.h"
30 #include "common/stream.h"
31 
32 namespace Ultima {
33 namespace Ultima8 {
34 
35 class ConsoleStream : public Common::WriteStream {
36 public:
37 	enum Precision { hex = 16, dec = 10 };
38 private:
39 	Precision _precision;
40 public:
ConsoleStream()41 	ConsoleStream() : Common::WriteStream(), _precision(dec) {
42 	}
43 
pos()44 	int64 pos() const override {
45 		return 0;
46 	}
47 
Print(const char * fmt,...)48 	void Print(const char *fmt, ...) {
49 		va_list argptr;
50 		va_start(argptr, fmt);
51 		Common::String str = Common::String::vformat(fmt, argptr);
52 		va_end(argptr);
53 
54 		write(str.c_str(), str.size());
55 	}
56 
57 	ConsoleStream &operator<<(const char *s) {
58 		write(s, strlen(s));
59 		return *this;
60 	}
61 
62 	ConsoleStream &operator<<(const void *ptr) {
63 		Common::String str = Common::String::format("%p", ptr);
64 		write(str.c_str(), str.size());
65 		return *this;
66 	}
67 
68 	ConsoleStream &operator<<(const Common::String &str) {
69 		write(str.c_str(), str.size());
70 		return *this;
71 	}
72 
73 	ConsoleStream &operator<<(Precision p) {
74 		_precision = p;
75 		return *this;
76 	}
77 
78 	ConsoleStream &operator<<(int val) {
79 		Common::String str = Common::String::format(
80 			(_precision == hex) ? "%x" : "%d", val);
81 		write(str.c_str(), str.size());
82 		return *this;
83 	}
84 };
85 
86 template<class T>
87 class console_ostream : public ConsoleStream {
write(const void * dataPtr,uint32 dataSize)88 	uint32 write(const void *dataPtr, uint32 dataSize) override {
89 		Common::String str((const char *)dataPtr, (const char *)dataPtr + dataSize);
90 		debugN(MM_INFO, "%s", str.c_str());
91 		return dataSize;
92 	}
93 };
94 
95 template<class T>
96 class console_err_ostream : public ConsoleStream {
97 private:
98 	Common::String _line;
99 public:
write(const void * dataPtr,uint32 dataSize)100 	uint32 write(const void *dataPtr, uint32 dataSize) override {
101 		_line += Common::String((const char *)dataPtr, dataSize);
102 
103 		size_t lineEnd;
104 		while ((lineEnd = _line.find('\n')) != Common::String::npos) {
105 			if (lineEnd > 0)
106 				warning("%s", Common::String(_line.c_str(), lineEnd).c_str());
107 
108 			_line = Common::String(_line.c_str() + lineEnd + 1);
109 		}
110 
111 		return dataSize;
112 	}
113 };
114 
115 // Standard Output Stream Object
116 extern console_ostream<char> *ppout;
117 // Error Output Stream Object
118 extern console_err_ostream<char> *pperr;
119 
120 #define pout (*ppout)
121 #define perr (*pperr)
122 
123 
124 /**
125  * Debugger base class
126  */
127 class Debugger : public Shared::Debugger {
128 public:
129 	typedef Common::String ArgsType;
130 	typedef Std::vector<ArgsType> ArgvType;
131 private:
132 	// Standard Output Stream Object
133 	console_ostream<char> _strOut;
134 	// Error Output Stream Object
135 	console_err_ostream<char> _errOut;
136 private:
strBool(bool flag)137 	const char *strBool(bool flag) {
138 		return flag ? "true" : "false";
139 	}
140 
141 	// Engine
142 	bool cmdSaveGame(int argc, const char **argv);
143 	bool cmdLoadGame(int argc, const char **argv);
144 	bool cmdNewGame(int argc, const char **argv);
145 	bool cmdQuit(int argc, const char **argv);
146 	bool cmdSetVideoMode(int argc, const char **argv);
147 	bool cmdEngineStats(int argc, const char **argv);
148 	bool cmdToggleAvatarInStasis(int argc, const char **argv);
149 	bool cmdTogglePaintEditorItems(int argc, const char **argv);
150 	bool cmdToggleShowTouchingItems(int argc, const char **argv);
151 	bool cmdCloseItemGumps(int argc, const char **argv);
152 
153 	// Avatar mover
154 	bool cmdStartJump(int argc, const char **argv);
155 	bool cmdStopJump(int argc, const char **argv);
156 	bool cmdStartTurnLeft(int argc, const char **argv);
157 	bool cmdStartTurnRight(int argc, const char **argv);
158 	bool cmdStartMoveForward(int argc, const char **argv);
159 	bool cmdStartMoveBack(int argc, const char **argv);
160 	bool cmdStopTurnLeft(int argc, const char **argv);
161 	bool cmdStopTurnRight(int argc, const char **argv);
162 	bool cmdStopMoveForward(int argc, const char **argv);
163 	bool cmdStopMoveBack(int argc, const char **argv);
164 	bool cmdStartMoveUp(int argc, const char **argv);
165 	bool cmdStartMoveDown(int argc, const char **argv);
166 	bool cmdStartMoveLeft(int argc, const char **argv);
167 	bool cmdStartMoveRight(int argc, const char **argv);
168 	bool cmdStopMoveUp(int argc, const char **argv);
169 	bool cmdStopMoveDown(int argc, const char **argv);
170 	bool cmdStopMoveLeft(int argc, const char **argv);
171 	bool cmdStopMoveRight(int argc, const char **argv);
172 
173 	bool cmdStartMoveRun(int argc, const char **argv);
174 	bool cmdStopMoveRun(int argc, const char **argv);
175 	bool cmdStartMoveStep(int argc, const char **argv);
176 	bool cmdStopMoveStep(int argc, const char **argv);
177 	bool cmdStartAttack(int argc, const char **argv);
178 	bool cmdStopAttack(int argc, const char **argv);
179 
180 	bool cmdCameraOnAvatar(int argc, const char **argv);
181 
182 	// Audio Process
183 	bool cmdListSFX(int argc, const char **argv);
184 	bool cmdStopSFX(int argc, const char **argv);
185 	bool cmdPlaySFX(int argc, const char **argv);
186 
187 	// Cheats
188 	bool cmdToggleCheatMode(int argc, const char **argv);
189 	bool cmdCheatItems(int argc, const char **argv);
190 	bool cmdCheatEquip(int argc, const char **argv);
191 	bool cmdMaxStats(int argc, const char **argv);
192 	bool cmdHeal(int argc, const char **argv);
193 	bool cmdToggleInvincibility(int argc, const char **argv);
194 
195 	// Game Map Gump
196 	bool cmdStartHighlightItems(int argc, const char **argv);
197 	bool cmdStopHighlightItems(int argc, const char **argv);
198 	bool cmdToggleHighlightItems(int argc, const char **argv);
199 	bool cmdDumpMap(int argc, const char **argvv);
200 	bool cmdDumpAllMaps(int argc, const char **argv);
201 	bool cmdIncrementSortOrder(int argc, const char **argv);
202 	bool cmdDecrementSortOrder(int argc, const char **argv);
203 
204 	// Kernel
205 	bool cmdProcessTypes(int argc, const char **argv);
206 	bool cmdListProcesses(int argc, const char **argv);
207 	bool cmdProcessInfo(int argc, const char **argv);
208 	bool cmdToggleFrameByFrame(int argc, const char **argv);
209 	bool cmdAdvanceFrame(int argc, const char **argv);
210 
211 	// Main Actor
212 	bool cmdTeleport(int argc, const char **argv);
213 	bool cmdMark(int argc, const char **argv);
214 	bool cmdRecall(int argc, const char **argv);
215 	bool cmdListMarks(int argc, const char **argv);
216 	bool cmdName(int argc, const char **argv);
217 	bool cmdUseBackpack(int argc, const char **argv);
218 	bool cmdUseInventory(int argc, const char **argv);
219 	bool cmdUseRecall(int argc, const char **argv);
220 	bool cmdUseBedroll(int argc, const char **argv);
221 	bool cmdUseKeyring(int argc, const char **argv);
222 	bool cmdNextInventory(int argc, const char **argv);
223 	bool cmdNextWeapon(int argc, const char **argv);
224 	bool cmdToggleCombat(int argc, const char **argv);
225 	bool cmdUseInventoryItem(int argc, const char **argv);
226 	bool cmdUseMedikit(int argc, const char **argv);
227 	bool cmdUseEnergyCube(int argc, const char **argv);
228 	bool cmdDetonateBomb(int argc, const char **argv);
229 	bool cmdStartSelection(int argc, const char **argv);
230 	bool cmdUseSelection(int argc, const char **argv);
231 	bool cmdGrabItems(int argc, const char **argv);
232 
233 	// Object Manager
234 	bool cmdObjectTypes(int argc, const char **argv);
235 	bool cmdObjectInfo(int argc, const char **argv);
236 
237 	// Quick Avatar Mover Process
238 	bool cmdStartQuickMoveUp(int argc, const char **argv);
239 	bool cmdStartQuickMoveDown(int argc, const char **argv);
240 	bool cmdStartQuickMoveLeft(int argc, const char **argv);
241 	bool cmdStartQuickMoveRight(int argc, const char **argv);
242 	bool cmdStartQuickMoveAscend(int argc, const char **argv);
243 	bool cmdStartQuickMoveDescend(int argc, const char **argv);
244 	bool cmdStopQuickMoveUp(int argc, const char **argv);
245 	bool cmdStopQuickMoveDown(int argc, const char **argv);
246 	bool cmdStopQuickMoveLeft(int argc, const char **argv);
247 	bool cmdStopQuickMoveRight(int argc, const char **argv);
248 	bool cmdStopQuickMoveAscend(int argc, const char **argv);
249 	bool cmdStopQuickMoveDescend(int argc, const char **argv);
250 	bool cmdToggleQuarterSpeed(int argc, const char **argv);
251 	bool cmdToggleClipping(int argc, const char **argv);
252 
253 	// UCMachine
254 	bool cmdGetGlobal(int argc, const char **argv);
255 	bool cmdSetGlobal(int argc, const char **argv);
256 #ifdef DEBUG
257 	bool cmdTracePID(int argc, const char **argv);
258 	bool cmdTraceObjID(int argc, const char **argv);
259 	bool cmdTraceClass(int argc, const char **argv);
260 	bool cmdTraceAll(int argc, const char **argv);
261 	bool cmdTraceEvents(int argc, const char **argv);
262 	bool cmdStopTrace(int argc, const char **argv);
263 #endif
264 
265 	// Miscellaneous
266 	bool cmdToggleFastArea(int argc, const char **argv);
267 	bool cmdVerifyQuit(int argc, const char **argv);
268 	bool cmdU8ShapeViewer(int argc, const char **argv);
269 	bool cmdShowMenu(int argc, const char **argv);
270 	bool cmdGenerateWholeMap(int argc, const char **argv);
271 	bool cmdToggleMinimap(int argc, const char **argv);
272 	bool cmdInvertScreen(int argc, const char **argv);
273 	bool cmdPlayMovie(int argc, const char **argv);
274 	bool cmdPlayMusic(int argc, const char **argv);
275 
276 #ifdef DEBUG
277 	bool cmdVisualDebugPathfinder(int argc, const char **argv);
278 #endif
279 
280 	void dumpCurrentMap(); // helper function
281 
282 public:
283 	Debugger();
284 	~Debugger() override;
285 
286 	void executeCommand(const ArgsType &args);
287 	void executeCommand(const ArgvType &argv);
288 };
289 
290 extern Debugger *g_debugger;
291 
292 } // End of namespace Ultima8
293 } // End of namespace Ultima
294 
295 #endif
296