]> git.localhorst.tv Git - l2e.git/blobdiff - src/battle/BattleState.cpp
added simple damage calculation formula
[l2e.git] / src / battle / BattleState.cpp
index 3dea5b4c5f40c9cad6f88ce6055df1d90ae0b84e..e72fbf94fc6c17b2a441881ed38de540d7fa9539 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:
@@ -289,19 +289,30 @@ void BattleState::NextAttack() {
 
 void BattleState::CalculateDamage() {
        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);
+               for (int i(0); i < NumHeroes(); ++i) {
+                       if (HeroAt(i).Health() > 0) {
+                               const Stats &defenderStats(HeroAt(i).GetStats());
+                               Uint16 damage(CalculateDamage(attackerStats, defenderStats));
+                               monsterAttacks[CurrentAttack().index].Selection().SetBad(0, damage);
+                               break;
+                       }
+               }
        } else {
+               const Stats &attackerStats(HeroAt(CurrentAttack().index).GetStats());
                TargetSelection &ts(AttackChoiceAt(CurrentAttack().index).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 +322,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 +332,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 +344,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 +354,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));