Skip to content

Commit

Permalink
XEEN: Implement remaining spells
Browse files Browse the repository at this point in the history
  • Loading branch information
dreammaster committed Mar 1, 2015
1 parent c6506b5 commit ee5b8ed
Show file tree
Hide file tree
Showing 7 changed files with 99 additions and 1 deletion.
52 changes: 52 additions & 0 deletions engines/xeen/dialogs_spells.cpp
Expand Up @@ -973,4 +973,56 @@ int TownPortal::execute() {
return townNumber;
}

/*------------------------------------------------------------------------*/

void IdentifyMonster::show(XeenEngine *vm) {
IdentifyMonster *dlg = new IdentifyMonster(vm);
dlg->execute();
delete dlg;
}

void IdentifyMonster::execute() {
Combat &combat = *_vm->_combat;
EventsManager &events = *_vm->_events;
Interface &intf = *_vm->_interface;
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];

for (int monIndex = 0; monIndex < 3; ++monIndex) {
if (combat._attackMonsters[monIndex] == -1)
continue;

MazeMonster &monster = map._mobData._monsters[combat._attackMonsters[monIndex]];
MonsterStruct &monsterData = *monster._monsterData;

monsterDesc[monIndex] = Common::String::format(MONSTER_DETAILS,
monsterData._name.c_str(),
_vm->printK2(monster._hp).c_str(),
monsterData._accuracy, monsterData._numberOfAttacks,
MONSTER_SPECIAL_ATTACKS[monsterData._specialAttack]
);
}

sound.playFX(20);
w.open();
w.writeString(Common::String::format(IDENTIFY_MONSTERS,
monsterDesc[0].c_str(), monsterDesc[1].c_str(), monsterDesc[2].c_str()));
w.update();

do {
events.updateGameCounter();
intf.draw3d(false);
w.frame();
screen._windows[3].update();

events.wait(1);
} while (!events.isKeyMousePressed());

w.close();
}

} // End of namespace Xeen
11 changes: 11 additions & 0 deletions engines/xeen/dialogs_spells.h
Expand Up @@ -146,6 +146,17 @@ class TownPortal : public ButtonContainer {
static int show(XeenEngine *vm);
};

class IdentifyMonster : public ButtonContainer {
private:
XeenEngine *_vm;

IdentifyMonster(XeenEngine *vm) : ButtonContainer(), _vm(vm) {}

void execute();
public:
static void show(XeenEngine *vm);
};

} // End of namespace Xeen

#endif /* XEEN_DIALOGS_SPELLS_H */
13 changes: 13 additions & 0 deletions engines/xeen/resources.cpp
Expand Up @@ -1572,4 +1572,17 @@ const int TOWN_MAP_NUMBERS[2][5] = {
{ 28, 29, 30, 31, 32 }, { 29, 31, 33, 35, 37 }
};

const char *const MONSTER_DETAILS =
"\x3l\n"
"%s\x3""c\t100%s\t140%u\t180%u\x3r\t000%s";

const char *const MONSTER_SPECIAL_ATTACKS[23] = {
"None", "Magic", "Fire", "Elec", "Cold", "Poison", "Energy", "Disease",
"Insane", "Asleep", "CurseItm", "InLove", "DrnSPts", "Curse", "Paralys",
"Uncons", "Confuse", "BrkWpn", "Weak", "Erad", "Age+5", "Dead", "Stone"
};

const char *const IDENTIFY_MONSTERS =
"Name\x3""c\t100HP\t140AC\t177#Atks\x3r\t000Special%s%s%s";

} // End of namespace Xeen
6 changes: 6 additions & 0 deletions engines/xeen/resources.h
Expand Up @@ -556,6 +556,12 @@ extern const char *const TOWN_PORTAL;

extern const int TOWN_MAP_NUMBERS[2][5];

extern const char *const MONSTER_DETAILS;

extern const char *const MONSTER_SPECIAL_ATTACKS[23];

extern const char *const IDENTIFY_MONSTERS;

} // End of namespace Xeen

#endif /* XEEN_RESOURCES_H */
11 changes: 10 additions & 1 deletion engines/xeen/spells.cpp
Expand Up @@ -711,7 +711,16 @@ void Spells::hypnotize() {
combat.multiAttack(7);
}

void Spells::identifyMonster() { error("TODO: spell"); }
void Spells::identifyMonster() {
Combat &combat = *_vm->_combat;

if (combat._attackMonsters[0] == -1 && combat._attackMonsters[1] == -1
&& combat._attackMonsters[2] == -1) {
spellFailed();
} else {
IdentifyMonster::show(_vm);
}
}

void Spells::implosion() {
Combat &combat = *_vm->_combat;
Expand Down
5 changes: 5 additions & 0 deletions engines/xeen/xeen.cpp
Expand Up @@ -350,4 +350,9 @@ Common::String XeenEngine::printK(uint value) {
Common::String::format("%u", value);
}

Common::String XeenEngine::printK2(uint value) {
return (value > 999) ? Common::String::format("%uk", value / 1000) :
Common::String::format("%u", value);
}

} // End of namespace Xeen
2 changes: 2 additions & 0 deletions engines/xeen/xeen.h
Expand Up @@ -203,6 +203,8 @@ class XeenEngine : public Engine {
static Common::String printMil(uint value);

static Common::String printK(uint value);

static Common::String printK2(uint value);
};

} // End of namespace Xeen
Expand Down

0 comments on commit ee5b8ed

Please sign in to comment.