[Scummvm-git-logs] scummvm master -> 60a40ed6f499c91657f3e22f278ed3feca556564

neuromancer noreply at scummvm.org
Mon Feb 6 11:45:35 UTC 2023


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:
60a40ed6f4 FREESCAPE: implemented fullscreen messages in dark dos demo


Commit: 60a40ed6f499c91657f3e22f278ed3feca556564
    https://github.com/scummvm/scummvm/commit/60a40ed6f499c91657f3e22f278ed3feca556564
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-02-06T12:42:54+01:00

Commit Message:
FREESCAPE: implemented fullscreen messages in dark dos demo

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


diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index a7ec3096b61..2388a153ddc 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -263,7 +263,7 @@ public:
 	bool executeEndIfBitNotEqual(FCLInstruction &instruction);
 	bool executeEndIfVisibilityIsEqual(FCLInstruction &instruction);
 	void executeSwapJet(FCLInstruction &instruction);
-	void executePrint(FCLInstruction &instruction);
+	virtual void executePrint(FCLInstruction &instruction);
 	void executeSPFX(FCLInstruction &instruction);
 
 	// Sound
@@ -448,10 +448,12 @@ public:
 
 	void loadAssets() override;
 	void initGameState() override;
+	void borderScreen() override;
 
 	void gotoArea(uint16 areaID, int entranceID) override;
 	void checkIfStillInArea() override;
 	void pressedKey(const int keycode) override;
+	void executePrint(FCLInstruction &instruction) override;
 
 	void loadAssetsDemo();
 	void loadAssetsFullGame();
@@ -461,6 +463,7 @@ public:
 
 	void drawUI() override;
 	void drawDOSUI(Graphics::Surface *surface);
+	void drawFullscreenMessage(Common::String message);
 	Common::Error saveGameStreamExtended(Common::WriteStream *stream, bool isAutosave = false) override;
 	Common::Error loadGameStreamExtended(Common::SeekableReadStream *stream) override;
 };
diff --git a/engines/freescape/games/dark.cpp b/engines/freescape/games/dark.cpp
index 60e1b86bfd0..5b200097680 100644
--- a/engines/freescape/games/dark.cpp
+++ b/engines/freescape/games/dark.cpp
@@ -65,6 +65,7 @@ void DarkEngine::loadAssetsDemo() {
 		if (!file.isOpen())
 			error("Failed to open DSIDEE.EXE");
 		loadMessagesFixedSize(&file, 0x4525, 16, 27);
+		loadMessagesFixedSize(&file, 0x9959, 307, 5);
 		loadFonts(&file, 0xa598);
 		load8bitBinary(&file, 0xa700, 16);
 	} else if (isDOS() && _renderMode == Common::kRenderCGA) {
@@ -135,6 +136,13 @@ void DarkEngine::gotoArea(uint16 areaID, int entranceID) {
 	if (!_gameStateBits.contains(areaID))
 		_gameStateBits[areaID] = 0;
 
+	if (isDemo()) {
+		if (!_areaMap.contains(areaID)) {
+			drawFullscreenMessage(_messagesList[30]);
+			return;
+		}
+	}
+
 	assert(_areaMap.contains(areaID));
 	_currentArea = _areaMap[areaID];
 	_currentArea->show();
@@ -336,6 +344,110 @@ void DarkEngine::drawUI() {
 	delete surface;
 }
 
+void DarkEngine::borderScreen() {
+	if (_border) {
+		drawBorder();
+		if (isDemo()) {
+			drawFullscreenMessage(_messagesList[27]);
+			drawFullscreenMessage(_messagesList[28]);
+			drawFullscreenMessage(_messagesList[29]);
+		} else {
+			_gfx->flipBuffer();
+			g_system->updateScreen();
+			g_system->delayMillis(3000);
+		}
+	}
+}
+
+void DarkEngine::executePrint(FCLInstruction &instruction) {
+	uint16 index = instruction._source - 1;
+	debugC(1, kFreescapeDebugCode, "Printing message %d", index);
+	_currentAreaMessages.clear();
+	if (index > 127) {
+		index = _messagesList.size() - (index - 254) - 2;
+		drawFullscreenMessage(_messagesList[index]);
+		return;
+	}
+	_currentAreaMessages.push_back(_messagesList[index]);
+}
+
+void DarkEngine::drawFullscreenMessage(Common::String message) {
+	_savedScreen = _gfx->getScreenshot();
+
+	uint32 color = _gfx->_texturePixelFormat.ARGBToColor(0x00, 0x00, 0x00, 0x00);
+	Graphics::Surface *surface = new Graphics::Surface();
+	surface->create(_screenW, _screenH, _gfx->_texturePixelFormat);
+	surface->fillRect(_fullscreenViewArea, color);
+
+	uint32 black = _gfx->_texturePixelFormat.ARGBToColor(0xFF, 0x00, 0x00, 0x00);
+	surface->fillRect(_viewArea, black);
+
+	switch (_renderMode) {
+		case Common::kRenderCGA:
+			color = 1;
+			break;
+		case Common::kRenderZX:
+			color = 6;
+			break;
+		default:
+			color = 14;
+	}
+	uint8 r, g, b;
+	_gfx->readFromPalette(color, r, g, b);
+	uint32 front = _gfx->_texturePixelFormat.ARGBToColor(0xFF, r, g, b);
+
+	int x, y;
+	x = 42;
+	y = 30;
+	for (int i = 0; i < 8; i++) {
+		Common::String line = message.substr(28 * i, 28);
+		debug("'%s' %d", line.c_str(), line.size());
+		drawStringInSurface(line, x, y, front, black, surface);
+		y = y + 12;
+	}
+
+	if (!_uiTexture)
+		_uiTexture = _gfx->createTexture(surface);
+	else
+		_uiTexture->update(surface);
+
+	_gfx->setViewport(_fullscreenViewArea);
+	_gfx->drawTexturedRect2D(_fullscreenViewArea, _fullscreenViewArea, _uiTexture);
+	_gfx->setViewport(_viewArea);
+
+	_gfx->flipBuffer();
+	g_system->updateScreen();
+
+	Common::Event event;
+	bool cont = true;
+	while (!shouldQuit() && cont) {
+		while (g_system->getEventManager()->pollEvent(event)) {
+
+			// Events
+			switch (event.type) {
+			case Common::EVENT_KEYDOWN:
+				if (event.kbd.keycode == Common::KEYCODE_SPACE) {
+					cont = false;
+				}
+				break;
+			case Common::EVENT_SCREEN_CHANGED:
+				_gfx->computeScreenViewport();
+				// TODO: properly refresh screen
+				break;
+
+			default:
+				break;
+			}
+		}
+		g_system->delayMillis(10);
+	}
+
+	_savedScreen->free();
+	delete _savedScreen;
+	surface->free();
+	delete surface;
+}
+
 Common::Error DarkEngine::saveGameStreamExtended(Common::WriteStream *stream, bool isAutosave) {
 	return Common::kNoError;
 }
diff --git a/engines/freescape/loaders/8bitBinaryLoader.cpp b/engines/freescape/loaders/8bitBinaryLoader.cpp
index b0b2edefc0c..1e5a7f48126 100644
--- a/engines/freescape/loaders/8bitBinaryLoader.cpp
+++ b/engines/freescape/loaders/8bitBinaryLoader.cpp
@@ -659,7 +659,7 @@ void FreescapeEngine::loadMessagesFixedSize(Common::SeekableReadStream *file, in
 		file->read(buffer, size);
 		Common::String message = (const char *)buffer;
 		_messagesList.push_back(message);
-		debugC(1, kFreescapeDebugParser, "%s", _messagesList[i].c_str());
+		debugC(1, kFreescapeDebugParser, "%s", _messagesList[_messagesList.size() - 1].c_str());
 	}
 	free(buffer);
 }




More information about the Scummvm-git-logs mailing list