diff options
Diffstat (limited to 'src/systems')
| -rw-r--r-- | src/systems/pondering.cpp | 57 | ||||
| -rw-r--r-- | src/systems/pondering.h | 1 |
2 files changed, 56 insertions, 2 deletions
| 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( |
