aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjohndoe1232014-04-02 10:53:40 +0200
committerEugene Sandulenko2018-07-20 06:43:33 +0000
commit8d7d6599b9bc29152cbccbcec6b2e25b66272715 (patch)
treef8c0edc525b3429911463405bac7cc7171a42148
parent7dc8533f730645e7177bbdc4d214664d82856963 (diff)
downloadscummvm-rg350-8d7d6599b9bc29152cbccbcec6b2e25b66272715.tar.gz
scummvm-rg350-8d7d6599b9bc29152cbccbcec6b2e25b66272715.tar.bz2
scummvm-rg350-8d7d6599b9bc29152cbccbcec6b2e25b66272715.zip
ILLUSIONS: Fix special code functions thread notifying (used wrong thread value)
- Add more script and sequence opcodes
-rw-r--r--engines/illusions/bbdou/bbdou_specialcode.cpp69
-rw-r--r--engines/illusions/bbdou/bbdou_specialcode.h11
-rw-r--r--engines/illusions/scriptopcodes.cpp16
-rw-r--r--engines/illusions/scriptopcodes.h1
-rw-r--r--engines/illusions/sequenceopcodes.cpp8
-rw-r--r--engines/illusions/sequenceopcodes.h1
-rw-r--r--engines/illusions/talkthread.cpp5
-rw-r--r--engines/illusions/thread.cpp2
8 files changed, 97 insertions, 16 deletions
diff --git a/engines/illusions/bbdou/bbdou_specialcode.cpp b/engines/illusions/bbdou/bbdou_specialcode.cpp
index a3a3149e03..f4c23bb97a 100644
--- a/engines/illusions/bbdou/bbdou_specialcode.cpp
+++ b/engines/illusions/bbdou/bbdou_specialcode.cpp
@@ -105,6 +105,8 @@ void BbdouSpecialCode::init() {
SPECIAL(0x0016001E, spcRemoveInventoryItem);
SPECIAL(0x0016001F, spcHasInventoryItem);
SPECIAL(0x00160025, spcCloseInventory);
+ SPECIAL(0x00160037, spcIsCursorHoldingObjectId);
+ SPECIAL(0x0016003A, spcSaladCtl);
}
void BbdouSpecialCode::run(uint32 specialCodeId, OpCall &opCall) {
@@ -113,7 +115,7 @@ void BbdouSpecialCode::run(uint32 specialCodeId, OpCall &opCall) {
(*(*it)._value)(opCall);
} else {
debug("BbdouSpecialCode::run() Unimplemented special code %08X", specialCodeId);
- _vm->notifyThreadId(opCall._callerThreadId);
+ _vm->notifyThreadId(opCall._threadId);
}
}
@@ -129,19 +131,19 @@ void BbdouSpecialCode::spcInitCursor(OpCall &opCall) {
ARG_UINT32(progResKeywordId);
_cursor->init(objectId, progResKeywordId);
setCursorControlRoutine(objectId, 0);
- _vm->notifyThreadId(opCall._callerThreadId);
+ _vm->notifyThreadId(opCall._threadId);
}
void BbdouSpecialCode::spcEnableCursor(OpCall &opCall) {
ARG_UINT32(objectId);
_cursor->enable(objectId);
- _vm->notifyThreadId(opCall._callerThreadId);
+ _vm->notifyThreadId(opCall._threadId);
}
void BbdouSpecialCode::spcDisableCursor(OpCall &opCall) {
ARG_UINT32(objectId);
_cursor->disable(objectId);
- _vm->notifyThreadId(opCall._callerThreadId);
+ _vm->notifyThreadId(opCall._threadId);
}
void BbdouSpecialCode::spcAddCursorSequence(OpCall &opCall) {
@@ -149,7 +151,7 @@ void BbdouSpecialCode::spcAddCursorSequence(OpCall &opCall) {
ARG_UINT32(objectId);
ARG_UINT32(sequenceId);
_cursor->addCursorSequence(objectId, sequenceId);
- _vm->notifyThreadId(opCall._callerThreadId);
+ _vm->notifyThreadId(opCall._threadId);
}
void BbdouSpecialCode::spcCursorStartHoldingObjectId(OpCall &opCall) {
@@ -157,7 +159,7 @@ void BbdouSpecialCode::spcCursorStartHoldingObjectId(OpCall &opCall) {
ARG_UINT32(holdingObjectId);
ARG_INT16(doPlaySound);
startHoldingObjectId(objectId, holdingObjectId, doPlaySound != 0);
- _vm->notifyThreadId(opCall._callerThreadId);
+ _vm->notifyThreadId(opCall._threadId);
}
void BbdouSpecialCode::spcCursorStopHoldingObjectId(OpCall &opCall) {
@@ -165,12 +167,12 @@ void BbdouSpecialCode::spcCursorStopHoldingObjectId(OpCall &opCall) {
ARG_INT16(doPlaySound);
stopHoldingObjectId(objectId, doPlaySound != 0);
_cursor->_data._mode = 1;
- _vm->notifyThreadId(opCall._callerThreadId);
+ _vm->notifyThreadId(opCall._threadId);
}
void BbdouSpecialCode::spcInitBubble(OpCall &opCall) {
_bubble->init();
- _vm->notifyThreadId(opCall._callerThreadId);
+ _vm->notifyThreadId(opCall._threadId);
}
void BbdouSpecialCode::spcSetupBubble(OpCall &opCall) {
@@ -181,7 +183,7 @@ void BbdouSpecialCode::spcSetupBubble(OpCall &opCall) {
ARG_INT16(count);
_bubble->addItem0(sequenceId1, sequenceId2, progResKeywordId, namedPointId,
count, (uint32*)opCall._code);
- _vm->notifyThreadId(opCall._callerThreadId);
+ _vm->notifyThreadId(opCall._threadId);
}
void BbdouSpecialCode::spcSetObjectInteractMode(OpCall &opCall) {
@@ -189,7 +191,7 @@ void BbdouSpecialCode::spcSetObjectInteractMode(OpCall &opCall) {
ARG_UINT32(objectId);
ARG_INT16(value);
_cursor->setStruct8bsValue(objectId, value);
- _vm->notifyThreadId(opCall._callerThreadId);
+ _vm->notifyThreadId(opCall._threadId);
}
void BbdouSpecialCode::spcRegisterInventoryBag(OpCall &opCall) {
@@ -225,12 +227,33 @@ void BbdouSpecialCode::spcRemoveInventoryItem(OpCall &opCall) {
void BbdouSpecialCode::spcHasInventoryItem(OpCall &opCall) {
ARG_UINT32(objectId);
_vm->_scriptMan->_stack.push(_inventory->hasInventoryItem(objectId) ? 1 : 0);
+debug("_inventory->hasInventoryItem(%08X) = %d", objectId, _inventory->hasInventoryItem(objectId));
}
void BbdouSpecialCode::spcCloseInventory(OpCall &opCall) {
_inventory->close();
}
+void BbdouSpecialCode::spcIsCursorHoldingObjectId(OpCall &opCall) {
+ ARG_UINT32(cursorObjectId);
+ ARG_UINT32(objectId);
+ _vm->_scriptMan->_stack.push(isHoldingObjectId(objectId) ? 1 : 0);
+ _vm->notifyThreadId(opCall._threadId);
+}
+
+void BbdouSpecialCode::spcSaladCtl(OpCall &opCall) {
+ ARG_UINT32(cmd);
+ ARG_UINT32(sequenceId);
+ switch (cmd) {
+ case 1:
+ initSalad();
+ break;
+ case 2:
+ addSalad(sequenceId);
+ break;
+ }
+}
+
void BbdouSpecialCode::playSoundEffect(int soundIndex) {
static const uint32 kSoundEffectIds[] = {
0, 1,
@@ -644,4 +667,30 @@ void BbdouSpecialCode::stopHoldingObjectId(uint32 objectId1, bool doPlaySound) {
_inventory->putBackInventoryItem(holdingObjectId, control->_actor->_position);
}
+bool BbdouSpecialCode::isHoldingObjectId(uint32 objectId) {
+ return _cursor->_data._holdingObjectId == objectId;
+}
+
+void BbdouSpecialCode::initSalad() {
+ for (uint i = 0; i < 12; ++i) {
+ _saladObjectIds[i] = _vm->_controls->newTempObjectId();
+ _vm->_controls->placeActor(0x00050192, Common::Point(0, 0), 0x00060C26, _saladObjectIds[i], 0);
+ }
+ _saladCount = 0;
+}
+
+void BbdouSpecialCode::addSalad(uint32 sequenceId) {
+ if (_saladCount >= 12) {
+ Control *control = _vm->_dict->getObjectControl(_saladObjectIds[_saladCount - 1]);
+ control->unlinkObject();
+ } else {
+ ++_saladCount;
+ }
+ Control *control = _vm->_dict->getObjectControl(_saladObjectIds[_saladCount - 1]);
+ control->linkToObject(0x00040309, _saladCount);
+ control->startSequenceActor(sequenceId, 2, 0);
+ control->setPriority(_saladCount + 9);
+ control->deactivateObject();
+}
+
} // End of namespace Illusions
diff --git a/engines/illusions/bbdou/bbdou_specialcode.h b/engines/illusions/bbdou/bbdou_specialcode.h
index 734e8e8755..f272193bd7 100644
--- a/engines/illusions/bbdou/bbdou_specialcode.h
+++ b/engines/illusions/bbdou/bbdou_specialcode.h
@@ -76,6 +76,11 @@ public:
BbdouCursor *_cursor;
BbdouBubble *_bubble;
BbdouInventory *_inventory;
+
+ // Salad
+ uint _saladCount;
+ uint32 _saladObjectIds[12];
+
// Special code interface functions
void spcInitCursor(OpCall &opCall);
void spcEnableCursor(OpCall &opCall);
@@ -94,11 +99,14 @@ public:
void spcRemoveInventoryItem(OpCall &opCall);
void spcHasInventoryItem(OpCall &opCall);
void spcCloseInventory(OpCall &opCall);
+ void spcIsCursorHoldingObjectId(OpCall &opCall);
+ void spcSaladCtl(OpCall &opCall);
void playSoundEffect(int soundIndex);
void resetItem10(uint32 objectId, Item10 *item10);
void startHoldingObjectId(uint32 objectId1, uint32 holdingObjectId, bool doPlaySound);
void stopHoldingObjectId(uint32 objectId1, bool doPlaySound);
+ bool isHoldingObjectId(uint32 objectId);
protected:
// Internal functions
@@ -116,6 +124,9 @@ protected:
bool runCause(Control *cursorControl, CursorData &cursorData,
uint32 verbId, uint32 objectId2, uint32 objectId, int soundIndex);
uint32 startCauseThread(uint32 cursorObjectId, uint32 sceneId, uint32 verbId, uint32 objectId2, uint32 objectId);
+ // Salad
+ void initSalad();
+ void addSalad(uint32 sequenceId);
};
} // End of namespace Illusions
diff --git a/engines/illusions/scriptopcodes.cpp b/engines/illusions/scriptopcodes.cpp
index d94b96d9fc..a551bdfcae 100644
--- a/engines/illusions/scriptopcodes.cpp
+++ b/engines/illusions/scriptopcodes.cpp
@@ -109,6 +109,7 @@ void ScriptOpcodes::initOpcodes() {
OPCODE(37, opPanStop);
OPCODE(39, opSetDisplay);
OPCODE(42, opIncBlockCounter);
+ OPCODE(43, opClearBlockCounter);
OPCODE(45, opSetProperty);
OPCODE(46, opPlaceActor);
OPCODE(47, opFaceActor);
@@ -263,13 +264,17 @@ void ScriptOpcodes::opEnterScene(ScriptThread *scriptThread, OpCall &opCall) {
}
//DEBUG Scenes
-uint32 dsceneId = 0x00010031, dthreadId = 0x00020036;//MAP
+//uint32 dsceneId = 0x00010031, dthreadId = 0x00020036;//MAP
//uint32 dsceneId = 0x00010028, dthreadId = 0x000202A1;
//uint32 dsceneId = 0x00010007, dthreadId = 0x0002000C;//Auditorium
//uint32 dsceneId = 0x0001000B, dthreadId = 0x00020010;
//uint32 dsceneId = 0x00010013, dthreadId = 0x00020018;//Therapist
//uint32 dsceneId = 0x00010016, dthreadId = 0x0002001B;//Dorms ext
//uint32 dsceneId = 0x00010017, dthreadId = 0x0002001C;//Dorms int
+//uint32 dsceneId = 0x0001000D, dthreadId = 0x00020012;//Food minigame
+//uint32 dsceneId = 0x00010067, dthreadId = 0x0002022A;
+//uint32 dsceneId = 0x0001000C, dthreadId = 0x00020011;//Cafeteria
+uint32 dsceneId = 0x0001000B, dthreadId = 0x00020010;
void ScriptOpcodes::opChangeScene(ScriptThread *scriptThread, OpCall &opCall) {
ARG_SKIP(2);
@@ -373,6 +378,11 @@ void ScriptOpcodes::opIncBlockCounter(ScriptThread *scriptThread, OpCall &opCall
_vm->_scriptMan->_scriptResource->_blockCounters.set(index, value);
}
+void ScriptOpcodes::opClearBlockCounter(ScriptThread *scriptThread, OpCall &opCall) {
+ ARG_INT16(index);
+ _vm->_scriptMan->_scriptResource->_blockCounters.set(index, 0);
+}
+
void ScriptOpcodes::opSetProperty(ScriptThread *scriptThread, OpCall &opCall) {
ARG_INT16(value);
ARG_UINT32(propertyId);
@@ -690,7 +700,7 @@ void ScriptOpcodes::opCompareBlockCounter(ScriptThread *scriptThread, OpCall &op
void ScriptOpcodes::opDebug126(ScriptThread *scriptThread, OpCall &opCall) {
// NOTE Prints some debug text
- debug("[DBG] %s", (char*)opCall._code);
+ debug(1, "[DBG] %s", (char*)opCall._code);
}
void ScriptOpcodes::opPlayVideo(ScriptThread *scriptThread, OpCall &opCall) {
@@ -747,7 +757,7 @@ void ScriptOpcodes::opStartAbortableThread(ScriptThread *scriptThread, OpCall &o
ARG_INT16(codeOffs);
ARG_INT16(skipOffs);
_vm->_scriptMan->startAbortableThread(opCall._code + codeOffs,
- opCall._code + skipOffs, opCall._callerThreadId);
+ opCall._code + skipOffs, opCall._threadId);
}
void ScriptOpcodes::opKillThread(ScriptThread *scriptThread, OpCall &opCall) {
diff --git a/engines/illusions/scriptopcodes.h b/engines/illusions/scriptopcodes.h
index 32f23fdff6..4fc6cd68b5 100644
--- a/engines/illusions/scriptopcodes.h
+++ b/engines/illusions/scriptopcodes.h
@@ -83,6 +83,7 @@ protected:
void opPanStop(ScriptThread *scriptThread, OpCall &opCall);
void opSetDisplay(ScriptThread *scriptThread, OpCall &opCall);
void opIncBlockCounter(ScriptThread *scriptThread, OpCall &opCall);
+ void opClearBlockCounter(ScriptThread *scriptThread, OpCall &opCall);
void opSetProperty(ScriptThread *scriptThread, OpCall &opCall);
void opPlaceActor(ScriptThread *scriptThread, OpCall &opCall);
void opFaceActor(ScriptThread *scriptThread, OpCall &opCall);
diff --git a/engines/illusions/sequenceopcodes.cpp b/engines/illusions/sequenceopcodes.cpp
index cab0fbecf3..e53a7ec222 100644
--- a/engines/illusions/sequenceopcodes.cpp
+++ b/engines/illusions/sequenceopcodes.cpp
@@ -25,6 +25,7 @@
#include "illusions/actor.h"
#include "illusions/actorresource.h"
#include "illusions/dictionary.h"
+#include "illusions/scriptman.h"
#include "illusions/scriptopcodes.h"
namespace Illusions {
@@ -82,6 +83,7 @@ void SequenceOpcodes::initOpcodes() {
OPCODE(40, opSetPriorityLayer);
OPCODE(50, opPlaySound);
OPCODE(51, opStopSound);
+ OPCODE(52, opStartScriptThread);
OPCODE(53, opPlaceSubActor);
OPCODE(54, opStartSubSequence);
OPCODE(55, opStopSubSequence);
@@ -311,6 +313,12 @@ void SequenceOpcodes::opStopSound(Control *control, OpCall &opCall) {
// TODO _vm->stopSound(soundEffectId);
}
+void SequenceOpcodes::opStartScriptThread(Control *control, OpCall &opCall) {
+ ARG_SKIP(2);
+ ARG_UINT32(threadId);
+ _vm->_scriptMan->startScriptThread(threadId, 0, 0, 0, 0);
+}
+
void SequenceOpcodes::opPlaceSubActor(Control *control, OpCall &opCall) {
ARG_INT16(linkIndex);
ARG_UINT32(actorTypeId);
diff --git a/engines/illusions/sequenceopcodes.h b/engines/illusions/sequenceopcodes.h
index 028d567879..747287e4a7 100644
--- a/engines/illusions/sequenceopcodes.h
+++ b/engines/illusions/sequenceopcodes.h
@@ -72,6 +72,7 @@ protected:
void opSetPriorityLayer(Control *control, OpCall &opCall);
void opPlaySound(Control *control, OpCall &opCall);
void opStopSound(Control *control, OpCall &opCall);
+ void opStartScriptThread(Control *control, OpCall &opCall);
void opPlaceSubActor(Control *control, OpCall &opCall);
void opStartSubSequence(Control *control, OpCall &opCall);
void opStopSubSequence(Control *control, OpCall &opCall);
diff --git a/engines/illusions/talkthread.cpp b/engines/illusions/talkthread.cpp
index be745f6e99..10ff05df7d 100644
--- a/engines/illusions/talkthread.cpp
+++ b/engines/illusions/talkthread.cpp
@@ -78,7 +78,8 @@ TalkThread::TalkThread(IllusionsEngine *vm, uint32 threadId, uint32 callingThrea
if (callingThread)
_tag = callingThread->_tag;
}
-
+
+ //debug("New talk thread: %08X %08X", _threadId, _talkId);
}
int TalkThread::onUpdate() {
@@ -307,7 +308,7 @@ static char *debugW2I(byte *wstr) {
int TalkThread::insertText() {
int charCount = 100;
- debug("[%s]", debugW2I(_currEntryText));
+ debug("%08X %08X [%s]", _threadId, _talkId, debugW2I(_currEntryText));
_entryText = 0;
// TODO _vm->getDimensions1(&dimensions);
diff --git a/engines/illusions/thread.cpp b/engines/illusions/thread.cpp
index 3a5a4a94e1..d597d4810b 100644
--- a/engines/illusions/thread.cpp
+++ b/engines/illusions/thread.cpp
@@ -267,7 +267,7 @@ void ThreadList::killThread(uint32 threadId) {
if (childThread->_callingThreadId == threadId)
killThread(childThread->_threadId);
}
-
+
thread->onKill();
}