[Scummvm-git-logs] scummvm master -> 2d20aacbd48504c57e8bf55486123e1f3072a425

neuromancer noreply at scummvm.org
Fri Mar 27 18:20:39 UTC 2026


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

Summary:
3c3759ab3e FREESCAPE: parse indicators in other driller demos
2d20aacbd4 FREESCAPE: parse indicators in driller atari


Commit: 3c3759ab3ef68c232506306a8db919124dccf6f8
    https://github.com/scummvm/scummvm/commit/3c3759ab3ef68c232506306a8db919124dccf6f8
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2026-03-27T19:20:21+01:00

Commit Message:
FREESCAPE: parse indicators in other driller demos

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


diff --git a/engines/freescape/games/driller/amiga.cpp b/engines/freescape/games/driller/amiga.cpp
index 5b883e593a0..d3c35ed706e 100644
--- a/engines/freescape/games/driller/amiga.cpp
+++ b/engines/freescape/games/driller/amiga.cpp
@@ -62,26 +62,30 @@ void DrillerEngine::loadIndicatorSprites(Common::SeekableReadStream *file, byte
 	uint32 transparent = _gfx->_texturePixelFormat.ARGBToColor(0x00, 0, 0, 0);
 
 	// Step indicator: 1 word × 4 rows, 8 frames, stride=40
-	for (int f = 0; f < 8; f++) {
-		auto *surf = new Graphics::ManagedSurface();
-		surf->create(16, 4, _gfx->_texturePixelFormat);
-		surf->fillRect(Common::Rect(0, 0, 16, 4), transparent);
-		decodeAmigaSprite(file, surf, stepOffset + f * 40, 1, 4, palette);
-		_stepSprites.push_back(surf);
+	if (stepOffset >= 0) {
+		for (int f = 0; f < 8; f++) {
+			auto *surf = new Graphics::ManagedSurface();
+			surf->create(16, 4, _gfx->_texturePixelFormat);
+			surf->fillRect(Common::Rect(0, 0, 16, 4), transparent);
+			decodeAmigaSprite(file, surf, stepOffset + f * 40, 1, 4, palette);
+			_stepSprites.push_back(surf);
+		}
 	}
 
 	// Angle indicator: 1 word × 4 rows, 8 frames, stride=40
-	for (int f = 0; f < 8; f++) {
-		auto *surf = new Graphics::ManagedSurface();
-		surf->create(16, 4, _gfx->_texturePixelFormat);
-		surf->fillRect(Common::Rect(0, 0, 16, 4), transparent);
-		decodeAmigaSprite(file, surf, angleOffset + f * 40, 1, 4, palette);
-		_angleSprites.push_back(surf);
+	if (angleOffset >= 0) {
+		for (int f = 0; f < 8; f++) {
+			auto *surf = new Graphics::ManagedSurface();
+			surf->create(16, 4, _gfx->_texturePixelFormat);
+			surf->fillRect(Common::Rect(0, 0, 16, 4), transparent);
+			decodeAmigaSprite(file, surf, angleOffset + f * 40, 1, 4, palette);
+			_angleSprites.push_back(surf);
+		}
 	}
 
 	// Vehicle indicator: 4 words × 43 rows, 5 frames, stride=1408 ($580)
 	// Frame 0=fly, frames 1-4=tank heights 0-3
-	{
+	if (vehicleOffset >= 0) {
 		uint32 black = _gfx->_texturePixelFormat.ARGBToColor(0xFF, 0, 0, 0);
 		for (int f = 0; f < 5; f++) {
 			auto *surf = new Graphics::ManagedSurface();
@@ -94,7 +98,7 @@ void DrillerEngine::loadIndicatorSprites(Common::SeekableReadStream *file, byte
 
 	// Quit/abort indicator: 2 words × 8 rows, 11 frames, stride=$90=144
 	// Frames 0-6: shutter animation, 7-10: confirmation squares filling in
-	{
+	if (quitOffset >= 0) {
 		uint32 black = _gfx->_texturePixelFormat.ARGBToColor(0xFF, 0, 0, 0);
 		for (int f = 0; f < 11; f++) {
 			auto *surf = new Graphics::ManagedSurface();
@@ -334,6 +338,22 @@ void DrillerEngine::loadAssetsAmigaDemo() {
 		loadFonts(&file, 0xa30);
 		loadMessagesFixedSize(&file, 0x3960, 14, 20);
 		loadGlobalObjects(&file, 0x3716, 8);
+
+		byte *palette = nullptr;
+		Common::File neoFile;
+		neoFile.open("console.neo");
+		if (neoFile.isOpen())
+			palette = getPaletteFromNeoImage(&neoFile, 0);
+
+		loadRigSprites(&file, 0x1A960);
+		if (palette) {
+			// The rolling demo matches the retail executable for these indicator blocks,
+			// but its vehicle sprite set differs, so keep the bundled fallback for that one.
+			loadIndicatorSprites(&file, palette, 0x1D320, 0x1D5A8, -1, 0x1CC98);
+			loadCompassStrips(&file, palette, 0x19BFC, 0x1D2D2);
+			loadEarthquakeSprites(&file, palette, 0x1D8E6);
+		}
+		free(palette);
 	}
 
 	file.close();
diff --git a/engines/freescape/games/driller/atari.cpp b/engines/freescape/games/driller/atari.cpp
index 70628bcc34c..5bcad8e492a 100644
--- a/engines/freescape/games/driller/atari.cpp
+++ b/engines/freescape/games/driller/atari.cpp
@@ -350,6 +350,22 @@ void DrillerEngine::loadAssetsAtariDemo() {
 		loadFonts(&file, 0x7bc);
 		loadMessagesFixedSize(&file, 0x3b90, 14, 20);
 		loadGlobalObjects(&file, 0x3946, 8);
+
+		byte *palette = nullptr;
+		Common::File neoFile;
+		neoFile.open("console.neo");
+		if (neoFile.isOpen())
+			palette = getPaletteFromNeoImage(&neoFile, 0);
+
+		loadRigSprites(&file, 0x1AB9A);
+		if (palette) {
+			// The rolling Atari demo carries the same indicator blocks here,
+			// but the current bundled vehicle fallback is already good enough.
+			loadIndicatorSprites(&file, palette, 0x1D55A, 0x1D7E2, -1, 0x1CED2);
+			loadCompassStrips(&file, palette, 0x19E36, 0x1D50C);
+			loadEarthquakeSprites(&file, palette, 0x1DB20);
+		}
+		free(palette);
 	}
 
 	file.close();


Commit: 2d20aacbd48504c57e8bf55486123e1f3072a425
    https://github.com/scummvm/scummvm/commit/2d20aacbd48504c57e8bf55486123e1f3072a425
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2026-03-27T19:20:21+01:00

Commit Message:
FREESCAPE: parse indicators in driller atari

Changed paths:
    engines/freescape/games/driller/amiga.cpp
    engines/freescape/games/driller/atari.cpp
    engines/freescape/games/driller/driller.h


diff --git a/engines/freescape/games/driller/amiga.cpp b/engines/freescape/games/driller/amiga.cpp
index d3c35ed706e..be955ee1e9c 100644
--- a/engines/freescape/games/driller/amiga.cpp
+++ b/engines/freescape/games/driller/amiga.cpp
@@ -27,21 +27,25 @@
 
 namespace Freescape {
 
-void DrillerEngine::loadRigSprites(Common::SeekableReadStream *file, int sprigsOffset) {
+void DrillerEngine::loadRigSprites(Common::SeekableReadStream *file, int sprigsOffset, byte *paletteOverride) {
 	// SPRIGS: 2 word columns × 25 rows × 5 frames, stride=$1A0 (416 bytes)
 	const int frameStride = 0x1A0;
 	const int numFrames = 5;
 	uint32 transparent = _gfx->_texturePixelFormat.ARGBToColor(0x00, 0, 0, 0);
 
 	// Get the console palette
-	byte *palette = nullptr;
-	if (_variant & GF_AMIGA_RETAIL)
-		palette = getPaletteFromNeoImage(file, 0x137f4);
-	else {
-		Common::File neoFile;
-		neoFile.open("console.neo");
-		if (neoFile.isOpen())
-			palette = getPaletteFromNeoImage(&neoFile, 0);
+	byte *palette = paletteOverride;
+	bool ownsPalette = false;
+	if (!palette) {
+		if (_variant & GF_AMIGA_RETAIL)
+			palette = getPaletteFromNeoImage(file, 0x137f4);
+		else {
+			Common::File neoFile;
+			neoFile.open("console.neo");
+			if (neoFile.isOpen())
+				palette = getPaletteFromNeoImage(&neoFile, 0);
+		}
+		ownsPalette = true;
 	}
 	if (!palette)
 		return;
@@ -54,7 +58,8 @@ void DrillerEngine::loadRigSprites(Common::SeekableReadStream *file, int sprigsO
 		_rigSprites.push_back(surf);
 	}
 
-	free(palette);
+	if (ownsPalette)
+		free(palette);
 }
 
 void DrillerEngine::loadIndicatorSprites(Common::SeekableReadStream *file, byte *palette,
diff --git a/engines/freescape/games/driller/atari.cpp b/engines/freescape/games/driller/atari.cpp
index 5bcad8e492a..1819bd9a5f3 100644
--- a/engines/freescape/games/driller/atari.cpp
+++ b/engines/freescape/games/driller/atari.cpp
@@ -284,6 +284,17 @@ void DrillerEngine::loadAssetsAtariFullGame() {
 			load8bitBinary(stream, 0x29b3c, 16);
 			loadPalettes(stream, 0x296fa);
 			loadSoundsFx(stream, 0x30da6, 25);
+
+			// Budget Atari full-game indicator blocks match the Amiga retail data
+			// shifted by -0xDA in the validated 293062-byte x.prg layout.
+			byte *palette = getPaletteFromNeoImage(stream, 0x1371a);
+			loadRigSprites(stream, 0x23FA0, palette);
+			if (palette) {
+				loadIndicatorSprites(stream, palette, 0x26EC0, 0x27148, 0x24CAE, 0x26838);
+				loadCompassStrips(stream, palette, 0x2323C, 0x26E72);
+				loadEarthquakeSprites(stream, palette, 0x27486);
+			}
+			free(palette);
 		}
 	} else
 		error("Unknown Atari ST Driller variant");
diff --git a/engines/freescape/games/driller/driller.h b/engines/freescape/games/driller/driller.h
index 2a8d874ba58..f414ec6990d 100644
--- a/engines/freescape/games/driller/driller.h
+++ b/engines/freescape/games/driller/driller.h
@@ -117,7 +117,7 @@ private:
 	Common::Rect _quitArea;   // click area for quit button on Amiga/Atari console
 	Common::Array<Graphics::ManagedSurface *> _earthquakeSprites; // seismograph monitor frames
 	int _earthquakeLastFrame;
-	void loadRigSprites(Common::SeekableReadStream *file, int sprigsOffset);
+	void loadRigSprites(Common::SeekableReadStream *file, int sprigsOffset, byte *palette = nullptr);
 	void loadIndicatorSprites(Common::SeekableReadStream *file, byte *palette,
 		int stepOffset, int angleOffset, int vehicleOffset, int quitOffset);
 	void loadEarthquakeSprites(Common::SeekableReadStream *file, byte *palette, int earthquakeOffset);




More information about the Scummvm-git-logs mailing list