aboutsummaryrefslogtreecommitdiff
path: root/engines/illusions/actor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/illusions/actor.cpp')
-rw-r--r--engines/illusions/actor.cpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/engines/illusions/actor.cpp b/engines/illusions/actor.cpp
index 53190ef97b..d9eb94975f 100644
--- a/engines/illusions/actor.cpp
+++ b/engines/illusions/actor.cpp
@@ -30,6 +30,8 @@
#include "illusions/scriptman.h"
#include "illusions/scriptopcodes.h"
#include "illusions/sequenceopcodes.h"
+#include "illusions/talkthread.h"
+#include "illusions/thread.h"
namespace Illusions {
@@ -641,6 +643,51 @@ void Control::setActorIndexTo2() {
_actor->_actorIndex = 2;
}
+void Control::startSubSequence(int linkIndex, uint32 sequenceId) {
+ Control *linkedControl = _vm->_dict->getObjectControl(_actor->_subobjects[linkIndex - 1]);
+ Actor *linkedActor = linkedControl->_actor;
+ if (!linkedActor->_entryTblPtr)
+ linkedActor->_flags &= ~0x80;
+ linkedActor->_flags &= ~0x400;
+ linkedActor->_flags |= 0x100;
+ linkedActor->_sequenceId = sequenceId;
+ linkedActor->_notifyThreadId1 = 0;
+ linkedActor->_notifyId3C = 0;
+ linkedActor->_path40 = 0;
+
+ Sequence *sequence = _vm->_dict->findSequence(sequenceId);
+ linkedActor->_seqCodeIp = sequence->_sequenceCode;
+ linkedActor->_frames = _vm->_actorItems->findSequenceFrames(sequence);
+ linkedActor->_seqCodeValue3 = 0;
+ linkedActor->_seqCodeValue1 = 0;
+ linkedActor->_seqCodeValue2 = 600;
+ linkedActor->initSequenceStack();
+ linkedControl->sequenceActor();
+ linkedControl->appearActor();
+}
+
+void Control::stopSubSequence(int linkIndex) {
+ Control *linkedControl = _vm->_dict->getObjectControl(_actor->_subobjects[linkIndex - 1]);
+ Actor *linkedActor = linkedControl->_actor;
+ uint32 notifySequenceId2 = _actor->_notifyThreadId2;
+ _actor->_linkIndex2 = linkIndex;
+ if (_actor->_entryTblPtr) {
+ linkedActor->_flags |= 0x80;
+ linkedActor->_entryTblPtr = _actor->_entryTblPtr;
+ linkedActor->_notifyThreadId2 = _actor->_notifyThreadId2;
+ linkedActor->_seqCodeValue1 = _actor->_seqCodeValue1;
+ linkedActor->_seqCodeValue3 = _actor->_seqCodeValue3;
+ _actor->_flags &= ~0x80;
+ _actor->_entryTblPtr = 0;
+ _actor->_notifyThreadId1 = 0;
+ _actor->_notifyThreadId2 = 0;
+ }
+ if (notifySequenceId2) {
+ Thread *talkThread = _vm->_scriptMan->_threads->findThread(notifySequenceId2);
+ talkThread->sendMessage(kMsgClearSequenceId2, 0);
+ }
+}
+
void Control::startSequenceActorIntern(uint32 sequenceId, int value, byte *entryTblPtr, uint32 notifyThreadId) {
stopActor();
@@ -710,6 +757,7 @@ void Controls::placeActor(uint32 actorTypeId, Common::Point placePt, uint32 sequ
Actor *actor = newActor();
ActorType *actorType = _vm->_dict->findActorType(actorTypeId);
+
control->_objectId = objectId;
control->_flags = actorType->_flags;
control->_priority = actorType->_priority;
@@ -718,11 +766,13 @@ void Controls::placeActor(uint32 actorTypeId, Common::Point placePt, uint32 sequ
control->_actor = actor;
if (actorTypeId == 0x50001 && objectId == 0x40004)
actor->setControlRoutine(new Common::Functor2Mem<Control*, uint32, void, Cursor>(_vm->_cursor, &Cursor::cursorControlRoutine));
+
if (actorType->_surfInfo._dimensions._width > 0 || actorType->_surfInfo._dimensions._height > 0) {
actor->createSurface(actorType->_surfInfo);
} else {
actor->_flags |= 0x0200;
}
+
actor->_position = placePt;
actor->_position2 = placePt;
Common::Point currPan = _vm->_camera->getCurrentPan();