[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