[Scummvm-git-logs] scummvm master -> c1855a78d13635b6c6716f255a7c399c9bf05932

neuromancer noreply at scummvm.org
Mon Sep 16 18:28:48 UTC 2024


This automated email contains information about 8 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
18019342cd FREESCAPE: make sure spirits are counted as destroyed
a5a50bd956 FREESCAPE: keep track of explored areas in castle
255e72dd32 FREESCAPE: improved loading of data in castle dos demo
485a98aa9c FREESCAPE: improved reading and rendering of riddles in castle for dos
188ae18562 FREESCAPE: fixes for riddles in castle for dos
94fceaba06 FREESCAPE: fixes for riddles in castle for zx
014713440d FREESCAPE: fixes for riddles in castle for amiga demo
c1855a78d1 FREESCAPE: simplified and improved handling of group operations


Commit: 18019342cd93de7882dc343c1e8e6040a132d639
    https://github.com/scummvm/scummvm/commit/18019342cd93de7882dc343c1e8e6040a132d639
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-09-16T20:29:44+02:00

Commit Message:
FREESCAPE: make sure spirits are counted as destroyed

Changed paths:
    engines/freescape/freescape.h
    engines/freescape/games/castle/castle.cpp
    engines/freescape/games/castle/castle.h


diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index 6ed0ab2133a..0f261f2d1e2 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -400,7 +400,7 @@ public:
 	virtual void executeMakeInvisible(FCLInstruction &instruction);
 	void executeMakeVisible(FCLInstruction &instruction);
 	void executeToggleVisibility(FCLInstruction &instruction);
-	void executeDestroy(FCLInstruction &instruction);
+	virtual void executeDestroy(FCLInstruction &instruction);
 	virtual void executeRedraw(FCLInstruction &instruction);
 	void executeSound(FCLInstruction &instruction);
 	void executeDelay(FCLInstruction &instruction);
diff --git a/engines/freescape/games/castle/castle.cpp b/engines/freescape/games/castle/castle.cpp
index 9b17db8982a..1c2230b9a8f 100644
--- a/engines/freescape/games/castle/castle.cpp
+++ b/engines/freescape/games/castle/castle.cpp
@@ -545,6 +545,7 @@ void CastleEngine::drawInfoMenu() {
 	g_system->showMouse(false);
 }
 
+// Same as FreescapeEngine::executeExecute but updates the spirits destroyed counter
 void CastleEngine::executeMakeInvisible(FCLInstruction &instruction) {
 	uint16 objectID = 0;
 	uint16 areaID = _currentArea->getAreaID();
@@ -574,6 +575,33 @@ void CastleEngine::executeMakeInvisible(FCLInstruction &instruction) {
 
 }
 
+// Same as FreescapeEngine::executeExecute but updates the spirits destroyed counter
+void CastleEngine::executeDestroy(FCLInstruction &instruction) {
+	uint16 objectID = 0;
+	uint16 areaID = _currentArea->getAreaID();
+
+	if (instruction._destination > 0) {
+		objectID = instruction._destination;
+		areaID = instruction._source;
+	} else {
+		objectID = instruction._source;
+	}
+
+	debugC(1, kFreescapeDebugCode, "Destroying obj %d in area %d!", objectID, areaID);
+	assert(_areaMap.contains(areaID));
+	Object *obj = _areaMap[areaID]->objectWithID(objectID);
+	assert(obj); // We know that an object should be there
+
+	if (!obj->isDestroyed() && obj->getType() == kSensorType && isCastle()) {
+		_spiritsDestroyed++;
+	}
+
+	if (obj->isDestroyed())
+		debugC(1, kFreescapeDebugCode, "WARNING: Destroying obj %d in area %d already destroyed!", objectID, areaID);
+
+	obj->destroy();
+}
+
 void CastleEngine::executePrint(FCLInstruction &instruction) {
 	uint16 index = instruction._source;
 	_currentAreaMessages.clear();
diff --git a/engines/freescape/games/castle/castle.h b/engines/freescape/games/castle/castle.h
index 3caf67aa330..529c9de629e 100644
--- a/engines/freescape/games/castle/castle.h
+++ b/engines/freescape/games/castle/castle.h
@@ -64,6 +64,7 @@ public:
 
 	void executePrint(FCLInstruction &instruction) override;
 	void executeMakeInvisible(FCLInstruction &instruction) override;
+	void executeDestroy(FCLInstruction &instruction) override;
 	void executeRedraw(FCLInstruction &instruction) override;
 	void gotoArea(uint16 areaID, int entranceID) override;
 	Common::Error saveGameStreamExtended(Common::WriteStream *stream, bool isAutosave = false) override;


Commit: a5a50bd9562adb2ccbddb8b35435de9d9c7a6c95
    https://github.com/scummvm/scummvm/commit/a5a50bd9562adb2ccbddb8b35435de9d9c7a6c95
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-09-16T20:29:44+02:00

Commit Message:
FREESCAPE: keep track of explored areas in castle

Changed paths:
    engines/freescape/freescape.cpp
    engines/freescape/freescape.h
    engines/freescape/games/castle/castle.cpp
    engines/freescape/games/dark/dark.cpp
    engines/freescape/games/dark/dark.h


diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index 2c56b894579..51c5534f561 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -918,6 +918,7 @@ void FreescapeEngine::initGameState() {
 	int seconds, minutes, hours;
 	getTimeFromCountdown(seconds, minutes, hours);
 	_lastMinute = minutes;
+	_exploredAreas.clear();
 }
 
 void FreescapeEngine::rotate(float xoffset, float yoffset) {
diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index 0f261f2d1e2..2836746f8b3 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -530,6 +530,7 @@ public:
 	bool _endGamePlayerEndArea;
 	bool _forceEndGame;
 	bool _playerWasCrushed;
+	Common::HashMap<uint16, bool> _exploredAreas;
 	ObjectArray _sensors;
 	virtual void checkSensors();
 	virtual void drawSensorShoot(Sensor *sensor);
diff --git a/engines/freescape/games/castle/castle.cpp b/engines/freescape/games/castle/castle.cpp
index 1c2230b9a8f..f60cb470eed 100644
--- a/engines/freescape/games/castle/castle.cpp
+++ b/engines/freescape/games/castle/castle.cpp
@@ -286,6 +286,11 @@ void CastleEngine::initKeymaps(Common::Keymap *engineKeyMap, Common::Keymap *inf
 void CastleEngine::gotoArea(uint16 areaID, int entranceID) {
 	debugC(1, kFreescapeDebugMove, "Jumping to area: %d, entrance: %d", areaID, entranceID);
 
+	if (!_exploredAreas.contains(areaID)) {
+		_gameStateVars[k8bitVariableScore] += 17500;
+		_exploredAreas[areaID] = true;
+	}
+
 	assert(_areaMap.contains(areaID));
 	_currentArea = _areaMap[areaID];
 	_currentArea->show();
@@ -349,6 +354,7 @@ void CastleEngine::initGameState() {
 	_spiritsMeter = 32;
 	_spiritsMeterMax = 64;
 
+	_exploredAreas[_startArea] = true;
 	if (_useRockTravel) // Enable cheat
 		setGameBit(k8bitGameBitTravelRock);
 }
@@ -1133,6 +1139,12 @@ Common::Error CastleEngine::saveGameStreamExtended(Common::WriteStream *stream,
 	stream->writeUint32LE(_numberKeys);
 	stream->writeUint32LE(_spiritsMeter);
 	stream->writeUint32LE(_spiritsDestroyed);
+
+	for (auto &it : _areaMap) {
+		stream->writeUint16LE(it._key);
+		stream->writeUint32LE(_exploredAreas[it._key]);
+	}
+
 	return Common::kNoError;
 }
 
@@ -1141,6 +1153,11 @@ Common::Error CastleEngine::loadGameStreamExtended(Common::SeekableReadStream *s
 	_spiritsMeter = stream->readUint32LE();
 	_spiritsDestroyed = stream->readUint32LE();
 
+	for (uint i = 0; i < _areaMap.size(); i++) {
+		uint16 key = stream->readUint16LE();
+		_exploredAreas[key] = stream->readUint32LE();
+	}
+
 	if (_useRockTravel) // Enable cheat
 		setGameBit(k8bitGameBitTravelRock);
 	return Common::kNoError;
diff --git a/engines/freescape/games/dark/dark.cpp b/engines/freescape/games/dark/dark.cpp
index fd80e712b94..99dd4c8ff42 100644
--- a/engines/freescape/games/dark/dark.cpp
+++ b/engines/freescape/games/dark/dark.cpp
@@ -255,7 +255,6 @@ void DarkEngine::initGameState() {
 	_gameStateVars[kVariableActiveECDs] = 100;
 
 	_playerHeightNumber = 1;
-	_exploredAreas.clear();
 	_exploredAreas[_startArea] = true;
 
 	_endArea = 1;
diff --git a/engines/freescape/games/dark/dark.h b/engines/freescape/games/dark/dark.h
index 281a60862af..cb923e617c2 100644
--- a/engines/freescape/games/dark/dark.h
+++ b/engines/freescape/games/dark/dark.h
@@ -112,7 +112,6 @@ private:
 	bool tryDestroyECD(int index);
 	bool tryDestroyECDFullGame(int index);
 	void addWalls(Area *area);
-	Common::HashMap<uint16, bool> _exploredAreas;
 };
 
 }


Commit: 255e72dd329116f4220987735237a623f4206341
    https://github.com/scummvm/scummvm/commit/255e72dd329116f4220987735237a623f4206341
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-09-16T20:29:44+02:00

Commit Message:
FREESCAPE: improved loading of data in castle dos demo

Changed paths:
    engines/freescape/games/castle/castle.cpp
    engines/freescape/games/castle/dos.cpp


diff --git a/engines/freescape/games/castle/castle.cpp b/engines/freescape/games/castle/castle.cpp
index f60cb470eed..9127c0d1c06 100644
--- a/engines/freescape/games/castle/castle.cpp
+++ b/engines/freescape/games/castle/castle.cpp
@@ -649,14 +649,29 @@ void CastleEngine::loadRiddles(Common::SeekableReadStream *file, int offset, int
 	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 header = file->readByte();
+		debugC(1, kFreescapeDebugParser, "riddle %d extra byte each 6: %x", i, header);
+		int numberLines = 6;
+		if (header == 0x15 || header == 0x1a || header == 0x1c)
+			numberLines = 7;
+		else if (header == 0x1d)
+			numberLines = 6;
+		else if (header == 0x27)
+			numberLines = 5;
+
+		for (int j = 0; j < numberLines; j++) {
 			int size = file->readByte();
-			debugC(1, kFreescapeDebugParser, "size: %d (max 22?)", size);
+			debugC(1, kFreescapeDebugParser, "size: %d (max 23?)", size);
+			//assert(size <= 23);
+			//assert(size > 0);
 
 			Common::String message = "";
-			if (size == 255) {
+			if (size > 23) {
+				debugC(1, kFreescapeDebugParser, "extra byte: %x", file->readByte());
+				debugC(1, kFreescapeDebugParser, "extra byte: %x", file->readByte());
+				continue;
+
+			} else if (size == 255) {
 				size = 19;
 				while (size-- > 0)
 					message = message + "*";
@@ -666,6 +681,8 @@ void CastleEngine::loadRiddles(Common::SeekableReadStream *file, int offset, int
 				debugC(1, kFreescapeDebugParser, "extra byte: %x", file->readByte());
 				debugC(1, kFreescapeDebugParser, "'%s'", message.c_str());
 				continue;
+			} else if (size == 0) {
+				size = 21;
 			}
 
 			//if (size > 22)
@@ -701,12 +718,13 @@ void CastleEngine::loadRiddles(Common::SeekableReadStream *file, int offset, int
 			if (message.size() > 0 && message[0] == '*')
 				numberAsteriskLines++;
 
-			if (numberAsteriskLines == 2 && j < 5) {
-				assert(j == 4);
+			/*if (numberAsteriskLines == 2 && j < 5) {
+
 				_riddleList.push_back("");
 				debugC(1, kFreescapeDebugParser, "Padded with ''");
-				break;
-			}
+				//if (j == 4)
+				//	break;
+			}*/
 		}
 
 	}
diff --git a/engines/freescape/games/castle/dos.cpp b/engines/freescape/games/castle/dos.cpp
index f555acb5660..cb756ac92d5 100644
--- a/engines/freescape/games/castle/dos.cpp
+++ b/engines/freescape/games/castle/dos.cpp
@@ -318,40 +318,60 @@ void CastleEngine::loadAssetsDOSDemo() {
 			loadSpeakerFxDOS(stream, 0x636d + 0x200, 0x63ed + 0x200);
 			loadDOSFonts(stream, 0x293f6);
 
-			stream->seek(0x1c700 - 0x2a0);
-			_background = loadFrameFromPlanes(stream, 252, 42);
+			stream->seek(0x197c0 - 0x2a0);
+			_endGameBackgroundFrame = loadFrameFromPlanes(stream, 112, 108);
+			_endGameBackgroundFrame->convertToInPlace(_gfx->_texturePixelFormat, (byte *)&kEGADefaultPalette, 16);
+
+			_background = loadFrameFromPlanes(stream, 504, 42);
 			_background->convertToInPlace(_gfx->_texturePixelFormat, (byte *)&kEGADefaultPalette, 16);
 
+			stream->seek(0x1f4e3 - 0x2a0);
+			for (int i = 0; i < 6; i++)
+				debug("i: %d -> %x", i, stream->readByte());
+			debug("%lx", stream->pos());
+			debug("extra: %x", stream->readByte());
+
+			for (int i = 0; i < 9; i++) {
+				Graphics::ManagedSurface *frame = loadFrameFromPlanes(stream, 8, 14);
+				frame->convertToInPlace(_gfx->_texturePixelFormat, (byte *)&kEGADefaultPalette, 16);
+				_keysBorderFrames.push_back(frame);
+			}
+
+			for (int i = 0; i < 11; i++) {
+				Graphics::ManagedSurface *frame = loadFrameFromPlanes(stream, 8, 14);
+				frame->convertToInPlace(_gfx->_texturePixelFormat, (byte *)&kEGADefaultPalette, 16);
+				_keysMenuFrames.push_back(frame);
+			}
+
+			stream->seek(0x20262 - 0x2a0);
+			_strenghtBackgroundFrame = loadFrameWithHeaderDOS(stream);
+			_strenghtBarFrame = loadFrameWithHeaderDOS(stream);
+			_strenghtWeightsFrames = loadFramesWithHeaderDOS(stream, 4);
+			_spiritsMeterIndicatorBackgroundFrame = loadFrameWithHeaderDOS(stream);
+			_spiritsMeterIndicatorFrame = loadFrameWithHeaderDOS(stream);
+			loadFrameWithHeaderDOS(stream); // side
+			loadFrameWithHeaderDOS(stream); // ???
+
 			stream->seek(0x221ae - 0x2a0);
-			_menu = loadFrameFromPlanes(stream, 112, 114);
+			// No header?
+			_menu = loadFrameFromPlanes(stream, 112, 115);
 			_menu->convertToInPlace(_gfx->_texturePixelFormat, (byte *)&kEGADefaultPalette, 16);
 
-			//debug("%lx", stream->pos());
-			// TODO: some space here from the menu image
-			/*stream->seek(0x25414);
-			_menuCrawlIndicator = loadFrameFromPlanes(stream, 16, 12, lightGray, lightGray, lightGray, darkGray);
-			_menuWalkIndicator = loadFrameFromPlanes(stream, 16, 12, lightGray, lightGray, lightGray, darkGray);
-			_menuRunIndicator = loadFrameFromPlanes(stream, 16, 12, lightGray, lightGray, lightGray, darkGray);
-			_menuFxOffIndicator = loadFrameFromPlanes(stream, 16, 12, lightGray, lightGray, lightGray, darkGray);
-			_menuFxOnIndicator = loadFrameFromPlanes(stream, 16, 12, lightGray, lightGray, lightGray, darkGray);*/
-
-			// This end in 0x257d4??
-			byte flagPalette[4][3] = {
-				{0x00, 0x00, 0x00},
-				{0x00, 0xaa, 0x00},
-				{0x55, 0xff, 0x55},
-				{0xff, 0xff, 0xff}
-			};
-
-			stream->seek(0x257cc - 0x2a0);
-			_flagFrames[0] = loadFrameFromPlanes(stream, 16, 11);
-			_flagFrames[0]->convertToInPlace(_gfx->_texturePixelFormat, (byte *)&flagPalette, 4);
-			_flagFrames[1] = loadFrameFromPlanes(stream, 16, 11);
-			_flagFrames[1]->convertToInPlace(_gfx->_texturePixelFormat, (byte *)&flagPalette, 4);
-			_flagFrames[2] = loadFrameFromPlanes(stream, 16, 11);
-			_flagFrames[2]->convertToInPlace(_gfx->_texturePixelFormat, (byte *)&flagPalette, 4);
-			_flagFrames[3] = loadFrameFromPlanes(stream, 16, 11);
-			_flagFrames[3]->convertToInPlace(_gfx->_texturePixelFormat, (byte *)&flagPalette, 4);
+			Common::Array <Graphics::ManagedSurface *> menuFrames = loadFramesWithHeaderDOS(stream, 5);
+			_menuCrawlIndicator = menuFrames[0];
+			_menuWalkIndicator = menuFrames[1];
+			_menuRunIndicator = menuFrames[2];
+			_menuFxOffIndicator = menuFrames[3];
+			_menuFxOnIndicator = menuFrames[4];
+
+			_flagFrames = loadFramesWithHeaderDOS(stream, 4);
+			_riddleTopFrame = loadFrameWithHeaderDOS(stream);
+			_riddleBackgroundFrame = loadFrameWithHeaderDOS(stream);
+			_riddleBottomFrame = loadFrameWithHeaderDOS(stream);
+			_endGameThroneFrame = loadFrameWithHeaderDOS(stream);
+			// No header
+			_thunderFrame = loadFrameFromPlanes(stream, 16, 128);
+			_thunderFrame->convertToInPlace(_gfx->_texturePixelFormat, (byte *)&kEGADefaultPalette, 16);
 		}
 
 		delete stream;
@@ -374,7 +394,7 @@ void CastleEngine::loadAssetsDOSDemo() {
 
 		stream = decryptFile("CMLD"); // Only english
 		loadMessagesVariableSize(stream, 0x11, 164);
-		loadRiddles(stream, 0xaae, 10);
+		loadRiddles(stream, 0xaae, 21);
 		delete stream;
 
 		stream = decryptFile("CDEDF");


Commit: 485a98aa9c49f8818844382d68d505cfc9910171
    https://github.com/scummvm/scummvm/commit/485a98aa9c49f8818844382d68d505cfc9910171
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-09-16T20:29:44+02:00

Commit Message:
FREESCAPE: improved reading and rendering of riddles in castle for dos

Changed paths:
    engines/freescape/games/castle/castle.cpp
    engines/freescape/games/castle/dos.cpp


diff --git a/engines/freescape/games/castle/castle.cpp b/engines/freescape/games/castle/castle.cpp
index 9127c0d1c06..2a1ba04a360 100644
--- a/engines/freescape/games/castle/castle.cpp
+++ b/engines/freescape/games/castle/castle.cpp
@@ -611,12 +611,9 @@ void CastleEngine::executeDestroy(FCLInstruction &instruction) {
 void CastleEngine::executePrint(FCLInstruction &instruction) {
 	uint16 index = instruction._source;
 	_currentAreaMessages.clear();
-	if (index > 129) {
-		index = index - 129;
-		if (index < _riddleList.size() / 6)
-			drawFullscreenRiddleAndWait(index);
-		else
-			debugC(1, kFreescapeDebugCode, "Riddle index %d out of bounds", index);
+	if (index > 127) {
+		index = index - 127;
+		drawFullscreenRiddleAndWait(index);
 		return;
 	}
 	debugC(1, kFreescapeDebugCode, "Printing message %d: \"%s\"", index, _messagesList[index].c_str());
@@ -650,7 +647,7 @@ void CastleEngine::loadRiddles(Common::SeekableReadStream *file, int offset, int
 	for (int i = 0; i < number; i++) {
 		numberAsteriskLines = 0;
 		int header = file->readByte();
-		debugC(1, kFreescapeDebugParser, "riddle %d extra byte each 6: %x", i, header);
+		debugC(1, kFreescapeDebugParser, "riddle %d header: %x", i, header);
 		int numberLines = 6;
 		if (header == 0x15 || header == 0x1a || header == 0x1c)
 			numberLines = 7;
@@ -662,13 +659,12 @@ void CastleEngine::loadRiddles(Common::SeekableReadStream *file, int offset, int
 		for (int j = 0; j < numberLines; j++) {
 			int size = file->readByte();
 			debugC(1, kFreescapeDebugParser, "size: %d (max 23?)", size);
-			//assert(size <= 23);
-			//assert(size > 0);
 
 			Common::String message = "";
 			if (size > 23) {
 				debugC(1, kFreescapeDebugParser, "extra byte: %x", file->readByte());
 				debugC(1, kFreescapeDebugParser, "extra byte: %x", file->readByte());
+				_riddleList.push_back("");
 				continue;
 
 			} else if (size == 255) {
@@ -685,8 +681,6 @@ void CastleEngine::loadRiddles(Common::SeekableReadStream *file, int offset, int
 				size = 21;
 			}
 
-			//if (size > 22)
-			//	size = 22;
 			int padSpaces = (22 - size) / 2;
 			debugC(1, kFreescapeDebugParser, "extra byte: %x", file->readByte());
 
@@ -727,6 +721,12 @@ void CastleEngine::loadRiddles(Common::SeekableReadStream *file, int offset, int
 			}*/
 		}
 
+		if (numberLines < 7)
+			for (int j = numberLines; j < 7; j++) {
+				_riddleList.push_back("");
+				debugC(1, kFreescapeDebugParser, "Padded with ''");
+			}
+
 	}
 	debugC(1, kFreescapeDebugParser, "End of riddles at %" PRIx64, file->pos());
 }
@@ -802,7 +802,7 @@ void CastleEngine::drawFullscreenRiddleAndWait(uint16 riddle) {
 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++) {
+	for (int i = 7 * riddle; i < 7 * (riddle + 1); i++) {
 		riddleMessages.push_back(_riddleList[i]);
 	}
 	uint32 frameColor = 0;
@@ -821,11 +821,11 @@ void CastleEngine::drawRiddle(uint16 riddle, uint32 front, uint32 back, Graphics
 
 	int x = 0;
 	int y = 0;
-	int numberOfLines = 6;
+	int numberOfLines = 7;
 
 	if (isDOS()) {
 		x = 60;
-		y = 66;
+		y = 62;
 	} else if (isSpectrum() || isCPC()) {
 		x = 60;
 		y = 40;
@@ -833,7 +833,7 @@ void CastleEngine::drawRiddle(uint16 riddle, uint32 front, uint32 back, Graphics
 
 	for (int i = 0; i < numberOfLines; i++) {
 		drawStringInSurface(riddleMessages[i], x, y, front, back, surface);
-		y = y + 12;
+		y = y + 10;
 	}
 	drawFullscreenSurface(surface);
 }
diff --git a/engines/freescape/games/castle/dos.cpp b/engines/freescape/games/castle/dos.cpp
index cb756ac92d5..bdfbcd0ac53 100644
--- a/engines/freescape/games/castle/dos.cpp
+++ b/engines/freescape/games/castle/dos.cpp
@@ -274,7 +274,7 @@ void CastleEngine::loadAssetsDOSFullGame() {
 				break;
 			case Common::EN_ANY:
 				stream = decryptFile("CMLE");
-				loadRiddles(stream, 0xaae, 11);
+				loadRiddles(stream, 0xaae, 21);
 				break;
 			default:
 				error("Invalid or unsupported language: %x", _language);


Commit: 188ae18562de776d4dc44309e664444977936bf6
    https://github.com/scummvm/scummvm/commit/188ae18562de776d4dc44309e664444977936bf6
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-09-16T20:29:44+02:00

Commit Message:
FREESCAPE: fixes for riddles in castle for dos

Changed paths:
    engines/freescape/games/castle/castle.cpp
    engines/freescape/games/castle/dos.cpp
    engines/freescape/games/castle/zx.cpp


diff --git a/engines/freescape/games/castle/castle.cpp b/engines/freescape/games/castle/castle.cpp
index 2a1ba04a360..1250ea50afb 100644
--- a/engines/freescape/games/castle/castle.cpp
+++ b/engines/freescape/games/castle/castle.cpp
@@ -611,8 +611,8 @@ void CastleEngine::executeDestroy(FCLInstruction &instruction) {
 void CastleEngine::executePrint(FCLInstruction &instruction) {
 	uint16 index = instruction._source;
 	_currentAreaMessages.clear();
-	if (index > 127) {
-		index = index - 127;
+	if (index >= 129) {
+		index = index - 129;
 		drawFullscreenRiddleAndWait(index);
 		return;
 	}
@@ -642,43 +642,40 @@ void CastleEngine::loadAssets() {
 void CastleEngine::loadRiddles(Common::SeekableReadStream *file, int offset, int number) {
 	file->seek(offset);
 	debugC(1, kFreescapeDebugParser, "Riddle table:");
+	int maxLineSize = isSpectrum() ? 20 : 23;
 
-	int numberAsteriskLines = 0;
 	for (int i = 0; i < number; i++) {
-		numberAsteriskLines = 0;
 		int header = file->readByte();
 		debugC(1, kFreescapeDebugParser, "riddle %d header: %x", i, header);
 		int numberLines = 6;
-		if (header == 0x15 || header == 0x1a || header == 0x1c)
+		if (header == 0x15 || header == 0x1a || header == 0x1b || header == 0x1c || header == 0x1e)
 			numberLines = 7;
 		else if (header == 0x1d)
 			numberLines = 6;
 		else if (header == 0x27)
 			numberLines = 5;
 
+		if (isSpectrum())
+			--numberLines;
+
 		for (int j = 0; j < numberLines; j++) {
 			int size = file->readByte();
-			debugC(1, kFreescapeDebugParser, "size: %d (max 23?)", size);
+			debugC(1, kFreescapeDebugParser, "size: %d (max %d?)", size, maxLineSize);
 
 			Common::String message = "";
-			if (size > 23) {
-				debugC(1, kFreescapeDebugParser, "extra byte: %x", file->readByte());
-				debugC(1, kFreescapeDebugParser, "extra byte: %x", file->readByte());
-				_riddleList.push_back("");
-				continue;
-
-			} else if (size == 255) {
-				size = 19;
-				while (size-- > 0)
-					message = message + "*";
+			if (size > maxLineSize) {
+				if (isSpectrum()) {
+					size = 19;
+					while (size-- > 0)
+						message = message + "*";
+				}
+				for (int k = j; k < numberLines; k++)
+					_riddleList.push_back(message);
 
-				_riddleList.push_back(message);
-				debugC(1, kFreescapeDebugParser, "extra byte: %x", file->readByte());
-				debugC(1, kFreescapeDebugParser, "extra byte: %x", file->readByte());
 				debugC(1, kFreescapeDebugParser, "'%s'", message.c_str());
-				continue;
+				break;
 			} else if (size == 0) {
-				size = 21;
+				size = 20;
 			}
 
 			int padSpaces = (22 - size) / 2;
@@ -709,16 +706,6 @@ void CastleEngine::loadRiddles(Common::SeekableReadStream *file, int offset, int
 			debugC(1, kFreescapeDebugParser, "'%s'", message.c_str());
 
 			_riddleList.push_back(message);
-			if (message.size() > 0 && message[0] == '*')
-				numberAsteriskLines++;
-
-			/*if (numberAsteriskLines == 2 && j < 5) {
-
-				_riddleList.push_back("");
-				debugC(1, kFreescapeDebugParser, "Padded with ''");
-				//if (j == 4)
-				//	break;
-			}*/
 		}
 
 		if (numberLines < 7)
diff --git a/engines/freescape/games/castle/dos.cpp b/engines/freescape/games/castle/dos.cpp
index bdfbcd0ac53..3b5a3962fe9 100644
--- a/engines/freescape/games/castle/dos.cpp
+++ b/engines/freescape/games/castle/dos.cpp
@@ -265,6 +265,7 @@ void CastleEngine::loadAssetsDOSFullGame() {
 		switch (_language) {
 			case Common::ES_ESP:
 				stream = decryptFile("CMLS");
+				loadRiddles(stream, 0xaae, 20);
 				break;
 			case Common::FR_FRA:
 				stream = decryptFile("CMLF");
@@ -274,7 +275,7 @@ void CastleEngine::loadAssetsDOSFullGame() {
 				break;
 			case Common::EN_ANY:
 				stream = decryptFile("CMLE");
-				loadRiddles(stream, 0xaae, 21);
+				loadRiddles(stream, 0xaae, 20);
 				break;
 			default:
 				error("Invalid or unsupported language: %x", _language);
diff --git a/engines/freescape/games/castle/zx.cpp b/engines/freescape/games/castle/zx.cpp
index e0f70b0ccb4..b17639b42c7 100644
--- a/engines/freescape/games/castle/zx.cpp
+++ b/engines/freescape/games/castle/zx.cpp
@@ -120,7 +120,7 @@ void CastleEngine::loadAssetsZXFullGame() {
 			loadFonts(&file, 0x1218 + 16, _font);
 			break;
 		case Common::EN_ANY:
-			loadRiddles(&file, 0x1460 - 1 - 3, 8);
+			loadRiddles(&file, 0x145c, 9);
 			load8bitBinary(&file, 0x6a3b, 16);
 			loadSpeakerFxZX(&file, 0xc91, 0xccd);
 			loadFonts(&file, 0x1219, _font);


Commit: 94fceaba06bb344aef1126655107f875e49e6631
    https://github.com/scummvm/scummvm/commit/94fceaba06bb344aef1126655107f875e49e6631
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-09-16T20:29:44+02:00

Commit Message:
FREESCAPE: fixes for riddles in castle for zx

Changed paths:
    engines/freescape/games/castle/castle.cpp
    engines/freescape/games/castle/zx.cpp


diff --git a/engines/freescape/games/castle/castle.cpp b/engines/freescape/games/castle/castle.cpp
index 1250ea50afb..f29076b07c3 100644
--- a/engines/freescape/games/castle/castle.cpp
+++ b/engines/freescape/games/castle/castle.cpp
@@ -648,7 +648,9 @@ void CastleEngine::loadRiddles(Common::SeekableReadStream *file, int offset, int
 		int header = file->readByte();
 		debugC(1, kFreescapeDebugParser, "riddle %d header: %x", i, header);
 		int numberLines = 6;
-		if (header == 0x15 || header == 0x1a || header == 0x1b || header == 0x1c || header == 0x1e)
+		if (header == 0x18)
+			numberLines = 8;
+		else if (header == 0x15 || header == 0x1a || header == 0x1b || header == 0x1c || header == 0x1e)
 			numberLines = 7;
 		else if (header == 0x1d)
 			numberLines = 6;
@@ -663,15 +665,26 @@ void CastleEngine::loadRiddles(Common::SeekableReadStream *file, int offset, int
 			debugC(1, kFreescapeDebugParser, "size: %d (max %d?)", size, maxLineSize);
 
 			Common::String message = "";
-			if (size > maxLineSize) {
-				if (isSpectrum()) {
-					size = 19;
-					while (size-- > 0)
-						message = message + "*";
-				}
+			if (size == 255) {
+				size = 19;
+				while (size-- > 0)
+					message = message + "*";
+
+				//debugC(1, kFreescapeDebugParser, "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);
+				continue;
+			} else if (size > maxLineSize) {
 				for (int k = j; k < numberLines; k++)
 					_riddleList.push_back(message);
 
+				if (isSpectrum()) {
+					debugC(1, kFreescapeDebugParser, "extra byte: %x", file->readByte());
+					debugC(1, kFreescapeDebugParser, "extra byte: %x", file->readByte());
+				}
+
 				debugC(1, kFreescapeDebugParser, "'%s'", message.c_str());
 				break;
 			} else if (size == 0) {
diff --git a/engines/freescape/games/castle/zx.cpp b/engines/freescape/games/castle/zx.cpp
index b17639b42c7..c073b899378 100644
--- a/engines/freescape/games/castle/zx.cpp
+++ b/engines/freescape/games/castle/zx.cpp
@@ -113,7 +113,7 @@ void CastleEngine::loadAssetsZXFullGame() {
 	loadMessagesVariableSize(&file, 0x4bd, 71);
 	switch (_language) {
 		case Common::ES_ESP:
-			loadRiddles(&file, 0xcf0 - 1 - 1 - 1, 8);
+			loadRiddles(&file, 0x1470 - 4, 8);
 			loadMessagesVariableSize(&file, 0xf3d, 71);
 			load8bitBinary(&file, 0x6aab - 2, 16);
 			loadSpeakerFxZX(&file, 0xca0, 0xcdc);
@@ -158,10 +158,10 @@ void CastleEngine::loadAssetsZXFullGame() {
 	_gfx->readFromPalette(6, r, g, b);
 	uint32 yellow = _gfx->_texturePixelFormat.ARGBToColor(0xFF, r, g, b);
 	uint32 black = _gfx->_texturePixelFormat.ARGBToColor(0xFF, 0, 0, 0);
-	_strenghtBackgroundFrame = loadFrameWithHeader(&file, 0xed7, yellow, black);
-	_strenghtBarFrame = loadFrameWithHeader(&file, 0xf63, yellow, black);
+	_strenghtBackgroundFrame = loadFrameWithHeader(&file, _language == Common::ES_ESP ? 0xee6 : 0xed7, yellow, black);
+	_strenghtBarFrame = loadFrameWithHeader(&file, _language == Common::ES_ESP ? 0xf72 : 0xf63, yellow, black);
 
-	_strenghtWeightsFrames = loadFramesWithHeader(&file, 0xf83, 4, yellow, black);
+	_strenghtWeightsFrames = loadFramesWithHeader(&file, _language == Common::ES_ESP ? 0xf92 : 0xf83, 4, yellow, black);
 
 	for (auto &it : _areaMap) {
 		it._value->addStructure(_areaMap[255]);


Commit: 014713440d9c13ec05a1c459827106a9fa61b13c
    https://github.com/scummvm/scummvm/commit/014713440d9c13ec05a1c459827106a9fa61b13c
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-09-16T20:29:44+02:00

Commit Message:
FREESCAPE: fixes for riddles in castle for amiga demo

Changed paths:
    engines/freescape/games/castle/amiga.cpp


diff --git a/engines/freescape/games/castle/amiga.cpp b/engines/freescape/games/castle/amiga.cpp
index 3754cc034d9..ace70465087 100644
--- a/engines/freescape/games/castle/amiga.cpp
+++ b/engines/freescape/games/castle/amiga.cpp
@@ -68,7 +68,7 @@ void CastleEngine::loadAssetsAmigaDemo() {
 
 	_viewArea = Common::Rect(40, 29, 280, 154);
 	loadMessagesVariableSize(&file, 0x8bb2, 178);
-	loadRiddles(&file, 0x96c8, 20);
+	loadRiddles(&file, 0x96c8, 19);
 	load8bitBinary(&file, 0x162a6, 16);
 	loadPalettes(&file, 0x151a6);
 


Commit: c1855a78d13635b6c6716f255a7c399c9bf05932
    https://github.com/scummvm/scummvm/commit/c1855a78d13635b6c6716f255a7c399c9bf05932
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-09-16T20:29:44+02:00

Commit Message:
FREESCAPE: simplified and improved handling of group operations

Changed paths:
    engines/freescape/objects/group.cpp


diff --git a/engines/freescape/objects/group.cpp b/engines/freescape/objects/group.cpp
index ff224b16f34..b73567afa85 100644
--- a/engines/freescape/objects/group.cpp
+++ b/engines/freescape/objects/group.cpp
@@ -109,37 +109,35 @@ void Group::run() {
 	} else if (opcode == 0x01) {
 		debugC(1, kFreescapeDebugCode, "Executing group condition %s", _operations[_step]->conditionSource.c_str());
 		g_freescape->executeCode(_operations[_step]->condition, false, true, false, false);
-	} else if (opcode == 0x04) {
-		debugC(1, kFreescapeDebugCode, "Ignoring unknown opcode 0x04");
 	} else if (opcode == 0x10) {
 		uint32 groupSize = _objects.size();
 		for (uint32 i = 0; i < groupSize ; i++)
 			assemble(i);
 		_active = false;
 		_step++;
-	} else if (opcode == 0x58) {
-		debugC(1, kFreescapeDebugCode, "Ignoring unknown opcode 0x58");
-	} else if (opcode == 0x48) {
-		// TODO: not sure the difference with 0x6e
-		uint32 groupSize = _objects.size();
-		for (uint32 i = 0; i < groupSize ; i++)
-			_objects[i]->makeInvisible();
-	} else if (opcode == 0x6e) {
-		uint32 groupSize = _objects.size();
-		for (uint32 i = 0; i < groupSize ; i++)
-			_objects[i]->makeInvisible();
-	} else if (opcode == 0x6c) {
-		debugC(1, kFreescapeDebugCode, "Ignoring unknown opcode 0x6c");
-	} else if (opcode == 0x68) {
-		debugC(1, kFreescapeDebugCode, "Ignoring unknown opcode 0x68");
 	} else if (opcode == 0x0) {
 		debugC(1, kFreescapeDebugCode, "Executing group assemble");
 		uint32 groupSize = _objects.size();
 		for (uint32 i = 0; i < groupSize ; i++)
 			assemble(i);
 	} else {
-		debug("Unknown opcode 0x%x", opcode);
-		assert(0);
+		uint32 groupSize = _objects.size();
+		if (opcode & 0x08) {
+			for (uint32 i = 0; i < groupSize ; i++)
+				_objects[i]->makeVisible();
+
+			if (opcode & 0x20) {
+				for (uint32 i = 0; i < groupSize ; i++)
+					_objects[i]->makeInvisible();
+
+			}
+
+			if (opcode & 0x40) {
+				for (uint32 i = 0; i < groupSize ; i++)
+					_objects[i]->destroy();
+			}
+		}
+
 	}
 }
 




More information about the Scummvm-git-logs mailing list