]> git.localhorst.tv Git - l2e.git/commitdiff
added advantage turn checking in MapState
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 25 Jan 2013 16:14:26 +0000 (17:14 +0100)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 25 Jan 2013 16:20:49 +0000 (17:20 +0100)
refs #26

src/map/MapState.cpp
src/map/MapState.h

index 2ae4bb362082c00a62fb3c0a6f70404cd7d56a92..ca1dafb0542691556627858c482d755de24005ee 100644 (file)
@@ -298,29 +298,6 @@ bool MapState::CheckMonster() {
        for (int i(0); i < 4; ++i) {
                for (std::vector<Entity *>::iterator e(entities.begin()), end(entities.end()); e != end; ++e) {
                        if ((*e)->Hostile() && map->TileCoordinates(ToInt((*e)->Position())) == neighbor[i]) {
-                               // TODO: check for turn advantage, see #26
-                               // TODO: other transition
-                               BattleState *battleState(new BattleState(game, map->BattleBackgroundAt(ToInt((*e)->Position())), (*e)->PartyLayout()));
-                               for (int i(0); i < 4; ++i) {
-                                       if (game->state->party[i]) {
-                                               battleState->AddHero(*game->state->party[i]);
-                                       }
-                               }
-                               if (game->state->capsule) {
-                                       battleState->SetCapsule(&game->state->GetCapsule());
-                               }
-                               for (battle::Monster **monster((*e)->MonstersBegin()); monster != (*e)->MonstersEnd(); ++monster) {
-                                       battleState->AddMonster(**monster);
-                               }
-
-                               ColorFade *fadeIn(new ColorFade(this, 0, 500, true));
-                               fadeIn->SetLeadInTime(500);
-                               ColorFade *fadeOut(new ColorFade(this, 0, 500));
-                               fadeOut->SetLeadOutTime(500);
-
-                               Ctrl().PushState(fadeIn);
-                               Ctrl().PushState(battleState);
-                               Ctrl().PushState(fadeOut);
                                // TODO: move entity erase to happen after the transition or battle
                                entities.erase(e);
                                return true;
@@ -330,6 +307,59 @@ bool MapState::CheckMonster() {
        return false;
 }
 
+void MapState::LoadBattle(Entity &hero, Entity &monster) {
+       SDL_Surface *bg = map->BattleBackgroundAt(ToInt(monster.Position()));
+       BattleState *battleState(new BattleState(game, bg, monster.PartyLayout()));
+       for (int i(0); i < 4; ++i) {
+               if (game->state->party[i]) {
+                       battleState->AddHero(*game->state->party[i]);
+               }
+       }
+       if (game->state->capsule) {
+               battleState->SetCapsule(&game->state->GetCapsule());
+       }
+       for (battle::Monster **m(monster.MonstersBegin()); m != monster.MonstersEnd(); ++m) {
+               battleState->AddMonster(**m);
+       }
+
+       // TODO: pass turn advantage to battle, see #26
+       Entity::Orientation faceDirection;
+       if (monster.Position().Y() < hero.Position().Y()) {
+               faceDirection = Entity::ORIENTATION_NORTH;
+       } else if (monster.Position().X() > hero.Position().X()) {
+               faceDirection = Entity::ORIENTATION_EAST;
+       } else if (monster.Position().Y() > hero.Position().Y()) {
+               faceDirection = Entity::ORIENTATION_SOUTH;
+       } else {
+               faceDirection = Entity::ORIENTATION_WEST;
+       }
+       if (hero.GetOrientation() == monster.GetOrientation()
+                       && hero.GetOrientation() == faceDirection) {
+               // advantage hero
+       } else if (hero.GetOrientation() == monster.GetOrientation()
+                       && hero.GetOrientation() == ((faceDirection + 2) % 4)) {
+               // advantage monster
+       } else if (((monster.GetOrientation() == faceDirection && (hero.GetOrientation() % 2) != (faceDirection % 2))
+                       || (hero.GetOrientation() == faceDirection && (monster.GetOrientation() % 2) != (faceDirection % 2)))
+                       && rand() % 2) {
+               // 50% advantage chance hero
+       } else if ((monster.GetOrientation() == (faceDirection + 2) % 4)
+                       && ((hero.GetOrientation() % 2) != (faceDirection % 2))
+                       && rand() % 2) {
+               // 50% advantage chance monster
+       }
+
+       // TODO: other transition
+       ColorFade *fadeIn(new ColorFade(this, 0, 500, true));
+       fadeIn->SetLeadInTime(500);
+       ColorFade *fadeOut(new ColorFade(this, 0, 500));
+       fadeOut->SetLeadOutTime(500);
+
+       Ctrl().PushState(fadeIn);
+       Ctrl().PushState(battleState);
+       Ctrl().PushState(fadeOut);
+}
+
 bool MapState::CheckLockTrigger() {
        Trigger *trigger(map->TriggerAt(ToInt(controlled->Position())));
        if (!trigger || trigger->GetType() != Trigger::TYPE_CONTACT) return false;
index 09ba35780b74f8dbb70ea52afb00c757bbd82b12..2465ddf3526ea80e72ca7683388d02d49c2a3ed3 100644 (file)
@@ -71,6 +71,7 @@ private:
 
        void LockEntities();
        bool CheckMonster();
+       void LoadBattle(Entity &hero, Entity &monster);
 
        bool CheckLockTrigger();
        bool CheckMoveTrigger();