summary refs log tree commit diff stats
path: root/src/simulation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/simulation.cpp')
-rw-r--r--src/simulation.cpp114
1 files changed, 87 insertions, 27 deletions
diff --git a/src/simulation.cpp b/src/simulation.cpp index 1379c34..77a9a3e 100644 --- a/src/simulation.cpp +++ b/src/simulation.cpp
@@ -1,5 +1,6 @@
1#include "simulation.h" 1#include "simulation.h"
2 2
3#include <range/v3/all.hpp>
3#include "consts.h" 4#include "consts.h"
4#include "level.h" 5#include "level.h"
5 6
@@ -7,6 +8,59 @@ Simulation::Simulation(
7 const Level& level) : 8 const Level& level) :
8 level_(level) 9 level_(level)
9{ 10{
11
12
13 id_type trackId = emplaceEntity();
14 Entity& track = getEntity(trackId);
15 track.size = TILE_SIZE;
16 track.layer = Layer::track;
17 track.isTrack = true;
18 track.trackDir1 = Direction::right;
19 track.trackDir2 = Direction::down;
20 track.colorVal = 130;
21 track.gridPos = vec2s { 6, 1 };
22
23 id_type trackId2 = emplaceEntity();
24 Entity& track2 = getEntity(trackId2);
25 track2.size = TILE_SIZE;
26 track2.layer = Layer::track;
27 track2.isTrack = true;
28 track2.trackDir1 = Direction::right;
29 track2.trackDir2 = Direction::up;
30 track2.colorVal = 130;
31 track2.gridPos = vec2s { 6, 2 };
32
33 id_type trackId3 = emplaceEntity();
34 Entity& track3 = getEntity(trackId3);
35 track3.size = TILE_SIZE;
36 track3.layer = Layer::track;
37 track3.isTrack = true;
38 track3.trackDir1 = Direction::up;
39 track3.trackDir2 = Direction::left;
40 track3.colorVal = 130;
41 track3.gridPos = vec2s { 7, 2 };
42
43 id_type trackId4 = emplaceEntity();
44 Entity& track4 = getEntity(trackId4);
45 track4.size = TILE_SIZE;
46 track4.layer = Layer::track;
47 track4.isTrack = true;
48 track4.trackDir1 = Direction::left;
49 track4.trackDir2 = Direction::down;
50 track4.colorVal = 130;
51 track4.gridPos = vec2s { 7, 1 };
52
53
54 id_type trainId = emplaceEntity();
55 Entity& train = getEntity(trainId);
56 train.size = TILE_SIZE;
57 train.speed = schedule_.getBPS() * 2.0;
58 train.colliderType = ColliderType::train;
59 train.scheduled = true;
60 train.colorVal = 90;
61 train.gridPos = vec2s { 6, 1 };
62 train.moveDir = Direction::left;
63
10 id_type player = emplaceEntity(); 64 id_type player = emplaceEntity();
11 Entity& entity = getEntity(player); 65 Entity& entity = getEntity(player);
12 entity.size = TILE_SIZE; 66 entity.size = TILE_SIZE;
@@ -19,7 +73,7 @@ Simulation::Simulation(
19 id_type crateId = emplaceEntity(); 73 id_type crateId = emplaceEntity();
20 Entity& crate = getEntity(crateId); 74 Entity& crate = getEntity(crateId);
21 crate.size = TILE_SIZE; 75 crate.size = TILE_SIZE;
22 crate.speed = static_cast<double>(schedule_.getBPM()) / 30.0; 76 crate.speed = schedule_.getBPS() * 2.0;
23 crate.colliderType = ColliderType::crate; 77 crate.colliderType = ColliderType::crate;
24 crate.canBePushedBy.insert(ColliderType::player); 78 crate.canBePushedBy.insert(ColliderType::player);
25 crate.canBePushedBy.insert(ColliderType::crate); 79 crate.canBePushedBy.insert(ColliderType::crate);
@@ -29,24 +83,13 @@ Simulation::Simulation(
29 id_type crateId2 = emplaceEntity(); 83 id_type crateId2 = emplaceEntity();
30 Entity& crate2 = getEntity(crateId2); 84 Entity& crate2 = getEntity(crateId2);
31 crate2.size = TILE_SIZE; 85 crate2.size = TILE_SIZE;
32 crate2.speed = static_cast<double>(schedule_.getBPM()) / 30.0; 86 crate2.speed = schedule_.getBPS() * 2.0;
33 crate2.colliderType = ColliderType::crate; 87 crate2.colliderType = ColliderType::crate;
34 crate2.canBePushedBy.insert(ColliderType::player); 88 crate2.canBePushedBy.insert(ColliderType::player);
35 crate2.canBePushedBy.insert(ColliderType::crate); 89 crate2.canBePushedBy.insert(ColliderType::crate);
36 crate2.canBePushedBy.insert(ColliderType::train); 90 crate2.canBePushedBy.insert(ColliderType::train);
37 crate2.gridPos = vec2s { 6, 7 }; 91 crate2.gridPos = vec2s { 6, 7 };
38 92
39 id_type trainId = emplaceEntity();
40 Entity& train = getEntity(trainId);
41 train.size = TILE_SIZE;
42 train.speed = static_cast<double>(schedule_.getBPM()) / 30.0;
43 train.colliderType = ColliderType::train;
44 train.scheduled = true;
45 train.colorVal = 90;
46 train.gridPos = vec2s { 6, 1 };
47
48
49
50 93
51 for (id_type id : active_) 94 for (id_type id : active_)
52 { 95 {
@@ -145,7 +188,28 @@ void Simulation::tick(
145 188
146 if (entity.scheduled && !entity.moving) 189 if (entity.scheduled && !entity.moving)
147 { 190 {
148 moveEntityOnGrid(id, Direction::down); 191 auto tracks =
192 posCache_.at(entity.gridPos) |
193 ranges::view::transform([&] (id_type id) -> Entity& { return entities_.at(id); }) |
194 ranges::view::filter([&] (Entity& other) { return other.isTrack; });
195
196 if (!ranges::empty(tracks))
197 {
198 Entity& track = ranges::front(tracks);
199
200 Direction dir = Direction::none;
201 Direction from = oppositeDir(entity.moveDir);
202
203 if (from == track.trackDir1)
204 {
205 dir = track.trackDir2;
206 } else if (from == track.trackDir2)
207 {
208 dir = track.trackDir1;
209 }
210
211 moveEntityOnGrid(id, dir);
212 }
149 } 213 }
150 } 214 }
151 } 215 }
@@ -282,7 +346,10 @@ bool Simulation::moveEntityOnGrid(
282 } 346 }
283 347
284 // Can't move into a space that something else is already moving into. 348 // Can't move into a space that something else is already moving into.
285 if (!moveToCache_.at(shouldMoveTo).empty()) 349 if (!ranges::empty(
350 moveToCache_.at(shouldMoveTo) |
351 ranges::view::transform([&] (id_type id) -> Entity& { return entities_.at(id); }) |
352 ranges::view::filter([&] (Entity& other) { return other.layer == entity.layer; })))
286 { 353 {
287 return false; 354 return false;
288 } 355 }
@@ -291,6 +358,11 @@ bool Simulation::moveEntityOnGrid(
291 { 358 {
292 Entity& block = entities_.at(blockId); 359 Entity& block = entities_.at(blockId);
293 360
361 if (block.layer != entity.layer)
362 {
363 continue;
364 }
365
294 if (!block.moving) 366 if (!block.moving)
295 { 367 {
296 if (!block.canBePushedBy.count(entity.colliderType)) 368 if (!block.canBePushedBy.count(entity.colliderType))
@@ -334,15 +406,3 @@ bool Simulation::moveEntityOnGrid(
334 406
335 return true; 407 return true;
336} 408}
337
338vec2s Simulation::posInDir(vec2s orig, Direction dir)
339{
340 switch (dir)
341 {
342 case Direction::left: return orig - vec2s { 1, 0 };
343 case Direction::right: return orig + vec2s { 1, 0 };
344 case Direction::up: return orig - vec2s { 0, 1 };
345 case Direction::down: return orig + vec2s { 0, 1 };
346 case Direction::none: return orig;
347 }
348}