aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/wage/combat.cpp60
-rw-r--r--engines/wage/wage.cpp1
-rw-r--r--engines/wage/wage.h3
3 files changed, 63 insertions, 1 deletions
diff --git a/engines/wage/combat.cpp b/engines/wage/combat.cpp
index be765a8488..5a9426c9c2 100644
--- a/engines/wage/combat.cpp
+++ b/engines/wage/combat.cpp
@@ -177,8 +177,66 @@ void WageEngine::performCombatAction(Chr *npc, Chr *player) {
delete magics;
}
+const char *targets[] = { "head", "chest", "side" };
+
void WageEngine::performAttack(Chr *attacker, Chr *victim, Obj *weapon) {
- warning("STUB: performAttack()");
+ if (_world->_weaponMenuDisabled)
+ return;
+
+ // TODO: verify that a player not aiming will always target the chest??
+ int targetIndex = -1;
+ char buf[256];
+
+ if (weapon->_type != Obj::MAGICAL_OBJECT) {
+ if (attacker->_playerCharacter) {
+ targetIndex = _aim;
+ } else {
+ targetIndex = _rnd->getRandomNumber(ARRAYSIZE(targets) - 1);
+ _opponentAim = targetIndex + 1;
+ }
+
+ if (!attacker->_playerCharacter) {
+ snprintf(buf, 256, "%s%s %ss %s%s at %s%s's %s.",
+ attacker->getDefiniteArticle(true), attacker->_name.c_str(),
+ weapon->_operativeVerb.c_str(),
+ prependGenderSpecificPronoun(attacker->_gender), weapon->_name.c_str(),
+ victim->getDefiniteArticle(true), victim->_name.c_str(),
+ targets[targetIndex]);
+ appendText(buf);
+ }
+ } else if (!attacker->_playerCharacter) {
+ snprintf(buf, 256, "%s%s %ss %s%s at %s%s.",
+ attacker->getDefiniteArticle(true), attacker->_name.c_str(),
+ weapon->_operativeVerb.c_str(),
+ prependGenderSpecificPronoun(attacker->_gender), weapon->_name.c_str(),
+ victim->getDefiniteArticle(true), victim->_name.c_str());
+ appendText(buf);
+ }
+
+ playSound(weapon->_sound);
+
+ bool usesDecremented = false;
+ int chance = _rnd->getRandomNumber(255);
+ // TODO: what about obj accuracy
+ if (chance < attacker->_physicalAccuracy) {
+ usesDecremented = attackHit(attacker, victim, weapon, targetIndex);
+ } else if (weapon->_type != Obj::MAGICAL_OBJECT) {
+ appendText((char *)"A miss!");
+ } else if (attacker->_playerCharacter) {
+ appendText((char *)"The spell has no effect.");
+ }
+
+ if (!usesDecremented) {
+ decrementUses(weapon);
+ }
+}
+
+void WageEngine::decrementUses(Obj *obj) {
+ warning("STUB: decrementUses()");
+}
+
+bool WageEngine::attackHit(Chr *attacker, Chr *victim, Obj *weapon, int targetIndex) {
+ warning("STUB: attackHit");
}
void WageEngine::performMagic(Chr *attacker, Chr *victim, Obj *magicalObject) {
diff --git a/engines/wage/wage.cpp b/engines/wage/wage.cpp
index 620f1b5bb9..7815ee0e06 100644
--- a/engines/wage/wage.cpp
+++ b/engines/wage/wage.cpp
@@ -64,6 +64,7 @@ WageEngine::WageEngine(OSystem *syst, const ADGameDescription *desc) : Engine(sy
_rnd = new Common::RandomSource("wage");
_aim = -1;
+ _opponentAim = -1;
_temporarilyHidden = false;
_isGameOver = false;
_monster = NULL;
diff --git a/engines/wage/wage.h b/engines/wage/wage.h
index fa52c2440e..1a0fe765b0 100644
--- a/engines/wage/wage.h
+++ b/engines/wage/wage.h
@@ -135,6 +135,8 @@ private:
void performMove(Chr *chr, int validMoves);
void performOffer(Chr *attacker, Chr *victim);
void performTake(Chr *npc, Obj *obj);
+ void decrementUses(Obj *obj);
+ bool attackHit(Chr *attacker, Chr *victim, Obj *weapon, int targetIndex);
void doClose();
@@ -151,6 +153,7 @@ public:
Chr *_running;
Obj *_offer;
int _aim;
+ int _opponentAim;
bool _temporarilyHidden;
bool _isGameOver;
bool _commandWasQuick;