diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/entity.h | 2 | ||||
-rw-r--r-- | src/simulation.cpp | 118 | ||||
-rw-r--r-- | src/simulation.h | 2 |
3 files changed, 78 insertions, 44 deletions
diff --git a/src/entity.h b/src/entity.h index 8d28b98..0ff31e1 100644 --- a/src/entity.h +++ b/src/entity.h | |||
@@ -42,7 +42,7 @@ public: | |||
42 | 42 | ||
43 | bool playerCanPush = false; | 43 | bool playerCanPush = false; |
44 | bool trainCanPush = false; | 44 | bool trainCanPush = false; |
45 | 45 | ||
46 | // Temp | 46 | // Temp |
47 | int colorVal = 25; | 47 | int colorVal = 25; |
48 | 48 | ||
diff --git a/src/simulation.cpp b/src/simulation.cpp index 328b4f4..ca6ca3d 100644 --- a/src/simulation.cpp +++ b/src/simulation.cpp | |||
@@ -15,40 +15,68 @@ void Simulation::tick( | |||
15 | if (entity.controllable && | 15 | if (entity.controllable && |
16 | !entity.moving) | 16 | !entity.moving) |
17 | { | 17 | { |
18 | if (keystate[SDL_SCANCODE_LEFT] && | 18 | if (keystate[SDL_SCANCODE_LSHIFT] || keystate[SDL_SCANCODE_RSHIFT]) |
19 | moveEntityOnGrid(id, Direction::left, true)) | ||
20 | { | 19 | { |
21 | entity.shouldMoveTo = Direction::left; | 20 | Direction lookDir = Direction::none; |
22 | } | 21 | |
23 | else if (keystate[SDL_SCANCODE_UP] && | 22 | if (keystate[SDL_SCANCODE_LEFT]) |
24 | moveEntityOnGrid(id, Direction::up, true)) | 23 | { |
25 | { | 24 | lookDir = Direction::left; |
26 | entity.shouldMoveTo = Direction::up; | 25 | } |
27 | } | 26 | else if (keystate[SDL_SCANCODE_UP]) |
28 | else if (keystate[SDL_SCANCODE_RIGHT] && | 27 | { |
29 | moveEntityOnGrid(id, Direction::right, true)) | 28 | lookDir = Direction::up; |
30 | { | 29 | } |
31 | entity.shouldMoveTo = Direction::right; | 30 | else if (keystate[SDL_SCANCODE_RIGHT]) |
32 | } | 31 | { |
33 | else if (keystate[SDL_SCANCODE_DOWN] && | 32 | lookDir = Direction::right; |
34 | moveEntityOnGrid(id, Direction::down, true)) | 33 | } |
35 | { | 34 | else if (keystate[SDL_SCANCODE_DOWN]) |
36 | entity.shouldMoveTo = Direction::down; | 35 | { |
37 | } | 36 | lookDir = Direction::down; |
38 | else | 37 | } |
39 | { | 38 | |
40 | entity.shouldMoveTo = Direction::none; | 39 | vec2s lookPos = posInDir(entity.gridPos, lookDir); |
41 | } | 40 | |
42 | 41 | for (id_type blockId : getGridEntities(lookPos)) | |
43 | if (entity.shouldMoveTo != Direction::none) | 42 | { |
44 | { | 43 | Entity& block = entities_.at(blockId); |
45 | moveEntityOnGrid(id, entity.shouldMoveTo); | 44 | |
46 | } | 45 | if (!block.moving && block.playerCanPush) |
47 | 46 | { | |
48 | 47 | moveEntityOnGrid(blockId, lookDir); | |
49 | if (entity.moving) | 48 | } |
50 | { | 49 | } |
51 | 50 | } else { | |
51 | if (keystate[SDL_SCANCODE_LEFT] && | ||
52 | moveEntityOnGrid(id, Direction::left, true)) | ||
53 | { | ||
54 | entity.shouldMoveTo = Direction::left; | ||
55 | } | ||
56 | else if (keystate[SDL_SCANCODE_UP] && | ||
57 | moveEntityOnGrid(id, Direction::up, true)) | ||
58 | { | ||
59 | entity.shouldMoveTo = Direction::up; | ||
60 | } | ||
61 | else if (keystate[SDL_SCANCODE_RIGHT] && | ||
62 | moveEntityOnGrid(id, Direction::right, true)) | ||
63 | { | ||
64 | entity.shouldMoveTo = Direction::right; | ||
65 | } | ||
66 | else if (keystate[SDL_SCANCODE_DOWN] && | ||
67 | moveEntityOnGrid(id, Direction::down, true)) | ||
68 | { | ||
69 | entity.shouldMoveTo = Direction::down; | ||
70 | } | ||
71 | else | ||
72 | { | ||
73 | entity.shouldMoveTo = Direction::none; | ||
74 | } | ||
75 | |||
76 | if (entity.shouldMoveTo != Direction::none) | ||
77 | { | ||
78 | moveEntityOnGrid(id, entity.shouldMoveTo); | ||
79 | } | ||
52 | } | 80 | } |
53 | } | 81 | } |
54 | 82 | ||
@@ -143,7 +171,7 @@ bool Simulation::moveEntityOnGrid( | |||
143 | { | 171 | { |
144 | Entity& entity = entities_.at(id); | 172 | Entity& entity = entities_.at(id); |
145 | 173 | ||
146 | vec2s shouldMoveTo = entity.gridPos; | 174 | vec2s shouldMoveTo = posInDir(entity.gridPos, moveDir); |
147 | 175 | ||
148 | switch (moveDir) | 176 | switch (moveDir) |
149 | { | 177 | { |
@@ -154,8 +182,6 @@ bool Simulation::moveEntityOnGrid( | |||
154 | return false; | 182 | return false; |
155 | } | 183 | } |
156 | 184 | ||
157 | shouldMoveTo -= vec2s { 1, 0 }; | ||
158 | |||
159 | break; | 185 | break; |
160 | } | 186 | } |
161 | 187 | ||
@@ -166,8 +192,6 @@ bool Simulation::moveEntityOnGrid( | |||
166 | return false; | 192 | return false; |
167 | } | 193 | } |
168 | 194 | ||
169 | shouldMoveTo += vec2s { 1, 0 }; | ||
170 | |||
171 | break; | 195 | break; |
172 | } | 196 | } |
173 | 197 | ||
@@ -178,8 +202,6 @@ bool Simulation::moveEntityOnGrid( | |||
178 | return false; | 202 | return false; |
179 | } | 203 | } |
180 | 204 | ||
181 | shouldMoveTo -= vec2s { 0, 1 }; | ||
182 | |||
183 | break; | 205 | break; |
184 | } | 206 | } |
185 | 207 | ||
@@ -190,8 +212,6 @@ bool Simulation::moveEntityOnGrid( | |||
190 | return false; | 212 | return false; |
191 | } | 213 | } |
192 | 214 | ||
193 | shouldMoveTo += vec2s { 0, 1 }; | ||
194 | |||
195 | break; | 215 | break; |
196 | } | 216 | } |
197 | } | 217 | } |
@@ -207,7 +227,7 @@ bool Simulation::moveEntityOnGrid( | |||
207 | { | 227 | { |
208 | Entity& block = entities_.at(blockId); | 228 | Entity& block = entities_.at(blockId); |
209 | 229 | ||
210 | if (!block.playerCanPush) | 230 | if (block.moving || !block.playerCanPush) |
211 | { | 231 | { |
212 | return false; | 232 | return false; |
213 | } | 233 | } |
@@ -233,3 +253,15 @@ bool Simulation::moveEntityOnGrid( | |||
233 | 253 | ||
234 | return true; | 254 | return true; |
235 | } | 255 | } |
256 | |||
257 | vec2s Simulation::posInDir(vec2s orig, Direction dir) | ||
258 | { | ||
259 | switch (dir) | ||
260 | { | ||
261 | case Direction::left: return orig - vec2s { 1, 0 }; | ||
262 | case Direction::right: return orig + vec2s { 1, 0 }; | ||
263 | case Direction::up: return orig - vec2s { 0, 1 }; | ||
264 | case Direction::down: return orig + vec2s { 0, 1 }; | ||
265 | case Direction::none: return orig; | ||
266 | } | ||
267 | } | ||
diff --git a/src/simulation.h b/src/simulation.h index 2f80f9f..4d41b49 100644 --- a/src/simulation.h +++ b/src/simulation.h | |||
@@ -49,6 +49,8 @@ public: | |||
49 | 49 | ||
50 | void setGridPos(id_type id, vec2s pos); | 50 | void setGridPos(id_type id, vec2s pos); |
51 | 51 | ||
52 | static vec2s posInDir(vec2s orig, Direction dir); | ||
53 | |||
52 | private: | 54 | private: |
53 | 55 | ||
54 | 56 | ||