[Scummvm-git-logs] scummvm master -> ff9e5da5c40c7d6a6648ac02270829b30feb4995

neuromancer noreply at scummvm.org
Tue May 26 11:39:52 UTC 2026


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

Summary:
eb1d4144f7 FREESCAPE: music for castle atari
3942c6cf1b FREESCAPE: cleaned up freescape.dat
f11b221996 FREESCAPE: removed hard assertion when drilling in driller
ff9e5da5c4 FREESCAPE: reset color remapps when calling SPFX(2,0)


Commit: eb1d4144f7e9431fd1673a331663e0847e5b76a2
    https://github.com/scummvm/scummvm/commit/eb1d4144f7e9431fd1673a331663e0847e5b76a2
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2026-05-26T13:39:00+02:00

Commit Message:
FREESCAPE: music for castle atari

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


diff --git a/engines/freescape/games/castle/amiga.cpp b/engines/freescape/games/castle/amiga.cpp
index 2f91fe9956d..820a9ff2579 100644
--- a/engines/freescape/games/castle/amiga.cpp
+++ b/engines/freescape/games/castle/amiga.cpp
@@ -1842,9 +1842,13 @@ bool CastleEngine::playAtariIntro() {
 	stream->read(introText.data(), textSize);
 	delete stream;
 
-	// TODO(castle-atari): locate and play the intro music (the Amiga build uses
-	// a separate "musicdat" ProTracker module; the Atari equivalent still needs
-	// to be found). The intro currently plays silently.
+	Audio::SoundHandle introMusicHandle;
+	if (!_modData.empty()) {
+		Common::MemoryReadStream modStream(_modData.data(), _modData.size());
+		Audio::AudioStream *musicStream = Audio::makeProtrackerStream(&modStream);
+		if (musicStream)
+			_mixer->playStream(Audio::Mixer::kMusicSoundType, &introMusicHandle, musicStream);
+	}
 
 	bool selectedPrincess = false;
 	CastleAmigaIntroPlayer player(this, introText, kAtariIntroLayout);
@@ -1852,6 +1856,9 @@ bool CastleEngine::playAtariIntro() {
 	if (played)
 		_selectedPrincess = selectedPrincess;
 
+	if (_mixer->isSoundHandleActive(introMusicHandle))
+		_mixer->stopHandle(introMusicHandle);
+
 	_gfx->clear(0, 0, 0, true);
 	return played;
 }
diff --git a/engines/freescape/games/castle/atari.cpp b/engines/freescape/games/castle/atari.cpp
index 8b04b6a186e..b7c38e031a6 100644
--- a/engines/freescape/games/castle/atari.cpp
+++ b/engines/freescape/games/castle/atari.cpp
@@ -124,6 +124,42 @@ Common::SeekableReadStream *CastleEngine::decompressAtari(const Common::Path &fi
 	return new Common::MemoryReadStream(out.getData(), out.size(), DisposeAfterUse::YES);
 }
 
+static uint32 getProTrackerModuleSize(Common::SeekableReadStream *file, uint32 offset) {
+	int64 oldPos = file->pos();
+	uint32 result = 0;
+
+	if (offset + 1084 <= (uint32)file->size()) {
+		file->seek(offset + 1080);
+		if (file->readUint32BE() == 0x4d2e4b2e) {
+			file->seek(offset + 950);
+			byte songLength = file->readByte();
+			file->readByte();
+
+			if (songLength > 0 && songLength <= 128) {
+				byte highestPattern = 0;
+				for (int i = 0; i < 128; i++) {
+					byte pattern = file->readByte();
+					if (i < songLength)
+						highestPattern = MAX(highestPattern, pattern);
+				}
+
+				uint32 sampleBytes = 0;
+				for (int i = 0; i < 31; i++) {
+					file->seek(offset + 20 + i * 30 + 22);
+					sampleBytes += file->readUint16BE() * 2;
+				}
+
+				uint32 moduleSize = 1084 + (highestPattern + 1) * 1024 + sampleBytes;
+				if (offset + moduleSize <= (uint32)file->size())
+					result = moduleSize;
+			}
+		}
+	}
+
+	file->seek(oldPos);
+	return result;
+}
+
 extern byte kAmigaCastlePalette[16][3];
 extern byte kAmigaCastleRiddlePalette[16][3];
 
@@ -352,6 +388,16 @@ void CastleEngine::loadAssetsAtariFullGame() {
 	// menu is guarded against the missing surfaces. The mouse cursor / crosshair
 	// sprites also still need to be located.
 
+	// The full Atari ST binary embeds the same ProTracker module used by the
+	// Amiga full game. It starts at TEXT $10F9A / stream offset $10FB6.
+	static const uint32 kAtariMusicDataOffset = 0x10fb6;
+	uint32 modSize = getProTrackerModuleSize(file, kAtariMusicDataOffset);
+	if (modSize > 0) {
+		_modData.resize(modSize);
+		file->seek(kAtariMusicDataOffset);
+		file->read(_modData.data(), modSize);
+	}
+
 	delete file;
 }
 
diff --git a/engines/freescape/games/castle/castle.cpp b/engines/freescape/games/castle/castle.cpp
index d5b3c1a9ef1..c410ad12703 100644
--- a/engines/freescape/games/castle/castle.cpp
+++ b/engines/freescape/games/castle/castle.cpp
@@ -586,8 +586,8 @@ void CastleEngine::gotoArea(uint16 areaID, int entranceID) {
 		else
 			playSound(_soundIndexStart, false, _soundFxHandle);
 
-		// Start ProTracker background music for Amiga demo
-		if (isAmiga() && !_modData.empty() && !_mixer->isSoundHandleActive(_musicHandle)) {
+		// Start ProTracker background music for Amiga and Atari ST builds.
+		if ((isAmiga() || isAtariST()) && !_modData.empty() && !_mixer->isSoundHandleActive(_musicHandle)) {
 			Common::MemoryReadStream modStream(_modData.data(), _modData.size());
 			Audio::AudioStream *musicStream = Audio::makeProtrackerStream(&modStream);
 			if (musicStream)


Commit: 3942c6cf1baabab3446874ca18a9cd4893d5bcb6
    https://github.com/scummvm/scummvm/commit/3942c6cf1baabab3446874ca18a9cd4893d5bcb6
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2026-05-26T13:39:00+02:00

Commit Message:
FREESCAPE: cleaned up freescape.dat

Changed paths:
  A devtools/create_freescape/castle_border_Commodore 64.bmp
  R devtools/create_freescape/dark_crouch_indicator_Amstrad CPC.bmp
  R devtools/create_freescape/dark_fallen_indicator_Amstrad CPC.bmp
  R devtools/create_freescape/dark_jet_indicator_Amstrad CPC.bmp
  R devtools/create_freescape/dark_walk_indicator_Amstrad CPC.bmp
  R devtools/create_freescape/darkside-cpc-1.wav
  R devtools/create_freescape/darkside-cpc-10.wav
  R devtools/create_freescape/darkside-cpc-11.wav
  R devtools/create_freescape/darkside-cpc-12.wav
  R devtools/create_freescape/darkside-cpc-13.wav
  R devtools/create_freescape/darkside-cpc-14.wav
  R devtools/create_freescape/darkside-cpc-15.wav
  R devtools/create_freescape/darkside-cpc-16.wav
  R devtools/create_freescape/darkside-cpc-17.wav
  R devtools/create_freescape/darkside-cpc-18.wav
  R devtools/create_freescape/darkside-cpc-19.wav
  R devtools/create_freescape/darkside-cpc-20.wav
  R devtools/create_freescape/darkside-cpc-21.wav
  R devtools/create_freescape/darkside-cpc-22.wav
  R devtools/create_freescape/darkside-cpc-23.wav
  R devtools/create_freescape/darkside-cpc-3.wav
  R devtools/create_freescape/darkside-cpc-4.wav
  R devtools/create_freescape/darkside-cpc-5.wav
  R devtools/create_freescape/darkside-cpc-6.wav
  R devtools/create_freescape/darkside-cpc-7.wav
  R devtools/create_freescape/darkside-cpc-8.wav
  R devtools/create_freescape/darkside-cpc-9.wav
  R devtools/create_freescape/spacestationoblivion_c64.bmp
    devtools/create_freescape/create_freescape.sh
    dists/engine-data/freescape.dat


diff --git a/devtools/create_freescape/castle_border_Commodore 64.bmp b/devtools/create_freescape/castle_border_Commodore 64.bmp
new file mode 100644
index 00000000000..9731f29d90b
Binary files /dev/null and b/devtools/create_freescape/castle_border_Commodore 64.bmp differ
diff --git a/devtools/create_freescape/create_freescape.sh b/devtools/create_freescape/create_freescape.sh
index 555690b765f..e3a5e016220 100755
--- a/devtools/create_freescape/create_freescape.sh
+++ b/devtools/create_freescape/create_freescape.sh
@@ -2,7 +2,7 @@
 
 printf "Creating border/sounds file...\n"
 
-zip -r freescape.zip version *.bmp *.wav
+zip -r freescape.zip version *.bmp
 mv freescape.zip freescape.dat
 
 echo done
diff --git a/devtools/create_freescape/dark_crouch_indicator_Amstrad CPC.bmp b/devtools/create_freescape/dark_crouch_indicator_Amstrad CPC.bmp
deleted file mode 100644
index ac7cce50fd0..00000000000
Binary files a/devtools/create_freescape/dark_crouch_indicator_Amstrad CPC.bmp and /dev/null differ
diff --git a/devtools/create_freescape/dark_fallen_indicator_Amstrad CPC.bmp b/devtools/create_freescape/dark_fallen_indicator_Amstrad CPC.bmp
deleted file mode 100644
index bfa6dee5b6d..00000000000
Binary files a/devtools/create_freescape/dark_fallen_indicator_Amstrad CPC.bmp and /dev/null differ
diff --git a/devtools/create_freescape/dark_jet_indicator_Amstrad CPC.bmp b/devtools/create_freescape/dark_jet_indicator_Amstrad CPC.bmp
deleted file mode 100644
index f6068c8563a..00000000000
Binary files a/devtools/create_freescape/dark_jet_indicator_Amstrad CPC.bmp and /dev/null differ
diff --git a/devtools/create_freescape/dark_walk_indicator_Amstrad CPC.bmp b/devtools/create_freescape/dark_walk_indicator_Amstrad CPC.bmp
deleted file mode 100644
index 1325c82823a..00000000000
Binary files a/devtools/create_freescape/dark_walk_indicator_Amstrad CPC.bmp and /dev/null differ
diff --git a/devtools/create_freescape/darkside-cpc-1.wav b/devtools/create_freescape/darkside-cpc-1.wav
deleted file mode 100644
index 51bc0cb3fdc..00000000000
Binary files a/devtools/create_freescape/darkside-cpc-1.wav and /dev/null differ
diff --git a/devtools/create_freescape/darkside-cpc-10.wav b/devtools/create_freescape/darkside-cpc-10.wav
deleted file mode 100644
index 21752d30127..00000000000
Binary files a/devtools/create_freescape/darkside-cpc-10.wav and /dev/null differ
diff --git a/devtools/create_freescape/darkside-cpc-11.wav b/devtools/create_freescape/darkside-cpc-11.wav
deleted file mode 100644
index 423f9f8d075..00000000000
Binary files a/devtools/create_freescape/darkside-cpc-11.wav and /dev/null differ
diff --git a/devtools/create_freescape/darkside-cpc-12.wav b/devtools/create_freescape/darkside-cpc-12.wav
deleted file mode 100644
index 6d5030aa2e4..00000000000
Binary files a/devtools/create_freescape/darkside-cpc-12.wav and /dev/null differ
diff --git a/devtools/create_freescape/darkside-cpc-13.wav b/devtools/create_freescape/darkside-cpc-13.wav
deleted file mode 100644
index 2f607bcd28f..00000000000
Binary files a/devtools/create_freescape/darkside-cpc-13.wav and /dev/null differ
diff --git a/devtools/create_freescape/darkside-cpc-14.wav b/devtools/create_freescape/darkside-cpc-14.wav
deleted file mode 100644
index db584bef184..00000000000
Binary files a/devtools/create_freescape/darkside-cpc-14.wav and /dev/null differ
diff --git a/devtools/create_freescape/darkside-cpc-15.wav b/devtools/create_freescape/darkside-cpc-15.wav
deleted file mode 100644
index 99e0991736c..00000000000
Binary files a/devtools/create_freescape/darkside-cpc-15.wav and /dev/null differ
diff --git a/devtools/create_freescape/darkside-cpc-16.wav b/devtools/create_freescape/darkside-cpc-16.wav
deleted file mode 100644
index 6cf8327712a..00000000000
Binary files a/devtools/create_freescape/darkside-cpc-16.wav and /dev/null differ
diff --git a/devtools/create_freescape/darkside-cpc-17.wav b/devtools/create_freescape/darkside-cpc-17.wav
deleted file mode 100644
index 6a1d9af485f..00000000000
Binary files a/devtools/create_freescape/darkside-cpc-17.wav and /dev/null differ
diff --git a/devtools/create_freescape/darkside-cpc-18.wav b/devtools/create_freescape/darkside-cpc-18.wav
deleted file mode 100644
index 952bea25b12..00000000000
Binary files a/devtools/create_freescape/darkside-cpc-18.wav and /dev/null differ
diff --git a/devtools/create_freescape/darkside-cpc-19.wav b/devtools/create_freescape/darkside-cpc-19.wav
deleted file mode 100644
index b4bec4e7819..00000000000
Binary files a/devtools/create_freescape/darkside-cpc-19.wav and /dev/null differ
diff --git a/devtools/create_freescape/darkside-cpc-20.wav b/devtools/create_freescape/darkside-cpc-20.wav
deleted file mode 100644
index 3b4b1e94d7f..00000000000
Binary files a/devtools/create_freescape/darkside-cpc-20.wav and /dev/null differ
diff --git a/devtools/create_freescape/darkside-cpc-21.wav b/devtools/create_freescape/darkside-cpc-21.wav
deleted file mode 100644
index 93c0800f72b..00000000000
Binary files a/devtools/create_freescape/darkside-cpc-21.wav and /dev/null differ
diff --git a/devtools/create_freescape/darkside-cpc-22.wav b/devtools/create_freescape/darkside-cpc-22.wav
deleted file mode 100644
index f4b0ab6b44c..00000000000
Binary files a/devtools/create_freescape/darkside-cpc-22.wav and /dev/null differ
diff --git a/devtools/create_freescape/darkside-cpc-23.wav b/devtools/create_freescape/darkside-cpc-23.wav
deleted file mode 100644
index 546f495bbfd..00000000000
Binary files a/devtools/create_freescape/darkside-cpc-23.wav and /dev/null differ
diff --git a/devtools/create_freescape/darkside-cpc-3.wav b/devtools/create_freescape/darkside-cpc-3.wav
deleted file mode 100644
index 90f703c45a1..00000000000
Binary files a/devtools/create_freescape/darkside-cpc-3.wav and /dev/null differ
diff --git a/devtools/create_freescape/darkside-cpc-4.wav b/devtools/create_freescape/darkside-cpc-4.wav
deleted file mode 100644
index 1f5ccb34adf..00000000000
Binary files a/devtools/create_freescape/darkside-cpc-4.wav and /dev/null differ
diff --git a/devtools/create_freescape/darkside-cpc-5.wav b/devtools/create_freescape/darkside-cpc-5.wav
deleted file mode 100644
index 1cb1fac02bc..00000000000
Binary files a/devtools/create_freescape/darkside-cpc-5.wav and /dev/null differ
diff --git a/devtools/create_freescape/darkside-cpc-6.wav b/devtools/create_freescape/darkside-cpc-6.wav
deleted file mode 100644
index b133404e080..00000000000
Binary files a/devtools/create_freescape/darkside-cpc-6.wav and /dev/null differ
diff --git a/devtools/create_freescape/darkside-cpc-7.wav b/devtools/create_freescape/darkside-cpc-7.wav
deleted file mode 100644
index 7a5e47955be..00000000000
Binary files a/devtools/create_freescape/darkside-cpc-7.wav and /dev/null differ
diff --git a/devtools/create_freescape/darkside-cpc-8.wav b/devtools/create_freescape/darkside-cpc-8.wav
deleted file mode 100644
index d23fe92f843..00000000000
Binary files a/devtools/create_freescape/darkside-cpc-8.wav and /dev/null differ
diff --git a/devtools/create_freescape/darkside-cpc-9.wav b/devtools/create_freescape/darkside-cpc-9.wav
deleted file mode 100644
index b9b01ff5a04..00000000000
Binary files a/devtools/create_freescape/darkside-cpc-9.wav and /dev/null differ
diff --git a/devtools/create_freescape/spacestationoblivion_c64.bmp b/devtools/create_freescape/spacestationoblivion_c64.bmp
deleted file mode 100644
index 1ba8f235161..00000000000
Binary files a/devtools/create_freescape/spacestationoblivion_c64.bmp and /dev/null differ
diff --git a/dists/engine-data/freescape.dat b/dists/engine-data/freescape.dat
index 9ead4c51247..f3633fe13d7 100644
Binary files a/dists/engine-data/freescape.dat and b/dists/engine-data/freescape.dat differ


Commit: f11b2219969848f5dbfdc2abcecbd14c13e14438
    https://github.com/scummvm/scummvm/commit/f11b2219969848f5dbfdc2abcecbd14c13e14438
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2026-05-26T13:39:00+02:00

Commit Message:
FREESCAPE: removed hard assertion when drilling in driller

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


diff --git a/engines/freescape/games/driller/driller.cpp b/engines/freescape/games/driller/driller.cpp
index 62721ef68d6..b67c28b4b59 100644
--- a/engines/freescape/games/driller/driller.cpp
+++ b/engines/freescape/games/driller/driller.cpp
@@ -605,7 +605,9 @@ void DrillerEngine::pressedKey(const int keycode) {
 		if (success <= 0) {
 			debugC(1, kFreescapeDebugMove, "DRILL result: no gas found");
 			insertTemporaryMessage(_messagesList[9], _countdown - 4);
-			_drillStatusByArea[_currentArea->getAreaID()] = kDrillerRigNoGas;
+			uint16 areaID = _currentArea->getAreaID();
+			_drillStatusByArea[areaID] = kDrillerRigNoGas;
+			_drillSuccessByArea[areaID] = 0;
 			return;
 		}
 		Common::String maxScoreMessage = _messagesList[5];
@@ -655,18 +657,23 @@ void DrillerEngine::pressedKey(const int keycode) {
 		_gameStateVars[k8bitVariableEnergy] = _gameStateVars[k8bitVariableEnergy] - 5;
 
 		uint16 areaID = _currentArea->getAreaID();
-		if (_drillStatusByArea[areaID] > 0) {
-			if (_drillStatusByArea[areaID] == kDrillerRigInPlace)
+		uint32 drillStatus = _drillStatusByArea[areaID];
+		if (drillStatus > 0) {
+			if (drillStatus == kDrillerRigInPlace)
 				_gameStateVars[32]--;
 			_drillStatusByArea[areaID] = kDrillerNoRig;
 		}
 		removeDrill(_currentArea);
 		insertTemporaryMessage(_messagesList[10], _countdown - 2);
-		int maxScore = _drillMaxScoreByArea[_currentArea->getAreaID()];
-		uint32 success = _drillSuccessByArea[_currentArea->getAreaID()];
+		int maxScore = _drillMaxScoreByArea[areaID];
+		uint32 success = (drillStatus == kDrillerRigInPlace || drillStatus == kDrillerRigOutOfPlace) ? _drillSuccessByArea[areaID] : 0;
 		uint32 scoreToRemove = uint32(maxScore * success) / 100;
-		assert(scoreToRemove <= uint32(_gameStateVars[k8bitVariableScore]));
+		if (scoreToRemove > uint32(_gameStateVars[k8bitVariableScore])) {
+			warning("Driller: rig score mismatch in area %d, clamping score removal", areaID);
+			scoreToRemove = uint32(_gameStateVars[k8bitVariableScore]);
+		}
 		_gameStateVars[k8bitVariableScore] -= scoreToRemove;
+		_drillSuccessByArea[areaID] = 0;
 		executeMovementConditions();
 		if (isDOS() || isAmiga() || isAtariST())
 			playSound(_soundIndexAreaChange, false, _soundFxHandle);


Commit: ff9e5da5c40c7d6a6648ac02270829b30feb4995
    https://github.com/scummvm/scummvm/commit/ff9e5da5c40c7d6a6648ac02270829b30feb4995
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2026-05-26T13:39:00+02:00

Commit Message:
FREESCAPE: reset color remapps when calling SPFX(2,0)

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


diff --git a/engines/freescape/language/instruction.cpp b/engines/freescape/language/instruction.cpp
index 3309ad2a57a..5d93deced55 100644
--- a/engines/freescape/language/instruction.cpp
+++ b/engines/freescape/language/instruction.cpp
@@ -419,7 +419,10 @@ void FreescapeEngine::executeSPFX(FCLInstruction &instruction) {
 		uint8 b = 0;
 		uint32 color = 0;
 
-		if (src & (1 << 7)) {
+		if (src == 2 && dst == 0) {
+			// The Amiga interpreter handles SPFX $0200 by restoring the current area palette.
+			_currentArea->_colorRemaps.clear();
+		} else if (src & (1 << 7)) {
 			uint16 v = 0;
 			color = 0;
 			// Extract the color to replace from the src/dst values




More information about the Scummvm-git-logs mailing list