]> git.localhorst.tv Git - l2e.git/commitdiff
added checks for vitory/defeat condition
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Sun, 19 Aug 2012 18:27:32 +0000 (20:27 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Sun, 19 Aug 2012 18:27:32 +0000 (20:27 +0200)
src/battle/BattleState.cpp
src/battle/BattleState.h
src/battle/TargetSelection.cpp

index be3c9705d712ee8f03f790c3f2989959b571f237..3dea5b4c5f40c9cad6f88ce6055df1d90ae0b84e 100644 (file)
@@ -213,6 +213,16 @@ void BattleState::ResumeState(Application &ctrl, SDL_Surface *screen) {
                ctrl.PopState(); // quit the battle scene
                return;
        }
+       if (Victory()) {
+               // TODO: push victory state
+               ctrl.PopState();
+               return;
+       }
+       if (Defeat()) {
+               // TODO: push defeat state
+               ctrl.PopState();
+               return;
+       }
        // TODO: this should not push a state while quitting
        if (AttackSelectionDone()) {
                ctrl.PushState(new PerformAttacks(this));
@@ -221,6 +231,20 @@ void BattleState::ResumeState(Application &ctrl, SDL_Surface *screen) {
        }
 }
 
+bool BattleState::Victory() const {
+       for (int i(0); i < MaxMonsters(); ++i) {
+               if (MonsterAt(i).Health() > 0) return false;
+       }
+       return true;
+}
+
+bool BattleState::Defeat() const {
+       for (int i(0); i < NumHeroes(); ++i) {
+               if (HeroAt(i).Health() > 0) return false;
+       }
+       return true;
+}
+
 void BattleState::PauseState(Application &ctrl, SDL_Surface *screen) {
 
 }
@@ -272,16 +296,41 @@ void BattleState::CalculateDamage() {
                monsterAttacks[CurrentAttack().index].Selection().SetBad(0, 15);
        } else {
                TargetSelection &ts(AttackChoiceAt(CurrentAttack().index).Selection());
+               bool hitSome(false);
                if (ts.TargetsEnemies()) {
                        for (int i(0); i < MaxMonsters(); ++i) {
-                               if (ts.IsSelected(i) && MonsterAt(i).Health() > 0) {
+                               if (ts.IsSelected(i)) {
+                                       if (MonsterAt(i).Health() > 0) {
+                                               ts.SetBad(i, 15);
+                                               hitSome = true;
+                                       } else {
+                                               ts.Unselect(i);
+                                       }
+                               }
+                       }
+                       if (hitSome) return;
+                       for (int i(0); i < MaxMonsters(); ++i) {
+                               if (MonsterAt(i).Health() > 0) {
                                        ts.SetBad(i, 15);
+                                       break;
                                }
                        }
                } else {
                        for (int i(0); i < NumHeroes(); ++i) {
-                               if (ts.IsSelected(i) && HeroAt(i).Health() > 0) {
+                               if (ts.IsSelected(i)) {
+                                       if (HeroAt(i).Health() > 0) {
+                                               ts.SetBad(i, 15);
+                                               hitSome = true;
+                                       } else {
+                                               ts.Unselect(i);
+                                       }
+                               }
+                       }
+                       if (hitSome) return;
+                       for (int i(0); i < NumHeroes(); ++i) {
+                               if (HeroAt(i).Health() > 0) {
                                        ts.SetBad(i, 15);
+                                       break;
                                }
                        }
                }
@@ -300,7 +349,7 @@ void BattleState::ApplyDamage() {
                }
        } else {
                for (int i(0); i < NumHeroes(); ++i) {
-                       if (ts.IsSelected(i) && MonsterAt(i).Health() > 0) {
+                       if (ts.IsBad(i)) {
                                HeroAt(i).SubtractHealth(ts.GetAmount(i));
                        }
                }
@@ -345,7 +394,9 @@ void BattleState::RenderBackground(SDL_Surface *screen, const Vector<int> &offse
 
 void BattleState::RenderMonsters(SDL_Surface *screen, const Vector<int> &offset) {
        for (vector<Monster>::size_type i(0), end(monsters.size()); i < end; ++i) {
-               monsters[i].Sprite()->DrawCenter(screen, monsterPositions[i] + offset);
+               if (MonsterPositionOccupied(i)) {
+                       monsters[i].Sprite()->DrawCenter(screen, monsterPositions[i] + offset);
+               }
        }
 }
 
index 45c43f9c70a27387e20cc65b48fb9a39033fc0d9..7d65c14a23d8a1d08890ac0d7c52a4512351287c 100644 (file)
@@ -134,6 +134,9 @@ public:
        const Order &CurrentAttack() const { return attackOrder[attackCursor]; };
        void ClearAllAttacks();
 
+       bool Victory() const;
+       bool Defeat() const;
+
 public:
        geometry::Vector<int> CalculateScreenOffset(SDL_Surface *screen) const {
                return geometry::Vector<int>(
index 2608e3976d6def49126654de419d21316cd7073f..b24772d55937820732ad0b356f76ab5b13c55cf3 100644 (file)
@@ -89,8 +89,10 @@ void TargetSelection::MoveLeft() {
 }
 
 void TargetSelection::FindNextEnemy() {
+       int start(cursor);
        while (!battle->MonsterPositionOccupied(cursor)) {
                cursor = (cursor + battle->MonsterPositions().size() - 1) % battle->MonsterPositions().size();
+               if (cursor == start) break;
        }
 }