diff options
Diffstat (limited to 'src/systems')
| -rw-r--r-- | src/systems/mapping.cpp | 14 | ||||
| -rw-r--r-- | src/systems/playing.cpp | 33 | ||||
| -rw-r--r-- | src/systems/playing.h | 2 | ||||
| -rw-r--r-- | src/systems/pondering.cpp | 88 | ||||
| -rw-r--r-- | src/systems/pondering.h | 9 |
5 files changed, 139 insertions, 7 deletions
| diff --git a/src/systems/mapping.cpp b/src/systems/mapping.cpp index a3a17ec..c7c2f9d 100644 --- a/src/systems/mapping.cpp +++ b/src/systems/mapping.cpp | |||
| @@ -195,4 +195,18 @@ void MappingSystem::loadMap(size_t mapId) | |||
| 195 | MappableComponent::Boundary::Type::danger); | 195 | MappableComponent::Boundary::Type::danger); |
| 196 | } | 196 | } |
| 197 | } | 197 | } |
| 198 | |||
| 199 | for (const Map::Object& object : map.getObjects()) | ||
| 200 | { | ||
| 201 | const Prototype& prototype = game_.getPrototypeManager(). | ||
| 202 | getPrototype(object.getType()); | ||
| 203 | |||
| 204 | id_type emplacedObject = prototype.instantiate( | ||
| 205 | game_, | ||
| 206 | object.getX(), | ||
| 207 | object.getY(), | ||
| 208 | object.getItems()); | ||
| 209 | |||
| 210 | mappable.getInstances()[object.getIndex()] = emplacedObject; | ||
| 211 | } | ||
| 198 | } | 212 | } |
| diff --git a/src/systems/playing.cpp b/src/systems/playing.cpp index 40d9706..5077f8a 100644 --- a/src/systems/playing.cpp +++ b/src/systems/playing.cpp | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | #include "components/playable.h" | 5 | #include "components/playable.h" |
| 6 | #include "components/controllable.h" | 6 | #include "components/controllable.h" |
| 7 | #include "components/orientable.h" | 7 | #include "components/orientable.h" |
| 8 | #include "components/mappable.h" | ||
| 8 | #include "systems/mapping.h" | 9 | #include "systems/mapping.h" |
| 9 | #include "systems/pondering.h" | 10 | #include "systems/pondering.h" |
| 10 | #include "systems/orienting.h" | 11 | #include "systems/orienting.h" |
| @@ -84,7 +85,8 @@ void PlayingSystem::initPlayer() | |||
| 84 | 85 | ||
| 85 | game_.getSystemManager().getSystem<PonderingSystem>().initializeBody( | 86 | game_.getSystemManager().getSystem<PonderingSystem>().initializeBody( |
| 86 | player, | 87 | player, |
| 87 | PonderableComponent::Type::freefalling); | 88 | PonderableComponent::BodyType::freefalling, |
| 89 | PonderableComponent::ColliderType::player); | ||
| 88 | 90 | ||
| 89 | game_.getEntityManager().emplaceComponent<ControllableComponent>(player); | 91 | game_.getEntityManager().emplaceComponent<ControllableComponent>(player); |
| 90 | game_.getEntityManager().emplaceComponent<OrientableComponent>(player); | 92 | game_.getEntityManager().emplaceComponent<OrientableComponent>(player); |
| @@ -173,3 +175,32 @@ void PlayingSystem::die() | |||
| 173 | }); | 175 | }); |
| 174 | } | 176 | } |
| 175 | } | 177 | } |
| 178 | |||
| 179 | void PlayingSystem::save() | ||
| 180 | { | ||
| 181 | playSound("res/Pickup_Coin23.wav", 0.25); | ||
| 182 | |||
| 183 | auto players = game_.getEntityManager().getEntitiesWithComponents< | ||
| 184 | TransformableComponent, | ||
| 185 | PlayableComponent>(); | ||
| 186 | |||
| 187 | auto maps = game_.getEntityManager().getEntitiesWithComponents< | ||
| 188 | MappableComponent>(); | ||
| 189 | |||
| 190 | auto& mappable = game_.getEntityManager(). | ||
| 191 | getComponent<MappableComponent>(*maps.begin()); | ||
| 192 | |||
| 193 | for (id_type player : players) | ||
| 194 | { | ||
| 195 | auto& transformable = game_.getEntityManager(). | ||
| 196 | getComponent<TransformableComponent>(player); | ||
| 197 | |||
| 198 | auto& playable = game_.getEntityManager(). | ||
| 199 | getComponent<PlayableComponent>(player); | ||
| 200 | |||
| 201 | playable.checkpointMapId = mappable.getMapId(); | ||
| 202 | playable.checkpointX = transformable.getX(); | ||
| 203 | playable.checkpointY = transformable.getY(); | ||
| 204 | playable.checkpointObjectActivated = false; | ||
| 205 | } | ||
| 206 | } | ||
| diff --git a/src/systems/playing.h b/src/systems/playing.h index ff16808..d7f5072 100644 --- a/src/systems/playing.h +++ b/src/systems/playing.h | |||
| @@ -23,6 +23,8 @@ public: | |||
| 23 | 23 | ||
| 24 | void die(); | 24 | void die(); |
| 25 | 25 | ||
| 26 | void save(); | ||
| 27 | |||
| 26 | }; | 28 | }; |
| 27 | 29 | ||
| 28 | #endif /* end of include guard: PLAYING_H_70A54F7D */ | 30 | #endif /* end of include guard: PLAYING_H_70A54F7D */ |
| diff --git a/src/systems/pondering.cpp b/src/systems/pondering.cpp index 02d5cfc..9115988 100644 --- a/src/systems/pondering.cpp +++ b/src/systems/pondering.cpp | |||
| @@ -39,7 +39,7 @@ void PonderingSystem::tick(double dt) | |||
| 39 | ponderable.setVelocityY( | 39 | ponderable.setVelocityY( |
| 40 | ponderable.getVelocityY() + ponderable.getAccelY() * dt); | 40 | ponderable.getVelocityY() + ponderable.getAccelY() * dt); |
| 41 | 41 | ||
| 42 | if ((ponderable.getType() == PonderableComponent::Type::freefalling) | 42 | if ((ponderable.getBodyType() == PonderableComponent::BodyType::freefalling) |
| 43 | && (ponderable.getVelocityY() > TERMINAL_VELOCITY)) | 43 | && (ponderable.getVelocityY() > TERMINAL_VELOCITY)) |
| 44 | { | 44 | { |
| 45 | ponderable.setVelocityY(TERMINAL_VELOCITY); | 45 | ponderable.setVelocityY(TERMINAL_VELOCITY); |
| @@ -58,7 +58,7 @@ void PonderingSystem::tick(double dt) | |||
| 58 | 58 | ||
| 59 | std::priority_queue<Collision> collisions; | 59 | std::priority_queue<Collision> collisions; |
| 60 | 60 | ||
| 61 | // Find collisions | 61 | // Find map collisions |
| 62 | for (id_type mapEntity : maps) | 62 | for (id_type mapEntity : maps) |
| 63 | { | 63 | { |
| 64 | auto& mappable = game_.getEntityManager(). | 64 | auto& mappable = game_.getEntityManager(). |
| @@ -366,6 +366,51 @@ void PonderingSystem::tick(double dt) | |||
| 366 | } | 366 | } |
| 367 | } | 367 | } |
| 368 | 368 | ||
| 369 | // Find body collisions | ||
| 370 | for (id_type body : entities) | ||
| 371 | { | ||
| 372 | // Can't collide with self | ||
| 373 | if (body == entity) | ||
| 374 | { | ||
| 375 | continue; | ||
| 376 | } | ||
| 377 | |||
| 378 | // Make sure the body is collidable | ||
| 379 | auto& colliderPonderable = | ||
| 380 | game_.getEntityManager().getComponent<PonderableComponent>(body); | ||
| 381 | |||
| 382 | if (!colliderPonderable.isCollidable()) | ||
| 383 | { | ||
| 384 | continue; | ||
| 385 | } | ||
| 386 | |||
| 387 | // Test if the body was already colliding | ||
| 388 | auto& colliderTransformable = | ||
| 389 | game_.getEntityManager().getComponent<TransformableComponent>(body); | ||
| 390 | |||
| 391 | if ((oldRight > colliderTransformable.getX()) | ||
| 392 | && (oldX < colliderTransformable.getX() + colliderTransformable.getW()) | ||
| 393 | && (oldBottom > colliderTransformable.getY()) | ||
| 394 | && (oldY < colliderTransformable.getY() + colliderTransformable.getH())) | ||
| 395 | { | ||
| 396 | continue; | ||
| 397 | } | ||
| 398 | |||
| 399 | // Test if there is a new collision | ||
| 400 | if (!((newX + transformable.getW() > colliderTransformable.getX()) | ||
| 401 | && (newX < colliderTransformable.getX() + colliderTransformable.getW()) | ||
| 402 | && (newY + transformable.getH() > colliderTransformable.getY()) | ||
| 403 | && (newY < | ||
| 404 | colliderTransformable.getY() + colliderTransformable.getH()))) | ||
| 405 | { | ||
| 406 | continue; | ||
| 407 | } | ||
| 408 | |||
| 409 | // Process the collision | ||
| 410 | processBodyCollision(entity, body); | ||
| 411 | processBodyCollision(body, entity); | ||
| 412 | } | ||
| 413 | |||
| 369 | // Move | 414 | // Move |
| 370 | transformable.setX(newX); | 415 | transformable.setX(newX); |
| 371 | transformable.setY(newY); | 416 | transformable.setY(newY); |
| @@ -399,13 +444,46 @@ void PonderingSystem::tick(double dt) | |||
| 399 | 444 | ||
| 400 | void PonderingSystem::initializeBody( | 445 | void PonderingSystem::initializeBody( |
| 401 | id_type entity, | 446 | id_type entity, |
| 402 | PonderableComponent::Type type) | 447 | PonderableComponent::BodyType bodyType, |
| 448 | PonderableComponent::ColliderType colliderType) | ||
| 403 | { | 449 | { |
| 404 | auto& ponderable = game_.getEntityManager(). | 450 | auto& ponderable = game_.getEntityManager(). |
| 405 | emplaceComponent<PonderableComponent>(entity, type); | 451 | emplaceComponent<PonderableComponent>(entity, bodyType, colliderType); |
| 406 | 452 | ||
| 407 | if (type == PonderableComponent::Type::freefalling) | 453 | if (bodyType == PonderableComponent::BodyType::freefalling) |
| 408 | { | 454 | { |
| 409 | ponderable.setAccelY(NORMAL_GRAVITY); | 455 | ponderable.setAccelY(NORMAL_GRAVITY); |
| 410 | } | 456 | } |
| 411 | } | 457 | } |
| 458 | |||
| 459 | void PonderingSystem::processBodyCollision(id_type body, id_type collider) | ||
| 460 | { | ||
| 461 | auto& bodyPonderable = game_.getEntityManager(). | ||
| 462 | getComponent<PonderableComponent>(body); | ||
| 463 | |||
| 464 | auto& colliderPonderable = game_.getEntityManager(). | ||
| 465 | getComponent<PonderableComponent>(collider); | ||
| 466 | |||
| 467 | switch (colliderPonderable.getColliderType()) | ||
| 468 | { | ||
| 469 | case PonderableComponent::ColliderType::event: | ||
| 470 | { | ||
| 471 | auto& callback = colliderPonderable. | ||
| 472 | getEventCallback(bodyPonderable.getColliderType()); | ||
| 473 | |||
| 474 | if (callback) | ||
| 475 | { | ||
| 476 | callback(game_); | ||
| 477 | } | ||
| 478 | |||
| 479 | break; | ||
| 480 | } | ||
| 481 | |||
| 482 | default: | ||
| 483 | { | ||
| 484 | // Do nothing. | ||
| 485 | |||
| 486 | break; | ||
| 487 | } | ||
| 488 | } | ||
| 489 | } | ||
| diff --git a/src/systems/pondering.h b/src/systems/pondering.h index d70525b..7e342df 100644 --- a/src/systems/pondering.h +++ b/src/systems/pondering.h | |||
| @@ -14,7 +14,14 @@ public: | |||
| 14 | 14 | ||
| 15 | void tick(double dt); | 15 | void tick(double dt); |
| 16 | 16 | ||
| 17 | void initializeBody(id_type entity, PonderableComponent::Type type); | 17 | void initializeBody( |
| 18 | id_type entity, | ||
| 19 | PonderableComponent::BodyType bodyType, | ||
| 20 | PonderableComponent::ColliderType colliderType); | ||
| 21 | |||
| 22 | private: | ||
| 23 | |||
| 24 | void processBodyCollision(id_type body, id_type collider); | ||
| 18 | 25 | ||
| 19 | }; | 26 | }; |
| 20 | 27 | ||
