diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/behaviour_system.cpp | 2 | ||||
-rw-r--r-- | src/character_system.cpp | 47 | ||||
-rw-r--r-- | src/input_system.cpp | 18 | ||||
-rw-r--r-- | src/transform_system.cpp | 84 | ||||
-rw-r--r-- | src/transform_system.h | 11 |
5 files changed, 75 insertions, 87 deletions
diff --git a/src/behaviour_system.cpp b/src/behaviour_system.cpp index f4f7546..ce980f6 100644 --- a/src/behaviour_system.cpp +++ b/src/behaviour_system.cpp | |||
@@ -196,7 +196,7 @@ void BehaviourSystem::createPath(int spriteId) { | |||
196 | } | 196 | } |
197 | 197 | ||
198 | CollisionResult collision = game_.getSystem<TransformSystem>().checkCollision(spriteId, searchNode.point, newPos, dir); | 198 | CollisionResult collision = game_.getSystem<TransformSystem>().checkCollision(spriteId, searchNode.point, newPos, dir); |
199 | if (collision.horiz.blocked || collision.vert.blocked) { | 199 | if (collision.blocked) { |
200 | // There isn't actually an edge to this neighbor. | 200 | // There isn't actually an edge to this neighbor. |
201 | continue; | 201 | continue; |
202 | } | 202 | } |
diff --git a/src/character_system.cpp b/src/character_system.cpp index 548bd9d..10cb06f 100644 --- a/src/character_system.cpp +++ b/src/character_system.cpp | |||
@@ -154,46 +154,35 @@ void CharacterSystem::tick(double dt) { | |||
154 | 154 | ||
155 | // Check collision. | 155 | // Check collision. |
156 | CollisionResult collision = game_.getSystem<TransformSystem>().checkCollision(spriteId, sprite.loc, pLoc, sprite.movementDir); | 156 | CollisionResult collision = game_.getSystem<TransformSystem>().checkCollision(spriteId, sprite.loc, pLoc, sprite.movementDir); |
157 | bool blocked = collision.horiz.blocked || collision.vert.blocked; | ||
158 | int colliderSpriteId = (collision.horiz.colliderSprite == -1) ? collision.vert.colliderSprite : collision.horiz.colliderSprite; | ||
159 | 157 | ||
160 | if (collision.horiz.blocked && !sprite.clipping) { | 158 | if (!(collision.blocked && sprite.clipping)) { |
161 | pLoc.x() = sprite.loc.x();//(newColPosDR * map.getTileSize() - (collisionBox / 2)).x() - 1; | 159 | pLoc = collision.adjustedLoc; |
162 | } else if (collision.horiz.colliderSprite != -1) { | ||
163 | Sprite& collider = game_.getSprite(collision.horiz.colliderSprite); | ||
164 | |||
165 | if (collider.walkthroughScript != "") { | ||
166 | game_.getSystem<ScriptSystem>().runScript(game_.getMap().getName(), collider.walkthroughScript); | ||
167 | } | ||
168 | } | 160 | } |
169 | 161 | ||
170 | if (collision.vert.blocked && !sprite.clipping) { | 162 | for (int colliderSpriteId : collision.colliders) { |
171 | pLoc.y() = sprite.loc.y();//(newColPosDR * map.getTileSize() - (collisionBox / 2)).x() - 1; | 163 | Sprite& collider = game_.getSprite(colliderSpriteId); |
172 | } else if (collision.vert.colliderSprite != -1) { | ||
173 | Sprite& collider = game_.getSprite(collision.vert.colliderSprite); | ||
174 | 164 | ||
175 | if (collider.walkthroughScript != "") { | 165 | if (!collider.walkthroughScript.empty()) { |
176 | game_.getSystem<ScriptSystem>().runScript(game_.getMap().getName(), collider.walkthroughScript); | 166 | game_.getSystem<ScriptSystem>().runScript(game_.getMap().getName(), collider.walkthroughScript); |
177 | } | 167 | } |
178 | } | ||
179 | 168 | ||
180 | if (blocked && sprite.characterState == CharacterState::Running && !sprite.clipping) { | 169 | if (!sprite.bumpPlayerScript.empty()) { |
181 | stopRunning(spriteId); | 170 | bool bumpedPlayer = collider.player; |
182 | game_.getMixer().playSound("../res/sfx/bump.wav"); | ||
183 | } | ||
184 | 171 | ||
185 | if (colliderSpriteId != -1 && !sprite.bumpPlayerScript.empty()) { | 172 | if (!bumpedPlayer && collider.leaderId != -1) { |
186 | Sprite& collider = game_.getSprite(colliderSpriteId); | 173 | Sprite& colliderLeader = game_.getSprite(collider.leaderId); |
187 | bool bumpedPlayer = collider.player; | 174 | bumpedPlayer = colliderLeader.player; |
175 | } | ||
188 | 176 | ||
189 | if (!bumpedPlayer && collider.leaderId != -1) { | 177 | if (bumpedPlayer) { |
190 | Sprite& colliderLeader = game_.getSprite(collider.leaderId); | 178 | game_.getSystem<ScriptSystem>().runScript(game_.getMap().getName(), sprite.bumpPlayerScript); |
191 | bumpedPlayer = colliderLeader.player; | 179 | } |
192 | } | 180 | } |
181 | } | ||
193 | 182 | ||
194 | if (bumpedPlayer) { | 183 | if (collision.blocked && sprite.characterState == CharacterState::Running && !sprite.clipping) { |
195 | game_.getSystem<ScriptSystem>().runScript(game_.getMap().getName(), sprite.bumpPlayerScript); | 184 | stopRunning(spriteId); |
196 | } | 185 | game_.getMixer().playSound("../res/sfx/bump.wav"); |
197 | } | 186 | } |
198 | 187 | ||
199 | // Move everything | 188 | // Move everything |
diff --git a/src/input_system.cpp b/src/input_system.cpp index 38423a2..c399e91 100644 --- a/src/input_system.cpp +++ b/src/input_system.cpp | |||
@@ -87,25 +87,17 @@ void InputSystem::tick(double dt) { | |||
87 | vec2i checkLoc = sprite.loc + (unitVecInDirection(sprite.dir) * LUCAS_MOVEMENT_SPEED); | 87 | vec2i checkLoc = sprite.loc + (unitVecInDirection(sprite.dir) * LUCAS_MOVEMENT_SPEED); |
88 | CollisionResult collision = game_.getSystem<TransformSystem>().checkCollision(spriteId, sprite.loc, checkLoc, sprite.dir); | 88 | CollisionResult collision = game_.getSystem<TransformSystem>().checkCollision(spriteId, sprite.loc, checkLoc, sprite.dir); |
89 | 89 | ||
90 | if (collision.horiz.blocked || collision.vert.blocked) { | 90 | if (collision.blocked) { |
91 | inFrontOfSomething = true; | 91 | inFrontOfSomething = true; |
92 | } | 92 | } |
93 | 93 | ||
94 | // If there is a sprite to be interacted with, rotate that sprite so it is facing the player. | 94 | // If there is a sprite to be interacted with, rotate that sprite so it is facing the player. |
95 | // Then, run its interaction script if present. | 95 | // Then, run its interaction script if present. |
96 | if (collision.horiz.colliderSprite != -1) { | 96 | for (int colliderSpriteId : collision.colliders) { |
97 | game_.getSystem<AnimationSystem>().setSpriteDirection(collision.horiz.colliderSprite, oppositeDirection(sprite.dir)); | 97 | game_.getSystem<AnimationSystem>().setSpriteDirection(colliderSpriteId, oppositeDirection(sprite.dir)); |
98 | 98 | ||
99 | Sprite& collider = game_.getSprite(collision.horiz.colliderSprite); | 99 | Sprite& collider = game_.getSprite(colliderSpriteId); |
100 | if (collider.interactionScript != "") { | 100 | if (!collider.interactionScript.empty()) { |
101 | game_.getSystem<ScriptSystem>().runScript(game_.getMap().getName(), collider.interactionScript); | ||
102 | activated = true; | ||
103 | } | ||
104 | } else if (collision.vert.colliderSprite != -1) { | ||
105 | game_.getSystem<AnimationSystem>().setSpriteDirection(collision.vert.colliderSprite, oppositeDirection(sprite.dir)); | ||
106 | |||
107 | Sprite& collider = game_.getSprite(collision.vert.colliderSprite); | ||
108 | if (collider.interactionScript != "") { | ||
109 | game_.getSystem<ScriptSystem>().runScript(game_.getMap().getName(), collider.interactionScript); | 101 | game_.getSystem<ScriptSystem>().runScript(game_.getMap().getName(), collider.interactionScript); |
110 | activated = true; | 102 | activated = true; |
111 | } | 103 | } |
diff --git a/src/transform_system.cpp b/src/transform_system.cpp index 4ed47c0..a643255 100644 --- a/src/transform_system.cpp +++ b/src/transform_system.cpp | |||
@@ -59,6 +59,7 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i curLoc, vec2 | |||
59 | 59 | ||
60 | // First check horizontal movement only. | 60 | // First check horizontal movement only. |
61 | vec2i horizMovement = { newLoc.x(), curLoc.y() }; | 61 | vec2i horizMovement = { newLoc.x(), curLoc.y() }; |
62 | bool horizBlocked = false; | ||
62 | 63 | ||
63 | vec2i oldColUL = curLoc + sprite.collisionOffset; | 64 | vec2i oldColUL = curLoc + sprite.collisionOffset; |
64 | vec2i oldColDR = oldColUL + sprite.collisionSize - vec2i{1,1}; | 65 | vec2i oldColDR = oldColUL + sprite.collisionSize - vec2i{1,1}; |
@@ -80,23 +81,23 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i curLoc, vec2 | |||
80 | newColDR.x() < mapBounds.w()) { | 81 | newColDR.x() < mapBounds.w()) { |
81 | for (int y = newTileUL.y(); y <= newTileDR.y(); y++) { | 82 | for (int y = newTileUL.y(); y <= newTileDR.y(); y++) { |
82 | if (map.isBlocked(newTileDR.x(), y)) { | 83 | if (map.isBlocked(newTileDR.x(), y)) { |
83 | result.horiz.blocked = true; | 84 | horizBlocked = true; |
84 | result.horiz.dir = Direction::right; | 85 | result.dir = Direction::right; |
85 | 86 | ||
86 | break; | 87 | break; |
87 | } | 88 | } |
88 | } | 89 | } |
89 | } | 90 | } |
90 | 91 | ||
91 | if (!result.horiz.blocked && enclosureZone) { | 92 | if (!horizBlocked && enclosureZone) { |
92 | if (oldColDR.x() <= enclosureZone->dr.x()-1 && | 93 | if (oldColDR.x() <= enclosureZone->dr.x()-1 && |
93 | newColDR.x() > enclosureZone->dr.x()-1) { | 94 | newColDR.x() > enclosureZone->dr.x()-1) { |
94 | result.horiz.blocked = true; | 95 | horizBlocked = true; |
95 | result.horiz.dir = Direction::right; | 96 | result.dir = Direction::right; |
96 | } | 97 | } |
97 | } | 98 | } |
98 | 99 | ||
99 | if (!result.horiz.blocked) { | 100 | if (!horizBlocked) { |
100 | auto it = rightCollidables_.lower_bound({oldColDR.x()+1, 0}); | 101 | auto it = rightCollidables_.lower_bound({oldColDR.x()+1, 0}); |
101 | for (; | 102 | for (; |
102 | (it != std::end(rightCollidables_) && | 103 | (it != std::end(rightCollidables_) && |
@@ -106,9 +107,9 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i curLoc, vec2 | |||
106 | newColUL.y() <= it->second.upper) { | 107 | newColUL.y() <= it->second.upper) { |
107 | int colliderSpriteId = std::get<1>(it->first); | 108 | int colliderSpriteId = std::get<1>(it->first); |
108 | Sprite& collider = game_.getSprite(colliderSpriteId); | 109 | Sprite& collider = game_.getSprite(colliderSpriteId); |
109 | result.horiz.blocked = collider.solid; | 110 | horizBlocked = collider.solid; |
110 | result.horiz.dir = Direction::right; | 111 | result.dir = Direction::right; |
111 | result.horiz.colliderSprite = colliderSpriteId; | 112 | result.colliders.push_back(colliderSpriteId); |
112 | 113 | ||
113 | break; | 114 | break; |
114 | } | 115 | } |
@@ -121,23 +122,23 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i curLoc, vec2 | |||
121 | newColUL.x() >= 0) { | 122 | newColUL.x() >= 0) { |
122 | for (int y = newTileUL.y(); y <= newTileDR.y(); y++) { | 123 | for (int y = newTileUL.y(); y <= newTileDR.y(); y++) { |
123 | if (map.isBlocked(newTileUL.x(), y)) { | 124 | if (map.isBlocked(newTileUL.x(), y)) { |
124 | result.horiz.blocked = true; | 125 | horizBlocked = true; |
125 | result.horiz.dir = Direction::left; | 126 | result.dir = Direction::left; |
126 | 127 | ||
127 | break; | 128 | break; |
128 | } | 129 | } |
129 | } | 130 | } |
130 | } | 131 | } |
131 | 132 | ||
132 | if (!result.horiz.blocked && enclosureZone) { | 133 | if (!horizBlocked && enclosureZone) { |
133 | if (oldColUL.x() >= enclosureZone->ul.x() && | 134 | if (oldColUL.x() >= enclosureZone->ul.x() && |
134 | newColUL.x() < enclosureZone->ul.x()) { | 135 | newColUL.x() < enclosureZone->ul.x()) { |
135 | result.horiz.blocked = true; | 136 | horizBlocked = true; |
136 | result.horiz.dir = Direction::left; | 137 | result.dir = Direction::left; |
137 | } | 138 | } |
138 | } | 139 | } |
139 | 140 | ||
140 | if (!result.horiz.blocked) { | 141 | if (!horizBlocked) { |
141 | auto it = leftCollidables_.lower_bound({oldColUL.x()-1, INT_MAX}); | 142 | auto it = leftCollidables_.lower_bound({oldColUL.x()-1, INT_MAX}); |
142 | for (; | 143 | for (; |
143 | (it != std::end(leftCollidables_) && | 144 | (it != std::end(leftCollidables_) && |
@@ -147,9 +148,9 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i curLoc, vec2 | |||
147 | newColUL.y() <= it->second.upper) { | 148 | newColUL.y() <= it->second.upper) { |
148 | int colliderSpriteId = std::get<1>(it->first); | 149 | int colliderSpriteId = std::get<1>(it->first); |
149 | Sprite& collider = game_.getSprite(colliderSpriteId); | 150 | Sprite& collider = game_.getSprite(colliderSpriteId); |
150 | result.horiz.blocked = collider.solid; | 151 | horizBlocked = collider.solid; |
151 | result.horiz.dir = Direction::left; | 152 | result.dir = Direction::left; |
152 | result.horiz.colliderSprite = colliderSpriteId; | 153 | result.colliders.push_back(colliderSpriteId); |
153 | 154 | ||
154 | break; | 155 | break; |
155 | } | 156 | } |
@@ -161,12 +162,14 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i curLoc, vec2 | |||
161 | // taken place (as long as it was not in fact blocked). | 162 | // taken place (as long as it was not in fact blocked). |
162 | vec2i effectiveCurLoc = curLoc; | 163 | vec2i effectiveCurLoc = curLoc; |
163 | vec2i vertMovement = newLoc; | 164 | vec2i vertMovement = newLoc; |
164 | if (result.horiz.blocked) { | 165 | if (horizBlocked) { |
165 | vertMovement.x() = curLoc.x(); | 166 | vertMovement.x() = curLoc.x(); |
166 | } else { | 167 | } else { |
167 | effectiveCurLoc.x() = newLoc.x(); | 168 | effectiveCurLoc.x() = newLoc.x(); |
168 | } | 169 | } |
169 | 170 | ||
171 | bool vertBlocked = false; | ||
172 | |||
170 | oldColUL = effectiveCurLoc + sprite.collisionOffset; | 173 | oldColUL = effectiveCurLoc + sprite.collisionOffset; |
171 | oldColDR = oldColUL + sprite.collisionSize - vec2i{1,1}; | 174 | oldColDR = oldColUL + sprite.collisionSize - vec2i{1,1}; |
172 | newColUL = vertMovement + sprite.collisionOffset; | 175 | newColUL = vertMovement + sprite.collisionOffset; |
@@ -182,23 +185,23 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i curLoc, vec2 | |||
182 | newColDR.y() < mapBounds.h()) { | 185 | newColDR.y() < mapBounds.h()) { |
183 | for (int x = newTileUL.x(); x <= newTileDR.x(); x++) { | 186 | for (int x = newTileUL.x(); x <= newTileDR.x(); x++) { |
184 | if (map.isBlocked(x, newTileDR.y())) { | 187 | if (map.isBlocked(x, newTileDR.y())) { |
185 | result.vert.blocked = true; | 188 | vertBlocked = true; |
186 | result.vert.dir = Direction::down; | 189 | result.dir = Direction::down; |
187 | 190 | ||
188 | break; | 191 | break; |
189 | } | 192 | } |
190 | } | 193 | } |
191 | } | 194 | } |
192 | 195 | ||
193 | if (!result.vert.blocked && enclosureZone) { | 196 | if (!vertBlocked && enclosureZone) { |
194 | if (oldColDR.y() <= enclosureZone->dr.y()-1 && | 197 | if (oldColDR.y() <= enclosureZone->dr.y()-1 && |
195 | newColDR.y() > enclosureZone->dr.y()-1) { | 198 | newColDR.y() > enclosureZone->dr.y()-1) { |
196 | result.vert.blocked = true; | 199 | vertBlocked = true; |
197 | result.vert.dir = Direction::down; | 200 | result.dir = Direction::down; |
198 | } | 201 | } |
199 | } | 202 | } |
200 | 203 | ||
201 | if (!result.vert.blocked) { | 204 | if (!vertBlocked) { |
202 | auto it = downCollidables_.lower_bound({oldColDR.y()+1, 0}); | 205 | auto it = downCollidables_.lower_bound({oldColDR.y()+1, 0}); |
203 | for (; | 206 | for (; |
204 | (it != std::end(downCollidables_) && | 207 | (it != std::end(downCollidables_) && |
@@ -208,9 +211,9 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i curLoc, vec2 | |||
208 | newColUL.x() <= it->second.upper) { | 211 | newColUL.x() <= it->second.upper) { |
209 | int colliderSpriteId = std::get<1>(it->first); | 212 | int colliderSpriteId = std::get<1>(it->first); |
210 | Sprite& collider = game_.getSprite(colliderSpriteId); | 213 | Sprite& collider = game_.getSprite(colliderSpriteId); |
211 | result.vert.blocked = collider.solid; | 214 | vertBlocked = collider.solid; |
212 | result.vert.dir = Direction::down; | 215 | result.dir = Direction::down; |
213 | result.vert.colliderSprite = colliderSpriteId; | 216 | result.colliders.push_back(colliderSpriteId); |
214 | 217 | ||
215 | break; | 218 | break; |
216 | } | 219 | } |
@@ -223,23 +226,23 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i curLoc, vec2 | |||
223 | newColUL.y() >= 0) { | 226 | newColUL.y() >= 0) { |
224 | for (int x = newTileUL.x(); x <= newTileDR.x(); x++) { | 227 | for (int x = newTileUL.x(); x <= newTileDR.x(); x++) { |
225 | if (map.isBlocked(x, newTileUL.y())) { | 228 | if (map.isBlocked(x, newTileUL.y())) { |
226 | result.vert.blocked = true; | 229 | vertBlocked = true; |
227 | result.vert.dir = Direction::up; | 230 | result.dir = Direction::up; |
228 | 231 | ||
229 | break; | 232 | break; |
230 | } | 233 | } |
231 | } | 234 | } |
232 | } | 235 | } |
233 | 236 | ||
234 | if (!result.vert.blocked && enclosureZone) { | 237 | if (!vertBlocked && enclosureZone) { |
235 | if (oldColUL.y() >= enclosureZone->ul.y() && | 238 | if (oldColUL.y() >= enclosureZone->ul.y() && |
236 | newColUL.y() < enclosureZone->ul.y()) { | 239 | newColUL.y() < enclosureZone->ul.y()) { |
237 | result.vert.blocked = true; | 240 | vertBlocked = true; |
238 | result.vert.dir = Direction::up; | 241 | result.dir = Direction::up; |
239 | } | 242 | } |
240 | } | 243 | } |
241 | 244 | ||
242 | if (!result.vert.blocked) { | 245 | if (!vertBlocked) { |
243 | auto it = upCollidables_.lower_bound({oldColUL.y()-1, INT_MAX}); | 246 | auto it = upCollidables_.lower_bound({oldColUL.y()-1, INT_MAX}); |
244 | for (; | 247 | for (; |
245 | (it != std::end(upCollidables_) && | 248 | (it != std::end(upCollidables_) && |
@@ -249,9 +252,9 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i curLoc, vec2 | |||
249 | newColUL.x() <= it->second.upper) { | 252 | newColUL.x() <= it->second.upper) { |
250 | int colliderSpriteId = std::get<1>(it->first); | 253 | int colliderSpriteId = std::get<1>(it->first); |
251 | Sprite& collider = game_.getSprite(colliderSpriteId); | 254 | Sprite& collider = game_.getSprite(colliderSpriteId); |
252 | result.vert.blocked = collider.solid; | 255 | vertBlocked = collider.solid; |
253 | result.vert.dir = Direction::up; | 256 | result.dir = Direction::up; |
254 | result.vert.colliderSprite = colliderSpriteId; | 257 | result.colliders.push_back(colliderSpriteId); |
255 | 258 | ||
256 | break; | 259 | break; |
257 | } | 260 | } |
@@ -259,6 +262,13 @@ CollisionResult TransformSystem::checkCollision(int spriteId, vec2i curLoc, vec2 | |||
259 | } | 262 | } |
260 | } | 263 | } |
261 | 264 | ||
265 | result.adjustedLoc = vertMovement; | ||
266 | if (vertBlocked) { | ||
267 | result.adjustedLoc.y() = effectiveCurLoc.y(); | ||
268 | } | ||
269 | |||
270 | result.blocked = horizBlocked || vertBlocked; | ||
271 | |||
262 | return result; | 272 | return result; |
263 | } | 273 | } |
264 | 274 | ||
diff --git a/src/transform_system.h b/src/transform_system.h index 7fa3423..476b8d8 100644 --- a/src/transform_system.h +++ b/src/transform_system.h | |||
@@ -5,6 +5,7 @@ | |||
5 | #include <set> | 5 | #include <set> |
6 | #include <map> | 6 | #include <map> |
7 | #include <tuple> | 7 | #include <tuple> |
8 | #include <list> | ||
8 | #include "direction.h" | 9 | #include "direction.h" |
9 | #include "system.h" | 10 | #include "system.h" |
10 | #include "vector.h" | 11 | #include "vector.h" |
@@ -13,15 +14,11 @@ | |||
13 | 14 | ||
14 | class Game; | 15 | class Game; |
15 | 16 | ||
16 | struct AxisResult { | 17 | struct CollisionResult { |
17 | Direction dir; | 18 | Direction dir; |
18 | bool blocked = false; | 19 | bool blocked = false; |
19 | int colliderSprite = -1; | 20 | std::list<int> colliders; |
20 | }; | 21 | vec2i adjustedLoc; |
21 | |||
22 | struct CollisionResult { | ||
23 | AxisResult horiz; | ||
24 | AxisResult vert; | ||
25 | }; | 22 | }; |
26 | 23 | ||
27 | class TransformSystem : public System { | 24 | class TransformSystem : public System { |