[Scummvm-git-logs] scummvm master -> 8f38e67a66f8a78a4c7bf909f4fb9e24d0a95e7c
neuromancer
noreply at scummvm.org
Sun Sep 29 17:50:04 UTC 2024
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
8f38e67a66 FREESCAPE: initial implementation of hercules support for driller
Commit: 8f38e67a66f8a78a4c7bf909f4fb9e24d0a95e7c
https://github.com/scummvm/scummvm/commit/8f38e67a66f8a78a4c7bf909f4fb9e24d0a95e7c
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-09-29T19:49:07+02:00
Commit Message:
FREESCAPE: initial implementation of hercules support for driller
Changed paths:
engines/freescape/detection.cpp
engines/freescape/freescape.cpp
engines/freescape/games/driller/dos.cpp
engines/freescape/games/palettes.cpp
engines/freescape/gfx.cpp
engines/freescape/gfx.h
engines/freescape/gfx_opengl.cpp
engines/freescape/loaders/8bitImage.cpp
engines/freescape/ui.cpp
diff --git a/engines/freescape/detection.cpp b/engines/freescape/detection.cpp
index 9d8a85e662b..21a2a588f79 100644
--- a/engines/freescape/detection.cpp
+++ b/engines/freescape/detection.cpp
@@ -117,7 +117,7 @@ static const ADGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformDOS,
ADGF_NO_FLAGS,
- GUIO4(GUIO_NOMIDI, GUIO_RENDEREGA, GUIO_RENDERCGA, GAMEOPTION_AUTOMATIC_DRILLING)
+ GUIO5(GUIO_NOMIDI, GUIO_RENDEREGA, GUIO_RENDERCGA, GUIO_RENDERHERCGREEN, GAMEOPTION_AUTOMATIC_DRILLING)
},
{ // Retail release
"driller",
diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index d9b92b66d44..0c32900502a 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -44,8 +44,13 @@ FreescapeEngine::FreescapeEngine(OSystem *syst, const ADGameDescription *gd)
_renderMode = Common::parseRenderMode(ConfMan.get("render_mode"));
_binaryBits = 0;
- _screenW = 320;
- _screenH = 200;
+ if (_renderMode == Common::kRenderHercG) {
+ _screenW = 720;
+ _screenH = 348;
+ } else {
+ _screenW = 320;
+ _screenH = 200;
+ }
if (isAmiga()) {
_renderMode = Common::kRenderAmiga;
@@ -679,8 +684,8 @@ Common::Error FreescapeEngine::run() {
_vsyncEnabled = g_system->getFeatureState(OSystem::kFeatureVSync);
_frameLimiter = new Graphics::FrameLimiter(g_system, ConfMan.getInt("engine_speed"));
// Initialize graphics
- _screenW = g_system->getWidth();
- _screenH = g_system->getHeight();
+ //_screenW = g_system->getWidth();
+ //_screenH = g_system->getHeight();
_gfx = createRenderer(_screenW, _screenH, _renderMode, ConfMan.getBool("authentic_graphics"));
_speaker = new SizedPCSpeaker();
_speaker->setVolume(50);
diff --git a/engines/freescape/games/driller/dos.cpp b/engines/freescape/games/driller/dos.cpp
index 2f05bd3452f..996f96a4c13 100644
--- a/engines/freescape/games/driller/dos.cpp
+++ b/engines/freescape/games/driller/dos.cpp
@@ -29,6 +29,7 @@ namespace Freescape {
extern byte kCGAPalettePinkBlueWhiteData[4][3];
extern byte kEGADefaultPalette[16][3];
+extern byte kHerculesPaletteGreen[2][3];
byte kDrillerCGAPalettePinkBlue[4][3] = {
{0x00, 0x00, 0x00},
@@ -81,6 +82,8 @@ static const CGAPaletteEntry rawCGAPaletteByArea[] {
void DrillerEngine::initDOS() {
if (_renderMode == Common::kRenderEGA)
_viewArea = Common::Rect(40, 16, 280, 117);
+ else if (_renderMode == Common::kRenderHercG)
+ _viewArea = Common::Rect(112, 64, 607, 224);
else if (_renderMode == Common::kRenderCGA)
_viewArea = Common::Rect(36, 16, 284, 117);
else
@@ -350,14 +353,36 @@ void DrillerEngine::loadAssetsDOSFullGame() {
_border = load8bitBinImage(&file, 0x210);
_border->setPalette((byte*)&kCGAPalettePinkBlueWhiteData, 0, 4);
swapPalette(1);
+ } else if (_renderMode == Common::kRenderHercG) {
+ file.open("SCN1H.DAT");
+ if (file.isOpen()) {
+ _title = load8bitBinImage(&file, 0x0);
+ _title->setPalette((byte*)&kHerculesPaletteGreen, 0, 2);
+ }
+ file.close();
+ file.open("DRILLH.EXE");
+
+ if (!file.isOpen())
+ error("Failed to open DRILLH.EXE");
+
+ //loadSpeakerFxDOS(&file, 0x27e7 + 0x200, 0x2774 + 0x200);
+
+ //loadFonts(&file, 0x07a4a, _font);
+ loadMessagesFixedSize(&file, 0x3411, 14, 20);
+ load8bitBinary(&file, 0x89e0, 4);
+ loadGlobalObjects(&file, 0x2d02, 8);
+ _border = load8bitBinImage(&file, 0x210);
+ _border->setPalette((byte*)&kHerculesPaletteGreen, 0, 2);
} else
error("Unsupported video mode for DOS");
- _indicators.push_back(loadBundledImage("driller_tank_indicator"));
- _indicators.push_back(loadBundledImage("driller_ship_indicator"));
+ if (_renderMode != Common::kRenderHercG) {
+ _indicators.push_back(loadBundledImage("driller_tank_indicator"));
+ _indicators.push_back(loadBundledImage("driller_ship_indicator"));
- _indicators[0]->convertToInPlace(_gfx->_texturePixelFormat);
- _indicators[1]->convertToInPlace(_gfx->_texturePixelFormat);
+ _indicators[0]->convertToInPlace(_gfx->_texturePixelFormat);
+ _indicators[1]->convertToInPlace(_gfx->_texturePixelFormat);
+ }
}
void DrillerEngine::loadAssetsDOSDemo() {
@@ -398,6 +423,9 @@ void DrillerEngine::loadAssetsDOSDemo() {
}
void DrillerEngine::drawDOSUI(Graphics::Surface *surface) {
+
+ if (_renderMode == Common::kRenderHercG)
+ return;
uint32 color = _renderMode == Common::kRenderCGA ? 1 : 14;
uint8 r, g, b;
diff --git a/engines/freescape/games/palettes.cpp b/engines/freescape/games/palettes.cpp
index d8870095603..5f9961a54d3 100644
--- a/engines/freescape/games/palettes.cpp
+++ b/engines/freescape/games/palettes.cpp
@@ -42,6 +42,11 @@ byte kEGADefaultPalette[16][3] = {
{0xff, 0xff, 0xff}
};
+byte kHerculesPaletteGreen[2][3] = {
+ {0x00, 0x00, 0x00},
+ {0x00, 0xff, 0x00},
+};
+
byte kDrillerC64Palette[16][3] = {
{0x00, 0x00, 0x00},
{0xFF, 0xFF, 0xFF},
@@ -117,6 +122,8 @@ void FreescapeEngine::loadColorPalette() {
_gfx->_palette = (byte *)kDrillerZXPalette;
} else if (_renderMode == Common::kRenderCPC) {
_gfx->_palette = (byte *)kDrillerCPCPalette;
+ } else if (_renderMode == Common::kRenderHercG) {
+ _gfx->_palette = (byte *)&kHerculesPaletteGreen;
} else if (_renderMode == Common::kRenderCGA) {
// palette depends on the area
} else if (_renderMode == Common::kRenderAmiga || _renderMode == Common::kRenderAtariST) {
diff --git a/engines/freescape/gfx.cpp b/engines/freescape/gfx.cpp
index ae8d6f61899..0a69fee5ecd 100644
--- a/engines/freescape/gfx.cpp
+++ b/engines/freescape/gfx.cpp
@@ -202,7 +202,7 @@ void Renderer::scaleStipplePattern(byte originalPattern[128], byte newPattern[12
void Renderer::setColorMap(ColorMap *colorMap_) {
_colorMap = colorMap_;
- if (_renderMode == Common::kRenderZX) {
+ if (_renderMode == Common::kRenderZX || _renderMode == Common::kRenderHercG) {
for (int i = 0; i < 15; i++) {
byte *entry = (*_colorMap)[i];
for (int j = 0; j < 128; j++)
@@ -380,6 +380,30 @@ bool Renderer::getRGBAtZX(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r
return true;
}
+bool Renderer::getRGBAtHercules(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2, byte *&stipple) {
+ if (index == _keyColor)
+ return false;
+
+ byte *entry = (*_colorMap)[index - 1];
+ if (entry[0] == 0 && entry[1] == 0 && entry[2] == 0 && entry[3] == 0) {
+ readFromPalette(0, r1, g1, b1);
+ readFromPalette(0, r2, g2, b2);
+ return true;
+ }
+
+ if (entry[0] == 0xff && entry[1] == 0xff && entry[2] == 0xff && entry[3] == 0xff) {
+ readFromPalette(1, r1, g1, b1);
+ readFromPalette(1, r2, g2, b2);
+ return true;
+ }
+
+ stipple = (byte *)_stipples[index - 1];
+ readFromPalette(0, r1, g1, b1);
+ readFromPalette(1, r2, g2, b2);
+ return true;
+}
+
+
void Renderer::selectColorFromFourColorPalette(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1) {
if (index == 0) {
r1 = 0;
@@ -517,6 +541,8 @@ bool Renderer::getRGBAt(uint8 index, uint8 ecolor, uint8 &r1, uint8 &g1, uint8 &
return getRGBAtCPC(index, r1, g1, b1, r2, g2, b2, stipple);
else if (_renderMode == Common::kRenderZX)
return getRGBAtZX(index, r1, g1, b1, r2, g2, b2, stipple);
+ else if (_renderMode == Common::kRenderHercG)
+ return getRGBAtHercules(index, r1, g1, b1, r2, g2, b2, stipple);
error("Invalid or unsupported render mode");
diff --git a/engines/freescape/gfx.h b/engines/freescape/gfx.h
index 97c1a2826db..c92213f640f 100644
--- a/engines/freescape/gfx.h
+++ b/engines/freescape/gfx.h
@@ -121,6 +121,7 @@ public:
bool getRGBAtCPC(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2, byte *&stipple);
bool getRGBAtEGA(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2);
bool getRGBAtZX(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2, byte *&stipple);
+ bool getRGBAtHercules(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2, byte *&stipple);
void extractCPCIndexes(uint8 cm1, uint8 cm2, uint8 &i1, uint8 &i2);
void extractC64Indexes(uint8 cm1, uint8 cm2, uint8 &i1, uint8 &i2);
diff --git a/engines/freescape/gfx_opengl.cpp b/engines/freescape/gfx_opengl.cpp
index 8faf3fe8e49..bf20c753748 100644
--- a/engines/freescape/gfx_opengl.cpp
+++ b/engines/freescape/gfx_opengl.cpp
@@ -515,9 +515,10 @@ void OpenGLRenderer::useStipple(bool enabled) {
glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(factor - 1.0f, -1.0f);
glEnable(GL_POLYGON_STIPPLE);
- if (_renderMode == Common::kRenderZX ||
- _renderMode == Common::kRenderCPC ||
- _renderMode == Common::kRenderCGA)
+ if (_renderMode == Common::kRenderZX ||
+ _renderMode == Common::kRenderCPC ||
+ _renderMode == Common::kRenderCGA ||
+ _renderMode == Common::kRenderHercG)
glPolygonStipple(_variableStippleArray);
else
glPolygonStipple(_defaultStippleArray);
diff --git a/engines/freescape/loaders/8bitImage.cpp b/engines/freescape/loaders/8bitImage.cpp
index 53875ee05c8..724426e4497 100644
--- a/engines/freescape/loaders/8bitImage.cpp
+++ b/engines/freescape/loaders/8bitImage.cpp
@@ -26,6 +26,8 @@ namespace Freescape {
void FreescapeEngine::renderPixels8bitBinImage(Graphics::ManagedSurface *surface, int row, int column, int pixels, int bit) {
int mask = 0x80;
for (int i = 0; i < 8; i++) {
+ if (column + i >= _screenW)
+ continue;
if ((pixels & mask) > 0) {
int sample = surface->getPixel(column + i, row) | bit;
surface->setPixel(column + i, row, sample);
@@ -63,7 +65,7 @@ int FreescapeEngine::execute8bitBinImageCommand(Common::SeekableReadStream *file
void FreescapeEngine::load8bitBinImageRowIteration(Common::SeekableReadStream *file, Graphics::ManagedSurface *surface, int row, int bit) {
int pixels = 0;
- while (pixels < 320) {
+ while (pixels < surface->w) {
pixels += execute8bitBinImageCommand(file, surface, row, pixels, bit);
}
}
@@ -75,6 +77,8 @@ void FreescapeEngine::load8bitBinImageRow(Common::SeekableReadStream *file, Grap
nBits = 2;
else if (_renderMode == Common::kRenderEGA)
nBits = 4;
+ else if (_renderMode == Common::kRenderHercG)
+ nBits = 1;
else
error("Unimplemented render mode for reading images");
@@ -87,13 +91,13 @@ void FreescapeEngine::load8bitBinImageRow(Common::SeekableReadStream *file, Grap
Graphics::ManagedSurface *FreescapeEngine::load8bitBinImage(Common::SeekableReadStream *file, int offset) {
Graphics::ManagedSurface *surface = new Graphics::ManagedSurface();
surface->create(_screenW, _screenH, Graphics::PixelFormat::createFormatCLUT8());
- surface->fillRect(Common::Rect(0, 0, 320, 200), 0);
+ surface->fillRect(Common::Rect(0, 0, _screenW, _screenH), 0);
file->seek(offset);
int imageSize = file->readUint16BE();
int startImage = file->pos();
- for (int row = 0; row < 200; row++)
+ for (int row = 0; row < surface->h; row++)
load8bitBinImageRow(file, surface, row);
assert(startImage + imageSize == file->pos());
diff --git a/engines/freescape/ui.cpp b/engines/freescape/ui.cpp
index 84a6cfaa010..da5591fabe3 100644
--- a/engines/freescape/ui.cpp
+++ b/engines/freescape/ui.cpp
@@ -70,6 +70,9 @@ void FreescapeEngine::titleScreen() {
}
Graphics::Surface *FreescapeEngine::drawStringsInSurface(const Common::Array<Common::String> &lines, Graphics::Surface *surface) {
+ if (!_fontLoaded)
+ return surface;
+
uint32 color = 0;
uint32 back = _gfx->_texturePixelFormat.ARGBToColor(0x00, 0x00, 0x00, 0x00);
More information about the Scummvm-git-logs
mailing list