Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/game
diff options
context:
space:
mode:
Diffstat (limited to 'source/game')
-rw-r--r--source/game/StarActorMovementController.cpp9
-rw-r--r--source/game/StarActorMovementController.hpp5
-rw-r--r--source/game/StarPlayer.cpp26
-rw-r--r--source/game/StarPlayer.hpp2
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;