[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