diff options
-rw-r--r-- | src/components/ponderable.h | 5 | ||||
-rw-r--r-- | src/systems/pondering.cpp | 50 |
2 files changed, 33 insertions, 22 deletions
diff --git a/src/components/ponderable.h b/src/components/ponderable.h index 45150a0..6a01400 100644 --- a/src/components/ponderable.h +++ b/src/components/ponderable.h | |||
@@ -100,7 +100,10 @@ public: | |||
100 | std::set<id_type> passengers; | 100 | std::set<id_type> passengers; |
101 | 101 | ||
102 | /** | 102 | /** |
103 | * If enabled, this will prevent the body from moving. | 103 | * If enabled, this will prevent the body from moving and accelerating. The |
104 | * velocity and position of the body can still be affected by sources external | ||
105 | * to the PonderingSystem. Enabling this will cause applicable bodies to | ||
106 | * become ungrounded and unferried. | ||
104 | */ | 107 | */ |
105 | bool frozen = false; | 108 | bool frozen = false; |
106 | 109 | ||
diff --git a/src/systems/pondering.cpp b/src/systems/pondering.cpp index e6417eb..0be3add 100644 --- a/src/systems/pondering.cpp +++ b/src/systems/pondering.cpp | |||
@@ -91,9 +91,9 @@ void PonderingSystem::tickBody( | |||
91 | auto& ponderable = game_.getEntityManager(). | 91 | auto& ponderable = game_.getEntityManager(). |
92 | getComponent<PonderableComponent>(entity); | 92 | getComponent<PonderableComponent>(entity); |
93 | 93 | ||
94 | if (!ponderable.active || ponderable.frozen) | 94 | if (!ponderable.active) |
95 | { | 95 | { |
96 | continue; | 96 | return; |
97 | } | 97 | } |
98 | 98 | ||
99 | auto& realizable = game_.getEntityManager(). | 99 | auto& realizable = game_.getEntityManager(). |
@@ -109,13 +109,16 @@ void PonderingSystem::tickBody( | |||
109 | getComponent<TransformableComponent>(entity); | 109 | getComponent<TransformableComponent>(entity); |
110 | 110 | ||
111 | // Accelerate | 111 | // Accelerate |
112 | ponderable.velX += ponderable.accelX * dt; | 112 | if (!ponderable.frozen) |
113 | ponderable.velY += ponderable.accelY * dt; | ||
114 | |||
115 | if ((ponderable.type == PonderableComponent::Type::freefalling) | ||
116 | && (ponderable.velY > TERMINAL_VELOCITY)) | ||
117 | { | 113 | { |
118 | ponderable.velY = TERMINAL_VELOCITY; | 114 | ponderable.velX += ponderable.accelX * dt; |
115 | ponderable.velY += ponderable.accelY * dt; | ||
116 | |||
117 | if ((ponderable.type == PonderableComponent::Type::freefalling) | ||
118 | && (ponderable.velY > TERMINAL_VELOCITY)) | ||
119 | { | ||
120 | ponderable.velY = TERMINAL_VELOCITY; | ||
121 | } | ||
119 | } | 122 | } |
120 | 123 | ||
121 | const double oldX = transformable.x; | 124 | const double oldX = transformable.x; |
@@ -124,21 +127,23 @@ void PonderingSystem::tickBody( | |||
124 | const double oldBottom = oldY + transformable.h; | 127 | const double oldBottom = oldY + transformable.h; |
125 | 128 | ||
126 | CollisionResult result; | 129 | CollisionResult result; |
130 | result.newX = transformable.x; | ||
131 | result.newY = transformable.y; | ||
127 | 132 | ||
128 | if (ponderable.ferried) | 133 | if (!ponderable.frozen) |
129 | { | 134 | { |
130 | auto& ferryTrans = game_.getEntityManager(). | 135 | if (ponderable.ferried) |
131 | getComponent<TransformableComponent>(ponderable.ferry); | 136 | { |
137 | auto& ferryTrans = game_.getEntityManager(). | ||
138 | getComponent<TransformableComponent>(ponderable.ferry); | ||
132 | 139 | ||
133 | result.newX = ferryTrans.x + ponderable.relX; | 140 | result.newX = ferryTrans.x + ponderable.relX; |
134 | result.newY = ferryTrans.y + ponderable.relY; | 141 | result.newY = ferryTrans.y + ponderable.relY; |
135 | } else { | 142 | } |
136 | result.newX = transformable.x; | ||
137 | result.newY = transformable.y; | ||
138 | } | ||
139 | 143 | ||
140 | result.newX += ponderable.velX * dt; | 144 | result.newX += ponderable.velX * dt; |
141 | result.newY += ponderable.velY * dt; | 145 | result.newY += ponderable.velY * dt; |
146 | } | ||
142 | 147 | ||
143 | bool oldGrounded = ponderable.grounded; | 148 | bool oldGrounded = ponderable.grounded; |
144 | ponderable.grounded = false; | 149 | ponderable.grounded = false; |
@@ -694,8 +699,11 @@ void PonderingSystem::tickBody( | |||
694 | } | 699 | } |
695 | 700 | ||
696 | // Move | 701 | // Move |
697 | transformable.x = result.newX; | 702 | if (!ponderable.frozen) |
698 | transformable.y = result.newY; | 703 | { |
704 | transformable.x = result.newX; | ||
705 | transformable.y = result.newY; | ||
706 | } | ||
699 | 707 | ||
700 | // Perform cleanup for orientable entites | 708 | // Perform cleanup for orientable entites |
701 | if (game_.getEntityManager().hasComponent<OrientableComponent>(entity)) | 709 | if (game_.getEntityManager().hasComponent<OrientableComponent>(entity)) |