[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