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