[Scummvm-git-logs] scummvm master -> 9b5c57100d965688657a85e38026e6dcf8f4d4d5

neuromancer noreply at scummvm.org
Sun May 21 09:02:57 UTC 2023


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

Summary:
37b6e9fb02 FREESCAPE: added start animation opcode
1362dfe76e FREESCAPE: improved parsing of castle demo for amiga
9b5c57100d FREESCAPE: improved parsing of castle demo for amiga


Commit: 37b6e9fb02e2782521caf73999c682c4106fd17c
    https://github.com/scummvm/scummvm/commit/37b6e9fb02e2782521caf73999c682c4106fd17c
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-05-21T10:32:20+02:00

Commit Message:
FREESCAPE: added start animation opcode

Changed paths:
    engines/freescape/language/8bitDetokeniser.cpp


diff --git a/engines/freescape/language/8bitDetokeniser.cpp b/engines/freescape/language/8bitDetokeniser.cpp
index e74d4182fef..2fc96f03c9c 100644
--- a/engines/freescape/language/8bitDetokeniser.cpp
+++ b/engines/freescape/language/8bitDetokeniser.cpp
@@ -50,7 +50,7 @@ Common::String detokenise8bitCondition(Common::Array<uint8> &tokenisedCondition,
 		 2, 1, 1, 2, 1, 1, 2, 1,
 		 1, 2, 2, 1, 2, 0, 0, 0,
 		 1, 1, 0, 1, 1, 1, 1, 1,
-		 2, 2, 1, 1, 0, 0, 0, 0,
+		 2, 2, 1, 1, 0, 1, 0, 0,
 		 0, 0, 0, 0, 0, 0, 2, 2,
 		 1};
 
@@ -115,7 +115,7 @@ Common::String detokenise8bitCondition(Common::Array<uint8> &tokenisedCondition,
 		// check we have enough bytes left to read
 		if (opcode > 48) {
 			debugC(1, kFreescapeDebugParser, "%s", detokenisedStream.c_str());
-			if (opcode != 0x3f && opcode != 0x3b)
+			if (opcode != 0x3f)
 				error("ERROR: failed to read opcode: %x", opcode);
 			break;
 		}
@@ -304,6 +304,11 @@ Common::String detokenise8bitCondition(Common::Array<uint8> &tokenisedCondition,
 			currentInstruction = FCLInstruction(Token::PRINT);
 			break;
 
+		case 37:
+			detokenisedStream += "STARTANIM (";
+			currentInstruction = FCLInstruction(Token::STARTANIM);
+			break;
+
 		case 12:
 			detokenisedStream += "SETBIT (";
 			currentInstruction = FCLInstruction(Token::SETBIT);


Commit: 1362dfe76e13f232fa3b3a8b34d4d528ef101910
    https://github.com/scummvm/scummvm/commit/1362dfe76e13f232fa3b3a8b34d4d528ef101910
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-05-21T10:32:20+02:00

Commit Message:
FREESCAPE: improved parsing of castle demo for amiga

Changed paths:
    engines/freescape/games/castle.cpp
    engines/freescape/games/palettes.cpp
    engines/freescape/loaders/8bitBinaryLoader.cpp
    engines/freescape/sound.cpp


diff --git a/engines/freescape/games/castle.cpp b/engines/freescape/games/castle.cpp
index 4165ee42b2c..07c885f1abd 100644
--- a/engines/freescape/games/castle.cpp
+++ b/engines/freescape/games/castle.cpp
@@ -35,6 +35,7 @@ CastleEngine::CastleEngine(OSystem *syst, const ADGameDescription *gd) : Freesca
 
 	_playerWidth = 8;
 	_playerDepth = 8;
+	_option = nullptr;
 }
 
 CastleEngine::~CastleEngine() {
@@ -290,9 +291,7 @@ void CastleEngine::loadAssetsAmigaDemo() {
 
 	loadMessagesVariableSize(&file, 0x8bb2, 164);
 	load8bitBinary(&file, 0x162a6, 16);
-	assert(0);
-	//loadPalettes(&file, 0x0);
-
+	loadPalettes(&file, 0x151a6);
 	//file.close();
 	//file.open("driller");
 	//if (!file.isOpen())
diff --git a/engines/freescape/games/palettes.cpp b/engines/freescape/games/palettes.cpp
index f66b90ed5af..ee93a325dd1 100644
--- a/engines/freescape/games/palettes.cpp
+++ b/engines/freescape/games/palettes.cpp
@@ -136,7 +136,7 @@ void FreescapeEngine::loadPalettes(Common::SeekableReadStream *file, int offset)
 	for (uint i = 0; i < _areaMap.size() + 2; i++) {
 		int label = readField(file, 8);
 		auto palette = new byte[16][3];
-		debugC(1, kFreescapeDebugParser, "Loading palette for area: %d", label);
+		debugC(1, kFreescapeDebugParser, "Loading palette for area: %d at %lx", label, file->pos());
 		for (int c = 0; c < 16; c++) {
 			int v = file->readUint16BE();
 			r = (v & 0xf00) >> 8;
@@ -212,9 +212,6 @@ byte kDrillerCGAPaletteRedGreenData[4][3] = {
 };
 
 void FreescapeEngine::swapPalette(uint16 levelID) {
-	if (!_border)
-		return;
-
 	if (isAmiga() || isAtariST()) {
 		// The following palette was not available in the demo, so we select another one
 		if (isDemo() && levelID == 32)
@@ -226,6 +223,9 @@ void FreescapeEngine::swapPalette(uint16 levelID) {
 		_gfx->_paperColor = _areaMap[levelID]->_paperColor;
 		_gfx->_underFireBackgroundColor = _areaMap[levelID]->_underFireBackgroundColor;
 
+		if (!_border)
+			return;
+
 		byte *palette = (byte *)malloc(sizeof(byte) * 4 * 3);
 		for (int c = 0; c < 4; c++) {
 			byte r, g, b;
@@ -253,9 +253,14 @@ void FreescapeEngine::swapPalette(uint16 levelID) {
 		}
 
 		assert(entry->areaId == levelID);
+		if (!_border)
+			return;
 		_border->setPalette(_gfx->_palette, 0, 4);
 		processBorder();
 	} else if (isDOS() && _renderMode == Common::kRenderEGA) {
+		if (!_border)
+			return;
+
 		_border->setPalette(_gfx->_palette, 0, 4);
 		processBorder();
 	}
diff --git a/engines/freescape/loaders/8bitBinaryLoader.cpp b/engines/freescape/loaders/8bitBinaryLoader.cpp
index a6289e30f35..3e8574cad41 100644
--- a/engines/freescape/loaders/8bitBinaryLoader.cpp
+++ b/engines/freescape/loaders/8bitBinaryLoader.cpp
@@ -99,6 +99,13 @@ Object *FreescapeEngine::load8bitObject(Common::SeekableReadStream *file) {
 		error("Not enough bytes %d to read object %d with type %d", byteSizeOfObject, objectID, objectType);
 	}
 
+	if (objectType > ObjectType::kGroupType && isDemo()) {
+		// Castle DOS demo has an invalid object, which should not be parsed.
+		debugC(1, kFreescapeDebugParser, "WARNING: invalid object %d!", objectID);
+		readArray(file, byteSizeOfObject - 9);
+		return nullptr;
+	}
+
 	assert(byteSizeOfObject >= 9);
 	byteSizeOfObject = byteSizeOfObject - 9;
 	if (objectID == 255 && objectType == ObjectType::kEntranceType) {
@@ -114,7 +121,7 @@ Object *FreescapeEngine::load8bitObject(Common::SeekableReadStream *file) {
 
 		byteSizeOfObject++;
 		while(--byteSizeOfObject > 0)
-			structureArray.push_back(file->readByte());
+			structureArray.push_back(readField(file, 8));
 		return new GlobalStructure(structureArray);
 	} else if (objectID == 254 && objectType == ObjectType::kEntranceType) {
 		debugC(1, kFreescapeDebugParser, "Found the area connections (objectID: 254 with size %d)", byteSizeOfObject + 6);
@@ -288,7 +295,7 @@ Object *FreescapeEngine::load8bitObject(Common::SeekableReadStream *file) {
 
 		byteSizeOfObject++;
 		while(--byteSizeOfObject > 0)
-			groupDataArray.push_back(file->readByte());
+			groupDataArray.push_back(readField(file, 8));
 
 		return new Group(
 			objectID,
@@ -516,7 +523,7 @@ Area *FreescapeEngine::load8bitArea(Common::SeekableReadStream *file, uint16 nco
 					error("WARNING: replacing object id %d", newObject->getObjectID());
 				(*objectsByID)[newObject->getObjectID()] = newObject;
 			}
-		} else
+		} else if (!(isDemo() && isCastle()))
 			error("Failed to read an object!");
 	}
 	long int endLastObject = file->pos();
@@ -570,8 +577,13 @@ void FreescapeEngine::load8bitBinary(Common::SeekableReadStream *file, int offse
 	uint8 numberOfAreas = readField(file, 8);
 	debugC(1, kFreescapeDebugParser, "Number of areas: %d", numberOfAreas);
 
-	if (isDOS() && isCastle()) // Castle Master for DOS has an invalid number of areas
-		numberOfAreas = isDemo() ? 31 : 104;
+	// Castle Master seems to have invalid number of areas?
+	if (isCastle()) {
+		if (isDOS())
+			numberOfAreas = isDemo() ? 31 : 104;
+		else if (isAmiga())
+			numberOfAreas = isDemo() ? 86 : 104;
+	}
 
 	uint32 dbSize = readField(file, 16);
 	debugC(1, kFreescapeDebugParser, "Database ends at %x", dbSize);
diff --git a/engines/freescape/sound.cpp b/engines/freescape/sound.cpp
index f7be53a0b29..053d9668f72 100644
--- a/engines/freescape/sound.cpp
+++ b/engines/freescape/sound.cpp
@@ -239,6 +239,11 @@ void FreescapeEngine::playMusic(const Common::String filename) {
 }
 
 void FreescapeEngine::playSoundFx(int index, bool sync) {
+	if (_soundsFx.size() == 0) {
+		debugC(1, kFreescapeDebugMedia, "WARNING: Sounds are not loaded");
+		return;
+	}
+
 	int size = _soundsFx[index]->size;
 	int sampleRate = _soundsFx[index]->sampleRate;
 	byte *data = _soundsFx[index]->data;


Commit: 9b5c57100d965688657a85e38026e6dcf8f4d4d5
    https://github.com/scummvm/scummvm/commit/9b5c57100d965688657a85e38026e6dcf8f4d4d5
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-05-21T10:32:20+02:00

Commit Message:
FREESCAPE: improved parsing of castle demo for amiga

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


diff --git a/engines/freescape/games/castle.cpp b/engines/freescape/games/castle.cpp
index 07c885f1abd..d934042c997 100644
--- a/engines/freescape/games/castle.cpp
+++ b/engines/freescape/games/castle.cpp
@@ -292,21 +292,17 @@ void CastleEngine::loadAssetsAmigaDemo() {
 	loadMessagesVariableSize(&file, 0x8bb2, 164);
 	load8bitBinary(&file, 0x162a6, 16);
 	loadPalettes(&file, 0x151a6);
-	//file.close();
-	//file.open("driller");
-	//if (!file.isOpen())
-	//	error("Failed to open 'driller' file");
-
-	//loadFonts(&file, 0xa30);
-	//loadMessagesFixedSize(&file, 0x3960, 14, 20);
-	//loadGlobalObjects(&file, 0x3716, 8);
 
+	file.seek(0x2be96); // Area 255
+	_areaMap[255] = load8bitArea(&file, 16);
 	file.close();
-	//file.open("soundfx");
-	//if (!file.isOpen())
-	//	error("Failed to open 'soundfx' executable for Amiga");
 
-	//loadSoundsFx(&file, 0, 25);
+
+	_areaMap[2]->_groundColor = 1;
+	for (auto &it : _areaMap)
+		it._value->addStructure(_areaMap[255]);
+
+	_areaMap[2]->addFloor();
 }
 
 
diff --git a/engines/freescape/loaders/8bitBinaryLoader.cpp b/engines/freescape/loaders/8bitBinaryLoader.cpp
index 3e8574cad41..b6db29dbcec 100644
--- a/engines/freescape/loaders/8bitBinaryLoader.cpp
+++ b/engines/freescape/loaders/8bitBinaryLoader.cpp
@@ -491,7 +491,10 @@ Area *FreescapeEngine::load8bitArea(Common::SeekableReadStream *file, uint16 nco
 		}
 	} else if (isCastle()) {
 		byte idx = readField(file, 8);
-		name = _messagesList[idx + 41];
+		if (isAmiga())
+			name = _messagesList[idx + 51];
+		else
+			name = _messagesList[idx + 41];
 		extraColor[0] = readField(file, 8);
 		extraColor[1] = readField(file, 8);
 		extraColor[2] = readField(file, 8);
@@ -582,7 +585,7 @@ void FreescapeEngine::load8bitBinary(Common::SeekableReadStream *file, int offse
 		if (isDOS())
 			numberOfAreas = isDemo() ? 31 : 104;
 		else if (isAmiga())
-			numberOfAreas = isDemo() ? 86 : 104;
+			numberOfAreas = isDemo() ? 87 : 104;
 	}
 
 	uint32 dbSize = readField(file, 16);




More information about the Scummvm-git-logs mailing list