X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmap%2FMapState.cpp;h=9bae990ce6d72c053ce1b252a48a121cf49d0f67;hb=0911d263c10cca314305799d5b839ee9653cac0b;hp=baefdc5ef59c91e5095bc0999dcd14e95125549f;hpb=c49d46cbfbd7720627af2414e94963850fe8eed6;p=l2e.git diff --git a/src/map/MapState.cpp b/src/map/MapState.cpp index baefdc5..9bae990 100644 --- a/src/map/MapState.cpp +++ b/src/map/MapState.cpp @@ -118,17 +118,19 @@ void MapState::OnTileLock() { return; } + const Tile *tile(map->TileAt(nowLock)); + if (nextDirection >= 0) { if (afterLock) { bool blocked(CheckBlocking()); OnMove(!blocked); - controlled->SetOrientation(Entity::Orientation(nextDirection)); + controlled->SetDirection(Entity::Orientation(nextDirection)); if (!blocked) { afterLock = false; controlled->SetSpeed(walkingSpeed); moveTimer.Clear(); if (pushed) { - pushed->SetOrientation(Entity::Orientation(nextDirection)); + pushed->SetDirection(Entity::Orientation(nextDirection)); pushed->SetSpeed(walkingSpeed); controlled->SetPushing(); } else { @@ -138,7 +140,7 @@ void MapState::OnTileLock() { controlled->SetSpeed(0); StopFollowers(*controlled); if (!moveTimer.Running()) { - int tileSize((controlled->GetOrientation() % 2) ? map->Tileset()->Width() : map->Tileset()->Height()); + int tileSize((controlled->GetDirection() % 2) ? map->Tileset()->Width() : map->Tileset()->Height()); Fixed<8> walkingInterval(tileSize); walkingInterval /= walkingSpeed; moveTimer = PhysicsTimers().StartInterval(walkingInterval.Int()); @@ -160,6 +162,11 @@ void MapState::OnTileLock() { } } + if (controlled->GetDirection() == Entity::ORIENTATION_SOUTH + && tile && tile->IsLadder()) { + controlled->SetOrientation(Entity::ORIENTATION_NORTH); + } + lastLock = nowLock; } @@ -291,30 +298,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; } @@ -323,6 +308,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; @@ -365,19 +403,19 @@ void MapState::UpdateFollower(Entity &e) { Vector direction(coords - fCoords); if (direction.Y() < 0) { - f.SetOrientation(Entity::ORIENTATION_NORTH); + f.SetDirection(Entity::ORIENTATION_NORTH); f.SetSpeed(walkingSpeed); f.StartAnimation(*this); } else if (direction.X() > 0) { - f.SetOrientation(Entity::ORIENTATION_EAST); + f.SetDirection(Entity::ORIENTATION_EAST); f.SetSpeed(walkingSpeed); f.StartAnimation(*this); } else if (direction.Y() > 0) { - f.SetOrientation(Entity::ORIENTATION_SOUTH); + f.SetDirection(Entity::ORIENTATION_SOUTH); f.SetSpeed(walkingSpeed); f.StartAnimation(*this); } else if (direction.X() < 0) { - f.SetOrientation(Entity::ORIENTATION_WEST); + f.SetDirection(Entity::ORIENTATION_WEST); f.SetSpeed(walkingSpeed); f.StartAnimation(*this); } else { @@ -399,7 +437,7 @@ void MapState::Transition(Map *newMap, const Vector &coordinates) { Vector position(coordinates * map->Tileset()->Size()); for (Entity *e(controlled); e; e = e->Follower()) { e->Position() = position; - e->SetOrientation(controlled->GetOrientation()); + e->SetDirection(controlled->GetDirection()); } LoadMap(newMap); skipLock = true;