diff options
-rw-r--r-- | devtools/create_xeen/constants.cpp | 16 | ||||
-rw-r--r-- | engines/xeen/dialogs/dialogs_query.cpp | 8 | ||||
-rw-r--r-- | engines/xeen/dialogs/dialogs_spells.cpp | 55 | ||||
-rw-r--r-- | engines/xeen/dialogs/dialogs_spells.h | 8 | ||||
-rw-r--r-- | engines/xeen/locations.cpp | 4 | ||||
-rw-r--r-- | engines/xeen/resources.cpp | 4 | ||||
-rw-r--r-- | engines/xeen/resources.h | 4 |
7 files changed, 57 insertions, 42 deletions
diff --git a/devtools/create_xeen/constants.cpp b/devtools/create_xeen/constants.cpp index e895949509..b001a224e9 100644 --- a/devtools/create_xeen/constants.cpp +++ b/devtools/create_xeen/constants.cpp @@ -1103,14 +1103,14 @@ const char *const SPELL_PTS = "Spell Pts"; const char *const GOLD = "Gold"; -const char *const SPELLS_PRESS_A_KEY = - "\x3""c\xC""09%s\xC""d\x3l\n" +const char *const SPELL_INFO = + "\x3""c\f09%s\fd\x3l\n" "\n" - "%s\x3""c\x9""000\xB""100Press a Key!"; + "%s\x3""c\t000\v100Press a Key!"; -const char *const SPELLS_PURCHASE = - "\x3l\xB""000\x9""000\xC""d%s Do you wish to purchase " - "\xC""09%s\xC""d for %u?"; +const char *const SPELL_PURCHASE = + "\x3l\v000\t000\fd%s Do you wish to purchase " + "\f09%s\fd for %u?"; const char *const MAP_TEXT = "\x3""c\xB""000\x9""000%s\x3l\xB""139" @@ -2012,8 +2012,8 @@ void writeConstants(CCArchive &cc) { file.syncString(SPELLS_DIALOG_SPELLS); file.syncString(SPELL_PTS); file.syncString(GOLD); - file.syncString(SPELLS_PRESS_A_KEY); - file.syncString(SPELLS_PURCHASE); + file.syncString(SPELL_INFO); + file.syncString(SPELL_PURCHASE); file.syncString(MAP_TEXT); file.syncString(LIGHT_COUNT_TEXT); file.syncString(FIRE_RESISTENCE_TEXT); diff --git a/engines/xeen/dialogs/dialogs_query.cpp b/engines/xeen/dialogs/dialogs_query.cpp index 79f46826cd..3b44b54072 100644 --- a/engines/xeen/dialogs/dialogs_query.cpp +++ b/engines/xeen/dialogs/dialogs_query.cpp @@ -68,8 +68,11 @@ bool Confirm::execute(const Common::String &msg, int mode) { bool result = false; while (!_vm->shouldExit()) { - events.pollEvents(); - checkEvents(_vm); + _buttonValue = 0; + while (!_vm->shouldExit() && !_buttonValue) { + events.pollEvents(); + checkEvents(_vm); + } if ((mode & 0x80) || _buttonValue == Common::KEYCODE_ESCAPE || _buttonValue == Common::KEYCODE_n) @@ -81,6 +84,7 @@ bool Confirm::execute(const Common::String &msg, int mode) { } } + events.clearEvents(); w.close(); return result; } diff --git a/engines/xeen/dialogs/dialogs_spells.cpp b/engines/xeen/dialogs/dialogs_spells.cpp index 5842416403..7f7df8d7c8 100644 --- a/engines/xeen/dialogs/dialogs_spells.cpp +++ b/engines/xeen/dialogs/dialogs_spells.cpp @@ -31,15 +31,15 @@ namespace Xeen { Character *SpellsDialog::show(XeenEngine *vm, ButtonContainer *priorDialog, - Character *c, int isCasting) { + Character *c, SpellDialogMode mode) { SpellsDialog *dlg = new SpellsDialog(vm); - Character *result = dlg->execute(priorDialog, c, isCasting); + Character *result = dlg->execute(priorDialog, c, mode); delete dlg; return result; } -Character *SpellsDialog::execute(ButtonContainer *priorDialog, Character *c, int isCasting) { +Character *SpellsDialog::execute(ButtonContainer *priorDialog, Character *c, int mode) { EventsManager &events = *_vm->_events; Interface &intf = *_vm->_interface; Party &party = *_vm->_party; @@ -48,17 +48,19 @@ Character *SpellsDialog::execute(ButtonContainer *priorDialog, Character *c, int Windows &windows = *_vm->_windows; Window &w = windows[25]; int ccNum = _vm->_files->_ccNum; + loadButtons(); + loadStrings("spldesc.bin"); - int castingCopy = isCasting; - isCasting &= 0x7f; + int modeCopy = mode; + mode &= 0x7f; int selection = -1; int topIndex = 0; int newSelection; w.open(); do { - if (!isCasting) { + if (!mode) { if (!c->guildMember()) { sound.stopSound(); intf._overallFrame = 5; @@ -74,7 +76,7 @@ Character *SpellsDialog::execute(ButtonContainer *priorDialog, Character *c, int } _spells.clear(); - const char *errorMsg = setSpellText(c, castingCopy); + const char *errorMsg = setSpellText(c, modeCopy); w.writeString(Common::String::format(Res.SPELLS_FOR, errorMsg == nullptr ? Res.SPELL_LINES_0_TO_9 : "", c->_name.c_str())); @@ -103,18 +105,19 @@ Character *SpellsDialog::execute(ButtonContainer *priorDialog, Character *c, int colors[3], names[3], colors[4], names[4], colors[5], names[5], colors[6], names[6], colors[7], names[7], colors[8], names[8], colors[9], names[9], - isCasting ? Res.SPELL_PTS : Res.GOLD, - isCasting ? c->_currentSp : party._gold + mode ? Res.SPELL_PTS : Res.GOLD, + mode ? c->_currentSp : party._gold )); _scrollSprites.draw(0, 4, Common::Point(39, 26)); _scrollSprites.draw(0, 0, Common::Point(187, 26)); _scrollSprites.draw(0, 2, Common::Point(187, 111)); - if (isCasting) + if (mode) _scrollSprites.draw(w, 5, Common::Point(132, 123)); w.update(); + _buttonValue = 0; do { events.pollEventsAndWait(); checkEvents(_vm); @@ -227,15 +230,19 @@ Character *SpellsDialog::execute(ButtonContainer *priorDialog, Character *c, int int spellId = Res.SPELLS_ALLOWED[category][spellIndex]; int spellCost = spells.calcSpellCost(spellId, expenseFactor); - if (isCasting) { + if (mode) { + // Casting selection = newSelection; } else { - Common::String spellName = _spells[newSelection]._name; - Common::String msg = (castingCopy & 0x80) ? - Common::String::format(Res.SPELLS_PRESS_A_KEY, spellName.c_str()) : - Common::String::format(Res.SPELLS_PURCHASE, spellName.c_str(), spellCost); + // Guild spells dialog: Spells Info or Buy + const Common::String &spellName = spells._spellNames[spellId]; + const Common::String &spellDesc = _textStrings[spellId]; + + Common::String msg = (modeCopy & 0x80) ? + Common::String::format(Res.SPELL_INFO, spellName.c_str(), spellDesc.c_str()) : + Common::String::format(Res.SPELL_PURCHASE, spellName.c_str(), spellCost); - if (Confirm::show(_vm, msg, castingCopy + 1)) { + if (Confirm::show(_vm, msg, modeCopy + 1)) { if (party.subtract(CONS_GOLD, spellCost, WHERE_PARTY, WT_FREEZE_WAIT)) { c->_spells[spellIndex] = true; sound.stopSound(); @@ -277,7 +284,7 @@ Character *SpellsDialog::execute(ButtonContainer *priorDialog, Character *c, int if (_vm->shouldExit()) selection = -1; - if (isCasting && selection != -1) + if (mode && selection != -1) c->_currentSpell = _spells[selection]._spellIndex; return c; @@ -305,7 +312,7 @@ void SpellsDialog::loadButtons() { addPartyButtons(_vm); } -const char *SpellsDialog::setSpellText(Character *c, int isCasting) { +const char *SpellsDialog::setSpellText(Character *c, int mode) { Party &party = *_vm->_party; Spells &spells = *_vm->_spells; int ccNum = _vm->_files->_ccNum; @@ -313,7 +320,7 @@ const char *SpellsDialog::setSpellText(Character *c, int isCasting) { int currLevel = c->getCurrentLevel(); int category; - if ((isCasting & 0x7f) == 0) { + if ((mode & 0x7f) == 0) { switch (c->_class) { case CLASS_PALADIN: expenseFactor = 1; @@ -350,7 +357,7 @@ const char *SpellsDialog::setSpellText(Character *c, int isCasting) { // Handling if the spell is appropriate for the character's class if (idx < MAX_SPELLS_PER_CLASS) { - if (!c->_spells[idx] || (isCasting & 0x80)) { + if (!c->_spells[idx] || (mode & 0x80)) { int cost = spells.calcSpellCost(Res.SPELLS_ALLOWED[category][idx], expenseFactor); _spells.push_back(SpellEntry(Common::String::format("\x3l%s\x3r\x9""000%u", spells._spellNames[Res.SPELLS_ALLOWED[category][idx]].c_str(), cost), @@ -367,7 +374,7 @@ const char *SpellsDialog::setSpellText(Character *c, int isCasting) { Res.DARK_SPELL_OFFSETS[category][spellId]); if (idx < 40) { - if (!c->_spells[idx] || (isCasting & 0x80)) { + if (!c->_spells[idx] || (mode & 0x80)) { int cost = spells.calcSpellCost(Res.SPELLS_ALLOWED[category][idx], expenseFactor); _spells.push_back(SpellEntry(Common::String::format("\x3l%s\x3r\x9""000%u", spells._spellNames[Res.SPELLS_ALLOWED[category][idx]].c_str(), cost), @@ -383,7 +390,7 @@ const char *SpellsDialog::setSpellText(Character *c, int isCasting) { ++idx; if (idx <= MAX_SPELLS_PER_CLASS) { - if (!c->_spells[idx] || (isCasting & 0x80)) { + if (!c->_spells[idx] || (mode & 0x80)) { int cost = spells.calcSpellCost(Res.SPELLS_ALLOWED[category][idx], expenseFactor); _spells.push_back(SpellEntry(Common::String::format("\x3l%s\x3r\x9""000%u", spells._spellNames[Res.SPELLS_ALLOWED[category][idx]].c_str(), cost), @@ -397,7 +404,7 @@ const char *SpellsDialog::setSpellText(Character *c, int isCasting) { if (c->getMaxSP() == 0) return Res.NOT_A_SPELL_CASTER; - } else if ((isCasting & 0x7f) == 1) { + } else if ((mode & 0x7f) == 1) { switch (c->_class) { case CLASS_ARCHER: case CLASS_SORCERER: @@ -573,7 +580,7 @@ int CastSpell::execute(Character *&c) { case Common::KEYCODE_n: // Select new spell _vm->_mode = (Mode)_oldMode; - c = SpellsDialog::show(_vm, this, c, 1); + c = SpellsDialog::show(_vm, this, c, SPELLS_DIALOG_SELECT); redrawFlag = true; break; diff --git a/engines/xeen/dialogs/dialogs_spells.h b/engines/xeen/dialogs/dialogs_spells.h index bbe8fae856..6a4fe7a0cd 100644 --- a/engines/xeen/dialogs/dialogs_spells.h +++ b/engines/xeen/dialogs/dialogs_spells.h @@ -29,6 +29,10 @@ namespace Xeen { +enum SpellDialogMode { + SPELLS_DIALOG_BUY = 0, SPELLS_DIALOG_SELECT = 1, SPELLS_DIALOG_INFO = 0x80 +}; + struct SpellEntry { Common::String _name; int _spellIndex; @@ -57,7 +61,7 @@ private: /** * Executes the dialog */ - Character *execute(ButtonContainer *priorDialog, Character *c, int isCasting); + Character *execute(ButtonContainer *priorDialog, Character *c, int mode); /** * Loads buttons for the dialog @@ -73,7 +77,7 @@ public: * Show the spells list dialog */ static Character *show(XeenEngine *vm, ButtonContainer *priorDialog, - Character *c, int isCasting); + Character *c, SpellDialogMode mode); }; class CastSpell : public ButtonContainer { diff --git a/engines/xeen/locations.cpp b/engines/xeen/locations.cpp index e0fd9dfcc9..61a96260a3 100644 --- a/engines/xeen/locations.cpp +++ b/engines/xeen/locations.cpp @@ -529,12 +529,12 @@ Character *GuildLocation::doOptions(Character *c) { } } else if (_buttonValue == Common::KEYCODE_s) { if (c->guildMember()) - c = SpellsDialog::show(_vm, this, c, 0x80); + c = SpellsDialog::show(_vm, this, c, SPELLS_DIALOG_INFO); _buttonValue = 0; } else if (_buttonValue == Common::KEYCODE_b) { if (!c->noActions()) { if (c->guildMember()) - c = SpellsDialog::show(_vm, this, c, 0); + c = SpellsDialog::show(_vm, this, c, SPELLS_DIALOG_BUY); _buttonValue = 0; } } diff --git a/engines/xeen/resources.cpp b/engines/xeen/resources.cpp index c2732a9bf9..dcedf198d5 100644 --- a/engines/xeen/resources.cpp +++ b/engines/xeen/resources.cpp @@ -192,8 +192,8 @@ void Resources::loadData() { file.syncString(SPELLS_DIALOG_SPELLS); file.syncString(SPELL_PTS); file.syncString(GOLD); - file.syncString(SPELLS_PRESS_A_KEY); - file.syncString(SPELLS_PURCHASE); + file.syncString(SPELL_INFO); + file.syncString(SPELL_PURCHASE); file.syncString(MAP_TEXT); file.syncString(LIGHT_COUNT_TEXT); file.syncString(FIRE_RESISTENCE_TEXT); diff --git a/engines/xeen/resources.h b/engines/xeen/resources.h index 0659de45c9..2dc564d432 100644 --- a/engines/xeen/resources.h +++ b/engines/xeen/resources.h @@ -247,8 +247,8 @@ public: const char *SPELLS_DIALOG_SPELLS; const char *SPELL_PTS; const char *GOLD; - const char *SPELLS_PRESS_A_KEY; - const char *SPELLS_PURCHASE; + const char *SPELL_INFO; + const char *SPELL_PURCHASE; const char *MAP_TEXT; const char *LIGHT_COUNT_TEXT; const char *FIRE_RESISTENCE_TEXT; |