[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