[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