[Scummvm-git-logs] scummvm master -> 6953dd9204953269b071be77dbc512421dab030a

neuromancer noreply at scummvm.org
Sat Sep 9 09:04:01 UTC 2023


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

Summary:
44ad141bae FREESCAPE: added more global objects for dark for amiga
72bdf05d9f FREESCAPE: improved cga code for dark and driller
42833df30b FREESCAPE: glPolygonOffset depends on the area scale
6953dd9204 FREESCAPE: avoid waiting for users to press a key when starting driller demos


Commit: 44ad141baea50c26646ba6098e0ca2fa70c4c064
    https://github.com/scummvm/scummvm/commit/44ad141baea50c26646ba6098e0ca2fa70c4c064
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-09-09T10:53:11+02:00

Commit Message:
FREESCAPE: added more global objects for dark for amiga

Changed paths:
    engines/freescape/area.cpp
    engines/freescape/area.h
    engines/freescape/games/dark/amiga.cpp
    engines/freescape/loaders/8bitBinaryLoader.cpp


diff --git a/engines/freescape/area.cpp b/engines/freescape/area.cpp
index d3b113cf6e0..c31451defa9 100644
--- a/engines/freescape/area.cpp
+++ b/engines/freescape/area.cpp
@@ -488,4 +488,16 @@ void Area::addStructure(Area *global) {
 	}
 }
 
+void Area::changeObjectID(uint16 objectID, uint16 newObjectID) {
+	assert(!objectWithID(newObjectID));
+	Object *obj = objectWithID(objectID);
+	assert(obj);
+	obj->_objectID = newObjectID;
+	_addedObjects.erase(objectID);
+	_addedObjects[newObjectID] = obj;
+
+	(*_objectsByID).erase(objectID);
+	(*_objectsByID)[newObjectID] = obj;
+}
+
 } // End of namespace Freescape
diff --git a/engines/freescape/area.h b/engines/freescape/area.h
index 519d2152093..227b8432c65 100644
--- a/engines/freescape/area.h
+++ b/engines/freescape/area.h
@@ -45,6 +45,7 @@ public:
 	Common::String _name;
 	Object *objectWithID(uint16 objectID);
 	Object *entranceWithID(uint16 objectID);
+	void changeObjectID(uint16 objectID, uint16 newObjectID);
 	ObjectArray getSensors();
 	uint16 getAreaID();
 	uint16 getAreaFlags();
diff --git a/engines/freescape/games/dark/amiga.cpp b/engines/freescape/games/dark/amiga.cpp
index 51b6f005a9c..0bbb89cc561 100644
--- a/engines/freescape/games/dark/amiga.cpp
+++ b/engines/freescape/games/dark/amiga.cpp
@@ -75,7 +75,15 @@ void DarkEngine::loadAssetsAmigaFullGame() {
 	_border = loadAndConvertNeoImage(stream, 0x1b762);
 	load8bitBinary(stream, 0x2e96a, 16);
 	loadPalettes(stream, 0x2e638);
+	loadGlobalObjects(stream, 0x30f0 - 50, 24);
 	loadMessagesVariableSize(stream, 0x3d37, 66);
+	_areaMap[255]->changeObjectID(11, 250);
+
+	for (auto &it : _areaMap) {
+		addWalls(it._value);
+		addECDs(it._value);
+		addSkanner(it._value);
+	}
 }
 
 void DarkEngine::drawAmigaAtariSTUI(Graphics::Surface *surface) {
diff --git a/engines/freescape/loaders/8bitBinaryLoader.cpp b/engines/freescape/loaders/8bitBinaryLoader.cpp
index ab3b07fc70f..ad3e4c23f75 100644
--- a/engines/freescape/loaders/8bitBinaryLoader.cpp
+++ b/engines/freescape/loaders/8bitBinaryLoader.cpp
@@ -272,6 +272,10 @@ Object *FreescapeEngine::load8bitObject(Common::SeekableReadStream *file) {
 
 	// object ID
 	uint16 objectID = readField(file, 8);
+
+	if (objectID == 224 && objectType == 29)
+		objectType = (ObjectType)7;
+
 	// size of object on disk; we've accounted for 8 bytes
 	// already so we can subtract that to get the remaining
 	// length beyond here
@@ -281,13 +285,13 @@ Object *FreescapeEngine::load8bitObject(Common::SeekableReadStream *file) {
 		error("Not enough bytes %d to read object %d with type %d", byteSizeOfObject, objectID, objectType);
 	}
 
-	if (objectType > ObjectType::kGroupType && isDemo()) {
+	if (objectType > ObjectType::kGroupType && isDemo() && isCastle()) {
 		// Castle DOS demo has an invalid object, which should not be parsed.
 		debugC(1, kFreescapeDebugParser, "WARNING: invalid object %d!", objectID);
 		readArray(file, byteSizeOfObject - 9);
 		return nullptr;
 	}
-
+	assert(objectType <= ObjectType::kGroupType);
 	assert(byteSizeOfObject >= 9);
 	byteSizeOfObject = byteSizeOfObject - 9;
 	if (objectID == 255 && objectType == ObjectType::kEntranceType) {


Commit: 72bdf05d9f45fb269990fa24a7a5e905b54944e3
    https://github.com/scummvm/scummvm/commit/72bdf05d9f45fb269990fa24a7a5e905b54944e3
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-09-09T10:53:11+02:00

Commit Message:
FREESCAPE: improved cga code for dark and driller

Changed paths:
    engines/freescape/freescape.cpp
    engines/freescape/freescape.h
    engines/freescape/games/dark/dark.cpp
    engines/freescape/games/dark/dos.cpp
    engines/freescape/games/driller/dos.cpp
    engines/freescape/games/palettes.cpp


diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index bd080326e10..177436bbc76 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -144,6 +144,7 @@ FreescapeEngine::FreescapeEngine(OSystem *syst, const ADGameDescription *gd)
 	_viewArea = _fullscreenViewArea;
 	_rnd = new Common::RandomSource("freescape");
 	_gfx = nullptr;
+	_rawCGAPaletteByArea = nullptr;
 	_speaker = nullptr;
 	_savedScreen = nullptr;
 
diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index 3664252ec5c..7243947c161 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -68,17 +68,17 @@ enum {
 	kFreescapeDebugMedia = 1 << 4,
 };
 
-struct entrancesTableEntry {
-	int id;
-	int position[3];
-};
-
 struct soundFx {
 	int size;
 	int sampleRate;
 	byte *data;
 };
 
+struct CGAPaletteEntry {
+	int areaId;
+	byte *palette;
+};
+
 class SizedPCSpeaker : public Audio::PCSpeaker {
 public:
 	bool endOfStream() const override { return !isPlaying(); }
@@ -176,6 +176,8 @@ public:
 	Graphics::ManagedSurface *loadAndCenterScrImage(Common::SeekableReadStream *stream);
 	void loadPalettes(Common::SeekableReadStream *file, int offset);
 	void swapPalette(uint16 areaID);
+	virtual byte *findCGAPalette(uint16 levelID);
+	const CGAPaletteEntry *_rawCGAPaletteByArea;
 	Common::HashMap<uint16, byte *> _paletteByArea;
 	void loadColorPalette();
 
diff --git a/engines/freescape/games/dark/dark.cpp b/engines/freescape/games/dark/dark.cpp
index 4a9bf4ef2a2..5863ae28bf3 100644
--- a/engines/freescape/games/dark/dark.cpp
+++ b/engines/freescape/games/dark/dark.cpp
@@ -671,6 +671,8 @@ void DarkEngine::drawBinaryClock(Graphics::Surface *surface, int xPosition, int
 }
 
 void DarkEngine::drawIndicator(Graphics::Surface *surface, int xPosition, int yPosition) {
+	if (_indicators.size() == 0)
+		return;
 	if (_hasFallen)
 		surface->copyRectToSurface(*_indicators[0], xPosition, yPosition, Common::Rect(_indicators[0]->w, _indicators[0]->h));
 	else if (_flyMode)
diff --git a/engines/freescape/games/dark/dos.cpp b/engines/freescape/games/dark/dos.cpp
index 236717a3d00..0a7539cfb14 100644
--- a/engines/freescape/games/dark/dos.cpp
+++ b/engines/freescape/games/dark/dos.cpp
@@ -29,12 +29,63 @@ namespace Freescape {
 
 extern byte kEGADefaultPalette[16][3];
 
+byte kDarkCGAPalettePinkBlue[4][3] = {
+	{0x00, 0x00, 0x00},
+	{0x00, 0xaa, 0xaa},
+	{0xaa, 0x00, 0xaa},
+	{0xaa, 0xaa, 0xaa},
+};
+
+byte kDarkCGAPaletteRedGreen[4][3] = {
+	{0x00, 0x00, 0x00},
+	{0x00, 0xaa, 0x00},
+	{0xaa, 0x00, 0x00},
+	{0xaa, 0x55, 0x00},
+};
+
+static const CGAPaletteEntry rawCGAPaletteByArea[] {
+	{1, (byte *)kDarkCGAPaletteRedGreen},
+	{2, (byte *)kDarkCGAPalettePinkBlue},
+	{3, (byte *)kDarkCGAPaletteRedGreen},
+	{4, (byte *)kDarkCGAPalettePinkBlue},
+	{5, (byte *)kDarkCGAPaletteRedGreen},
+	{6, (byte *)kDarkCGAPalettePinkBlue},
+	{7, (byte *)kDarkCGAPaletteRedGreen},
+	{8, (byte *)kDarkCGAPaletteRedGreen}, // Verified
+	{9, (byte *)kDarkCGAPaletteRedGreen},
+	{10, (byte *)kDarkCGAPalettePinkBlue},
+	{11, (byte *)kDarkCGAPaletteRedGreen},
+	{12, (byte *)kDarkCGAPalettePinkBlue},
+	{13, (byte *)kDarkCGAPaletteRedGreen},
+	{14, (byte *)kDarkCGAPalettePinkBlue},
+	{15, (byte *)kDarkCGAPaletteRedGreen}, // Verified
+	{16, (byte *)kDarkCGAPalettePinkBlue},
+	{17, (byte *)kDarkCGAPalettePinkBlue},
+	{18, (byte *)kDarkCGAPaletteRedGreen}, // Verified
+	{19, (byte *)kDarkCGAPaletteRedGreen},
+	{20, (byte *)kDarkCGAPalettePinkBlue},
+	{21, (byte *)kDarkCGAPaletteRedGreen},
+	{22, (byte *)kDarkCGAPalettePinkBlue},
+	{23, (byte *)kDarkCGAPaletteRedGreen},
+	{25, (byte *)kDarkCGAPalettePinkBlue},
+	{27, (byte *)kDarkCGAPaletteRedGreen},
+	{28, (byte *)kDarkCGAPalettePinkBlue},
+
+	{31, (byte *)kDarkCGAPaletteRedGreen},
+	{32, (byte *)kDarkCGAPalettePinkBlue},
+	{127, (byte *)kDarkCGAPaletteRedGreen},
+	{0, 0}   // This marks the end
+};
+
 void DarkEngine::initDOS() {
 	if (_renderMode == Common::kRenderEGA)
 		_viewArea = Common::Rect(40, 24, 279, 124);
+	else if (_renderMode == Common::kRenderCGA)
+		_viewArea = Common::Rect(40, 24, 279, 124);
 	else
 		error("Invalid or unknown render mode");
 
+	_rawCGAPaletteByArea = (const CGAPaletteEntry *)&rawCGAPaletteByArea;
 	_maxEnergy = 79;
 	_maxShield = 79;
 }
@@ -108,26 +159,46 @@ void DarkEngine::loadAssetsDOSFullGame() {
 			addECDs(it._value);
 			addSkanner(it._value);
 		}
+
+		_indicators.push_back(loadBundledImage("dark_fallen_indicator"));
+		_indicators.push_back(loadBundledImage("dark_crouch_indicator"));
+		_indicators.push_back(loadBundledImage("dark_walk_indicator"));
+		_indicators.push_back(loadBundledImage("dark_jet_indicator"));
+
+		for (auto &it : _indicators)
+			it->convertToInPlace(_gfx->_texturePixelFormat, nullptr);
+
 	} else if (_renderMode == Common::kRenderCGA) {
+		file.open("SCN1C.DAT");
+		if (file.isOpen()) {
+			_title = load8bitBinImage(&file, 0x0);
+			_title->setPalette((byte *)&kDarkCGAPalettePinkBlue, 0, 4);
+		}
+		file.close();
 		file.open("DSIDEC.EXE");
 
 		if (!file.isOpen())
 			error("Failed to open DSIDEC.EXE");
-		load8bitBinary(&file, 0x7bb0, 4); // TODO
-	} else
-		error("Invalid or unsupported render mode %s for Dark Side", Common::getRenderModeDescription(_renderMode));
 
-	_indicators.push_back(loadBundledImage("dark_fallen_indicator"));
-	_indicators.push_back(loadBundledImage("dark_crouch_indicator"));
-	_indicators.push_back(loadBundledImage("dark_walk_indicator"));
-	_indicators.push_back(loadBundledImage("dark_jet_indicator"));
+		loadFonts(&file, 0x8496);
+		loadMessagesFixedSize(&file, 0x2d65, 16, 27);
+		loadGlobalObjects(&file, 0x2554, 23);
+		load8bitBinary(&file, 0x8600, 16);
+		_border = load8bitBinImage(&file, 0x210);
+		_border->setPalette((byte *)&kDarkCGAPalettePinkBlue, 0, 4);
 
-	for (auto &it : _indicators)
-		it->convertToInPlace(_gfx->_texturePixelFormat, nullptr);
+		for (auto &it : _areaMap) {
+			addWalls(it._value);
+			addECDs(it._value);
+			addSkanner(it._value);
+		}
+		swapPalette(1);
+	} else
+		error("Invalid or unsupported render mode %s for Dark Side", Common::getRenderModeDescription(_renderMode));
 }
 
 void DarkEngine::drawDOSUI(Graphics::Surface *surface) {
-	uint32 color = _renderMode == Common::kRenderCGA ? 1 : 14;
+	uint32 color = _renderMode == Common::kRenderCGA ? 3 : 14;
 	uint8 r, g, b;
 
 	_gfx->readFromPalette(color, r, g, b);
@@ -154,7 +225,6 @@ void DarkEngine::drawDOSUI(Graphics::Surface *surface) {
 
 	int seconds, minutes, hours;
 	getTimeFromCountdown(seconds, minutes, hours);
-	// TODO: implement binary clock
 
 	Common::String message;
 	int deadline;
@@ -169,7 +239,7 @@ void DarkEngine::drawDOSUI(Graphics::Surface *surface) {
 	int energy = _gameStateVars[k8bitVariableEnergy]; // called fuel in this game
 	int shield = _gameStateVars[k8bitVariableShield];
 
-	_gfx->readFromPalette(9, r, g, b);
+	_gfx->readFromPalette(_renderMode == Common::kRenderCGA ? 1 : 9, r, g, b);
 	uint32 blue = _gfx->_texturePixelFormat.ARGBToColor(0xFF, r, g, b);
 
 	if (shield >= 0) {
@@ -189,7 +259,7 @@ void DarkEngine::drawDOSUI(Graphics::Surface *surface) {
 		energyBar = Common::Rect(72, 148, 151 - (_maxEnergy - energy), 153);
 		surface->fillRect(energyBar, blue);
 	}
-	uint32 clockColor = _gfx->_texturePixelFormat.ARGBToColor(0xFF, 0xFF, 0xFF, 0xFF);
+	uint32 clockColor = _renderMode == Common::kRenderCGA ? front : _gfx->_texturePixelFormat.ARGBToColor(0xFF, 0xFF, 0xFF, 0xFF);
 	drawBinaryClock(surface, 300, 124, clockColor, back);
 	drawIndicator(surface, 160, 136);
 }
diff --git a/engines/freescape/games/driller/dos.cpp b/engines/freescape/games/driller/dos.cpp
index efd8dd6a470..37960a57e11 100644
--- a/engines/freescape/games/driller/dos.cpp
+++ b/engines/freescape/games/driller/dos.cpp
@@ -29,6 +29,54 @@ namespace Freescape {
 extern byte kCGAPalettePinkBlueWhiteData[4][3];
 extern byte kEGADefaultPalette[16][3];
 
+byte kDrillerCGAPalettePinkBlue[4][3] = {
+	{0x00, 0x00, 0x00},
+	{0x00, 0xaa, 0xaa},
+	{0xaa, 0x00, 0xaa},
+	{0xaa, 0xaa, 0xaa},
+};
+
+byte kDrillerCGAPaletteRedGreen[4][3] = {
+	{0x00, 0x00, 0x00},
+	{0x00, 0xaa, 0x00},
+	{0xaa, 0x00, 0x00},
+	{0xaa, 0x55, 0x00},
+};
+
+static const CGAPaletteEntry rawCGAPaletteByArea[] {
+	{1, (byte *)kDrillerCGAPaletteRedGreen},
+	{2, (byte *)kDrillerCGAPalettePinkBlue},
+	{3, (byte *)kDrillerCGAPaletteRedGreen},
+	{4, (byte *)kDrillerCGAPalettePinkBlue},
+	{5, (byte *)kDrillerCGAPaletteRedGreen},
+	{6, (byte *)kDrillerCGAPalettePinkBlue},
+	{7, (byte *)kDrillerCGAPaletteRedGreen},
+	{8, (byte *)kDrillerCGAPalettePinkBlue},
+	{9, (byte *)kDrillerCGAPaletteRedGreen},
+	{10, (byte *)kDrillerCGAPalettePinkBlue},
+	{11, (byte *)kDrillerCGAPaletteRedGreen},
+	{12, (byte *)kDrillerCGAPalettePinkBlue},
+	{13, (byte *)kDrillerCGAPaletteRedGreen},
+	{14, (byte *)kDrillerCGAPalettePinkBlue},
+	{15, (byte *)kDrillerCGAPaletteRedGreen},
+	{16, (byte *)kDrillerCGAPalettePinkBlue},
+	{17, (byte *)kDrillerCGAPalettePinkBlue},
+	{18, (byte *)kDrillerCGAPalettePinkBlue},
+	{19, (byte *)kDrillerCGAPaletteRedGreen},
+	{20, (byte *)kDrillerCGAPalettePinkBlue},
+	{21, (byte *)kDrillerCGAPaletteRedGreen},
+	{22, (byte *)kDrillerCGAPalettePinkBlue},
+	{23, (byte *)kDrillerCGAPaletteRedGreen},
+	{25, (byte *)kDrillerCGAPalettePinkBlue},
+	{27, (byte *)kDrillerCGAPaletteRedGreen},
+	{28, (byte *)kDrillerCGAPalettePinkBlue},
+
+	{31, (byte *)kDrillerCGAPaletteRedGreen},
+	{32, (byte *)kDrillerCGAPalettePinkBlue},
+	{127, (byte *)kDrillerCGAPaletteRedGreen},
+	{0, 0}   // This marks the end
+};
+
 void DrillerEngine::initDOS() {
 	if (_renderMode == Common::kRenderEGA)
 		_viewArea = Common::Rect(40, 16, 280, 117);
@@ -37,6 +85,7 @@ void DrillerEngine::initDOS() {
 	else
 		error("Invalid or unknown render mode");
 
+	_rawCGAPaletteByArea = (const CGAPaletteEntry *)&rawCGAPaletteByArea;
 	_moveFowardArea = Common::Rect(73, 144, 101, 152);
 	_moveLeftArea = Common::Rect(73, 150, 86, 159);
 	_moveRightArea = Common::Rect(88, 152, 104, 160);
diff --git a/engines/freescape/games/palettes.cpp b/engines/freescape/games/palettes.cpp
index 4e39c9f89b9..5bd981108cb 100644
--- a/engines/freescape/games/palettes.cpp
+++ b/engines/freescape/games/palettes.cpp
@@ -162,62 +162,6 @@ void FreescapeEngine::loadPalettes(Common::SeekableReadStream *file, int offset)
 	}
 }
 
-enum {
-	kDrillerCGAPalettePinkBlue = 0,
-	kDrillerCGAPaletteRedGreen = 1,
-};
-
-static const struct CGAPalettteEntry {
-	int areaId;
-	int palette;
-} rawCGAPaletteTable[] {
-	{1, kDrillerCGAPaletteRedGreen},
-	{2, kDrillerCGAPalettePinkBlue},
-	{3, kDrillerCGAPaletteRedGreen},
-	{4, kDrillerCGAPalettePinkBlue},
-	{5, kDrillerCGAPaletteRedGreen},
-	{6, kDrillerCGAPalettePinkBlue},
-	{7, kDrillerCGAPaletteRedGreen},
-	{8, kDrillerCGAPalettePinkBlue},
-	{9, kDrillerCGAPaletteRedGreen},
-	{10, kDrillerCGAPalettePinkBlue},
-	{11, kDrillerCGAPaletteRedGreen},
-	{12, kDrillerCGAPalettePinkBlue},
-	{13, kDrillerCGAPaletteRedGreen},
-	{14, kDrillerCGAPalettePinkBlue},
-	{15, kDrillerCGAPaletteRedGreen},
-	{16, kDrillerCGAPalettePinkBlue},
-	{17, kDrillerCGAPalettePinkBlue},
-	{18, kDrillerCGAPalettePinkBlue},
-	{19, kDrillerCGAPaletteRedGreen},
-	{20, kDrillerCGAPalettePinkBlue},
-	{21, kDrillerCGAPaletteRedGreen},
-	{22, kDrillerCGAPalettePinkBlue},
-	{23, kDrillerCGAPaletteRedGreen},
-	{25, kDrillerCGAPalettePinkBlue},
-	{27, kDrillerCGAPaletteRedGreen},
-	{28, kDrillerCGAPalettePinkBlue},
-
-	{31, kDrillerCGAPaletteRedGreen},
-	{32, kDrillerCGAPalettePinkBlue},
-	{127, kDrillerCGAPaletteRedGreen},
-	{0, 0}   // This marks the end
-};
-
-byte kDrillerCGAPalettePinkBlueData[4][3] = {
-	{0x00, 0x00, 0x00},
-	{0x00, 0xaa, 0xaa},
-	{0xaa, 0x00, 0xaa},
-	{0xaa, 0xaa, 0xaa},
-};
-
-byte kDrillerCGAPaletteRedGreenData[4][3] = {
-	{0x00, 0x00, 0x00},
-	{0x00, 0xaa, 0x00},
-	{0xaa, 0x00, 0x00},
-	{0xaa, 0x55, 0x00},
-};
-
 void FreescapeEngine::swapPalette(uint16 levelID) {
 	if (isAmiga() || isAtariST()) {
 		// The following palette was not available in the demo, so we select another one
@@ -245,21 +189,7 @@ void FreescapeEngine::swapPalette(uint16 levelID) {
 		free(palette);
 		processBorder();
 	} else if (isDOS() && _renderMode == Common::kRenderCGA) {
-		const CGAPalettteEntry *entry = rawCGAPaletteTable;
-		while (entry->areaId) {
-			if (entry->areaId == levelID) {
-				if (entry->palette == kDrillerCGAPaletteRedGreen) {
-					_gfx->_palette = (byte *)kDrillerCGAPaletteRedGreenData;
-				} else if (entry->palette == kDrillerCGAPalettePinkBlue) {
-					_gfx->_palette = (byte *)kDrillerCGAPalettePinkBlueData;
-				} else
-					error("Invalid CGA palette to use");
-				break;
-			}
-			entry++;
-		}
-
-		assert(entry->areaId == levelID);
+		_gfx->_palette = findCGAPalette(levelID);
 		if (!_border)
 			return;
 		_border->setPalette(_gfx->_palette, 0, 4);
@@ -274,4 +204,18 @@ void FreescapeEngine::swapPalette(uint16 levelID) {
 
 }
 
+byte *FreescapeEngine::findCGAPalette(uint16 levelID) {
+	const CGAPaletteEntry *entry = _rawCGAPaletteByArea;
+	byte *palette = nullptr;
+	while (entry->areaId) {
+		if (entry->areaId == levelID) {
+			palette = entry->palette;
+			break;
+		}
+		entry++;
+	}
+
+	return palette;
+}
+
 } // End of namespace Freescape


Commit: 42833df30b393ba233f38587ea0104a1a3a42aa4
    https://github.com/scummvm/scummvm/commit/42833df30b393ba233f38587ea0104a1a3a42aa4
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-09-09T10:53:11+02:00

Commit Message:
FREESCAPE: glPolygonOffset depends on the area scale

Changed paths:
    engines/freescape/gfx.cpp
    engines/freescape/gfx.h
    engines/freescape/gfx_opengl.cpp
    engines/freescape/movement.cpp


diff --git a/engines/freescape/gfx.cpp b/engines/freescape/gfx.cpp
index db0dc6dda5c..df2f16c427b 100644
--- a/engines/freescape/gfx.cpp
+++ b/engines/freescape/gfx.cpp
@@ -55,6 +55,8 @@ Renderer::Renderer(int screenW, int screenH, Common::RenderMode renderMode) {
 		}
 		_colorPair[i] = 0;
 	}
+
+	_scale = 1;
 }
 
 Renderer::~Renderer() {}
diff --git a/engines/freescape/gfx.h b/engines/freescape/gfx.h
index 1a190222117..423d126c61e 100644
--- a/engines/freescape/gfx.h
+++ b/engines/freescape/gfx.h
@@ -132,6 +132,8 @@ public:
 	int _underFireBackgroundColor;
 	byte _stipples[16][128];
 
+	int _scale;
+
 	/**
 	 * Select the window where to render
 	 *
diff --git a/engines/freescape/gfx_opengl.cpp b/engines/freescape/gfx_opengl.cpp
index f6eafa711bc..43aa17347cf 100644
--- a/engines/freescape/gfx_opengl.cpp
+++ b/engines/freescape/gfx_opengl.cpp
@@ -316,7 +316,7 @@ void OpenGLRenderer::renderFace(const Common::Array<Math::Vector3d> &vertices) {
 void OpenGLRenderer::polygonOffset(bool enabled) {
 	if (enabled) {
 		glEnable(GL_POLYGON_OFFSET_FILL);
-		glPolygonOffset(-10.0f, 1.0f);
+		glPolygonOffset(-40.0f / MIN(4, _scale), 1.0f);
 	} else {
 		glPolygonOffset(0, 0);
 		glDisable(GL_POLYGON_OFFSET_FILL);
diff --git a/engines/freescape/movement.cpp b/engines/freescape/movement.cpp
index 265643f12fe..5f3ff7bab6e 100644
--- a/engines/freescape/movement.cpp
+++ b/engines/freescape/movement.cpp
@@ -128,6 +128,9 @@ void FreescapeEngine::traverseEntrance(uint16 entranceID) {
 	}
 
 	_pitch = rotation.x();
+	// This is a workaround to avoid the camera looking at direct angles,
+	// polygons tends to disappear where the colinear
+	_pitch++;
 	if (rotation.y() > 0 && rotation.y() <= 45)
 		_yaw = rotation.y();
 	else if (rotation.y() <= 0 || (rotation.y() >= 180 && rotation.y() < 270))
@@ -151,6 +154,7 @@ void FreescapeEngine::traverseEntrance(uint16 entranceID) {
 	_position.setValue(1, _position.y() + _playerHeight);
 
 	_sensors = _currentArea->getSensors();
+	_gfx->_scale = _currentArea->_scale;
 }
 
 void FreescapeEngine::activate() {


Commit: 6953dd9204953269b071be77dbc512421dab030a
    https://github.com/scummvm/scummvm/commit/6953dd9204953269b071be77dbc512421dab030a
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-09-09T10:53:11+02:00

Commit Message:
FREESCAPE: avoid waiting for users to press a key when starting driller demos

Changed paths:
    engines/freescape/ui.cpp


diff --git a/engines/freescape/ui.cpp b/engines/freescape/ui.cpp
index 96628138dc6..ef63131db21 100644
--- a/engines/freescape/ui.cpp
+++ b/engines/freescape/ui.cpp
@@ -113,9 +113,12 @@ void FreescapeEngine::borderScreen() {
 		return;
 
 	if (isDriller()) {
+		if (isAmiga() || isAtariST())
+			return; // TODO: add animation
+
 		drawBorderScreenAndWait(nullptr);
 
-		if (isAmiga() || isAtariST() || isDemo())
+		if (isDemo())
 			return;
 	}
 




More information about the Scummvm-git-logs mailing list