[Scummvm-git-logs] scummvm master -> 2bd45ddac4e033594450a58cb96ab45c6aef4c8b
neuromancer
noreply at scummvm.org
Mon Mar 30 18:21:24 UTC 2026
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .
Summary:
2bd45ddac4 FREESCAPE: fixed crash in driller when using the ship
Commit: 2bd45ddac4e033594450a58cb96ab45c6aef4c8b
https://github.com/scummvm/scummvm/commit/2bd45ddac4e033594450a58cb96ab45c6aef4c8b
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2026-03-30T20:21:09+02:00
Commit Message:
FREESCAPE: fixed crash in driller when using the ship
Changed paths:
engines/freescape/freescape.cpp
engines/freescape/movement.cpp
diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index 3c2de11785e..d6cf35df8f1 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -1198,14 +1198,25 @@ Common::Error FreescapeEngine::loadGameStream(Common::SeekableReadStream *stream
_flyMode = stream->readByte();
_noClipMode = false;
- _playerHeightNumber = stream->readUint32LE();
+ _playerHeightNumber = stream->readSint32LE();
_playerStepIndex = stream->readUint32LE();
_countdown = stream->readUint32LE();
_ticks = 0;
if (!_currentArea || _currentArea->getAreaID() != areaID)
gotoArea(areaID, -1); // Do not change position nor rotation
- _playerHeight = 32 * (_playerHeightNumber + 1) - 16 / float(_currentArea->_scale);
+ if (isDriller() && _playerHeightNumber == -1) {
+ _playerHeight = 2;
+ } else {
+ int playerHeightIndex = _playerHeightNumber;
+ if (playerHeightIndex < 0) {
+ warning("Invalid player height index %d in savegame, clamping to 0", playerHeightIndex);
+ playerHeightIndex = 0;
+ }
+
+ _playerHeight = 32 * (playerHeightIndex + 1) - 16 / float(_currentArea->_scale);
+ }
+ assert(_playerHeight > 0);
_gameStateControl = kFreescapeGameStatePlaying;
return loadGameStreamExtended(stream);
}
@@ -1240,7 +1251,7 @@ Common::Error FreescapeEngine::saveGameStream(Common::WriteStream *stream, bool
}
stream->writeByte(_flyMode);
- stream->writeUint32LE(_playerHeightNumber);
+ stream->writeSint32LE(_playerHeightNumber);
stream->writeUint32LE(_playerStepIndex);
stream->writeUint32LE(_countdown);
return saveGameStreamExtended(stream, isAutosave);
diff --git a/engines/freescape/movement.cpp b/engines/freescape/movement.cpp
index 3266cb63529..49b65359ab2 100644
--- a/engines/freescape/movement.cpp
+++ b/engines/freescape/movement.cpp
@@ -187,7 +187,11 @@ void FreescapeEngine::traverseEntrance(uint16 entranceID) {
debugC(1, kFreescapeDebugMove, "entrace position: %f %f %f", _position.x(), _position.y(), _position.z());
// Set the player height
_playerHeight = 0;
- changePlayerHeight(_playerHeightNumber);
+ if (isDriller() && _playerHeightNumber == -1) {
+ _playerHeight = 2;
+ _position.setValue(1, _position.y() + _playerHeight);
+ } else
+ changePlayerHeight(_playerHeightNumber);
debugC(1, kFreescapeDebugMove, "player height: %d", _playerHeight);
_sensors = _currentArea->getSensors();
@@ -286,6 +290,11 @@ void FreescapeEngine::changeAngle(int offset, bool wrapAround) {
}
void FreescapeEngine::changePlayerHeight(int index) {
+ if (index < 0) {
+ warning("Invalid player height index %d, clamping to 0", index);
+ index = 0;
+ }
+
int scale = _currentArea->getScale();
_position.setValue(1, _position.y() - _playerHeight);
@@ -385,7 +394,7 @@ void FreescapeEngine::checkIfStillInArea() {
_position.setValue(i, maxPositiveDistance);
}
if (_position.y() >= 2016)
- _position.y() = _lastPosition.z();
+ _position.y() = _lastPosition.y();
}
void FreescapeEngine::updatePlayerMovement(float deltaTime) {
More information about the Scummvm-git-logs
mailing list