]> git.localhorst.tv Git - l2e.git/blobdiff - src/battle/BattleState.cpp
added support for defend action in damage calculation
[l2e.git] / src / battle / BattleState.cpp
index 3dea5b4c5f40c9cad6f88ce6055df1d90ae0b84e..7ea17d82c4e0c29f99e19444baf5fff338331b1b 100644 (file)
@@ -254,8 +254,8 @@ class OrderCompare {
        public:
                OrderCompare(BattleState *battle) : battle(battle) { }
                bool operator ()(const BattleState::Order &lhs, const BattleState::Order &rhs) {
-                       int lagl(lhs.isMonster ? battle->MonsterAt(lhs.index).Agility() : battle->HeroAt(lhs.index).Agility());
-                       int ragl(rhs.isMonster ? battle->MonsterAt(rhs.index).Agility() : battle->HeroAt(rhs.index).Agility());
+                       int lagl(lhs.isMonster ? battle->MonsterAt(lhs.index).GetStats().Agility() : battle->HeroAt(lhs.index).GetStats().Agility());
+                       int ragl(rhs.isMonster ? battle->MonsterAt(rhs.index).GetStats().Agility() : battle->HeroAt(rhs.index).GetStats().Agility());
                        return lagl > ragl;
                }
        private:
@@ -288,20 +288,34 @@ void BattleState::NextAttack() {
 }
 
 void BattleState::CalculateDamage() {
+       AttackChoice &ac(CurrentAttack().isMonster ? monsterAttacks[CurrentAttack().index] : AttackChoiceAt(CurrentAttack().index));
+       if (ac.GetType() == AttackChoice::DEFEND) return;
+
        if (CurrentAttack().isMonster) {
+               const Stats &attackerStats(MonsterAt(CurrentAttack().index).GetStats());
                // TODO: run monster's attack script
-               monsterAttacks[CurrentAttack().index].SetType(AttackChoice::SWORD);
-               monsterAttacks[CurrentAttack().index].Selection().SelectSingle();
-               monsterAttacks[CurrentAttack().index].Selection().SelectHeroes();
-               monsterAttacks[CurrentAttack().index].Selection().SetBad(0, 15);
+               ac.SetType(AttackChoice::SWORD);
+               ac.Selection().SelectSingle();
+               ac.Selection().SelectHeroes();
+               for (int i(0); i < NumHeroes(); ++i) {
+                       if (HeroAt(i).Health() > 0) {
+                               const Stats &defenderStats(HeroAt(i).GetStats());
+                               Uint16 damage(CalculateDamage(attackerStats, defenderStats));
+                               ac.Selection().SetBad(0, damage);
+                               break;
+                       }
+               }
        } else {
-               TargetSelection &ts(AttackChoiceAt(CurrentAttack().index).Selection());
+               const Stats &attackerStats(HeroAt(CurrentAttack().index).GetStats());
+               TargetSelection &ts(ac.Selection());
                bool hitSome(false);
                if (ts.TargetsEnemies()) {
                        for (int i(0); i < MaxMonsters(); ++i) {
                                if (ts.IsSelected(i)) {
                                        if (MonsterAt(i).Health() > 0) {
-                                               ts.SetBad(i, 15);
+                                               const Stats &defenderStats(MonsterAt(i).GetStats());
+                                               Uint16 damage(CalculateDamage(attackerStats, defenderStats));
+                                               ts.SetBad(i, damage);
                                                hitSome = true;
                                        } else {
                                                ts.Unselect(i);
@@ -311,7 +325,9 @@ void BattleState::CalculateDamage() {
                        if (hitSome) return;
                        for (int i(0); i < MaxMonsters(); ++i) {
                                if (MonsterAt(i).Health() > 0) {
-                                       ts.SetBad(i, 15);
+                                       const Stats &defenderStats(MonsterAt(i).GetStats());
+                                       Uint16 damage(CalculateDamage(attackerStats, defenderStats));
+                                       ts.SetBad(i, damage);
                                        break;
                                }
                        }
@@ -319,7 +335,9 @@ void BattleState::CalculateDamage() {
                        for (int i(0); i < NumHeroes(); ++i) {
                                if (ts.IsSelected(i)) {
                                        if (HeroAt(i).Health() > 0) {
-                                               ts.SetBad(i, 15);
+                                               const Stats &defenderStats(HeroAt(i).GetStats());
+                                               Uint16 damage(CalculateDamage(attackerStats, defenderStats));
+                                               ts.SetBad(i, damage);
                                                hitSome = true;
                                        } else {
                                                ts.Unselect(i);
@@ -329,7 +347,9 @@ void BattleState::CalculateDamage() {
                        if (hitSome) return;
                        for (int i(0); i < NumHeroes(); ++i) {
                                if (HeroAt(i).Health() > 0) {
-                                       ts.SetBad(i, 15);
+                                       const Stats &defenderStats(HeroAt(i).GetStats());
+                                       Uint16 damage(CalculateDamage(attackerStats, defenderStats));
+                                       ts.SetBad(i, damage);
                                        break;
                                }
                        }
@@ -337,6 +357,11 @@ void BattleState::CalculateDamage() {
        }
 }
 
+Uint16 BattleState::CalculateDamage(const Stats &attacker, const Stats &defender) const {
+       // TODO: find out real formula and add some randomness
+       return attacker.Attack() / 2 - defender.Defense() / 4;
+}
+
 void BattleState::ApplyDamage() {
        if (attackCursor < 0) return;
        AttackChoice &ac(CurrentAttack().isMonster ? monsterAttacks[CurrentAttack().index] : AttackChoiceAt(CurrentAttack().index));