[Scummvm-git-logs] scummvm master -> e3775f1f15e2a6c37cde8790d9f392c338d88762

athrxx athrxx at scummvm.org
Tue Aug 10 17:48:58 UTC 2021


This automated email contains information about 5 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
0876537f06 SCUMM: (DOTT) - fix bug no. 12776 ("Use after free error in DOTT intro")
78252d9c2a SCUMM: (DOTT) - fix bug no. 11445 ("George Washington faces Left instead of Forward, after chopping down the Cherry Tree
21b2411490 SCUMM: (SCUMM5/6) - extend DOTT walk code fix to more targets
b5171e3567 SCUMM: (FT) - fix actor facing in calcMovementFactor
e3775f1f15 SCUMM: (SCUMM4) - extend DOTT walk code fix to another target


Commit: 0876537f063d89aebfee1fb74e5816fd235e359a
    https://github.com/scummvm/scummvm/commit/0876537f063d89aebfee1fb74e5816fd235e359a
Author: athrxx (athrxx at scummvm.org)
Date: 2021-08-10T19:44:14+02:00

Commit Message:
SCUMM: (DOTT) - fix bug no. 12776 ("Use after free error in DOTT intro")

Changed paths:
    engines/scumm/imuse/imuse_internal.h
    engines/scumm/imuse/imuse_player.cpp


diff --git a/engines/scumm/imuse/imuse_internal.h b/engines/scumm/imuse/imuse_internal.h
index 51687170c6..ca95a250c4 100644
--- a/engines/scumm/imuse/imuse_internal.h
+++ b/engines/scumm/imuse/imuse_internal.h
@@ -178,8 +178,16 @@ protected:
 	static uint16 _active_notes[128];
 
 protected:
+	enum ParserType {
+		kParserTypeNone = 0,
+		kParserTypeRO,
+		kParserTypeXMI,
+		kParserTypeSMF
+	};
+
 	MidiDriver *_midi;
 	MidiParser *_parser;
+	ParserType _parserType;
 
 	Part *_parts;
 	bool _active;
diff --git a/engines/scumm/imuse/imuse_player.cpp b/engines/scumm/imuse/imuse_player.cpp
index 48d35b5c27..454fd8c3a2 100644
--- a/engines/scumm/imuse/imuse_player.cpp
+++ b/engines/scumm/imuse/imuse_player.cpp
@@ -82,7 +82,8 @@ Player::Player() :
 	_se(0),
 	_vol_chan(0),
 	_abort(false),
-	_music_tick(0) {
+	_music_tick(0),
+	_parserType(kParserTypeNone) {
 }
 
 Player::~Player() {
@@ -151,9 +152,9 @@ void Player::clear() {
 
 	if (_parser) {
 		_parser->unloadMusic();
-		delete _parser;
-		_parser = 0;
+		_parser->setMidiDriver(NULL);
 	}
+
 	uninit_parts();
 	_se->ImFireAllTriggers(_id);
 	_active = false;
@@ -181,17 +182,28 @@ int Player::start_seq_sound(int sound, bool reset_vars) {
 	ptr = _se->findStartOfSound(sound);
 	if (ptr == NULL)
 		return -1;
-	delete _parser;
 
 	if (!memcmp(ptr, "RO", 2)) {
 		// Old style 'RO' resource
-		_parser = MidiParser_createRO();
+		if (_parserType != kParserTypeRO) {
+			delete _parser;
+			_parser = MidiParser_createRO();
+			_parserType = kParserTypeRO;
+		}
 	} else if (!memcmp(ptr, "FORM", 4)) {
 		// Humongous Games XMIDI resource
-		_parser = MidiParser::createParser_XMIDI();
+		if (_parserType != kParserTypeXMI) {
+			delete _parser;
+			_parser = MidiParser::createParser_XMIDI();
+			_parserType = kParserTypeXMI;
+		}
 	} else {
 		// SCUMM SMF resource
-		_parser = MidiParser::createParser_SMF();
+		if (_parserType != kParserTypeSMF) {
+			delete _parser;
+			_parser = MidiParser::createParser_SMF();
+			_parserType = kParserTypeSMF;
+		}
 	}
 
 	_parser->setMidiDriver(this);
@@ -1010,6 +1022,7 @@ void Player::fixAfterLoad() {
 	if (!_midi) {
 		clear();
 	} else {
+		_parserType = kParserTypeNone;
 		start_seq_sound(_id, false);
 		setSpeed(_speed);
 		if (_parser)


Commit: 78252d9c2a9e89d3e22102225c68325b9da8846c
    https://github.com/scummvm/scummvm/commit/78252d9c2a9e89d3e22102225c68325b9da8846c
Author: athrxx (athrxx at scummvm.org)
Date: 2021-08-10T19:45:10+02:00

Commit Message:
SCUMM: (DOTT) - fix bug no. 11445 ("George Washington faces Left instead of Forward, after chopping down the Cherry Tree")

I have limited this to DOTT for now, since I haven't checked anything else...

Changed paths:
    engines/scumm/actor.cpp


diff --git a/engines/scumm/actor.cpp b/engines/scumm/actor.cpp
index 9ee1393dd7..79b4847a66 100644
--- a/engines/scumm/actor.cpp
+++ b/engines/scumm/actor.cpp
@@ -465,20 +465,15 @@ void Actor::setActorWalkSpeed(uint newSpeedX, uint newSpeedY) {
 	}
 }
 
-int getAngleFromPos(int x, int y, bool useATAN) {
-	if (useATAN) {
-		double temp = atan2((double)x, (double)-y);
-		return normalizeAngle((int)(temp * 180 / M_PI));
+int getAngleFromPos(int x, int y) {
+	if (ABS(y) * 2 < ABS(x)) {
+		if (x > 0)
+			return 90;
+		return 270;
 	} else {
-		if (ABS(y) * 2 < ABS(x)) {
-			if (x > 0)
-				return 90;
-			return 270;
-		} else {
-			if (y > 0)
-				return 180;
-			return 0;
-		}
+		if (y > 0)
+			return 180;
+		return 0;
 	}
 }
 
@@ -523,7 +518,14 @@ int Actor::calcMovementFactor(const Common::Point& next) {
 	_walkdata.deltaXFactor = deltaXFactor;
 	_walkdata.deltaYFactor = deltaYFactor;
 
-	_targetFacing = getAngleFromPos(deltaXFactor, deltaYFactor, (_vm->_game.id == GID_DIG || _vm->_game.id == GID_CMI));
+	if (_vm->_game.id == GID_DIG || _vm->_game.id == GID_CMI) {
+		double temp = atan2((double)deltaXFactor, (double)-deltaYFactor);
+		_targetFacing = normalizeAngle((int)(temp * 180 / M_PI));
+	} else if (_vm->_game.id == GID_TENTACLE) {
+		_targetFacing = ((ABS(diffY) * 3) > ABS(diffX)) ? (deltaYFactor > 0 ? 180 : 0) : (deltaXFactor > 0 ? 90 : 270);
+	} else {
+		_targetFacing = getAngleFromPos(deltaXFactor, deltaYFactor);
+	}
 
 	return actorWalkStep();
 }
@@ -969,15 +971,15 @@ UpdateActorDirection:;
 
 		if (!_walkYCountGreaterThanXCount) {
 			if (_walkDirX) {
-				_targetFacing = getAngleFromPos(V12_X_MULTIPLIER*1, V12_Y_MULTIPLIER*0, false);
+				_targetFacing = getAngleFromPos(V12_X_MULTIPLIER*1, V12_Y_MULTIPLIER*0);
 			} else {
-				_targetFacing = getAngleFromPos(V12_X_MULTIPLIER*-1, V12_Y_MULTIPLIER*0, false);
+				_targetFacing = getAngleFromPos(V12_X_MULTIPLIER*-1, V12_Y_MULTIPLIER*0);
 			}
 		} else {
 			if (_walkDirY) {
-				_targetFacing = getAngleFromPos(V12_X_MULTIPLIER*0, V12_Y_MULTIPLIER*1, false);
+				_targetFacing = getAngleFromPos(V12_X_MULTIPLIER*0, V12_Y_MULTIPLIER*1);
 			} else {
-				_targetFacing = getAngleFromPos(V12_X_MULTIPLIER*0, V12_Y_MULTIPLIER*-1, false);
+				_targetFacing = getAngleFromPos(V12_X_MULTIPLIER*0, V12_Y_MULTIPLIER*-1);
 			}
 		}
 
@@ -1139,9 +1141,9 @@ UpdateActorDirection:;
 				_moving |= A;
 
 				if (_walkDirY) {
-					_targetFacing = getAngleFromPos(V12_X_MULTIPLIER*0, V12_Y_MULTIPLIER*1, false);
+					_targetFacing = getAngleFromPos(V12_X_MULTIPLIER*0, V12_Y_MULTIPLIER*1);
 				} else {
-					_targetFacing = getAngleFromPos(V12_X_MULTIPLIER*0, V12_Y_MULTIPLIER*-1, false);
+					_targetFacing = getAngleFromPos(V12_X_MULTIPLIER*0, V12_Y_MULTIPLIER*-1);
 				}
 
 				directionUpdate();
@@ -1171,9 +1173,9 @@ UpdateActorDirection:;
 				_moving |= A;
 
 				if (_walkDirX) {
-					_targetFacing = getAngleFromPos(V12_X_MULTIPLIER*1, V12_Y_MULTIPLIER*0, false);
+					_targetFacing = getAngleFromPos(V12_X_MULTIPLIER*1, V12_Y_MULTIPLIER*0);
 				} else {
-					_targetFacing = getAngleFromPos(V12_X_MULTIPLIER*-1, V12_Y_MULTIPLIER*0, false);
+					_targetFacing = getAngleFromPos(V12_X_MULTIPLIER*-1, V12_Y_MULTIPLIER*0);
 				}
 
 				directionUpdate();


Commit: 21b2411490ecdc4ba961c608bed72eb1d20ba29f
    https://github.com/scummvm/scummvm/commit/21b2411490ecdc4ba961c608bed72eb1d20ba29f
Author: athrxx (athrxx at scummvm.org)
Date: 2021-08-10T19:46:16+02:00

Commit Message:
SCUMM: (SCUMM5/6) - extend DOTT walk code fix to more targets

I have verified this for all SCUMM5/6 games.

Changed paths:
    engines/scumm/actor.cpp


diff --git a/engines/scumm/actor.cpp b/engines/scumm/actor.cpp
index 79b4847a66..4c37664495 100644
--- a/engines/scumm/actor.cpp
+++ b/engines/scumm/actor.cpp
@@ -518,11 +518,11 @@ int Actor::calcMovementFactor(const Common::Point& next) {
 	_walkdata.deltaXFactor = deltaXFactor;
 	_walkdata.deltaYFactor = deltaYFactor;
 
-	if (_vm->_game.id == GID_DIG || _vm->_game.id == GID_CMI) {
+	if (_vm->_game.version >= 5 && _vm->_game.version <= 6) {
+		_targetFacing = ((ABS(diffY) * 3) > ABS(diffX)) ? (deltaYFactor > 0 ? 180 : 0) : (deltaXFactor > 0 ? 90 : 270);
+	} else if (_vm->_game.id == GID_DIG || _vm->_game.id == GID_CMI) {
 		double temp = atan2((double)deltaXFactor, (double)-deltaYFactor);
 		_targetFacing = normalizeAngle((int)(temp * 180 / M_PI));
-	} else if (_vm->_game.id == GID_TENTACLE) {
-		_targetFacing = ((ABS(diffY) * 3) > ABS(diffX)) ? (deltaYFactor > 0 ? 180 : 0) : (deltaXFactor > 0 ? 90 : 270);
 	} else {
 		_targetFacing = getAngleFromPos(deltaXFactor, deltaYFactor);
 	}


Commit: b5171e35670baf3996af7784a6bea67729aa2118
    https://github.com/scummvm/scummvm/commit/b5171e35670baf3996af7784a6bea67729aa2118
Author: athrxx (athrxx at scummvm.org)
Date: 2021-08-10T19:46:37+02:00

Commit Message:
SCUMM: (FT) - fix actor facing in calcMovementFactor

(verified from disasm that FT uses the same method as DIG and COMI)

Changed paths:
    engines/scumm/actor.cpp


diff --git a/engines/scumm/actor.cpp b/engines/scumm/actor.cpp
index 4c37664495..21de7062d8 100644
--- a/engines/scumm/actor.cpp
+++ b/engines/scumm/actor.cpp
@@ -518,14 +518,12 @@ int Actor::calcMovementFactor(const Common::Point& next) {
 	_walkdata.deltaXFactor = deltaXFactor;
 	_walkdata.deltaYFactor = deltaYFactor;
 
-	if (_vm->_game.version >= 5 && _vm->_game.version <= 6) {
+	if (_vm->_game.version >= 7)
+		_targetFacing = normalizeAngle((int)(atan2((double)deltaXFactor, (double)-deltaYFactor) * 180 / M_PI));
+	else if (_vm->_game.version >= 5)
 		_targetFacing = ((ABS(diffY) * 3) > ABS(diffX)) ? (deltaYFactor > 0 ? 180 : 0) : (deltaXFactor > 0 ? 90 : 270);
-	} else if (_vm->_game.id == GID_DIG || _vm->_game.id == GID_CMI) {
-		double temp = atan2((double)deltaXFactor, (double)-deltaYFactor);
-		_targetFacing = normalizeAngle((int)(temp * 180 / M_PI));
-	} else {
+	else 
 		_targetFacing = getAngleFromPos(deltaXFactor, deltaYFactor);
-	}
 
 	return actorWalkStep();
 }


Commit: e3775f1f15e2a6c37cde8790d9f392c338d88762
    https://github.com/scummvm/scummvm/commit/e3775f1f15e2a6c37cde8790d9f392c338d88762
Author: athrxx (athrxx at scummvm.org)
Date: 2021-08-10T19:48:40+02:00

Commit Message:
SCUMM: (SCUMM4) - extend DOTT walk code fix to another target

(verified from disasm)

Changed paths:
    engines/scumm/actor.cpp


diff --git a/engines/scumm/actor.cpp b/engines/scumm/actor.cpp
index 21de7062d8..768c927610 100644
--- a/engines/scumm/actor.cpp
+++ b/engines/scumm/actor.cpp
@@ -520,10 +520,8 @@ int Actor::calcMovementFactor(const Common::Point& next) {
 
 	if (_vm->_game.version >= 7)
 		_targetFacing = normalizeAngle((int)(atan2((double)deltaXFactor, (double)-deltaYFactor) * 180 / M_PI));
-	else if (_vm->_game.version >= 5)
-		_targetFacing = ((ABS(diffY) * 3) > ABS(diffX)) ? (deltaYFactor > 0 ? 180 : 0) : (deltaXFactor > 0 ? 90 : 270);
-	else 
-		_targetFacing = getAngleFromPos(deltaXFactor, deltaYFactor);
+	else
+		_targetFacing = (ABS(diffY) * 3 > ABS(diffX)) ? (deltaYFactor > 0 ? 180 : 0) : (deltaXFactor > 0 ? 90 : 270);
 
 	return actorWalkStep();
 }




More information about the Scummvm-git-logs mailing list