[Scummvm-git-logs] scummvm master -> 7c0b4971d3f321465ebafc7ba86a15ab1fa021c2
mduggan
noreply at scummvm.org
Tue Jul 9 11:39:40 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:
7c0b4971d3 DGDS: Willy Beamish loading improvements
Commit: 7c0b4971d3f321465ebafc7ba86a15ab1fa021c2
https://github.com/scummvm/scummvm/commit/7c0b4971d3f321465ebafc7ba86a15ab1fa021c2
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2024-07-09T21:38:55+10:00
Commit Message:
DGDS: Willy Beamish loading improvements
* Add support for new type of op in Willy Beamish scene data
* Flesh out the game globals
Changed paths:
engines/dgds/globals.cpp
engines/dgds/globals.h
engines/dgds/scene.cpp
engines/dgds/scene.h
diff --git a/engines/dgds/globals.cpp b/engines/dgds/globals.cpp
index 29d7d2e2acc..65417380f53 100644
--- a/engines/dgds/globals.cpp
+++ b/engines/dgds/globals.cpp
@@ -255,17 +255,38 @@ Common::Error HocGlobals::syncState(Common::Serializer &s) {
}
WillyGlobals::WillyGlobals(Clock &clock) : Globals(clock),
- _unk2(0), _unk5(0), _unk81(0) {
+ _unk2(4), _unk3(0), _unk4(0), _unk5(0), _unk74(0), _unk75(300),
+ _unk77(255), _unk78(0), _unk79(0), _unk80(0), _unk81(3), _unk82(1) {
+ _globals.push_back(new DetailLevelROGlobal(0x53));
+ _globals.push_back(new RWI16Global(0x52, &_unk82));
_globals.push_back(new RWI16Global(0x51, &_unk81));
+ _globals.push_back(new RWI16Global(0x50, &_unk80));
+ _globals.push_back(new RWI16Global(0x4F, &_unk79));
+ _globals.push_back(new RWI16Global(0x4E, &_unk78));
+ _globals.push_back(new RWI16Global(0x4D, &_unk77));
+ _globals.push_back(new RWI16Global(0x4C, &_unk77)); // TODO: Special set function 1833:665e. Same variable as 0x4D.
+ _globals.push_back(new RWI16Global(0x4B, &_unk75));
+ _globals.push_back(new RWI16Global(0x4A, &_unk74));
_globals.push_back(new RWI16Global(0x05, &_unk5));
- _globals.push_back(new RWI16Global(0x02, &_unk2));
+ _globals.push_back(new RWI16Global(0x04, &_unk4));
+ _globals.push_back(new RWI16Global(0x03, &_unk3));
+ _globals.push_back(new RWI16Global(0x02, &_unk2)); // TODO: Special set function 1574:06ca
}
Common::Error WillyGlobals::syncState(Common::Serializer &s) {
Globals::syncState(s);
s.syncAsSint16LE(_unk2);
+ s.syncAsSint16LE(_unk3);
+ s.syncAsSint16LE(_unk4);
s.syncAsSint16LE(_unk5);
+ s.syncAsSint16LE(_unk74);
+ s.syncAsSint16LE(_unk75);
+ s.syncAsSint16LE(_unk77);
+ s.syncAsSint16LE(_unk78);
+ s.syncAsSint16LE(_unk79);
+ s.syncAsSint16LE(_unk80);
s.syncAsSint16LE(_unk81);
+ s.syncAsSint16LE(_unk82);
return Common::kNoError;
}
diff --git a/engines/dgds/globals.h b/engines/dgds/globals.h
index eba7aa16107..4c600b3bc1f 100644
--- a/engines/dgds/globals.h
+++ b/engines/dgds/globals.h
@@ -180,8 +180,17 @@ public:
private:
// Willy-specific globals
int16 _unk2;
+ int16 _unk3;
+ int16 _unk4;
int16 _unk5;
+ int16 _unk74;
+ int16 _unk75;
+ int16 _unk77;
+ int16 _unk78;
+ int16 _unk79;
+ int16 _unk80;
int16 _unk81;
+ int16 _unk82;
Common::Error syncState(Common::Serializer &s) override;
};
diff --git a/engines/dgds/scene.cpp b/engines/dgds/scene.cpp
index 563504f4ab5..016028672e7 100644
--- a/engines/dgds/scene.cpp
+++ b/engines/dgds/scene.cpp
@@ -362,7 +362,7 @@ bool Scene::readOpList(Common::SeekableReadStream *s, Common::Array<SceneOp> &li
for (SceneOp &dst : list) {
readConditionList(s, dst._conditionList);
dst._opCode = static_cast<SceneOpCode>(s->readUint16LE());
- if (dst._opCode > kSceneOpMaxCode || dst._opCode == kSceneOpNone)
+ if ((dst._opCode & 0x7fff) > kSceneOpMaxCode || dst._opCode == kSceneOpNone)
error("Unexpected scene opcode %d", (int)dst._opCode);
uint16 nvals = s->readUint16LE();
_checkListNotTooLong(nvals, "scene op args");
@@ -464,6 +464,19 @@ bool Scene::readTriggerList(Common::SeekableReadStream *s, Common::Array<SceneTr
return !s->err();
}
+bool Scene::readConditionalSceneOpList(Common::SeekableReadStream *s, Common::Array<ConditionalSceneOp> &list) const {
+ uint16 num = s->readUint16LE();
+ _checkListNotTooLong(num, "conditional scene ops");
+ list.resize(num);
+
+ for (ConditionalSceneOp &dst : list) {
+ dst._opCode = s->readUint16LE();
+ readConditionList(s, dst._conditionList);
+ readOpList(s, dst._opList);
+ }
+ return !s->err();
+}
+
bool Scene::readDialogActionList(Common::SeekableReadStream *s, Common::Array<DialogAction> &list) const {
uint16 num = s->readUint16LE();
@@ -755,6 +768,16 @@ bool Scene::runChinaOp(const SceneOp &op) {
bool Scene::runBeamishOp(const SceneOp &op) {
DgdsEngine *engine = static_cast<DgdsEngine *>(g_engine);
+ if (op._opCode & 0x8000) {
+ uint16 opcode = op._opCode & 0x7fff;
+ for (const ConditionalSceneOp &op : _conditionalOps) {
+ if (op._opCode == opcode && checkConditions(op._conditionList)) {
+ if (!runOps(op._opList))
+ return false;
+ }
+ }
+ return true;
+ }
switch (op._opCode) {
case kSceneOpOpenBeamishOpenSkipCreditsMenu:
engine->setMenuToTrigger(kMenuBeamishSkipCredits);
@@ -927,6 +950,7 @@ bool SDSScene::parse(Common::SeekableReadStream *stream) {
readTriggerList(stream, _triggers);
}
if (isVersionOver(" 1.223")) {
+ readConditionalSceneOpList(stream, _conditionalOps);
warning("TODO: SDSScene::parse read another list here for version %s", _version.c_str());
}
@@ -2043,7 +2067,7 @@ int16 GDSScene::setGlobal(uint16 num, int16 val) {
// This looks like a script bug, set it anyway
warning("setGlobal: scene global %d is not in scene %d", num, curSceneNum);
global._val = val;
- return val;
+ return val;
}
}
Globals *gameGlobals = engine->getGameGlobals();
diff --git a/engines/dgds/scene.h b/engines/dgds/scene.h
index fb68d628cf7..75665e1ab2a 100644
--- a/engines/dgds/scene.h
+++ b/engines/dgds/scene.h
@@ -145,6 +145,15 @@ public:
Common::String dump(const Common::String &indent) const;
};
+class ConditionalSceneOp {
+public:
+ uint _opCode;
+ Common::Array<SceneConditions> _conditionList;
+ Common::Array<SceneOp> _opList;
+
+ Common::String dump(const Common::String &indent) const;
+};
+
class GameItem : public HotArea {
public:
Common::Array<SceneOp> onDragFinishedOps;
@@ -311,6 +320,7 @@ protected:
bool readDialogList(Common::SeekableReadStream *s, Common::Array<Dialog> &list, int16 filenum = 0) const;
bool readTriggerList(Common::SeekableReadStream *s, Common::Array<SceneTrigger> &list) const;
bool readDialogActionList(Common::SeekableReadStream *s, Common::Array<DialogAction> &list) const;
+ bool readConditionalSceneOpList(Common::SeekableReadStream *s, Common::Array<ConditionalSceneOp> &list) const;
bool checkConditions(const Common::Array<SceneConditions> &cond) const;
@@ -334,6 +344,7 @@ protected:
Common::Array<SceneOp> _preTickOps;
Common::Array<SceneOp> _postTickOps;
+ Common::Array<ConditionalSceneOp> _conditionalOps; // Beamish only
};
More information about the Scummvm-git-logs
mailing list