]> git.localhorst.tv Git - l2e.git/blobdiff - src/map/MapState.cpp
added temporary map transition implementation
[l2e.git] / src / map / MapState.cpp
index 98e9b2848b5a947f2643d1257ade0a17375ee732..8c5ef6bcf1c53ec612c3ba86d043b003127563b8 100644 (file)
@@ -9,6 +9,7 @@
 
 #include "Map.h"
 #include "Tile.h"
+#include "Trigger.h"
 #include "../app/Application.h"
 #include "../app/Input.h"
 
@@ -27,7 +28,9 @@ MapState::MapState(Map *map)
 , camera(100, 100, &tempTarget)
 , walkingSpeed(64)
 , nextDirection(-1)
-, afterLock(false) {
+, afterLock(false)
+, skipLock(false)
+, debug(false) {
 
 }
 
@@ -67,6 +70,10 @@ void MapState::HandleEvents(const Input &input) {
        } else {
                nextDirection = -1;
        }
+
+       if (input.JustPressed(Input::DEBUG_1)) {
+               debug = !debug;
+       }
 }
 
 void MapState::UpdateWorld(float deltaT) {
@@ -178,13 +185,13 @@ bool MapState::CheckBlocking() const {
 }
 
 void MapState::OnGridLock() {
-       LockEntities();
-       Trigger *trigger(map->TriggerAt(Vector<int>(controlled->Position())));
-       if (trigger) {
-               // TODO: run trigger
+       if (skipLock) {
+               skipLock = false;
+       } else {
+               LockEntities();
+               CheckMonster();
+               CheckTrigger();
        }
-       // TODO: check for adjacent monsters
-       // TODO: force all entities into their grid positions?
 }
 
 void MapState::LockEntities() {
@@ -197,6 +204,39 @@ void MapState::LockEntities() {
        }
 }
 
+void MapState::CheckMonster() {
+       Vector<int> coords(map->TileCoordinates(controlled->Position()));
+       Vector<int> neighbor[4];
+       neighbor[0] = Vector<int>(coords.X(), coords.Y() - 1); // N
+       neighbor[1] = Vector<int>(coords.X() + 1, coords.Y()); // E
+       neighbor[2] = Vector<int>(coords.X(), coords.Y() + 1); // S
+       neighbor[3] = Vector<int>(coords.X() - 1, coords.Y()); // W
+
+       for (int i(0); i < 4; ++i) {
+               for (std::vector<Entity *>::iterator e(entities.begin()), end(entities.end()); e != end; ++e) {
+                       if ((*e)->Hostile() && map->TileCoordinates((*e)->Position()) == neighbor[i]) {
+                               // TODO: check for turn advantage, see #26
+                               // TODO: remove entity, push battle state and transition and halt all other activity
+                               // needed information here:
+                               //  - battle background (from tile?)
+                               //  - monsters + layout (from entity)
+                               //  - battle resources (from global resources)
+                       }
+               }
+       }
+}
+
+void MapState::CheckTrigger() {
+       Trigger *trigger(map->TriggerAt(Vector<int>(controlled->Position())));
+       if (trigger) {
+               // TODO: run trigger script
+               if (trigger->map) {
+                       Transition(trigger->map, trigger->target);
+               }
+       }
+
+}
+
 void MapState::OnMove(bool realMove) {
        // TODO: evaluate monster movements
        if (realMove) {
@@ -246,12 +286,29 @@ void MapState::StopFollowers(Entity &e) {
 }
 
 
+void MapState::Transition(Map *newMap, const Vector<int> &coordinates) {
+       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;
+       skipLock = true;
+}
+
+
 void MapState::Render(SDL_Surface *screen) {
        SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
 
        Vector<int> offset(camera.CalculateOffset());
        map->Render(screen, offset);
 
+       if (debug) {
+               map->RenderDebug(screen, offset);
+       }
+
        std::sort(entities.begin(), entities.end(), ZCompare);
        for (std::vector<Entity *>::iterator i(entities.begin()), end(entities.end()); i != end; ++i) {
                (*i)->Render(screen, offset);