-/*
- * MapState.h
- *
- * Created on: Sep 29, 2012
- * Author: holy
- */
-
#ifndef MAP_MAPSTATE_H_
#define MAP_MAPSTATE_H_
+namespace common {
+ struct GameConfig;
+}
+namespace map {
+ class Map;
+ class Trigger;
+}
+
#include "Entity.h"
-#include "fwd.h"
#include "../app/State.h"
-#include "../geometry/Vector.h"
+#include "../app/Timer.h"
+#include "../common/ScriptHost.h"
+#include "../common/ScriptRunner.h"
+#include "../math/Fixed.h"
+#include "../math/Vector.h"
#include "../graphics/Camera.h"
#include <vector>
namespace map {
+/// Shows a map and its entities an optionally control a single entity.
class MapState
-: public app::State {
+: public app::State
+, public common::ScriptHost {
public:
- explicit MapState(Map *);
+ explicit MapState(common::GameConfig *, Map *);
virtual ~MapState() { }
public:
- virtual void EnterState(app::Application &ctrl, SDL_Surface *screen);
- virtual void ExitState(app::Application &ctrl, SDL_Surface *screen);
- virtual void ResumeState(app::Application &ctrl, SDL_Surface *screen);
- virtual void PauseState(app::Application &ctrl, SDL_Surface *screen);
- virtual void Resize(int width, int height);
-
virtual void HandleEvents(const app::Input &);
- virtual void UpdateWorld(float deltaT);
+ virtual void UpdateWorld(Uint32 deltaT);
virtual void Render(SDL_Surface *);
public:
void AddEntity(Entity *e) { entities.push_back(e); }
- void ControlEntity(Entity *e) { controlled = e; camera.SetTarget(&e->Position()); }
+ void ControlEntity(Entity *e) { controlled = e; TrackControlled(); }
+ void Track(math::Vector<math::Fixed<8> > *t) { camera.SetTarget(t); }
+ void TrackControlled() { if (controlled) Track(&controlled->Position()); }
+
+ math::Vector<math::Fixed<8> > TrackPoint() const { return *camera.GetTarget(); }
+
+ void SetWalkingSpeed(math::Fixed<8> s) { walkingSpeed = s; }
+
+ void Transition(Map *, const math::Vector<int> &coordinates);
+
+ virtual void HandleSyscall(common::ScriptRunner &);
- void SetWalkingSpeed(float s) { walkingSpeed = s; }
+ const graphics::Camera &GetCamera() const { return camera; }
+ Map *GetMap() { return map; }
+
+private:
+ virtual void OnEnterState(SDL_Surface *screen);
+ virtual void OnExitState(SDL_Surface *screen);
+ virtual void OnResumeState(SDL_Surface *screen);
+ virtual void OnPauseState(SDL_Surface *screen);
+
+ virtual void OnResize(int width, int height);
private:
static bool ZCompare(const Entity *lhs, const Entity *rhs);
- void OnGridLock();
- void OnMove();
+
+ void UnloadMap();
+ void LoadMap(Map *);
+
+ bool CheckBlocking();
+ bool CheckBlocking(const math::Vector<int> &position, Entity::Orientation direction) const;
+
+ void OnTileLock();
+ bool OnGridLock();
+ void OnMove(bool);
+
+ void UpdateFollower(Entity &);
+ void StopFollowers(Entity &);
+
+ void LockEntities();
+ bool CheckMonster();
+ void LoadBattle(Entity &hero, Entity &monster);
+
+ bool CheckLockTrigger();
+ bool CheckMoveTrigger();
+ void RunTrigger(Trigger &);
+
+ enum Syscalls {
+ TRANSITION = 1,
+ WARP = 2,
+ };
private:
+ common::GameConfig *game;
Map *map;
Entity *controlled;
- geometry::Vector<float> tempTarget;
- geometry::Vector<int> lastLock;
+ Entity *pushed;
+ common::ScriptRunner runner;
+ app::Timer<Uint32> moveTimer;
+ math::Vector<int> lastLock;
graphics::Camera camera;
std::vector<Entity *> entities;
- float walkingSpeed;
+ math::Fixed<8> walkingSpeed;
+ app::Timer<Uint32> tileAnimation;
int nextDirection;
bool afterLock;
+ bool skipLock;
+ bool pushing;
+ bool debug;
};
}
-#endif /* MAP_MAPSTATE_H_ */
+#endif