[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