[Scummvm-git-logs] scummvm master -> 9d606e07215317fbdceb97d6385bbe82257e1900
neuromancer
noreply at scummvm.org
Sat May 11 06:56:42 UTC 2024
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:
9d606e0721 FREESCAPE: initial implementation of drawing code for riddles in castle
Commit: 9d606e07215317fbdceb97d6385bbe82257e1900
https://github.com/scummvm/scummvm/commit/9d606e07215317fbdceb97d6385bbe82257e1900
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-05-11T08:53:16+02:00
Commit Message:
FREESCAPE: initial implementation of drawing code for riddles in castle
Changed paths:
engines/freescape/games/castle/castle.cpp
engines/freescape/games/castle/castle.h
engines/freescape/games/castle/dos.cpp
engines/freescape/loaders/8bitImage.cpp
diff --git a/engines/freescape/games/castle/castle.cpp b/engines/freescape/games/castle/castle.cpp
index 93336946f7b..4b74301c2b1 100644
--- a/engines/freescape/games/castle/castle.cpp
+++ b/engines/freescape/games/castle/castle.cpp
@@ -177,10 +177,12 @@ void CastleEngine::endGame() {
void CastleEngine::executePrint(FCLInstruction &instruction) {
uint16 index = instruction._source;
_currentAreaMessages.clear();
- if (index > 127) {
- index = _messagesList.size() - (index - 254) - 2;
- // TODO
- //drawFullscreenMessage(_messagesList[index]);
+ if (index > 129) {
+ index = index - 129;
+ if (index < _riddleList.size())
+ drawFullscreenRiddleAndWait(index);
+ else
+ debugC(1, kFreescapeDebugCode, "Riddle index %d out of bounds", index);
return;
}
debugC(1, kFreescapeDebugCode, "Printing message %d: \"%s\"", index, _messagesList[index].c_str());
@@ -192,31 +194,162 @@ void CastleEngine::loadRiddles(Common::SeekableReadStream *file, int offset, int
file->seek(offset);
debugC(1, kFreescapeDebugParser, "Riddle table:");
- for (int i = 0; i < 6 * number; i++) {
- if (i % 6 == 0 && i > 0) {
- debug("extra byte: %x", file->readByte());
- }
- int size = file->readByte();
- if (size > 22)
- size = 22;
- debugC(1, kFreescapeDebugParser, "size: %d", size);
- debugC(1, kFreescapeDebugParser, "extra byte: %x", file->readByte());
- Common::String message = "";
- while (size-- > 0) {
- byte c = file->readByte();
- if (c != 0)
- message = message + c;
+ int numberAsteriskLines = 0;
+ for (int i = 0; i < number; i++) {
+ numberAsteriskLines = 0;
+ debugC(1, kFreescapeDebugParser, "riddle %d extra byte each 6: %x", i, file->readByte());
+
+ for (int j = 0; j < 6; j++) {
+ int size = file->readByte();
+ debugC(1, kFreescapeDebugParser, "size: %d (max 22?)", size);
+ //if (size > 22)
+ // size = 22;
+ int padSpaces = (22 - size) / 2;
+ debugC(1, kFreescapeDebugParser, "extra byte: %x", file->readByte());
+ Common::String message = "";
+ int k = padSpaces;
+
+ if (size > 0) {
+ while (k-- > 0)
+ message = message + " ";
+
+ while (size-- > 0) {
+ byte c = file->readByte();
+ if (c != 0)
+ message = message + c;
+ }
+
+ k = padSpaces;
+ while (k-- > 0)
+ message = message + " ";
+ }
+
+
+ if (isAmiga() || isAtariST())
+ debug("extra byte: %x", file->readByte());
+ debugC(1, kFreescapeDebugParser, "extra byte: %x", file->readByte());
+ debugC(1, kFreescapeDebugParser, "extra byte: %x", file->readByte());
+ debugC(1, kFreescapeDebugParser, "'%s'", message.c_str());
+
+ _riddleList.push_back(message);
+ if (message.size() > 0 && message[0] == '*')
+ numberAsteriskLines++;
+
+ if (numberAsteriskLines == 2 && j < 5) {
+ assert(j == 4);
+ _riddleList.push_back("");
+ debugC(1, kFreescapeDebugParser, "Padded with ''");
+ break;
+ }
}
- if (isAmiga() || isAtariST())
- debug("extra byte: %x", file->readByte());
- debugC(1, kFreescapeDebugParser, "extra byte: %x", file->readByte());
- debugC(1, kFreescapeDebugParser, "extra byte: %x", file->readByte());
- _riddleList.push_back(message);
- debugC(1, kFreescapeDebugParser, "'%s'", _riddleList[i].c_str());
+
}
debugC(1, kFreescapeDebugParser, "End of riddles at %lx", file->pos());
}
+void CastleEngine::drawFullscreenRiddleAndWait(uint16 riddle) {
+ _savedScreen = _gfx->getScreenshot();
+ uint32 color = 0;
+ switch (_renderMode) {
+ case Common::kRenderCPC:
+ color = 14;
+ break;
+ case Common::kRenderCGA:
+ color = 1;
+ break;
+ case Common::kRenderZX:
+ color = 6;
+ break;
+ default:
+ color = 14;
+ }
+ uint8 r, g, b;
+ _gfx->readFromPalette(6, r, g, b);
+ uint32 front = _gfx->_texturePixelFormat.ARGBToColor(0xFF, r, g, b);
+ _gfx->readFromPalette(color, r, g, b);
+ uint32 back = _gfx->_texturePixelFormat.ARGBToColor(0xFF, r, g, b);
+
+ Graphics::Surface *surface = new Graphics::Surface();
+ surface->create(_screenW, _screenH, _gfx->_texturePixelFormat);
+
+ Common::Event event;
+ bool cont = true;
+ while (!shouldQuit() && cont) {
+ while (_eventManager->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();
+ break;
+ case Common::EVENT_RBUTTONDOWN:
+ // fallthrough
+ case Common::EVENT_LBUTTONDOWN:
+ if (g_system->hasFeature(OSystem::kFeatureTouchscreen))
+ cont = false;
+ break;
+ default:
+ break;
+ }
+ }
+ _gfx->clear(0, 0, 0, true);
+ drawBorder();
+ if (_currentArea)
+ drawUI();
+ drawRiddle(riddle, front, back, surface);
+ _gfx->flipBuffer();
+ g_system->updateScreen();
+ g_system->delayMillis(15); // try to target ~60 FPS
+ }
+
+ _savedScreen->free();
+ delete _savedScreen;
+ surface->free();
+ delete surface;
+}
+
+void CastleEngine::drawRiddle(uint16 riddle, uint32 front, uint32 back, Graphics::Surface *surface) {
+
+ Common::StringArray riddleMessages;
+ for (int i = 6 * riddle; i < 6 * (riddle + 1); i++) {
+ riddleMessages.push_back(_riddleList[i]);
+ }
+
+ uint32 noColor = _gfx->_texturePixelFormat.ARGBToColor(0x00, 0x00, 0x00, 0x00);
+ uint32 black = _gfx->_texturePixelFormat.ARGBToColor(0xFF, 0x00, 0x00, 0x00);
+ uint32 frame = _gfx->_texturePixelFormat.ARGBToColor(0xFF, 0xA7, 0xA7, 0xA7);
+
+ surface->fillRect(_fullscreenViewArea, noColor);
+ surface->fillRect(_viewArea, black);
+
+ surface->frameRect(Common::Rect(47, 47, 271, 147), frame);
+ surface->frameRect(Common::Rect(53, 53, 266, 141), frame);
+
+ surface->fillRect(Common::Rect(54, 54, 266, 139), back);
+ int x = 0;
+ int y = 0;
+ int numberOfLines = 6;
+
+ if (isDOS()) {
+ x = 58;
+ y = 66;
+ } else if (isSpectrum() || isCPC()) {
+ x = 60;
+ y = 40;
+ }
+
+ for (int i = 0; i < numberOfLines; i++) {
+ drawStringInSurface(riddleMessages[i], x, y, front, back, surface);
+ y = y + 12;
+ }
+ drawFullscreenSurface(surface);
+}
+
Common::Error CastleEngine::saveGameStreamExtended(Common::WriteStream *stream, bool isAutosave) {
return Common::kNoError;
diff --git a/engines/freescape/games/castle/castle.h b/engines/freescape/games/castle/castle.h
index 1695540b8ea..4b3474b31a7 100644
--- a/engines/freescape/games/castle/castle.h
+++ b/engines/freescape/games/castle/castle.h
@@ -44,6 +44,8 @@ public:
private:
Common::SeekableReadStream *decryptFile(const Common::Path &filename);
void loadRiddles(Common::SeekableReadStream *file, int offset, int number);
+ void drawFullscreenRiddleAndWait(uint16 riddle);
+ void drawRiddle(uint16 riddle, uint32 front, uint32 back, Graphics::Surface *surface);
};
extern byte kFreescapeCastleFont[];
diff --git a/engines/freescape/games/castle/dos.cpp b/engines/freescape/games/castle/dos.cpp
index 0828be2020a..cd704a1a7d0 100644
--- a/engines/freescape/games/castle/dos.cpp
+++ b/engines/freescape/games/castle/dos.cpp
@@ -167,7 +167,7 @@ void CastleEngine::loadAssetsDOSDemo() {
stream = decryptFile("CMLD"); // Only english
loadFonts(kFreescapeCastleFont, 59);
loadMessagesVariableSize(stream, 0x11, 164);
- loadRiddles(stream, 0xaaf, 2);
+ loadRiddles(stream, 0xaae, 10);
/*for (int i = 0; i < 16; i++) {
debug("%lx", stream->pos());
@@ -184,6 +184,7 @@ void CastleEngine::loadAssetsDOSDemo() {
for (auto &it : _areaMap)
it._value->addStructure(_areaMap[255]);
+ _areaMap[1]->addFloor();
_areaMap[2]->addFloor();
delete stream;
} else
diff --git a/engines/freescape/loaders/8bitImage.cpp b/engines/freescape/loaders/8bitImage.cpp
index 7f0d95c05d8..360557b6c01 100644
--- a/engines/freescape/loaders/8bitImage.cpp
+++ b/engines/freescape/loaders/8bitImage.cpp
@@ -105,6 +105,7 @@ Graphics::ManagedSurface *FreescapeEngine::load8bitBinImage(Common::SeekableRead
load8bitBinImageRow(file, surface, row);
assert(startImage + imageSize == file->pos());
+ debugC(1, kFreescapeDebugParser, "Last position: %lx", file->pos());
return surface;
}
More information about the Scummvm-git-logs
mailing list