[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