aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/mohawk/riven_scripts.cpp87
-rw-r--r--engines/mohawk/riven_scripts.h26
2 files changed, 80 insertions, 33 deletions
diff --git a/engines/mohawk/riven_scripts.cpp b/engines/mohawk/riven_scripts.cpp
index 67a56af1af..6c744fca41 100644
--- a/engines/mohawk/riven_scripts.cpp
+++ b/engines/mohawk/riven_scripts.cpp
@@ -66,10 +66,13 @@ RivenScriptPtr RivenScriptManager::readScript(Common::ReadStream *stream) {
RivenCommand *RivenScriptManager::readCommand(Common::ReadStream *stream) {
uint16 type = stream->readUint16BE();
- if (type == 8) {
- return RivenSwitchCommand::createFromStream(_vm, type, stream);
- } else {
- return RivenSimpleCommand::createFromStream(_vm, type, stream);
+ switch (type) {
+ case 8:
+ return RivenSwitchCommand::createFromStream(_vm, type, stream);
+ case 27:
+ return RivenStackChangeCommand::createFromStream(_vm, type, stream);
+ default:
+ return RivenSimpleCommand::createFromStream(_vm, type, stream);
}
}
@@ -267,7 +270,7 @@ void RivenSimpleCommand::setupOpcodes() {
OPCODE(empty), // Complex animation (not used)
OPCODE(setVariable),
// 0x08 (8 decimal)
- OPCODE(mohawkSwitch),
+ OPCODE(empty), // Not a SimpleCommand
OPCODE(enableHotspot),
OPCODE(disableHotspot),
OPCODE(empty), // Empty
@@ -290,7 +293,7 @@ void RivenSimpleCommand::setupOpcodes() {
OPCODE(incrementVariable),
OPCODE(empty), // Empty
OPCODE(empty), // Empty
- OPCODE(changeStack),
+ OPCODE(empty), // Not a SimpleCommand
// 0x1C (28 decimal)
OPCODE(disableMovie),
OPCODE(disableAllMovies),
@@ -385,11 +388,6 @@ void RivenSimpleCommand::setVariable(uint16 op, uint16 argc, uint16 *argv) {
_vm->getStackVar(argv[0]) = argv[1];
}
-// Command 8: conditional branch
-void RivenSimpleCommand::mohawkSwitch(uint16 op, uint16 argc, uint16 *argv) {
- // dummy function, this opcode does logic checking in processCommands()
-}
-
// Command 9: enable hotspot (blst_id)
void RivenSimpleCommand::enableHotspot(uint16 op, uint16 argc, uint16 *argv) {
RivenHotspot *hotspot = _vm->getCard()->getHotspotByBlstId(argv[0]);
@@ -488,26 +486,6 @@ void RivenSimpleCommand::incrementVariable(uint16 op, uint16 argc, uint16 *argv)
_vm->getStackVar(argv[0]) += argv[1];
}
-// Command 27: go to stack (stack name, code high, code low)
-void RivenSimpleCommand::changeStack(uint16 op, uint16 argc, uint16 *argv) {
- Common::String stackName = _vm->getStack()->getName(kStackNames, argv[0]);
- int8 index = -1;
-
- for (byte i = 0; i < 8; i++)
- if (_vm->getStackName(i).equalsIgnoreCase(stackName)) {
- index = i;
- break;
- }
-
- if (index == -1)
- error ("'%s' is not a stack name!", stackName.c_str());
-
- _vm->changeToStack(index);
- uint32 rmapCode = (argv[1] << 16) + argv[2];
- uint16 cardID = _vm->getStack()->getCardStackId(rmapCode);
- _vm->changeToCard(cardID);
-}
-
// Command 28: disable a movie
void RivenSimpleCommand::disableMovie(uint16 op, uint16 argc, uint16 *argv) {
VideoEntryPtr video = _vm->_video->findVideoRiven(argv[0]);
@@ -767,4 +745,51 @@ void RivenSwitchCommand::execute() {
}
}
+RivenStackChangeCommand::RivenStackChangeCommand(MohawkEngine_Riven *vm, uint16 stackId, uint32 globalCardId, bool byStackId) :
+ RivenCommand(vm),
+ _stackId(stackId),
+ _cardId(globalCardId),
+ _byStackId(byStackId) {
+
+}
+
+RivenStackChangeCommand::~RivenStackChangeCommand() {
+
+}
+
+RivenStackChangeCommand *RivenStackChangeCommand::createFromStream(MohawkEngine_Riven *vm, int type, Common::ReadStream *stream) {
+ /* argumentsSize = */ stream->readUint16BE();
+ uint16 stackId = stream->readUint16BE();
+ uint32 globalCardId = stream->readUint32BE();
+
+ return new RivenStackChangeCommand(vm, stackId, globalCardId, false);
+}
+
+void RivenStackChangeCommand::execute() {
+ int16 stackID = -1;
+ if (_byStackId) {
+ stackID = _stackId;
+ } else {
+ Common::String stackName = _vm->getStack()->getName(kStackNames, _stackId);
+
+ for (byte i = kStackFirst; i < kStackLast; i++)
+ if (_vm->getStackName(i).equalsIgnoreCase(stackName)) {
+ stackID = i;
+ break;
+ }
+
+ if (stackID == -1)
+ error ("'%s' is not a stack name!", stackName.c_str());
+ }
+
+ _vm->changeToStack(stackID);
+ uint16 cardID = _vm->getStack()->getCardStackId(_cardId);
+ _vm->changeToCard(cardID);
+}
+
+void RivenStackChangeCommand::dump(byte tabs) {
+ printTabs(tabs);
+ debugN("changeStack(%d, %d);\n", _stackId, _cardId);
+}
+
} // End of namespace Mohawk
diff --git a/engines/mohawk/riven_scripts.h b/engines/mohawk/riven_scripts.h
index cac7955612..13c415b850 100644
--- a/engines/mohawk/riven_scripts.h
+++ b/engines/mohawk/riven_scripts.h
@@ -222,7 +222,6 @@ private:
DECLARE_OPCODE(playScriptSLST);
DECLARE_OPCODE(playSound);
DECLARE_OPCODE(setVariable);
- DECLARE_OPCODE(mohawkSwitch);
DECLARE_OPCODE(enableHotspot);
DECLARE_OPCODE(disableHotspot);
DECLARE_OPCODE(stopSound);
@@ -234,7 +233,6 @@ private:
DECLARE_OPCODE(beginScreenUpdate);
DECLARE_OPCODE(applyScreenUpdate);
DECLARE_OPCODE(incrementVariable);
- DECLARE_OPCODE(changeStack);
DECLARE_OPCODE(disableMovie);
DECLARE_OPCODE(disableAllMovies);
DECLARE_OPCODE(enableMovie);
@@ -287,6 +285,30 @@ private:
Common::Array<Branch> _branches;
};
+/**
+ * A command to go to a different stack
+ *
+ * Changes the active stack and sets the initial card.
+ * The stack can be specified by global id or name id in the initial stack.
+ * The destination card must be specified by global id.
+ */
+class RivenStackChangeCommand : public RivenCommand {
+public:
+ RivenStackChangeCommand(MohawkEngine_Riven *vm, uint16 stackId, uint32 globalCardId, bool byStackId);
+
+ static RivenStackChangeCommand *createFromStream(MohawkEngine_Riven *vm, int type, Common::ReadStream *stream);
+ virtual ~RivenStackChangeCommand();
+
+ // RivenCommand API
+ virtual void dump(byte tabs) override;
+ virtual void execute() override;
+
+private:
+ uint16 _stackId;
+ uint32 _cardId;
+ bool _byStackId; // Otherwise by stack name id
+};
+
} // End of namespace Mohawk
#undef DECLARE_OPCODE