summary refs log tree commit diff stats
path: root/src/systems/pondering.cpp
diff options
context:
space:
mode:
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}