[Scummvm-git-logs] scummvm master -> 4cfe310ce6b27fd4a981a6b7c74bf489963b6a9f

neuromancer noreply at scummvm.org
Sun Jan 15 19:48:23 UTC 2023


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

Summary:
f75bcb2a60 FREESCAPE: refactored code that shows title and border screen in driller
4cfe310ce6 FREESCAPE: added deofuscation code for certain driller releases


Commit: f75bcb2a605943dfcbded1832fd5f46c83ee69b2
    https://github.com/scummvm/scummvm/commit/f75bcb2a605943dfcbded1832fd5f46c83ee69b2
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-01-15T16:46:12-03:00

Commit Message:
FREESCAPE: refactored code that shows title and border screen in driller

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


diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index 80054524438..bdb66beaf95 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -510,26 +510,11 @@ Common::Error FreescapeEngine::run() {
 	// Simple main event loop
 	int saveSlot = ConfMan.getInt("save_slot");
 	centerCrossair();
-
-	if (_title && \
-	  !(isDemo() && isDOS() && isDriller())) { // This should be moved to a Driller specific code
-		if (saveSlot == -1) {
-			drawTitle();
-			_gfx->flipBuffer();
-			g_system->updateScreen();
-			g_system->delayMillis(3000);
-		}
-	}
-
+	if (saveSlot == -1)
+		titleScreen();
 	loadBorder(); // Border is load unmodified
-	if (_border && ((isDOS() && !isDemo()) || isSpectrum())) { // This should be moved to a Driller specific code
-		if (saveSlot == -1) {
-			drawBorder();
-			_gfx->flipBuffer();
-			g_system->updateScreen();
-			g_system->delayMillis(3000);
-		}
-	}
+	if (saveSlot == -1)
+		borderScreen();
 	processBorder(); // Border is processed to use during the game
 
 	if (saveSlot >= 0) { // load the savegame
@@ -571,6 +556,9 @@ Common::Error FreescapeEngine::run() {
 	return Common::kNoError;
 }
 
+void FreescapeEngine::titleScreen() {}
+void FreescapeEngine::borderScreen() {}
+
 void FreescapeEngine::loadBorder() {
 	if (_border)
 		_borderTexture = _gfx->createTexture(_border);
diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index db3226b9327..522e7d205da 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -107,6 +107,9 @@ public:
 	Common::Rect _fullscreenViewArea;
 	void centerCrossair();
 
+	virtual void borderScreen();
+	virtual void titleScreen();
+
 	virtual void loadBorder();
 	virtual void processBorder();
 	void drawBorder();
@@ -377,6 +380,9 @@ public:
 
 	void gotoArea(uint16 areaID, int entranceID) override;
 
+	void borderScreen() override;
+	void titleScreen() 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 2214ec3f522..b1299a4ce06 100644
--- a/engines/freescape/games/driller.cpp
+++ b/engines/freescape/games/driller.cpp
@@ -144,6 +144,34 @@ DrillerEngine::~DrillerEngine() {
 	delete _drillBase;
 }
 
+void DrillerEngine::titleScreen() {
+	if (isDOS() && isDemo()) // Demo will not show any title screen
+		return;
+
+	if (isAmiga() || isAtariST()) // These releases has their own screens
+		return;
+
+	if (_title) {
+		drawTitle();
+		_gfx->flipBuffer();
+		g_system->updateScreen();
+		g_system->delayMillis(3000);
+	}
+}
+void DrillerEngine::borderScreen() {
+	if (isDOS() && isDemo()) // Demo will not show the border
+		return;
+
+	if (isAmiga() || isAtariST()) // These releases has their own screens
+		return;
+
+	if (_border) {
+		drawBorder();
+		_gfx->flipBuffer();
+		g_system->updateScreen();
+		g_system->delayMillis(3000);
+	}
+}
 
 void DrillerEngine::gotoArea(uint16 areaID, int entranceID) {
 	int prevAreaID = _currentArea ? _currentArea->getAreaID(): -1;


Commit: 4cfe310ce6b27fd4a981a6b7c74bf489963b6a9f
    https://github.com/scummvm/scummvm/commit/4cfe310ce6b27fd4a981a6b7c74bf489963b6a9f
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-01-15T16:46:12-03:00

Commit Message:
FREESCAPE: added deofuscation code for certain driller releases

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


diff --git a/engines/freescape/games/driller.cpp b/engines/freescape/games/driller.cpp
index b1299a4ce06..f35a7fa9378 100644
--- a/engines/freescape/games/driller.cpp
+++ b/engines/freescape/games/driller.cpp
@@ -395,28 +395,33 @@ void DrillerEngine::loadAssetsDemo() {
 }
 
 
-Common::SeekableReadStream *parseEDSK(const Common::String filename) {
+byte *parseEDSK(const Common::String filename, int &size) {
 	debugC(1, kFreescapeDebugParser, "Trying to parse edsk file: %s", filename.c_str());
 	Common::File file;
 	file.open(filename);
 	if (!file.isOpen())
 		error("Failed to open %s", filename.c_str());
 
-	int size = file.size();
-	byte *edskBuffer = (byte *)malloc(size);
-	file.read(edskBuffer, size);
+	int totalSize = file.size();
+	byte *edskBuffer = (byte *)malloc(totalSize);
+	file.read(edskBuffer, totalSize);
 	file.close();
 
 	// We don't know the final size, but we allocate enough
-	byte *memBuffer = (byte *)malloc(size); 
+	byte *memBuffer = (byte *)malloc(totalSize);
 
 	byte nsides = edskBuffer[49];
 	assert(nsides == 1);
 	int ntracks = 0;
 	int i = 256;
 	int j = 0;
-	while (i + 1 < size) {
+	while (i + 1 < totalSize) {
 		byte ssize = edskBuffer[i + 0x14];
+		debug("i: %x ssize: %d, number: %d", i, ssize, edskBuffer[i + 0x10]);
+		assert(ssize == 3 || edskBuffer[i + 0x0] == 'T');
+		assert(ssize == 3 || edskBuffer[i + 0x1] == 'r');
+		assert(ssize == 3 || edskBuffer[i + 0x2] == 'a');
+		//assert(ssize == 3 || ntracks == edskBuffer[i + 0x10]);
 		int start = i + 0x100;
 		debugC(1, kFreescapeDebugParser, "sector size: %d", ssize);
 		if (ssize == 2) {
@@ -424,18 +429,19 @@ Common::SeekableReadStream *parseEDSK(const Common::String filename) {
 		} else if (ssize == 5) {
 			i = i + 8 * 512 + 256;
 		} else if (ssize == 0) {
-			i = size - 1;
+			i = totalSize - 1;
 		} else if (ssize == 3) {
 			break; // Not sure
 		} else {
 			error("ssize: %d", ssize);
 		}
 		int osize = i - start;
-		debugC(1, kFreescapeDebugParser, "copying track %d start: %x size: %x", ntracks, start, osize);
+		debugC(1, kFreescapeDebugParser, "copying track %d start: %x size: %x, dest: %x", ntracks, start, osize, j);
 		memcpy(memBuffer + j, edskBuffer + start, osize);
 		j = j + osize;
 		ntracks++;
 	}
+	size = j;
 
 	if (0) { // Useful to debug where exactly each object is located in memory once it is parsed
 		i = 0;
@@ -448,9 +454,8 @@ Common::SeekableReadStream *parseEDSK(const Common::String filename) {
 			debugN("\n");
 		}
 	}
-
 	free(edskBuffer);
-	return (new Common::MemoryReadStream(memBuffer, size));
+	return memBuffer;
 }
 
 
@@ -557,11 +562,45 @@ void DrillerEngine::loadAssetsFullGame() {
 			error("Unknown ZX spectrum variant");
 	} else if (isCPC()) {
 		loadBundledImages();
-		Common::SeekableReadStream *stream;
-		if (_variant & GF_CPC_VIRTUALWORLDS)
-			stream = parseEDSK("virtualworlds.A.cpc.edsk");
-		else
-			stream = parseEDSK("driller.cpc.edsk");
+		byte *memBuffer;
+		int memSize = 0;
+		if (_variant & GF_CPC_VIRTUALWORLDS) {
+			memBuffer = parseEDSK("virtualworlds.A.cpc.edsk", memSize);
+
+			// Deofuscation / loader code
+			for (int j = 0; j < 0x200; j++) {
+				memBuffer[0x14000 + j] = memBuffer[0x14200 + j];
+				memBuffer[0x14200 + j] = memBuffer[0x13400 + j];
+				memBuffer[0x14400 + j] = memBuffer[0x13800 + j];
+				memBuffer[0x14600 + j] = memBuffer[0x13c00 + j];
+			}
+
+			for (int j = 0; j < 0x200; j++) {
+				memBuffer[0x13c00 + j] = memBuffer[0x13a00 + j];
+				memBuffer[0x13a00 + j] = memBuffer[0x13600 + j];
+				memBuffer[0x13800 + j] = memBuffer[0x13200 + j];
+				memBuffer[0x13600 + j] = memBuffer[0x12e00 + j];
+				memBuffer[0x12e00 + j] = memBuffer[0x13000 + j];
+				memBuffer[0x13000 + j] = memBuffer[0x12200 + j];
+				memBuffer[0x13200 + j] = memBuffer[0x12600 + j];
+				memBuffer[0x13400 + j] = memBuffer[0x12a00 + j];
+			}
+
+			for (int i = 6; i >= 0; i--) {
+				//debug("copying 0x200 bytes to %x from %x", 0x12000 + 0x200*i, 0x11400 + 0x400*i);
+				for (int j = 0; j < 0x200; j++) {
+					memBuffer[0x12000 + 0x200*i + j] = memBuffer[0x11400 + 0x400*i + j];
+				}
+			}
+
+			for (int j = 0; j < 0x200; j++) {
+				memBuffer[0x11c00 + j] = memBuffer[0x11e00 + j];
+				memBuffer[0x11e00 + j] = memBuffer[0x11000 + j];
+			}
+		} else
+			memBuffer = parseEDSK("driller.cpc.edsk", memSize);
+		assert(memSize > 0);
+		Common::SeekableReadStream *stream = new Common::MemoryReadStream((const byte*)memBuffer, memSize);
 
 		if (_variant & GF_CPC_RETAIL) {
 			loadMessagesFixedSize(stream, 0xb0f7, 14, 20);
@@ -574,7 +613,7 @@ void DrillerEngine::loadAssetsFullGame() {
 			load8bitBinary(stream, 0xaccb, 4);
 			loadGlobalObjects(stream, 0xacb2 - 0x3fab);
 		} else if (_variant & _variant & GF_CPC_VIRTUALWORLDS) {
-			error("Not implemented yet");
+			load8bitBinary(stream, 0x11acb, 4);
 		} else if (_variant & GF_CPC_BUDGET) {
 			loadMessagesFixedSize(stream, 0x9ef7, 14, 20);
 			loadFonts(stream, 0xd914);
@@ -843,7 +882,7 @@ void DrillerEngine::drawCPCUI(Graphics::Surface *surface) {
 		drawStringInSurface(message, 191, 180, back, front, surface);
 		_temporaryMessages.push_back(message);
 		_temporaryMessageDeadlines.push_back(deadline);
-	} else {
+	} else if (_messagesList.size() > 0) {
 		if (_currentArea->_gasPocketRadius == 0)
 			message = _messagesList[2];
 		else if (_drillStatusByArea[_currentArea->getAreaID()])




More information about the Scummvm-git-logs mailing list