[Scummvm-git-logs] scummvm master -> def4530dab482b15afbbf3ccdb22c111ae50e9b1
athrxx
noreply at scummvm.org
Sat Nov 18 20:53:40 UTC 2023
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
def4530dab SCUMM: (v7/8) - fix walk code glitch
Commit: def4530dab482b15afbbf3ccdb22c111ae50e9b1
https://github.com/scummvm/scummvm/commit/def4530dab482b15afbbf3ccdb22c111ae50e9b1
Author: athrxx (athrxx at scummvm.org)
Date: 2023-11-18T21:52:44+01:00
Commit Message:
SCUMM: (v7/8) - fix walk code glitch
(for situations with x/y-flip box flags)
Changed paths:
engines/scumm/actor.cpp
engines/scumm/actor.h
diff --git a/engines/scumm/actor.cpp b/engines/scumm/actor.cpp
index b7111322a71..896b5c453bc 100644
--- a/engines/scumm/actor.cpp
+++ b/engines/scumm/actor.cpp
@@ -182,6 +182,7 @@ void Actor::initActor(int mode) {
_charset = 0;
memset(_sound, 0, sizeof(_sound));
_targetFacing = _facing;
+ _walkdata.nextDir = -1;
_lastValidX = 0;
_lastValidY = 0;
@@ -544,7 +545,7 @@ int Actor::calcMovementFactor(const Common::Point& next) {
_walkdata.deltaYFactor = deltaYFactor;
if (_vm->_game.version >= 7)
- _targetFacing = ((int)(atan2((double)deltaXFactor, (double)-deltaYFactor) * 180 / M_PI) + 360) % 360;
+ _walkdata.nextDir = ((int)(atan2((double)deltaXFactor, (double)-deltaYFactor) * 180 / M_PI) + 360) % 360;
else
_targetFacing = (ABS(diffY) * 3 > ABS(diffX)) ? (deltaYFactor > 0 ? 180 : 0) : (deltaXFactor > 0 ? 90 : 270);
@@ -597,7 +598,7 @@ int Actor_v3::calcMovementFactor(const Common::Point& next) {
int Actor::actorWalkStep() {
_needRedraw = true;
- int nextFacing = (_vm->_game.version < 7) ? updateActorDirection(true) : _targetFacing;
+ int nextFacing = (_vm->_game.version < 7) ? updateActorDirection(true) : _walkdata.nextDir;
if (!(_moving & MF_IN_LEG) || _facing != nextFacing) {
if (_walkFrame != _frame || _facing != nextFacing) {
startWalkAnim(_vm->_game.version >= 7 && (_moving & MF_IN_LEG) ? 2 : 1, nextFacing);
@@ -870,11 +871,10 @@ void Actor::startWalkActor(int destX, int destY, int dir) {
}
void Actor::startWalkAnim(int cmd, int angle) {
- if (angle == -1)
- angle = _facing;
-
if (_vm->_game.version >= 7)
- angle = remapDirection(normalizeAngle(_vm->_costumeLoader->hasManyDirections(_costume), angle), false);
+ angle = remapDirection(normalizeAngle(_vm->_costumeLoader->hasManyDirections(_costume), angle == -1 ? _walkdata.nextDir : angle), false);
+ else if (angle == -1)
+ angle = _facing;
if (_walkScript) {
int args[NUM_SCRIPT_LOCAL];
@@ -1617,6 +1617,12 @@ void Actor_v7::turnToDirection(int newdir) {
newdir = remapDirection((newdir + 360) % 360, false);
_moving &= ~MF_TURN;
+ byte flags = _vm->getBoxFlags(_walkbox);
+ if ((flags & kBoxXFlip) || isInClass(kObjectClassXFlip))
+ newdir = 360 - newdir;
+ if ((flags & kBoxYFlip) || isInClass(kObjectClassYFlip))
+ newdir = 180 - newdir;
+
if (newdir != _facing) {
_moving |= MF_TURN;
_targetFacing = newdir;
diff --git a/engines/scumm/actor.h b/engines/scumm/actor.h
index 88b6ffb6c14..7e765f884f6 100644
--- a/engines/scumm/actor.h
+++ b/engines/scumm/actor.h
@@ -151,6 +151,7 @@ protected:
int32 deltaXFactor, deltaYFactor;
uint16 xfrac, yfrac;
uint16 xAdd, yAdd;
+ int32 nextDir;
void reset() {
dest.x = dest.y = 0;
@@ -166,6 +167,7 @@ protected:
yfrac = 0;
xAdd = 0;
yAdd = 0;
+ nextDir = 0;
}
};
More information about the Scummvm-git-logs
mailing list