aboutsummaryrefslogtreecommitdiff
path: root/engines/illusions/bbdou
diff options
context:
space:
mode:
Diffstat (limited to 'engines/illusions/bbdou')
-rw-r--r--engines/illusions/bbdou/bbdou_specialcode.cpp217
-rw-r--r--engines/illusions/bbdou/bbdou_specialcode.h6
2 files changed, 212 insertions, 11 deletions
diff --git a/engines/illusions/bbdou/bbdou_specialcode.cpp b/engines/illusions/bbdou/bbdou_specialcode.cpp
index d7ba8ceb41..9278a41813 100644
--- a/engines/illusions/bbdou/bbdou_specialcode.cpp
+++ b/engines/illusions/bbdou/bbdou_specialcode.cpp
@@ -377,7 +377,7 @@ void BbdouSpecialCode::setCursorControlRoutine(uint32 objectId, int num) {
new Common::Functor2Mem<Control*, uint32, void, BbdouSpecialCode>(this, &BbdouSpecialCode::cursorInteractControlRoutine));
else
control->_actor->setControlRoutine(
- new Common::Functor2Mem<Control*, uint32, void, BbdouSpecialCode>(this, &BbdouSpecialCode::cursorControlRoutine2));
+ new Common::Functor2Mem<Control*, uint32, void, BbdouSpecialCode>(this, &BbdouSpecialCode::cursorCrosshairControlRoutine));
}
Common::Point BbdouSpecialCode::getBackgroundCursorPos(Common::Point cursorPos) {
@@ -605,7 +605,7 @@ void BbdouSpecialCode::cursorInteractControlRoutine(Control *cursorControl, uint
}
-void BbdouSpecialCode::cursorControlRoutine2(Control *cursorControl, uint32 deltaTime) {
+void BbdouSpecialCode::cursorCrosshairControlRoutine(Control *cursorControl, uint32 deltaTime) {
static const struct ShooterAnim {
uint32 objectId;
@@ -620,12 +620,14 @@ void BbdouSpecialCode::cursorControlRoutine2(Control *cursorControl, uint32 delt
{0x60652, 0x60653, 0x60654, 0x60655, 0x60656, 0x60657, 0x60658, 0x60659}}
};
+ static const uint32 kShooterObjectIds[] = {
+ 0x401DF, 0x401E0, 0x401E1, 0x401E2,
+ 0x401E3, 0x401E4, 0x401E5, 0x401E6,
+ };
+
Actor *actor = cursorControl->_actor;
CursorData &cursorData = _cursor->_data;
- // TODO
- //debug("BbdouSpecialCode::cursorControlRoutine2()");
-
if (cursorData._visibleCtr <= 0) {
if (cursorData._currOverlappedObjectId || cursorData._mode == 3) {
if (cursorData._mode == 3)
@@ -636,11 +638,11 @@ void BbdouSpecialCode::cursorControlRoutine2(Control *cursorControl, uint32 delt
return;
}
- Common::Point cursorPos = _vm->_input->getCursorPosition();
+ Common::Point screenCursorPos = _vm->_input->getCursorPosition();
- if (cursorPos != actor->_position) {
- actor->_position = cursorPos;
- int16 gridX = 8 * cursorPos.x / 640;
+ if (screenCursorPos != actor->_position) {
+ actor->_position = screenCursorPos;
+ int16 gridX = 8 * screenCursorPos.x / 640;
if (gridX >= 8)
gridX = 4;
@@ -658,7 +660,146 @@ void BbdouSpecialCode::cursorControlRoutine2(Control *cursorControl, uint32 delt
}
- // TODO A lot of stuff
+ Common::Point cursorPos = getBackgroundCursorPos(cursorPos);
+ bool foundOverlapped = false;
+ Control *overlappedControl = 0;
+
+ if (cursorData._flags & 1)
+ foundOverlapped = false;
+ else {
+ /* TODO Implement getOverlappedObjectAccurate
+ foundOverlapped = _vm->_controls->getOverlappedObjectAccurate(cursorControl, cursorPos,
+ &overlappedControl, cursorData._item10._field58);
+ */
+ }
+
+ if (foundOverlapped) {
+ if (overlappedControl->_objectId != cursorData._currOverlappedObjectId) {
+ resetItem10(cursorControl->_objectId, &cursorData._item10);
+ int value = _cursor->findStruct8bsValue(overlappedControl->_objectId);
+ if (value == 2 || value == 3 || value == 4 || value == 5 || value == 6 || value == 7) {
+ if (cursorData._mode != 3) {
+ _cursor->saveInfo();
+ cursorData._mode = 3;
+ cursorData._item10._verbId = 0x1B0006;
+ cursorData._holdingObjectId = 0;
+ }
+ switch (value) {
+ case 2:
+ cursorData._sequenceId = 0x60010;
+ break;
+ case 3:
+ cursorData._sequenceId = 0x60011;
+ break;
+ case 4:
+ cursorData._sequenceId = 0x60012;
+ break;
+ case 5:
+ cursorData._sequenceId = 0x60013;
+ break;
+ case 6:
+ cursorData._sequenceId = 0x60015;
+ break;
+ case 7:
+ cursorData._sequenceId = 0x60014;
+ break;
+ }
+ _cursor->show(cursorControl);
+ cursorData._currOverlappedObjectId = overlappedControl->_objectId;
+ } else {
+ if (cursorData._mode == 3)
+ _cursor->restoreInfo();
+ _cursor->show(cursorControl);
+ cursorControl->setActorIndexTo2();
+ if (overlappedControl->_objectId) {
+ cursorData._item10._verbId = 0x1B0003;
+ cursorData._currOverlappedObjectId = overlappedControl->_objectId;
+ } else {
+ cursorData._item10._verbId = 0x1B0002;
+ cursorData._currOverlappedObjectId = overlappedControl->_objectId;
+ }
+ }
+ }
+ } else {
+ if (cursorData._currOverlappedObjectId || cursorData._mode == 3) {
+ if (cursorData._mode == 3)
+ _cursor->restoreInfo();
+ _cursor->show(cursorControl);
+ cursorControl->setActorIndexTo1();
+ resetItem10(cursorControl->_objectId, &cursorData._item10);
+ }
+ cursorData._currOverlappedObjectId = 0;
+ }
+
+ actor->_seqCodeValue1 = 100 * deltaTime;
+
+ if (cursorData._currOverlappedObjectId) {
+
+ if (_vm->_input->pollEvent(kEventLeftClick)) {
+
+ uint32 outSceneId, outVerbId, outObjectId2, outObjectId;
+ bool success = getShooterCause(_vm->getCurrentScene(),
+ cursorData._item10._verbId, cursorData._holdingObjectId, cursorData._currOverlappedObjectId,
+ outSceneId, outVerbId, outObjectId2, outObjectId);
+
+ uint index = (uint)_vm->getRandom(2);
+ const ShooterAnim &anim = kShooterAnims[index];
+ uint32 objectId = anim.objectId;
+ int gridX = _shooterStatus[index].gridX;
+ Control *gunControl = _vm->getObjectControl(objectId);
+ if (gunControl) {
+ _shooterStatus[index].flag = true;
+ gunControl->startSequenceActor(anim.sequenceIds2[gridX], 2, 0);
+ }
+ Control *hitControl = _vm->getObjectControl(kShooterObjectIds[_shooterObjectIdIndex]);
+ if (hitControl) {
+ hitControl->setActorPosition(actor->_position);
+ hitControl->startSequenceActor(0x6068D, 2, 0);
+ }
+ ++_shooterObjectIdIndex;
+ if (_shooterObjectIdIndex >= ARRAYSIZE(kShooterObjectIds))
+ _shooterObjectIdIndex = 0;
+
+ if (success) {
+ _cursor->hide(cursorControl->_objectId);
+ uint32 threadId = startCauseThread(cursorControl->_objectId, _vm->getCurrentScene(), outVerbId, outObjectId2, outObjectId);
+ if (cursorData._field90) {
+ _vm->_threads->killThread(cursorData._causeThreadId2);
+ cursorData._field90 = 0;
+ }
+ cursorData._causeThreadId1 = _vm->causeTrigger(outSceneId, outVerbId, outObjectId2, outObjectId, threadId);
+ cursorData._causeThreadId2 = cursorData._causeThreadId1;
+ resetItem10(cursorControl->_objectId, &cursorData._item10);
+ cursorData._currOverlappedObjectId = 0;
+ cursorControl->setActorIndexTo1();
+ }
+
+ } else if (_vm->_input->pollEvent(kEventRightClick) && cursorData._item10._playSound48 == 1 && !cursorData._item10._flag56) {
+ // TODO I don't think this is used; _playSound48 seems to be always 0 here
+ debug("Cursor_sub_10004DD0 TODO");
+ // TODO Cursor_sub_10004DD0(controla->objectId, cursorData->currOverlappedObjectId, cursorData->holdingObjectId, &cursorData->item10);
+ }
+
+ } else if (_vm->_input->pollEvent(kEventLeftClick)) {
+ uint index = (uint)_vm->getRandom(2);
+ const ShooterAnim &anim = kShooterAnims[index];
+ uint32 objectId = anim.objectId;
+ int gridX = _shooterStatus[index].gridX;
+ Control *gunControl = _vm->getObjectControl(objectId);
+ if (gunControl) {
+ _shooterStatus[index].flag = true;
+ gunControl->startSequenceActor(anim.sequenceIds2[gridX], 2, 0);
+ }
+ Control *hitControl = _vm->getObjectControl(kShooterObjectIds[_shooterObjectIdIndex]);
+ if (hitControl) {
+ hitControl->setActorPosition(actor->_position);
+ hitControl->startSequenceActor(0x6068D, 2, 0);
+ }
+ ++_shooterObjectIdIndex;
+ if (_shooterObjectIdIndex >= ARRAYSIZE(kShooterObjectIds))
+ _shooterObjectIdIndex = 0;
+
+ }
}
@@ -832,4 +973,60 @@ void BbdouSpecialCode::addSalad(uint32 sequenceId) {
control->deactivateObject();
}
+bool BbdouSpecialCode::getShooterCause(uint32 sceneId, uint32 verbId, uint32 objectId2, uint32 objectId,
+ uint32 &outSceneId, uint32 &outVerbId, uint32 &outObjectId2, uint32 &outObjectId) {
+ bool success = false;
+ objectId2 = verbId != 0x1B0003 ? 0 : objectId2;
+ if (_vm->causeIsDeclared(sceneId, verbId, objectId2, objectId)) {
+ outSceneId = sceneId;
+ outVerbId = verbId;
+ outObjectId2 = objectId2;
+ outObjectId = objectId;
+ success = true;
+ } else if (verbId == 0x1B0003 && _vm->causeIsDeclared(sceneId, 0x1B0008, 0, objectId)) {
+ outSceneId = sceneId;
+ outVerbId = 0x1B0003;
+ outObjectId2 = 0;
+ outObjectId = objectId;
+ success = true;
+ } else if (_vm->causeIsDeclared(sceneId, verbId, objectId2, 0x40001)) {
+ outSceneId = sceneId;
+ outVerbId = verbId;
+ outObjectId2 = objectId2;
+ outObjectId = 0x40001;
+ success = true;
+ } else if (verbId == 0x1B0003 && _vm->causeIsDeclared(sceneId, 0x1B0008, 0, 0x40001)) {
+ outSceneId = sceneId;
+ outVerbId = 0x1B0008;
+ outObjectId2 = 0;
+ outObjectId = 0x40001;
+ success = true;
+ } else if (_vm->causeIsDeclared(0x10003, verbId, objectId2, objectId)) {
+ outSceneId = 0x10003;
+ outVerbId = verbId;
+ outObjectId2 = objectId2;
+ outObjectId = objectId;
+ success = true;
+ } else if (verbId == 0x1B0003 && _vm->causeIsDeclared(0x10003, 0x1B0008, 0, objectId)) {
+ outSceneId = 0x10003;
+ outVerbId = verbId;
+ outObjectId2 = 0;
+ outObjectId = objectId;
+ success = true;
+ } else if (_vm->causeIsDeclared(0x10003, verbId, objectId2, 0x40001)) {
+ outSceneId = 0x10003;
+ outVerbId = verbId;
+ outObjectId2 = objectId2;
+ outObjectId = 0x40001;
+ success = true;
+ } else if (verbId == 0x1B0003 && _vm->causeIsDeclared(0x10003, 0x1B0008, 0, 0x40001)) {
+ outSceneId = 0x10003;
+ outVerbId = verbId;
+ outObjectId2 = 0;
+ outObjectId = 0x40001;
+ success = true;
+ }
+ return success;
+}
+
} // End of namespace Illusions
diff --git a/engines/illusions/bbdou/bbdou_specialcode.h b/engines/illusions/bbdou/bbdou_specialcode.h
index 22fdd12cbc..0ee5fae4a1 100644
--- a/engines/illusions/bbdou/bbdou_specialcode.h
+++ b/engines/illusions/bbdou/bbdou_specialcode.h
@@ -108,6 +108,7 @@ public:
// Shooter
ShooterStatus _shooterStatus[2];
+ uint _shooterObjectIdIndex;
// Special code interface functions
void spcInitCursor(OpCall &opCall);
@@ -150,7 +151,7 @@ protected:
Item10 *item10, uint32 progResKeywordId);
bool findVerbId(Item10 *item10, uint32 currOverlappedObjectId, int always0, uint32 &outVerbId);
void cursorInteractControlRoutine(Control *cursorControl, uint32 deltaTime);
- void cursorControlRoutine2(Control *cursorControl, uint32 deltaTime);
+ void cursorCrosshairControlRoutine(Control *cursorControl, uint32 deltaTime);
bool testVerbId(uint32 verbId, uint32 holdingObjectId, uint32 overlappedObjectId);
bool getCause(uint32 sceneId, uint32 verbId, uint32 objectId2, uint32 objectId,
uint32 &outVerbId, uint32 &outObjectId2, uint32 &outObjectId);
@@ -160,6 +161,9 @@ protected:
// Salad
void initSalad();
void addSalad(uint32 sequenceId);
+ // Shooter
+ bool getShooterCause(uint32 sceneId, uint32 verbId, uint32 objectId2, uint32 objectId,
+ uint32 &outSceneId, uint32 &outVerbId, uint32 &outObjectId2, uint32 &outObjectId);
};
} // End of namespace Illusions