[Scummvm-git-logs] scummvm master -> 362f134af43b52c41534f4d07bd85d55a7502879

neuromancer noreply at scummvm.org
Wed Dec 21 21:04:30 UTC 2022


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

Summary:
adbaa03aec FREESCAPE: improved support for Driller demo (DOS)
ac263aadf9 FREESCAPE: improved CGA support for Driller release and demo (DOS)
afc8253463 FREESCAPE: increased near clip plane to reduce flickering
943ab0d77c FREESCAPE: avoid crashing when flashing the screen in CGA
85dec32b71 FREESCAPE: refactored code that replaces black by transparent pixels in borders
f81e71a42e FREESCAPE: added driller title screen and regenerated freescape.dat file
362f134af4 FREESCAPE: better handling for title and border drawing when a game starts


Commit: adbaa03aecb141ac0203a298b762626a49fb55c8
    https://github.com/scummvm/scummvm/commit/adbaa03aecb141ac0203a298b762626a49fb55c8
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-12-21T18:03:27-03:00

Commit Message:
FREESCAPE: improved support for Driller demo (DOS)

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


diff --git a/engines/freescape/games/driller.cpp b/engines/freescape/games/driller.cpp
index 1eb8aa9ea75..95b00dccaa7 100644
--- a/engines/freescape/games/driller.cpp
+++ b/engines/freescape/games/driller.cpp
@@ -40,6 +40,9 @@ static const struct CGAPalettteEntry {
 } rawCGAPaletteTable[] {
 	{1, kDrillerCGAPaletteRedGreen},
 	{2, kDrillerCGAPalettePinkBlue},
+	{3, kDrillerCGAPaletteRedGreen},
+	{8, kDrillerCGAPalettePinkBlue},
+	{14, kDrillerCGAPalettePinkBlue},
 	{0, 0}   // This marks the end
 };
 
@@ -108,7 +111,11 @@ void DrillerEngine::gotoArea(uint16 areaID, int entranceID) {
 	if (!_gameStateBits.contains(areaID))
 		_gameStateBits[areaID] = 0;
 
-	assert(_areaMap.contains(areaID));
+	if (!_areaMap.contains(areaID)) {
+		assert(isDOS() && isDemo());
+		// Not included in the demo, abort area change
+		return;
+	}
 	_currentArea = _areaMap[areaID];
 	_currentArea->show();
 
@@ -302,6 +309,10 @@ void DrillerEngine::loadAssetsDemo() {
 		loadMessagesFixedSize(&file, 0x636, 14, 20);
 		load8bitBinary(&file, 0x55b0, 4);
 
+		// Fixed for a corrupted area names in the demo data
+		_areaMap[2]->_name = "LAPIS LAZULI";
+		_areaMap[3]->_name = "EMERALD";
+		_areaMap[8]->_name = "TOPAZ";
 		file.close();
 	} else
 		error("Unsupported demo for Driller");
diff --git a/engines/freescape/language/instruction.cpp b/engines/freescape/language/instruction.cpp
index 11cae2147a1..2e3f2768efe 100644
--- a/engines/freescape/language/instruction.cpp
+++ b/engines/freescape/language/instruction.cpp
@@ -258,10 +258,14 @@ bool FreescapeEngine::executeEndIfVisibilityIsEqual(FCLInstruction &instruction)
 		assert(obj);
 		debugC(1, kFreescapeDebugCode, "End condition if visibility of obj with id %d is %d!", source, value);
 	} else {
-		assert(_areaMap.contains(source));
-		obj = _areaMap[source]->objectWithID(additional);
-		assert(obj);
 		debugC(1, kFreescapeDebugCode, "End condition if visibility of obj with id %d in area %d is %d!", additional, source, value);
+		if (_areaMap.contains(source)) {
+			obj = _areaMap[source]->objectWithID(additional);
+			assert(obj);
+		} else {
+			assert(isDOS() && isDemo()); // Should only happen in the DOS demo
+			return (value == false);
+		}
 	}
 
 	return (obj->isInvisible() == value);
@@ -349,9 +353,14 @@ void FreescapeEngine::executeMakeInvisible(FCLInstruction &instruction) {
 	}
 
 	debugC(1, kFreescapeDebugCode, "Making obj %d invisible in area %d!", objectID, areaID);
-	Object *obj = _areaMap[areaID]->objectWithID(objectID);
-	assert(obj); // We assume the object was there
-	obj->makeInvisible();
+	if (_areaMap.contains(areaID)) {
+		Object *obj = _areaMap[areaID]->objectWithID(objectID);
+		assert(obj); // We assume the object was there
+		obj->makeInvisible();
+	} else {
+		assert(isDOS() && isDemo()); // Should only happen in the DOS demo
+	}
+
 }
 
 void FreescapeEngine::executeMakeVisible(FCLInstruction &instruction) {
@@ -366,9 +375,13 @@ void FreescapeEngine::executeMakeVisible(FCLInstruction &instruction) {
 	}
 
 	debugC(1, kFreescapeDebugCode, "Making obj %d visible in area %d!", objectID, areaID);
-	Object *obj = _areaMap[areaID]->objectWithID(objectID);
-	assert(obj); // We assume an object should be there
-	obj->makeVisible();
+	if (_areaMap.contains(areaID)) {
+		Object *obj = _areaMap[areaID]->objectWithID(objectID);
+		assert(obj); // We assume an object should be there
+		obj->makeVisible();
+	} else {
+		assert(isDOS() && isDemo()); // Should only happen in the DOS demo
+	}
 }
 
 void FreescapeEngine::executeToggleVisibility(FCLInstruction &instruction) {


Commit: ac263aadf987e172ee29e9c5506a983301edcd5a
    https://github.com/scummvm/scummvm/commit/ac263aadf987e172ee29e9c5506a983301edcd5a
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-12-21T18:03:27-03:00

Commit Message:
FREESCAPE: improved CGA support for Driller release and demo (DOS)

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


diff --git a/engines/freescape/games/driller.cpp b/engines/freescape/games/driller.cpp
index 95b00dccaa7..ccbd9f3a515 100644
--- a/engines/freescape/games/driller.cpp
+++ b/engines/freescape/games/driller.cpp
@@ -186,6 +186,10 @@ void DrillerEngine::loadGlobalObjects(Common::SeekableReadStream *file, int offs
 	ObjectMap *globalObjectsByID = new ObjectMap;
 	file->seek(offset);
 	for (int i = 0; i < 8; i++) {
+		if (isDOS() && isDemo()) // The DOS demo has a few missing objects
+			if (i == 5)
+				break;
+
 		Object *gobj = load8bitObject(file);
 		assert(gobj);
 		assert(!globalObjectsByID->contains(gobj->getObjectID()));
@@ -308,6 +312,7 @@ void DrillerEngine::loadAssetsDemo() {
 		loadFonts(&file, 0x4eb0);
 		loadMessagesFixedSize(&file, 0x636, 14, 20);
 		load8bitBinary(&file, 0x55b0, 4);
+		loadGlobalObjects(&file, 0x8c);
 
 		// Fixed for a corrupted area names in the demo data
 		_areaMap[2]->_name = "LAPIS LAZULI";
@@ -424,6 +429,7 @@ void DrillerEngine::loadAssetsFullGame() {
 		loadFonts(&file, 0x07a4a);
 		loadMessagesFixedSize(&file, 0x2585, 14, 20);
 		load8bitBinary(&file, 0x7bb0, 4);
+		loadGlobalObjects(&file, 0x1fa2);
 	} else
 		error("Invalid or unsupported render mode %s for Driller", Common::getRenderModeDescription(_renderMode));
 
@@ -693,6 +699,8 @@ Math::Vector3d getProjectionToPlane(const Math::Vector3d &vect, const Math::Vect
 
 void DrillerEngine::pressedKey(const int keycode) {
 	if (keycode == Common::KEYCODE_d) {
+		if (isDOS() && isDemo()) // No support for drilling here yet
+			return;
 		clearTemporalMessages();
 		Common::Point gasPocket = _currentArea->_gasPocketPosition;
 		uint32 gasPocketRadius = _currentArea->_gasPocketRadius;
@@ -750,6 +758,8 @@ void DrillerEngine::pressedKey(const int keycode) {
 		} else
 			_drilledAreas[_currentArea->getAreaID()] = kDrillerRigOutOfPlace;
 	} else if (keycode == Common::KEYCODE_c) {
+		if (isDOS() && isDemo()) // No support for drilling here yet
+			return;
 		uint32 gasPocketRadius = _currentArea->_gasPocketRadius;
 		clearTemporalMessages();
 		if (gasPocketRadius == 0) {


Commit: afc8253463fb10f6f6e51d6bec1d335092c03eb6
    https://github.com/scummvm/scummvm/commit/afc8253463fb10f6f6e51d6bec1d335092c03eb6
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-12-21T18:03:27-03:00

Commit Message:
FREESCAPE: increased near clip plane to reduce flickering

Changed paths:
    engines/freescape/freescape.cpp


diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index 6e8431a00a2..e212188197c 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -110,7 +110,7 @@ FreescapeEngine::FreescapeEngine(OSystem *syst, const ADGameDescription *gd)
 
 	_lastMousePos = Common::Point(0, 0);
 	_lastFrame = 0;
-	_nearClipPlane = 1;
+	_nearClipPlane = 2;
 	_farClipPlane = 8192 + 1802; // Added some extra distance to avoid flickering
 
 	// These depends on the specific game


Commit: 943ab0d77c94587ba06973a1af2e3101f2e10170
    https://github.com/scummvm/scummvm/commit/943ab0d77c94587ba06973a1af2e3101f2e10170
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-12-21T18:03:27-03:00

Commit Message:
FREESCAPE: avoid crashing when flashing the screen in CGA

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


diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index e212188197c..08f252a1f1c 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -290,7 +290,7 @@ void FreescapeEngine::drawFrame() {
 	_gfx->positionCamera(_position, _position + _cameraFront);
 
 	if (_underFireFrames > 0) {
-		int underFireColor = isDriller() && (_renderMode == Common::kRenderEGA) ? 1
+		int underFireColor = isDriller() && isDOS() ? 1
 							: _currentArea->_underFireBackgroundColor;
 		if (underFireColor < 16) {
 			_currentArea->remapColor(_currentArea->_usualBackgroundColor, underFireColor);
diff --git a/engines/freescape/gfx.cpp b/engines/freescape/gfx.cpp
index a64b0e885b1..281fbb410b7 100644
--- a/engines/freescape/gfx.cpp
+++ b/engines/freescape/gfx.cpp
@@ -115,11 +115,14 @@ bool Renderer::getRGBAtEGA(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &
 
 bool Renderer::getRGBAt(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2) {
 
-	/*if (_colorRemaps && _colorRemaps->contains(index)) {
+	if (_colorRemaps && _colorRemaps->contains(index)) {
 		index = (*_colorRemaps)[index];
-		readFromPalette(index, r, g, b);
+		readFromPalette(index, r1, g1, b1);
+		r2 = r1;
+		g2 = g1;
+		b2 = b1;
 		return true;
-	}*/
+	}
 
 	if (index == _keyColor)
 		return false;
diff --git a/engines/freescape/language/instruction.cpp b/engines/freescape/language/instruction.cpp
index 2e3f2768efe..1f6146477bb 100644
--- a/engines/freescape/language/instruction.cpp
+++ b/engines/freescape/language/instruction.cpp
@@ -237,7 +237,7 @@ void FreescapeEngine::executeSPFX(FCLInstruction &instruction) {
 	} else if (isDOS()) {
 		debugC(1, kFreescapeDebugCode, "Switching palette from position %d to %d", src, dst);
 		if (src == 0 && dst == 1)
-			_currentArea->remapColor(_currentArea->_usualBackgroundColor, _currentArea->_underFireBackgroundColor);
+			_currentArea->remapColor(_currentArea->_usualBackgroundColor, _renderMode == Common::kRenderCGA ? 1 : _currentArea->_underFireBackgroundColor);
 		else if (src == 0 && dst == 0)
 			_currentArea->unremapColor(_currentArea->_usualBackgroundColor);
 		else
@@ -300,7 +300,7 @@ void FreescapeEngine::executeIncrementVariable(FCLInstruction &instruction) {
 			_gameStateVars[variable] = 0;
 
 		if (increment < 0)
-			flashScreen(_currentArea->_underFireBackgroundColor);
+			flashScreen(_renderMode == Common::kRenderCGA ? 1 :_currentArea->_underFireBackgroundColor);
 
 		debugC(1, kFreescapeDebugCode, "Shield incremented by %d up to %d", increment, _gameStateVars[variable]);
 		break;


Commit: 85dec32b711a1ec4a0a657da4cd68012433b0143
    https://github.com/scummvm/scummvm/commit/85dec32b711a1ec4a0a657da4cd68012433b0143
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-12-21T18:03:27-03:00

Commit Message:
FREESCAPE: refactored code that replaces black by transparent pixels in borders

Changed paths:
    engines/freescape/freescape.cpp


diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index 08f252a1f1c..2c46514606f 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -168,19 +168,7 @@ void FreescapeEngine::drawBorder() {
 
 	_gfx->setViewport(_fullscreenViewArea);
 
-	if (!_borderTexture) {
-		// Replace black pixel for transparent ones
-		uint32 black = _border->format.ARGBToColor(0xFF, 0x00, 0x00, 0x00);
-		uint32 transparent = _border->format.ARGBToColor(0x00, 0x00, 0x00, 0x00);
-
-		for (int i = 0; i < _border->w; i++) {
-			for (int j = 0; j < _border->h; j++) {
-				if (_border->getPixel(i, j) == black)
-					_border->setPixel(i, j, transparent);
-			}
-		}
-		_borderTexture = _gfx->createTexture(_border);
-	}
+	assert(_borderTexture);
 	_gfx->drawTexturedRect2D(_fullscreenViewArea, _fullscreenViewArea, _borderTexture);
 	_gfx->setViewport(_viewArea);
 }
@@ -556,6 +544,18 @@ void FreescapeEngine::prepareBorder() {
 		_borderTexture = nullptr;
 		uint32 gray = _gfx->_texturePixelFormat.ARGBToColor(0x00, 0xA0, 0xA0, 0xA0);
 		_border->fillRect(_viewArea, gray);
+
+		// Replace black pixel for transparent ones
+		uint32 black = _border->format.ARGBToColor(0xFF, 0x00, 0x00, 0x00);
+		uint32 transparent = _border->format.ARGBToColor(0x00, 0x00, 0x00, 0x00);
+
+		for (int i = 0; i < _border->w; i++) {
+			for (int j = 0; j < _border->h; j++) {
+				if (_border->getPixel(i, j) == black)
+					_border->setPixel(i, j, transparent);
+			}
+		}
+		_borderTexture = _gfx->createTexture(_border);
 	}
 }
 


Commit: f81e71a42e0be719105775a2ed3d316d103fa4a2
    https://github.com/scummvm/scummvm/commit/f81e71a42e0be719105775a2ed3d316d103fa4a2
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-12-21T18:03:27-03:00

Commit Message:
FREESCAPE: added driller title screen and regenerated freescape.dat file

Changed paths:
  A devtools/create_freescape/driller_cga_title.bmp
  A devtools/create_freescape/driller_ega_title.bmp
    dists/engine-data/freescape.dat


diff --git a/devtools/create_freescape/driller_cga_title.bmp b/devtools/create_freescape/driller_cga_title.bmp
new file mode 100644
index 00000000000..2741613f4a5
Binary files /dev/null and b/devtools/create_freescape/driller_cga_title.bmp differ
diff --git a/devtools/create_freescape/driller_ega_title.bmp b/devtools/create_freescape/driller_ega_title.bmp
new file mode 100644
index 00000000000..b0ad1adc1f8
Binary files /dev/null and b/devtools/create_freescape/driller_ega_title.bmp differ
diff --git a/dists/engine-data/freescape.dat b/dists/engine-data/freescape.dat
index 87eff18683e..f9e2892d9cb 100644
Binary files a/dists/engine-data/freescape.dat and b/dists/engine-data/freescape.dat differ


Commit: 362f134af43b52c41534f4d07bd85d55a7502879
    https://github.com/scummvm/scummvm/commit/362f134af43b52c41534f4d07bd85d55a7502879
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-12-21T18:03:27-03:00

Commit Message:
FREESCAPE: better handling for title and border drawing when a game starts

Changed paths:
    engines/freescape/freescape.cpp
    engines/freescape/freescape.h
    engines/freescape/games/driller.cpp
    engines/freescape/loaders/8bitBinaryLoader.cpp


diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index 2c46514606f..b98ec4b5e59 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -500,7 +500,17 @@ Common::Error FreescapeEngine::run() {
 		}
 	}
 
-	prepareBorder();
+	loadBorder(); // Border is load unmodified
+	if (_border && isDOS()) {
+		if (saveSlot == -1) {
+			drawBorder();
+			_gfx->flipBuffer();
+			g_system->updateScreen();
+			g_system->delayMillis(3000);
+		}
+	}
+	processBorder(); // Border is processed to use during the game
+
 	if (saveSlot >= 0) { // load the savegame
 		loadGameState(saveSlot);
 	} else
@@ -539,9 +549,14 @@ Common::Error FreescapeEngine::run() {
 	return Common::kNoError;
 }
 
-void FreescapeEngine::prepareBorder() {
+void FreescapeEngine::loadBorder() {
+	_borderTexture = _gfx->createTexture(_border);
+}
+
+void FreescapeEngine::processBorder() {
 	if (_border) {
-		_borderTexture = nullptr;
+		if (_borderTexture)
+			delete _borderTexture;
 		uint32 gray = _gfx->_texturePixelFormat.ARGBToColor(0x00, 0xA0, 0xA0, 0xA0);
 		_border->fillRect(_viewArea, gray);
 
diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index 0e94bc02952..c2876c7168f 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -104,7 +104,8 @@ public:
 	Common::Rect _fullscreenViewArea;
 	void centerCrossair();
 
-	virtual void prepareBorder();
+	virtual void loadBorder();
+	virtual void processBorder();
 	void drawBorder();
 	void drawTitle();
 	void drawBackground();
@@ -359,7 +360,7 @@ public:
 
 	void gotoArea(uint16 areaID, int entranceID) override;
 
-	void prepareBorder() override;
+	void processBorder() override;
 	void loadAssets() override;
 	void drawUI() override;
 
diff --git a/engines/freescape/games/driller.cpp b/engines/freescape/games/driller.cpp
index ccbd9f3a515..58154af2180 100644
--- a/engines/freescape/games/driller.cpp
+++ b/engines/freescape/games/driller.cpp
@@ -407,7 +407,6 @@ void DrillerEngine::loadAssetsFullGame() {
 		loadSoundsFx(&file, 0x30da6, 25);
 	} else if (_renderMode == Common::kRenderEGA) {
 		loadBundledImages();
-		_title = _border;
 		file.open("DRILLE.EXE");
 
 		if (!file.isOpen())
@@ -420,7 +419,6 @@ void DrillerEngine::loadAssetsFullGame() {
 
 	} else if (_renderMode == Common::kRenderCGA) {
 		loadBundledImages();
-		_title = _border;
 		file.open("DRILLC.EXE");
 
 		if (!file.isOpen())
@@ -457,8 +455,8 @@ void DrillerEngine::loadAssetsFullGame() {
 	_areaMap[18]->_conditionSources.push_back(conditionSource);
 }
 
-void DrillerEngine::prepareBorder() {
-	FreescapeEngine::prepareBorder();
+void DrillerEngine::processBorder() {
+	FreescapeEngine::processBorder();
 	if (isDOS() && _renderMode == Common::kRenderCGA) { // Replace some colors for the CGA borders
 		uint32 color1 = _border->format.ARGBToColor(0xFF, 0xAA, 0x00, 0xAA);
 		uint32 color2 = _border->format.ARGBToColor(0xFF, 0xAA, 0x55, 0x00);
diff --git a/engines/freescape/loaders/8bitBinaryLoader.cpp b/engines/freescape/loaders/8bitBinaryLoader.cpp
index b32e6000e70..029b03a9dff 100644
--- a/engines/freescape/loaders/8bitBinaryLoader.cpp
+++ b/engines/freescape/loaders/8bitBinaryLoader.cpp
@@ -585,6 +585,15 @@ void FreescapeEngine::loadBundledImages() {
 		decoder.destroy();
 	} else
 		error("Missing border file '%s' in data bundle", borderFilename.c_str());
+
+	Common::String titleFilename = targetName + "_" + Common::getRenderModeDescription(_renderMode) + "_title.bmp";
+	if (_dataBundle->hasFile(titleFilename)) {
+		Common::SeekableReadStream *titleFile = _dataBundle->createReadStreamForMember(titleFilename);
+		decoder.loadStream(*titleFile);
+		_title = new Graphics::Surface();
+		_title->copyFrom(*decoder.getSurface());
+		decoder.destroy();
+	}
 }
 
 void FreescapeEngine::loadFonts(Common::SeekableReadStream *file, int offset) {




More information about the Scummvm-git-logs mailing list