[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