diff options
Diffstat (limited to 'src/simulation.cpp')
-rw-r--r-- | src/simulation.cpp | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/src/simulation.cpp b/src/simulation.cpp index ca6ca3d..912f7f0 100644 --- a/src/simulation.cpp +++ b/src/simulation.cpp | |||
@@ -42,7 +42,7 @@ void Simulation::tick( | |||
42 | { | 42 | { |
43 | Entity& block = entities_.at(blockId); | 43 | Entity& block = entities_.at(blockId); |
44 | 44 | ||
45 | if (!block.moving && block.playerCanPush) | 45 | if (!block.moving && block.canBePushedBy.count(ColliderType::player)) |
46 | { | 46 | { |
47 | moveEntityOnGrid(blockId, lookDir); | 47 | moveEntityOnGrid(blockId, lookDir); |
48 | } | 48 | } |
@@ -169,6 +169,8 @@ bool Simulation::moveEntityOnGrid( | |||
169 | Direction moveDir, | 169 | Direction moveDir, |
170 | bool validate) | 170 | bool validate) |
171 | { | 171 | { |
172 | bool actuallyMove = true; | ||
173 | |||
172 | Entity& entity = entities_.at(id); | 174 | Entity& entity = entities_.at(id); |
173 | 175 | ||
174 | vec2s shouldMoveTo = posInDir(entity.gridPos, moveDir); | 176 | vec2s shouldMoveTo = posInDir(entity.gridPos, moveDir); |
@@ -216,18 +218,20 @@ bool Simulation::moveEntityOnGrid( | |||
216 | } | 218 | } |
217 | } | 219 | } |
218 | 220 | ||
219 | if (entity.colliderType == ColliderType::player) | 221 | if (!level_.getTileset().canEntityMoveTo( |
222 | entity.colliderType, | ||
223 | level_.at(shouldMoveTo))) | ||
220 | { | 224 | { |
221 | if (!level_.getTileset().canPlayerMoveTo(level_.at(shouldMoveTo))) | 225 | return false; |
222 | { | 226 | } |
223 | return false; | ||
224 | } | ||
225 | 227 | ||
226 | for (id_type blockId : getGridEntities(shouldMoveTo)) | 228 | for (id_type blockId : getGridEntities(shouldMoveTo)) |
227 | { | 229 | { |
228 | Entity& block = entities_.at(blockId); | 230 | Entity& block = entities_.at(blockId); |
229 | 231 | ||
230 | if (block.moving || !block.playerCanPush) | 232 | if (!block.moving) |
233 | { | ||
234 | if (!block.canBePushedBy.count(entity.colliderType)) | ||
231 | { | 235 | { |
232 | return false; | 236 | return false; |
233 | } | 237 | } |
@@ -238,13 +242,20 @@ bool Simulation::moveEntityOnGrid( | |||
238 | } | 242 | } |
239 | } | 243 | } |
240 | 244 | ||
245 | double entityTimeLeft = 1.0 / entity.speed; | ||
246 | double blockTimeLeft = (1.0 - block.movementTween) / block.speed; | ||
247 | |||
248 | if (entityTimeLeft < blockTimeLeft) | ||
249 | { | ||
250 | actuallyMove = false; | ||
251 | } | ||
241 | } | 252 | } |
242 | 253 | ||
243 | 254 | ||
244 | 255 | ||
245 | 256 | ||
246 | 257 | ||
247 | if (!validate) | 258 | if (!validate && actuallyMove) |
248 | { | 259 | { |
249 | entity.moving = true; | 260 | entity.moving = true; |
250 | entity.destPos = shouldMoveTo; | 261 | entity.destPos = shouldMoveTo; |