diff options
| -rw-r--r-- | src/components/ponderable.h | 33 | ||||
| -rw-r--r-- | src/systems/pondering.cpp | 57 | ||||
| -rw-r--r-- | src/systems/pondering.h | 1 |
3 files changed, 89 insertions, 2 deletions
| diff --git a/src/components/ponderable.h b/src/components/ponderable.h index 5354f87..45150a0 100644 --- a/src/components/ponderable.h +++ b/src/components/ponderable.h | |||
| @@ -1,11 +1,15 @@ | |||
| 1 | #ifndef TANGIBLE_H_746DB3EE | 1 | #ifndef TANGIBLE_H_746DB3EE |
| 2 | #define TANGIBLE_H_746DB3EE | 2 | #define TANGIBLE_H_746DB3EE |
| 3 | 3 | ||
| 4 | #include <set> | ||
| 4 | #include "component.h" | 5 | #include "component.h" |
| 6 | #include "entity_manager.h" | ||
| 5 | 7 | ||
| 6 | class PonderableComponent : public Component { | 8 | class PonderableComponent : public Component { |
| 7 | public: | 9 | public: |
| 8 | 10 | ||
| 11 | using id_type = EntityManager::id_type; | ||
| 12 | |||
| 9 | /** | 13 | /** |
| 10 | * List of different types of physical bodies. | 14 | * List of different types of physical bodies. |
| 11 | * | 15 | * |
| @@ -67,6 +71,35 @@ public: | |||
| 67 | bool grounded = false; | 71 | bool grounded = false; |
| 68 | 72 | ||
| 69 | /** | 73 | /** |
| 74 | * Whether or not a freefalling body is being ferried by another body. | ||
| 75 | * | ||
| 76 | * @managed_by PonderingSystem | ||
| 77 | */ | ||
| 78 | bool ferried = false; | ||
| 79 | |||
| 80 | /** | ||
| 81 | * The entity that is ferrying this body, if there is one. | ||
| 82 | * | ||
| 83 | * @managed_by PonderingSystem | ||
| 84 | */ | ||
| 85 | id_type ferry; | ||
| 86 | |||
| 87 | /** | ||
| 88 | * The location of the body relative to the location of its ferry. | ||
| 89 | * | ||
| 90 | * @managed_by PonderingSystem | ||
| 91 | */ | ||
| 92 | double relX; | ||
| 93 | double relY; | ||
| 94 | |||
| 95 | /** | ||
| 96 | * The bodies that are being ferried by this body. | ||
| 97 | * | ||
| 98 | * @managed_by PonderingSystem | ||
| 99 | */ | ||
| 100 | std::set<id_type> passengers; | ||
| 101 | |||
| 102 | /** | ||
| 70 | * If enabled, this will prevent the body from moving. | 103 | * If enabled, this will prevent the body from moving. |
| 71 | */ | 104 | */ |
| 72 | bool frozen = false; | 105 | bool frozen = false; |
| diff --git a/src/systems/pondering.cpp b/src/systems/pondering.cpp index 5143f8e..ccfd66f 100644 --- a/src/systems/pondering.cpp +++ b/src/systems/pondering.cpp | |||
| @@ -57,8 +57,21 @@ void PonderingSystem::tick(double dt) | |||
| 57 | const double oldBottom = oldY + transformable.h; | 57 | const double oldBottom = oldY + transformable.h; |
| 58 | 58 | ||
| 59 | CollisionResult result; | 59 | CollisionResult result; |
| 60 | result.newX = oldX + ponderable.velX * dt; | 60 | |
| 61 | result.newY = oldY + ponderable.velY * dt; | 61 | if (ponderable.ferried) |
| 62 | { | ||
| 63 | auto& ferryTrans = game_.getEntityManager(). | ||
| 64 | getComponent<TransformableComponent>(ponderable.ferry); | ||
| 65 | |||
| 66 | result.newX = ferryTrans.x + ponderable.relX; | ||
| 67 | result.newY = ferryTrans.y + ponderable.relY; | ||
| 68 | } else { | ||
| 69 | result.newX = transformable.x; | ||
| 70 | result.newY = transformable.y; | ||
| 71 | } | ||
| 72 | |||
| 73 | result.newX += ponderable.velX * dt; | ||
| 74 | result.newY += ponderable.velY * dt; | ||
| 62 | 75 | ||
| 63 | bool oldGrounded = ponderable.grounded; | 76 | bool oldGrounded = ponderable.grounded; |
| 64 | ponderable.grounded = false; | 77 | ponderable.grounded = false; |
| @@ -642,6 +655,43 @@ void PonderingSystem::tick(double dt) | |||
| 642 | } | 655 | } |
| 643 | } | 656 | } |
| 644 | 657 | ||
| 658 | // Handle ferry passengers | ||
| 659 | if ((ponderable.type == PonderableComponent::Type::freefalling) && | ||
| 660 | (ponderable.grounded != oldGrounded)) | ||
| 661 | { | ||
| 662 | if (ponderable.grounded && | ||
| 663 | game_.getEntityManager(). | ||
| 664 | hasComponent<PonderableComponent>(result.groundEntity)) | ||
| 665 | { | ||
| 666 | // The body is now being ferried | ||
| 667 | auto& ferryPonder = game_.getEntityManager(). | ||
| 668 | getComponent<PonderableComponent>(result.groundEntity); | ||
| 669 | |||
| 670 | ponderable.ferried = true; | ||
| 671 | ponderable.ferry = result.groundEntity; | ||
| 672 | |||
| 673 | ferryPonder.passengers.insert(entity); | ||
| 674 | } else if (ponderable.ferried) | ||
| 675 | { | ||
| 676 | // The body is no longer being ferried | ||
| 677 | ponderable.ferried = false; | ||
| 678 | |||
| 679 | auto& ferryPonder = game_.getEntityManager(). | ||
| 680 | getComponent<PonderableComponent>(ponderable.ferry); | ||
| 681 | |||
| 682 | ferryPonder.passengers.erase(entity); | ||
| 683 | } | ||
| 684 | } | ||
| 685 | |||
| 686 | if (ponderable.ferried) | ||
| 687 | { | ||
| 688 | auto& ferryTrans = game_.getEntityManager(). | ||
| 689 | getComponent<TransformableComponent>(ponderable.ferry); | ||
| 690 | |||
| 691 | ponderable.relX = transformable.x - ferryTrans.x; | ||
| 692 | ponderable.relY = transformable.y - ferryTrans.y; | ||
| 693 | } | ||
| 694 | |||
| 645 | // Move to an adjacent map, if necessary | 695 | // Move to an adjacent map, if necessary |
| 646 | if (result.adjacentlyWarping) | 696 | if (result.adjacentlyWarping) |
| 647 | { | 697 | { |
| @@ -714,6 +764,8 @@ void PonderingSystem::initPrototype(id_type prototype) | |||
| 714 | ponderable.grounded = false; | 764 | ponderable.grounded = false; |
| 715 | ponderable.frozen = false; | 765 | ponderable.frozen = false; |
| 716 | ponderable.collidable = true; | 766 | ponderable.collidable = true; |
| 767 | ponderable.ferried = false; | ||
| 768 | ponderable.passengers.clear(); | ||
| 717 | } | 769 | } |
| 718 | 770 | ||
| 719 | void PonderingSystem::processCollision( | 771 | void PonderingSystem::processCollision( |
| @@ -900,6 +952,7 @@ void PonderingSystem::processCollision( | |||
| 900 | case Direction::down: | 952 | case Direction::down: |
| 901 | { | 953 | { |
| 902 | result.newY = axis - transformable.h; | 954 | result.newY = axis - transformable.h; |
| 955 | result.groundEntity = collider; | ||
| 903 | ponderable.velY = 0.0; | 956 | ponderable.velY = 0.0; |
| 904 | ponderable.grounded = true; | 957 | ponderable.grounded = true; |
| 905 | 958 | ||
| diff --git a/src/systems/pondering.h b/src/systems/pondering.h index aa430db..b195814 100644 --- a/src/systems/pondering.h +++ b/src/systems/pondering.h | |||
| @@ -29,6 +29,7 @@ private: | |||
| 29 | bool adjacentlyWarping = false; | 29 | bool adjacentlyWarping = false; |
| 30 | Direction adjWarpDir; | 30 | Direction adjWarpDir; |
| 31 | size_t adjWarpMapId; | 31 | size_t adjWarpMapId; |
| 32 | id_type groundEntity; | ||
| 32 | }; | 33 | }; |
| 33 | 34 | ||
| 34 | void processCollision( | 35 | void processCollision( |
