diff options
Diffstat (limited to 'source/game')
-rw-r--r-- | source/game/StarActorMovementController.cpp | 9 | ||||
-rw-r--r-- | source/game/StarActorMovementController.hpp | 5 | ||||
-rw-r--r-- | source/game/StarPlayer.cpp | 26 | ||||
-rw-r--r-- | source/game/StarPlayer.hpp | 2 |
4 files changed, 41 insertions, 1 deletions
diff --git a/source/game/StarActorMovementController.cpp b/source/game/StarActorMovementController.cpp index 1b8f0e4..9dc9ef8 100644 --- a/source/game/StarActorMovementController.cpp +++ b/source/game/StarActorMovementController.cpp @@ -446,6 +446,7 @@ ActorMovementController::ActorMovementController(ActorMovementParameters const& m_lastControlJump = false; m_lastControlDown = false; m_targetHorizontalAmbulatingVelocity = 0.0f; + m_moveSpeedMultiplier = 1.0f; resetBaseParameters(parameters); } @@ -696,6 +697,10 @@ Maybe<pair<Vec2F, bool>> ActorMovementController::controlPathMove(Vec2F const& p return result; } +void ActorMovementController::setMoveSpeedMultiplier(float scale) { + m_moveSpeedMultiplier = scale; +} + void ActorMovementController::clearControls() { m_controlRotationRate = 0.0f; m_controlAcceleration = Vec2F(); @@ -951,6 +956,8 @@ void ActorMovementController::tickMaster() { : *activeParameters.walkSpeed * activeModifiers.speedModifier); } + m_targetHorizontalAmbulatingVelocity *= m_moveSpeedMultiplier; + if (m_liquidMovement.get()) m_targetHorizontalAmbulatingVelocity *= (1.0f - liquidImpedance); @@ -1102,7 +1109,7 @@ void ActorMovementController::doSetAnchorState(Maybe<EntityAnchorState> anchorSt if (m_entityAnchor) setPosition(m_entityAnchor->position); } - + PathController::PathController(World* world) : m_world(world), m_edgeTimer(0.0) { } diff --git a/source/game/StarActorMovementController.hpp b/source/game/StarActorMovementController.hpp index 11731eb..38cc6a0 100644 --- a/source/game/StarActorMovementController.hpp +++ b/source/game/StarActorMovementController.hpp @@ -239,6 +239,9 @@ public: Maybe<pair<Vec2F, bool>> pathMove(Vec2F const& pathPosition, bool run = false, Maybe<PlatformerAStar::Parameters> const& parameters = {}); Maybe<pair<Vec2F, bool>> controlPathMove(Vec2F const& pathPosition, bool run = false, Maybe<PlatformerAStar::Parameters> const& parameters = {}); + // Used for user controller input. + void setMoveSpeedMultiplier(float multiplier = 1.0f); + // Clears all control data. void clearControls(); @@ -248,6 +251,7 @@ public: void tickSlave(); + private: struct ApproachVelocityCommand { Vec2F targetVelocity; @@ -313,6 +317,7 @@ private: int m_fallThroughSustain; bool m_lastControlJump; bool m_lastControlDown; + float m_moveSpeedMultiplier; GameTimer m_reJumpTimer; Maybe<GameTimer> m_jumpHoldTimer; diff --git a/source/game/StarPlayer.cpp b/source/game/StarPlayer.cpp index ccfea66..dd74503 100644 --- a/source/game/StarPlayer.cpp +++ b/source/game/StarPlayer.cpp @@ -669,6 +669,10 @@ void Player::special(int specialKey) { m_techController->special(specialKey); } +void Player::setMoveVector(Vec2F const& vec) { + m_moveVector = vec; +} + void Player::moveLeft() { m_pendingMoves.add(MoveControlType::Left); } @@ -1543,6 +1547,24 @@ void Player::disableInterpolation() { void Player::processControls() { bool run = !m_shifting && !m_statusController->statPositive("encumberance"); + + bool useMoveVector = m_moveVector.x() != 0.0f; + if (useMoveVector) { + for (auto move : m_pendingMoves) { + if (move == MoveControlType::Left || move == MoveControlType::Right) { + useMoveVector = false; + break; + } + } + } + + if (useMoveVector) { + m_pendingMoves.insert(signbit(m_moveVector.x()) ? MoveControlType::Left : MoveControlType::Right); + m_movementController->setMoveSpeedMultiplier(clamp(abs(m_moveVector.x()), 0.0f, 1.0f)); + } + else + m_movementController->setMoveSpeedMultiplier(1.0f); + if (auto fireableMain = as<FireableItem>(m_tools->primaryHandItem())) { if (fireableMain->inUse() && fireableMain->walkWhileFiring()) run = false; @@ -1621,6 +1643,7 @@ void Player::processControls() { void Player::processStateChanges() { if (isMaster()) { + // Set the current player state based on what movement controller tells us // we're doing and do some state transition logic State oldState = m_state; @@ -1662,6 +1685,9 @@ void Player::processStateChanges() { } } + if (m_moveVector.x() != 0.0f && (m_state == State::Run || m_state == State::Walk)) + m_state = abs(m_moveVector.x()) > 0.5f ? State::Run : State::Walk; + if (m_state == State::Jump && (oldState == State::Idle || oldState == State::Run || oldState == State::Walk || oldState == State::Crouch)) m_effectsAnimator->burstParticleEmitter("jump"); diff --git a/source/game/StarPlayer.hpp b/source/game/StarPlayer.hpp index 1129b06..f989a77 100644 --- a/source/game/StarPlayer.hpp +++ b/source/game/StarPlayer.hpp @@ -132,6 +132,7 @@ public: void setShifting(bool shifting); void special(int specialKey); + void setMoveVector(Vec2F const& vec); void moveLeft(); void moveRight(); void moveUp(); @@ -505,6 +506,7 @@ private: Vec2F m_blinkInterval; HashSet<MoveControlType> m_pendingMoves; + Vec2F m_moveVector; bool m_shifting; ActorMovementParameters m_zeroGMovementParameters; |