[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