summary refs log tree commit diff stats
path: root/src/systems/pondering.cpp
diff options
context:
space:
mode:
authorKelly Rauchenberger <fefferburbia@gmail.com>2018-02-12 16:39:49 -0500
committerKelly Rauchenberger <fefferburbia@gmail.com>2018-02-12 16:39:49 -0500
commit5cc80ec58ea5bd66456f6f5286fa5f26d3fe702b (patch)
tree283cef0e95f237e70892e8b90c841f971cb61fd9 /src/systems/pondering.cpp
parent77be863f4f15d2481a64e4e8dadb4060a6e4e590 (diff)
downloadtherapy-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.cpp89
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
8void PonderingSystem::tick(double dt) 10void 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}