From 0f3e7531c1999da4c424481afd42c5380ec10103 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torbj=C3=B6rn=20Andersson?= Date: Sun, 11 Oct 2015 08:00:23 +0200 Subject: [PATCH 1/2] NEVERHOOD: Possible fix for bad car behaviour This is something I found when trying the savegame from bug #6932, but I still don't know if it actually is that bug. From what I understand, there are two different cases in the moveCarToPoint() method: One where you click on a different section on a track than you're on, and one where you click on the same section on the track that you're on. In the latter case, it sends message 0x2004 to the car, which is then handled by AsCommonCar::handleMessage(). That one will assume that the parameter is a point, but this can also be encoded as an integer with 16 bits for the X coordinate and 16 bits for the Y coordinate. See MessageParam::asPoint(). If we only pass an X coordinate to the message, the Y coordinate is assumed to be 0, and we do this in a couple of places. I do not know the exact implications of that, but in the two cases I've changed here, it meant that clicking on the track below the car would still make it go up, because it thought you were travelling towards the top of the screen. So I think this is the appropriate fix, but even if it is, I do not know if it's enough or if it should be changed in other places as well. --- engines/neverhood/modules/module2700.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/neverhood/modules/module2700.cpp b/engines/neverhood/modules/module2700.cpp index a510c025586..8b8bb5c4c4d 100644 --- a/engines/neverhood/modules/module2700.cpp +++ b/engines/neverhood/modules/module2700.cpp @@ -773,7 +773,7 @@ void Scene2702::moveCarToPoint(NPoint pt) { sendMessage(_asCar, 0x2003, _trackPoints->size() - 1); } else { _newTrackIndex = -1; - sendMessage(_asCar, 0x2004, pt.x); + sendMessage(_asCar, 0x2004, pt); } } @@ -1099,7 +1099,7 @@ void Scene2706::moveCarToPoint(NPoint pt) { sendMessage(_asCar, 0x2003, 0); } else { _newTrackIndex = -1; - sendMessage(_asCar, 0x2004, pt.x); + sendMessage(_asCar, 0x2004, pt); } } From 42bf369d689545b8a221635ab9d7522c259c5edd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torbj=C3=B6rn=20Andersson?= Date: Sun, 18 Oct 2015 11:35:09 +0200 Subject: [PATCH 2/2] NEVERHOOD: Pass NPoint as position instead of X in two more cases According to johndoe it's correct to pass the entire coordinate, rather than just X, to the car in these cases as well. I can't tell any difference at all in the behavior, but I guess it doesn't hurt either. After all, we can easily zero the Y coordinate, if we ever want to. --- engines/neverhood/modules/module2700.cpp | 8 ++++---- engines/neverhood/modules/module2700.h | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/engines/neverhood/modules/module2700.cpp b/engines/neverhood/modules/module2700.cpp index 8b8bb5c4c4d..e0c65097938 100644 --- a/engines/neverhood/modules/module2700.cpp +++ b/engines/neverhood/modules/module2700.cpp @@ -761,7 +761,7 @@ void Scene2702::moveCarToPoint(NPoint pt) { _tracks.findTrackPoint(pt, minMatchTrackIndex, minMatchDistance, _dataResource); if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) { _newTrackIndex = minMatchTrackIndex; - _newTrackDestX = pt.x; + _newTrackDest = pt; if (_isUpperTrack) { if (_currTrackIndex == 0) sendMessage(_asCar, 0x2003, _trackPoints->size() - 1); @@ -790,7 +790,7 @@ void Scene2702::changeTrack() { sendMessage(_asCar, NM_POSITION_CHANGE, 0); else sendMessage(_asCar, NM_POSITION_CHANGE, _trackPoints->size() - 1); - sendMessage(_asCar, 0x2004, _newTrackDestX); + sendMessage(_asCar, 0x2004, _newTrackDest); _newTrackIndex = -1; } @@ -1092,7 +1092,7 @@ void Scene2706::moveCarToPoint(NPoint pt) { _tracks.findTrackPoint(pt, minMatchTrackIndex, minMatchDistance, _dataResource); if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) { _newTrackIndex = minMatchTrackIndex; - _newTrackDestX = pt.x; + _newTrackDest = pt; if (_currTrackIndex == 0) sendMessage(_asCar, 0x2003, _trackPoints->size() - 1); else @@ -1111,7 +1111,7 @@ void Scene2706::changeTrack() { sendMessage(_asCar, NM_POSITION_CHANGE, _trackPoints->size() - 1); else sendMessage(_asCar, NM_POSITION_CHANGE, 0); - sendMessage(_asCar, 0x2004, _newTrackDestX); + sendMessage(_asCar, 0x2004, _newTrackDest); _newTrackIndex = -1; } diff --git a/engines/neverhood/modules/module2700.h b/engines/neverhood/modules/module2700.h index 9ac21597652..ece8866cd45 100644 --- a/engines/neverhood/modules/module2700.h +++ b/engines/neverhood/modules/module2700.h @@ -76,7 +76,7 @@ protected: Sprite *_asCarShadow; Sprite *_asCarTrackShadow; Sprite *_asCarConnectorShadow; - int16 _newTrackDestX; + NPoint _newTrackDest; bool _isInLight; int _currTrackIndex, _newTrackIndex; bool _isUpperTrack; @@ -132,7 +132,7 @@ protected: Sprite *_asCarConnector; Sprite *_asCarTrackShadow; Sprite *_asCarConnectorShadow; - int16 _newTrackDestX; + NPoint _newTrackDest; int _currTrackIndex, _newTrackIndex; Tracks _tracks; NPointArray *_trackPoints;