]> git.localhorst.tv Git - l2e.git/commitdiff
added directional triggers
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 12 Oct 2012 19:25:18 +0000 (21:25 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 12 Oct 2012 19:25:18 +0000 (21:25 +0200)
these are useful e.g. for implementing doors

refs #18

src/main.cpp
src/map/Map.cpp
src/map/MapState.cpp
src/map/MapState.h
src/map/Trigger.cpp
src/map/Trigger.h

index 26a85736b4eaf0442f53016524b15374960ae60d..beef2feba24a0a74497c282b4dcf112a1d832350 100644 (file)
@@ -417,6 +417,7 @@ int main(int argc, char **argv) {
 
                Trigger triggers1[1];
                triggers1[0].SetTilePosition(Vector<int>(8, 3));
+               triggers1[0].SetType(Trigger::TYPE_NORTH);
 
                SDL_Surface *tilesetImg(IMG_Load("test-data/tileset.png"));
                Sprite tileset(tilesetImg, tileSize, tileSize);
@@ -508,6 +509,7 @@ int main(int argc, char **argv) {
 
                Trigger triggers2[1];
                triggers2[0].SetTilePosition(Vector<int>(6, 2));
+               triggers2[0].SetType(Trigger::TYPE_SOUTH);
 
                Map map2;
                map2.SetAreas(areas2, 1);
index a9e11df7e9064627cb4388b0696e78eada8c92b8..be39ec371f3b47ef2b59014948900ad46d831f81 100644 (file)
@@ -11,6 +11,7 @@
 #include "Tile.h"
 #include "Trigger.h"
 #include "../graphics/Sprite.h"
+#include "../sdl/utility.h"
 
 #include <stdexcept>
 
@@ -122,12 +123,31 @@ void Map::RenderDebug(SDL_Surface *dest, const Vector<int> &inOffset) const {
        }
        for (int i(0); i < numTriggers; ++i) {
                Vector<int> offset((triggers[i].TilePosition() * tileset->Size()) + inOffset);
-               SDL_Rect destRect;
-               destRect.x = offset.X() + (tileset->Width() / 4);
-               destRect.y = offset.Y() + (tileset->Height() / 4);
-               destRect.w = tileset->Width() / 2;
-               destRect.h = tileset->Height() / 2;
-               SDL_FillRect(dest, &destRect, SDL_MapRGB(dest->format, 0x00, 0xFF, 0xFF));
+               switch (triggers[i].GetType()) {
+                       case Trigger::TYPE_NORTH:
+                               sdl::HorizontalLine(dest, offset + (tileset->Size() / 4), tileset->Width() / 2, SDL_MapRGB(dest->format, 0x00, 0xFF, 0xFF));
+                               break;
+                       case Trigger::TYPE_EAST:
+                               sdl::VerticalLine(dest, offset + Vector<int>(tileset->Width() * 3 / 4, tileset->Height() / 4), tileset->Height() / 2, SDL_MapRGB(dest->format, 0x00, 0xFF, 0xFF));
+                               break;
+                       case Trigger::TYPE_SOUTH:
+                               sdl::HorizontalLine(dest, offset + Vector<int>(tileset->Width() / 4, tileset->Height() * 3 / 4), tileset->Width() / 2, SDL_MapRGB(dest->format, 0x00, 0xFF, 0xFF));
+                               break;
+                       case Trigger::TYPE_WEST:
+                               sdl::VerticalLine(dest, offset + (tileset->Size() / 4), tileset->Width() / 2, SDL_MapRGB(dest->format, 0x00, 0xFF, 0xFF));
+                               break;
+                       case Trigger::TYPE_CONTACT: {
+                                       SDL_Rect destRect;
+                                       destRect.x = offset.X() + (tileset->Width() / 4);
+                                       destRect.y = offset.Y() + (tileset->Height() / 4);
+                                       destRect.w = tileset->Width() / 2;
+                                       destRect.h = tileset->Height() / 2;
+                                       SDL_FillRect(dest, &destRect, SDL_MapRGB(dest->format, 0x00, 0xFF, 0xFF));
+                               }
+                               break;
+                       case Trigger::TYPE_BUTTON:
+                               break;
+               }
        }
 }
 
index c1b34518f1dc49887afa545716aae248026ee1c6..a716f950e8f0977ebbf14cf456bf64bbf7997f1d 100644 (file)
@@ -265,7 +265,7 @@ bool MapState::OnGridLock() {
                return false;
        } else {
                LockEntities();
-               return CheckMonster() || CheckTrigger();
+               return CheckMonster() || CheckLockTrigger();
        }
 }
 
@@ -322,23 +322,17 @@ bool MapState::CheckMonster() {
        return false;
 }
 
-bool MapState::CheckTrigger() {
+bool MapState::CheckLockTrigger() {
        Trigger *trigger(map->TriggerAt(Vector<int>(controlled->Position())));
-       if (trigger) {
-               // TODO: run trigger script
-               if (trigger->map) {
-                       ctrl->PushState(new ColorFade(this, 0, 500, true));
-                       ctrl->PushState(new TransitionState(this, trigger->map, trigger->target));
-                       ColorFade *fadeOut(new ColorFade(this, 0, 500, false));
-                       fadeOut->SetLeadOutTime(500);
-                       ctrl->PushState(fadeOut);
-                       return true;
-               }
-       }
-       return false;
+       if (!trigger || trigger->GetType() != Trigger::TYPE_CONTACT) return false;
+       RunTrigger(*trigger);
+       return true;
 }
 
 void MapState::OnMove(bool realMove) {
+       if (CheckMoveTrigger()) {
+               return;
+       }
        // TODO: evaluate monster movements
        if (realMove) {
                UpdateFollower(*controlled);
@@ -347,6 +341,24 @@ void MapState::OnMove(bool realMove) {
        }
 }
 
+bool MapState::CheckMoveTrigger() {
+       Trigger *trigger(map->TriggerAt(Vector<int>(controlled->Position())));
+       if (!trigger || int(trigger->GetType()) != nextDirection) return false;
+       RunTrigger(*trigger);
+       return true;
+}
+
+void MapState::RunTrigger(Trigger &trigger) {
+       // TODO: run trigger script
+       if (trigger.map) {
+               ctrl->PushState(new ColorFade(this, 0, 500, true));
+               ctrl->PushState(new TransitionState(this, trigger.map, trigger.target));
+               ColorFade *fadeOut(new ColorFade(this, 0, 500, false));
+               fadeOut->SetLeadOutTime(500);
+               ctrl->PushState(fadeOut);
+       }
+}
+
 void MapState::UpdateFollower(Entity &e) {
        if (!e.Follower()) return;
 
index 0ca5a847a5805ef37881ac2c519cc717720d6449..bf19f4d5d315b0e8750d0e544588a336083f59cd 100644 (file)
@@ -63,7 +63,10 @@ private:
 
        void LockEntities();
        bool CheckMonster();
-       bool CheckTrigger();
+
+       bool CheckLockTrigger();
+       bool CheckMoveTrigger();
+       void RunTrigger(Trigger &);
 
 private:
        common::GameConfig *game;
index 4f370d9066949fc4320cdec22c72bff06277fbc2..3b915119b988e2ff9870d48f96ba657ac5392336 100644 (file)
@@ -9,7 +9,9 @@
 
 namespace map {
 
-Trigger::Trigger() {
+Trigger::Trigger()
+: type(TYPE_CONTACT)
+, map(0) {
 
 }
 
index 47f933be42263dc529ed3a7c6d203575a4edf26f..222f8138f98803cc9afaa4eb75f947684b144d98 100644 (file)
@@ -8,6 +8,7 @@
 #ifndef MAP_TRIGGER_H_
 #define MAP_TRIGGER_H_
 
+#include "Entity.h"
 #include "fwd.h"
 #include "../geometry/Vector.h"
 
@@ -19,15 +20,26 @@ public:
        Trigger();
        ~Trigger() { }
 
+       enum Type {
+               TYPE_NORTH = Entity::ORIENTATION_NORTH,
+               TYPE_EAST = Entity::ORIENTATION_EAST,
+               TYPE_SOUTH = Entity::ORIENTATION_SOUTH,
+               TYPE_WEST = Entity::ORIENTATION_WEST,
+               TYPE_CONTACT,
+       };
+
 public:
        const geometry::Vector<int> &TilePosition() const { return tilePosition; }
+       Type GetType() const { return type; }
 
 // temporary setters
 public:
        void SetTilePosition(const geometry::Vector<int> &p) { tilePosition = p; }
+       void SetType(Type t) { type = t; }
 
 private:
        geometry::Vector<int> tilePosition;
+       Type type;
 
 // temporary members until scripting is implemented
 public: