[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