From: Daniel Karbach Date: Fri, 25 Jan 2013 16:14:26 +0000 (+0100) Subject: added advantage turn checking in MapState X-Git-Url: http://git.localhorst.tv/?p=l2e.git;a=commitdiff_plain;h=d7d5ff97b2e4136141f5603d0ec9cef1d4467749 added advantage turn checking in MapState refs #26 --- diff --git a/src/map/MapState.cpp b/src/map/MapState.cpp index 2ae4bb3..ca1dafb 100644 --- a/src/map/MapState.cpp +++ b/src/map/MapState.cpp @@ -298,29 +298,6 @@ bool MapState::CheckMonster() { for (int i(0); i < 4; ++i) { for (std::vector::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; diff --git a/src/map/MapState.h b/src/map/MapState.h index 09ba357..2465ddf 100644 --- a/src/map/MapState.h +++ b/src/map/MapState.h @@ -71,6 +71,7 @@ private: void LockEntities(); bool CheckMonster(); + void LoadBattle(Entity &hero, Entity &monster); bool CheckLockTrigger(); bool CheckMoveTrigger();