diff options
author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2018-02-12 16:39:49 -0500 |
---|---|---|
committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2018-02-12 16:39:49 -0500 |
commit | 5cc80ec58ea5bd66456f6f5286fa5f26d3fe702b (patch) | |
tree | 283cef0e95f237e70892e8b90c841f971cb61fd9 /src/systems/pondering.cpp | |
parent | 77be863f4f15d2481a64e4e8dadb4060a6e4e590 (diff) | |
download | therapy-5cc80ec58ea5bd66456f6f5286fa5f26d3fe702b.tar.gz therapy-5cc80ec58ea5bd66456f6f5286fa5f26d3fe702b.tar.bz2 therapy-5cc80ec58ea5bd66456f6f5286fa5f26d3fe702b.zip |
Abstracted behavior related to "orientable" entities
A lot of the stuff that ControllingSystem did to control the player character was moved into the new OrientingSystem. This is so that the player, or any player-like entities, can also be controlled by AI, with the underlying behavior being delegated in the same way as if the player were being controlled by the user. Fixed the issue where, if the player were blocked while moving horizontally, they would remain blocked even if vertical movement were to remove the collision. Fixed cases of the player animating incorrectly after performing certain movements.
Diffstat (limited to 'src/systems/pondering.cpp')
-rw-r--r-- | src/systems/pondering.cpp | 89 |
1 files changed, 48 insertions, 41 deletions
diff --git a/src/systems/pondering.cpp b/src/systems/pondering.cpp index 26a6f56..4a165b1 100644 --- a/src/systems/pondering.cpp +++ b/src/systems/pondering.cpp | |||
@@ -2,7 +2,9 @@ | |||
2 | #include "game.h" | 2 | #include "game.h" |
3 | #include "components/ponderable.h" | 3 | #include "components/ponderable.h" |
4 | #include "components/transformable.h" | 4 | #include "components/transformable.h" |
5 | #include "components/droppable.h" | 5 | #include "components/orientable.h" |
6 | #include "components/mappable.h" | ||
7 | #include "systems/orienting.h" | ||
6 | #include "consts.h" | 8 | #include "consts.h" |
7 | 9 | ||
8 | void PonderingSystem::tick(double dt) | 10 | void PonderingSystem::tick(double dt) |
@@ -37,10 +39,8 @@ void PonderingSystem::tick(double dt) | |||
37 | double newX = oldX + ponderable.getVelocityX() * dt; | 39 | double newX = oldX + ponderable.getVelocityX() * dt; |
38 | double newY = oldY + ponderable.getVelocityY() * dt; | 40 | double newY = oldY + ponderable.getVelocityY() * dt; |
39 | 41 | ||
40 | if (ponderable.getVelocityY() > 0.0) | 42 | bool oldGrounded = ponderable.isGrounded(); |
41 | { | 43 | ponderable.setGrounded(false); |
42 | ponderable.setState(PonderableComponent::State::falling); | ||
43 | } | ||
44 | 44 | ||
45 | for (id_type mapEntity : maps) | 45 | for (id_type mapEntity : maps) |
46 | { | 46 | { |
@@ -64,8 +64,6 @@ void PonderingSystem::tick(double dt) | |||
64 | newY, | 64 | newY, |
65 | it->first, | 65 | it->first, |
66 | it->second.getType()); | 66 | it->second.getType()); |
67 | |||
68 | break; | ||
69 | } | 67 | } |
70 | } | 68 | } |
71 | } else if (newX > oldX) | 69 | } else if (newX > oldX) |
@@ -86,8 +84,6 @@ void PonderingSystem::tick(double dt) | |||
86 | newY, | 84 | newY, |
87 | it->first, | 85 | it->first, |
88 | it->second.getType()); | 86 | it->second.getType()); |
89 | |||
90 | break; | ||
91 | } | 87 | } |
92 | } | 88 | } |
93 | } | 89 | } |
@@ -109,8 +105,6 @@ void PonderingSystem::tick(double dt) | |||
109 | newY, | 105 | newY, |
110 | it->first, | 106 | it->first, |
111 | it->second.getType()); | 107 | it->second.getType()); |
112 | |||
113 | break; | ||
114 | } | 108 | } |
115 | } | 109 | } |
116 | } else if (newY > oldY) | 110 | } else if (newY > oldY) |
@@ -131,8 +125,6 @@ void PonderingSystem::tick(double dt) | |||
131 | newY, | 125 | newY, |
132 | it->first, | 126 | it->first, |
133 | it->second.getType()); | 127 | it->second.getType()); |
134 | |||
135 | break; | ||
136 | } | 128 | } |
137 | } | 129 | } |
138 | } | 130 | } |
@@ -141,6 +133,31 @@ void PonderingSystem::tick(double dt) | |||
141 | // Move | 133 | // Move |
142 | transformable.setX(newX); | 134 | transformable.setX(newX); |
143 | transformable.setY(newY); | 135 | transformable.setY(newY); |
136 | |||
137 | // Perform cleanup for orientable entites | ||
138 | if (game_.getEntityManager().hasComponent<OrientableComponent>(entity)) | ||
139 | { | ||
140 | auto& orientable = game_.getEntityManager(). | ||
141 | getComponent<OrientableComponent>(entity); | ||
142 | |||
143 | // Handle changes in groundedness | ||
144 | if (ponderable.isGrounded() != oldGrounded) | ||
145 | { | ||
146 | if (ponderable.isGrounded()) | ||
147 | { | ||
148 | game_.getSystemManager().getSystem<OrientingSystem>().land(entity); | ||
149 | } else { | ||
150 | game_.getSystemManager(). | ||
151 | getSystem<OrientingSystem>().startFalling(entity); | ||
152 | } | ||
153 | } | ||
154 | |||
155 | // Complete dropping, if necessary | ||
156 | if (orientable.getDropState() == OrientableComponent::DropState::active) | ||
157 | { | ||
158 | orientable.setDropState(OrientableComponent::DropState::none); | ||
159 | } | ||
160 | } | ||
144 | } | 161 | } |
145 | } | 162 | } |
146 | 163 | ||
@@ -153,8 +170,7 @@ void PonderingSystem::initializeBody( | |||
153 | 170 | ||
154 | if (type == PonderableComponent::Type::freefalling) | 171 | if (type == PonderableComponent::Type::freefalling) |
155 | { | 172 | { |
156 | ponderable.setAccelY(JUMP_GRAVITY(TILE_HEIGHT*3.5, 0.233)); | 173 | ponderable.setAccelY(NORMAL_GRAVITY); |
157 | ponderable.setState(PonderableComponent::State::falling); | ||
158 | } | 174 | } |
159 | } | 175 | } |
160 | 176 | ||
@@ -172,6 +188,8 @@ void PonderingSystem::processCollision( | |||
172 | auto& transformable = game_.getEntityManager(). | 188 | auto& transformable = game_.getEntityManager(). |
173 | getComponent<TransformableComponent>(entity); | 189 | getComponent<TransformableComponent>(entity); |
174 | 190 | ||
191 | bool touchedGround = false; | ||
192 | |||
175 | switch (type) | 193 | switch (type) |
176 | { | 194 | { |
177 | case MappableComponent::Boundary::Type::wall: | 195 | case MappableComponent::Boundary::Type::wall: |
@@ -204,13 +222,7 @@ void PonderingSystem::processCollision( | |||
204 | 222 | ||
205 | case Direction::down: | 223 | case Direction::down: |
206 | { | 224 | { |
207 | newY = axis - transformable.getH(); | 225 | touchedGround = true; |
208 | ponderable.setVelocityY(0.0); | ||
209 | |||
210 | if (ponderable.getState() == PonderableComponent::State::falling) | ||
211 | { | ||
212 | ponderable.setState(PonderableComponent::State::grounded); | ||
213 | } | ||
214 | 226 | ||
215 | break; | 227 | break; |
216 | } | 228 | } |
@@ -221,31 +233,19 @@ void PonderingSystem::processCollision( | |||
221 | 233 | ||
222 | case MappableComponent::Boundary::Type::platform: | 234 | case MappableComponent::Boundary::Type::platform: |
223 | { | 235 | { |
224 | if (game_.getEntityManager().hasComponent<DroppableComponent>(entity)) | 236 | if (game_.getEntityManager().hasComponent<OrientableComponent>(entity)) |
225 | { | 237 | { |
226 | auto& droppable = game_.getEntityManager(). | 238 | auto& orientable = game_.getEntityManager(). |
227 | getComponent<DroppableComponent>(entity); | 239 | getComponent<OrientableComponent>(entity); |
228 | 240 | ||
229 | if (droppable.isDroppable()) | 241 | if (orientable.getDropState() != OrientableComponent::DropState::none) |
230 | { | 242 | { |
231 | droppable.setDroppable(false); | 243 | orientable.setDropState(OrientableComponent::DropState::active); |
232 | } else { | 244 | } else { |
233 | newY = axis - transformable.getH(); | 245 | touchedGround = true; |
234 | ponderable.setVelocityY(0.0); | ||
235 | |||
236 | if (ponderable.getState() == PonderableComponent::State::falling) | ||
237 | { | ||
238 | ponderable.setState(PonderableComponent::State::grounded); | ||
239 | } | ||
240 | } | 246 | } |
241 | } else { | 247 | } else { |
242 | newY = axis - transformable.getH(); | 248 | touchedGround = true; |
243 | ponderable.setVelocityY(0.0); | ||
244 | |||
245 | if (ponderable.getState() == PonderableComponent::State::falling) | ||
246 | { | ||
247 | ponderable.setState(PonderableComponent::State::grounded); | ||
248 | } | ||
249 | } | 249 | } |
250 | 250 | ||
251 | break; | 251 | break; |
@@ -258,4 +258,11 @@ void PonderingSystem::processCollision( | |||
258 | break; | 258 | break; |
259 | } | 259 | } |
260 | } | 260 | } |
261 | |||
262 | if (touchedGround) | ||
263 | { | ||
264 | newY = axis - transformable.getH(); | ||
265 | ponderable.setVelocityY(0.0); | ||
266 | ponderable.setGrounded(true); | ||
267 | } | ||
261 | } | 268 | } |