summary refs log tree commit diff stats
path: root/src/simulation.cpp
diff options
context:
space:
mode:
authorKelly Rauchenberger <fefferburbia@gmail.com>2019-02-22 17:25:59 -0500
committerKelly Rauchenberger <fefferburbia@gmail.com>2019-02-22 17:25:59 -0500
commit26fbd8c1edaf94513d9750681edbe449b699efe4 (patch)
tree3356e61d3eca5eda067169a2c584616a49d8e5a5 /src/simulation.cpp
parentd9c201cbf2fbfe315137e141d886a9bbfa6794ba (diff)
downloaddispatcher-26fbd8c1edaf94513d9750681edbe449b699efe4.tar.gz
dispatcher-26fbd8c1edaf94513d9750681edbe449b699efe4.tar.bz2
dispatcher-26fbd8c1edaf94513d9750681edbe449b699efe4.zip
Trains move on tracks to the beat
Small implementation changes in various places, biggest thing is now we're using ranges, which is experimental and will be included for real in C++20.
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}