aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorEric Fry2018-05-29 22:30:54 +1000
committerEugene Sandulenko2018-07-20 06:43:33 +0000
commit423a8ec43351d1cbba84b67ad1c038ea4ca4e108 (patch)
treee929599ecd75feffc8e2bc6cdfc57436985dec20 /engines
parentbdc477bef9d4ec9691e77c4de867a30d08865c46 (diff)
downloadscummvm-rg350-423a8ec43351d1cbba84b67ad1c038ea4ca4e108.tar.gz
scummvm-rg350-423a8ec43351d1cbba84b67ad1c038ea4ca4e108.tar.bz2
scummvm-rg350-423a8ec43351d1cbba84b67ad1c038ea4ca4e108.zip
ILLUSIONS: Replace 0x40004 with CURSOR_OBJECT_ID constant
Fix pan bug in starship enterprise scene Add sequence opcode name to debug log Hack to fix endless loop bug outside the starship enterprise
Diffstat (limited to 'engines')
-rw-r--r--engines/illusions/actor.cpp21
-rw-r--r--engines/illusions/actor.h4
-rw-r--r--engines/illusions/bbdou/illusions_bbdou.cpp2
-rw-r--r--engines/illusions/camera.cpp15
-rw-r--r--engines/illusions/duckman/duckman_dialog.cpp4
-rw-r--r--engines/illusions/duckman/illusions_duckman.cpp4
-rw-r--r--engines/illusions/duckman/menusystem_duckman.cpp8
-rw-r--r--engines/illusions/menusystem.cpp6
-rw-r--r--engines/illusions/sequenceopcodes.cpp6
-rw-r--r--engines/illusions/sequenceopcodes.h1
-rw-r--r--engines/illusions/threads/causethread_duckman.cpp4
11 files changed, 46 insertions, 29 deletions
diff --git a/engines/illusions/actor.cpp b/engines/illusions/actor.cpp
index cb9f3a909d..dba119550d 100644
--- a/engines/illusions/actor.cpp
+++ b/engines/illusions/actor.cpp
@@ -222,7 +222,7 @@ void Control::pause() {
_vm->_dict->setObjectControl(_objectId, 0);
- if (_objectId == 0x40004)
+ if (_objectId == Illusions::CURSOR_OBJECT_ID)
_vm->setCursorControl(0);
if (_actor && !(_actor->_flags & Illusions::ACTOR_FLAG_200))
@@ -234,7 +234,7 @@ void Control::unpause() {
_vm->_dict->setObjectControl(_objectId, this);
- if (_objectId == 0x40004)
+ if (_objectId == Illusions::CURSOR_OBJECT_ID)
_vm->setCursorControl(this);
if (_actor && !(_actor->_flags & Illusions::ACTOR_FLAG_200)) {
@@ -253,7 +253,7 @@ void Control::appearActor() {
if (_vm->getGameId() == kGameIdDuckman) {
_flags |= 1;
_actor->_flags |= Illusions::ACTOR_FLAG_IS_VISIBLE;
- if (_objectId == 0x40004) {
+ if (_objectId == Illusions::CURSOR_OBJECT_ID) {
if (_actor->_frameIndex) {
_actor->_flags |= Illusions::ACTOR_FLAG_2000;
_actor->_flags |= Illusions::ACTOR_FLAG_4000;
@@ -261,7 +261,7 @@ void Control::appearActor() {
_vm->_input->discardAllEvents();
}
} else {
- if (_objectId == 0x40004) {
+ if (_objectId == Illusions::CURSOR_OBJECT_ID) {
_vm->showCursor();
} else {
if (_actor->_frameIndex || _actorTypeId == 0x50004)
@@ -282,7 +282,7 @@ void Control::disappearActor() {
_flags &= ~1;
_actor->_flags &= ~Illusions::ACTOR_FLAG_IS_VISIBLE;
} else {
- if (_objectId == 0x40004) {
+ if (_objectId == Illusions::CURSOR_OBJECT_ID) {
_vm->hideCursor();
} else {
_actor->_flags &= ~Illusions::ACTOR_FLAG_IS_VISIBLE;
@@ -646,7 +646,7 @@ void Control::sequenceActor() {
//debug(1, "New frame %d", _actor->_newFrameIndex);
setActorFrameIndex(_actor->_newFrameIndex);
if (_vm->getGameId() == kGameIdBBDOU &&
- !(_actor->_flags & Illusions::ACTOR_FLAG_IS_VISIBLE) && (_actor->_flags & Illusions::ACTOR_FLAG_1000) && (_objectId != 0x40004)) {
+ !(_actor->_flags & Illusions::ACTOR_FLAG_IS_VISIBLE) && (_actor->_flags & Illusions::ACTOR_FLAG_1000) && (_objectId != Illusions::CURSOR_OBJECT_ID)) {
appearActor();
_actor->_flags &= ~Illusions::ACTOR_FLAG_1000;
}
@@ -1105,6 +1105,9 @@ void Controls::placeActor(uint32 actorTypeId, Common::Point placePt, uint32 sequ
if (_vm->isCursorObject(actorTypeId, objectId))
_vm->placeCursorControl(control, sequenceId);
+ // TODO HACK at least we should restrict this to the sequenceId
+ control->setActorIndex(1);
+
control->startSequenceActor(sequenceId, 2, notifyThreadId);
}
@@ -1205,7 +1208,7 @@ void Controls::destroyActiveControls() {
destroyControlInternal(*it);
it = _controls.erase(it);
} else
- ++it;
+ ++it;
}
}
@@ -1216,7 +1219,7 @@ void Controls::destroyControlsBySceneId(uint32 sceneId) {
destroyControlInternal(*it);
it = _controls.erase(it);
} else
- ++it;
+ ++it;
}
}
@@ -1481,7 +1484,7 @@ void Controls::destroyControlInternal(Control *control) {
if (!(control->_flags & 4) && control->_pauseCtr <= 0)
_vm->_dict->setObjectControl(control->_objectId, 0);
- if (!(control->_flags & 4) && control->_objectId == 0x40004 && control->_pauseCtr <= 0)
+ if (!(control->_flags & 4) && control->_objectId == Illusions::CURSOR_OBJECT_ID && control->_pauseCtr <= 0)
_vm->setCursorControl(0);
if (control->_actor) {
diff --git a/engines/illusions/actor.h b/engines/illusions/actor.h
index 7fb99ced81..51f930be11 100644
--- a/engines/illusions/actor.h
+++ b/engines/illusions/actor.h
@@ -58,6 +58,10 @@ enum ActorFlags {
ACTOR_FLAG_8000 = 0x8000
};
+enum ControlObjectID {
+ CURSOR_OBJECT_ID = 0x40004
+};
+
const uint kSubObjectsCount = 15;
struct DefaultSequence {
diff --git a/engines/illusions/bbdou/illusions_bbdou.cpp b/engines/illusions/bbdou/illusions_bbdou.cpp
index b0353c2096..a642835623 100644
--- a/engines/illusions/bbdou/illusions_bbdou.cpp
+++ b/engines/illusions/bbdou/illusions_bbdou.cpp
@@ -384,7 +384,7 @@ uint32 IllusionsEngine_BBDOU::getPrevScene() {
}
bool IllusionsEngine_BBDOU::isCursorObject(uint32 actorTypeId, uint32 objectId) {
- return actorTypeId == 0x50001 && objectId == 0x40004;
+ return actorTypeId == 0x50001 && objectId == Illusions::CURSOR_OBJECT_ID;
}
void IllusionsEngine_BBDOU::setCursorControlRoutine(Control *control) {
diff --git a/engines/illusions/camera.cpp b/engines/illusions/camera.cpp
index 9e18ff39b6..390dff8b99 100644
--- a/engines/illusions/camera.cpp
+++ b/engines/illusions/camera.cpp
@@ -25,6 +25,7 @@
#include "illusions/fixedpoint.h"
#include "illusions/resources/backgroundresource.h"
#include "illusions/time.h"
+#include "illusions/actor.h"
namespace Illusions {
@@ -85,10 +86,16 @@ void Camera::set(Common::Point &panPoint, WidthHeight &dimensions) {
void Camera::panCenterObject(uint32 objectId, int16 panSpeed) {
Common::Point *actorPosition = _vm->getObjectActorPositionPtr(objectId);
- if (_vm->getGameId() == kGameIdDuckman && objectId == 0x40004) {
- _activeState._cameraMode = 2;
- _activeState._trackingLimits.x = 156;
- _activeState._trackingLimits.y = 96;
+ if (_vm->getGameId() == kGameIdDuckman) {
+ if(objectId == Illusions::CURSOR_OBJECT_ID) {
+ _activeState._cameraMode = 2;
+ _activeState._trackingLimits.x = 156;
+ _activeState._trackingLimits.y = 96;
+ } else {
+ _activeState._cameraMode = 1;
+ _activeState._trackingLimits.x = 4;
+ _activeState._trackingLimits.y = 4;
+ }
} else if (_vm->getGameId() == kGameIdBBDOU) {
_activeState._cameraMode = 1;
_activeState._trackingLimits = _centerObjectTrackingLimits;
diff --git a/engines/illusions/duckman/duckman_dialog.cpp b/engines/illusions/duckman/duckman_dialog.cpp
index 3e42955ac9..f624ed8d01 100644
--- a/engines/illusions/duckman/duckman_dialog.cpp
+++ b/engines/illusions/duckman/duckman_dialog.cpp
@@ -85,8 +85,8 @@ void DuckmanDialogSystem::startDialog(int16 *choiceOfsPtr, uint32 actorTypeId, u
} else {
if (!_vm->_cursor._control) {
Common::Point pos = _vm->getNamedPointPosition(0x70001);
- _vm->_controls->placeActor(0x50001, pos, 0x60001, 0x40004, 0);
- _vm->_cursor._control = _vm->_dict->getObjectControl(0x40004);
+ _vm->_controls->placeActor(0x50001, pos, 0x60001, Illusions::CURSOR_OBJECT_ID, 0);
+ _vm->_cursor._control = _vm->_dict->getObjectControl(Illusions::CURSOR_OBJECT_ID);
}
_vm->_cursor._control->appearActor();
_vm->setCursorActorIndex(6, 1, 0);
diff --git a/engines/illusions/duckman/illusions_duckman.cpp b/engines/illusions/duckman/illusions_duckman.cpp
index 325b6dca87..0b2bcca52f 100644
--- a/engines/illusions/duckman/illusions_duckman.cpp
+++ b/engines/illusions/duckman/illusions_duckman.cpp
@@ -944,13 +944,13 @@ void IllusionsEngine_Duckman::pause(uint32 callerThreadId) {
_threads->pauseThreads(callerThreadId);
_camera->pause();
pauseFader();
- // TODO largeObj_pauseControlActor(0x40004);
+ // TODO largeObj_pauseControlActor(Illusions::CURSOR_OBJECT_ID);
}
}
void IllusionsEngine_Duckman::unpause(uint32 callerThreadId) {
if (--_pauseCtr == 0) {
- // TODO largeObj_unpauseControlActor(0x40004);
+ // TODO largeObj_unpauseControlActor(Illusions::CURSOR_OBJECT_ID);
unpauseFader();
_camera->unpause();
_threads->unpauseThreads(callerThreadId);
diff --git a/engines/illusions/duckman/menusystem_duckman.cpp b/engines/illusions/duckman/menusystem_duckman.cpp
index 621a49cd1f..263cda83ce 100644
--- a/engines/illusions/duckman/menusystem_duckman.cpp
+++ b/engines/illusions/duckman/menusystem_duckman.cpp
@@ -171,15 +171,15 @@ int DuckmanMenuSystem::convertRootMenuId(uint32 menuId) {
bool DuckmanMenuSystem::initMenuCursor() {
bool cursorInitialVisibleFlag = false;
- Control *cursorControl = _vm->getObjectControl(0x40004);
+ Control *cursorControl = _vm->getObjectControl(Illusions::CURSOR_OBJECT_ID);
if (cursorControl) {
if (cursorControl->_flags & 1)
cursorInitialVisibleFlag = false;
cursorControl->appearActor();
} else {
Common::Point pos = _vm->getNamedPointPosition(0x70001);
- _vm->_controls->placeActor(0x50001, pos, 0x60001, 0x40004, 0);
- cursorControl = _vm->getObjectControl(0x40004);
+ _vm->_controls->placeActor(0x50001, pos, 0x60001, Illusions::CURSOR_OBJECT_ID, 0);
+ cursorControl = _vm->getObjectControl(Illusions::CURSOR_OBJECT_ID);
}
return cursorInitialVisibleFlag;
}
@@ -189,7 +189,7 @@ int DuckmanMenuSystem::getGameState() {
}
void DuckmanMenuSystem::setMenuCursorNum(int cursorNum) {
- Control *mouseCursor = _vm->getObjectControl(0x40004);
+ Control *mouseCursor = _vm->getObjectControl(Illusions::CURSOR_OBJECT_ID);
_vm->setCursorActorIndex(5, cursorNum, 0);
mouseCursor->startSequenceActor(0x60001, 2, 0);
}
diff --git a/engines/illusions/menusystem.cpp b/engines/illusions/menusystem.cpp
index 878dacf0df..3330cb727a 100644
--- a/engines/illusions/menusystem.cpp
+++ b/engines/illusions/menusystem.cpp
@@ -215,7 +215,7 @@ bool BaseMenuSystem::calcMenuItemIndexAtPoint(Common::Point pt, uint &menuItemIn
void BaseMenuSystem::setMousePos(Common::Point &mousePos) {
_vm->_input->setCursorPosition(mousePos);
- Control *mouseCursor = _vm->getObjectControl(0x40004);
+ Control *mouseCursor = _vm->getObjectControl(Illusions::CURSOR_OBJECT_ID);
mouseCursor->_actor->_position = mousePos;
}
@@ -332,7 +332,7 @@ void BaseMenuSystem::openMenu(BaseMenu *menu) {
_cursorInitialVisibleFlag = initMenuCursor();
_savedCursorPos = _vm->_input->getCursorPosition();
_savedGameState = getGameState();
- Control *cursorControl = _vm->getObjectControl(0x40004);
+ Control *cursorControl = _vm->getObjectControl(Illusions::CURSOR_OBJECT_ID);
_savedCursorActorIndex = cursorControl->_actor->_actorIndex;
_savedCursorSequenceId = cursorControl->_actor->_sequenceId;
@@ -358,7 +358,7 @@ void BaseMenuSystem::closeMenu() {
_vm->_screenText->removeText();
hideActorHoverBackground();
hideActorTextColorRect();
- Control *mouseCursor = _vm->getObjectControl(0x40004);
+ Control *mouseCursor = _vm->getObjectControl(Illusions::CURSOR_OBJECT_ID);
setGameState(_savedGameState);
mouseCursor->_actor->_actorIndex = _savedCursorActorIndex;
mouseCursor->_actor->_position = _savedCursorPos;
diff --git a/engines/illusions/sequenceopcodes.cpp b/engines/illusions/sequenceopcodes.cpp
index 21152097d9..b07e9ecbaa 100644
--- a/engines/illusions/sequenceopcodes.cpp
+++ b/engines/illusions/sequenceopcodes.cpp
@@ -45,12 +45,14 @@ SequenceOpcodes::~SequenceOpcodes() {
void SequenceOpcodes::execOpcode(Control *control, OpCall &opCall) {
if (!_opcodes[opCall._op])
error("SequenceOpcodes::execOpcode() Unimplemented opcode %d", opCall._op);
- debug(3, "execOpcode(%d)", opCall._op);
+ debug(3, "execSequenceOpcode(%d) %s objectID: %08X", opCall._op, _opcodeNames[opCall._op].c_str(), control->_objectId);
(*_opcodes[opCall._op])(control, opCall);
}
typedef Common::Functor2Mem<Control*, OpCall&, void, SequenceOpcodes> SequenceOpcodeI;
-#define OPCODE(op, func) _opcodes[op] = new SequenceOpcodeI(this, &SequenceOpcodes::func);
+#define OPCODE(op, func) \
+ _opcodes[op] = new SequenceOpcodeI(this, &SequenceOpcodes::func); \
+ _opcodeNames[op] = #func;
void SequenceOpcodes::initOpcodes() {
// First clear everything
diff --git a/engines/illusions/sequenceopcodes.h b/engines/illusions/sequenceopcodes.h
index 85e5df6c46..8432512372 100644
--- a/engines/illusions/sequenceopcodes.h
+++ b/engines/illusions/sequenceopcodes.h
@@ -41,6 +41,7 @@ public:
protected:
IllusionsEngine *_vm;
SequenceOpcode *_opcodes[256];
+ Common::String _opcodeNames[256];
void initOpcodes();
void freeOpcodes();
diff --git a/engines/illusions/threads/causethread_duckman.cpp b/engines/illusions/threads/causethread_duckman.cpp
index 8fb836467a..09f3fa9cf6 100644
--- a/engines/illusions/threads/causethread_duckman.cpp
+++ b/engines/illusions/threads/causethread_duckman.cpp
@@ -39,14 +39,14 @@ CauseThread_Duckman::CauseThread_Duckman(IllusionsEngine_Duckman *vm, uint32 thr
int CauseThread_Duckman::onUpdate() {
if (_flag) {
if (_vm->getCurrentScene() == _sceneId) {
- Control *cursorCursor = _vm->getObjectControl(0x40004);
+ Control *cursorCursor = _vm->getObjectControl(Illusions::CURSOR_OBJECT_ID);
cursorCursor->appearActor();
_vm->_input->discardEvent(kEventLeftClick);
}
return kTSTerminate;
} else {
_sceneId = _vm->getCurrentScene();
- Control *cursorCursor = _vm->getObjectControl(0x40004);
+ Control *cursorCursor = _vm->getObjectControl(Illusions::CURSOR_OBJECT_ID);
cursorCursor->disappearActor();
_vm->_input->discardEvent(kEventLeftClick);
_vm->startScriptThread(_triggerThreadId, _threadId);