[Scummvm-git-logs] scummvm master -> bfaab8f4ed4dd2e24a34efcb0d9e51212c9a1e2e

neuromancer noreply at scummvm.org
Wed Nov 9 11:24:05 UTC 2022


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:
6bf3a5b6d9 FREESCAPE: correctly handle temporary messages using a queue in driller
bfaab8f4ed FREESCAPE: refactor DOS and Amiga/AtariST ui code in driller


Commit: 6bf3a5b6d91fad97d372e4dee27472c2bd9f2d7b
    https://github.com/scummvm/scummvm/commit/6bf3a5b6d91fad97d372e4dee27472c2bd9f2d7b
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-11-09T12:24:53+01:00

Commit Message:
FREESCAPE: correctly handle temporary messages using a queue 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 6c719049263..9864cf2285d 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -632,6 +632,22 @@ void FreescapeEngine::loadDataBundle() {
 	}
 }
 
+void FreescapeEngine::insertTemporaryMessage(const Common::String message, int deadline) {
+	_temporaryMessages.insert_at(0, message);
+	_temporaryMessageDeadlines.insert_at(0, deadline);
+}
+
+void FreescapeEngine::getLatestMessages(Common::String &message, int &deadline) {
+	deadline = _countdown + 1;
+	message.clear();
+	while (!_temporaryMessages.empty() && deadline > _countdown) {
+		message = _temporaryMessages.back();
+		deadline = _temporaryMessageDeadlines.back();
+		_temporaryMessages.pop_back();
+		_temporaryMessageDeadlines.pop_back();
+	}
+}
+
 byte *FreescapeEngine::getPaletteFromNeoImage(Common::SeekableReadStream *stream, int offset) {
 	stream->seek(offset);
 	NeoDecoder decoder;
diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index d444242b449..37773cb6ad7 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -261,7 +261,12 @@ public:
 	float _farClipPlane;
 
 	// Text messages and Fonts
+	void insertTemporaryMessage(const Common::String message, int deadline);
+	void getLatestMessages(Common::String &message, int &deadline);
+	Common::StringArray _temporaryMessages;
+	Common::Array<int> _temporaryMessageDeadlines;
 	Common::StringArray _messagesList;
+
 	void loadMessagesFixedSize(Common::SeekableReadStream *file, int offset, int size, int number);
 	void loadMessagesVariableSize(Common::SeekableReadStream *file, int offset, int number);
 
diff --git a/engines/freescape/games/driller.cpp b/engines/freescape/games/driller.cpp
index 3fc26b35d74..4171a005404 100644
--- a/engines/freescape/games/driller.cpp
+++ b/engines/freescape/games/driller.cpp
@@ -57,16 +57,6 @@ void DrillerEngine::gotoArea(uint16 areaID, int entranceID) {
 	_currentArea = _areaMap[areaID];
 	_currentArea->show();
 
-	_currentAreaMessages.clear();
-	if (_messagesList.size() > 2) {
-		if (_currentArea->_gasPocketRadius > 0)
-			_currentAreaMessages.push_back(_messagesList[1]);
-		else
-			_currentAreaMessages.push_back(_messagesList[2]);
-
-		_currentAreaMessages.push_back(_currentArea->_name);
-	}
-
 	if (entranceID > 0 || areaID == 127) {
 		traverseEntrance(entranceID);
 	} else if (entranceID == 0) {
@@ -347,22 +337,30 @@ void DrillerEngine::drawUI() {
 	} else
 		return;
 
-	if (_currentAreaMessages.size() == 2) {
-		int score = _gameStateVars[k8bitVariableScore];
-		drawStringInSurface(_currentAreaMessages[0], 196, 177, yellow, black, surface);
-		drawStringInSurface(_currentAreaMessages[1], 196, 185, yellow, black, surface);
-		drawStringInSurface(Common::String::format("%04d", 2 * int(_position.x())), 150, 145, yellow, black, surface);
-		drawStringInSurface(Common::String::format("%04d", 2 * int(_position.z())), 150, 153, yellow, black, surface);
-		drawStringInSurface(Common::String::format("%04d", 2 * int(_position.y())), 150, 161, yellow, black, surface);
-		drawStringInSurface(Common::String::format("%d", _playerHeightNumber), 57, 161, yellow, black, surface);
-		drawStringInSurface(Common::String::format("%07d", score), 240, 129, yellow, black, surface);
-
-		int hours = _countdown / 3600;
-		drawStringInSurface(Common::String::format("%02d", hours), 208, 8, yellow, black, surface);
-		int minutes = (_countdown - hours * 3600) / 60;
-		drawStringInSurface(Common::String::format("%02d", minutes), 230, 8, yellow, black, surface);
-		int seconds = _countdown - hours * 3600 - minutes * 60;
-		drawStringInSurface(Common::String::format("%02d", seconds), 254, 8, yellow, black, surface);
+	int score = _gameStateVars[k8bitVariableScore];
+	drawStringInSurface(_currentArea->_name, 195, 177, yellow, black, surface);
+	drawStringInSurface(Common::String::format("%04d", 2 * int(_position.x())), 150, 145, yellow, black, surface);
+	drawStringInSurface(Common::String::format("%04d", 2 * int(_position.z())), 150, 153, yellow, black, surface);
+	drawStringInSurface(Common::String::format("%04d", 2 * int(_position.y())), 150, 161, yellow, black, surface);
+	drawStringInSurface(Common::String::format("%d", _playerHeightNumber), 57, 161, yellow, black, surface);
+	drawStringInSurface(Common::String::format("%07d", score), 240, 129, yellow, black, surface);
+
+	int hours = _countdown / 3600;
+	drawStringInSurface(Common::String::format("%02d", hours), 208, 8, yellow, black, surface);
+	int minutes = (_countdown - hours * 3600) / 60;
+	drawStringInSurface(Common::String::format("%02d", minutes), 230, 8, yellow, black, surface);
+	int seconds = _countdown - hours * 3600 - minutes * 60;
+	drawStringInSurface(Common::String::format("%02d", seconds), 254, 8, yellow, black, surface);
+
+	Common::String temporaryMessage;
+	int temporaryMessageDeadline;
+	getLatestMessages(temporaryMessage, temporaryMessageDeadline);
+	if (temporaryMessageDeadline <= _countdown) {
+		drawStringInSurface(temporaryMessage, 191, 177, black, yellow, surface);
+		_temporaryMessages.push_back(temporaryMessage);
+		_temporaryMessageDeadlines.push_back(temporaryMessageDeadline);
+	} else {
+		drawStringInSurface(_messagesList[1], 191, 177, yellow, black, surface);
 	}
 
 	int energy = _gameStateVars[k8bitVariableEnergy];
@@ -405,17 +403,17 @@ void DrillerEngine::pressedKey(const int keycode) {
 			return;
 
 		if (_flyMode) {
-			_currentAreaMessages[0] = _messagesList[8];
+			insertTemporaryMessage(_messagesList[8], _countdown - 2);
 			return;
 		}
 
 		if (drillDeployed()) {
-			_currentAreaMessages[0] = _messagesList[12];
+			insertTemporaryMessage(_messagesList[12], _countdown - 2);
 			return;
 		}
 
 		if (_gameStateVars[k8bitVariableEnergy] < 5) {
-			_currentAreaMessages[0] = _messagesList[7];
+			insertTemporaryMessage(_messagesList[7], _countdown - 2);
 			return;
 		}
 
@@ -427,7 +425,7 @@ void DrillerEngine::pressedKey(const int keycode) {
 		debugC(1, kFreescapeDebugMove, "with pitch: %f and yaw %f", _pitch, _yaw);
 
 		if (!checkDrill(drillPosition)) {
-			_currentAreaMessages[0] = _messagesList[4];
+			insertTemporaryMessage(_messagesList[4], _countdown - 2);
 			return;
 		}
 
@@ -436,33 +434,35 @@ void DrillerEngine::pressedKey(const int keycode) {
 		addDrill(drillPosition);
 		float distanceToPocket = (gasPocket3D - drillPosition).length();
 		float success = 100.0 * (1.0 - distanceToPocket / _currentArea->_gasPocketRadius);
+		insertTemporaryMessage(_messagesList[3], _countdown - 2);
 
 		if (success <= 0) {
-			_currentAreaMessages[0] = _messagesList[9];
+			insertTemporaryMessage(_messagesList[9], _countdown - 4);
 			return;
 		}
 
 		_gameStateVars[32]++; // TODO: save a boolean to indicate if a level is safe or not
-		_currentAreaMessages[0] = _messagesList[6];
-		_currentAreaMessages[0].replace(0, 4, Common::String::format("%d", int(success)));
-
+		insertTemporaryMessage(_messagesList[5], _countdown - 4);
+		Common::String successMessage = _messagesList[6];
+		successMessage.replace(0, 4, Common::String::format("%d", int(success)));
+		insertTemporaryMessage(successMessage, _countdown - 6);
 	} else if (keycode == Common::KEYCODE_c) {
 		uint32 gasPocketRadius = _currentArea->_gasPocketRadius;
 		if (gasPocketRadius == 0)
 			return;
 
 		if (_flyMode) {
-			_currentAreaMessages[0] = _messagesList[8];
+			insertTemporaryMessage(_messagesList[8], _countdown - 2);
 			return;
 		}
 
 		if (!drillDeployed()) {
-			_currentAreaMessages[0] = _messagesList[13];
+			insertTemporaryMessage(_messagesList[13], _countdown - 2);
 			return;
 		}
 
 		if (_gameStateVars[k8bitVariableEnergy] < 5) {
-			_currentAreaMessages[0] = _messagesList[7];
+			insertTemporaryMessage(_messagesList[7], _countdown - 2);
 			return;
 		}
 
@@ -471,6 +471,7 @@ void DrillerEngine::pressedKey(const int keycode) {
 		// TODO: check if level is safe and decrement if necessary
 		_gameStateVars[32]--;
 		removeDrill();
+		insertTemporaryMessage(_messagesList[10], _countdown - 2);
 	}
 }
 


Commit: bfaab8f4ed4dd2e24a34efcb0d9e51212c9a1e2e
    https://github.com/scummvm/scummvm/commit/bfaab8f4ed4dd2e24a34efcb0d9e51212c9a1e2e
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-11-09T12:24:53+01:00

Commit Message:
FREESCAPE: refactor DOS and Amiga/AtariST ui code in driller

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


diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index 37773cb6ad7..3ba4976e5a1 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -331,6 +331,9 @@ private:
 
 	void loadAssetsDemo();
 	void loadAssetsFullGame();
+
+	void drawDOSUI(Graphics::Surface *surface);
+	void drawAmigaAtariSTUI(Graphics::Surface *surface);
 };
 
 class DarkEngine : public FreescapeEngine {
diff --git a/engines/freescape/games/driller.cpp b/engines/freescape/games/driller.cpp
index 4171a005404..8f91403cdc5 100644
--- a/engines/freescape/games/driller.cpp
+++ b/engines/freescape/games/driller.cpp
@@ -325,18 +325,38 @@ void DrillerEngine::loadAssetsFullGame() {
 
 void DrillerEngine::drawUI() {
 	_gfx->renderCrossair(0, _crossairPosition);
-	uint32 yellow = _gfx->_texturePixelFormat.ARGBToColor(0xFF, 0xFF, 0xFF, 0x55);
-	uint32 black = _gfx->_texturePixelFormat.ARGBToColor(0xFF, 0x00, 0x00, 0x00);
-	uint32 gray = _gfx->_texturePixelFormat.ARGBToColor(0x00, 0xA0, 0xA0, 0xA0);
 
 	Graphics::Surface *surface = nullptr;
 	if (_border) { // This can be removed when all the borders are loaded
+		uint32 gray = _gfx->_texturePixelFormat.ARGBToColor(0x00, 0xA0, 0xA0, 0xA0);
 		surface = new Graphics::Surface();
 		surface->create(_screenW, _screenH, _gfx->_texturePixelFormat);
 		surface->fillRect(_fullscreenViewArea, gray);
 	} else
 		return;
 
+	if (isDOS())
+		drawDOSUI(surface);
+	else if (isAmiga() || isAtariST())
+		drawAmigaAtariSTUI(surface);
+
+	if (!_uiTexture)
+		_uiTexture = _gfx->createTexture(surface);
+	else
+		_uiTexture->update(surface);
+
+	_gfx->setViewport(_fullscreenViewArea);
+	_gfx->drawTexturedRect2D(_fullscreenViewArea, _fullscreenViewArea, _uiTexture);
+	_gfx->setViewport(_viewArea);
+
+	surface->free();
+	delete surface;
+}
+
+void DrillerEngine::drawDOSUI(Graphics::Surface *surface) {
+	uint32 yellow = _gfx->_texturePixelFormat.ARGBToColor(0xFF, 0xFF, 0xFF, 0x55);
+	uint32 black = _gfx->_texturePixelFormat.ARGBToColor(0xFF, 0x00, 0x00, 0x00);
+
 	int score = _gameStateVars[k8bitVariableScore];
 	drawStringInSurface(_currentArea->_name, 195, 177, yellow, black, surface);
 	drawStringInSurface(Common::String::format("%04d", 2 * int(_position.x())), 150, 145, yellow, black, surface);
@@ -381,18 +401,10 @@ void DrillerEngine::drawUI() {
 			surface->fillRect(shieldBar, yellow);
 		}
 	}
+}
 
-	if (!_uiTexture)
-		_uiTexture = _gfx->createTexture(surface);
-	else
-		_uiTexture->update(surface);
-
-	_gfx->setViewport(_fullscreenViewArea);
-	_gfx->drawTexturedRect2D(_fullscreenViewArea, _fullscreenViewArea, _uiTexture);
-	_gfx->setViewport(_viewArea);
-
-	surface->free();
-	delete surface;
+void DrillerEngine::drawAmigaAtariSTUI(Graphics::Surface *surface) {
+	// TODO: this needs to have fonts already parsed
 }
 
 void DrillerEngine::pressedKey(const int keycode) {




More information about the Scummvm-git-logs mailing list