[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