X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmap%2FMapState.cpp;h=b8b5eb629d8601a2de2ce2a4a03044df9b28fcad;hb=5f9a1893c0db8f53889a390e4c4b95d57abd4384;hp=2ae4bb362082c00a62fb3c0a6f70404cd7d56a92;hpb=667e1d9c6a78d0b608b518a4e5b5c31bc30e4e89;p=l2e.git diff --git a/src/map/MapState.cpp b/src/map/MapState.cpp index 2ae4bb3..b8b5eb6 100644 --- a/src/map/MapState.cpp +++ b/src/map/MapState.cpp @@ -44,6 +44,7 @@ MapState::MapState(GameConfig *g, Map *map) void MapState::OnEnterState(SDL_Surface *screen) { camera.Resize(screen->w, screen->h); + tileAnimation = GraphicsTimers().StartInterval(512); LoadMap(map); } @@ -298,30 +299,8 @@ 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 + LoadBattle(*controlled, **e); entities.erase(e); return true; } @@ -330,6 +309,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; @@ -432,7 +464,7 @@ void MapState::Render(SDL_Surface *screen) { SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0)); Vector offset(camera.CalculateOffset()); - map->Render(screen, offset); + map->Render(screen, offset, tileAnimation.Iteration()); if (debug) { map->RenderDebug(screen, offset);