diff --git a/Source/engine/actor_position.cpp b/Source/engine/actor_position.cpp index f2bf2f849..de52c9457 100644 --- a/Source/engine/actor_position.cpp +++ b/Source/engine/actor_position.cpp @@ -75,7 +75,6 @@ constexpr RoundedWalkVelocity WalkVelocityForFrames[24] = { }; struct WalkParameter { - DisplacementOf startingOffset; VelocityToUse VelocityX; VelocityToUse VelocityY; DisplacementOf getVelocity(int8_t numberOfFrames) const @@ -91,15 +90,15 @@ struct WalkParameter { constexpr std::array WalkParameters { { // clang-format off - // Direction startingOffset, VelocityX, VelocityY - { /* South */ { 0, 0 }, VelocityToUse::None, VelocityToUse::Half }, - { /* SouthWest */ { 0, 0 }, VelocityToUse::NegativeHalf, VelocityToUse::Quarter }, - { /* West */ { 0, 0 }, VelocityToUse::NegativeFull, VelocityToUse::None }, - { /* NorthWest */ { 0, 0 }, VelocityToUse::NegativeHalf, VelocityToUse::NegativeQuarter }, - { /* North */ { 0, 0 }, VelocityToUse::None, VelocityToUse::NegativeHalf }, - { /* NorthEast */ { 0, 0 }, VelocityToUse::Half, VelocityToUse::NegativeQuarter }, - { /* East */ { 0, 0 }, VelocityToUse::Full, VelocityToUse::None }, - { /* SouthEast */ { 0, 0 }, VelocityToUse::Half, VelocityToUse::Quarter } + // Direction VelocityX, VelocityY + { /* South */ VelocityToUse::None, VelocityToUse::Half }, + { /* SouthWest */ VelocityToUse::NegativeHalf, VelocityToUse::Quarter }, + { /* West */ VelocityToUse::NegativeFull, VelocityToUse::None }, + { /* NorthWest */ VelocityToUse::NegativeHalf, VelocityToUse::NegativeQuarter }, + { /* North */ VelocityToUse::None, VelocityToUse::NegativeHalf }, + { /* NorthEast */ VelocityToUse::Half, VelocityToUse::NegativeQuarter }, + { /* East */ VelocityToUse::Full, VelocityToUse::None }, + { /* SouthEast */ VelocityToUse::Half, VelocityToUse::Quarter } // clang-format on } }; @@ -115,9 +114,8 @@ DisplacementOf ActorPosition::CalculateWalkingOffsetShifted4(Direction { int16_t velocityProgress = static_cast(animInfo.getAnimationProgress()) * animInfo.numberOfFrames / AnimationInfo::baseValueFraction; const WalkParameter &walkParameter = WalkParameters[static_cast(dir)]; - DisplacementOf offset = walkParameter.startingOffset; DisplacementOf velocity = walkParameter.getVelocity(animInfo.numberOfFrames); - offset += (velocity * velocityProgress); + DisplacementOf offset = (velocity * velocityProgress); return offset; } diff --git a/Source/monster.cpp b/Source/monster.cpp index 78b53ef3a..dbc7768d7 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -710,18 +710,21 @@ void StartSpecialStand(Monster &monster, Direction md) monster.position.old = monster.position.tile; } -void Walk(Monster &monster, int xadd, int yadd, Direction endDir) +void WalkInDirection(Monster &monster, Direction endDir) { - const auto fx = static_cast(xadd + monster.position.tile.x); - const auto fy = static_cast(yadd + monster.position.tile.y); + Point dir = { 0, 0 }; + dir += endDir; + + const auto fx = static_cast(monster.position.tile.x + dir.x); + const auto fy = static_cast(monster.position.tile.y + dir.y); monster.mode = MonsterMode::MoveNorthwards; monster.position.old = monster.position.tile; monster.position.future = { fx, fy }; monster.occupyTile(monster.position.future, true); - monster.var1 = xadd; - monster.var2 = yadd; - monster.var3 = static_cast(endDir); + monster.var1 = dir.x; + monster.var2 = dir.y; + monster.var3 = static_cast(endDir); NewMonsterAnim(monster, MonsterGraphic::Walk, endDir, AnimationDistributionFlags::ProcessAnimationPending, -1); } @@ -3930,34 +3933,10 @@ bool Walk(Monster &monster, Direction md) return false; } - switch (md) { - case Direction::North: - Walk(monster, -1, -1, Direction::North); - break; - case Direction::NorthEast: - Walk(monster, 0, -1, Direction::NorthEast); - break; - case Direction::East: - Walk(monster, 1, -1, Direction::East); - break; - case Direction::SouthEast: - Walk(monster, 1, 0, Direction::SouthEast); - break; - case Direction::South: - Walk(monster, 1, 1, Direction::South); - break; - case Direction::SouthWest: - Walk(monster, 0, 1, Direction::SouthWest); - break; - case Direction::West: - Walk(monster, -1, 1, Direction::West); - break; - case Direction::NorthWest: - Walk(monster, -1, 0, Direction::NorthWest); - break; - case Direction::NoDirection: - break; - } + if (md == Direction::NoDirection) + return true; + + WalkInDirection(monster, md); return true; } diff --git a/Source/player.cpp b/Source/player.cpp index b19126245..e99f44225 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -60,7 +60,6 @@ namespace { struct DirectionSettings { Direction dir; - DisplacementOf tileAdd; PLR_MODE walkMode; void (*walkModeHandler)(Player &, const DirectionSettings &); }; @@ -77,19 +76,19 @@ void UpdatePlayerLightOffset(Player &player) void Walk(Player &player, const DirectionSettings &walkParams) { player.occupyTile(player.position.future, true); - player.position.temp = player.position.tile + walkParams.tileAdd; + player.position.temp = player.position.tile + walkParams.dir; } constexpr std::array WalkSettings { { // clang-format off - { Direction::South, { 1, 1 }, PM_WALK_SOUTHWARDS, Walk }, - { Direction::SouthWest, { 0, 1 }, PM_WALK_SOUTHWARDS, Walk }, - { Direction::West, { -1, 1 }, PM_WALK_SIDEWAYS, Walk }, - { Direction::NorthWest, { -1, 0 }, PM_WALK_NORTHWARDS, Walk }, - { Direction::North, { -1, -1 }, PM_WALK_NORTHWARDS, Walk }, - { Direction::NorthEast, { 0, -1 }, PM_WALK_NORTHWARDS, Walk }, - { Direction::East, { 1, -1 }, PM_WALK_SIDEWAYS, Walk }, - { Direction::SouthEast, { 1, 0 }, PM_WALK_SOUTHWARDS, Walk } + { Direction::South, PM_WALK_SOUTHWARDS, Walk }, + { Direction::SouthWest, PM_WALK_SOUTHWARDS, Walk }, + { Direction::West, PM_WALK_SIDEWAYS, Walk }, + { Direction::NorthWest, PM_WALK_NORTHWARDS, Walk }, + { Direction::North, PM_WALK_NORTHWARDS, Walk }, + { Direction::NorthEast, PM_WALK_NORTHWARDS, Walk }, + { Direction::East, PM_WALK_SIDEWAYS, Walk }, + { Direction::SouthEast, PM_WALK_SOUTHWARDS, Walk } // clang-format on } }; @@ -123,7 +122,7 @@ void HandleWalkMode(Player &player, Direction dir) player._pdir = dir; // The player's tile position after finishing this movement action - player.position.future = player.position.tile + dirModeParams.tileAdd; + player.position.future = player.position.tile + dirModeParams.dir; dirModeParams.walkModeHandler(player, dirModeParams);