XEEN: Hook up debugger properly and implement spell command

This commit is contained in:
Paul Gilbert 2015-03-01 21:58:58 -05:00
parent ee5b8ed59f
commit 8e6708e600
6 changed files with 61 additions and 17 deletions

View File

@ -25,7 +25,7 @@
#include "xeen/debugger.h"
namespace Xeen {
/*
static int strToInt(const char *s) {
if (!*s)
// No string at all
@ -41,16 +41,43 @@ static int strToInt(const char *s) {
error("strToInt failed on string \"%s\"", s);
return (int)tmp;
}
*/
/*------------------------------------------------------------------------*/
Debugger::Debugger(XeenEngine *vm) : GUI::Debugger(), _vm(vm) {
registerCmd("continue", WRAP_METHOD(Debugger, cmdExit));
registerCmd("scene", WRAP_METHOD(Debugger, Cmd_LoadScene));
registerCmd("spell", WRAP_METHOD(Debugger, cmdSpell));
_spellId = -1;
}
bool Debugger::Cmd_LoadScene(int argc, const char **argv) {
void Debugger::update() {
Combat &combat = *_vm->_combat;
Party &party = *_vm->_party;
Spells &spells = *_vm->_spells;
if (_spellId != -1) {
// Cast any specified spell
MagicSpell spellId = (MagicSpell)_spellId;
_spellId = -1;
spells.castSpell(&party._activeParty[0], spellId);
}
onFrame();
}
bool Debugger::cmdSpell(int argc, const char **argv) {
if (argc != 2) {
debugPrintf("Format: spell <spell-id>");
return true;
} else {
int spellId = strToInt(argv[1]);
if (spellId >= MS_AcidSpray && spellId <= MS_WizardEye) {
_spellId = spellId;
return false;
}
}
return true;
}

View File

@ -31,12 +31,15 @@ namespace Xeen {
class XeenEngine;
class Debugger : public GUI::Debugger {
protected:
private:
XeenEngine *_vm;
int _spellId;
bool Cmd_LoadScene(int argc, const char **argv);
bool cmdSpell(int argc, const char **argv);
public:
Debugger(XeenEngine *vm);
void update();
};
} // End of namespace Xeen

View File

@ -93,6 +93,7 @@ void CantCast::show(XeenEngine *vm, int spellId, int componentNum) {
void CantCast::execute(int spellId, int componentNum) {
EventsManager &events = *_vm->_events;
SoundManager &sound = *_vm->_sound;
Spells &spells = *_vm->_spells;
Window &w = _vm->_screen->_windows[6];
Mode oldMode = _vm->_mode;
_vm->_mode = MODE_FF;
@ -100,7 +101,9 @@ void CantCast::execute(int spellId, int componentNum) {
sound.playFX(21);
w.open();
w.writeString(Common::String::format(NOT_ENOUGH_TO_CAST,
SPELL_CAST_COMPONENTS[componentNum - 1]));
SPELL_CAST_COMPONENTS[componentNum - 1],
spells._spellNames[spellId].c_str()
));
w.update();
do {

View File

@ -988,7 +988,6 @@ void IdentifyMonster::execute() {
Map &map = *_vm->_map;
Screen &screen = *_vm->_screen;
SoundManager &sound = *_vm->_sound;
Spells &spells = *_vm->_spells;
Window &w = screen._windows[17];
Common::String monsterDesc[3];

View File

@ -94,7 +94,14 @@ void EventsManager::pollEvents() {
case Common::EVENT_RTL:
return;
case Common::EVENT_KEYDOWN:
_keyCode = event.kbd.keycode;
// Check for debugger
if (event.kbd.keycode == Common::KEYCODE_d && (event.kbd.flags & Common::KBD_CTRL)) {
// Attach to the debugger
_vm->_debugger->attach();
_vm->_debugger->onFrame();
} else {
_keyCode = event.kbd.keycode;
}
break;
case Common::EVENT_MOUSEMOVE:
_mousePos = event.mouse;
@ -181,6 +188,11 @@ void EventsManager::ipause(uint amount) {
*/
void EventsManager::nextFrame() {
++_frameCounter;
// Allow debugger to update
_vm->_debugger->update();
// Update the screen
_vm->_screen->update();
}

View File

@ -1315,7 +1315,7 @@ const char *const USE_ITEM_IN_COMBAT =
const char *const NO_SPECIAL_ABILITIES = "\v005\x3""c%s\fdhas no special abilities!";
const char *const CANT_CAST_WHILE_ENGAGED = "\x03c\v007Can't cast %s while engaged!";
const char *const CANT_CAST_WHILE_ENGAGED = "\x3""c\v007Can't cast %s while engaged!";
const char *const EQUIPPED_ALL_YOU_CAN = "\x3""c\v007You have equipped all the %ss you can!";
const char *const REMOVE_X_TO_EQUIP_Y = "\x3""c\v007You must remove %sto equip %s\x8!";
@ -1328,7 +1328,7 @@ const char *const CANNOT_DISCARD_CURSED_ITEM = "\3x""cYou cannot discard a curse
const char *const PERMANENTLY_DISCARD = "\v000\t000\x03lPermanently discard %s\fd?";
const char *const BACKPACK_IS_FULL = "\v005\x03c\fd%s's backpack is full.";
const char *const BACKPACK_IS_FULL = "\v005\x3""c\fd%s's backpack is full.";
const char *const CATEGORY_BACKPACK_IS_FULL[4] = {
"\v010\t000\x3""c%s's weapons backpack is full.",
@ -1341,11 +1341,11 @@ const char *const BUY_X_FOR_Y_GOLD = "\x3l\v000\t000\fdBuy %s\fd for %lu gold?";
const char *const SELL_X_FOR_Y_GOLD = "\x3l\v000\t000\fdSell %s\fd for %lu gold?";
const char *const NO_NEED_OF_THIS = "\v005\x03c\fdWe have no need of this %s\f!";
const char *const NO_NEED_OF_THIS = "\v005\x3""c\fdWe have no need of this %s\f!";
const char *const NOT_RECHARGABLE = "\v012\x03c\fdNot Rechargeable. %s";
const char *const NOT_RECHARGABLE = "\v012\x3""c\fdNot Rechargeable. %s";
const char *const NOT_ENCHANTABLE = "\v012\t000\x03cNot Enchantable. %s";
const char *const NOT_ENCHANTABLE = "\v012\t000\x3""cNot Enchantable. %s";
const char *const SPELL_FAILED = "Spell Failed!";
@ -1495,7 +1495,7 @@ const int NEW_CHARACTER_SPELLS[10][4] = {
const char *const COMBAT_DETAILS = "\r\f00\x3""c\v000\t000\x2""Combat%s%s%s\x1";
const char *NOT_ENOUGH_TO_CAST = "\x03c\v010Not enough %s to Cast %s";
const char *NOT_ENOUGH_TO_CAST = "\x3""c\v010Not enough %s to Cast %s";
const char *SPELL_CAST_COMPONENTS[2] = { "Spell Points", "Gems" };
const char *const CAST_SPELL_DETAILS =
@ -1530,7 +1530,7 @@ const char *const GIVE_TREASURE_FORMATTING =
"\x4""077\n"
"\x4""077";
const char *const X_FOUND_Y = "\v060\t000\x03c%s found: %s";
const char *const X_FOUND_Y = "\v060\t000\x3""c%s found: %s";
const char *const ON_WHO = "\x3""c\v009On Who?";
@ -1554,7 +1554,7 @@ const char *const LLOYDS_BEACON =
"%s\x3l\n"
"x = %d\x3r\t000y = %d\x3""c\x2\v122\t021\f15S\fdet\t060\f15R\fdeturn\x1";
const char *const HOW_MANY_SQUARES = "\x03cTeleport\nHow many squares %s (1-9)";
const char *const HOW_MANY_SQUARES = "\x3""cTeleport\nHow many squares %s (1-9)";
const char *const TOWN_PORTAL =
"\x3""cTown Portal\x3l\n"