[Scummvm-git-logs] scummvm master -> 7732097080ea1a4affcf43820b2717c60863109f

neuromancer noreply at scummvm.org
Fri May 10 05:56:06 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:
7732097080 FREESCAPE: some code to parse riddles in castle


Commit: 7732097080ea1a4affcf43820b2717c60863109f
    https://github.com/scummvm/scummvm/commit/7732097080ea1a4affcf43820b2717c60863109f
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-05-10T07:57:03+02:00

Commit Message:
FREESCAPE: some code to parse riddles in castle

Changed paths:
    engines/freescape/games/castle/amiga.cpp
    engines/freescape/games/castle/castle.cpp
    engines/freescape/games/castle/castle.h
    engines/freescape/games/castle/dos.cpp
    engines/freescape/loaders/8bitBinaryLoader.cpp


diff --git a/engines/freescape/games/castle/amiga.cpp b/engines/freescape/games/castle/amiga.cpp
index 65a70078637..f17842ab9a9 100644
--- a/engines/freescape/games/castle/amiga.cpp
+++ b/engines/freescape/games/castle/amiga.cpp
@@ -34,7 +34,8 @@ void CastleEngine::loadAssetsAmigaDemo() {
 	if (!file.isOpen())
 		error("Failed to open 'x' file");
 
-	loadMessagesVariableSize(&file, 0x8bb2, 164);
+	loadMessagesVariableSize(&file, 0x8bb2, 178);
+	loadRiddles(&file, 0x96c9, 20);
 	load8bitBinary(&file, 0x162a6, 16);
 	loadPalettes(&file, 0x151a6);
 
diff --git a/engines/freescape/games/castle/castle.cpp b/engines/freescape/games/castle/castle.cpp
index 2487889b14b..93336946f7b 100644
--- a/engines/freescape/games/castle/castle.cpp
+++ b/engines/freescape/games/castle/castle.cpp
@@ -188,6 +188,36 @@ void CastleEngine::executePrint(FCLInstruction &instruction) {
 }
 
 
+void CastleEngine::loadRiddles(Common::SeekableReadStream *file, int offset, int number) {
+	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;
+		}
+		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());
+}
+
+
 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 d127b9b2f6e..1695540b8ea 100644
--- a/engines/freescape/games/castle/castle.h
+++ b/engines/freescape/games/castle/castle.h
@@ -39,8 +39,11 @@ public:
 	void gotoArea(uint16 areaID, int entranceID) override;
 	Common::Error saveGameStreamExtended(Common::WriteStream *stream, bool isAutosave = false) override;
 	Common::Error loadGameStreamExtended(Common::SeekableReadStream *stream) override;
+
+	Common::StringArray _riddleList;
 private:
 	Common::SeekableReadStream *decryptFile(const Common::Path &filename);
+	void loadRiddles(Common::SeekableReadStream *file, int offset, int number);
 };
 
 extern byte kFreescapeCastleFont[];
diff --git a/engines/freescape/games/castle/dos.cpp b/engines/freescape/games/castle/dos.cpp
index d9243f89b46..0828be2020a 100644
--- a/engines/freescape/games/castle/dos.cpp
+++ b/engines/freescape/games/castle/dos.cpp
@@ -140,6 +140,15 @@ void CastleEngine::loadAssetsDOSDemo() {
 	if (_renderMode == Common::kRenderEGA) {
 		_viewArea = Common::Rect(40, 33, 280, 152);
 
+		file.open("CMDE.EXE");
+		stream = unpackEXE(file);
+		if (stream) {
+			loadSpeakerFxDOS(stream, 0x636d + 0x200, 0x63ed + 0x200);
+		}
+
+		delete stream;
+		file.close();
+
 		file.open("CMLE.DAT");
 		_title = load8bitBinImage(&file, 0x0);
 		_title->setPalette((byte *)&kEGADefaultPalette, 0, 16);
@@ -156,9 +165,18 @@ void CastleEngine::loadAssetsDOSDemo() {
 		file.close();
 
 		stream = decryptFile("CMLD"); // Only english
-
 		loadFonts(kFreescapeCastleFont, 59);
 		loadMessagesVariableSize(stream, 0x11, 164);
+		loadRiddles(stream, 0xaaf, 2);
+
+		/*for (int i = 0; i < 16; i++) {
+			debug("%lx", stream->pos());
+			for (int j = 0; j < 16; j++) {
+				byte c = stream->readByte();
+				debugN("%x/%c", c, c);
+			}
+			debugN("\n");
+		}*/
 		delete stream;
 
 		stream = decryptFile("CDEDF");
diff --git a/engines/freescape/loaders/8bitBinaryLoader.cpp b/engines/freescape/loaders/8bitBinaryLoader.cpp
index 711e1f601f5..e39cd167205 100644
--- a/engines/freescape/loaders/8bitBinaryLoader.cpp
+++ b/engines/freescape/loaders/8bitBinaryLoader.cpp
@@ -937,6 +937,8 @@ void FreescapeEngine::loadMessagesVariableSize(Common::SeekableReadStream *file,
 		Common::String message = "";
 		while (true) {
 			byte c = file->readByte();
+			if (c > 0xf0)
+				c = ' ';
 			if (c <= 1)
 				break;
 			message = message + c;
@@ -945,6 +947,7 @@ void FreescapeEngine::loadMessagesVariableSize(Common::SeekableReadStream *file,
 		_messagesList.push_back(message);
 		debugC(1, kFreescapeDebugParser, "'%s'", _messagesList[i].c_str());
 	}
+	debugC(1, kFreescapeDebugParser, "End of messages at %lx", file->pos());
 }
 
 void FreescapeEngine::loadGlobalObjects(Common::SeekableReadStream *file, int offset, int size) {




More information about the Scummvm-git-logs mailing list