aboutsummaryrefslogtreecommitdiff
path: root/engines/illusions/duckman
diff options
context:
space:
mode:
Diffstat (limited to 'engines/illusions/duckman')
-rw-r--r--engines/illusions/duckman/duckman_dialog.cpp178
-rw-r--r--engines/illusions/duckman/duckman_dialog.h51
-rw-r--r--engines/illusions/duckman/illusions_duckman.cpp116
-rw-r--r--engines/illusions/duckman/illusions_duckman.h14
4 files changed, 238 insertions, 121 deletions
diff --git a/engines/illusions/duckman/duckman_dialog.cpp b/engines/illusions/duckman/duckman_dialog.cpp
new file mode 100644
index 0000000000..b0b74df839
--- /dev/null
+++ b/engines/illusions/duckman/duckman_dialog.cpp
@@ -0,0 +1,178 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "illusions/duckman/illusions_duckman.h"
+#include "illusions/duckman/duckman_dialog.h"
+#include "illusions/actor.h"
+#include "illusions/camera.h"
+#include "illusions/cursor.h"
+#include "illusions/dictionary.h"
+#include "illusions/resources/fontresource.h"
+#include "illusions/graphics.h"
+#include "illusions/input.h"
+#include "illusions/resources/actorresource.h"
+#include "illusions/resources/backgroundresource.h"
+#include "illusions/resources/midiresource.h"
+#include "illusions/resources/scriptresource.h"
+#include "illusions/resources/soundresource.h"
+#include "illusions/resources/talkresource.h"
+#include "illusions/resourcesystem.h"
+#include "illusions/screen.h"
+#include "illusions/screentext.h"
+#include "illusions/scriptopcodes_duckman.h"
+#include "illusions/scriptstack.h"
+#include "illusions/sound.h"
+#include "illusions/specialcode.h"
+#include "illusions/textdrawer.h"
+#include "illusions/thread.h"
+#include "illusions/time.h"
+#include "illusions/updatefunctions.h"
+
+#include "illusions/threads/abortablethread.h"
+#include "illusions/threads/causethread_duckman.h"
+#include "illusions/threads/scriptthread.h"
+#include "illusions/threads/talkthread_duckman.h"
+#include "illusions/threads/timerthread.h"
+
+#include "engines/util.h"
+
+namespace Illusions {
+
+// DuckmanDialogSystem
+
+DuckmanDialogSystem::DuckmanDialogSystem(IllusionsEngine_Duckman *vm)
+ : _vm(vm) {
+}
+
+DuckmanDialogSystem::~DuckmanDialogSystem() {
+}
+
+void DuckmanDialogSystem::addDialogItem(int16 choiceJumpOffs, uint32 sequenceId) {
+ DialogItem dialogItem;
+ dialogItem._choiceJumpOffs = choiceJumpOffs;
+ dialogItem._sequenceId = sequenceId;
+ _dialogItems.push_back(dialogItem);
+}
+
+void DuckmanDialogSystem::startDialog(int16 *choiceOfsPtr, uint32 actorTypeId, uint32 callerThreadId) {
+ static const uint32 kDialogSequenceIds[] = {
+ 0,
+ 0x6049C, 0x6049C, 0x6047A, 0x6049D,
+ 0x60479, 0x6049E, 0x6049F, 0x60468
+ };
+ if (_dialogItems.size() == 1) {
+ *choiceOfsPtr = _dialogItems[0]._choiceJumpOffs;
+ _vm->notifyThreadId(callerThreadId);
+ } 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->_cursor._control->appearActor();
+ _vm->setCursorActorIndex(6, 1, 0);
+
+ _vm->_cursor._gameState = 3;
+ _vm->_cursor._notifyThreadId30 = callerThreadId;
+ _vm->_cursor._dialogItemsCount = 0;
+ _vm->_cursor._overlappedObjectId = 0;
+ _vm->_cursor._op113_choiceOfsPtr = choiceOfsPtr;
+ _vm->_cursor._currOverlappedControl = 0;
+
+ /* TODO?
+ if (!_vm->_input->getCursorMouseMode())
+ _vm->_input->setMousePos((Point)0xBC0014);
+ */
+
+ _vm->_cursor._dialogItemsCount = _dialogItems.size();
+ Common::Point placePt(20, 188);
+
+ for (uint i = 1; i <= _dialogItems.size(); ++i) {
+ DialogItem &dialogItem = _dialogItems[_dialogItems.size() - i];
+ _vm->_controls->placeDialogItem(i + 1, actorTypeId, dialogItem._sequenceId, placePt, dialogItem._choiceJumpOffs);
+ placePt.x += 40;
+ }
+
+ Common::Point placePt2 = _vm->getNamedPointPosition(0x700C3);
+ _vm->_controls->placeActor(0x5006E, placePt2, kDialogSequenceIds[_dialogItems.size()], 0x40148, 0);
+ Control *control = _vm->_dict->getObjectControl(0x40148);
+ control->_flags |= 8;
+ _vm->playSoundEffect(8);
+ }
+
+ _dialogItems.clear();
+
+}
+
+void DuckmanDialogSystem::updateDialogState() {
+ Common::Point mousePos = _vm->_input->getCursorPosition();
+ // TODO Handle keyboard input
+ _vm->_cursor._control->_actor->_position = mousePos;
+ mousePos = _vm->convertMousePos(mousePos);
+
+ Control *currOverlappedControl = _vm->_cursor._currOverlappedControl;
+ Control *newOverlappedControl;
+
+ if (_vm->_controls->getDialogItemAtPos(_vm->_cursor._control, mousePos, &newOverlappedControl)) {
+ if (currOverlappedControl != newOverlappedControl) {
+ newOverlappedControl->setActorIndex(2);
+ newOverlappedControl->startSequenceActor(newOverlappedControl->_actor->_sequenceId, 2, 0);
+ if (currOverlappedControl) {
+ currOverlappedControl->setActorIndex(1);
+ currOverlappedControl->startSequenceActor(currOverlappedControl->_actor->_sequenceId, 2, 0);
+ }
+ _vm->playSoundEffect(10);
+ _vm->startCursorSequence();
+ _vm->setCursorActorIndex(6, 2, 0);
+ _vm->_cursor._currOverlappedControl = newOverlappedControl;
+ _vm->_cursor._overlappedObjectId = newOverlappedControl->_objectId;
+ }
+ } else if (currOverlappedControl) {
+ currOverlappedControl->setActorIndex(1);
+ currOverlappedControl->startSequenceActor(currOverlappedControl->_actor->_sequenceId, 2, 0);
+ _vm->playSoundEffect(10);
+ _vm->_cursor._currOverlappedControl = 0;
+ _vm->_cursor._overlappedObjectId = 0;
+ _vm->startCursorSequence();
+ _vm->setCursorActorIndex(6, 1, 0);
+ }
+
+ if (_vm->_input->pollButton(1)) {
+ if (_vm->_cursor._currOverlappedControl) {
+ _vm->playSoundEffect(9);
+ *_vm->_cursor._op113_choiceOfsPtr = _vm->_cursor._currOverlappedControl->_actor->_choiceJumpOffs;
+ _vm->_controls->destroyDialogItems();
+ Control *control = _vm->_dict->getObjectControl(0x40148);
+ _vm->_controls->destroyControl(control);
+ _vm->notifyThreadId(_vm->_cursor._notifyThreadId30);
+ _vm->_cursor._notifyThreadId30 = 0;
+ _vm->_cursor._gameState = 2;
+ _vm->_cursor._dialogItemsCount = 0;
+ _vm->_cursor._overlappedObjectId = 0;
+ _vm->_cursor._op113_choiceOfsPtr = 0;
+ _vm->_cursor._control->disappearActor();
+ }
+ }
+
+}
+
+} // End of namespace Illusions
diff --git a/engines/illusions/duckman/duckman_dialog.h b/engines/illusions/duckman/duckman_dialog.h
new file mode 100644
index 0000000000..9c7cfad484
--- /dev/null
+++ b/engines/illusions/duckman/duckman_dialog.h
@@ -0,0 +1,51 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef ILLUSIONS_DUCKMAN_DUCKMAN_DIALOG_H
+#define ILLUSIONS_DUCKMAN_DUCKMAN_DIALOG_H
+
+#include "illusions/illusions.h"
+#include "common/algorithm.h"
+#include "common/stack.h"
+
+namespace Illusions {
+
+struct DialogItem {
+ int16 _choiceJumpOffs;
+ uint32 _sequenceId;
+};
+
+class DuckmanDialogSystem {
+public:
+ DuckmanDialogSystem(IllusionsEngine_Duckman *vm);
+ ~DuckmanDialogSystem();
+ void addDialogItem(int16 choiceJumpOffs, uint32 sequenceId);
+ void startDialog(int16 *choiceOfsPtr, uint32 actorTypeId, uint32 callerThreadId);
+ void updateDialogState();
+public:
+ IllusionsEngine_Duckman *_vm;
+ Common::Array<DialogItem> _dialogItems;
+};
+
+} // End of namespace Illusions
+
+#endif // ILLUSIONS_DUCKMAN_DUCKMAN_DIALOG_H
diff --git a/engines/illusions/duckman/illusions_duckman.cpp b/engines/illusions/duckman/illusions_duckman.cpp
index 2aa6d00372..17c930b3df 100644
--- a/engines/illusions/duckman/illusions_duckman.cpp
+++ b/engines/illusions/duckman/illusions_duckman.cpp
@@ -21,6 +21,7 @@
*/
#include "illusions/duckman/illusions_duckman.h"
+#include "illusions/duckman/duckman_dialog.h"
#include "illusions/duckman/duckman_specialcode.h"
#include "illusions/actor.h"
#include "illusions/camera.h"
@@ -109,6 +110,8 @@ Common::Error IllusionsEngine_Duckman::run() {
_soundMan = new SoundMan(this);
_fader = new Fader();
+
+ _dialogSys = new DuckmanDialogSystem(this);
initUpdateFunctions();
@@ -167,6 +170,8 @@ Common::Error IllusionsEngine_Duckman::run() {
delete _stack;
delete _scriptOpcodes;
+ delete _dialogSys;
+
delete _fader;
delete _soundMan;
@@ -582,7 +587,7 @@ void IllusionsEngine_Duckman::cursorControlRoutine(Control *control, uint32 delt
updateGameState2();
break;
case 3:
- updateDialogState();
+ _dialogSys->updateDialogState();
break;
case 4:
// TODO ShellMgr_update(_cursor._control);
@@ -1024,113 +1029,4 @@ uint32 IllusionsEngine_Duckman::runTriggerCause(uint32 verbId, uint32 objectId2,
return tempThreadId;
}
-void IllusionsEngine_Duckman::addDialogItem(int16 choiceJumpOffs, uint32 sequenceId) {
- DialogItem dialogItem;
- dialogItem._choiceJumpOffs = choiceJumpOffs;
- dialogItem._sequenceId = sequenceId;
- _dialogItems.push_back(dialogItem);
-}
-
-void IllusionsEngine_Duckman::startDialog(int16 *choiceOfsPtr, uint32 actorTypeId, uint32 callerThreadId) {
- static const uint32 kDialogSequenceIds[] = {
- 0,
- 0x6049C, 0x6049C, 0x6047A, 0x6049D,
- 0x60479, 0x6049E, 0x6049F, 0x60468
- };
- if (_dialogItems.size() == 1) {
- *choiceOfsPtr = _dialogItems[0]._choiceJumpOffs;
- notifyThreadId(callerThreadId);
- } else {
- if (!_cursor._control) {
- Common::Point pos = getNamedPointPosition(0x70001);
- _controls->placeActor(0x50001, pos, 0x60001, 0x40004, 0);
- _cursor._control = _dict->getObjectControl(0x40004);
- }
- _cursor._control->appearActor();
- setCursorActorIndex(6, 1, 0);
-
- _cursor._gameState = 3;
- _cursor._notifyThreadId30 = callerThreadId;
- _cursor._dialogItemsCount = 0;
- _cursor._overlappedObjectId = 0;
- _cursor._op113_choiceOfsPtr = choiceOfsPtr;
- _cursor._currOverlappedControl = 0;
-
- /* TODO?
- if (!_input->getCursorMouseMode())
- _input->setMousePos((Point)0xBC0014);
- */
-
- _cursor._dialogItemsCount = _dialogItems.size();
- Common::Point placePt(20, 188);
-
- for (uint i = 1; i <= _dialogItems.size(); ++i) {
- DialogItem &dialogItem = _dialogItems[_dialogItems.size() - i];
- _controls->placeDialogItem(i + 1, actorTypeId, dialogItem._sequenceId, placePt, dialogItem._choiceJumpOffs);
- placePt.x += 40;
- }
-
- Common::Point placePt2 = getNamedPointPosition(0x700C3);
- _controls->placeActor(0x5006E, placePt2, kDialogSequenceIds[_dialogItems.size()], 0x40148, 0);
- Control *control = _dict->getObjectControl(0x40148);
- control->_flags |= 8;
- playSoundEffect(8);
- }
-
- _dialogItems.clear();
-
-}
-
-void IllusionsEngine_Duckman::updateDialogState() {
- Common::Point mousePos = _input->getCursorPosition();
- // TODO Handle keyboard input
- _cursor._control->_actor->_position = mousePos;
- mousePos = convertMousePos(mousePos);
-
- Control *currOverlappedControl = _cursor._currOverlappedControl;
- Control *newOverlappedControl;
-
- if (_controls->getDialogItemAtPos(_cursor._control, mousePos, &newOverlappedControl)) {
- if (currOverlappedControl != newOverlappedControl) {
- newOverlappedControl->setActorIndex(2);
- newOverlappedControl->startSequenceActor(newOverlappedControl->_actor->_sequenceId, 2, 0);
- if (currOverlappedControl) {
- currOverlappedControl->setActorIndex(1);
- currOverlappedControl->startSequenceActor(currOverlappedControl->_actor->_sequenceId, 2, 0);
- }
- playSoundEffect(10);
- startCursorSequence();
- setCursorActorIndex(6, 2, 0);
- _cursor._currOverlappedControl = newOverlappedControl;
- _cursor._overlappedObjectId = newOverlappedControl->_objectId;
- }
- } else if (currOverlappedControl) {
- currOverlappedControl->setActorIndex(1);
- currOverlappedControl->startSequenceActor(currOverlappedControl->_actor->_sequenceId, 2, 0);
- playSoundEffect(10);
- _cursor._currOverlappedControl = 0;
- _cursor._overlappedObjectId = 0;
- startCursorSequence();
- setCursorActorIndex(6, 1, 0);
- }
-
- if (_input->pollButton(1)) {
- if (_cursor._currOverlappedControl) {
- playSoundEffect(9);
- *_cursor._op113_choiceOfsPtr = _cursor._currOverlappedControl->_actor->_choiceJumpOffs;
- _controls->destroyDialogItems();
- Control *control = _dict->getObjectControl(0x40148);
- _controls->destroyControl(control);
- notifyThreadId(_cursor._notifyThreadId30);
- _cursor._notifyThreadId30 = 0;
- _cursor._gameState = 2;
- _cursor._dialogItemsCount = 0;
- _cursor._overlappedObjectId = 0;
- _cursor._op113_choiceOfsPtr = 0;
- _cursor._control->disappearActor();
- }
- }
-
-}
-
} // End of namespace Illusions
diff --git a/engines/illusions/duckman/illusions_duckman.h b/engines/illusions/duckman/illusions_duckman.h
index ce76d36020..7638c3a44d 100644
--- a/engines/illusions/duckman/illusions_duckman.h
+++ b/engines/illusions/duckman/illusions_duckman.h
@@ -31,6 +31,7 @@ namespace Illusions {
class Dictionary;
class ScriptStack;
+class DuckmanDialogSystem;
struct Cursor_Duckman {
int _gameState;
@@ -51,11 +52,6 @@ struct Cursor_Duckman {
uint32 _field40;
};
-struct DialogItem {
- int16 _choiceJumpOffs;
- uint32 _sequenceId;
-};
-
struct ScreenShakerPoint {
int16 x, y;
};
@@ -97,8 +93,8 @@ public:
Cursor_Duckman _cursor;
Control *_currWalkOverlappedControl;
-
- Common::Array<DialogItem> _dialogItems;
+
+ DuckmanDialogSystem *_dialogSys;
int _savedInventoryActorIndex;
@@ -181,10 +177,6 @@ public:
bool getTriggerCause(uint32 verbId, uint32 objectId2, uint32 objectId, uint32 &outThreadId);
uint32 runTriggerCause(uint32 verbId, uint32 objectId2, uint32 objectId);
- void addDialogItem(int16 choiceJumpOffs, uint32 sequenceId);
- void startDialog(int16 *choiceOfsPtr, uint32 actorTypeId, uint32 callerThreadId);
- void updateDialogState();
-
};
} // End of namespace Illusions