[Scummvm-git-logs] scummvm master -> 0f96c2383e72cc4937cdd20188bb1294fad9ff23

neuromancer noreply at scummvm.org
Sun Nov 16 08:35:58 UTC 2025


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

Summary:
a76113e996 FREESCAPE: avoid visual glitches with better near clip plane values in castle
d5db669057 FREESCAPE: make sure castle can trigger endgame in the zx release
0f96c2383e FREESCAPE: improved endgame in the zx release


Commit: a76113e996882e2ece016e3994657d8f36a868bf
    https://github.com/scummvm/scummvm/commit/a76113e996882e2ece016e3994657d8f36a868bf
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2025-11-16T09:35:33+01:00

Commit Message:
FREESCAPE: avoid visual glitches with better near clip plane values in castle

Changed paths:
    engines/freescape/games/castle/castle.cpp


diff --git a/engines/freescape/games/castle/castle.cpp b/engines/freescape/games/castle/castle.cpp
index c9057345bad..2f10f506552 100644
--- a/engines/freescape/games/castle/castle.cpp
+++ b/engines/freescape/games/castle/castle.cpp
@@ -341,6 +341,8 @@ void CastleEngine::gotoArea(uint16 areaID, int entranceID) {
 	_currentArea->show();
 	_maxFallingDistance = MAX(32, _currentArea->getScale() * 16 - 2);
 
+	_nearClipPlane = _currentArea->isOutside() ? 2 : 0.5;
+
 	if (entranceID > 0)
 		traverseEntrance(entranceID);
 


Commit: d5db6690576b5247555373f4fc9b235596c16cd4
    https://github.com/scummvm/scummvm/commit/d5db6690576b5247555373f4fc9b235596c16cd4
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2025-11-16T09:35:33+01:00

Commit Message:
FREESCAPE: make sure castle can trigger endgame in the zx release

Changed paths:
    engines/freescape/language/instruction.cpp
    engines/freescape/movement.cpp


diff --git a/engines/freescape/language/instruction.cpp b/engines/freescape/language/instruction.cpp
index acd779c3a1d..bd25e235c5a 100644
--- a/engines/freescape/language/instruction.cpp
+++ b/engines/freescape/language/instruction.cpp
@@ -108,7 +108,8 @@ bool FreescapeEngine::executeObjectConditions(GeometricObject *obj, bool shot, b
 		_syncSound = false;
 		_objExecutingCodeSize = collided ? obj->getSize() : Math::Vector3d();
 		if (collided) {
-			clearGameBit(31); // We collided with something that has code
+			if (!isCastle())
+				clearGameBit(31); // We collided with something that has code
 			debugC(1, kFreescapeDebugCode, "Executing with collision flag: %s", obj->_conditionSource.c_str());
 		} else if (shot)
 			debugC(1, kFreescapeDebugCode, "Executing with shot flag: %s", obj->_conditionSource.c_str());
@@ -368,7 +369,7 @@ void FreescapeEngine::executeExecute(FCLInstruction &instruction) {
 			if (!obj) {
 				debugC(1, kFreescapeDebugCode, "WARNING: executing instructions from a non-existent object %d", objId);
 				return;
-			} 
+			}
 			assert(obj);
 			FCLInstructionVector &condition = ((Entrance *)obj)->_condition;
 			executeCode(condition, true, true, true, true);
diff --git a/engines/freescape/movement.cpp b/engines/freescape/movement.cpp
index d527b33dd60..ed4c5f7a961 100644
--- a/engines/freescape/movement.cpp
+++ b/engines/freescape/movement.cpp
@@ -329,7 +329,8 @@ bool FreescapeEngine::rise() {
 			if (_currentArea->getAreaID() == previousAreaID) {
 				_playerHeightNumber--;
 				changePlayerHeight(_playerHeightNumber);
-				setGameBit(31);
+				if (!isCastle())
+					setGameBit(31);
 			}
 		} else
 			result = true;
@@ -438,7 +439,8 @@ void FreescapeEngine::updatePlayerMovementClassic(float deltaTime) {
 	if (_currentArea->getAreaID() == previousAreaID)
 		executeMovementConditions();
 	_gotoExecuted = false;
-	clearGameBit(31);
+	if (!isCastle())
+		clearGameBit(31);
 }
 
 void FreescapeEngine::updatePlayerMovementSmooth(float deltaTime) {
@@ -486,7 +488,8 @@ void FreescapeEngine::updatePlayerMovementSmooth(float deltaTime) {
 		executeMovementConditions();
 	}
 	_gotoExecuted = false;
-	clearGameBit(31);
+	if (!isCastle())
+		clearGameBit(31);
 }
 
 void FreescapeEngine::resolveCollisions(Math::Vector3d const position) {
@@ -510,7 +513,7 @@ void FreescapeEngine::resolveCollisions(Math::Vector3d const position) {
 
 	if (_flyMode) {
 		if ((lastPosition - newPosition).length() < 1) { // Something is blocking the player
-			if (!executed)
+			if (!executed && !isCastle())
 				setGameBit(31);
 			playSound(_soundIndexCollide, false, _movementSoundHandle);
 		}
@@ -535,7 +538,7 @@ void FreescapeEngine::resolveCollisions(Math::Vector3d const position) {
 		if (_lastPosition.y() < newPosition.y())
 			isSteppingUp = true;
 
-		if (!executed)
+		if (!executed && !isCastle())
 			setGameBit(31);
 
 		isCollidingWithWall = true;
@@ -560,7 +563,7 @@ void FreescapeEngine::resolveCollisions(Math::Vector3d const position) {
 		_endGameDelayTicks = 60 * 5;
 		if (isEclipse()) // No need for an variable index, since these are special types of sound
 			playSoundFx(0, true);
-		else 
+		else
 			playSound(_soundIndexFall, false, _movementSoundHandle);
 
 		if (_hasFallen)
@@ -570,7 +573,7 @@ void FreescapeEngine::resolveCollisions(Math::Vector3d const position) {
 	if (!_hasFallen && fallen > 0) {
 		isSteppingDown = true;
 		// Position in Y was changed, let's re-run effects
-		runCollisionConditions(_lastPosition, newPosition); 
+		runCollisionConditions(_lastPosition, newPosition);
 	}
 
 	if (isSteppingUp && (newPosition - _lastPosition).length() <= 1) {


Commit: 0f96c2383e72cc4937cdd20188bb1294fad9ff23
    https://github.com/scummvm/scummvm/commit/0f96c2383e72cc4937cdd20188bb1294fad9ff23
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2025-11-16T09:35:33+01:00

Commit Message:
FREESCAPE: improved endgame in the zx release

Changed paths:
    engines/freescape/games/castle/castle.cpp
    engines/freescape/games/castle/zx.cpp
    engines/freescape/ui.cpp


diff --git a/engines/freescape/games/castle/castle.cpp b/engines/freescape/games/castle/castle.cpp
index 2f10f506552..62d90440f5d 100644
--- a/engines/freescape/games/castle/castle.cpp
+++ b/engines/freescape/games/castle/castle.cpp
@@ -483,7 +483,8 @@ void CastleEngine::endGame() {
 
 		if (isDOS()) {
 			drawFullscreenEndGameAndWait();
-		}
+		} else
+			drawFullscreenGameOverAndWait();
 	} else {
 		drawFullscreenGameOverAndWait();
 	}
@@ -870,11 +871,18 @@ void CastleEngine::drawFullscreenGameOverAndWait() {
 		playSound(9, false, _soundFxHandle);
 	}
 
+	if (isSpectrum() && getGameBit(31)) {
+		insertTemporaryMessage(_messagesList[5], _countdown - 1);
+	}
+
 	while (!shouldQuit() && cont) {
 		if (_temporaryMessageDeadlines.empty()) {
 			insertTemporaryMessage(scoreString, _countdown - 2);
 			insertTemporaryMessage(spiritsDestroyedString, _countdown - 4);
 			insertTemporaryMessage(keysCollectedString, _countdown - 6);
+			if (isSpectrum() && getGameBit(31)) {
+				insertTemporaryMessage(_messagesList[5], _countdown - 8);
+			}
 		}
 
 		while (_eventManager->pollEvent(event)) {
@@ -1563,6 +1571,9 @@ void CastleEngine::drawLiftingGate(Graphics::Surface *surface) {
 }
 
 void CastleEngine::drawDroppingGate(Graphics::Surface *surface) {
+	if (isSpectrum() && getGameBit(31))
+		return; // No gate dropping when the player escaped
+
 	if (_droppingGateStartTicks <= 0)
 		return;
 
diff --git a/engines/freescape/games/castle/zx.cpp b/engines/freescape/games/castle/zx.cpp
index 2623cf9f901..6eb5354714b 100644
--- a/engines/freescape/games/castle/zx.cpp
+++ b/engines/freescape/games/castle/zx.cpp
@@ -33,7 +33,7 @@ void CastleEngine::initZX() {
 	_soundIndexCollide = 3;
 	_soundIndexStartFalling = -1;
 	_soundIndexFallen = 1;
-	_soundIndexFall = 6; 
+	_soundIndexFall = 6;
 	_soundIndexStepUp = 12;
 	_soundIndexStepDown = 12;
 	_soundIndexMenu = 3;
@@ -259,7 +259,10 @@ void CastleEngine::drawZXUI(Graphics::Surface *surface) {
 		_temporaryMessageDeadlines.push_back(deadline);
 	} else {
 		if (_gameStateControl != kFreescapeGameStateEnd) {
-			drawStringInSurface(_currentArea->_name, 120, 179, front, black, surface);
+			if (getGameBit(31)) { // The final cutscene is playing but it is not ended yet
+				drawStringInSurface(_messagesList[5], 120, 179, front, black, surface); // "You did it!"
+			} else
+				drawStringInSurface(_currentArea->_name, 120, 179, front, black, surface);
 		}
 	}
 
diff --git a/engines/freescape/ui.cpp b/engines/freescape/ui.cpp
index 78621ffc2d2..d4712ff1898 100644
--- a/engines/freescape/ui.cpp
+++ b/engines/freescape/ui.cpp
@@ -41,6 +41,8 @@ void FreescapeEngine::waitInLoop(int maxWait) {
 			case Common::EVENT_MOUSEMOVE:
 				if (_hasFallen || _playerWasCrushed || _gameStateControl != kFreescapeGameStatePlaying)
 					break;
+				if (isCastle() && isSpectrum() && getGameBit(31)) // Game is finished
+					break;
 				mousePos = event.mouse;
 
 				if (_demoMode)




More information about the Scummvm-git-logs mailing list