diff options
Diffstat (limited to 'src/transform_system.cpp')
-rw-r--r-- | src/transform_system.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/transform_system.cpp b/src/transform_system.cpp index 1d4a9f3..b5e9b7c 100644 --- a/src/transform_system.cpp +++ b/src/transform_system.cpp | |||
@@ -67,6 +67,11 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i newLoc, Dire | |||
67 | vec2i oldTileDR = oldColDR / map.getTileSize(); | 67 | vec2i oldTileDR = oldColDR / map.getTileSize(); |
68 | vec2i newTileDR = newColDR / map.getTileSize(); | 68 | vec2i newTileDR = newColDR / map.getTileSize(); |
69 | 69 | ||
70 | const Zone* enclosureZone = nullptr; | ||
71 | if (!sprite.enclosureZone.empty()) { | ||
72 | enclosureZone = &map.getZone(sprite.enclosureZone); | ||
73 | } | ||
74 | |||
70 | if (dirHasDir(sprite.dir, Direction::right)) { | 75 | if (dirHasDir(sprite.dir, Direction::right)) { |
71 | if (newTileDR.x() > oldTileDR.x() && | 76 | if (newTileDR.x() > oldTileDR.x() && |
72 | newColDR.x() < mapBounds.w()) { | 77 | newColDR.x() < mapBounds.w()) { |
@@ -80,6 +85,14 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i newLoc, Dire | |||
80 | } | 85 | } |
81 | } | 86 | } |
82 | 87 | ||
88 | if (!result.horiz.blocked && enclosureZone) { | ||
89 | if (oldColDR.x() <= enclosureZone->dr.x() && | ||
90 | newColDR.x() > enclosureZone->dr.x()) { | ||
91 | result.horiz.blocked = true; | ||
92 | result.horiz.dir = Direction::right; | ||
93 | } | ||
94 | } | ||
95 | |||
83 | if (!result.horiz.blocked) { | 96 | if (!result.horiz.blocked) { |
84 | auto it = rightCollidables_.lower_bound({oldColDR.x(), INT_MAX}); | 97 | auto it = rightCollidables_.lower_bound({oldColDR.x(), INT_MAX}); |
85 | for (; | 98 | for (; |
@@ -113,6 +126,14 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i newLoc, Dire | |||
113 | } | 126 | } |
114 | } | 127 | } |
115 | 128 | ||
129 | if (!result.horiz.blocked && enclosureZone) { | ||
130 | if (oldColUL.x() >= enclosureZone->ul.x() && | ||
131 | newColUL.x() < enclosureZone->ul.x()) { | ||
132 | result.horiz.blocked = true; | ||
133 | result.horiz.dir = Direction::left; | ||
134 | } | ||
135 | } | ||
136 | |||
116 | if (!result.horiz.blocked) { | 137 | if (!result.horiz.blocked) { |
117 | auto it = leftCollidables_.lower_bound({oldColUL.x(), 0}); | 138 | auto it = leftCollidables_.lower_bound({oldColUL.x(), 0}); |
118 | for (; | 139 | for (; |
@@ -146,6 +167,14 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i newLoc, Dire | |||
146 | } | 167 | } |
147 | } | 168 | } |
148 | 169 | ||
170 | if (!result.vert.blocked && enclosureZone) { | ||
171 | if (oldColDR.y() <= enclosureZone->dr.y() && | ||
172 | newColDR.y() > enclosureZone->dr.y()) { | ||
173 | result.vert.blocked = true; | ||
174 | result.vert.dir = Direction::down; | ||
175 | } | ||
176 | } | ||
177 | |||
149 | if (!result.vert.blocked) { | 178 | if (!result.vert.blocked) { |
150 | auto it = downCollidables_.lower_bound({oldColDR.y(), INT_MAX}); | 179 | auto it = downCollidables_.lower_bound({oldColDR.y(), INT_MAX}); |
151 | for (; | 180 | for (; |
@@ -179,6 +208,14 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i newLoc, Dire | |||
179 | } | 208 | } |
180 | } | 209 | } |
181 | 210 | ||
211 | if (!result.vert.blocked && enclosureZone) { | ||
212 | if (oldColUL.y() >= enclosureZone->ul.y() && | ||
213 | newColUL.y() < enclosureZone->ul.y()) { | ||
214 | result.vert.blocked = true; | ||
215 | result.vert.dir = Direction::up; | ||
216 | } | ||
217 | } | ||
218 | |||
182 | if (!result.vert.blocked) { | 219 | if (!result.vert.blocked) { |
183 | auto it = upCollidables_.lower_bound({oldColUL.y(), 0}); | 220 | auto it = upCollidables_.lower_bound({oldColUL.y(), 0}); |
184 | for (; | 221 | for (; |