From 2183e0b2a0a5bd9a3e15957b2ca27588574a169e Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Wed, 24 Feb 2021 11:45:06 -0500 Subject: Fixed party trails when running on a ladder --- src/character_system.cpp | 94 +++++++++++++++++++++++++++++------------------- src/character_system.h | 2 ++ src/sprite.h | 1 + 3 files changed, 61 insertions(+), 36 deletions(-) diff --git a/src/character_system.cpp b/src/character_system.cpp index 8a2034a..bc02e6c 100644 --- a/src/character_system.cpp +++ b/src/character_system.cpp @@ -11,6 +11,7 @@ void CharacterSystem::initSprite(int spriteId, int movementSpeed) { Sprite& sprite = game_.getSprite(spriteId); sprite.orientable = true; sprite.movementSpeed = movementSpeed; + sprite.trailsAreHalved = false; } void CharacterSystem::addSpriteToParty(int leaderId, int followerId) { @@ -48,6 +49,7 @@ void CharacterSystem::transplantParty(int leaderId, vec2i pos, Direction dir) { std::vector followers = leader.followers; leader.followers.clear(); + leader.trailsAreHalved = false; game_.getSystem().moveSprite(leaderId, pos); game_.getSystem().setSpriteDirection(leaderId, dir); @@ -123,6 +125,7 @@ void CharacterSystem::tick(double dt) { continue; } + // Make sure this matches up with the code in adjustPartyTrails(). int speed = sprite.movementSpeed; if (sprite.characterState == CharacterState::Running && sprite.characterMedium == CharacterMedium::Normal) { speed *= 2; @@ -167,6 +170,7 @@ void CharacterSystem::tick(double dt) { if (newMedium != sprite.characterMedium) { sprite.characterMedium = newMedium; setAnimationFor(spriteId, sprite.characterState); + adjustPartyTrails(spriteId); } if (sprite.characterState == CharacterState::Running) { @@ -227,49 +231,15 @@ void CharacterSystem::endCrouch(int spriteId) { } void CharacterSystem::startRunning(int spriteId) { - Sprite& sprite = game_.getSprite(spriteId); setPartyState(spriteId, CharacterState::Running); - - for (int followerId : sprite.followers) { - // Halve the movement buffer for the followers. - Sprite& follower = game_.getSprite(followerId); - std::deque newMove; - - while (!follower.trail.empty()) { - newMove.push_back(follower.trail.front()); - follower.trail.pop_front(); - follower.trail.pop_front(); - } - - follower.trail = std::move(newMove); - } + adjustPartyTrails(spriteId); } void CharacterSystem::stopRunning(int spriteId) { Sprite& sprite = game_.getSprite(spriteId); setPartyState(spriteId, CharacterState::Still); stopRunningSound(sprite); - - // Double the movement buffer for the followers. - for (int followerId : sprite.followers) { - Sprite& follower = game_.getSprite(followerId); - - std::deque newMove; - vec2i lastPos = follower.loc; - - while (!follower.trail.empty()) { - Movement m1 = follower.trail.front(); - Movement m2 = m1; - m1.pos = (m1.pos + lastPos) / 2; - lastPos = m2.pos; - - newMove.push_back(m1); - newMove.push_back(m2); - follower.trail.pop_front(); - } - - follower.trail = std::move(newMove); - } + adjustPartyTrails(spriteId); } void CharacterSystem::setPartyState(int spriteId, CharacterState state) { @@ -355,3 +325,55 @@ void CharacterSystem::setAnimationFor(int spriteId, CharacterState state) { } } } + +void CharacterSystem::adjustPartyTrails(int spriteId) { + Sprite& sprite = game_.getSprite(spriteId); + + // Trails should be halved if the effective moving speed is twice the normal + // speed, which right now is whenever you are running and not on a ladder. + bool shouldBeHalved = false; + if (sprite.characterState == CharacterState::Running && sprite.characterMedium == CharacterMedium::Normal) { + shouldBeHalved = true; + } + + if (sprite.trailsAreHalved != shouldBeHalved) { + sprite.trailsAreHalved = shouldBeHalved; + + if (shouldBeHalved) { + // Halve the movement buffer for the followers. + for (int followerId : sprite.followers) { + Sprite& follower = game_.getSprite(followerId); + std::deque newMove; + + while (!follower.trail.empty()) { + newMove.push_back(follower.trail.front()); + follower.trail.pop_front(); + follower.trail.pop_front(); + } + + follower.trail = std::move(newMove); + } + } else { + // Double the movement buffer for the followers. + for (int followerId : sprite.followers) { + Sprite& follower = game_.getSprite(followerId); + + std::deque newMove; + vec2i lastPos = follower.loc; + + while (!follower.trail.empty()) { + Movement m1 = follower.trail.front(); + Movement m2 = m1; + m1.pos = (m1.pos + lastPos) / 2; + lastPos = m2.pos; + + newMove.push_back(m1); + newMove.push_back(m2); + follower.trail.pop_front(); + } + + follower.trail = std::move(newMove); + } + } + } +} diff --git a/src/character_system.h b/src/character_system.h index ef49d0e..0962a6a 100644 --- a/src/character_system.h +++ b/src/character_system.h @@ -50,6 +50,8 @@ private: // state should be the party leader's state void setAnimationFor(int spriteId, CharacterState state); + void adjustPartyTrails(int spriteId); + Game& game_; Timer inputTimer_ {33}; }; diff --git a/src/sprite.h b/src/sprite.h index 3c2eade..bb78442 100644 --- a/src/sprite.h +++ b/src/sprite.h @@ -83,6 +83,7 @@ public: int movementSpeed = 0; // 1 is slow (good for NPCs), 2 is Lucas's default walking speed std::vector followers; std::deque trail; + bool trailsAreHalved = false; CharacterState characterState = CharacterState::Still; CharacterMedium characterMedium = CharacterMedium::Normal; Direction movementDir = Direction::down; -- cgit 1.4.1