From f0eab98e417bf648261a9027bef91fe935af76cb Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Sat, 20 Feb 2021 13:34:04 -0500 Subject: Added variable movement speed Ionia now moves at half Lucas's speed, which I think is good for NPCs. --- res/maps/map2.tmx | 1 + src/character_system.cpp | 11 +++++++---- src/character_system.h | 2 +- src/consts.h | 4 ++-- src/game.cpp | 8 +++++--- src/input_system.cpp | 3 ++- src/main.cpp | 2 +- src/map.cpp | 2 ++ src/map.h | 1 + src/sprite.h | 1 + 10 files changed, 23 insertions(+), 12 deletions(-) diff --git a/res/maps/map2.tmx b/res/maps/map2.tmx index 87dbb1e..af021bf 100644 --- a/res/maps/map2.tmx +++ b/res/maps/map2.tmx @@ -696,6 +696,7 @@ + diff --git a/src/character_system.cpp b/src/character_system.cpp index 7d456f6..e6dddf6 100644 --- a/src/character_system.cpp +++ b/src/character_system.cpp @@ -7,9 +7,10 @@ #include "animation_system.h" #include "script_system.h" -void CharacterSystem::initSprite(int spriteId) { +void CharacterSystem::initSprite(int spriteId, int movementSpeed) { Sprite& sprite = game_.getSprite(spriteId); sprite.orientable = true; + sprite.movementSpeed = movementSpeed; } void CharacterSystem::addSpriteToParty(int leaderId, int followerId) { @@ -29,8 +30,10 @@ void CharacterSystem::addSpriteToParty(int leaderId, int followerId) { toFace = directionFacingPoint(targetPos - follower.loc); } - for (int i=0; i(PARTY_FRAME_DELAY) + targetPos; + int truePartyDelay = PARTY_FRAME_DELAY / leader.movementSpeed; + + for (int i=0; i(truePartyDelay) + targetPos; follower.trail.push_front({.pos = tween, .dir = toFace}); } @@ -101,7 +104,7 @@ void CharacterSystem::tick(double dt) { continue; } - int speed = MOVEMENT_SPEED; + int speed = sprite.movementSpeed; if (sprite.characterState == CharacterState::Running) { speed *= 2; } diff --git a/src/character_system.h b/src/character_system.h index 8c2ea54..79c1710 100644 --- a/src/character_system.h +++ b/src/character_system.h @@ -17,7 +17,7 @@ public: CharacterSystem(Game& game) : game_(game) {} - void initSprite(int spriteId); + void initSprite(int spriteId, int movementSpeed); void tick(double dt) override; diff --git a/src/consts.h b/src/consts.h index 38e0ef8..e0af6cd 100644 --- a/src/consts.h +++ b/src/consts.h @@ -7,8 +7,8 @@ const int GAME_HEIGHT = 480; const int CANVAS_WIDTH = 240; const int CANVAS_HEIGHT = 160; -const int MOVEMENT_SPEED = 2; -const int PARTY_FRAME_DELAY = 10;// / MOVEMENT_SPEED; +const int LUCAS_MOVEMENT_SPEED = 2; +const int PARTY_FRAME_DELAY = 20; // true delay is this divided by movement speed (so for Lucas walking it's 10) const int MESSAGE_TEXT_WIDTH = 196; diff --git a/src/game.cpp b/src/game.cpp index 5c0017d..b5393a8 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -62,9 +62,11 @@ void Game::loadMap(std::string filename) { getSprite(spriteId).hasShadow = p.shadow; } getSprite(spriteId).interactionScript = p.interactionScript; - if (p.wander) { - getSystem().initSprite(spriteId); - getSprite(spriteId).wander = true; + if (p.movementSpeed != -1) { + getSystem().initSprite(spriteId, p.movementSpeed); + if (p.wander) { + getSprite(spriteId).wander = true; + } } if (!p.enclosureZone.empty()) { getSprite(spriteId).enclosureZone = p.enclosureZone; diff --git a/src/input_system.cpp b/src/input_system.cpp index 2201907..43c59dd 100644 --- a/src/input_system.cpp +++ b/src/input_system.cpp @@ -40,7 +40,8 @@ void InputSystem::tick(double dt) { for (int spriteId : game_.getSprites()) { Sprite& sprite = game_.getSprite(spriteId); if (sprite.controllable) { - vec2i checkLoc = sprite.loc + (unitVecInDirection(sprite.dir) * MOVEMENT_SPEED); + // Interacting with objects always uses Lucas's movement speed. + vec2i checkLoc = sprite.loc + (unitVecInDirection(sprite.dir) * LUCAS_MOVEMENT_SPEED); CollisionResult collision = game_.getSystem().checkCollision(spriteId, checkLoc, sprite.dir); if (collision.horiz.blocked || collision.vert.blocked) { diff --git a/src/main.cpp b/src/main.cpp index 9f503e1..e40b4f4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -40,7 +40,7 @@ void loop(Renderer& renderer, std::mt19937& rng) { game.getSprite(lucasSprite).player = true; game.getSprite(lucasSprite).controllable = true; game.getSprite(lucasSprite).persistent = true; - game.getSystem().initSprite(lucasSprite); + game.getSystem().initSprite(lucasSprite, LUCAS_MOVEMENT_SPEED); game.getSystem().setFollowingSprite(lucasSprite); game.getSystem().unlockCamera(); diff --git a/src/map.cpp b/src/map.cpp index 5845009..d7c1e7e 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -80,6 +80,8 @@ Map::Map(std::string_view name) : name_(name) { p.wander = property.getBoolValue(); } else if (property.getName() == "enclosureZone") { p.enclosureZone = property.getStringValue(); + } else if (property.getName() == "movementSpeed") { + p.movementSpeed = property.getIntValue(); } } diff --git a/src/map.h b/src/map.h index e4096f4..a311be1 100644 --- a/src/map.h +++ b/src/map.h @@ -25,6 +25,7 @@ struct Prototype { std::string interactionScript; bool shadow = false; bool wander = false; + int movementSpeed = -1; std::string enclosureZone; }; diff --git a/src/sprite.h b/src/sprite.h index e0cff0c..4e3e490 100644 --- a/src/sprite.h +++ b/src/sprite.h @@ -70,6 +70,7 @@ public: // Character bool orientable = false; + int movementSpeed = 0; // 1 is slow (good for NPCs), 2 is Lucas's default walking speed std::vector followers; std::deque trail; CharacterState characterState = CharacterState::Still; -- cgit 1.4.1