#include "Map.h"
#include "Tile.h"
+#include "TransitionState.h"
#include "Trigger.h"
#include "../app/Application.h"
#include "../app/Input.h"
+#include "../graphics/ColorFade.h"
#include <algorithm>
using app::Application;
using app::Input;
using geometry::Vector;
+using graphics::ColorFade;
namespace map {
MapState::MapState(Map *map)
-: map(map)
+: ctrl(0)
+, map(map)
, controlled(0)
, tempTarget(20, 20)
, camera(100, 100, &tempTarget)
}
-void MapState::EnterState(Application &ctrl, SDL_Surface *screen) {
+void MapState::EnterState(Application &c, SDL_Surface *screen) {
+ ctrl = &c;
camera.Resize(screen->w, screen->h);
+ LoadMap(map);
}
void MapState::ExitState(Application &ctrl, SDL_Surface *screen) {
}
bool MapState::CheckBlocking() const {
- const Tile &tile(map->TileAt(controlled->Position()));
+ const Tile *tile(map->TileAt(controlled->Position()));
+ if (!tile) {
+ return false;
+ }
Vector<int> nextPosition;
switch (nextDirection) {
case Entity::ORIENTATION_NORTH:
- if (tile.BlocksNorth()) {
+ if (tile->BlocksNorth()) {
return true;
} else {
nextPosition = Vector<int>(
}
break;
case Entity::ORIENTATION_EAST:
- if (tile.BlocksEast()) {
+ if (tile->BlocksEast()) {
return true;
} else {
nextPosition = Vector<int>(
}
break;
case Entity::ORIENTATION_SOUTH:
- if (tile.BlocksSouth()) {
+ if (tile->BlocksSouth()) {
return true;
} else {
nextPosition = Vector<int>(
}
break;
case Entity::ORIENTATION_WEST:
- if (tile.BlocksWest()) {
+ if (tile->BlocksWest()) {
return true;
} else {
nextPosition = Vector<int>(
if (trigger) {
// TODO: run trigger script
if (trigger->map) {
- Transition(trigger->map, trigger->target);
+ ctrl->PushState(new ColorFade(this, 0, 500, true));
+ ctrl->PushState(new TransitionState(this, trigger->map, trigger->target));
+ ctrl->PushState(new ColorFade(this, 0, 500, false));
}
}
void MapState::Transition(Map *newMap, const Vector<int> &coordinates) {
+ UnloadMap();
Vector<int> position(coordinates * map->Tileset()->Size());
- entities.clear();
for (Entity *e(controlled); e; e = e->Follower()) {
e->Position() = position;
e->SetOrientation(controlled->GetOrientation());
- entities.push_back(e);
}
- map = newMap;
+ LoadMap(newMap);
skipLock = true;
}
+void MapState::UnloadMap() {
+ entities.clear();
+}
+
+void MapState::LoadMap(Map *m) {
+ map = m;
+ entities.insert(entities.end(), m->EntitiesBegin(), m->EntitiesEnd());
+ for (Entity *e(controlled); e; e = e->Follower()) {
+ entities.push_back(e);
+ }
+}
+
void MapState::Render(SDL_Surface *screen) {
SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));