aboutsummaryrefslogtreecommitdiff
path: root/engines/tsage
diff options
context:
space:
mode:
Diffstat (limited to 'engines/tsage')
-rw-r--r--engines/tsage/blue_force/blueforce_dialogs.cpp96
-rw-r--r--engines/tsage/blue_force/blueforce_dialogs.h14
-rw-r--r--engines/tsage/blue_force/blueforce_logic.cpp142
-rw-r--r--engines/tsage/blue_force/blueforce_logic.h15
-rw-r--r--engines/tsage/blue_force/blueforce_scenes0.cpp274
-rw-r--r--engines/tsage/blue_force/blueforce_scenes0.h11
-rw-r--r--engines/tsage/blue_force/blueforce_scenes1.cpp403
-rw-r--r--engines/tsage/blue_force/blueforce_scenes1.h50
-rw-r--r--engines/tsage/blue_force/blueforce_scenes2.cpp114
-rw-r--r--engines/tsage/blue_force/blueforce_scenes3.cpp404
-rw-r--r--engines/tsage/blue_force/blueforce_scenes3.h23
-rw-r--r--engines/tsage/blue_force/blueforce_scenes4.cpp216
-rw-r--r--engines/tsage/blue_force/blueforce_scenes4.h6
-rw-r--r--engines/tsage/blue_force/blueforce_scenes5.cpp151
-rw-r--r--engines/tsage/blue_force/blueforce_scenes5.h3
-rw-r--r--engines/tsage/blue_force/blueforce_scenes6.cpp62
-rw-r--r--engines/tsage/blue_force/blueforce_scenes6.h2
-rw-r--r--engines/tsage/blue_force/blueforce_scenes7.cpp54
-rw-r--r--engines/tsage/blue_force/blueforce_scenes7.h5
-rw-r--r--engines/tsage/blue_force/blueforce_scenes8.cpp140
-rw-r--r--engines/tsage/blue_force/blueforce_scenes9.cpp667
-rw-r--r--engines/tsage/blue_force/blueforce_scenes9.h40
-rw-r--r--engines/tsage/converse.cpp136
-rw-r--r--engines/tsage/converse.h14
-rw-r--r--engines/tsage/core.cpp550
-rw-r--r--engines/tsage/core.h55
-rw-r--r--engines/tsage/debugger.cpp307
-rw-r--r--engines/tsage/debugger.h28
-rw-r--r--engines/tsage/detection.cpp1
-rw-r--r--engines/tsage/detection_tables.h26
-rw-r--r--engines/tsage/dialogs.cpp236
-rw-r--r--engines/tsage/dialogs.h41
-rw-r--r--engines/tsage/events.cpp48
-rw-r--r--engines/tsage/events.h41
-rw-r--r--engines/tsage/globals.cpp276
-rw-r--r--engines/tsage/globals.h84
-rw-r--r--engines/tsage/graphics.cpp201
-rw-r--r--engines/tsage/graphics.h25
-rw-r--r--engines/tsage/module.mk4
-rw-r--r--engines/tsage/resources.cpp143
-rw-r--r--engines/tsage/resources.h9
-rw-r--r--engines/tsage/ringworld/ringworld_dialogs.cpp240
-rw-r--r--engines/tsage/ringworld/ringworld_dialogs.h39
-rw-r--r--engines/tsage/ringworld/ringworld_logic.cpp61
-rw-r--r--engines/tsage/ringworld/ringworld_logic.h4
-rw-r--r--engines/tsage/ringworld/ringworld_scenes10.cpp11
-rw-r--r--engines/tsage/ringworld/ringworld_scenes10.h2
-rw-r--r--engines/tsage/ringworld/ringworld_scenes3.cpp6
-rw-r--r--engines/tsage/ringworld/ringworld_scenes5.cpp26
-rw-r--r--engines/tsage/ringworld/ringworld_scenes5.h8
-rw-r--r--engines/tsage/ringworld/ringworld_scenes6.cpp2
-rw-r--r--engines/tsage/ringworld/ringworld_scenes8.cpp46
-rw-r--r--engines/tsage/ringworld/ringworld_scenes8.h2
-rw-r--r--engines/tsage/ringworld2/ringworld2_dialogs.cpp262
-rw-r--r--engines/tsage/ringworld2/ringworld2_dialogs.h25
-rw-r--r--engines/tsage/ringworld2/ringworld2_logic.cpp1583
-rw-r--r--engines/tsage/ringworld2/ringworld2_logic.h219
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes0.cpp7311
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes0.h843
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes1.cpp14622
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes1.h1242
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes2.cpp4527
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes2.h672
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes3.cpp5603
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes3.h868
-rw-r--r--engines/tsage/ringworld2/ringworld2_speakers.cpp2968
-rw-r--r--engines/tsage/ringworld2/ringworld2_speakers.h637
-rw-r--r--engines/tsage/saveload.cpp3
-rw-r--r--engines/tsage/saveload.h2
-rw-r--r--engines/tsage/scenes.cpp17
-rw-r--r--engines/tsage/sound.cpp22
-rw-r--r--engines/tsage/sound.h14
-rw-r--r--engines/tsage/staticres.cpp436
-rw-r--r--engines/tsage/staticres.h238
-rw-r--r--engines/tsage/tsage.cpp14
-rw-r--r--engines/tsage/tsage.h3
-rw-r--r--engines/tsage/user_interface.cpp95
-rw-r--r--engines/tsage/user_interface.h1
78 files changed, 45193 insertions, 2598 deletions
diff --git a/engines/tsage/blue_force/blueforce_dialogs.cpp b/engines/tsage/blue_force/blueforce_dialogs.cpp
index 86feceb015..a76d5839a9 100644
--- a/engines/tsage/blue_force/blueforce_dialogs.cpp
+++ b/engines/tsage/blue_force/blueforce_dialogs.cpp
@@ -163,9 +163,12 @@ void RightClickDialog::execute() {
}
g_system->delayMillis(10);
- g_system->updateScreen();
+ GLOBALS._screenSurface.updateScreen();
}
+ // Deactivate the graphics manager used for the dialog
+ _gfxManager.deactivate();
+
// Execute the specified action
CursorType cursorNum = CURSOR_NONE;
switch (_selectedAction) {
@@ -187,13 +190,12 @@ void RightClickDialog::execute() {
break;
case 4:
// Options dialog
+ BlueForce::OptionsDialog::show();
break;
}
if (cursorNum != CURSOR_NONE)
BF_GLOBALS._events.setCursor(cursorNum);
-
- _gfxManager.deactivate();
}
/*--------------------------------------------------------------------------*/
@@ -242,7 +244,7 @@ void AmmoBeltDialog::execute() {
}
g_system->delayMillis(10);
- g_system->updateScreen();
+ GLOBALS._screenSurface.updateScreen();
}
_gfxManager.deactivate();
@@ -342,7 +344,7 @@ void AmmoBeltDialog::draw() {
// Draw the first clip if necessary
if (clip1) {
- GfxSurface clipSurface = surfaceFromRes(9, 6, BF_GLOBALS._clip1Bullets);
+ GfxSurface clipSurface = surfaceFromRes(9, 6, BF_GLOBALS._clip1Bullets + 1);
_clip1Rect.resize(clipSurface, _clip1Rect.left, _clip1Rect.top, 100);
g_globals->gfxManager().copyFrom(clipSurface, bounds.left + _clip1Rect.left,
bounds.top + _clip1Rect.top);
@@ -350,7 +352,7 @@ void AmmoBeltDialog::draw() {
// Draw the second clip if necessary
if (clip2) {
- GfxSurface clipSurface = surfaceFromRes(9, 6, BF_GLOBALS._clip2Bullets);
+ GfxSurface clipSurface = surfaceFromRes(9, 6, BF_GLOBALS._clip2Bullets + 1);
_clip2Rect.resize(clipSurface, _clip2Rect.left, _clip2Rect.top, 100);
g_globals->gfxManager().copyFrom(clipSurface, bounds.left + _clip2Rect.left,
bounds.top + _clip2Rect.top);
@@ -428,6 +430,88 @@ int RadioConvDialog::show() {
return btnIndex;
}
+/*--------------------------------------------------------------------------*/
+
+void OptionsDialog::show() {
+ OptionsDialog *dlg = new OptionsDialog();
+ dlg->draw();
+
+ // Show the dialog
+ GfxButton *btn = dlg->execute();
+
+ // Get which button was pressed
+ int btnIndex = -1;
+ if (btn == &dlg->_btnRestore)
+ btnIndex = 0;
+ else if (btn == &dlg->_btnSave)
+ btnIndex = 1;
+ else if (btn == &dlg->_btnRestart)
+ btnIndex = 2;
+ else if (btn == &dlg->_btnQuit)
+ btnIndex = 3;
+ else if (btn == &dlg->_btnSound)
+ btnIndex = 4;
+
+ // Close the dialog
+ dlg->remove();
+ delete dlg;
+
+ // Execute the given selection
+ if (btnIndex == 0) {
+ // Restore button
+ g_globals->_game->restoreGame();
+ } else if (btnIndex == 1) {
+ // Save button
+ g_globals->_game->saveGame();
+ } else if (btnIndex == 2) {
+ // Restart game
+ g_globals->_game->restartGame();
+ } else if (btnIndex == 3) {
+ // Quit game
+ if (MessageDialog::show(QUIT_CONFIRM_MSG, CANCEL_BTN_STRING, QUIT_BTN_STRING) == 1) {
+ g_vm->quitGame();
+ }
+ } else if (btnIndex == 4) {
+ // Sound dialog
+ SoundDialog::execute();
+ }
+}
+
+OptionsDialog::OptionsDialog() {
+ // Set the element text
+ _gfxMessage.set(OPTIONS_MSG, 140, ALIGN_LEFT);
+ _btnRestore.setText(RESTORE_BTN_STRING);
+ _btnSave.setText(SAVE_BTN_STRING);
+ _btnRestart.setText(RESTART_BTN_STRING);
+ _btnQuit.setText(QUIT_BTN_STRING);
+ _btnSound.setText(SOUND_BTN_STRING);
+ _btnResume.setText(RESUME_BTN_STRING);
+
+ // Set position of the elements
+ _gfxMessage._bounds.moveTo(0, 1);
+ _btnRestore._bounds.moveTo(0, _gfxMessage._bounds.bottom + 1);
+ _btnSave._bounds.moveTo(0, _btnRestore._bounds.bottom + 1);
+ _btnRestart._bounds.moveTo(0, _btnSave._bounds.bottom + 1);
+ _btnQuit._bounds.moveTo(0, _btnRestart._bounds.bottom + 1);
+ _btnSound._bounds.moveTo(0, _btnQuit._bounds.bottom + 1);
+ _btnResume._bounds.moveTo(0, _btnSound._bounds.bottom + 1);
+
+ // Set all the buttons to the widest button
+ GfxButton *btnList[6] = {&_btnRestore, &_btnSave, &_btnRestart, &_btnQuit, &_btnSound, &_btnResume};
+ int16 btnWidth = 0;
+ for (int idx = 0; idx < 6; ++idx)
+ btnWidth = MAX(btnWidth, btnList[idx]->_bounds.width());
+ for (int idx = 0; idx < 6; ++idx)
+ btnList[idx]->_bounds.setWidth(btnWidth);
+
+ // Add the items to the dialog
+ addElements(&_gfxMessage, &_btnRestore, &_btnSave, &_btnRestart, &_btnQuit, &_btnSound, &_btnResume, NULL);
+
+ // Set the dialog size and position
+ frame();
+ _bounds.collapse(-6, -6);
+ setCenter(160, 90);
+}
} // End of namespace BlueForce
diff --git a/engines/tsage/blue_force/blueforce_dialogs.h b/engines/tsage/blue_force/blueforce_dialogs.h
index ca51c97aa2..76de7d19d9 100644
--- a/engines/tsage/blue_force/blueforce_dialogs.h
+++ b/engines/tsage/blue_force/blueforce_dialogs.h
@@ -85,6 +85,20 @@ public:
static int show();
};
+class OptionsDialog: public GfxDialog {
+private:
+ GfxButton _btnSave, _btnRestore, _btnRestart;
+ GfxButton _btnQuit, _btnResume;
+ GfxButton _btnSound;
+ GfxMessage _gfxMessage;
+public:
+ OptionsDialog();
+ virtual ~OptionsDialog() {}
+
+ static void show();
+};
+
+
} // End of namespace BlueForce
} // End of namespace TsAGE
diff --git a/engines/tsage/blue_force/blueforce_logic.cpp b/engines/tsage/blue_force/blueforce_logic.cpp
index 130cf557b2..3aef18f4f0 100644
--- a/engines/tsage/blue_force/blueforce_logic.cpp
+++ b/engines/tsage/blue_force/blueforce_logic.cpp
@@ -20,6 +20,7 @@
*
*/
+#include "common/config-manager.h"
#include "tsage/blue_force/blueforce_logic.h"
#include "tsage/blue_force/blueforce_dialogs.h"
#include "tsage/blue_force/blueforce_scenes0.h"
@@ -42,8 +43,25 @@ namespace TsAGE {
namespace BlueForce {
void BlueForceGame::start() {
- // Start the game
- g_globals->_sceneManager.changeScene(20);
+ int slot = -1;
+
+ // Check for a savegame to load straight from the launcher
+ if (ConfMan.hasKey("save_slot")) {
+ slot = ConfMan.getInt("save_slot");
+ Common::String file = g_vm->generateSaveName(slot);
+ Common::InSaveFile *in = g_vm->_system->getSavefileManager()->openForLoading(file);
+ if (in)
+ delete in;
+ else
+ slot = -1;
+ }
+
+ if (slot >= 0)
+ // Set the savegame slot to load in the main loop
+ g_globals->_sceneHandler->_loadGameSlot = slot;
+ else
+ // Switch to the title screen
+ g_globals->_sceneManager.setNewScene(20);
}
Scene *BlueForceGame::createScene(int sceneNumber) {
@@ -255,14 +273,16 @@ Scene *BlueForceGame::createScene(int sceneNumber) {
* Returns true if it is currently okay to restore a game
*/
bool BlueForceGame::canLoadGameStateCurrently() {
- return true;
+ // Don't allow a game to be loaded if a dialog is active
+ return g_globals->_gfxManagers.size() == 1;
}
/**
* Returns true if it is currently okay to save the game
*/
bool BlueForceGame::canSaveGameStateCurrently() {
- return true;
+ // Don't allow a game to be saved if a dialog is active
+ return g_globals->_gfxManagers.size() == 1;
}
void BlueForceGame::rightClick() {
@@ -315,6 +335,24 @@ void BlueForceGame::processEvent(Event &event) {
}
}
+void BlueForceGame::restart() {
+ g_globals->_scenePalette.clearListeners();
+ g_globals->_soundHandler.stop();
+
+ // Reset the globals
+ g_globals->reset();
+
+ // Clear save/load slots
+ g_globals->_sceneHandler->_saveGameSlot = -1;
+ g_globals->_sceneHandler->_loadGameSlot = -1;
+
+ g_globals->_stripNum = 0;
+ g_globals->_events.setCursor(CURSOR_WALK);
+
+ // Change to the first game scene
+ g_globals->_sceneManager.changeScene(190);
+}
+
/*--------------------------------------------------------------------------*/
AObjectArray::AObjectArray(): EventHandler() {
@@ -515,35 +553,6 @@ bool NamedObject::startAction(CursorType action, Event &event) {
return handled;
}
-void NamedObject::setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) {
- _resNum = resNum;
- _lookLineNum = lookLineNum;
- _talkLineNum = talkLineNum;
- _useLineNum = useLineNum;
-
- switch (mode) {
- case 2:
- g_globals->_sceneItems.push_front(this);
- break;
- case 4:
- g_globals->_sceneItems.addBefore(item, this);
- break;
- case 5:
- g_globals->_sceneItems.addAfter(item, this);
- break;
- default:
- g_globals->_sceneItems.push_back(this);
- break;
- }
-}
-
-void NamedObject::setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum) {
- _resNum = resNum;
- _lookLineNum = lookLineNum;
- _talkLineNum = talkLineNum;
- _useLineNum = useLineNum;
-}
-
/*--------------------------------------------------------------------------*/
CountdownObject::CountdownObject(): NamedObject() {
@@ -604,14 +613,14 @@ void FollowerObject::dispatch() {
} else if ((_object->_visage != 308) || (_object->_strip != 1)) {
show();
setStrip(_object->_strip);
- setPosition(_object->_position, _object->_yDiff);
+ setPosition(Common::Point(_object->_position.x + 1, _object->_position.y), _yDiff);
}
}
void FollowerObject::reposition() {
assert(_object);
setStrip(_object->_strip);
- setPosition(_object->_position, _object->_yDiff);
+ setPosition(_object->_position, _yDiff);
NamedObject::reposition();
}
@@ -724,7 +733,7 @@ void SceneExt::remove() {
_action->_endHandler = NULL;
_action->remove();
}
-
+
_focusObject = NULL;
}
@@ -755,6 +764,7 @@ void SceneExt::loadScene(int sceneNum) {
_v51C34.top = 0;
_v51C34.bottom = 300;
+ BF_GLOBALS._sceneHandler->_delayTicks = 1;
}
void SceneExt::checkGun() {
@@ -955,7 +965,7 @@ void SceneHandlerExt::process(Event &event) {
return;
}
- // If the user clicks the button whislt the introduction is active, prompt for playing the game
+ // If the user clicks the button whilst the introduction is active, prompt for playing the game
if ((BF_GLOBALS._dayNumber == 0) && (event.eventType == EVENT_BUTTON_DOWN)) {
// Prompt user for whether to start play or watch introduction
BF_GLOBALS._player.enableControl();
@@ -1316,7 +1326,7 @@ bool BlueForceInvObjectList::SelectItem(int objectNumber) {
AmmoBeltDialog *dlg = new AmmoBeltDialog();
dlg->execute();
delete dlg;
-
+
return true;
}
@@ -1358,58 +1368,6 @@ bool NamedHotspot::startAction(CursorType action, Event &event) {
}
}
-void NamedHotspot::setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum) {
- setBounds(ys, xe, ye, xs);
- _resNum = resnum;
- _lookLineNum = lookLineNum;
- _useLineNum = useLineNum;
- _talkLineNum = -1;
- g_globals->_sceneItems.addItems(this, NULL);
-}
-
-void NamedHotspot::setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) {
- setBounds(bounds);
- _resNum = resNum;
- _lookLineNum = lookLineNum;
- _talkLineNum = talkLineNum;
- _useLineNum = useLineNum;
-
- switch (mode) {
- case 2:
- g_globals->_sceneItems.push_front(this);
- break;
- case 4:
- g_globals->_sceneItems.addBefore(item, this);
- break;
- case 5:
- g_globals->_sceneItems.addAfter(item, this);
- break;
- default:
- g_globals->_sceneItems.push_back(this);
- break;
- }
-}
-
-void NamedHotspot::setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode) {
- _sceneRegionId = sceneRegionId;
- _resNum = resNum;
- _lookLineNum = lookLineNum;
- _talkLineNum = talkLineNum;
- _useLineNum = useLineNum;
-
- // Handle adding hotspot to scene items list as necessary
- switch (mode) {
- case 2:
- GLOBALS._sceneItems.push_front(this);
- break;
- case 3:
- break;
- default:
- GLOBALS._sceneItems.push_back(this);
- break;
- }
-}
-
void NamedHotspot::synchronize(Serializer &s) {
SceneHotspot::synchronize(s);
s.syncAsSint16LE(_resNum);
@@ -1450,7 +1408,7 @@ void SceneMessage::signal() {
}
void SceneMessage::process(Event &event) {
- if ((event.eventType == EVENT_BUTTON_DOWN) ||
+ if ((event.eventType == EVENT_BUTTON_DOWN) ||
((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_RETURN))) {
signal();
}
@@ -1481,7 +1439,7 @@ void SceneMessage::draw() {
void SceneMessage::clear() {
// Fade out the text display
- static const uint32 black = 0;
+ static const uint32 black = 0;
BF_GLOBALS._scenePalette.fade((const byte *)&black, false, 100);
// Refresh the background
diff --git a/engines/tsage/blue_force/blueforce_logic.h b/engines/tsage/blue_force/blueforce_logic.h
index 1b161bce06..59bc2b7a51 100644
--- a/engines/tsage/blue_force/blueforce_logic.h
+++ b/engines/tsage/blue_force/blueforce_logic.h
@@ -45,6 +45,7 @@ public:
virtual void processEvent(Event &event);
virtual bool canSaveGameStateCurrently();
virtual bool canLoadGameStateCurrently();
+ virtual void restart();
};
#define OBJ_ARRAY_SIZE 10
@@ -64,6 +65,9 @@ public:
void add(EventHandler *obj);
void remove(EventHandler *obj);
+ // The following line prevents compiler warnings about hiding the remove()
+ // method from the parent class.
+ virtual void remove() { EventHandler::remove(); }
};
class Timer: public EventHandler {
@@ -115,16 +119,10 @@ public:
class NamedObject: public SceneObject {
public:
- int _resNum;
- int _lookLineNum, _talkLineNum, _useLineNum;
-
virtual Common::String getClassName() { return "NamedObject"; }
virtual void synchronize(Serializer &s);
virtual void postInit(SceneObjectList *OwnerList = NULL);
virtual bool startAction(CursorType action, Event &event);
-
- void setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item);
- void setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum);
};
class NamedObjectExt: public NamedObject {
@@ -334,16 +332,11 @@ public:
class NamedHotspot : public SceneHotspot {
public:
- int _resNum, _lookLineNum, _useLineNum, _talkLineNum;
NamedHotspot();
-
virtual bool startAction(CursorType action, Event &event);
virtual Common::String getClassName() { return "NamedHotspot"; }
virtual void synchronize(Serializer &s);
- virtual void setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum);
- virtual void setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item);
- virtual void setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode);
};
class NamedHotspotExt : public NamedHotspot {
diff --git a/engines/tsage/blue_force/blueforce_scenes0.cpp b/engines/tsage/blue_force/blueforce_scenes0.cpp
index bb283d051e..95598babc6 100644
--- a/engines/tsage/blue_force/blueforce_scenes0.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes0.cpp
@@ -48,45 +48,45 @@ void Scene20::Action1::signal() {
BF_GLOBALS._scenePalette.addRotation(64, 127, -1, 1, this);
break;
case 2:
- scene->_object1.setVisage(22);
- scene->_object1._strip = 1;
- scene->_object1._frame = 1;
- scene->_object1.changeZoom(100);
-
- scene->_object2.setVisage(22);
- scene->_object2._strip = 2;
- scene->_object2._frame = 1;
- scene->_object2.changeZoom(100);
-
- scene->_object3.setVisage(22);
- scene->_object3._strip = 3;
- scene->_object3._frame = 1;
- scene->_object3.changeZoom(100);
-
- scene->_object4.setVisage(22);
- scene->_object4._strip = 4;
- scene->_object4._frame = 1;
- scene->_object4.changeZoom(100);
-
- scene->_object5.setVisage(22);
- scene->_object5._strip = 5;
- scene->_object5._frame = 1;
- scene->_object5.changeZoom(100);
-
- scene->_object6.setVisage(22);
- scene->_object6._strip = 6;
- scene->_object6._frame = 1;
- scene->_object6.changeZoom(100);
-
- scene->_object7.setVisage(22);
- scene->_object7._strip = 7;
- scene->_object7._frame = 1;
- scene->_object7.changeZoom(100);
-
- scene->_object8.setVisage(22);
- scene->_object8._strip = 8;
- scene->_object8._frame = 1;
- scene->_object8.changeZoom(100);
+ scene->_tsunamiWave.setVisage(22);
+ scene->_tsunamiWave._strip = 1;
+ scene->_tsunamiWave._frame = 1;
+ scene->_tsunamiWave.changeZoom(100);
+
+ scene->_letterT.setVisage(22);
+ scene->_letterT._strip = 2;
+ scene->_letterT._frame = 1;
+ scene->_letterT.changeZoom(100);
+
+ scene->_letterS.setVisage(22);
+ scene->_letterS._strip = 3;
+ scene->_letterS._frame = 1;
+ scene->_letterS.changeZoom(100);
+
+ scene->_letterU.setVisage(22);
+ scene->_letterU._strip = 4;
+ scene->_letterU._frame = 1;
+ scene->_letterU.changeZoom(100);
+
+ scene->_letterN.setVisage(22);
+ scene->_letterN._strip = 5;
+ scene->_letterN._frame = 1;
+ scene->_letterN.changeZoom(100);
+
+ scene->_letterA.setVisage(22);
+ scene->_letterA._strip = 6;
+ scene->_letterA._frame = 1;
+ scene->_letterA.changeZoom(100);
+
+ scene->_letterM.setVisage(22);
+ scene->_letterM._strip = 7;
+ scene->_letterM._frame = 1;
+ scene->_letterM.changeZoom(100);
+
+ scene->_letterI.setVisage(22);
+ scene->_letterI._strip = 8;
+ scene->_letterI._frame = 1;
+ scene->_letterI.changeZoom(100);
setDelay(1);
break;
@@ -97,12 +97,12 @@ void Scene20::Action1::signal() {
setDelay(60);
break;
case 5:
- scene->_object2.animate(ANIM_MODE_5, NULL);
- scene->_object3.animate(ANIM_MODE_5, NULL);
- scene->_object4.animate(ANIM_MODE_5, NULL);
- scene->_object5.animate(ANIM_MODE_5, NULL);
- scene->_object6.animate(ANIM_MODE_5, NULL);
- scene->_object7.animate(ANIM_MODE_5, this);
+ scene->_letterT.animate(ANIM_MODE_5, NULL);
+ scene->_letterS.animate(ANIM_MODE_5, NULL);
+ scene->_letterU.animate(ANIM_MODE_5, NULL);
+ scene->_letterN.animate(ANIM_MODE_5, NULL);
+ scene->_letterA.animate(ANIM_MODE_5, NULL);
+ scene->_letterM.animate(ANIM_MODE_5, this);
break;
case 6:
setDelay(120);
@@ -121,76 +121,76 @@ void Scene20::Action1::signal() {
void Scene20::postInit(SceneObjectList *OwnerList) {
loadScene(20);
- Scene::postInit();
+ SceneExt::postInit();
setZoomPercents(60, 85, 200, 100);
BF_GLOBALS._interfaceY = SCREEN_HEIGHT;
_scenePalette.loadPalette(1);
_scenePalette.loadPalette(22);
- _object1.postInit();
- _object1.setVisage(21);
- _object1._strip = 1;
- _object1._frame = 1;
- _object1.animate(ANIM_MODE_NONE, NULL);
- _object1.setPosition(Common::Point(62, 85));
- _object1.changeZoom(100);
-
- _object2.postInit();
- _object2.setVisage(21);
- _object2._strip = 2;
- _object2._frame = 1;
- _object2.animate(ANIM_MODE_NONE, NULL);
- _object2.setPosition(Common::Point(27, 94));
- _object2.changeZoom(100);
-
- _object3.postInit();
- _object3.setVisage(21);
- _object3._strip = 2;
- _object3._frame = 2;
- _object3.animate(ANIM_MODE_NONE, NULL);
- _object3.setPosition(Common::Point(68, 94));
- _object3.changeZoom(100);
-
- _object4.postInit();
- _object4.setVisage(21);
- _object4._strip = 2;
- _object4._frame = 3;
- _object4.animate(ANIM_MODE_NONE, NULL);
- _object4.setPosition(Common::Point(110, 94));
- _object4.changeZoom(100);
-
- _object5.postInit();
- _object5.setVisage(21);
- _object5._strip = 2;
- _object5._frame = 4;
- _object5.animate(ANIM_MODE_NONE, NULL);
- _object5.setPosition(Common::Point(154, 94));
- _object5.changeZoom(100);
-
- _object6.postInit();
- _object6.setVisage(21);
- _object6._strip = 2;
- _object6._frame = 5;
- _object6.animate(ANIM_MODE_NONE, NULL);
- _object6.setPosition(Common::Point(199, 94));
- _object6.changeZoom(100);
-
- _object7.postInit();
- _object7.setVisage(21);
- _object7._strip = 2;
- _object7._frame = 6;
- _object7.animate(ANIM_MODE_NONE, NULL);
- _object7.setPosition(Common::Point(244, 94));
- _object7.changeZoom(100);
-
- _object8.postInit();
- _object8.setVisage(21);
- _object8._strip = 2;
- _object8._frame = 7;
- _object8.animate(ANIM_MODE_NONE, NULL);
- _object8.setPosition(Common::Point(286, 94));
- _object8.changeZoom(100);
+ _tsunamiWave.postInit();
+ _tsunamiWave.setVisage(21);
+ _tsunamiWave._strip = 1;
+ _tsunamiWave._frame = 1;
+ _tsunamiWave.animate(ANIM_MODE_NONE, NULL);
+ _tsunamiWave.setPosition(Common::Point(62, 85));
+ _tsunamiWave.changeZoom(100);
+
+ _letterT.postInit();
+ _letterT.setVisage(21);
+ _letterT._strip = 2;
+ _letterT._frame = 1;
+ _letterT.animate(ANIM_MODE_NONE, NULL);
+ _letterT.setPosition(Common::Point(27, 94));
+ _letterT.changeZoom(100);
+
+ _letterS.postInit();
+ _letterS.setVisage(21);
+ _letterS._strip = 2;
+ _letterS._frame = 2;
+ _letterS.animate(ANIM_MODE_NONE, NULL);
+ _letterS.setPosition(Common::Point(68, 94));
+ _letterS.changeZoom(100);
+
+ _letterU.postInit();
+ _letterU.setVisage(21);
+ _letterU._strip = 2;
+ _letterU._frame = 3;
+ _letterU.animate(ANIM_MODE_NONE, NULL);
+ _letterU.setPosition(Common::Point(110, 94));
+ _letterU.changeZoom(100);
+
+ _letterN.postInit();
+ _letterN.setVisage(21);
+ _letterN._strip = 2;
+ _letterN._frame = 4;
+ _letterN.animate(ANIM_MODE_NONE, NULL);
+ _letterN.setPosition(Common::Point(154, 94));
+ _letterN.changeZoom(100);
+
+ _letterA.postInit();
+ _letterA.setVisage(21);
+ _letterA._strip = 2;
+ _letterA._frame = 5;
+ _letterA.animate(ANIM_MODE_NONE, NULL);
+ _letterA.setPosition(Common::Point(199, 94));
+ _letterA.changeZoom(100);
+
+ _letterM.postInit();
+ _letterM.setVisage(21);
+ _letterM._strip = 2;
+ _letterM._frame = 6;
+ _letterM.animate(ANIM_MODE_NONE, NULL);
+ _letterM.setPosition(Common::Point(244, 94));
+ _letterM.changeZoom(100);
+
+ _letterI.postInit();
+ _letterI.setVisage(21);
+ _letterI._strip = 2;
+ _letterI._frame = 7;
+ _letterI.animate(ANIM_MODE_NONE, NULL);
+ _letterI.setPosition(Common::Point(286, 94));
+ _letterI.changeZoom(100);
setAction(&_action1);
BF_GLOBALS._dialogCenter.y = 165;
@@ -209,6 +209,11 @@ void Scene50::Tooltip::synchronize(Serializer &s) {
SavedObject::synchronize(s);
_bounds.synchronize(s);
s.syncString(_msg);
+
+ if (s.getVersion() >= 10) {
+ s.syncAsSint16LE(_newSceneNumber);
+ s.syncAsSint16LE(_locationId);
+ }
}
void Scene50::Tooltip2::signal() {
@@ -239,11 +244,11 @@ void Scene50::Tooltip2::dispatch() {
}
}
-void Scene50::Tooltip::set(const Rect &bounds, int v60, const Common::String &msg, int v62) {
+void Scene50::Tooltip::set(const Rect &bounds, int sceneNum, const Common::String &msg, int locationId) {
_bounds = bounds;
- _newSceneNumber = v60;
+ _newSceneNumber = sceneNum;
_msg = msg;
- _locationId = v62;
+ _locationId = locationId;
}
void Scene50::Tooltip::update() {
@@ -261,8 +266,8 @@ void Scene50::Tooltip::update() {
void Scene50::Tooltip::highlight(bool btnDown) {
Scene50 *scene = (Scene50 *)BF_GLOBALS._sceneManager._scene;
- scene->_field382 = _newSceneNumber;
- if ((scene->_field380 != 0) || (scene->_field380 != _newSceneNumber))
+ // In the original, a variable was used, always set to 0. The check is simplified
+ if (_newSceneNumber != 0)
update();
if (btnDown) {
@@ -323,9 +328,16 @@ void Scene50::Tooltip::highlight(bool btnDown) {
/*--------------------------------------------------------------------------*/
-Scene50::Scene50(): SceneExt() {
- _field382 = 0;
- _field380 = 0;
+Scene50::Scene50() {
+ _sceneNumber = 0;
+}
+
+
+void Scene50::synchronize(Serializer &s) {
+ if (s.getVersion() >= 10) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_sceneNumber);
+ }
}
void Scene50::postInit(SceneObjectList *OwnerList) {
@@ -439,11 +451,11 @@ void Scene50::signal() {
}
if ((BF_GLOBALS._driveFromScene == 410) && (_sceneNumber != BF_GLOBALS._driveFromScene)) {
- BF_GLOBALS.setFlag(125);
+ BF_GLOBALS.setFlag(f1097Frankie);
}
if ((BF_GLOBALS._driveFromScene == 340) && (_sceneNumber != BF_GLOBALS._driveFromScene)) {
- BF_GLOBALS.setFlag(123);
+ BF_GLOBALS.setFlag(f1097Marina);
}
if ((BF_GLOBALS._driveFromScene == 380) && (_sceneNumber != BF_GLOBALS._driveFromScene)) {
@@ -469,7 +481,6 @@ void Scene50::signal() {
BF_GLOBALS._player.enableControl();
BF_GLOBALS._events.setCursor(CURSOR_WALK);
_sceneMode = 0;
- _field380 = 0;
}
}
@@ -477,7 +488,6 @@ void Scene50::process(Event &event) {
SceneExt::process(event);
Common::Point pt(event.mousePos.x + _sceneBounds.left, event.mousePos.y + _sceneBounds.top);
bool mouseDown = false;
- _field382 = 0;
if ((event.mousePos.x > 270 && (_sceneBounds.right < (SCREEN_WIDTH * 2))))
loadBackground(4, 0);
@@ -537,7 +547,7 @@ bool Scene60::Ignition::startAction(CursorType action, Event &event) {
bool Scene60::Ignition::check1() {
if (BF_GLOBALS._bookmark >= bStoppedFrankie) {
- BF_GLOBALS._v5098C |= 1;
+ BF_GLOBALS._subFlagBitArr1 |= 1;
return false;
} else {
if ((BF_GLOBALS._bookmark == bBookedGreen) && BF_GLOBALS.getFlag(fArrivedAtGangStop)) {
@@ -564,13 +574,13 @@ bool Scene60::Ignition::check1() {
} else if (BF_GLOBALS._bookmark < bStartOfGame) {
// Should never reach here
} else if (BF_GLOBALS._bookmark < bCalledToDomesticViolence) {
- if ((BF_GLOBALS._v5098C >> 1) & 1)
+ if ((BF_GLOBALS._subFlagBitArr1 >> 1) & 1)
BF_GLOBALS.setFlag(fLateToMarina);
else
- BF_GLOBALS._v5098C |= 2;
+ BF_GLOBALS._subFlagBitArr1 |= 2;
} else {
- int v = (((BF_GLOBALS._v5098C >> 2) & 15) + 1) & 15;
- BF_GLOBALS._v5098C = (BF_GLOBALS._v5098C & 0xC3) | (v << 2);
+ int v = (((BF_GLOBALS._subFlagBitArr1 >> 2) & 15) + 1) & 15;
+ BF_GLOBALS._subFlagBitArr1 = (BF_GLOBALS._subFlagBitArr1 & 0xC3) | (v << 2);
if ((v != 1) && (v != 2)) {
BF_GLOBALS._deathReason = 19;
@@ -580,17 +590,17 @@ bool Scene60::Ignition::check1() {
}
}
- BF_GLOBALS._v5098C |= 1;
+ BF_GLOBALS._subFlagBitArr1 |= 1;
return false;
}
bool Scene60::Ignition::check2() {
switch (BF_GLOBALS._bookmark) {
case bInspectionDone:
- if (BF_GLOBALS._v5098D & 1) {
+ if (BF_GLOBALS._subFlagBitArr2 & 1) {
BF_GLOBALS.setFlag(fLateToDrunkStop);
} else {
- BF_GLOBALS._v5098D |= 1;
+ BF_GLOBALS._subFlagBitArr2 |= 1;
}
break;
case bCalledToDrunkStop:
@@ -600,7 +610,7 @@ bool Scene60::Ignition::check2() {
break;
}
- BF_GLOBALS._v5098C |= 0x80;
+ BF_GLOBALS._subFlagBitArr1 |= 0x80;
return false;
}
@@ -1083,7 +1093,7 @@ void Scene60::postInit(SceneObjectList *OwnerList) {
switch (BF_GLOBALS._dayNumber) {
case 1:
- if (BF_GLOBALS.getFlag(onDuty) && (BF_GLOBALS._v5098C & 1) &&
+ if (BF_GLOBALS.getFlag(onDuty) && (BF_GLOBALS._subFlagBitArr1 & 1) &&
(BF_GLOBALS._bookmark < bStartOfGame) && (BF_GLOBALS._sceneManager._previousScene != 342)) {
setAction(&_action2);
if (BF_GLOBALS._sceneManager._previousScene == 342)
@@ -1091,7 +1101,7 @@ void Scene60::postInit(SceneObjectList *OwnerList) {
}
break;
case 2:
- if (BF_GLOBALS.getFlag(onDuty) && ((BF_GLOBALS._v5098C >> 7) & 1) &&
+ if (BF_GLOBALS.getFlag(onDuty) && ((BF_GLOBALS._subFlagBitArr1 >> 7) & 1) &&
(BF_GLOBALS._sceneManager._previousScene != 550) &&
(BF_GLOBALS._bookmark < bInspectionDone)) {
setAction(&_action3);
diff --git a/engines/tsage/blue_force/blueforce_scenes0.h b/engines/tsage/blue_force/blueforce_scenes0.h
index 103e5f0a4c..dd502c5f30 100644
--- a/engines/tsage/blue_force/blueforce_scenes0.h
+++ b/engines/tsage/blue_force/blueforce_scenes0.h
@@ -50,8 +50,8 @@ class Scene20 : public SceneExt {
public:
Action1 _action1;
ScenePalette _scenePalette;
- SceneObject _object1, _object2, _object3, _object4;
- SceneObject _object5, _object6, _object7, _object8;
+ SceneObject _tsunamiWave, _letterT, _letterS, _letterU;
+ SceneObject _letterN, _letterA, _letterM, _letterI;
virtual void postInit(SceneObjectList *OwnerList = NULL);
};
@@ -65,7 +65,7 @@ class Scene50: public SceneExt {
int _locationId;
public:
Tooltip();
- void set(const Rect &bounds, int v60, const Common::String &msg, int v62);
+ void set(const Rect &bounds, int sceneNum, const Common::String &msg, int locationId);
void update();
void highlight(bool btnDown);
@@ -81,7 +81,6 @@ class Scene50: public SceneExt {
virtual void dispatch();
};
public:
- int _field380, _field382;
int _sceneNumber;
SceneText _text;
SceneItemType2 _item;
@@ -90,7 +89,10 @@ public:
Timer _timer;
public:
Scene50();
+
virtual Common::String getClassName() { return "Scene50"; }
+ virtual void synchronize(Serializer &s);
+
virtual void postInit(SceneObjectList *OwnerList = NULL);
virtual void remove();
virtual void signal();
@@ -172,6 +174,7 @@ public:
int _sceneNumber;
int _visage;
CursorType _cursorId;
+ // TODO: Check if really useless in original
bool _field1222;
Scene60();
diff --git a/engines/tsage/blue_force/blueforce_scenes1.cpp b/engines/tsage/blue_force/blueforce_scenes1.cpp
index e977d5fbca..9f1e9ce36e 100644
--- a/engines/tsage/blue_force/blueforce_scenes1.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes1.cpp
@@ -243,8 +243,8 @@ void Scene109::Action1::signal() {
scene->_drunk.show();
scene->_drunk.setAction(&scene->_action3);
scene->_object2.show();
- scene->_object9.show();
- scene->_object9.setAction(&scene->_action2);
+ scene->_beerSign.show();
+ scene->_beerSign.setAction(&scene->_action2);
BF_GLOBALS._v501FC = 170;
setDelay(60);
@@ -257,27 +257,27 @@ void Scene109::Action1::signal() {
break;
case 5:
// Open briefcase and pass over disk
- setAction(&scene->_sequenceManager6, this, 105, &scene->_object10, NULL);
+ setAction(&scene->_sequenceManager6, this, 105, &scene->_animationInset, NULL);
break;
case 6:
// Protaginist 2 walk to the bar
- scene->_object10.remove();
+ scene->_animationInset.remove();
setAction(&scene->_sequenceManager6, this, 100, &scene->_protaginist2, NULL);
break;
case 7:
// Two thugs enter and walk to table
- scene->_object7.setAction(&scene->_sequenceManager7, NULL, 103, &scene->_object7, NULL);
- scene->_object5.setAction(&scene->_sequenceManager8, this, 102, &scene->_object5, NULL);
+ scene->_cop2.setAction(&scene->_sequenceManager7, NULL, 103, &scene->_cop2, NULL);
+ scene->_cop1.setAction(&scene->_sequenceManager8, this, 102, &scene->_cop1, NULL);
scene->_protaginist2.setAction(&scene->_sequenceManager6, NULL, 104, &scene->_protaginist2, &scene->_bartender, NULL);
break;
case 8:
// Protaginist 1 leaves, protaginist 2 stands up
- setAction(&scene->_sequenceManager8, this, 101, &scene->_object5, &scene->_protaginist1, NULL);
+ setAction(&scene->_sequenceManager8, this, 101, &scene->_cop1, &scene->_protaginist1, NULL);
break;
case 9:
// Shots fired!
scene->_protaginist1.setAction(&scene->_sequenceManager5, this, 98, &scene->_protaginist1, NULL);
- scene->_object7.setAction(&scene->_sequenceManager7, NULL, 99, &scene->_object7, NULL);
+ scene->_cop2.setAction(&scene->_sequenceManager7, NULL, 99, &scene->_cop2, NULL);
break;
case 10:
// End scene
@@ -289,12 +289,12 @@ void Scene109::Action1::signal() {
void Scene109::Action2::signal() {
Scene109 *scene = (Scene109 *)BF_GLOBALS._sceneManager._scene;
- scene->setAction(&scene->_sequenceManager2, this, 3117, &scene->_object9, NULL);
+ setAction(&scene->_sequenceManager2, this, 3117, &scene->_beerSign, NULL);
}
void Scene109::Action3::signal() {
Scene109 *scene = (Scene109 *)BF_GLOBALS._sceneManager._scene;
- scene->setAction(&scene->_sequenceManager3, this, 108, &scene->_drunk, NULL);
+ setAction(&scene->_sequenceManager3, this, 108, &scene->_drunk, NULL);
}
/*--------------------------------------------------------------------------*/
@@ -353,21 +353,21 @@ void Scene109::postInit(SceneObjectList *OwnerList) {
_object2.setPosition(Common::Point(104, 64));
_object2.hide();
- _object9.postInit();
- _object9.setVisage(115);
- _object9.setStrip(4);
- _object9.setFrame(1);
- _object9.setPosition(Common::Point(262, 29));
- _object9.hide();
+ _beerSign.postInit();
+ _beerSign.setVisage(115);
+ _beerSign.setStrip(4);
+ _beerSign.setFrame(1);
+ _beerSign.setPosition(Common::Point(262, 29));
+ _beerSign.hide();
- _object5.postInit();
- _object5.hide();
+ _cop1.postInit();
+ _cop1.hide();
- _object7.postInit();
- _object7.hide();
+ _cop2.postInit();
+ _cop2.hide();
- _object10.postInit();
- _object10.hide();
+ _animationInset.postInit();
+ _animationInset.hide();
BF_GLOBALS._player.disableControl();
setAction(&_action1, this);
@@ -430,7 +430,7 @@ void Scene110::Action1::signal() {
case 6:
// Play "Vroum"
scene->_sound.play(31);
- // The guy starts the engine
+ // The guy starts the engine
scene->_object4.setStrip(3);
scene->_object4._frame = 1;
scene->_object4.animate(ANIM_MODE_5, NULL);
@@ -837,7 +837,7 @@ void Scene110::postInit(SceneObjectList *OwnerList) {
_object10._moveDiff.y = 10;
_object10.setPosition(_object9._position);
_object10.hide();
-
+
setAction(&_action1);
}
/*--------------------------------------------------------------------------
@@ -877,7 +877,7 @@ bool Scene114::Door::startAction(CursorType action, Event &event) {
SceneItem::display2(114, 1);
return true;
case CURSOR_USE:
- BF_GLOBALS._walkRegions.proc2(2);
+ BF_GLOBALS._walkRegions.enableRegion(2);
BF_GLOBALS._player.disableControl();
scene->_lyle.fixPriority(-1);
scene->_sceneMode = 1140;
@@ -895,8 +895,8 @@ void Scene114::postInit(SceneObjectList *OwnerList) {
loadScene(110);
setZoomPercents(85, 80, 105, 100);
- BF_GLOBALS._walkRegions.proc1(9);
- BF_GLOBALS._walkRegions.proc1(22);
+ BF_GLOBALS._walkRegions.disableRegion(9);
+ BF_GLOBALS._walkRegions.disableRegion(22);
_door.postInit();
_door.setVisage(110);
@@ -921,7 +921,7 @@ void Scene114::postInit(SceneObjectList *OwnerList) {
_lyle._moveDiff.x = 2;
_lyle._moveDiff.y = 1;
_lyle.hide();
- _lyle.setDetails(114, 2, -1, -1, 1, NULL);
+ _lyle.setDetails(114, 2, -1, -1, 1, (SceneItem *)NULL);
_vechile.postInit();
if (BF_GLOBALS.getFlag(fWithLyle)) {
@@ -943,10 +943,10 @@ void Scene114::postInit(SceneObjectList *OwnerList) {
_vechile.setStrip(1);
_vechile.changeZoom(77);
}
- BF_GLOBALS._walkRegions.proc1(17);
+ BF_GLOBALS._walkRegions.disableRegion(17);
}
BF_GLOBALS._sceneItems.push_front(&_vechile);
- BF_GLOBALS._walkRegions.proc1(2);
+ BF_GLOBALS._walkRegions.disableRegion(2);
if (BF_GLOBALS._sceneManager._previousScene == 115) {
BF_GLOBALS._player.setPosition(Common::Point(219, 100));
@@ -962,7 +962,7 @@ void Scene114::postInit(SceneObjectList *OwnerList) {
BF_GLOBALS._player.enableControl();
}
- _item1.setDetails(Rect(0, 0, 320, 200), 114, 3, -1, -1, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 320, 200), 114, 3, -1, -1, 1, (SceneItem *)NULL);
}
void Scene114::signal() {
@@ -985,9 +985,9 @@ void Scene114::signal() {
* Scene 115 - Inside Tony's bar
*
*--------------------------------------------------------------------------*/
-bool Scene115::Object1::startAction(CursorType action, Event &event) {
+bool Scene115::Kate::startAction(CursorType action, Event &event) {
Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
-
+
switch (action) {
case CURSOR_LOOK:
SceneItem::display(115, 8, SET_WIDTH, 312,
@@ -1001,7 +1001,7 @@ bool Scene115::Object1::startAction(CursorType action, Event &event) {
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 0;
scene->_stripManager.start(1174, scene);
- } else if (scene->_field31E8 == 0) {
+ } else if (scene->_jukeboxPlaying == 0) {
if (BF_GLOBALS.getFlag(fShowedIdToKate)) {
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 0;
@@ -1014,10 +1014,10 @@ bool Scene115::Object1::startAction(CursorType action, Event &event) {
scene->setAction(&scene->_action7);
return true;
case INV_MUG_SHOT:
- if (scene->_field31E8 == 0) {
+ if (scene->_jukeboxPlaying == 0) {
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 0;
- if (BF_GLOBALS._v4CEAA == 0)
+ if (BF_GLOBALS._tonyDialogCtr == 0)
scene->_stripManager.start(1167, scene);
else if (BF_GLOBALS.getFlag(fShowedIdToKate))
scene->_stripManager.start(1159, scene);
@@ -1035,8 +1035,8 @@ bool Scene115::Object1::startAction(CursorType action, Event &event) {
SET_EXT_FGCOLOR, 13, LIST_END);
return true;
case INV_ID:
- if (scene->_field31E8 == 0) {
- if (BF_GLOBALS._v4CEAA == 0) {
+ if (scene->_jukeboxPlaying == 0) {
+ if (BF_GLOBALS._tonyDialogCtr == 0) {
scene->_sceneMode = 1167;
scene->setAction(&scene->_action6);
} else if (BF_GLOBALS.getFlag(fShowedIdToKate)) {
@@ -1059,9 +1059,9 @@ bool Scene115::Object1::startAction(CursorType action, Event &event) {
}
}
-bool Scene115::Object2::startAction(CursorType action, Event &event) {
+bool Scene115::Tony::startAction(CursorType action, Event &event) {
Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
-
+
switch (action) {
case CURSOR_LOOK:
SceneItem::display(115, 7, SET_WIDTH, 312,
@@ -1077,25 +1077,25 @@ bool Scene115::Object2::startAction(CursorType action, Event &event) {
else if (BF_INVENTORY.getObjectScene(INV_COBB_RAP) == 1) {
if (BF_GLOBALS.getFlag(fTalkedToTony))
scene->_sceneMode = 1151;
- else if (BF_GLOBALS._v4CEAA == 0) {
+ else if (BF_GLOBALS._tonyDialogCtr == 0) {
scene->_sceneMode = 1150;
BF_GLOBALS.setFlag(fTalkedToTony);
} else
scene->_sceneMode = 1151;
- } else if (_field15F8 == 0) {
- _field15F8++;
+ } else if (_talkToTonyCtr2 == 0) {
+ _talkToTonyCtr2++;
scene->_sceneMode = 1171;
} else
scene->_sceneMode = 1172;
} else if (BF_GLOBALS.getFlag(onDuty)) {
- if (scene->_field31EA == 0) {
- scene->_field31EA = 1;
+ if (scene->_talkToTonyCtr == 0) {
+ scene->_talkToTonyCtr = 1;
scene->_sceneMode = 1169;
} else
scene->_sceneMode = 1170;
- } else if (scene->_field31EA == 0) {
+ } else if (scene->_talkToTonyCtr == 0) {
scene->_sceneMode = 1171;
- scene->_field31EA = 1;
+ scene->_talkToTonyCtr = 1;
} else
scene->_sceneMode = 1172;
@@ -1111,7 +1111,7 @@ bool Scene115::Object2::startAction(CursorType action, Event &event) {
case INV_COBB_RAP:
if (BF_GLOBALS.getFlag(onDuty))
scene->_sceneMode = 1177;
- else if (BF_GLOBALS._v4CEAA == 0)
+ else if (BF_GLOBALS._tonyDialogCtr == 0)
scene->_sceneMode = 1179;
else
scene->_sceneMode = 1154;
@@ -1132,16 +1132,16 @@ bool Scene115::Object2::startAction(CursorType action, Event &event) {
} else {
T2_GLOBALS._uiElements.addScore(30);
BF_GLOBALS.setFlag(fTalkedToTony);
- if (BF_GLOBALS._v4CEAA == 0) {
+ if (BF_GLOBALS._tonyDialogCtr == 0) {
scene->_sceneMode = 1150;
scene->setAction(&scene->_action9);
} else {
- BF_GLOBALS._v4CEAA = 1;
+ BF_GLOBALS._tonyDialogCtr = 1;
scene->setAction(&scene->_action2);
}
}
- } else if (_field15F8 == 0) {
- _field15F8++;
+ } else if (_talkToTonyCtr2 == 0) {
+ _talkToTonyCtr2++;
if (BF_GLOBALS.getFlag(onDuty)) {
scene->_sceneMode = 1182;
scene->setAction(&scene->_action9);
@@ -1164,7 +1164,7 @@ bool Scene115::Object2::startAction(CursorType action, Event &event) {
bool Scene115::Object3::startAction(CursorType action, Event &event) {
Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
-
+
switch (action) {
case CURSOR_LOOK:
SceneItem::display(115, 9, SET_WIDTH, 312,
@@ -1195,7 +1195,7 @@ bool Scene115::Object3::startAction(CursorType action, Event &event) {
bool Scene115::Object4::startAction(CursorType action, Event &event) {
Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
-
+
switch (action) {
case CURSOR_LOOK:
SceneItem::display(115, 42, SET_WIDTH, 312,
@@ -1215,24 +1215,23 @@ bool Scene115::Object4::startAction(CursorType action, Event &event) {
}
}
-void Scene115::Item1::signal() {
+void Scene115::Jukebox::signal() {
Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
-
- if (_field1F8A == 2)
- _field1F8A = 0;
- if (_field1F8A == 1) {
- _field1F8A = 2;
+ if (_jokeboxPlayingCtr == 2)
+ _jokeboxPlayingCtr = 0;
+ else if (_jokeboxPlayingCtr == 1) {
+ _jokeboxPlayingCtr = 2;
setAction(&_sequenceManager6, this, 118, &scene->_object12, &scene->_object11, NULL);
}
}
-bool Scene115::Item1::startAction(CursorType action, Event &event) {
+bool Scene115::Jukebox::startAction(CursorType action, Event &event) {
Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
-
+
if (action == CURSOR_USE) {
- if (_field1F8A == 0) {
- _field1F8A = 1;
+ if (_jokeboxPlayingCtr == 0) {
+ _jokeboxPlayingCtr = 1;
BF_GLOBALS._player.disableControl();
scene->setAction(&scene->_action4);
} else
@@ -1242,31 +1241,31 @@ bool Scene115::Item1::startAction(CursorType action, Event &event) {
SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
SET_EXT_FGCOLOR, 13, LIST_END);
return true;
- } else
+ } else
return NamedHotspot::startAction(action, event);
}
-void Scene115::Item1::synchronize(Serializer &s) {
+void Scene115::Jukebox::synchronize(Serializer &s) {
NamedHotspot::synchronize(s);
- s.syncAsSint16LE(_field1F8A);
+ s.syncAsSint16LE(_jokeboxPlayingCtr);
}
-Scene115::Item1::Item1() {
- _field1F8A = 0;
+Scene115::Jukebox::Jukebox() {
+ _jokeboxPlayingCtr = 0;
}
void Scene115::EventHandler1::dispatch() {
Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
if (BF_GLOBALS._player.getRegionIndex() == 27) {
- scene->_object1.setAction(&scene->_action5);
+ scene->_kate.setAction(&scene->_action5);
scene->removeTimer(this);
}
}
bool Scene115::Item10::startAction(CursorType action, Event &event) {
Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
-
+
if (BF_GLOBALS.getFlag(fWithLyle)) {
scene->_object4.setStrip2(6);
Common::Point pt(-20, 122);
@@ -1339,20 +1338,20 @@ void Scene115::Action2::signal() {
switch (_actionIndex++) {
case 0:
BF_GLOBALS._player.disableControl();
- if (BF_GLOBALS._v4CEAA < 3) {
- if (scene->_object2._position.x > 67) {
- scene->_object2.setAction(&scene->_sequenceManager3, NULL, 1118, &scene->_object2, NULL);
- } else if (scene->_object2._position.x != 67) {
- scene->_object2.setAction(&scene->_sequenceManager3, NULL, 1119, &scene->_object2, NULL);
+ if (BF_GLOBALS._tonyDialogCtr < 3) {
+ if (scene->_tony._position.x > 67) {
+ scene->_tony.setAction(&scene->_sequenceManager3, NULL, 1118, &scene->_tony, NULL);
+ } else if (scene->_tony._position.x != 67) {
+ scene->_tony.setAction(&scene->_sequenceManager3, NULL, 1119, &scene->_tony, NULL);
}
}
BF_GLOBALS._player.setAction(&scene->_sequenceManager1, this, 1117, &BF_GLOBALS._player);
break;
case 1:
- BF_GLOBALS._v4CEAA++;
+ ++BF_GLOBALS._tonyDialogCtr;
if (BF_GLOBALS.getFlag(onDuty)) {
if (BF_GLOBALS.getFlag(fTalkedToTony)) {
- switch (BF_GLOBALS._v4CEAA) {
+ switch (BF_GLOBALS._tonyDialogCtr) {
case 1:
T2_GLOBALS._uiElements.addScore(30);
scene->_stripManager.start(1181, this);
@@ -1369,7 +1368,7 @@ void Scene115::Action2::signal() {
}
} else {
if (BF_GLOBALS.getFlag(fTalkedToTony)) {
- switch (BF_GLOBALS._v4CEAA) {
+ switch (BF_GLOBALS._tonyDialogCtr) {
case 1:
T2_GLOBALS._uiElements.addScore(30);
scene->_stripManager.start(1153, this);
@@ -1387,8 +1386,8 @@ void Scene115::Action2::signal() {
}
break;
case 2:
- if (BF_GLOBALS._v4CEAA == 3)
- scene->_object2.setAction(&scene->_sequenceManager3, NULL, 3119, &scene->_object2, NULL);
+ if (BF_GLOBALS._tonyDialogCtr == 3)
+ scene->_tony.setAction(&scene->_sequenceManager3, NULL, 3119, &scene->_tony, NULL);
BF_GLOBALS._player.enableControl();
remove();
default:
@@ -1399,7 +1398,7 @@ void Scene115::Action2::signal() {
void Scene115::Action3::signal() {
Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene;
- setAction(&scene->_sequenceManager4, this, 3117, &scene->_object7, NULL);
+ setAction(&scene->_sequenceManager4, this, 3117, &scene->_neonSign, NULL);
}
void Scene115::Action4::signal() {
@@ -1426,7 +1425,7 @@ void Scene115::Action4::signal() {
setAction(&scene->_sequenceManager1, this, 117, &scene->_object12, &scene->_object11, NULL);
break;
case 3:
- scene->_sound1.play(81, &scene->_item1, 127);
+ scene->_sound1.play(81, &scene->_itemJukebox, 127);
BF_GLOBALS._player.enableControl();
remove();
default:
@@ -1439,10 +1438,11 @@ void Scene115::Action5::signal() {
switch (_actionIndex++) {
case 0:
- if (scene->_item1._field1F8A == 0) {
- setAction(&scene->_sequenceManager5, this, 1115, &scene->_object1, NULL);
+ if (scene->_itemJukebox._jokeboxPlayingCtr == 0) {
+ setAction(&scene->_sequenceManager5, this, 1115, &scene->_kate, NULL);
+ scene->_jukeboxPlaying = 1;
} else {
- _actionIndex--;
+ --_actionIndex;
setDelay(120);
}
break;
@@ -1450,15 +1450,15 @@ void Scene115::Action5::signal() {
setAction(&scene->_sequenceManager5, this, 117, &scene->_object12, &scene->_object11, NULL);
break;
case 2:
- scene->_sound1.play(81, &scene->_item1, 127);
- scene->_item1._field1F8A = 1;
+ scene->_sound1.play(81, &scene->_itemJukebox, 127);
+ scene->_itemJukebox._jokeboxPlayingCtr = 1;
setDelay(3);
break;
case 3:
- setAction(&scene->_sequenceManager5, this, 1116, &scene->_object1, NULL);
+ setAction(&scene->_sequenceManager5, this, 1116, &scene->_kate, NULL);
break;
case 4:
- scene->_field31E8 = 0;
+ scene->_jukeboxPlaying = 0;
remove();
default:
break;
@@ -1471,22 +1471,22 @@ void Scene115::Action6::signal() {
switch (_actionIndex++) {
case 0:
BF_GLOBALS._player.disableControl();
- BF_GLOBALS._player.setAction(&scene->_sequenceManager1, this, 2115, &scene->_object1, &BF_GLOBALS._player, NULL);
+ BF_GLOBALS._player.setAction(&scene->_sequenceManager1, this, 2115, &scene->_kate, &BF_GLOBALS._player, NULL);
break;
case 1:
if (scene->_sceneMode == 9999) {
- setAction(&scene->_sequenceManager1, this, 4115, &scene->_object1, &BF_GLOBALS._player, NULL);
- _actionIndex--;
+ setAction(&scene->_sequenceManager1, this, 4115, &scene->_kate, &BF_GLOBALS._player, NULL);
+ --_actionIndex;
scene->_sceneMode = 1166;
} else {
scene->_stripManager.start(scene->_sceneMode, this);
}
break;
case 2:
- scene->_object1.setVisage(131);
- scene->_object1.setStrip(1);
- scene->_object1.setFrame(1);
- scene->_object1.setPosition(Common::Point(122, 97));
+ scene->_kate.setVisage(131);
+ scene->_kate.setStrip(1);
+ scene->_kate.setFrame(1);
+ scene->_kate.setPosition(Common::Point(122, 97));
BF_GLOBALS._player.enableControl();
remove();
default:
@@ -1507,11 +1507,11 @@ void Scene115::Action7::signal() {
break;
case 1:
BF_GLOBALS._player.setStrip(4);
- if (BF_GLOBALS._v4CEB0 == 0)
+ if (BF_GLOBALS._kateDialogCtr == 0)
scene->_stripManager.start(1156, this);
else
scene->_stripManager.start(1157, this);
- BF_GLOBALS._v4CEB0++;
+ ++BF_GLOBALS._kateDialogCtr;
break;
case 2:
BF_GLOBALS._player.enableControl();
@@ -1528,11 +1528,11 @@ void Scene115::Action8::signal() {
switch (_actionIndex++) {
case 0:
BF_GLOBALS._player.disableControl();
- setAction(&scene->_sequenceManager1, this, 2115, &scene->_object1, &BF_GLOBALS._player, NULL);
+ setAction(&scene->_sequenceManager1, this, 2115, &scene->_kate, &BF_GLOBALS._player, NULL);
break;
case 1:
T2_GLOBALS._uiElements.addScore(30);
- setAction(&scene->_sequenceManager1, this, 4115, &scene->_object1, &BF_GLOBALS._player, NULL);
+ setAction(&scene->_sequenceManager1, this, 4115, &scene->_kate, &BF_GLOBALS._player, NULL);
break;
case 2:
scene->_stripManager.start(1160, this);
@@ -1542,15 +1542,15 @@ void Scene115::Action8::signal() {
break;
case 4:
BF_GLOBALS.setFlag(fGivenNapkin);
- setAction(&scene->_sequenceManager1, this, 2117, &scene->_object1, &BF_GLOBALS._player, &scene->_object13, NULL);
+ setAction(&scene->_sequenceManager1, this, 2117, &scene->_kate, &BF_GLOBALS._player, &scene->_object13, NULL);
break;
case 5:
BF_INVENTORY.setObjectScene(INV_NAPKIN, 1);
T2_GLOBALS._uiElements.addScore(10);
- scene->_object1.setVisage(131);
- scene->_object1.setStrip(1);
- scene->_object1.setFrame(1);
- scene->_object1.setPosition(Common::Point(122, 97));
+ scene->_kate.setVisage(131);
+ scene->_kate.setStrip(1);
+ scene->_kate.setFrame(1);
+ scene->_kate.setPosition(Common::Point(122, 97));
BF_GLOBALS._player.enableControl();
remove();
break;
@@ -1565,17 +1565,17 @@ void Scene115::Action9::signal() {
switch (_actionIndex++) {
case 0:
BF_GLOBALS._player.disableControl();
- if (scene->_object2._position.x > 67)
- scene->_object2.setAction(&scene->_sequenceManager3, NULL, 1118, &scene->_object2, NULL);
- else if (scene->_object2._position.x != 67)
- scene->_object2.setAction(&scene->_sequenceManager3, NULL, 1119, &scene->_object2, NULL);
+ if (scene->_tony._position.x > 67)
+ scene->_tony.setAction(&scene->_sequenceManager3, NULL, 1118, &scene->_tony, NULL);
+ else if (scene->_tony._position.x != 67)
+ scene->_tony.setAction(&scene->_sequenceManager3, NULL, 1119, &scene->_tony, NULL);
BF_GLOBALS._player.setAction(&scene->_sequenceManager1, this, 1117, &BF_GLOBALS._player, NULL);
break;
case 1:
scene->_stripManager.start(scene->_sceneMode, this);
break;
case 2:
- scene->_object2.setAction(&scene->_sequenceManager3, this, 3119, &scene->_object2, NULL);
+ scene->_tony.setAction(&scene->_sequenceManager3, this, 3119, &scene->_tony, NULL);
break;
case 3:
BF_GLOBALS._player.enableControl();
@@ -1586,16 +1586,16 @@ void Scene115::Action9::signal() {
}
Scene115::Scene115() : SceneExt () {
- _field168A = _field31E8 = _field31EA = 0;
+ _lineNumModifier = _jukeboxPlaying = _talkToTonyCtr = 0;
}
void Scene115::postInit(SceneObjectList *OwnerList) {
SceneExt::postInit();
-
+
BF_GLOBALS._sound1.fadeSound(15);
loadScene(115);
setZoomPercents(98, 85, 115, 100);
- _field31E8 = 0;
+ _jukeboxPlaying = 0;
_stripManager.addSpeaker(&_gameTextSpeaker);
_stripManager.addSpeaker(&_kateSpeaker);
_stripManager.addSpeaker(&_tonySpeaker);
@@ -1620,28 +1620,28 @@ void Scene115::postInit(SceneObjectList *OwnerList) {
_object5.fixPriority(95);
// Bartender
- _object2.postInit();
- _object2.setVisage(132);
- _object2.setPosition(Common::Point(74, 66));
- _object2.setStrip(3);
- _object2.setFrame(1);
- _object2.fixPriority(95);
- _object2.animate(ANIM_MODE_2, NULL);
- _object2._numFrames = 5;
- _object2._field15F8 = 0;
- _field31EA = 0;
+ _tony.postInit();
+ _tony.setVisage(132);
+ _tony.setPosition(Common::Point(74, 66));
+ _tony.setStrip(3);
+ _tony.setFrame(1);
+ _tony.fixPriority(95);
+ _tony.animate(ANIM_MODE_2, NULL);
+ _tony._numFrames = 5;
+ _tony._talkToTonyCtr2 = 0;
+ _talkToTonyCtr = 0;
//Neon sign
- _object7.postInit();
- _object7.setVisage(115);
- _object7.setStrip(4);
- _object7.setFrame(1);
- _object7.setPosition(Common::Point(262, 29));
- _object7.setAction(&_action3);
+ _neonSign.postInit();
+ _neonSign.setVisage(115);
+ _neonSign.setStrip(4);
+ _neonSign.setFrame(1);
+ _neonSign.setPosition(Common::Point(262, 29));
+ _neonSign.setAction(&_action3);
_object11.postInit();
_object11.hide();
-
+
_object12.postInit();
_object12.hide();
@@ -1665,7 +1665,7 @@ void Scene115::postInit(SceneObjectList *OwnerList) {
NpcMover *mover = new NpcMover();
_object4.addMover(mover, &destPos, NULL);
BF_GLOBALS._sceneItems.push_front(&_object4);
- BF_GLOBALS._walkRegions.proc1(1);
+ BF_GLOBALS._walkRegions.disableRegion(1);
} else if (BF_GLOBALS.getFlag(onDuty))
BF_GLOBALS._player.setVisage(1341);
@@ -1674,7 +1674,7 @@ void Scene115::postInit(SceneObjectList *OwnerList) {
_object3.setVisage(123);
_object3.setPosition(Common::Point(212, 108));
_object3.setAction(&_action1);
- _field168A = 0;
+ _lineNumModifier = 0;
BF_GLOBALS._sceneItems.push_front(&_object3);
_object8.postInit();
@@ -1696,18 +1696,18 @@ void Scene115::postInit(SceneObjectList *OwnerList) {
_object10.fixPriority(112);
if (BF_INVENTORY.getObjectScene(INV_COBB_RAP) == 1) {
- _object1.postInit();
- _object1.setVisage(131);
- _object1.setPosition(Common::Point(122, 97));
- _object1.setStrip(1);
- _object1.setFrame(1);
- _object1.changeZoom(100);
- _object1.fixPriority(95);
- BF_GLOBALS._sceneItems.push_front(&_object1);
+ _kate.postInit();
+ _kate.setVisage(131);
+ _kate.setPosition(Common::Point(122, 97));
+ _kate.setStrip(1);
+ _kate.setFrame(1);
+ _kate.changeZoom(100);
+ _kate.fixPriority(95);
+ BF_GLOBALS._sceneItems.push_front(&_kate);
}
addTimer(&_eventHandler1);
}
- BF_GLOBALS._sceneItems.push_front(&_object2);
+ BF_GLOBALS._sceneItems.push_front(&_tony);
_item11.setDetails(16, 115, 4, 15, 21, 1);
_item12.setDetails(20, 115, 5, 15, 21, 1);
@@ -1716,8 +1716,8 @@ void Scene115::postInit(SceneObjectList *OwnerList) {
BF_GLOBALS._sceneItems.push_front(&_item14);
_item10.setDetails(Rect(0, 147, 30, 167), 115, -1, -1, -1, 1, NULL);
// SUB_177B8
- addTimer(&_item1);
- _item1.setDetails(Rect(147, 45, 179, 91), 115, 25, 26, 27, 1, NULL);
+ addTimer(&_itemJukebox);
+ _itemJukebox.setDetails(Rect(147, 45, 179, 91), 115, 25, 26, 27, 1, NULL);
//
_item6.setDetails(Rect(107, 43, 122, 61), 115, 28, 29, 30, 1, NULL);
_item7.setDetails(Rect(180, 33, 230, 63), 115, 31, 32, 33, 1, NULL);
@@ -1741,14 +1741,14 @@ void Scene115::signal() {
break;
case 1:
BF_GLOBALS._player.updateAngle(_object3._position);
- SceneItem::display(115, 38 + _field168A, SET_WIDTH, 312,
+ SceneItem::display(115, 38 + _lineNumModifier, SET_WIDTH, 312,
SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
SET_EXT_FGCOLOR, 13, LIST_END);
- _field168A++;
- if (_field168A >= 4)
- _field168A = 0;
+ ++_lineNumModifier;
+ if (_lineNumModifier >= 4)
+ _lineNumModifier = 0;
// No break on purpose
case 0:
// No break on purpose
@@ -1777,9 +1777,9 @@ void Scene115::process(Event &event) {
void Scene115::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field168A);
- s.syncAsSint16LE(_field31E8);
- s.syncAsSint16LE(_field31EA);
+ s.syncAsSint16LE(_lineNumModifier);
+ s.syncAsSint16LE(_jukeboxPlaying);
+ s.syncAsSint16LE(_talkToTonyCtr);
}
/*--------------------------------------------------------------------------
@@ -1817,7 +1817,7 @@ void Scene125::Action1::signal() {
case 0:
// No break on purpose
default:
- break;
+ break;
}
}
@@ -2054,7 +2054,7 @@ void Scene125::Action3::dispatch() {
SceneObject *owner = static_cast<SceneObject *>(this->_owner);
Action::dispatch();
-
+
if ((_actionIndex == 9) && (owner->_percent > 70))
owner->changeZoom(owner->_percent - 1);
}
@@ -2095,7 +2095,7 @@ void Scene125::Action4::dispatch() {
SceneObject *owner = static_cast<SceneObject *>(this->_owner);
Action::dispatch();
-
+
if ((_actionIndex == 4) && (owner->_percent > 80))
owner->changeZoom(owner->_percent - 1);
}
@@ -2134,7 +2134,7 @@ void Scene125::Action6::dispatch() {
SceneObject *owner = static_cast<SceneObject *>(this->_owner);
Action::dispatch();
-
+
if ((_actionIndex == 2) && (owner->_percent < 100))
owner->changeZoom(owner->_percent + 1);
}
@@ -2169,7 +2169,7 @@ void Scene125::postInit(SceneObjectList *OwnerList) {
BF_GLOBALS._player._moveDiff.x = 6;
BF_GLOBALS._player._moveDiff.y = 6;
BF_GLOBALS._player.disableControl();
-
+
_object5.postInit();
_object5.setVisage(128);
_object5.setPosition(Common::Point(150, 117));
@@ -2457,7 +2457,7 @@ void Scene160::Action1::signal() {
scene->_kid.setStrip(2);
scene->_kid.animate(ANIM_MODE_5, this);
- scene->_kidBody.setPosition(scene->_kid._position);
+ scene->_kidBody.setPosition(scene->_kid._position);
scene->_kidBody.setFrame(1);
scene->_kidBody.setStrip(3);
break;
@@ -2630,7 +2630,7 @@ void Scene160::Action2::signal() {
break;
case 25:
BF_GLOBALS._sound1.fade(0, 10, 10, true, this);
-// FIXME: Currently, fade() doesn't end properly with this song,
+// FIXME: Currently, fade() doesn't end properly with this song,
// thus never returns here. This hack skips the wait and changes
// directly to the next scene
// Start of hack
@@ -2764,12 +2764,12 @@ bool Scene180::GarageExit::startAction(CursorType action, Event &event) {
/*--------------------------------------------------------------------------*/
Scene180::Scene180(): SceneExt() {
- _fieldC56 = 0;
+ _dispatchMode = 0;
}
void Scene180::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_fieldC56);
+ s.syncAsSint16LE(_dispatchMode);
}
void Scene180::postInit(SceneObjectList *OwnerList) {
@@ -2784,7 +2784,7 @@ void Scene180::postInit(SceneObjectList *OwnerList) {
_garageExit.setDetails(Rect(243, 93, 275, 122), 180, -1, -1, -1, 1, NULL);
_gameTextSpeaker._textPos.y = 180;
_stripManager.addSpeaker(&_gameTextSpeaker);
- _fieldC56 = 0;
+ _dispatchMode = 0;
setZoomPercents(121, 60, 125, 70);
if ((BF_GLOBALS._bookmark == bLyleStoppedBy) && (BF_GLOBALS._dayNumber == 1)) {
@@ -2830,7 +2830,7 @@ void Scene180::postInit(SceneObjectList *OwnerList) {
_vechile.setStrip(2);
_vechile.setPosition(Common::Point(262, 131));
_vechile.setZoom(65);
- _vechile.setDetails(180, 33, 34, 35, 1, NULL);
+ _vechile.setDetails(180, 33, 34, 35, 1, (SceneItem *)NULL);
_object1.postInit();
_object1.setVisage(182);
@@ -2845,7 +2845,7 @@ void Scene180::postInit(SceneObjectList *OwnerList) {
BF_GLOBALS._player.disableControl();
_vechile.postInit();
- _vechile.setDetails(180, 33, 34, 35, 1, NULL);
+ _vechile.setDetails(180, 33, 34, 35, 1, (SceneItem *)NULL);
_object1.postInit();
@@ -2874,7 +2874,7 @@ void Scene180::postInit(SceneObjectList *OwnerList) {
_vechile._moveDiff = Common::Point(40, 5);
_vechile.setPosition(Common::Point(-25, 171));
- _fieldC56 = 1;
+ _dispatchMode = 1;
BF_GLOBALS._sound1.play(29);
_sceneMode = 1;
@@ -2895,15 +2895,15 @@ void Scene180::postInit(SceneObjectList *OwnerList) {
_vechile.setStrip(3);
_vechile._frame = 5;
_vechile.changeZoom(75);
-
- _fieldC56 = 1;
+
+ _dispatchMode = 1;
_vechile._moveDiff.x = 45;
} else {
_vechile.setVisage(444);
_vechile.setStrip(2);
_vechile.changeZoom(85);
- _fieldC56 = 3;
+ _dispatchMode = 3;
_vechile._moveDiff.x = 30;
}
@@ -2935,7 +2935,7 @@ void Scene180::postInit(SceneObjectList *OwnerList) {
void Scene180::signal() {
switch (_sceneMode) {
case 1:
- _fieldC56 = 0;
+ _dispatchMode = 0;
switch (BF_GLOBALS._bookmark) {
case bFlashBackThree:
BF_GLOBALS._bookmark = bDroppedOffLyle;
@@ -2953,12 +2953,12 @@ void Scene180::signal() {
setAction(&_sequenceManager, this, 1802, &_vechile, &_object1, NULL);
break;
case 2:
- _fieldC56 = 0;
+ _dispatchMode = 0;
BF_GLOBALS._sound1.fadeOut2(NULL);
BF_GLOBALS._sceneManager.changeScene(BF_GLOBALS._driveToScene);
break;
case 3:
- _fieldC56 = 0;
+ _dispatchMode = 0;
BF_GLOBALS._sound1.stop();
_stripManager.start(1800, this);
_sceneMode = 4;
@@ -2997,7 +2997,7 @@ void Scene180::signal() {
BF_GLOBALS._player.disableControl();
_vechile.postInit();
- _vechile.setDetails(180, 33, 34, 35, 1, NULL);
+ _vechile.setDetails(180, 33, 34, 35, 1, (SceneItem *)NULL);
_object1.postInit();
_sceneMode = 1801;
@@ -3040,7 +3040,7 @@ void Scene180::signal() {
}
break;
case 1800:
- _fieldC56 = 2;
+ _dispatchMode = 2;
_vechile._moveDiff.x = 10;
_sceneMode = 2;
ADD_MOVER(_vechile, -25, 171);
@@ -3079,7 +3079,7 @@ void Scene180::process(Event &event) {
}
void Scene180::dispatch() {
- switch (_fieldC56) {
+ switch (_dispatchMode) {
case 1:
if (_vechile._mover && (_vechile._percent > 50))
_vechile.changeZoom(_vechile._percent - 1);
@@ -3123,7 +3123,7 @@ void Scene180::dispatch() {
*
*--------------------------------------------------------------------------*/
-bool Scene190::Object4::startAction(CursorType action, Event &event) {
+bool Scene190::LyleCar::startAction(CursorType action, Event &event) {
Scene190 *scene = (Scene190 *)BF_GLOBALS._sceneManager._scene;
switch (action) {
@@ -3191,14 +3191,14 @@ void Scene190::Action1::signal() {
}
case 2:
scene->_sound.play(82);
- scene->_object2.animate(ANIM_MODE_5, this);
+ scene->_door.animate(ANIM_MODE_5, this);
break;
case 3:
ADD_MOVER(BF_GLOBALS._player, 180, 86);
break;
case 4:
scene->_sound.play(82);
- scene->_object2.animate(ANIM_MODE_6, this);
+ scene->_door.animate(ANIM_MODE_6, this);
break;
case 5:
BF_GLOBALS._sound1.fadeOut2(NULL);
@@ -3220,12 +3220,17 @@ void Scene190::postInit(SceneObjectList *OwnerList) {
(BF_GLOBALS._sceneManager._previousScene == 20)) {
// clearScreen();
}
- if (BF_GLOBALS._dayNumber == 0)
+ if (BF_GLOBALS._dayNumber == 0) {
// If at start of game, change to first day
BF_GLOBALS._dayNumber = 1;
+ // To be checked: Not present in the original
+ g_globals->_sceneManager._previousScene = 100;
+ }
+ SceneExt::postInit();
// Load the scene data
loadScene(190);
+
BF_GLOBALS._scenePalette.loadPalette(2);
_stripManager.addSpeaker(&_speaker);
@@ -3233,18 +3238,20 @@ void Scene190::postInit(SceneObjectList *OwnerList) {
BF_GLOBALS._player.disableControl();
// Initialise objects
- _object2.postInit();
- _object2.setVisage(190);
- _object2.setStrip(1);
- _object2.setPosition(Common::Point(179, 88));
+ _door.postInit();
+ _door.setVisage(190);
+ _door.setStrip(1);
+ _door.setPosition(Common::Point(179, 88));
- _object3.postInit();
- _object3.setVisage(190);
- _object3.setStrip(2);
- _object3.fixPriority(200);
- _object3.setPosition(Common::Point(170, 31));
- _object3.animate(ANIM_MODE_7, 0, NULL);
- _object3.setDetails(190, 8, 26, 19, 1, NULL);
+ _flag.postInit();
+ _flag.setVisage(190);
+ _flag.setStrip(2);
+ _flag.fixPriority(200);
+ _flag.setPosition(Common::Point(170, 31));
+ _flag.animate(ANIM_MODE_7, 0, NULL);
+ _flag.setDetails(190, 8, 26, 19, 1, (SceneItem *)NULL);
+
+ _fieldB52 = true;
if (BF_GLOBALS.getFlag(fWithLyle)) {
BF_GLOBALS._player.setVisage(303);
@@ -3252,11 +3259,11 @@ void Scene190::postInit(SceneObjectList *OwnerList) {
BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
BF_GLOBALS._player._moveDiff = Common::Point(3, 1);
- _object4.postInit();
- _object4.setVisage(444);
- _object4.setFrame(2);
- _object4.setPosition(Common::Point(54, 114));
- _object4.setDetails(190, -1, -1, -1, 1, NULL);
+ _lyleCar.postInit();
+ _lyleCar.setVisage(444);
+ _lyleCar.setFrame(2);
+ _lyleCar.setPosition(Common::Point(54, 114));
+ _lyleCar.setDetails(190, -1, -1, -1, 1, (SceneItem *)NULL);
switch (BF_GLOBALS._sceneManager._previousScene) {
case 300: {
@@ -3267,7 +3274,7 @@ void Scene190::postInit(SceneObjectList *OwnerList) {
}
case 315:
_sceneMode = 1901;
- setAction(&_sequenceManager, this, 1901, &BF_GLOBALS._player, &_object2, NULL);
+ setAction(&_sequenceManager, this, 1901, &BF_GLOBALS._player, &_door, NULL);
break;
case 50:
case 60:
@@ -3301,13 +3308,14 @@ void Scene190::postInit(SceneObjectList *OwnerList) {
case 315:
BF_GLOBALS._player._moveDiff = Common::Point(3, 1);
_sceneMode = BF_GLOBALS.getFlag(onDuty) ? 1900 : 1901;
- setAction(&_sequenceManager, this, _sceneMode, &BF_GLOBALS._player, &_object2, NULL);
+ setAction(&_sequenceManager, this, _sceneMode, &BF_GLOBALS._player, &_door, NULL);
break;
case 50:
case 60:
default:
BF_GLOBALS.setFlag(onBike);
BF_GLOBALS._player.disableControl();
+ // To be checked: Not present in the original
T2_GLOBALS._uiElements._active = true;
_sceneMode = BF_GLOBALS.getFlag(onDuty) ? 192 : 190;
setAction(&_sequenceManager, this, _sceneMode, &BF_GLOBALS._player, NULL);
@@ -3394,6 +3402,11 @@ void Scene190::dispatch() {
}
}
+void Scene190::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_fieldB52);
+}
+
} // End of namespace BlueForce
} // End of namespace TsAGE
diff --git a/engines/tsage/blue_force/blueforce_scenes1.h b/engines/tsage/blue_force/blueforce_scenes1.h
index bdf414ec9b..ddde200370 100644
--- a/engines/tsage/blue_force/blueforce_scenes1.h
+++ b/engines/tsage/blue_force/blueforce_scenes1.h
@@ -99,11 +99,12 @@ public:
SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3;
SequenceManager _sequenceManager4, _sequenceManager5, _sequenceManager6;
SequenceManager _sequenceManager7, _sequenceManager8;
- SceneObject _object1, _object2, _protaginist2, _protaginist1, _object5;
- SceneObject _drunk, _object7, _bartender, _object9, _object10;
+ SceneObject _object1, _object2, _protaginist2, _protaginist1, _cop1;
+ SceneObject _drunk, _cop2, _bartender, _beerSign, _animationInset;
IntroSceneText _text;
Action1 _action1;
- Action _action2, _action3;
+ Action2 _action2;
+ Action3 _action3;
public:
Scene109();
@@ -136,7 +137,7 @@ class Scene110: public SceneExt {
virtual void signal();
};
public:
- NamedObject _object1, _object2, _object3, _object4, _object5, _object6, _object7, _object8, _object9, _object10;
+ NamedObject _object1, _object2, _object3, _object4, _object5, _object6, _object7, _object8, _object9, _object10;
ASound _sound;
Action1 _action1;
Action2 _action2;
@@ -170,13 +171,13 @@ public:
class Scene115: public SceneExt {
/* Objects */
- class Object1: public NamedObject {
+ class Kate: public NamedObject {
public:
virtual bool startAction(CursorType action, Event &event);
};
- class Object2: public NamedObject {
+ class Tony: public NamedObject {
public:
- int _field15F8;
+ int _talkToTonyCtr2;
virtual bool startAction(CursorType action, Event &event);
};
class Object3: public NamedObject {
@@ -196,12 +197,12 @@ class Scene115: public SceneExt {
};
/* Items */
- class Item1: public NamedHotspot {
+ class Jukebox: public NamedHotspot {
SequenceManager _sequenceManager6;
public:
- int _field1F8A;
+ int _jokeboxPlayingCtr;
- Item1();
+ Jukebox();
virtual bool startAction(CursorType action, Event &event);
virtual void signal();
virtual void synchronize(Serializer &s);
@@ -258,13 +259,13 @@ class Scene115: public SceneExt {
SequenceManager _sequenceManager3;
SequenceManager _sequenceManager4;
SequenceManager _sequenceManager5;
- Object1 _object1;
- Object2 _object2;
+ Kate _kate;
+ Tony _tony;
Object3 _object3;
Object4 _object4;
- SceneObject _object5, _object6, _object7, _object8, _object9;
+ SceneObject _object5, _object6, _neonSign, _object8, _object9;
SceneObject _object10, _object11, _object12, _object13;
- Item1 _item1;
+ Jukebox _itemJukebox;
EventHandler1 _eventHandler1;
NamedHotspot _item2, _item3, _item4, _item5, _item6, _item7, _item8, _item9;
Item10 _item10;
@@ -286,9 +287,9 @@ class Scene115: public SceneExt {
SpeakerJakeUniform _jakeUniformSpeaker;
SpeakerLyleHat _lyleHatSpeaker;
ASound _sound1;
- int _field168A;
- int _field31E8;
- int _field31EA;
+ int _lineNumModifier;
+ int _jukeboxPlaying;
+ int _talkToTonyCtr;
public:
Scene115();
virtual void synchronize(Serializer &s);
@@ -353,7 +354,7 @@ public:
NamedObject _object1;
NamedObject _object2;
IntroSceneText _text;
-
+
void postInit(SceneObjectList *OwnerList);
};
@@ -419,7 +420,7 @@ public:
GarageExit _garageExit;
ASoundExt _sound1;
SceneMessage _sceneMessage;
- int _fieldC56;
+ int _dispatchMode;
Scene180();
virtual void synchronize(Serializer &s);
@@ -431,7 +432,7 @@ public:
class Scene190: public SceneExt {
/* Objects */
- class Object4: public NamedObject {
+ class LyleCar: public NamedObject {
public:
virtual bool startAction(CursorType action, Event &event);
};
@@ -458,8 +459,8 @@ class Scene190: public SceneExt {
public:
SequenceManager _sequenceManager;
FollowerObject _object1;
- NamedObject _object2, _object3;
- Object4 _object4;
+ NamedObject _door, _flag;
+ LyleCar _lyleCar;
Item1 _item1;
Item2 _item2;
NamedHotspot _item3, _item4, _item5, _item6;
@@ -475,10 +476,7 @@ public:
virtual void signal();
virtual void process(Event &event);
virtual void dispatch();
- virtual void synchronize(Serializer &s) {
- SceneExt::synchronize(s);
- s.syncAsSint16LE(_fieldB52);
- }
+ virtual void synchronize(Serializer &s);
};
} // End of namespace BlueForce
diff --git a/engines/tsage/blue_force/blueforce_scenes2.cpp b/engines/tsage/blue_force/blueforce_scenes2.cpp
index 3af02bd463..c992afe620 100644
--- a/engines/tsage/blue_force/blueforce_scenes2.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes2.cpp
@@ -67,7 +67,7 @@ void Scene200::Action1::signal() {
rot->setDelay(10);
rot = BF_GLOBALS._scenePalette.addRotation(96, 111, 1);
rot->setDelay(10);
-
+
scene->setAction(&scene->_sequenceManager, this, 201, &scene->_object1, &scene->_object2,
&scene->_object3, &scene->_object4, &scene->_object5, &scene->_object6, NULL);
break;
@@ -99,7 +99,7 @@ void Scene200::Action2::signal() {
break;
}
}
-
+
/*--------------------------------------------------------------------------*/
@@ -133,7 +133,7 @@ void Scene200::postInit(SceneObjectList *OwnerList) {
_object11.setVisage(200);
_object11.setPosition(Common::Point(96, 112), 1000);
_object11.setStrip(3);
- _object11.setFrame(1);
+ _object11.setFrame(1);
_object11.changeZoom(100);
_object10.setAction(&_action1);
@@ -168,7 +168,7 @@ void Scene210::Action1::signal() {
rot->setDelay(10);
rot = BF_GLOBALS._scenePalette.addRotation(96, 111, 1);
rot->setDelay(10);
-
+
scene->setAction(&scene->_sequenceManager, this, 210, &scene->_object10, &scene->_object11,
&scene->_object12, &scene->_object13, &scene->_object14, &scene->_object15, NULL);
break;
@@ -301,7 +301,7 @@ void Scene220::Action1::signal() {
rot->setDelay(10);
rot = BF_GLOBALS._scenePalette.addRotation(96, 111, 1);
rot->setDelay(10);
-
+
scene->setAction(&scene->_sequenceManager, this, 220, &scene->_object4, &scene->_object5,
&scene->_object6, &scene->_object7, &scene->_object8, &scene->_object9, NULL);
break;
@@ -508,7 +508,7 @@ void Scene225::Action1::signal() {
rot->setDelay(10);
rot = BF_GLOBALS._scenePalette.addRotation(96, 111, 1);
rot->setDelay(10);
-
+
scene->setAction(&scene->_sequenceManager, this, 225, &scene->_object15, &scene->_object16,
&scene->_object17, &scene->_object18, &scene->_object19, &scene->_object20, NULL);
break;
@@ -661,7 +661,7 @@ void Scene225::postInit(SceneObjectList *OwnerList) {
_object11._frame = 1;
_object11.changeZoom(100);
_object11._numFrames = 2;
-
+
_object12.postInit();
_object12.setVisage(1225);
_object12.setPosition(Common::Point(368, 35));
@@ -937,9 +937,9 @@ void Scene270::postInit(SceneObjectList *OwnerList) {
(BF_INVENTORY.getObjectScene(INV_BASEBALL_CARD) != 2) &&
(BF_INVENTORY.getObjectScene(INV_BASEBALL_CARD) != 1)) ||
((BF_GLOBALS._dayNumber == 3) && BF_GLOBALS.getFlag(fGotGreen355fTalkedToGrannyDay3))) {
- BF_GLOBALS._walkRegions.proc1(6);
- BF_GLOBALS._walkRegions.proc1(14);
- BF_GLOBALS._walkRegions.proc1(19);
+ BF_GLOBALS._walkRegions.disableRegion(6);
+ BF_GLOBALS._walkRegions.disableRegion(14);
+ BF_GLOBALS._walkRegions.disableRegion(19);
_grandma.postInit();
_grandma.setVisage(274);
@@ -983,17 +983,17 @@ void Scene270::postInit(SceneObjectList *OwnerList) {
_fireplace.animate(ANIM_MODE_2, NULL);
_fridge.setDetails(Rect(0, 56, 56, 130), 270, 9, 10, 11, 1, NULL);
- _object3.setDetails(270, 12, 13, 14, 1, NULL);
- _laura.setDetails(270, 15, -1, -1, 1, NULL);
- _skip.setDetails(270, 14, -1, -1, 1, NULL);
- _lyle.setDetails(270, 34, 35, 36, 1, NULL);
- _tv.setDetails(270, 3, 4, 5, 1, NULL);
- _fireplace.setDetails(270, 6, 7, 8, 1, NULL);
+ _object3.setDetails(270, 12, 13, 14, 1, (SceneItem *)NULL);
+ _laura.setDetails(270, 15, -1, -1, 1, (SceneItem *)NULL);
+ _skip.setDetails(270, 14, -1, -1, 1, (SceneItem *)NULL);
+ _lyle.setDetails(270, 34, 35, 36, 1, (SceneItem *)NULL);
+ _tv.setDetails(270, 3, 4, 5, 1, (SceneItem *)NULL);
+ _fireplace.setDetails(270, 6, 7, 8, 1, (SceneItem *)NULL);
if ((BF_GLOBALS._sceneManager._previousScene == 710) && (BF_GLOBALS._bookmark == bTalkedToGrannyAboutSkipsCard)) {
- _grandma.setDetails(270, 15, 16, 17, 1, NULL);
+ _grandma.setDetails(270, 15, 16, 17, 1, (SceneItem *)NULL);
} else {
- _grandma.setDetails(270, 40, 16, 17, 1, NULL);
+ _grandma.setDetails(270, 40, 16, 17, 1, (SceneItem *)NULL);
}
_afgan.setDetails(4, 270, 27, 28, 29, 1);
@@ -1007,14 +1007,14 @@ void Scene270::postInit(SceneObjectList *OwnerList) {
BF_GLOBALS._player._moveDiff.x = 8;
BF_GLOBALS._player.changeZoom(-1);
BF_GLOBALS._player.disableControl();
-
+
switch (BF_GLOBALS._sceneManager._previousScene) {
case 560:
if (BF_GLOBALS._bookmark == bTalkedToGrannyAboutSkipsCard) {
_field219A = 1;
BF_GLOBALS._player._moveDiff.x = 5;
_field386 = 0;
-
+
_grandma.animate(ANIM_MODE_1, NULL);
setAction(&_sequenceManager1, NULL, 2720, &BF_GLOBALS._player, &_grandma, NULL);
BF_GLOBALS._bookmark = bLyleStoppedBy;
@@ -1138,13 +1138,13 @@ void Scene270::signal() {
case 2717:
_sceneMode = 2718;
_lyle.setFrame2(-1);
- setAction(&_sequenceManager1, this, 2718, &BF_GLOBALS._player, &_laura, &_skip,
+ setAction(&_sequenceManager1, this, 2718, &BF_GLOBALS._player, &_laura, &_skip,
&_lyle, &_grandma, NULL);
break;
case 2718:
- BF_GLOBALS._walkRegions.proc1(6);
- BF_GLOBALS._walkRegions.proc1(14);
- BF_GLOBALS._walkRegions.proc1(19);
+ BF_GLOBALS._walkRegions.disableRegion(6);
+ BF_GLOBALS._walkRegions.disableRegion(14);
+ BF_GLOBALS._walkRegions.disableRegion(19);
_field219A = 1;
BF_GLOBALS._bookmark = bTalkedToGrannyAboutSkipsCard;
@@ -1152,7 +1152,7 @@ void Scene270::signal() {
_grandma.setStrip(8);
_grandma._frame = 5;
_field384 = 1;
- _field384 = 1;
+ _field386 = 1;
BF_GLOBALS._player._moveDiff.x = 8;
BF_GLOBALS._player.enableControl();
@@ -1167,7 +1167,7 @@ void Scene270::signal() {
break;
default:
break;
- }
+ }
}
void Scene270::process(Event &event) {
@@ -1290,7 +1290,7 @@ void Scene270::dispatch() {
void Scene271::Action1::signal() {
Scene271 *scene = (Scene271 *)BF_GLOBALS._sceneManager._scene;
- scene->setAction(&scene->_sequenceManager2, this, 2703, &scene->_tv, NULL);
+ setAction(&scene->_sequenceManager2, this, 2703, &scene->_tv, NULL);
}
/*--------------------------------------------------------------------------*/
@@ -1374,7 +1374,7 @@ Scene271::Scene271() {
void Scene271::synchronize(Serializer &s) {
PalettedScene::synchronize(s);
-
+
s.syncAsSint16LE(_field796);
s.syncAsSint16LE(_field2E16);
s.syncAsSint16LE(_tempPos.x);
@@ -1396,7 +1396,7 @@ void Scene271::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_gameTextSpeaker);
_stripManager.addSpeaker(&_granTextSpeaker);
_stripManager.addSpeaker(&_lyleTextSpeaker);
-
+
_exit.setDetails(Rect(310, 115, 320, 167), 270, -1, -1, -1, 1, NULL);
_tv.postInit();
@@ -1420,20 +1420,20 @@ void Scene271::postInit(SceneObjectList *OwnerList) {
_object5.hide();
_item5.setDetails(Rect(0, 56, 56, 130), 270, 9, 10, 11, 1, NULL);
- _object6.setDetails(270, 12, 13, 14, 1, NULL);
- _object7.setDetails(270, 15, -1, -1, 1, NULL);
- _object8.setDetails(270, 14, -1, -1, 1, NULL);
- _object11.setDetails(270, -1, -1, -1, 1, NULL);
- _tv.setDetails(270, 3, 4, 5, 1, NULL);
- _object10.setDetails(270, 6, 7, 8, 1, NULL);
- _object12.setDetails(270, 15, 16, 17, 1, NULL);
+ _object6.setDetails(270, 12, 13, 14, 1, (SceneItem *)NULL);
+ _object7.setDetails(270, 15, -1, -1, 1, (SceneItem *)NULL);
+ _object8.setDetails(270, 14, -1, -1, 1, (SceneItem *)NULL);
+ _object11.setDetails(270, -1, -1, -1, 1, (SceneItem *)NULL);
+ _tv.setDetails(270, 3, 4, 5, 1, (SceneItem *)NULL);
+ _object10.setDetails(270, 6, 7, 8, 1, (SceneItem *)NULL);
+ _object12.setDetails(270, 15, 16, 17, 1, (SceneItem *)NULL);
_item3.setDetails(4, 270, 27, 28, 29, 1);
_item1.setDetails(1, 270, 18, 19, 20, 1);
_item6.setDetails(Rect(278, 50, 318, 72), 270, 21, 22, 23, 1, NULL);
_item2.setDetails(3, 270, 24, 25, 26, 1);
_item4.setDetails(2, 270, 30, 31, 32, 1);
_item11.setDetails(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y), 270, 0, 1, 2, 1, NULL);
-
+
BF_GLOBALS._player.postInit();
BF_GLOBALS._player._moveDiff.x = 8;
BF_GLOBALS._player.changeZoom(-1);
@@ -1450,11 +1450,11 @@ void Scene271::postInit(SceneObjectList *OwnerList) {
switch (BF_GLOBALS._sceneManager._previousScene) {
case 180:
- BF_GLOBALS._walkRegions.proc1(6);
- BF_GLOBALS._walkRegions.proc1(14);
- BF_GLOBALS._walkRegions.proc1(19);
+ BF_GLOBALS._walkRegions.disableRegion(6);
+ BF_GLOBALS._walkRegions.disableRegion(14);
+ BF_GLOBALS._walkRegions.disableRegion(19);
- BF_GLOBALS._player.setVisage(151);
+ BF_GLOBALS._player.setVisage(275);
BF_GLOBALS._player.setPosition(Common::Point(348, 151));
_object12.postInit();
@@ -1477,13 +1477,13 @@ void Scene271::postInit(SceneObjectList *OwnerList) {
_object11.setStrip(1);
_object11._frame = 2;
_object11.setPosition(Common::Point(35, 136));
-
+
_object6.postInit();
_object6.hide();
- BF_GLOBALS._walkRegions.proc1(6);
- BF_GLOBALS._walkRegions.proc1(14);
- BF_GLOBALS._walkRegions.proc1(19);
+ BF_GLOBALS._walkRegions.disableRegion(6);
+ BF_GLOBALS._walkRegions.disableRegion(14);
+ BF_GLOBALS._walkRegions.disableRegion(19);
_object12.postInit();
_object12.setVisage(274);
@@ -1508,15 +1508,15 @@ void Scene271::postInit(SceneObjectList *OwnerList) {
_object7.setVisage(277);
_object7.setStrip(7);
_object7.setPosition(Common::Point(48, 149));
-
- BF_GLOBALS._walkRegions.proc1(6);
- BF_GLOBALS._walkRegions.proc1(14);
- BF_GLOBALS._walkRegions.proc1(19);
-
+
+ BF_GLOBALS._walkRegions.disableRegion(6);
+ BF_GLOBALS._walkRegions.disableRegion(14);
+ BF_GLOBALS._walkRegions.disableRegion(19);
+
_object12.postInit();
_object12.setVisage(276);
_object12.setPosition(Common::Point(129, 130));
-
+
_object2.postInit();
_object2.setVisage(270);
_object2.setStrip(3);
@@ -1543,9 +1543,9 @@ void Scene271::postInit(SceneObjectList *OwnerList) {
BF_GLOBALS._player.setFrame(1);
BF_GLOBALS._player.setPosition(Common::Point(239, 145));
- BF_GLOBALS._walkRegions.proc1(6);
- BF_GLOBALS._walkRegions.proc1(14);
- BF_GLOBALS._walkRegions.proc1(19);
+ BF_GLOBALS._walkRegions.disableRegion(6);
+ BF_GLOBALS._walkRegions.disableRegion(14);
+ BF_GLOBALS._walkRegions.disableRegion(19);
_object12.postInit();
_object12.setVisage(274);
@@ -1637,10 +1637,10 @@ void Scene271::signal() {
BF_GLOBALS._player.enableControl();
_field796 = 1;
_field2E16 = 1;
-
+
_object1.remove();
_object11.remove();
-
+
BF_INVENTORY.setObjectScene(INV_LYLE_CARD, 1);
break;
case 2709:
@@ -1754,7 +1754,7 @@ void Scene280::Action1::signal() {
scene->_jake.setFrame(1);
scene->_jake.animate(ANIM_MODE_8, NULL);
scene->_jake._numFrames = 5;
-
+
scene->_stripManager.start(2800, this);
break;
case 2:
diff --git a/engines/tsage/blue_force/blueforce_scenes3.cpp b/engines/tsage/blue_force/blueforce_scenes3.cpp
index 1fa27ccb27..22c831f531 100644
--- a/engines/tsage/blue_force/blueforce_scenes3.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes3.cpp
@@ -58,7 +58,7 @@ bool Scene300::Object19::startAction(CursorType action, Event &event) {
return true;
}
-
+// entrance door
bool Scene300::Item1::startAction(CursorType action, Event &event) {
if (action == CURSOR_USE) {
Scene300 *scene = (Scene300 *)BF_GLOBALS._sceneManager._scene;
@@ -75,6 +75,8 @@ bool Scene300::Item1::startAction(CursorType action, Event &event) {
bool Scene300::Item2::startAction(CursorType action, Event &event) {
if ((action == CURSOR_LOOK) || (action == CURSOR_USE)) {
Scene300 *scene = (Scene300 *)BF_GLOBALS._sceneManager._scene;
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 0;
scene->setAction(&scene->_sequenceManager1, scene, 304, &scene->_object11, NULL);
return true;
} else {
@@ -108,7 +110,7 @@ void Scene300::Action1::signal() {
setDelay(1);
break;
case 2: {
- ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, BF_GLOBALS._player._position.x - 8,
+ ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x - 8,
BF_GLOBALS._player._position.y);
break;
}
@@ -183,12 +185,13 @@ void Scene300::Action4::signal() {
break;
case 2:
BF_GLOBALS._sceneManager.changeScene(60);
+ setDelay(15);
break;
case 3:
setAction(&scene->_sequenceManager1, this, 319, &scene->_object19, NULL);
break;
case 4:
- BF_GLOBALS.setFlag(2);
+ BF_GLOBALS.setFlag(onBike);
BF_GLOBALS._sceneManager.changeScene(190);
break;
default:
@@ -213,6 +216,7 @@ void Scene300::Action5::signal() {
break;
case 3: {
ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 186, 140);
+ setDelay(3);
break;
}
case 4:
@@ -265,20 +269,20 @@ void Scene300::postInit(SceneObjectList *OwnerList) {
_object17.setVisage(301);
_object17.setStrip(1);
_object17.setPosition(Common::Point(87, 88));
- _object17.setDetails(300, 11, 13, 2, 1, NULL);
+ _object17.setDetails(300, 11, 13, 2, 1, (SceneItem *)NULL);
_object18.postInit();
_object18.setVisage(301);
_object18.setStrip(1);
_object18.setPosition(Common::Point(137, 92));
- _object18.setDetails(300, 11, 13, 3, 1, NULL);
+ _object18.setDetails(300, 11, 13, 3, 1, (SceneItem *)NULL);
}
_object19.postInit();
_object19.setVisage(301);
_object19.setStrip(1);
_object19.setPosition(Common::Point(175, 99));
- _object19.setDetails(300, 11, 13, 34, 1, NULL);
+ _object19.setDetails(300, 11, 13, 34, 1, (SceneItem *)NULL);
_object11.postInit();
_object11.setVisage(301);
@@ -302,14 +306,14 @@ void Scene300::postInit(SceneObjectList *OwnerList) {
break;
case 190:
_sceneMode = 0;
- if (!BF_GLOBALS.getFlag(2)) {
+ if (!BF_GLOBALS.getFlag(onBike)) {
_sceneMode = 7308;
BF_GLOBALS._player.setPosition(Common::Point(175, 50));
ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, 123, 71);
if ((BF_GLOBALS._dayNumber == 2) && (BF_GLOBALS._bookmark < bEndDayOne))
- setup();
- } else if (!BF_GLOBALS.getFlag(3)) {
+ setupInspection();
+ } else if (!BF_GLOBALS.getFlag(onDuty)) {
BF_GLOBALS._player.disableControl();
_sceneMode = 300;
setAction(&_sequenceManager1, this, 300, &BF_GLOBALS._player, NULL);
@@ -328,7 +332,7 @@ void Scene300::postInit(SceneObjectList *OwnerList) {
setAction(&_sequenceManager1, this, 306, &BF_GLOBALS._player, &_object8, NULL);
} else {
BF_GLOBALS._player.setVisage(1304);
- setup();
+ setupInspection();
BF_GLOBALS._player.disableControl();
_sceneMode = 0;
setAction(&_sequenceManager1, this, 306, &BF_GLOBALS._player, &_object8, NULL);
@@ -420,7 +424,7 @@ void Scene300::signal() {
setAction(&_sequenceManager1, this, 312, &_object1, &_object16, NULL);
break;
case 317:
- BF_GLOBALS.setFlag(2);
+ BF_GLOBALS.setFlag(onBike);
BF_GLOBALS._sceneManager.changeScene(60);
break;
case 318:
@@ -474,10 +478,10 @@ void Scene300::signal() {
_object10.postInit();
_object10.hide();
- if (BF_GLOBALS.getFlag(1)) {
+ if (BF_GLOBALS.getFlag(gunClean)) {
BF_GLOBALS._player.disableControl();
_sceneMode = 4308;
- setAction(&_sequenceManager1, this, 6307, &_object2, &_object1, &_object9, &_object10, NULL);
+ setAction(&_sequenceManager1, this, 6307, &_object12, &_object1, &_object9, &_object10, NULL);
} else {
BF_GLOBALS._player.disableControl();
_sceneMode = 4308;
@@ -552,7 +556,7 @@ void Scene300::dispatch() {
if ((BF_GLOBALS._player._position.y < 59) && (BF_GLOBALS._player._position.x > 137) &&
(_sceneMode != 6308) && (_sceneMode != 7308)) {
- BF_GLOBALS._v4CEA4 = 3;
+ // The original was setting a useless global variable (removed)
_sceneMode = 6308;
BF_GLOBALS._player.disableControl();
ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x + 20,
@@ -574,7 +578,7 @@ void Scene300::dispatch() {
}
}
-void Scene300::setup() {
+void Scene300::setupInspection() {
_object13.postInit();
_object13.setVisage(307);
_object13.setStrip(6);
@@ -618,7 +622,7 @@ void Scene300::setup() {
_object1._moveDiff = Common::Point(3, 1);
_object1.setObjectWrapper(new SceneObjectWrapper());
_object1.animate(ANIM_MODE_1, NULL);
- _object2.setup(&_object1, 306, 4, 9);
+ _object2.setup(&_object1, 306, 4, 29);
BF_GLOBALS._sceneItems.addItems(&_object13, &_object14, &_object15, &_object16, NULL);
_timer.set(3600, this, &_action5);
@@ -638,7 +642,7 @@ bool Scene315::Barry::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE:
- if (scene->_field1B60 || scene->_field1B64)
+ if (scene->_invGreenCount || scene->_invGangCount)
SceneItem::display2(320, 51);
else
NamedHotspot::startAction(action, event);
@@ -667,7 +671,7 @@ bool Scene315::Barry::startAction(CursorType action, Event &event) {
scene->_stripNumber = 3174;
scene->setAction(&scene->_action1);
} else {
- ++scene->_field1B62;
+ ++scene->_bookGreenCount;
scene->_stripNumber = (action == INV_GREENS_GUN) ? 3168 : 0;
scene->_sceneMode = 3153;
scene->setAction(&scene->_sequenceManager, scene, 3153, &BF_GLOBALS._player, NULL);
@@ -675,7 +679,7 @@ bool Scene315::Barry::startAction(CursorType action, Event &event) {
break;
case INV_FOREST_RAP:
BF_GLOBALS._player.disableControl();
- scene->_stripNumber = BF_GLOBALS.getFlag(onDuty) ? 3178 : 3173;
+ scene->_stripNumber = BF_GLOBALS.getFlag(onDuty) ? 3173 : 3178;
scene->setAction(&scene->_action1);
break;
case INV_GREEN_ID:
@@ -693,7 +697,7 @@ bool Scene315::Barry::startAction(CursorType action, Event &event) {
scene->setAction(&scene->_action1);
break;
case INV_COBB_RAP:
- if (BF_INVENTORY._mugshot._sceneNumber == 1)
+ if (BF_INVENTORY.getObjectScene(INV_MUG_SHOT) == 1)
NamedHotspot::startAction(action, event);
else {
BF_GLOBALS._player.disableControl();
@@ -717,8 +721,8 @@ bool Scene315::Barry::startAction(CursorType action, Event &event) {
scene->_stripNumber = 3174;
scene->setAction(&scene->_action1);
} else {
- ++scene->_field1B66;
- if (!scene->_field1B6C && (scene->_field1B66 == 1)) {
+ ++scene->_bookGangCount;
+ if (!scene->_field1B6C && (scene->_bookGangCount == 1)) {
scene->_field1B6C = 1;
scene->_stripNumber = 3169;
} else {
@@ -759,9 +763,9 @@ bool Scene315::SutterSlot::startAction(CursorType action, Event &event) {
case INV_BOOKING_FRANKIE:
case INV_BOOKING_GANG:
if (action == INV_BOOKING_GREEN)
- ++scene->_field1B62;
+ ++scene->_bookGreenCount;
else
- ++scene->_field1B66;
+ ++scene->_bookGangCount;
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 12;
@@ -874,6 +878,7 @@ bool Scene315::BulletinMemo::startAction(CursorType action, Event &event) {
}
}
+// Own Mail Slot
bool Scene315::Object2::startAction(CursorType action, Event &event) {
Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene;
@@ -939,6 +944,10 @@ void Scene315::Action1::signal() {
if (scene->_sceneMode == 3169) {
T2_GLOBALS._uiElements.addScore(30);
BF_INVENTORY.setObjectScene(INV_MUG_SHOT, 1);
+ //HACK: This has to be checked wether or not it occurs in the original.
+ //When the _sceneMode is set to 3169, the value desn't change.
+ //If you show the forest rapsheet, it gives points (and again... and again...)
+ scene->_sceneMode = 3154;
}
remove();
@@ -957,9 +966,9 @@ Scene315::Scene315() {
BF_GLOBALS.clearFlag(fCanDrawGun);
_field1B68 = true;
- _field1B6A = false;
- _field1B60 = _field1B62 = 0;
- _field1B64 = _field1B66 = 0;
+ _doorOpened = false;
+ _invGreenCount = _bookGreenCount = 0;
+ _invGangCount = _bookGangCount = 0;
}
void Scene315::synchronize(Serializer &s) {
@@ -968,18 +977,19 @@ void Scene315::synchronize(Serializer &s) {
s.syncAsSint16LE(_field1390);
s.syncAsSint16LE(_stripNumber);
s.syncAsSint16LE(_field1398);
- s.syncAsSint16LE(_field1B60);
- s.syncAsSint16LE(_field1B62);
- s.syncAsSint16LE(_field1B64);
- s.syncAsSint16LE(_field1B66);
+ s.syncAsSint16LE(_invGreenCount);
+ s.syncAsSint16LE(_bookGreenCount);
+ s.syncAsSint16LE(_invGangCount);
+ s.syncAsSint16LE(_bookGangCount);
s.syncAsSint16LE(_field1B6C);
s.syncAsSint16LE(_field139C);
s.syncAsByte(_field1B68);
- s.syncAsByte(_field1B6A);
+ s.syncAsByte(_doorOpened);
s.syncAsSint16LE(_currentCursor);
}
void Scene315::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit(OwnerList);
loadScene(315);
if (BF_GLOBALS._sceneManager._previousScene != 325)
@@ -1005,7 +1015,7 @@ void Scene315::postInit(SceneObjectList *OwnerList) {
_atfMemo.setStrip(4);
_atfMemo.setFrame(4);
_atfMemo.fixPriority(82);
- _atfMemo.setDetails(315, -1, -1, -1, 1, NULL);
+ _atfMemo.setDetails(315, -1, -1, -1, 1, (SceneItem *)NULL);
}
if (BF_GLOBALS._dayNumber == 1) {
@@ -1016,7 +1026,7 @@ void Scene315::postInit(SceneObjectList *OwnerList) {
_bulletinMemo.setStrip(4);
_bulletinMemo.setFrame(2);
_bulletinMemo.fixPriority(82);
- _bulletinMemo.setDetails(315, -1, -1, -1, 1, NULL);
+ _bulletinMemo.setDetails(315, -1, -1, -1, 1, (SceneItem *)NULL);
}
} else if ((BF_INVENTORY._daNote._sceneNumber != 1) && (BF_GLOBALS._dayNumber < 3)) {
_object2.postInit();
@@ -1025,7 +1035,7 @@ void Scene315::postInit(SceneObjectList *OwnerList) {
_object2.setFrame(2);
_object2.setPosition(Common::Point(304, 31));
_object2.fixPriority(70);
- _object2.setDetails(315, 3, 4, -1, 1, NULL);
+ _object2.setDetails(315, 3, 4, -1, 1, (SceneItem *)NULL);
}
_sutterSlot.setDetails(12, 315, 35, -1, 36, 1);
@@ -1061,29 +1071,29 @@ void Scene315::postInit(SceneObjectList *OwnerList) {
// Set up evidence objects in inventory
if (BF_INVENTORY._bookingGreen.inInventory())
- ++_field1B60;
+ ++_invGreenCount;
if (BF_INVENTORY._greensGun.inInventory())
- ++_field1B60;
+ ++_invGreenCount;
if (BF_INVENTORY._greensKnife.inInventory())
- ++_field1B60;
+ ++_invGreenCount;
if (BF_INVENTORY._bullet22.inInventory())
- ++_field1B64;
+ ++_invGangCount;
if (BF_INVENTORY._autoRifle.inInventory())
- ++_field1B64;
+ ++_invGangCount;
if (BF_INVENTORY._wig.inInventory())
- ++_field1B64;
+ ++_invGangCount;
if (BF_INVENTORY._bookingFrankie.inInventory())
- ++_field1B64;
+ ++_invGangCount;
if (BF_INVENTORY._bookingGang.inInventory())
- ++_field1B64;
+ ++_invGangCount;
if (BF_INVENTORY._snub22.inInventory())
- ++_field1B64;
+ ++_invGangCount;
switch (BF_GLOBALS._sceneManager._previousScene) {
case 190:
if (_field1398)
- _field1B6A = true;
+ _doorOpened = true;
_sceneMode = BF_GLOBALS.getFlag(onDuty) ? 3150 : 3165;
setAction(&_sequenceManager, this, _sceneMode, &BF_GLOBALS._player, NULL);
break;
@@ -1099,7 +1109,7 @@ void Scene315::postInit(SceneObjectList *OwnerList) {
case 300:
default:
if (_field1398)
- _field1B6A = true;
+ _doorOpened = true;
if (!BF_GLOBALS.getFlag(onDuty))
_sceneMode = 3166;
else if (!_field1398)
@@ -1111,10 +1121,10 @@ void Scene315::postInit(SceneObjectList *OwnerList) {
break;
}
- if (_field1B6A) {
+ if (_doorOpened) {
_object8.setFrame(8);
} else {
- BF_GLOBALS._walkRegions.proc1(4);
+ BF_GLOBALS._walkRegions.disableRegion(4);
}
_briefingMaterial.setDetails(24, 315, 38, 39, 40, 1);
@@ -1135,15 +1145,15 @@ void Scene315::signal() {
BF_GLOBALS._player.enableControl();
break;
case 10:
- if (_field1B62) {
- if (_field1B62 >= _field1B60)
+ if (_bookGreenCount) {
+ if (_bookGreenCount >= _invGreenCount)
BF_GLOBALS.setFlag(fLeftTraceIn910);
else
++ctr;
}
- if (_field1B66) {
- if (_field1B66 < _field1B64)
+ if (_bookGangCount) {
+ if (_bookGangCount < _invGangCount)
++ctr;
else if (BF_GLOBALS._bookmark < bBookedFrankieEvidence)
BF_GLOBALS._bookmark = bBookedFrankieEvidence;
@@ -1158,15 +1168,15 @@ void Scene315::signal() {
BF_GLOBALS._sound1.fadeOut2(NULL);
break;
case 11:
- if (_field1B62) {
- if (_field1B62 >= _field1B60)
+ if (_bookGreenCount) {
+ if (_bookGreenCount >= _invGreenCount)
BF_GLOBALS.setFlag(fLeftTraceIn910);
else
++ctr;
}
- if (_field1B66) {
- if (_field1B66 < _field1B64)
+ if (_bookGangCount) {
+ if (_bookGangCount < _invGangCount)
++ctr;
else if (BF_GLOBALS._bookmark < bBookedFrankie)
BF_GLOBALS._bookmark = bBookedFrankie;
@@ -1195,7 +1205,7 @@ void Scene315::signal() {
T2_GLOBALS._uiElements.addScore(30);
BF_INVENTORY.setObjectScene((int)_currentCursor, 315);
- if (!_field1B64 || (_field1B66 != _field1B64))
+ if (!_invGangCount || (_bookGangCount != _invGangCount))
BF_GLOBALS._player.enableControl();
else {
_field139C = 1;
@@ -1214,13 +1224,14 @@ void Scene315::signal() {
BF_GLOBALS._sceneManager.changeScene(325);
break;
case 3152:
- BF_GLOBALS._walkRegions.proc1(4);
+ BF_GLOBALS._walkRegions.disableRegion(4);
_object7.remove();
_object6.remove();
-
+ // No break on purpose
+ case 3155:
BF_GLOBALS._player.enableControl();
_field1B68 = false;
- BF_GLOBALS._walkRegions.proc1(4);
+ BF_GLOBALS._walkRegions.disableRegion(4);
T2_GLOBALS._uiElements._active = true;
T2_GLOBALS._uiElements.show();
break;
@@ -1230,7 +1241,7 @@ void Scene315::signal() {
if (_stripNumber != 0)
setAction(&_action1);
- else if (!_field1B64 || (_field1B66 != _field1B64))
+ else if (!_invGangCount || (_bookGangCount != _invGangCount))
BF_GLOBALS._player.enableControl();
else {
_stripNumber = 3171;
@@ -1238,13 +1249,6 @@ void Scene315::signal() {
_field139C = 1;
}
break;
- case 3155:
- BF_GLOBALS._player.enableControl();
- _field1B68 = false;
- BF_GLOBALS._walkRegions.proc1(4);
- T2_GLOBALS._uiElements._active = true;
- T2_GLOBALS._uiElements.show();
- break;
case 3156:
T2_GLOBALS._uiElements.addScore(10);
BF_INVENTORY.setObjectScene(INV_DA_NOTE, 1);
@@ -1287,6 +1291,11 @@ void Scene315::signal() {
BF_GLOBALS._player.enableControl();
_object9.remove();
break;
+ case 3169:
+ T2_GLOBALS._uiElements.addScore(30);
+ BF_INVENTORY.setObjectScene(INV_MUG_SHOT, 1);
+ BF_GLOBALS._player.enableControl();
+ break;
case 3154:
default:
break;
@@ -1318,7 +1327,7 @@ void Scene315::dispatch() {
if (_field1B68)
return;
- if (_field1B6A) {
+ if (_doorOpened) {
if (BF_GLOBALS._player._position.y < 69) {
BF_GLOBALS._player.disableControl();
_field1B68 = true;
@@ -1721,9 +1730,9 @@ void Scene340::Action1::signal() {
++BF_GLOBALS._marinaWomanCtr;
if (BF_GLOBALS.getFlag(fBackupArrived340)) {
- scene->_field2654 = 1;
+ scene->_backupPresent = 1;
scene->_harrison.setPosition(Common::Point(46, 154));
- BF_GLOBALS._walkRegions.proc1(19);
+ BF_GLOBALS._walkRegions.disableRegion(19);
} else if (BF_GLOBALS.getFlag(fCalledBackup)) {
scene->_timer1.set(40, &scene->_harrison, &scene->_action4);
}
@@ -1732,6 +1741,8 @@ void Scene340::Action1::signal() {
BF_GLOBALS._player.enableControl();
remove();
break;
+ default:
+ break;
}
}
@@ -1740,6 +1751,7 @@ void Scene340::Action2::signal() {
switch (_actionIndex++) {
case 0: {
+ BF_GLOBALS._player.disableControl();
ADD_PLAYER_MOVER(64, 155);
break;
}
@@ -1757,6 +1769,8 @@ void Scene340::Action2::signal() {
BF_GLOBALS._player.enableControl();
remove();
break;
+ default:
+ break;
}
}
@@ -1765,6 +1779,7 @@ void Scene340::Action3::signal() {
switch (_actionIndex++) {
case 0: {
+ BF_GLOBALS._player.disableControl();
ADD_PLAYER_MOVER(64, 155);
break;
}
@@ -1773,18 +1788,20 @@ void Scene340::Action3::signal() {
setDelay(3);
break;
case 2:
- scene->_stripManager.start(scene->_field2652 + 3404, this);
+ scene->_stripManager.start(scene->_womanDialogCount + 3404, this);
break;
case 3:
- if (++scene->_field2652 > 2) {
+ if (++scene->_womanDialogCount > 2) {
if (!BF_GLOBALS.getFlag(fGotAllSkip340))
BF_GLOBALS.setFlag(fGotAllSkip340);
- scene->_field2652 = 0;
+ scene->_womanDialogCount = 0;
}
BF_GLOBALS._player.enableControl();
remove();
break;
+ default:
+ break;
}
}
@@ -1803,17 +1820,19 @@ void Scene340::Action4::signal() {
break;
case 1:
BF_GLOBALS.setFlag(fBackupArrived340);
- scene->_field2654 = 1;
+ scene->_backupPresent = 1;
setDelay(3);
break;
case 2:
BF_GLOBALS._player.setAction(&scene->_sequenceManager3, this, 1347, &scene->_harrison, NULL);
break;
case 3:
- BF_GLOBALS._walkRegions.proc1(19);
+ BF_GLOBALS._walkRegions.disableRegion(19);
BF_GLOBALS._player.enableControl();
remove();
break;
+ default:
+ break;
}
}
@@ -1823,7 +1842,7 @@ void Scene340::Action5::signal() {
switch (_actionIndex++) {
case 0:
BF_GLOBALS._player.disableControl();
- if (scene->_field2654) {
+ if (scene->_backupPresent) {
ADD_PLAYER_MOVER(64, 155);
} else {
BF_GLOBALS._player.changeAngle(45);
@@ -1849,6 +1868,8 @@ void Scene340::Action5::signal() {
BF_GLOBALS._player.enableControl();
remove();
break;
+ default:
+ break;
}
}
@@ -1893,6 +1914,8 @@ void Scene340::Action7::signal() {
BF_GLOBALS.setFlag(fBackupIn350);
BF_GLOBALS._sceneManager.changeScene(350);
break;
+ default:
+ break;
}
}
@@ -1945,6 +1968,11 @@ void Scene340::Action8::signal() {
case 4:
remove();
break;
+ default:
+ // This is present in the original game
+ warning("Bugs");
+ remove();
+ break;
}
}
@@ -1977,15 +2005,15 @@ void Scene340::Timer2::signal() {
/*--------------------------------------------------------------------------*/
Scene340::Scene340(): PalettedScene() {
- _seqNumber1 = _field2652 = _field2654 = 0;
+ _seqNumber1 = _womanDialogCount = _backupPresent = 0;
}
void Scene340::synchronize(Serializer &s) {
PalettedScene::synchronize(s);
s.syncAsSint16LE(_seqNumber1);
- s.syncAsSint16LE(_field2652);
- s.syncAsSint16LE(_field2654);
+ s.syncAsSint16LE(_womanDialogCount);
+ s.syncAsSint16LE(_backupPresent);
}
void Scene340::postInit(SceneObjectList *OwnerList) {
@@ -1993,14 +2021,14 @@ void Scene340::postInit(SceneObjectList *OwnerList) {
loadScene(340);
setZoomPercents(126, 70, 162, 100);
- BF_GLOBALS._walkRegions.proc1(13);
- BF_GLOBALS._walkRegions.proc1(15);
+ BF_GLOBALS._walkRegions.disableRegion(13);
+ BF_GLOBALS._walkRegions.disableRegion(15);
_timer2.set(2, NULL);
_stripManager.addSpeaker(&_gameTextSpeaker);
_stripManager.addSpeaker(&_jakeUniformSpeaker);
- _field2652 = 0;
+ _womanDialogCount = 0;
BF_GLOBALS._player.postInit();
BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
@@ -2009,7 +2037,7 @@ void Scene340::postInit(SceneObjectList *OwnerList) {
_swExit.setDetails(15, 340, -1, -1, -1, 1);
_northExit.setDetails(16, 340, -1, -1, -1, 1);
- BF_GLOBALS._player._regionBitList = 0x10000;
+ BF_GLOBALS._player._regionBitList |= 0x10000;
BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 1341 : 129);
BF_GLOBALS._player._moveDiff = Common::Point(5, 2);
@@ -2057,18 +2085,18 @@ void Scene340::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_harrisonSpeaker);
if (BF_GLOBALS.getFlag(fBackupIn350)) {
- _field2654 = 0;
+ _backupPresent = 0;
_harrison.setVisage(1355);
_harrison.setPosition(Common::Point(289, 112));
_harrison.changeAngle(225);
_harrison.setFrame(1);
_harrison.fixPriority(75);
- BF_GLOBALS._walkRegions.proc1(23);
+ BF_GLOBALS._walkRegions.disableRegion(23);
} else if (BF_GLOBALS.getFlag(fBackupArrived340)) {
- _field2654 = 1;
+ _backupPresent = 1;
_harrison.setPosition(Common::Point(46, 154));
- BF_GLOBALS._walkRegions.proc1(19);
+ BF_GLOBALS._walkRegions.disableRegion(19);
} else if (BF_GLOBALS.getFlag(fCalledBackup) && (BF_GLOBALS._marinaWomanCtr > 0)) {
_timer1.set(900, &_harrison, &_action4);
}
@@ -2291,8 +2319,8 @@ void Scene342::postInit(SceneObjectList *OwnerList) {
loadScene(340);
setZoomPercents(126, 70, 162, 100);
- BF_GLOBALS._walkRegions.proc1(13);
- BF_GLOBALS._walkRegions.proc1(15);
+ BF_GLOBALS._walkRegions.disableRegion(13);
+ BF_GLOBALS._walkRegions.disableRegion(15);
_field1A1A = 0;
_timer1.set(2, NULL);
@@ -2360,7 +2388,7 @@ void Scene342::postInit(SceneObjectList *OwnerList) {
}
if (BF_GLOBALS.getFlag(fWithLyle)) {
- BF_GLOBALS._walkRegions.proc1(19);
+ BF_GLOBALS._walkRegions.disableRegion(19);
BF_GLOBALS._player.disableControl();
_sceneMode = 0;
@@ -2658,7 +2686,7 @@ void Scene350::postInit(SceneObjectList *OwnerList) {
_harrison.setObjectWrapper(new SceneObjectWrapper());
_harrison.animate(ANIM_MODE_1, NULL);
_harrison.changeZoom(-1);
- _harrison.setDetails(350, 12, 13, 14, 1, NULL);
+ _harrison.setDetails(350, 12, 13, 14, 1, (SceneItem *)NULL);
_harrison._moveDiff = Common::Point(2, 1);
_stripManager.addSpeaker(&_harrisonSpeaker);
@@ -2751,7 +2779,7 @@ void Scene350::signal() {
default:
if (BF_GLOBALS.getFlag(fBackupIn350)) {
_harrison.updateAngle(BF_GLOBALS._player._position);
- BF_GLOBALS._walkRegions.proc1(19);
+ BF_GLOBALS._walkRegions.disableRegion(19);
}
BF_GLOBALS._player.enableControl();
@@ -2952,8 +2980,8 @@ bool Scene355::LockerInset::startAction(CursorType action, Event &event) {
if (_frame == 1) {
SceneItem::display2(355, 23);
return true;
- }
- return true;
+ } else
+ return NamedObject::startAction(action, event);
case INV_SCREWDRIVER:
scene->_sound2.play(104);
BF_INVENTORY.setObjectScene(INV_SCREWDRIVER, 999);
@@ -3558,7 +3586,7 @@ void Scene355::postInit(SceneObjectList *OwnerList) {
_lyle.setStrip(1);
_lyle.setAction(&_action1);
_lyle._flag = BF_GLOBALS.getFlag(fTookTrailerAmmo) ? 1 : 0;
- _lyle.setDetails(355, 40, 42, 41, 1, NULL);
+ _lyle.setDetails(355, 40, 42, 41, 1, (SceneItem *)NULL);
}
if ((BF_INVENTORY.getObjectScene(INV_RAGS) == 0) && (BF_INVENTORY.getObjectScene(INV_JAR) == 0) &&
@@ -3643,7 +3671,7 @@ void Scene355::postInit(SceneObjectList *OwnerList) {
}
_item3._sceneRegionId = 18;
- _harrison.setDetails(355, 18, 20, 19, 1, NULL);
+ _harrison.setDetails(355, 18, 20, 19, 1, (SceneItem *)NULL);
_item6.setDetails(10, 355, 2, -1, 14, 1);
_item7.setDetails(11, 355, 3, -1, 15, 1);
_item8.setDetails(12, 355, 4, -1, 8, 1);
@@ -4137,7 +4165,7 @@ bool Scene360::Item1::startAction(CursorType action, Event &event) {
case CURSOR_TALK:
scene->_sceneMode = 3607;
BF_GLOBALS._player.disableControl();
- scene->_stripManager.start(3550, this);
+ scene->_stripManager.start(3550, scene);
return true;
case INV_COLT45:
SceneItem::display2(1, 4);
@@ -4246,7 +4274,7 @@ bool Scene360::Object4::startAction(CursorType action, Event &event) {
}
}
-bool Scene360::BsseballCards::startAction(CursorType action, Event &event) {
+bool Scene360::BaseballCards::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_LOOK:
if (event.mousePos.x >= (_bounds.left + _bounds.width() / 2))
@@ -4262,7 +4290,7 @@ bool Scene360::BsseballCards::startAction(CursorType action, Event &event) {
}
}
-bool Scene360::Object6::startAction(CursorType action, Event &event) {
+bool Scene360::Harrison::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(360, 6);
@@ -4319,13 +4347,12 @@ void Scene360::Action1::signal() {
/*--------------------------------------------------------------------------*/
-Scene360::Scene360() {
- _field380 = 0;
-}
-
void Scene360::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field380);
+ if (s.getVersion() < 9) {
+ int tmpVar = 0;
+ s.syncAsSint16LE(tmpVar);
+ }
}
void Scene360::postInit(SceneObjectList *OwnerList) {
@@ -4403,20 +4430,19 @@ void Scene360::postInit(SceneObjectList *OwnerList) {
BF_GLOBALS._player._moveDiff.y = 4;
BF_GLOBALS._player.enableControl();
- if (BF_GLOBALS._sceneManager._previousScene == 370) {
- BF_GLOBALS._player.setPosition(Common::Point(62, 122));
- } else {
+ if ((BF_GLOBALS._sceneManager._previousScene == 355) || (BF_GLOBALS._sceneManager._previousScene != 370)) {
+ // The original was using there a useless variable (now removed)
BF_GLOBALS._player.setPosition(Common::Point(253, 135));
BF_GLOBALS._player.setStrip(2);
if (BF_GLOBALS.getFlag(fBackupIn350)) {
- _object6.postInit();
- _object6.setVisage(BF_GLOBALS.getFlag(gunDrawn) ? 363 : 1363);
- _object6.animate(ANIM_MODE_1, NULL);
- _object6.setObjectWrapper(new SceneObjectWrapper());
- _object6.setPosition(Common::Point(235, 150));
- _object6.setStrip(2);
- BF_GLOBALS._sceneItems.push_back(&_object6);
+ _harrison.postInit();
+ _harrison.setVisage(BF_GLOBALS.getFlag(gunDrawn) ? 363 : 1363);
+ _harrison.animate(ANIM_MODE_1, NULL);
+ _harrison.setObjectWrapper(new SceneObjectWrapper());
+ _harrison.setPosition(Common::Point(235, 150));
+ _harrison.setStrip(2);
+ BF_GLOBALS._sceneItems.push_back(&_harrison);
}
_sceneMode = 3607;
@@ -4431,6 +4457,9 @@ void Scene360::postInit(SceneObjectList *OwnerList) {
_slidingDoor.setPosition(Common::Point(6, 130));
_slidingDoor.setAction(&_sequenceManager1, this, 3606, &_slidingDoor, &_object7, NULL);
}
+ } else {
+ BF_GLOBALS._player.setPosition(Common::Point(62, 122));
+ BF_GLOBALS._player.enableControl();
}
_barometer._sceneRegionId = 9;
@@ -4451,7 +4480,7 @@ void Scene360::signal() {
BF_GLOBALS.setFlag(gunDrawn);
BF_GLOBALS._deathReason = BF_GLOBALS.getFlag(fBackupIn350) ? 2 : 1;
BF_GLOBALS._player.setPosition(Common::Point(BF_GLOBALS._player._position.x - 20,
- BF_GLOBALS._player._position.y));
+ BF_GLOBALS._player._position.y + 1));
_sceneMode = 3610;
setAction(&_sequenceManager1, this, 3610, &_slidingDoor, &_object2, &BF_GLOBALS._player, NULL);
break;
@@ -4460,8 +4489,13 @@ void Scene360::signal() {
setAction(&_sequenceManager1, this, 3605, &BF_GLOBALS._player, &_slidingDoor, NULL);
break;
case 3604:
- _sceneMode = BF_GLOBALS.getFlag(fBackupIn350) ? 3603 : 3605;
- setAction(&_sequenceManager1, this, _sceneMode, &_object6, NULL);
+ if (BF_GLOBALS.getFlag(fBackupIn350)) {
+ _sceneMode = 3603;
+ setAction(&_sequenceManager1, this, _sceneMode, &_harrison, NULL);
+ } else {
+ _sceneMode = 3605;
+ setAction(&_sequenceManager1, this, _sceneMode, &BF_GLOBALS._player, &_slidingDoor, NULL);
+ }
break;
case 3605:
if (BF_GLOBALS.getFlag(fBackupIn350)) {
@@ -4475,11 +4509,17 @@ void Scene360::signal() {
break;
case 3607:
case 3609:
- _object6.setVisage(1363);
+ // Original game was only using at this place visage 1363.
+ // This workaround allow Harrison to keep his gun handy
+ // when entering the romm (if required)
+ if (! BF_GLOBALS.getFlag(gunDrawn))
+ _harrison.setVisage(1363);
+ else
+ _harrison.setVisage(363);
BF_GLOBALS._player.enableControl();
break;
case 3608:
- BF_GLOBALS._sceneManager.changeScene(355);
+ BF_GLOBALS._sceneManager.changeScene(355);
break;
case 3610:
BF_GLOBALS._sceneManager.changeScene(666);
@@ -4523,7 +4563,7 @@ void Scene360::process(Event &event) {
BF_GLOBALS._player.setFrame(BF_GLOBALS._player.getFrameCount());
BF_GLOBALS._player.animate(ANIM_MODE_6, this);
- _object6.setVisage(1363);
+ _harrison.setVisage(1363);
}
} else {
// Handle drawing gun
@@ -4538,7 +4578,7 @@ void Scene360::process(Event &event) {
BF_GLOBALS.setFlag(gunDrawn);
_sceneMode = 9998;
- _object6.setVisage(363);
+ _harrison.setVisage(363);
}
event.handled = true;
@@ -4587,7 +4627,7 @@ bool Scene370::GreensGun::startAction(CursorType action, Event &event) {
case CURSOR_USE:
if ((BF_INVENTORY.getObjectScene(INV_HANDCUFFS) != 1) || BF_GLOBALS.getFlag(greenTaken)) {
BF_GLOBALS._player.disableControl();
- BF_GLOBALS._walkRegions.proc2(3);
+ BF_GLOBALS._walkRegions.enableRegion(3);
scene->_sceneMode = 3711;
scene->setAction(&scene->_sequenceManager, scene, 3711, &BF_GLOBALS._player, this, NULL);
} else {
@@ -4616,7 +4656,7 @@ bool Scene370::Green::startAction(CursorType action, Event &event) {
scene->_stripManager.start(3717, scene);
} else {
BF_GLOBALS._player.disableControl();
- BF_GLOBALS._walkRegions.proc2(3);
+ BF_GLOBALS._walkRegions.enableRegion(3);
scene->_sceneMode = 3715;
scene->setAction(&scene->_sequenceManager, scene, 3715, &BF_GLOBALS._player, this, NULL);
}
@@ -4751,37 +4791,36 @@ bool Scene370::Laura::startAction(CursorType action, Event &event) {
bool Scene370::Item1::startAction(CursorType action, Event &event) {
Scene370 *scene = (Scene370 *)BF_GLOBALS._sceneManager._scene;
- switch (action) {
- case CURSOR_LOOK:
+ if (action == CURSOR_LOOK) {
SceneItem::display2(370, 15);
return true;
- case CURSOR_USE:
+ } else if (action == CURSOR_USE) {
SceneItem::display2(370, 16);
return true;
- case INV_COLT45:
+ } else if (action == INV_COLT45) {
if (BF_GLOBALS._sceneObjects->contains(&scene->_green) && (BF_INVENTORY.getObjectScene(INV_GREENS_GUN) != 370)) {
scene->_green.setAction(NULL);
scene->_sceneMode = 3703;
scene->setAction(&scene->_sequenceManager, scene, 3703, &BF_GLOBALS._player, &scene->_green, &scene->_harrison, NULL);
return true;
}
- // Deliberate fall-through
- default:
+ return false;
+ } else if (action < CURSOR_WALK) // If any other inventory item used
+ return false;
+ else // If any other action is used
return NamedHotspot::startAction(action, event);
- }
}
bool Scene370::Item6::startAction(CursorType action, Event &event) {
Scene370 *scene = (Scene370 *)BF_GLOBALS._sceneManager._scene;
- switch (action) {
- case CURSOR_LOOK:
+ if (action == CURSOR_LOOK) {
SceneItem::display2(370, 14);
return true;
- case CURSOR_USE:
+ } else if (action == CURSOR_USE) {
SceneItem::display2(370, 29);
return true;
- case INV_COLT45:
+ } else if (action == INV_COLT45) {
if (BF_GLOBALS._sceneObjects->contains(&scene->_green) && (BF_INVENTORY.getObjectScene(INV_GREENS_GUN) != 370) &&
(BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 1)) {
BF_GLOBALS._player.disableControl();
@@ -4790,10 +4829,11 @@ bool Scene370::Item6::startAction(CursorType action, Event &event) {
scene->setAction(&scene->_sequenceManager, scene, 3703, &BF_GLOBALS._player, &scene->_green, &scene->_harrison, NULL);
return true;
}
- // Deliberate fall-through
- default:
return SceneHotspot::startAction(action, event);
- }
+ } else if (action < CURSOR_WALK) // If any other inventory item used
+ return false;
+ else // If any other action
+ return SceneHotspot::startAction(action, event);
}
@@ -4904,7 +4944,7 @@ void Scene370::signal() {
case 3:
break;
case 3707:
- _object5.setDetails(370, 6, -1, 7, 1, NULL);
+ _object5.setDetails(370, 6, -1, 7, 1, (SceneItem *)NULL);
BF_GLOBALS._sceneItems.push_back(&_object5);
// Deliberate fall-through
case 3700:
@@ -4936,7 +4976,7 @@ void Scene370::signal() {
BF_GLOBALS._player.setStrip(3);
BF_GLOBALS._sceneItems.push_front(&_laura);
- BF_GLOBALS._walkRegions.proc1(3);
+ BF_GLOBALS._walkRegions.disableRegion(3);
_harrison.setAction(NULL);
BF_GLOBALS._player.enableControl();
@@ -4946,8 +4986,8 @@ void Scene370::signal() {
break;
case 3705:
_laura.remove();
- BF_GLOBALS._walkRegions.proc2(6);
- BF_GLOBALS._walkRegions.proc2(1);
+ BF_GLOBALS._walkRegions.enableRegion(6);
+ BF_GLOBALS._walkRegions.enableRegion(1);
BF_GLOBALS._player.enableControl();
break;
case 3708:
@@ -4963,8 +5003,8 @@ void Scene370::signal() {
_sceneMode = 0;
_object5.remove();
_green.setAction(NULL);
- BF_GLOBALS._walkRegions.proc1(6);
- BF_GLOBALS._walkRegions.proc1(1);
+ BF_GLOBALS._walkRegions.disableRegion(6);
+ BF_GLOBALS._walkRegions.disableRegion(1);
break;
case 3709:
BF_GLOBALS._player.disableControl();
@@ -4978,7 +5018,7 @@ void Scene370::signal() {
_green.setAction(&_sequenceManager, this, 3701, NULL);
break;
case 3711:
- BF_GLOBALS._walkRegions.proc1(3);
+ BF_GLOBALS._walkRegions.disableRegion(3);
BF_INVENTORY.setObjectScene(INV_GREENS_GUN, 1);
T2_GLOBALS._uiElements.addScore(30);
_greensGun.remove();
@@ -5001,7 +5041,7 @@ void Scene370::signal() {
T2_GLOBALS._uiElements.addScore(50);
BF_INVENTORY.setObjectScene(INV_GREEN_ID, 1);
BF_INVENTORY.setObjectScene(INV_GREENS_KNIFE, 1);
- BF_GLOBALS._walkRegions.proc1(3);
+ BF_GLOBALS._walkRegions.disableRegion(3);
BF_GLOBALS._player.enableControl();
break;
case 3716:
@@ -5092,13 +5132,13 @@ void Scene380::postInit(SceneObjectList *OwnerList) {
setZoomPercents(68, 80, 131, 100);
BF_GLOBALS._sound1.fadeSound(33);
- BF_GLOBALS._walkRegions.proc1(9);
+ BF_GLOBALS._walkRegions.disableRegion(9);
_door.postInit();
_door.setVisage(380);
_door.setStrip(4);
_door.setPosition(Common::Point(132, 66));
- _door.setDetails(380, 12, 13, -1, 1, NULL);
+ _door.setDetails(380, 12, 13, -1, 1, (SceneItem *)NULL);
BF_GLOBALS._player.postInit();
BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
@@ -5113,27 +5153,27 @@ void Scene380::postInit(SceneObjectList *OwnerList) {
// Show vechile as car
_vechile.setStrip(3);
_vechile.setPosition(Common::Point(273, 125));
- _vechile.setDetails(580, 2, 3, -1, 1, NULL);
+ _vechile.setDetails(580, 2, 3, -1, 1, (SceneItem *)NULL);
BF_GLOBALS._player.setVisage(129);
- BF_GLOBALS._walkRegions.proc1(12);
- BF_GLOBALS._walkRegions.proc1(18);
- BF_GLOBALS._walkRegions.proc1(19);
- BF_GLOBALS._walkRegions.proc1(20);
- BF_GLOBALS._walkRegions.proc1(25);
- BF_GLOBALS._walkRegions.proc1(26);
- BF_GLOBALS._walkRegions.proc1(27);
+ BF_GLOBALS._walkRegions.disableRegion(12);
+ BF_GLOBALS._walkRegions.disableRegion(18);
+ BF_GLOBALS._walkRegions.disableRegion(19);
+ BF_GLOBALS._walkRegions.disableRegion(20);
+ BF_GLOBALS._walkRegions.disableRegion(25);
+ BF_GLOBALS._walkRegions.disableRegion(26);
+ BF_GLOBALS._walkRegions.disableRegion(27);
} else if (BF_GLOBALS.getFlag(onDuty)) {
// Show on duty motorcycle
_vechile.setStrip(2);
- _vechile.setDetails(300, 11, 13, -1, 1, NULL);
+ _vechile.setDetails(300, 11, 13, -1, 1, (SceneItem *)NULL);
_vechile.setPosition(Common::Point(252, 115));
BF_GLOBALS._player.setVisage(1341);
} else {
// Show off duty motorcycle
_vechile.setStrip(1);
- _vechile.setDetails(580, 0, 1, -1, 1, NULL);
+ _vechile.setDetails(580, 0, 1, -1, 1, (SceneItem *)NULL);
_vechile.setPosition(Common::Point(249, 110));
BF_GLOBALS._player.setVisage(129);
@@ -5272,7 +5312,7 @@ bool Scene385::Door::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE:
- BF_GLOBALS._walkRegions.proc2(6);
+ BF_GLOBALS._walkRegions.enableRegion(6);
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 3850;
scene->setAction(&scene->_sequenceManager, scene, 3850, &BF_GLOBALS._player, this, NULL);
@@ -5285,8 +5325,7 @@ bool Scene385::Door::startAction(CursorType action, Event &event) {
bool Scene385::Jim::startAction(CursorType action, Event &event) {
Scene385 *scene = (Scene385 *)BF_GLOBALS._sceneManager._scene;
- switch (action) {
- case CURSOR_TALK:
+ if (action == CURSOR_TALK) {
if (scene->_jimFlag) {
scene->_talkAction = 3867;
scene->setAction(&scene->_action1);
@@ -5310,24 +5349,24 @@ bool Scene385::Jim::startAction(CursorType action, Event &event) {
break;
}
- scene->_jimFlag = 1;
+ scene->_jimFlag = true;
scene->setAction(&scene->_action1);
}
return true;
- case INV_PRINT_OUT:
+ } else if (action == INV_PRINT_OUT) {
if (!BF_GLOBALS.getFlag(fGotPointsForMCard)) {
T2_GLOBALS._uiElements.addScore(30);
- BF_GLOBALS.getFlag(fGotPointsForMCard);
+ BF_GLOBALS.setFlag(fGotPointsForMCard);
scene->setAction(&scene->_action2);
return true;
- }
- break;
- default:
- break;
- }
-
- return NamedObject::startAction(action, event);
+ } else
+ return false;
+ } else if (action < CURSOR_WALK)
+ // Any other inventory item
+ return false;
+ else
+ return NamedObject::startAction(action, event);
}
bool Scene385::Dezi::startAction(CursorType action, Event &event) {
@@ -5398,7 +5437,8 @@ bool Scene385::Exit::startAction(CursorType action, Event &event) {
Scene385::Scene385(): SceneExt() {
- _talkAction = _jimFlag = 0;
+ _talkAction = 0;
+ _jimFlag = false;
}
void Scene385::synchronize(Serializer &s) {
@@ -5439,21 +5479,21 @@ void Scene385::postInit(SceneObjectList *OwnerList) {
_jim.setVisage(385);
_jim.setStrip(3);
_jim.setPosition(Common::Point(304, 113));
- _jim.setDetails(385, 1, -1, 2, 1, NULL);
+ _jim.setDetails(385, 1, -1, 2, 1, (SceneItem *)NULL);
_dezi.postInit();
_dezi.setVisage(385);
_dezi.setStrip(2);
_dezi.setPosition(Common::Point(235, 93));
_dezi.fixPriority(120);
- _dezi.setDetails(385, 3, -1, 2, 1, NULL);
+ _dezi.setDetails(385, 3, -1, 2, 1, (SceneItem *)NULL);
_door.postInit();
_door.setVisage(385);
_door.setPosition(Common::Point(107, 27));
- _door.setDetails(385, 0, -1, -1, 1, NULL);
+ _door.setDetails(385, 0, -1, -1, 1, (SceneItem *)NULL);
- BF_GLOBALS._walkRegions.proc1(6);
+ BF_GLOBALS._walkRegions.disableRegion(6);
if (BF_GLOBALS._sceneManager._previousScene == 390) {
BF_GLOBALS._player.setPosition(Common::Point(109, 119));
@@ -5835,13 +5875,13 @@ void Scene390::postInit(TsAGE::SceneObjectList *OwnerList) {
_object2.setPosition(Common::Point(38, 84));
_object2.fixPriority(50);
_object2._flag = 0;
- _object2.setDetails(390, 10, 17, 10, 1, NULL);
+ _object2.setDetails(390, 10, 17, 10, 1, (SceneItem *)NULL);
_door.postInit();
_door.setVisage(390);
_door.setStrip(2);
_door.setPosition(Common::Point(151, 18));
- _door.setDetails(390, 5, -1, -1, 1, NULL);
+ _door.setDetails(390, 5, -1, -1, 1, (SceneItem *)NULL);
BF_GLOBALS._player.disableControl();
_sceneMode = 3901;
@@ -5852,7 +5892,7 @@ void Scene390::postInit(TsAGE::SceneObjectList *OwnerList) {
_green.setVisage(392);
_green.setPosition(Common::Point(241, 164));
_green.fixPriority(153);
- _green.setDetails(390, 12, -1, 13, 1, NULL);
+ _green.setDetails(390, 12, -1, 13, 1, (SceneItem *)NULL);
_green._flag = 0;
}
@@ -5862,7 +5902,7 @@ void Scene390::postInit(TsAGE::SceneObjectList *OwnerList) {
_gangMember1.setPosition(Common::Point(273, 169));
_gangMember1.fixPriority(152);
_gangMember1._flag = 0;
- _gangMember1.setDetails(390, 19, -1, 20, 1, NULL);
+ _gangMember1.setDetails(390, 19, -1, 20, 1, (SceneItem *)NULL);
_gangMember2.postInit();
_gangMember2.setVisage(396);
@@ -5870,7 +5910,7 @@ void Scene390::postInit(TsAGE::SceneObjectList *OwnerList) {
_gangMember2.setPosition(Common::Point(241, 153));
_gangMember2.fixPriority(152);
_gangMember2._flag = 0;
- _gangMember2.setDetails(390, 19, -1, 20, 1, NULL);
+ _gangMember2.setDetails(390, 19, -1, 20, 1, (SceneItem *)NULL);
}
_item1.setDetails(Rect(22, 40, 77, 67), 390, 0, -1, 1, 1, NULL);
@@ -5904,7 +5944,7 @@ void Scene390::signal() {
_object3.setVisage(390);
_object3.setPosition(Common::Point(250, 60));
_object3.fixPriority(255);
- _object3.setDetails(390, 8, -1, 9, 2, NULL);
+ _object3.setDetails(390, 8, -1, 9, 2, (SceneItem *)NULL);
BF_GLOBALS._player.enableControl();
break;
diff --git a/engines/tsage/blue_force/blueforce_scenes3.h b/engines/tsage/blue_force/blueforce_scenes3.h
index 2982fd3306..ea9d5f7311 100644
--- a/engines/tsage/blue_force/blueforce_scenes3.h
+++ b/engines/tsage/blue_force/blueforce_scenes3.h
@@ -94,7 +94,7 @@ class Scene300: public SceneExt {
virtual void signal();
};
private:
- void setup();
+ void setupInspection();
public:
SequenceManager _sequenceManager1, _sequenceManager2;
SequenceManager _sequenceManager3, _sequenceManager4;
@@ -213,9 +213,9 @@ public:
int _field1390;
int _stripNumber;
int _field1398;
- int _field1B60, _field1B62, _field1B64;
- int _field1B66, _field1B6C, _field139C;
- bool _field1B68, _field1B6A;
+ int _invGreenCount, _bookGreenCount, _invGangCount;
+ int _bookGangCount, _field1B6C, _field139C;
+ bool _field1B68, _doorOpened;
CursorType _currentCursor;
Scene315();
@@ -363,7 +363,7 @@ public:
ASoundExt _sound1, _sound2;
TimerExt _timer1;
Timer2 _timer2;
- int _seqNumber1, _field2652, _field2654;
+ int _seqNumber1, _womanDialogCount, _backupPresent;
Scene340();
virtual void synchronize(Serializer &s);
@@ -621,11 +621,11 @@ class Scene360: public SceneExt {
public:
virtual bool startAction(CursorType action, Event &event);
};
- class BsseballCards: public NamedObject {
+ class BaseballCards: public NamedObject {
public:
virtual bool startAction(CursorType action, Event &event);
};
- class Object6: public NamedObject {
+ class Harrison: public NamedObject {
public:
virtual bool startAction(CursorType action, Event &event);
};
@@ -667,8 +667,8 @@ public:
SceneObject _object2;
Window _window;
Object4 _object4;
- BsseballCards _baseballCards;
- Object6 _object6;
+ BaseballCards _baseballCards;
+ Harrison _harrison;
Object7 _object7;
Item1 _item1;
Item2 _item2;
@@ -676,9 +676,7 @@ public:
Barometer _barometer;
Action1 _action1;
ASound _sound1;
- int _field380;
- Scene360();
virtual void synchronize(Serializer &s);
virtual void postInit(SceneObjectList *OwnerList = NULL);
virtual void signal();
@@ -815,7 +813,8 @@ public:
SpeakerJake385 _jake385Speaker;
NamedHotspot _item1, _item2, _item3, _item4, _item5;
Exit _exit;
- int _talkAction, _jimFlag;
+ int _talkAction;
+ bool _jimFlag;
Scene385();
virtual void synchronize(Serializer &s);
diff --git a/engines/tsage/blue_force/blueforce_scenes4.cpp b/engines/tsage/blue_force/blueforce_scenes4.cpp
index 814a2fff7f..a10f311791 100644
--- a/engines/tsage/blue_force/blueforce_scenes4.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes4.cpp
@@ -35,6 +35,7 @@ namespace BlueForce {
*
*--------------------------------------------------------------------------*/
+// Talk to driver with backup
void Scene410::Action1::signal() {
Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
@@ -62,6 +63,7 @@ void Scene410::Action1::signal() {
}
}
+// Talk to passenger with backup
void Scene410::Action2::signal() {
Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
BF_GLOBALS._player.disableControl();
@@ -98,6 +100,7 @@ void Scene410::Action2::signal() {
}
}
+// Talk to passenger without backup
void Scene410::Action3::signal() {
Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup)) {
@@ -111,36 +114,23 @@ void Scene410::Action3::signal() {
}
}
+// Talk to driver without backup
void Scene410::Action4::signal() {
Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
- switch (_actionIndex++) {
- case 0:
- if (scene->_field1FC4 == 0) {
- ADD_PLAYER_MOVER(114, 133);
- } else {
- ADD_PLAYER_MOVER(195, 139);
- }
- break;
- case 1:
- BF_GLOBALS._player.updateAngle(scene->_passenger._position);
- setDelay(3);
- break;
- case 2:
- setDelay(3);
- break;
- case 3:
- if (BF_GLOBALS.getFlag(fCalledBackup))
- scene->setAction(&scene->_action2);
- else
- scene->setAction(&scene->_action3);
- remove();
- break;
- default:
- break;
+ if (BF_GLOBALS.getFlag(fTalkedDriverNoBkup)) {
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2;
+ scene->setAction(&scene->_sequenceManager1, scene, 4120, &scene->_passenger, &BF_GLOBALS._player, NULL);
+ } else {
+ BF_GLOBALS._player.disableControl();
+ BF_GLOBALS.setFlag(fTalkedDriverNoBkup);
+ scene->_sceneMode = 4101;
+ scene->_stripManager.start(4103, scene);
}
}
+// Talk to passenger
void Scene410::Action5::signal() {
Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
@@ -171,6 +161,7 @@ void Scene410::Action5::signal() {
}
}
+// Talk to driver
void Scene410::Action6::signal() {
Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
@@ -222,7 +213,7 @@ void Scene410::Action7::signal() {
case 3:
BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
BF_GLOBALS._player.updateAngle(Common::Point(100, 170));
- scene->setAction(&scene->_sequenceManager1, this, 4112, &scene->_driver, &scene->_passenger,
+ setAction(&scene->_sequenceManager1, this, 4112, &scene->_driver, &scene->_passenger,
&scene->_harrison, NULL);
break;
case 5:
@@ -380,21 +371,27 @@ bool Scene410::Passenger::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE:
if (!BF_GLOBALS.getFlag(fCalledBackup)) {
- if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup)) {
+ if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup))
scene->setAction(&scene->_action3);
- } else {
- SceneItem::display2(410, 5);
- }
+ else
+ SceneItem::display(410, 5, SET_WIDTH, 300,
+ SET_X, 10 + GLOBALS._sceneManager._scene->_sceneBounds.left,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 96, SET_EXT_BGCOLOR, 99,
+ SET_EXT_FGCOLOR, 13, LIST_END);
} else if (!scene->_field1FBA) {
- SceneItem::display2(410, 5);
+ SceneItem::display(410, 5, SET_WIDTH, 300,
+ SET_X, 10 + GLOBALS._sceneManager._scene->_sceneBounds.left,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 96, SET_EXT_BGCOLOR, 99,
+ SET_EXT_FGCOLOR, 13, LIST_END);
} else if (!scene->_field1FBE) {
scene->_sceneMode = 4121;
scene->_field1FBE = 1;
T2_GLOBALS._uiElements.addScore(50);
scene->signal();
- } else {
+ } else
break;
- }
return true;
case CURSOR_TALK:
scene->setAction(&scene->_action5);
@@ -452,7 +449,11 @@ bool Scene410::Harrison::startAction(CursorType action, Event &event) {
PlayerMover *mover = new PlayerMover();
BF_GLOBALS._player.addMover(mover, &destPos, scene);
} else {
- SceneItem::display2(350, 13);
+ SceneItem::display(350, 13, SET_WIDTH, 300,
+ SET_X, 10 + GLOBALS._sceneManager._scene->_sceneBounds.left,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 32, SET_EXT_BGCOLOR, 49,
+ SET_EXT_FGCOLOR, 13, LIST_END);
}
} else if ((scene->_field1FBA != 0) && (scene->_field1FBC != 0)) {
BF_GLOBALS._player.disableControl();
@@ -463,15 +464,16 @@ bool Scene410::Harrison::startAction(CursorType action, Event &event) {
BF_GLOBALS.clearFlag(f1098Marina);
} else if ((BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 1) ||
(!scene->_field1FBA && (scene->_talkCount < 5))) {
- SceneItem::display2(350, 13);
+ SceneItem::display(350, 13, SET_WIDTH, 300,
+ SET_X, 10 + GLOBALS._sceneManager._scene->_sceneBounds.left,
+ SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
+ SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 32, SET_EXT_BGCOLOR, 49,
+ SET_EXT_FGCOLOR, 13, LIST_END);
} else if (!scene->_field1FBA) {
- if (scene->_field1FBA)
- error("Error - want to cuff shooter, but he's cuffed already");
-
BF_GLOBALS._player.disableControl();
scene->_field1FBA = 1;
scene->_field1FBE = 1;
- BF_GLOBALS._walkRegions.proc2(22);
+ BF_GLOBALS._walkRegions.enableRegion(22);
scene->_sceneMode = 4122;
scene->_stripManager.start(4112, scene);
} else if (scene->_field1FB6 < 1) {
@@ -482,7 +484,7 @@ bool Scene410::Harrison::startAction(CursorType action, Event &event) {
BF_GLOBALS._player.disableControl();
scene->_field1FBC = 1;
scene->_field1FC0 = 1;
- BF_GLOBALS._walkRegions.proc2(22);
+ BF_GLOBALS._walkRegions.enableRegion(22);
scene->_sceneMode = 4109;
scene->_stripManager.start(4112, scene);
}
@@ -545,13 +547,13 @@ void Scene410::postInit(SceneObjectList *OwnerList) {
_passenger.setVisage(415);
_passenger.setStrip(1);
_passenger.setPosition(Common::Point(278, 92));
- _passenger.setDetails(410, 4, -1, 5, 1, NULL);
+ _passenger.setDetails(410, 4, -1, 5, 1, (SceneItem *)NULL);
_driver.postInit();
_driver.setVisage(416);
_driver.setStrip(2);
_driver.setPosition(Common::Point(244, 85));
- _driver.setDetails(410, 6, -1, 7, 1, NULL);
+ _driver.setDetails(410, 6, -1, 7, 1, (SceneItem *)NULL);
_driver.changeZoom(-1);
_object5.postInit();
@@ -574,20 +576,20 @@ void Scene410::postInit(SceneObjectList *OwnerList) {
_passenger.remove();
_driver.remove();
- BF_GLOBALS._walkRegions.proc1(21);
- BF_GLOBALS._walkRegions.proc1(22);
+ BF_GLOBALS._walkRegions.disableRegion(21);
+ BF_GLOBALS._walkRegions.disableRegion(22);
_harrison.postInit();
_harrison.setVisage(343);
_harrison.setObjectWrapper(new SceneObjectWrapper());
_harrison.animate(ANIM_MODE_1, NULL);
- _harrison.setDetails(350, 12, 13, 14, 1, NULL);
+ _harrison.setDetails(350, 12, 13, 14, 1, (SceneItem *)NULL);
_harrison.setPosition(Common::Point(97, 185));
_harrison.changeZoom(-1);
_patrolCar.postInit();
_patrolCar.setVisage(410);
- _patrolCar.setDetails(410, 8, 9, 10, 1, NULL);
+ _patrolCar.setDetails(410, 8, 9, 10, 1, (SceneItem *)NULL);
_patrolCar.fixPriority(148);
_patrolCar.setPosition(Common::Point(39, 168));
@@ -621,24 +623,24 @@ void Scene410::postInit(SceneObjectList *OwnerList) {
_passenger.setFrame(8);
}
- BF_GLOBALS._walkRegions.proc1(16);
+ BF_GLOBALS._walkRegions.disableRegion(16);
if (BF_GLOBALS.getFlag(fDriverOutOfTruck)) {
_driver.setVisage(417);
_driver.setStrip(1);
_driver.setPosition(Common::Point(152, 97));
- BF_GLOBALS._walkRegions.proc1(7);
+ BF_GLOBALS._walkRegions.disableRegion(7);
}
if (BF_GLOBALS.getFlag(fCalledBackup)) {
- BF_GLOBALS._walkRegions.proc1(21);
- BF_GLOBALS._walkRegions.proc1(22);
+ BF_GLOBALS._walkRegions.disableRegion(21);
+ BF_GLOBALS._walkRegions.disableRegion(22);
_harrison.postInit();
_harrison.setVisage(343);
_harrison.setObjectWrapper(new SceneObjectWrapper());
_harrison.animate(ANIM_MODE_1, NULL);
- _harrison.setDetails(350, 12, 13, 14, 1, NULL);
+ _harrison.setDetails(350, 12, 13, 14, 1, (SceneItem *)NULL);
BF_GLOBALS._sceneItems.addBefore(&_driver, &_harrison);
_harrison.setPosition(Common::Point(-10, 124));
@@ -646,7 +648,7 @@ void Scene410::postInit(SceneObjectList *OwnerList) {
_patrolCar.postInit();
_patrolCar.setVisage(410);
- _patrolCar.setDetails(410, 8, 9, 10, 1, NULL);
+ _patrolCar.setDetails(410, 8, 9, 10, 1, (SceneItem *)NULL);
_patrolCar.fixPriority(148);
if (_field1FC4) {
@@ -715,10 +717,11 @@ void Scene410::signal() {
break;
case 7:
BF_INVENTORY.setObjectScene(INV_TYRONE_ID, 1);
+ _sceneMode = 0;
signal();
break;
case 8:
- BF_GLOBALS._walkRegions.proc2(22);
+ BF_GLOBALS._walkRegions.enableRegion(22);
BF_GLOBALS._player.changeAngle(225);
_harrison.changeAngle(45);
_sceneMode = 4114;
@@ -739,7 +742,7 @@ void Scene410::signal() {
BF_GLOBALS._player.disableControl();
_sceneMode = 0;
setAction(&_sequenceManager1, this, 4100, &_passenger, &_object5, NULL);
- BF_GLOBALS._walkRegions.proc1(16);
+ BF_GLOBALS._walkRegions.disableRegion(16);
break;
case 4101:
// Driver gets out of the car
@@ -747,7 +750,7 @@ void Scene410::signal() {
_sceneMode = 0;
setAction(&_sequenceManager1, this, 4101, &_driver, &_object6, NULL);
BF_GLOBALS.setFlag(fDriverOutOfTruck);
- BF_GLOBALS._walkRegions.proc1(7);
+ BF_GLOBALS._walkRegions.disableRegion(7);
break;
case 4103:
// Click on moto to ask for backup
@@ -781,19 +784,21 @@ void Scene410::signal() {
case 4108:
BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
BF_GLOBALS._player.updateAngle(Common::Point(100, 170));
- BF_GLOBALS._walkRegions.proc2(22);
- BF_GLOBALS._walkRegions.proc2(16);
+ BF_GLOBALS._walkRegions.enableRegion(22);
+ BF_GLOBALS._walkRegions.enableRegion(7);
+ BF_GLOBALS._walkRegions.enableRegion(16);
BF_GLOBALS._player.disableControl();
_sceneMode = 0;
setAction(&_sequenceManager1, this, 4108, &_harrison, NULL);
break;
case 4109:
+ // Harrison puts handcuffs to driver
if ((BF_GLOBALS._player._position.x > 116) && (BF_GLOBALS._player._position.x != 195) &&
(BF_GLOBALS._player._position.y != 139)) {
- ADD_PLAYER_MOVER(195, 139);
+ ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 195, 139);
}
- BF_GLOBALS._walkRegions.proc2(22);
+ BF_GLOBALS._walkRegions.enableRegion(22);
BF_GLOBALS._player.disableControl();
_sceneMode = 0;
setAction(&_sequenceManager1, this, 4109, &_driver, &_harrison, NULL);
@@ -813,14 +818,14 @@ void Scene410::signal() {
setAction(&_sequenceManager1, this, 4112, &_driver, &_passenger, &_harrison, NULL);
break;
case 4114:
- BF_GLOBALS._walkRegions.proc2(22);
+ BF_GLOBALS._walkRegions.enableRegion(22);
BF_GLOBALS._player.disableControl();
_sceneMode = 4116;
setAction(&_sequenceManager1, this, 4114, &_harrison, &_patrolCar, NULL);
break;
case 4116:
- BF_GLOBALS._walkRegions.proc2(21);
- BF_GLOBALS._walkRegions.proc2(22);
+ BF_GLOBALS._walkRegions.enableRegion(21);
+ BF_GLOBALS._walkRegions.enableRegion(22);
_harrison.remove();
BF_GLOBALS._player.disableControl();
_sceneMode = 0;
@@ -842,7 +847,7 @@ void Scene410::signal() {
setAction(&_sequenceManager1, this, 4121, &BF_GLOBALS._player, &_passenger, NULL);
break;
case 4122:
- BF_GLOBALS._walkRegions.proc2(22);
+ BF_GLOBALS._walkRegions.enableRegion(22);
BF_INVENTORY.setObjectScene(INV_22_SNUB, 0);
BF_GLOBALS._player.disableControl();
_sceneMode = 0;
@@ -923,6 +928,17 @@ bool Scene415::GunInset::startAction(CursorType action, Event &event) {
}
}
+void Scene415::GunInset::remove() {
+ Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene;
+
+ BF_GLOBALS._player.disableControl();
+ scene->_gunAndWig.remove();
+ FocusObject::remove();
+
+ scene->_sceneMode = 0;
+ scene->_animatedSeat.animate(ANIM_MODE_6, scene);
+}
+
bool Scene415::GunAndWig::startAction(CursorType action, Event &event) {
Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene;
@@ -937,14 +953,14 @@ bool Scene415::GunAndWig::startAction(CursorType action, Event &event) {
remove();
return true;
case INV_FOREST_RAP:
- if (scene->_fieldE14)
+ if (scene->_scoreWigRapFlag)
break;
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 0;
scene->_stripManager.start(4126, scene);
T2_GLOBALS._uiElements.addScore(50);
- scene->_fieldE14 = true;
+ scene->_scoreWigRapFlag = true;
return true;
default:
break;
@@ -957,7 +973,7 @@ bool Scene415::BulletsInset::startAction(CursorType action, Event &event) {
Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene;
if (action == CURSOR_USE) {
- if (BF_GLOBALS.getFlag(fGotAutoWeapon)) {
+ if (BF_GLOBALS.getFlag(fGotBulletsFromDash)) {
FocusObject::startAction(action, event);
} else {
remove();
@@ -969,6 +985,13 @@ bool Scene415::BulletsInset::startAction(CursorType action, Event &event) {
}
}
+void Scene415::BulletsInset::remove() {
+ Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene;
+
+ scene->_theBullets.remove();
+ FocusObject::remove();
+}
+
bool Scene415::DashDrawer::startAction(CursorType action, Event &event) {
Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene;
@@ -994,17 +1017,16 @@ bool Scene415::TheBullets::startAction(CursorType action, Event &event) {
scene->_dashDrawer.remove();
return true;
case INV_FOREST_RAP:
- if (scene->_fieldE16) {
+ if (scene->_scoreBulletRapFlag) {
SceneItem::display2(415, 35);
- return true;
} else {
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 0;
scene->_stripManager.start(4122, scene);
T2_GLOBALS._uiElements.addScore(50);
- scene->_fieldE16 = true;
+ scene->_scoreBulletRapFlag = true;
}
- break;
+ return true;
default:
break;
}
@@ -1024,7 +1046,7 @@ bool Scene415::Lever::startAction(CursorType action, Event &event) {
} else {
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 2;
- scene->setAction(&scene->_sequenceManager, scene, 4150, &scene->_object6, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 4150, &scene->_animatedSeat, NULL);
}
return true;
default:
@@ -1035,13 +1057,13 @@ bool Scene415::Lever::startAction(CursorType action, Event &event) {
/*--------------------------------------------------------------------------*/
Scene415::Scene415(): SceneExt() {
- _fieldE14 = _fieldE16 = false;
+ _scoreWigRapFlag = _scoreBulletRapFlag = false;
}
void Scene415::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_fieldE14);
- s.syncAsSint16LE(_fieldE16);
+ s.syncAsSint16LE(_scoreWigRapFlag);
+ s.syncAsSint16LE(_scoreBulletRapFlag);
}
void Scene415::postInit(SceneObjectList *OwnerList) {
@@ -1054,14 +1076,14 @@ void Scene415::postInit(SceneObjectList *OwnerList) {
_dashDrawer.setVisage(411);
_dashDrawer.setStrip(3);
_dashDrawer.setPosition(Common::Point(151, 97));
- _dashDrawer.setDetails(415, 22, -1, -1, 1, NULL);
+ _dashDrawer.setDetails(415, 22, -1, -1, 1, (SceneItem *)NULL);
+
+ _animatedSeat.postInit();
+ _animatedSeat.setVisage(419);
+ _animatedSeat.setStrip(1);
+ _animatedSeat.setPosition(Common::Point(306, 116));
+ _animatedSeat.fixPriority(80);
- _object6.postInit();
- _object6.setVisage(419);
- _object6.setStrip(1);
- _object6.setPosition(Common::Point(306, 116));
- _object6.fixPriority(80);
-
_windowLever.setDetails(16, 415, 25, -1, 26, 1);
_item7.setDetails(17, 415, 32, -1, 33, 1);
_seatBelt.setDetails(14, 415, 29, -1, 30, 1);
@@ -1118,7 +1140,7 @@ void Scene415::showBullets() {
_theBullets.setFrame(2);
_theBullets.setPosition(Common::Point(184, 86));
_theBullets.fixPriority(105);
- _theBullets.setDetails(415, 16, 17, 18, 1, NULL);
+ _theBullets.setDetails(415, 16, 17, 18, 1, (SceneItem *)NULL);
BF_GLOBALS._sceneItems.remove(&_theBullets);
BF_GLOBALS._sceneItems.push_front(&_theBullets);
}
@@ -1136,7 +1158,7 @@ void Scene415::showGunAndWig() {
_gunAndWig.setFrame(2);
_gunAndWig.setPosition(Common::Point(159, 88));
_gunAndWig.fixPriority(105);
- _gunAndWig.setDetails(415, 13, 14, 15, 1, NULL);
+ _gunAndWig.setDetails(415, 13, 14, 15, 1, (SceneItem *)NULL);
BF_GLOBALS._sceneItems.remove(&_gunAndWig);
BF_GLOBALS._sceneItems.push_front(&_gunAndWig);
@@ -1249,12 +1271,12 @@ void Scene440::postInit(SceneObjectList *OwnerList) {
BF_GLOBALS._player.setVisage(303);
BF_GLOBALS._player.setPosition(Common::Point(187, 104));
-
+
_lyle.setPosition(Common::Point(135, 128));
_lyle.show();
- BF_GLOBALS._walkRegions.proc1(12);
- BF_GLOBALS._walkRegions.proc1(13);
+ BF_GLOBALS._walkRegions.disableRegion(12);
+ BF_GLOBALS._walkRegions.disableRegion(13);
} else {
_vechile.setPosition(Common::Point(169, 121));
_vechile.fixPriority(117);
@@ -1269,13 +1291,13 @@ void Scene440::postInit(SceneObjectList *OwnerList) {
_vechile.setVisage(580);
_vechile.setStrip(2);
_vechile.setFrame(3);
-
+
BF_GLOBALS._player.setVisage(303);
}
}
BF_GLOBALS._sceneItems.push_back(&_vechile);
- BF_GLOBALS._walkRegions.proc1(11);
+ BF_GLOBALS._walkRegions.disableRegion(11);
_doorway.postInit();
_doorway.setVisage(440);
@@ -1288,7 +1310,7 @@ void Scene440::postInit(SceneObjectList *OwnerList) {
_lyle.setPosition(Common::Point(143, 93));
_lyle.setStrip(5);
_lyle.fixPriority(90);
-
+
_doorway.setFrame(_doorway.getFrameCount());
_sceneMode = 4401;
setAction(&_sequenceManager, this, 4401, &BF_GLOBALS._player, &_doorway, NULL);
@@ -1353,7 +1375,7 @@ bool Scene450::Weasel::startAction(CursorType action, Event &event) {
T2_GLOBALS._uiElements.addScore(30);
scene->_sceneMode = 4505;
- scene->setAction(&scene->_sequenceManager, scene, 4505, &BF_GLOBALS._player, this,
+ scene->setAction(&scene->_sequenceManager, scene, 4505, &BF_GLOBALS._player, this,
&scene->_counterDoor, &scene->_object2, NULL);
return true;
default:
@@ -1405,7 +1427,7 @@ bool Scene450::Manager::startAction(CursorType action, Event &event) {
if (BF_GLOBALS.getFlag(takenWeasel) && !BF_GLOBALS.getFlag(gotTrailer450)) {
BF_GLOBALS.setFlag(gotTrailer450);
scene->_sceneMode = 4517;
- scene->setAction(&scene->_sequenceManager, scene, 4517, &BF_GLOBALS._player, this,
+ scene->setAction(&scene->_sequenceManager, scene, 4517, &BF_GLOBALS._player, this,
&scene->_door, NULL);
} else {
animate(ANIM_MODE_8, 1, NULL);
@@ -1463,11 +1485,11 @@ bool Scene450::Manager::startAction(CursorType action, Event &event) {
} else {
animate(ANIM_MODE_8, 1, NULL);
BF_GLOBALS._player.disableControl();
-
+
if (!BF_GLOBALS.getFlag(showEugeneID))
T2_GLOBALS._uiElements.addScore(30);
BF_GLOBALS.setFlag(showEugeneID);
-
+
if ((BF_GLOBALS.getFlag(showRapEugene) || BF_GLOBALS.getFlag(showEugeneNapkin)) &&
!BF_GLOBALS.getFlag(fMgrCallsWeasel)) {
T2_GLOBALS._uiElements.addScore(30);
@@ -1537,13 +1559,13 @@ void Scene450::postInit(SceneObjectList *OwnerList) {
_door.setVisage(450);
_door.setStrip(2);
_door.setPosition(Common::Point(72, 80));
- _door.setDetails(450, 15, -1, 13, 1, NULL);
+ _door.setDetails(450, 15, -1, 13, 1, (SceneItem *)NULL);
_counterDoor.postInit();
_counterDoor.setVisage(450);
_counterDoor.setPosition(Common::Point(39, 104));
_counterDoor.fixPriority(100);
- _counterDoor.setDetails(450, 12, -1, 13, 1, NULL);
+ _counterDoor.setDetails(450, 12, -1, 13, 1, (SceneItem *)NULL);
if (BF_GLOBALS._dayNumber != 3) {
_pinBoy.postInit();
@@ -1576,9 +1598,9 @@ void Scene450::postInit(SceneObjectList *OwnerList) {
_object2.setPosition(Common::Point(-30, 126));
ADD_MOVER_NULL(_object2, 27, 126);
_object2.changeZoom(-1);
- _object2.setDetails(450, 2, 18, 3, 1, NULL);
+ _object2.setDetails(450, 2, 18, 3, 1, (SceneItem *)NULL);
- BF_GLOBALS._walkRegions.proc1(4);
+ BF_GLOBALS._walkRegions.disableRegion(4);
_weasel.postInit();
_weasel.setVisage(466);
@@ -1625,7 +1647,7 @@ void Scene450::signal() {
BF_GLOBALS.setFlag(takenWeasel);
_weasel.remove();
_object2.remove();
- BF_GLOBALS._walkRegions.proc2(4);
+ BF_GLOBALS._walkRegions.enableRegion(4);
BF_GLOBALS._player.enableControl();
break;
case 4507:
diff --git a/engines/tsage/blue_force/blueforce_scenes4.h b/engines/tsage/blue_force/blueforce_scenes4.h
index 6c40211f28..937c015a4c 100644
--- a/engines/tsage/blue_force/blueforce_scenes4.h
+++ b/engines/tsage/blue_force/blueforce_scenes4.h
@@ -133,6 +133,7 @@ class Scene415: public SceneExt {
class GunInset: public FocusObject {
public:
virtual bool startAction(CursorType action, Event &event);
+ virtual void remove();
};
class GunAndWig: public NamedObject {
public:
@@ -141,6 +142,7 @@ class Scene415: public SceneExt {
class BulletsInset: public FocusObject {
public:
virtual bool startAction(CursorType action, Event &event);
+ virtual void remove();
};
class DashDrawer: public NamedObject {
public:
@@ -166,12 +168,12 @@ public:
BulletsInset _bulletsInset;
DashDrawer _dashDrawer;
TheBullets _theBullets;
- NamedObject _object6;
+ NamedObject _animatedSeat;
NamedHotspot _item1, _steeringWheel, _horn, _dashboard;
NamedHotspot _seat, _windowLever, _item7, _seatBelt;
Lever _lever;
SpeakerJakeRadio _jakeRadioSpeaker;
- bool _fieldE14, _fieldE16;
+ bool _scoreWigRapFlag, _scoreBulletRapFlag;
Scene415();
virtual void postInit(SceneObjectList *OwnerList = NULL);
diff --git a/engines/tsage/blue_force/blueforce_scenes5.cpp b/engines/tsage/blue_force/blueforce_scenes5.cpp
index 500cad60b1..abadc4300a 100644
--- a/engines/tsage/blue_force/blueforce_scenes5.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes5.cpp
@@ -60,7 +60,7 @@ bool Scene550::Lyle::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_TALK:
- if ((BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) ||
+ if ((BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) ||
(BF_INVENTORY.getObjectScene(INV_9MM_BULLETS) == 1)) {
if ((BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) &&
(BF_INVENTORY.getObjectScene(INV_9MM_BULLETS) == 1)) {
@@ -132,7 +132,7 @@ bool Scene550::Vechile::startAction(CursorType action, Event &event) {
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 2;
scene->setAction(&scene->_sequenceManager, scene, 5501, &BF_GLOBALS._player, NULL);
- } else if ((BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) ||
+ } else if ((BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) ||
(BF_INVENTORY.getObjectScene(INV_9MM_BULLETS) == 1)) {
if (BF_INVENTORY.getObjectScene(INV_9MM_BULLETS) == 1) {
scene->_sceneMode = 5501;
@@ -164,11 +164,11 @@ void Scene550::postInit(SceneObjectList *OwnerList) {
_sceneMode = 1;
signal();
return;
- }
+ }
SceneExt::postInit();
loadScene(550);
-
+
_stripManager.addSpeaker(&_gameTextSpeaker);
_stripManager.addSpeaker(&_lyleHatSpeaker);
_stripManager.addSpeaker(&_jakeJacketSpeaker);
@@ -189,8 +189,8 @@ void Scene550::postInit(SceneObjectList *OwnerList) {
_vechile.fixPriority(70);
if (BF_GLOBALS.getFlag(fWithLyle)) {
- BF_GLOBALS._walkRegions.proc1(10);
- BF_GLOBALS._walkRegions.proc1(11);
+ BF_GLOBALS._walkRegions.disableRegion(10);
+ BF_GLOBALS._walkRegions.disableRegion(11);
_vechile.setVisage(444);
_vechile.setStrip(4);
@@ -201,14 +201,14 @@ void Scene550::postInit(SceneObjectList *OwnerList) {
_lyle.postInit();
_lyle.setVisage(835);
_lyle.setPosition(Common::Point(139, 83));
- _lyle.setDetails(550, 29, 30, 31, 1, NULL);
+ _lyle.setDetails(550, 29, 30, 31, 1, (SceneItem *)NULL);
_lyle.setStrip(8);
BF_GLOBALS._player.setVisage(303);
BF_GLOBALS._player.setPosition(Common::Point(89, 76));
BF_GLOBALS._player.updateAngle(_lyle._position);
} else {
- BF_GLOBALS._walkRegions.proc1(12);
+ BF_GLOBALS._walkRegions.disableRegion(12);
_vechile.setPosition(Common::Point(205, 77));
_vechile.changeZoom(80);
@@ -216,7 +216,7 @@ void Scene550::postInit(SceneObjectList *OwnerList) {
if (BF_GLOBALS.getFlag(onDuty)) {
_vechile.setVisage(301);
_vechile.setStrip(1);
-
+
BF_GLOBALS._player.setVisage(304);
} else {
_vechile.setVisage(580);
@@ -224,7 +224,7 @@ void Scene550::postInit(SceneObjectList *OwnerList) {
_vechile.setFrame(2);
BF_GLOBALS._player.setVisage(303);
- }
+ }
}
BF_GLOBALS._sceneItems.push_back(&_vechile);
@@ -296,10 +296,10 @@ void Scene551::Action2::signal() {
switch (_actionIndex++) {
case 0:
- BF_GLOBALS._walkRegions.proc2(18);
- BF_GLOBALS._walkRegions.proc2(4);
+ BF_GLOBALS._walkRegions.enableRegion(18);
+ BF_GLOBALS._walkRegions.enableRegion(4);
scene->_field1CD2 = 1;
-
+
scene->_harrison.setObjectWrapper(new SceneObjectWrapper());
scene->_harrison.animate(ANIM_MODE_1, NULL);
@@ -316,7 +316,7 @@ void Scene551::Action2::signal() {
scene->_harrison.updateAngle(BF_GLOBALS._player._position);
if (scene->_drunkStanding._flag == 1) {
- BF_GLOBALS._walkRegions.proc1(4);
+ BF_GLOBALS._walkRegions.disableRegion(4);
ADD_PLAYER_MOVER(71, 97);
} else {
ADD_PLAYER_MOVER(141, 87);
@@ -486,7 +486,7 @@ bool Scene551::PatrolCarTrunk::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE:
if (BF_INVENTORY.getObjectScene(INV_CENTER_PUNCH) != 1) {
- BF_GLOBALS._walkRegions.proc2(18);
+ BF_GLOBALS._walkRegions.enableRegion(18);
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 2;
scene->setAction(&scene->_sequenceManager, scene, 5503, &BF_GLOBALS._player, &scene->_harrison, this, NULL);
@@ -506,7 +506,7 @@ void Scene551::TrunkInset::remove() {
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 0;
- scene->setAction(&scene->_sequenceManager, scene, 5516, &scene->_harrison,
+ scene->setAction(&scene->_sequenceManager, scene, 5516, &scene->_harrison,
&scene->_patrolCarTrunk, NULL);
FocusObject::remove();
@@ -681,7 +681,7 @@ void Scene551::postInit(SceneObjectList *OwnerList) {
_vechile2.changeZoom(80);
BF_GLOBALS._sceneItems.push_back(&_vechile2);
- BF_GLOBALS._walkRegions.proc1(14);
+ BF_GLOBALS._walkRegions.disableRegion(14);
_drunk.postInit();
_drunk.setVisage(550);
@@ -702,16 +702,16 @@ void Scene551::postInit(SceneObjectList *OwnerList) {
_object13.setStrip(2);
_object13.setPosition(Common::Point(29, 92));
_object13.fixPriority(82);
- _object13.setDetails(550, 8, -1, 9, 1, NULL);
+ _object13.setDetails(550, 8, -1, 9, 1, (SceneItem *)NULL);
if (BF_GLOBALS.getFlag(didDrunk)) {
_drunk._flag = 3;
_drunk.setStrip(3);
_object12.show();
- _object12.setDetails(550, 25, -1, 26, 1, NULL);
+ _object12.setDetails(550, 25, -1, 26, 1, (SceneItem *)NULL);
BF_GLOBALS._sceneItems.push_front(&_object12);
-
+
_harrison.postInit();
_harrison.setVisage(304);
_harrison.setPosition(Common::Point(67, 102));
@@ -733,7 +733,7 @@ void Scene551::postInit(SceneObjectList *OwnerList) {
_object11.setFrame(2);
_object11.setPosition(Common::Point(116, 84));
_object11.fixPriority(77);
- _object11.setDetails(550, 32, -1, 10, 1, NULL);
+ _object11.setDetails(550, 32, -1, 10, 1, (SceneItem *)NULL);
_drunkStanding.postInit();
_drunkStanding._flag = 0;
@@ -764,7 +764,7 @@ void Scene551::postInit(SceneObjectList *OwnerList) {
_patrolCarTrunk.setFrame(1);
_patrolCarTrunk.setPosition(Common::Point(149, 69));
_patrolCarTrunk.fixPriority(79);
- _patrolCarTrunk.setDetails(550, 18, -1, 9, 1, NULL);
+ _patrolCarTrunk.setDetails(550, 18, -1, 9, 1, (SceneItem *)NULL);
_object11.postInit();
_object11.setVisage(550);
@@ -772,7 +772,7 @@ void Scene551::postInit(SceneObjectList *OwnerList) {
_object11.setFrame(2);
_object11.setPosition(Common::Point(116, 84));
_object11.fixPriority(77);
- _object11.setDetails(550, 32, -1, 10, 1, NULL);
+ _object11.setDetails(550, 32, -1, 10, 1, (SceneItem *)NULL);
_drunkStanding.postInit();
_drunkStanding._flag = 0;
@@ -812,7 +812,7 @@ void Scene551::signal() {
BF_GLOBALS._sceneManager.changeScene(60);
break;
case 2:
- BF_GLOBALS._walkRegions.proc1(18);
+ BF_GLOBALS._walkRegions.disableRegion(18);
_trunkInset.postInit();
_trunkInset.setVisage(553);
@@ -842,7 +842,7 @@ void Scene551::signal() {
ADD_PLAYER_MOVER_NULL(_harrison, 88, 91);
_object12.show();
- _object12.setDetails(550, 25, -1, 26, 1, NULL);
+ _object12.setDetails(550, 25, -1, 26, 1, (SceneItem *)NULL);
BF_GLOBALS._sceneItems.push_front(&_object12);
BF_GLOBALS._player.enableControl();
@@ -850,8 +850,8 @@ void Scene551::signal() {
setAction(&_sequenceManager, this, 5507, &BF_GLOBALS._player, &_drunk, &_drunkStanding, NULL);
break;
case 5507:
- BF_GLOBALS._walkRegions.proc1(2);
- BF_GLOBALS._walkRegions.proc1(4);
+ BF_GLOBALS._walkRegions.disableRegion(2);
+ BF_GLOBALS._walkRegions.disableRegion(4);
_drunkStanding._flag = 1;
BF_GLOBALS._sceneItems.push_front(&_drunkStanding);
@@ -924,7 +924,7 @@ void Scene560::Action1::signal() {
scene->_deskChair.setStrip(BF_GLOBALS._player._strip);
scene->_deskChair.setPosition(BF_GLOBALS._player._position);
- scene->_field380 = 1;
+ scene->_field380 = true;
BF_GLOBALS._player.enableControl();
remove();
break;
@@ -950,7 +950,7 @@ void Scene560::Action2::signal() {
BF_GLOBALS._player.animate(ANIM_MODE_6, this);
break;
case 2:
- scene->_field380 = 0;
+ scene->_field380 = false;
scene->_deskChair.setPosition(Common::Point(81, 149));
scene->_deskChair.setVisage(561);
scene->_deskChair.setStrip(3);
@@ -1064,7 +1064,7 @@ void Scene560::SafeInset::postInit(SceneObjectList *OwnerList) {
scene->_nickel.setFrame(3);
scene->_nickel.fixPriority(252);
scene->_nickel.setPosition(Common::Point(181, 140));
- scene->_nickel.setDetails(560, 47, 48, -1, 1, NULL);
+ scene->_nickel.setDetails(560, 47, 48, -1, 1, (SceneItem *)NULL);
BF_GLOBALS._sceneItems.remove(&scene->_nickel);
BF_GLOBALS._sceneItems.push_front(&scene->_nickel);
}
@@ -1076,7 +1076,7 @@ void Scene560::SafeInset::postInit(SceneObjectList *OwnerList) {
_item4.setDetails(Rect(143, 86, 159, 102), 560, 49, 50, -1, 1, NULL);
_item5.setDetails(Rect(159, 86, 175, 102), 560, 49, 50, -1, 1, NULL);
_item6.setDetails(Rect(175, 86, 191, 102), 560, 49, 50, -1, 1, NULL);
-
+
BF_GLOBALS._sceneItems.remove(&_item1);
BF_GLOBALS._sceneItems.remove(&_item2);
BF_GLOBALS._sceneItems.remove(&_item3);
@@ -1114,9 +1114,9 @@ void Scene560::SafeInset::postInit(SceneObjectList *OwnerList) {
_digit0.setStrip(3);
_digit0.setPosition(Common::Point(183, 94));
_digit0.fixPriority(252);
-
+
int amount = (BF_GLOBALS._safeCombination != 0) ? BF_GLOBALS._safeCombination : 1000;
-
+
// Get digit 0 portion
int remainder = amount % 10;
amount /= 10;
@@ -1135,7 +1135,7 @@ void Scene560::SafeInset::postInit(SceneObjectList *OwnerList) {
void Scene560::SafeInset::remove() {
Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
-
+
_item1.remove();
_item2.remove();
_item3.remove();
@@ -1145,7 +1145,7 @@ void Scene560::SafeInset::remove() {
_digit2.remove();
_digit1.remove();
_digit0.remove();
-
+
scene->_nickel.remove();
if (BF_GLOBALS._events.getCursor() == CURSOR_USE) {
@@ -1201,7 +1201,7 @@ void Scene560::SafeInset::signal() {
scene->_nickel.setFrame(3);
scene->_nickel.fixPriority(252);
scene->_nickel.setPosition(Common::Point(181, 140));
- scene->_nickel.setDetails(560, 47, 48, -1, 1, NULL);
+ scene->_nickel.setDetails(560, 47, 48, -1, 1, (SceneItem *)NULL);
BF_GLOBALS._sceneItems.remove(&scene->_nickel);
BF_GLOBALS._sceneItems.push_front(&scene->_nickel);
}
@@ -1293,7 +1293,7 @@ bool Scene560::SafeInset::Item::startAction(CursorType action, Event &event) {
default:
break;
}
-
+
scene->_safeInset.signal();
scene->_sound1.play(75);
return true;
@@ -1345,7 +1345,7 @@ bool Scene560::BoxInset::Item1::startAction(CursorType action, Event &event) {
scene->_safeInset.setPosition(Common::Point(160, 141));
scene->_safeInset.fixPriority(251);
scene->_safeInset.setDetails(560, 45, 46, -1);
-
+
scene->_sceneMode = 3;
scene->_boxInset.remove();
@@ -1378,7 +1378,7 @@ bool Scene560::Computer::startAction(CursorType action, Event &event) {
/*--------------------------------------------------------------------------*/
Scene560::Scene560(): SceneExt() {
- _field380 = _field11EA = 0;
+ _field380 = _field11EA = false;
}
void Scene560::postInit(SceneObjectList *OwnerList) {
@@ -1405,7 +1405,7 @@ void Scene560::postInit(SceneObjectList *OwnerList) {
_box.setStrip(4);
_box.setFrame(1);
_box.setPosition(Common::Point(295, 37));
- _box.setDetails(560, 41, 42, -1, 1, NULL);
+ _box.setDetails(560, 41, 42, -1, 1, (SceneItem *)NULL);
}
_deskChair.postInit();
@@ -1414,7 +1414,7 @@ void Scene560::postInit(SceneObjectList *OwnerList) {
_deskChair.setPosition(Common::Point(81, 149));
_deskChair.fixPriority(151);
_deskChair.changeZoom(81);
-
+
if (BF_GLOBALS._sceneManager._previousScene == 570) {
// Returning from using computer
BF_GLOBALS._events.setCursor(CURSOR_USE);
@@ -1433,12 +1433,12 @@ void Scene560::postInit(SceneObjectList *OwnerList) {
_deskChair.setStrip(BF_GLOBALS._player._strip);
_deskChair.setPosition(BF_GLOBALS._player._position);
- _field11EA = 0;
- _field380 = 1;
+ _field11EA = false;
+ _field380 = true;
} else {
// Entering study through doorway
- _field11EA = 0;
- _field380 = 0;
+ _field11EA = false;
+ _field380 = false;
BF_GLOBALS._player.postInit();
BF_GLOBALS._player.setVisage(563);
@@ -1448,13 +1448,13 @@ void Scene560::postInit(SceneObjectList *OwnerList) {
BF_GLOBALS._player._moveDiff.x = 11;
BF_GLOBALS._player.changeZoom(-1);
BF_GLOBALS._player.disableControl();
-
+
_sceneMode = 10;
ADD_MOVER(BF_GLOBALS._player, 85, 115);
}
_computer.setDetails(Rect(16, 77, 58, 107), 560, 2, -1, -1, 1, NULL);
- _deskChair.setDetails(560, 3, -1, -1, 1, NULL);
+ _deskChair.setDetails(560, 3, -1, -1, 1, (SceneItem *)NULL);
_chair.setDetails(Rect(163, 64, 196, 102), 560, 13, 25, 36, 1, NULL);
_lamp.setDetails(Rect(197, 43, 214, 56), 560, 7, 19, 30, 1, NULL);
_item4.setDetails(Rect(121, 18, 156, 54), 560, 8, 20, 31, 1, NULL);
@@ -1516,7 +1516,7 @@ void Scene560::signal() {
T2_GLOBALS._uiElements.addScore(10);
BF_GLOBALS.setFlag(fGotPointsForPunch);
}
-
+
_boxInset.postInit();
_boxInset.setVisage(560);
_boxInset.setStrip(2);
@@ -1529,7 +1529,7 @@ void Scene560::signal() {
}
break;
case 10:
- _field11EA = 0;
+ _field11EA = false;
BF_GLOBALS._player.enableControl();
break;
case 11:
@@ -1540,7 +1540,7 @@ void Scene560::signal() {
void Scene560::process(Event &event) {
if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == CURSOR_WALK) &&
- (_field380 == 1) && !_action) {
+ (_field380) && !_action) {
_destPosition = event.mousePos;
BF_GLOBALS._player.disableControl();
setAction(&_action2);
@@ -1553,7 +1553,7 @@ void Scene560::process(Event &event) {
void Scene560::dispatch() {
if (!_field11EA && (BF_GLOBALS._player._position.y < 105)) {
- _field11EA = 1;
+ _field11EA = true;
BF_GLOBALS._player.disableControl();
BF_GLOBALS._sceneManager.changeScene(270);
}
@@ -1605,7 +1605,7 @@ void Scene570::PasswordEntry::postInit(SceneObjectList *OwnerList) {
void Scene570::PasswordEntry::process(Event &event) {
Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
bool entryChanged = false;
-
+
switch (event.eventType) {
case EVENT_KEYPRESS: {
int key = toupper(event.kbd.ascii);
@@ -1648,7 +1648,7 @@ void Scene570::PasswordEntry::process(Event &event) {
_entryText.setPosition(Common::Point(213, 40));
_entryText.fixPriority(255);
_entryText.setup(_entryBuffer);
-
+
// Pad entered text with spaces to make up the allowed width and then display
Common::String msg = _entryBuffer;
while (msg.size() < 10)
@@ -1658,7 +1658,7 @@ void Scene570::PasswordEntry::process(Event &event) {
}
void Scene570::PasswordEntry::checkPassword() {
- // Check if the password is correctly entered as 'JACKIE' or, as a nod to the
+ // Check if the password is correctly entered as 'JACKIE' or, as a nod to the
// reimplementation in ScummVM, as the project name.
Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
@@ -1794,7 +1794,7 @@ void Scene570::Icon::remove() {
}
bool Scene570::Icon::startAction(CursorType action, Event &event) {
- Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
+ Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
@@ -1907,7 +1907,7 @@ bool Scene570::Icon::startAction(CursorType action, Event &event) {
}
void Scene570::Icon::setDetails(int iconId, int folderId, int parentFolderId, int unused, const Common::String &msg) {
- Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
+ Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
NamedObject::postInit();
_iconId = iconId;
@@ -1929,7 +1929,7 @@ void Scene570::Icon::setDetails(int iconId, int folderId, int parentFolderId, in
/*--------------------------------------------------------------------------*/
bool Scene570::PowerSwitch::startAction(CursorType action, Event &event) {
- Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
+ Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_USE:
@@ -1972,7 +1972,7 @@ bool Scene570::PrinterIcon::startAction(CursorType action, Event &event) {
}
void Scene570::Object3::remove() {
- Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
+ Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
scene->_object4._flag = 0;
scene->_printerIcon.remove();
@@ -1998,7 +1998,7 @@ void Scene570::Object3::remove() {
/*--------------------------------------------------------------------------*/
bool Scene570::FloppyDrive::startAction(CursorType action, Event &event) {
- Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
+ Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_USE:
@@ -2039,7 +2039,7 @@ void Scene570::postInit(SceneObjectList *OwnerList) {
_powerSwitch.setStrip(4);
_powerSwitch.setFrame(1);
_powerSwitch.setPosition(Common::Point(163, 131));
- _powerSwitch.setDetails(570, 1, 15, -1, 1, NULL);
+ _powerSwitch.setDetails(570, 1, 15, -1, 1, (SceneItem *)NULL);
_floppyDrive.setDetails(Rect(258, 111, 303, 120), 570, 0, 15, -1, 1, NULL);
_item11.setDetails(0, 570, 15, 15, 15, 1);
@@ -2070,7 +2070,7 @@ void Scene570::signal() {
_printerIcon.setFrame(3);
_printerIcon.setPosition(Common::Point(172, 71));
_printerIcon.fixPriority(2);
- _printerIcon.setDetails(570, 14, 15, -1, 2, NULL);
+ _printerIcon.setDetails(570, 14, 15, -1, 2, (SceneItem *)NULL);
_iconManager.setup(2);
_folder1.setDetails(1, 1, 0, 2, SCENE570_C_DRIVE);
@@ -2201,7 +2201,7 @@ void Scene580::postInit(SceneObjectList *OwnerList) {
_door.setStrip(4);
_door.setPosition(Common::Point(168, 41));
_door.hide();
- _door.setDetails(580, 5, -1, -1, 1, NULL);
+ _door.setDetails(580, 5, -1, -1, 1, (SceneItem *)NULL);
_vechile.postInit();
_vechile.setVisage(580);
@@ -2219,28 +2219,27 @@ void Scene580::postInit(SceneObjectList *OwnerList) {
_vechile.changeZoom(90);
_vechile.setStrip(3);
_vechile.setPosition(Common::Point(165, 76));
- _vechile.setDetails(580, 2, 3, -1, 1, NULL);
- _vechile.setVisage(303);
+ _vechile.setDetails(580, 2, 3, -1, 1, (SceneItem *)NULL);
BF_GLOBALS._player.setVisage(303);
- BF_GLOBALS._walkRegions.proc1(8);
- BF_GLOBALS._walkRegions.proc1(9);
- BF_GLOBALS._walkRegions.proc1(10);
- BF_GLOBALS._walkRegions.proc1(11);
+ BF_GLOBALS._walkRegions.disableRegion(8);
+ BF_GLOBALS._walkRegions.disableRegion(9);
+ BF_GLOBALS._walkRegions.disableRegion(10);
+ BF_GLOBALS._walkRegions.disableRegion(11);
} else {
_vechile.setPosition(Common::Point(159, 72));
if (BF_GLOBALS.getFlag(onDuty)) {
_vechile.setStrip(1);
_vechile.setFrame(2);
- _vechile.setDetails(300, 11, 13, -1, 1, NULL);
+ _vechile.setDetails(300, 11, 13, -1, 1, (SceneItem *)NULL);
BF_GLOBALS._player.setVisage(304);
} else {
_vechile.setStrip(2);
_vechile.setFrame(3);
- _vechile.setDetails(580, 0, 1, -1, 1, NULL);
+ _vechile.setDetails(580, 0, 1, -1, 1, (SceneItem *)NULL);
BF_GLOBALS._player.setVisage(303);
}
@@ -2327,7 +2326,7 @@ bool Scene590::Skip::startAction(CursorType action, Event &event) {
} else {
scene->_stripNumber = !scene->_field17DC ? 5901 : 5902;
}
-
+
scene->setAction(&scene->_action1);
scene->_field17DC = 1;
return true;
@@ -2405,7 +2404,7 @@ void Scene590::Action2::signal() {
case 4:
scene->_skip.setStrip(1);
scene->_skip.animate(ANIM_MODE_1, NULL);
-
+
BF_GLOBALS._player.setVisage(368);
BF_GLOBALS._player.setStrip(7);
BF_GLOBALS._player.setPosition(Common::Point(238, 131));
@@ -2457,7 +2456,7 @@ void Scene590::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_skipSpeaker);
_stripManager.addSpeaker(&_lauraSpeaker);
_stripManager.addSpeaker(&_jakeJacketSpeaker);
-
+
if (BF_GLOBALS.getFlag(onDuty)) {
BF_GLOBALS._player.setVisage(361);
BF_GLOBALS._player._moveDiff = Common::Point(6, 2);
@@ -2469,12 +2468,12 @@ void Scene590::postInit(SceneObjectList *OwnerList) {
_skip.postInit();
_skip.setVisage(693);
_skip.setPosition(Common::Point(271, 117));
- _skip.setDetails(590, 26, -1, 27, 1, NULL);
+ _skip.setDetails(590, 26, -1, 27, 1, (SceneItem *)NULL);
_laura.postInit();
_laura.setVisage(692);
_laura.setPosition(Common::Point(248, 115));
- _laura.setDetails(590, 24, -1, 25, 1, NULL);
+ _laura.setDetails(590, 24, -1, 25, 1, (SceneItem *)NULL);
}
}
@@ -2489,7 +2488,7 @@ void Scene590::postInit(SceneObjectList *OwnerList) {
_item10.setDetails(13, 590, 9, -1, 21, 1);
_item11.setDetails(15, 590, 10, -1, 22, 1);
_item12.setDetails(17, 590, 11, -1, 23, 1);
-
+
BF_GLOBALS._player.disableControl();
_sceneMode = 0;
setAction(&_sequenceManager, this, 5900, &BF_GLOBALS._player, NULL);
diff --git a/engines/tsage/blue_force/blueforce_scenes5.h b/engines/tsage/blue_force/blueforce_scenes5.h
index 34328ab9e8..73d323fc54 100644
--- a/engines/tsage/blue_force/blueforce_scenes5.h
+++ b/engines/tsage/blue_force/blueforce_scenes5.h
@@ -228,7 +228,8 @@ public:
NamedHotspot _chair, _lamp, _item4, _trophy, _watercolours, _fileCabinets;
NamedHotspot _certificate, _bookcase, _desk, _carpet, _item12, _office;
ASound _sound1;
- int _field380, _field11EA;
+ bool _field380;
+ bool _field11EA;
Common::Point _destPosition;
Scene560();
diff --git a/engines/tsage/blue_force/blueforce_scenes6.cpp b/engines/tsage/blue_force/blueforce_scenes6.cpp
index 56fdec47cd..9467df7917 100644
--- a/engines/tsage/blue_force/blueforce_scenes6.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes6.cpp
@@ -37,7 +37,7 @@ namespace BlueForce {
void Scene600::Action1::signal() {
Scene600 *scene = (Scene600 *)BF_GLOBALS._sceneManager._scene;
- static const uint32 black = 0;
+ static byte red[3] = {220, 0, 0};
switch (_actionIndex++) {
case 0:
@@ -49,8 +49,8 @@ void Scene600::Action1::signal() {
break;
case 2:
scene->_sound1.play(59);
- setAction(&scene->_sequenceManager, this, 600, &scene->_object2, &scene->_object1,
- &BF_GLOBALS._player, &scene->_object3, NULL);
+ setAction(&scene->_sequenceManager, this, 600, &scene->_object2, &scene->_ryan,
+ &BF_GLOBALS._player, &scene->_skidMarks, NULL);
break;
case 3:
BF_GLOBALS._sound1.play(61);
@@ -61,13 +61,13 @@ void Scene600::Action1::signal() {
break;
case 5: {
BF_GLOBALS._player.remove();
- scene->_object1.remove();
+ scene->_ryan.remove();
scene->_object2.remove();
- scene->_object3.remove();
+ scene->_skidMarks.remove();
- for (int percent = 100; percent >= 0; percent -= 5) {
- BF_GLOBALS._scenePalette.fade((const byte *)&black, false, percent);
- g_system->delayMillis(10);
+ for (int percent = 100; percent >= 0; percent -= 2) {
+ BF_GLOBALS._scenePalette.fade((const byte *)&red, false, percent);
+ g_system->delayMillis(5);
}
SynchronizedList<SceneObject *>::iterator i;
@@ -91,6 +91,8 @@ void Scene600::Action1::signal() {
BF_GLOBALS._v51C44 = 0;
remove();
break;
+ default:
+ break;
}
}
@@ -110,14 +112,14 @@ void Scene600::postInit(SceneObjectList *OwnerList) {
BF_GLOBALS._player.setPosition(Common::Point(639, 0));
BF_GLOBALS._player.disableControl();
- _object3.postInit();
- _object3.hide();
+ _skidMarks.postInit();
+ _skidMarks.hide();
_object2.postInit();
-
- _object1.postInit();
- _object1.setVisage(600);
- _object1.setStrip(7);
- _object1.setPosition(Common::Point(417, 82));
+
+ _ryan.postInit();
+ _ryan.setVisage(600);
+ _ryan.setStrip(7);
+ _ryan.setPosition(Common::Point(417, 82));
BF_GLOBALS.clearFlag(onDuty);
BF_INVENTORY.setObjectScene(INV_TICKET_BOOK, 60);
@@ -147,7 +149,7 @@ void Scene600::remove() {
void Scene620::postInit(SceneObjectList *OwnerList) {
SceneExt::postInit();
loadScene(999);
-
+
BF_GLOBALS._player.postInit();
BF_GLOBALS._player.disableControl();
BF_GLOBALS._player.setVisage(621);
@@ -174,14 +176,14 @@ void Scene620::signal() {
case 13:
case 16:
case 19:
- addFader((const byte *)&black, 2, this);
+ addFader((const byte *)&black, 2, this);
break;
case 2:
BF_GLOBALS._player.remove();
_object1.postInit();
_object1.setVisage(622);
_object1.setPosition(Common::Point(101, 41));
- addFader((const byte *)&black, 2, this);
+ add2Faders((const byte *)&black, 2, 622, this);
break;
case 5:
_object1.remove();
@@ -240,6 +242,8 @@ void Scene620::signal() {
BF_GLOBALS._dayNumber = 3;
BF_GLOBALS._sceneManager.changeScene(271);
break;
+ default:
+ break;
}
}
@@ -386,8 +390,8 @@ bool Scene690::Object1::startAction(CursorType action, Event &event) {
if ((action == CURSOR_USE) && (scene->_object2._strip == 1)) {
BF_GLOBALS._player.disableControl();
- BF_GLOBALS._walkRegions.proc2(1);
- BF_GLOBALS._walkRegions.proc2(6);
+ BF_GLOBALS._walkRegions.enableRegion(1);
+ BF_GLOBALS._walkRegions.enableRegion(6);
scene->_sceneMode = 6901;
scene->setAction(&scene->_sequenceManager, scene, 6901, &BF_GLOBALS._player,
&scene->_object2, &scene->_object1, &scene->_object4, &scene->_object5, NULL);
@@ -406,7 +410,7 @@ bool Scene690::Object2::startAction(CursorType action, Event &event) {
scene->_object6.postInit();
scene->_object6.hide();
scene->_object6.fixPriority(1);
- scene->_object6.setDetails(690, 21, 17, 23, 1, NULL);
+ scene->_object6.setDetails(690, 21, 17, 23, 1, (SceneItem *)NULL);
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 6902;
@@ -437,36 +441,36 @@ void Scene690::postInit(SceneObjectList *OwnerList) {
BF_GLOBALS._dayNumber = 1;
_stripManager.addSpeaker(&_jakeSpeaker);
-
+
_object1.postInit();
_object1.setVisage(690);
_object1.setStrip2(2);
_object1.fixPriority(188);
_object1.setPosition(Common::Point(50, 166));
- _object1.setDetails(690, 4, 17, 26, 1, NULL);
+ _object1.setDetails(690, 4, 17, 26, 1, (SceneItem *)NULL);
_object3.postInit();
_object3.setVisage(690);
_object3.fixPriority(100);
_object3.setPosition(Common::Point(238, 125));
- _object3.setDetails(690, 7, 17, 28, 1, NULL);
+ _object3.setDetails(690, 7, 17, 28, 1, (SceneItem *)NULL);
_object2.postInit();
_object2.setVisage(694);
_object2.setStrip2(3);
_object2.fixPriority(125);
_object2.setPosition(Common::Point(100, 134));
- _object2.setDetails(690, 12, -1, 11, 1, NULL);
+ _object2.setDetails(690, 12, -1, 11, 1, (SceneItem *)NULL);
BF_GLOBALS._player.postInit();
BF_GLOBALS._player.disableControl();
BF_GLOBALS._player._moveDiff.x = 8;
_object4.postInit();
- _object4.setDetails(690, 13, -1, -1, 1, NULL);
+ _object4.setDetails(690, 13, -1, -1, 1, (SceneItem *)NULL);
_object5.postInit();
- _object5.setDetails(690, 14, -1, -1, 1, NULL);
+ _object5.setDetails(690, 14, -1, -1, 1, (SceneItem *)NULL);
_sceneMode = 6903;
setAction(&_sequenceManager, this, 6903, &BF_GLOBALS._player, &_object3, &_object4, &_object5, NULL);
@@ -500,8 +504,8 @@ void Scene690::signal() {
BF_GLOBALS._player.enableControl();
break;
case 6903:
- BF_GLOBALS._walkRegions.proc1(1);
- BF_GLOBALS._walkRegions.proc1(6);
+ BF_GLOBALS._walkRegions.disableRegion(1);
+ BF_GLOBALS._walkRegions.disableRegion(6);
BF_GLOBALS._player.enableControl();
break;
default:
diff --git a/engines/tsage/blue_force/blueforce_scenes6.h b/engines/tsage/blue_force/blueforce_scenes6.h
index e354e9e069..3f9c14aa11 100644
--- a/engines/tsage/blue_force/blueforce_scenes6.h
+++ b/engines/tsage/blue_force/blueforce_scenes6.h
@@ -49,7 +49,7 @@ public:
SequenceManager _sequenceManager;
Action1 _action1;
ASoundExt _sound1;
- NamedObject _object1, _object2, _object3;
+ NamedObject _ryan, _object2, _skidMarks;
BackgroundSceneObject _object4, _object5;
BackgroundSceneObject _object6, _object7, _object8;
diff --git a/engines/tsage/blue_force/blueforce_scenes7.cpp b/engines/tsage/blue_force/blueforce_scenes7.cpp
index 2ced7ce08c..bb29ad1f34 100644
--- a/engines/tsage/blue_force/blueforce_scenes7.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes7.cpp
@@ -37,7 +37,7 @@ namespace BlueForce {
void Scene710::Timer1::signal() {
PaletteRotation *rotation = BF_GLOBALS._scenePalette.addRotation(136, 138, -1);
- rotation->setDelay(25);
+ rotation->setDelay(20);
rotation = BF_GLOBALS._scenePalette.addRotation(146, 148, -1);
rotation->setDelay(30);
rotation = BF_GLOBALS._scenePalette.addRotation(187, 191, -1);
@@ -113,19 +113,19 @@ bool Scene710::Object5::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_LOOK:
- if (scene->_v1D64 <= 2)
+ if (scene->_stickThrowCount <= 2)
return NamedObject::startAction(action, event);
else {
SceneItem::display2(710, 3);
- scene->_v1D66 = 1;
+ scene->_watchCrate = true;
return true;
}
case CURSOR_USE:
- if ((scene->_kid._position.x < 0) && (scene->_v1D62 == 1)) {
- scene->_v1D64++;
- if (scene->_v1D66 == 0) {
+ if ((scene->_kid._position.x < 0) && (scene->_dogLying)) {
+ scene->_stickThrowCount++;
+ if (!scene->_watchCrate) {
BF_GLOBALS._player.disableControl();
- scene->_v1D62 = 0;
+ scene->_dogLying = false;
scene->_sceneMode = 7105;
scene->setAction(&scene->_sequenceManager1, scene, 7105, &BF_GLOBALS._player, &scene->_stick, &scene->_dog, NULL);
} else {
@@ -172,10 +172,10 @@ void Scene710::postInit(SceneObjectList *OwnerList) {
_stick.animate(ANIM_MODE_2, NULL);
_stick.setPosition(Common::Point(650, 160));
_stick._moveDiff.x = 16;
- _stick.setDetails(710, 4, -1, -1, 1, NULL);
- _laura.setDetails(710, 2, -1, -1, 1, NULL);
- _kid.setDetails(710, 6, -1, -1, 1, NULL);
- _dog.setDetails(710, 0, -1, -1, 1, NULL);
+ _stick.setDetails(710, 4, -1, -1, 1, (SceneItem *)NULL);
+ _laura.setDetails(710, 2, -1, -1, 1, (SceneItem *)NULL);
+ _kid.setDetails(710, 6, -1, -1, 1, (SceneItem *)NULL);
+ _dog.setDetails(710, 0, -1, -1, 1, (SceneItem *)NULL);
_item1.setDetails(Rect(555, 68, 583, 101), 710, 7, 23, -1, 1, NULL);
_item2.setDetails(Rect(583, 46, 611, 78), 710, 7, 23, -1, 1, NULL);
@@ -187,7 +187,8 @@ void Scene710::postInit(SceneObjectList *OwnerList) {
_item7.setDetails(Rect(0, 0, 640, 52), 710, 11, 17, -1, 1, NULL);
_item9.setDetails(Rect(0, 0, 640, 128), 710, 5, 15, -1, 1, NULL);
- _v1D62 = _v1D64 = _v1D66 = _v1D68 = 0;
+ _stickThrowCount = 0;
+ _dogLying = _watchCrate = _throwStick = false;
_action1._state = 7100;
_timer1.set(2, NULL);
_sceneMode = 7100;
@@ -205,28 +206,29 @@ void Scene710::signal() {
setAction(&_sequenceManager1, this, 7102, &_dog, NULL);
break;
case 7101:
+ // Pick up crate part
BF_GLOBALS._player.enableControl();
BF_INVENTORY.setObjectScene(INV_CRATE1, 1);
_stick.remove();
- BF_GLOBALS._walkRegions.proc2(2);
+ BF_GLOBALS._walkRegions.enableRegion(2);
break;
case 7102:
_stick.setPosition(Common::Point(100, 122));
_stick.animate(ANIM_MODE_NONE, NULL);
_stick._strip = 2;
- if (_v1D64 <= 2)
+ if (_stickThrowCount <= 2)
_stick._frame = 2;
else {
- if (_v1D64 == 3) {
+ if (_stickThrowCount == 3) {
BF_GLOBALS._player.disableControl();
_sceneMode = 0;
_stripManager.start(7108, this);
}
_stick._frame = 1;
}
- _v1D62 = 1;
- BF_GLOBALS._walkRegions.proc1(2);
- if ((_v1D68 != 0) && (_sceneMode != 0))
+ _dogLying = true;
+ BF_GLOBALS._walkRegions.disableRegion(2);
+ if ((_throwStick) && (_sceneMode != 0))
BF_GLOBALS._player.enableControl();
break;
case 7103:
@@ -239,12 +241,12 @@ void Scene710::signal() {
}
break;
case 7105:
- _v1D68 = 1;
+ _throwStick = true;
// No break on purpose
case 7104:
_sceneMode = 7102;
setAction(&_sequenceManager1, this, 7102, &_dog, NULL);
- BF_GLOBALS._walkRegions.proc2(2);
+ BF_GLOBALS._walkRegions.enableRegion(2);
break;
case 7106:
BF_GLOBALS._sound1.fadeOut2(NULL);
@@ -256,8 +258,8 @@ void Scene710::signal() {
}
void Scene710::dispatch() {
- if ((_kid._position.x > 0) && (_v1D62 == 1) && (_sceneMode != 7106)) {
- _v1D62 = 0;
+ if ((_kid._position.x > 0) && (_dogLying) && (_sceneMode != 7106)) {
+ _dogLying = false;
_sceneMode = 7103;
setAction(&_sequenceManager1, this, 7103, &_kid, &_stick, &_dog, NULL);
}
@@ -266,10 +268,10 @@ void Scene710::dispatch() {
void Scene710::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_v1D62);
- s.syncAsSint16LE(_v1D64);
- s.syncAsSint16LE(_v1D66);
- s.syncAsSint16LE(_v1D68);
+ s.syncAsSint16LE(_dogLying);
+ s.syncAsSint16LE(_stickThrowCount);
+ s.syncAsSint16LE(_watchCrate);
+ s.syncAsSint16LE(_throwStick);
}
diff --git a/engines/tsage/blue_force/blueforce_scenes7.h b/engines/tsage/blue_force/blueforce_scenes7.h
index 91bd1e537f..161d94cc2c 100644
--- a/engines/tsage/blue_force/blueforce_scenes7.h
+++ b/engines/tsage/blue_force/blueforce_scenes7.h
@@ -89,7 +89,10 @@ public:
NamedHotspot _item7;
NamedHotspot _item8;
NamedHotspot _item9;
- int _v1D62, _v1D64, _v1D66, _v1D68;
+ int _stickThrowCount;
+ bool _dogLying;
+ bool _watchCrate;
+ bool _throwStick;
virtual void postInit(SceneObjectList *OwnerList = NULL);
virtual void signal();
diff --git a/engines/tsage/blue_force/blueforce_scenes8.cpp b/engines/tsage/blue_force/blueforce_scenes8.cpp
index c81f3b8d65..5a60cd7c5e 100644
--- a/engines/tsage/blue_force/blueforce_scenes8.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes8.cpp
@@ -252,12 +252,12 @@ void Scene800::postInit(SceneObjectList *OwnerList) {
_car2.fixPriority(158);
BF_GLOBALS._sceneItems.push_back(&_car2);
- BF_GLOBALS._walkRegions.proc1(8);
+ BF_GLOBALS._walkRegions.disableRegion(8);
}
if ((BF_GLOBALS._dayNumber == 4) && (BF_GLOBALS._bookmark < bEndDayThree)) {
_car2.remove();
- BF_GLOBALS._walkRegions.proc2(8);
+ BF_GLOBALS._walkRegions.enableRegion(8);
}
if (BF_GLOBALS.getFlag(fWithLyle)) {
@@ -427,14 +427,14 @@ void Scene810::Action2::signal() {
setAction(&scene->_sequenceManager1, this, 8117, &scene->_lyle, &scene->_chair, NULL);
break;
case 3:
- BF_GLOBALS._walkRegions.proc2(4);
+ BF_GLOBALS._walkRegions.enableRegion(4);
ADD_PLAYER_MOVER_THIS(scene->_lyle, 27, 124);
break;
case 4:
scene->_lyle.setVisage(813);
scene->_lyle.setStrip(2);
scene->_lyle.setFrame(1);
-
+
ADD_PLAYER_MOVER(84, 113);
break;
case 5:
@@ -454,7 +454,7 @@ void Scene810::Action2::signal() {
scene->_stripManager.start(BF_GLOBALS.getFlag(onDuty) ? 8137 : 8112, this);
break;
case 8:
- BF_GLOBALS._walkRegions.proc1(13);
+ BF_GLOBALS._walkRegions.disableRegion(13);
BF_GLOBALS._player.enableControl();
remove();
break;
@@ -562,24 +562,36 @@ bool Scene810::Lyle::startAction(CursorType action, Event &event) {
case INV_PRINT_OUT:
if (BF_GLOBALS.getFlag(shownLylePO)) {
scene->_sceneMode = 8149;
- } else if (!BF_GLOBALS.getFlag(shownLylePO)) {
- if (!BF_GLOBALS.getFlag(shownFax)) {
- // WORKAROUND: Original did not do a 'not', but I think this is correct
- BF_GLOBALS.setFlag(shownFax);
- scene->_sceneMode = 8125;
- } else if (BF_GLOBALS.getFlag(shownLyleRapsheet)) {
- scene->_sceneMode = 8104;
+ } else {
+ BF_GLOBALS.setFlag(shownLylePO);
+ if (BF_GLOBALS._dayNumber == 3) {
+ if (BF_GLOBALS.getFlag(shownFax)) {
+ BF_GLOBALS.setFlag(shownFax);
+ scene->_sceneMode = 8125;
+ } else if (BF_GLOBALS.getFlag(shownLyleRapsheet)) {
+ scene->_sceneMode = 8104;
+ } else {
+ scene->_sceneMode = 8121;
+ }
+ } else if (BF_GLOBALS.getFlag(onDuty)) {
+ if ((BF_GLOBALS.getFlag(shownLyleRapsheet)) || (BF_GLOBALS.getFlag(shownLyleCrate1))){
+ scene->_sceneMode = 8141;
+ } else {
+ // Doublecheck on shownLyleCrate1 removed: useless
+ scene->_sceneMode = 8144;
+ }
} else {
- scene->_sceneMode = 8121;
+ if ((BF_GLOBALS.getFlag(shownLyleRapsheet)) || (BF_GLOBALS.getFlag(shownLyleCrate1))) {
+ scene->_sceneMode = 8129;
+ } else { // if (BF_GLOBALS.getFlag(shownLyleCrate1)) {
+ scene->_sceneMode = 8132;
+ // doublecheck Present in the original, may hide a bug in the original
+ //} else
+ // scene->_sceneMode = 8121;
+ }
}
- } else if (BF_GLOBALS.getFlag(onDuty)) {
- scene->_sceneMode = 8141;
- } else {
- if (BF_GLOBALS.getFlag(shownLyleRapsheet) || BF_GLOBALS.getFlag(shownLyleCrate1))
- scene->_sceneMode = 8129;
- else
- scene->_sceneMode = 8121;
}
+
BF_GLOBALS._player.disableControl();
scene->setAction(&scene->_action1);
return true;
@@ -599,7 +611,7 @@ bool Scene810::Lyle::startAction(CursorType action, Event &event) {
default:
return NamedObjectExt::startAction(action, event);
}
-}
+}
bool Scene810::Chair::startAction(CursorType action, Event &event) {
switch (action) {
@@ -654,12 +666,12 @@ bool Scene810::FaxMachineInset::startAction(CursorType action, Event &event) {
if (BF_INVENTORY.getObjectScene(INV_PRINT_OUT) == 811) {
T2_GLOBALS._uiElements.addScore(50);
scene->_sound1.play(77);
+ scene->_fieldA70 = 1;
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 8109;
scene->setAction(&scene->_sequenceManager1, scene, 8109, &BF_GLOBALS._player,
&scene->_object6, &scene->_object5, NULL);
- scene->_fieldA70 = 1;
scene->_fieldA74 = 1;
remove();
} else {
@@ -697,7 +709,7 @@ bool Scene810::Object5::startAction(CursorType action, Event &event) {
case CURSOR_USE: {
scene->_sceneMode = 8195;
BF_GLOBALS._player.disableControl();
-
+
PlayerMover *mover = new PlayerMover();
Common::Point destPos(67, 111);
BF_GLOBALS._player.addMover(mover, &destPos, scene);
@@ -792,7 +804,7 @@ bool Scene810::FaxMachine::startAction(CursorType action, Event &event) {
scene->_sceneMode = 811;
if (BF_GLOBALS._sceneObjects->contains(&scene->_lyle)) {
- scene->setAction(&scene->_sequenceManager1, scene, BF_GLOBALS.getFlag(onDuty) ? 8108 : 8105,
+ scene->setAction(&scene->_sequenceManager1, scene, BF_GLOBALS.getFlag(onDuty) ? 8108 : 8105,
&BF_GLOBALS._player, &scene->_object6, NULL);
} else {
scene->setAction(&scene->_sequenceManager1, scene, 8111, &BF_GLOBALS._player,
@@ -1046,12 +1058,12 @@ void Scene810::postInit(SceneObjectList *OwnerList) {
case 820:
BF_GLOBALS._player.setStrip(7);
BF_GLOBALS._player.setPosition(Common::Point(278, 116));
-
+
_lyle.setVisage(845);
_lyle.setPosition(Common::Point(340, 175));
_lyle.setObjectWrapper(new SceneObjectWrapper());
_lyle.animate(ANIM_MODE_1, NULL);
-
+
_chair.show();
BF_GLOBALS._player.disableControl();
@@ -1109,7 +1121,7 @@ void Scene810::postInit(SceneObjectList *OwnerList) {
_item12._sceneRegionId = 8;
BF_GLOBALS._sceneItems.push_back(&_item12);
- BF_GLOBALS._sceneItems.addItems(&_microficheReader, &_map, &_window, &_bookcase, &_garbageCan,
+ BF_GLOBALS._sceneItems.addItems(&_microficheReader, &_map, &_window, &_bookcase, &_garbageCan,
&_fileCabinets, &_coffeeMaker, &_shelves, &_background, NULL);
_background.setBounds(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y));
}
@@ -1172,7 +1184,7 @@ void Scene810::signal() {
if (BF_GLOBALS.getFlag(shownFax)) {
BF_GLOBALS.setFlag(showMugAround);
} else {
- BF_GLOBALS._walkRegions.proc1(4);
+ BF_GLOBALS._walkRegions.disableRegion(4);
BF_GLOBALS._player.enableControl();
}
break;
@@ -1225,7 +1237,7 @@ void Scene810::signal() {
_object5.setFrame(1);
break;
case 8196:
- BF_GLOBALS._walkRegions.proc1(4);
+ BF_GLOBALS._walkRegions.disableRegion(4);
BF_GLOBALS._player.enableControl();
break;
case 8198:
@@ -1264,7 +1276,7 @@ void Scene810::dispatch() {
_lyle.updateAngle(BF_GLOBALS._player._position);
}
- if (BF_GLOBALS._sceneObjects->contains(&_faxMachineInset) && (BF_GLOBALS._player._position.x != 67) &&
+ if (BF_GLOBALS._sceneObjects->contains(&_faxMachineInset) && (BF_GLOBALS._player._position.x != 67) &&
(BF_GLOBALS._player._position.y != 111)) {
_faxMachineInset.remove();
}
@@ -1279,8 +1291,8 @@ void Scene810::dispatch() {
} else {
BF_GLOBALS.clearFlag(showMugAround);
BF_GLOBALS._player.disableControl();
- BF_GLOBALS._walkRegions.proc2(4);
- BF_GLOBALS._walkRegions.proc2(13);
+ BF_GLOBALS._walkRegions.enableRegion(4);
+ BF_GLOBALS._walkRegions.enableRegion(13);
_sceneMode = 8112;
setAction(&_sequenceManager1, this, 8112, &BF_GLOBALS._player, &_lyle, NULL);
@@ -1296,8 +1308,8 @@ void Scene810::dispatch() {
setAction(&_sequenceManager1, this, 8100, &BF_GLOBALS._player, NULL);
} else {
if (BF_GLOBALS.getFlag(fWithLyle)) {
- BF_GLOBALS._walkRegions.proc2(4);
- BF_GLOBALS._walkRegions.proc2(13);
+ BF_GLOBALS._walkRegions.enableRegion(4);
+ BF_GLOBALS._walkRegions.enableRegion(13);
ADD_MOVER_NULL(_lyle, 320, 155);
}
@@ -1329,7 +1341,7 @@ bool Scene820::PowerButton::startAction(CursorType action, Event &event) {
BF_GLOBALS._scenePalette.loadPalette(821);
BF_GLOBALS._scenePalette.refresh();
- SceneItem::display(820, scene->_pageNumber, SET_WIDTH, 240, SET_X, 41, SET_Y, 0,
+ SceneItem::display(820, scene->_pageNumber, SET_WIDTH, 240, SET_X, 41, SET_Y, 0,
SET_FONT, 50, SET_FG_COLOR, 18, SET_EXT_BGCOLOR, 12, SET_KEEP_ONSCREEN, true, LIST_END);
} else {
BF_GLOBALS._scenePalette.loadPalette(820);
@@ -1376,7 +1388,7 @@ bool Scene820::BackButton::startAction(CursorType action, Event &event) {
scene->_object5.hide();
}
- SceneItem::display(820, scene->_pageNumber, SET_WIDTH, 240, SET_X, 41, SET_Y, 0,
+ SceneItem::display(820, scene->_pageNumber, SET_WIDTH, 240, SET_X, 41, SET_Y, 0,
SET_FONT, 50, SET_FG_COLOR, 18, SET_EXT_BGCOLOR, 12, SET_KEEP_ONSCREEN, true, LIST_END);
return true;
default:
@@ -1407,7 +1419,7 @@ bool Scene820::ForwardButton::startAction(CursorType action, Event &event) {
if (scene->_pageNumber < 4)
++scene->_pageNumber;
- SceneItem::display(820, scene->_pageNumber, SET_WIDTH, 240, SET_X, 41, SET_Y, 0,
+ SceneItem::display(820, scene->_pageNumber, SET_WIDTH, 240, SET_X, 41, SET_Y, 0,
SET_FONT, 50, SET_FG_COLOR, 18, SET_EXT_BGCOLOR, 12, SET_KEEP_ONSCREEN, true, LIST_END);
if (scene->_pageNumber == 4) {
@@ -1435,7 +1447,7 @@ void Scene820::synchronize(Serializer &s) {
void Scene820::postInit(SceneObjectList *OwnerList) {
SceneExt::postInit();
loadScene(820);
-
+
_stripManager.addSpeaker(&_gameTextSpeaker);
_powerButton.postInit();
@@ -1660,12 +1672,12 @@ void Scene830::postInit(SceneObjectList *OwnerList) {
_rentalBoat.setStrip(1);
_rentalBoat.setPosition(Common::Point(271, 146));
_rentalBoat.fixPriority(90);
- _rentalBoat.setDetails(830, 0, 1, 2, 1, NULL);
+ _rentalBoat.setDetails(830, 0, 1, 2, 1, (SceneItem *)NULL);
}
_door.postInit();
_door.setVisage(830);
- _door.setDetails(830, 3, 4, -1, 1, NULL);
+ _door.setDetails(830, 3, 4, -1, 1, (SceneItem *)NULL);
_door.setStrip((BF_GLOBALS._dayNumber == 2) ? 4 : 3);
_door.setPosition(Common::Point(182, 97));
@@ -1690,7 +1702,7 @@ void Scene830::postInit(SceneObjectList *OwnerList) {
_object5.setStrip(2);
_object5.setFrame(2);
_object5.setPosition(Common::Point(126, 133));
- _object5.setDetails(830, 7, 8, -1, 1, NULL);
+ _object5.setDetails(830, 7, 8, -1, 1, (SceneItem *)NULL);
}
break;
case 5:
@@ -1706,7 +1718,7 @@ void Scene830::postInit(SceneObjectList *OwnerList) {
_lyle.setStrip(4);
_lyle.setPosition(Common::Point(180, 154));
_lyle._moveDiff = Common::Point(2, 0);
- _lyle.setDetails(830, 28, -1, 29, 1, NULL);
+ _lyle.setDetails(830, 28, -1, 29, 1, (SceneItem *)NULL);
_field18AC = 1;
}
@@ -1938,7 +1950,7 @@ void Scene840::BoatKeysInset::postInit(SceneObjectList *OwnerList) {
_rentalKeys.setFrame(3);
_rentalKeys.setPosition(Common::Point(120, 132));
_rentalKeys.fixPriority(255);
- _rentalKeys.setDetails(840, 52, 8, -1, 2, NULL);
+ _rentalKeys.setDetails(840, 52, 8, -1, 2, (SceneItem *)NULL);
}
if (BF_INVENTORY.getObjectScene(INV_WAVE_KEYS) != 1) {
@@ -1948,7 +1960,7 @@ void Scene840::BoatKeysInset::postInit(SceneObjectList *OwnerList) {
_waveKeys.setFrame(2);
_waveKeys.setPosition(Common::Point(201, 91));
_waveKeys.fixPriority(255);
- _waveKeys.setDetails(840, 53, 8, -1, 2, NULL);
+ _waveKeys.setDetails(840, 53, 8, -1, 2, (SceneItem *)NULL);
}
_v1B4 = _v1B6 = 0;
@@ -2023,7 +2035,7 @@ bool Scene840::BoatKeysInset::startAction(CursorType action, Event &event) {
_rentalKeys.setFrame(3);
_rentalKeys.setPosition(Common::Point(120, 132));
_rentalKeys.fixPriority(255);
- _rentalKeys.setDetails(840, 52, 8, -1, 2, NULL);
+ _rentalKeys.setDetails(840, 52, 8, -1, 2, (SceneItem *)NULL);
}
if (BF_INVENTORY.getObjectScene(INV_WAVE_KEYS) == 1) {
@@ -2034,7 +2046,7 @@ bool Scene840::BoatKeysInset::startAction(CursorType action, Event &event) {
_waveKeys.setFrame(2);
_waveKeys.setPosition(Common::Point(201, 91));
_waveKeys.fixPriority(255);
- _waveKeys.setDetails(840, 53, 8, -1, 2, NULL);
+ _waveKeys.setDetails(840, 53, 8, -1, 2, (SceneItem *)NULL);
}
BF_INVENTORY.setObjectScene(INV_WAVE_KEYS, 0);
@@ -2247,7 +2259,7 @@ void Scene840::postInit(SceneObjectList *OwnerList) {
_doors.setVisage(840);
_doors.setStrip(3);
_doors.setPosition(Common::Point(157, 81));
- _doors.setDetails(840, 0, 1, 2, 1, NULL);
+ _doors.setDetails(840, 0, 1, 2, 1, (SceneItem *)NULL);
_carter.postInit();
_carter.setVisage(843);
@@ -2267,7 +2279,7 @@ void Scene840::postInit(SceneObjectList *OwnerList) {
_item10.setDetails(Rect(199, 56, 236, 80), 840, 24, 14, 12, 1, NULL);
_item11.setDetails(Rect(256, 94, 319, 118), 840, 25, 15, 13, 1, NULL);
_item18.setDetails(6, 840, 38, 39, 40, 1);
- _carter.setDetails(840, 3, 4, 5, 1, NULL);
+ _carter.setDetails(840, 3, 4, 5, 1, (SceneItem *)NULL);
_item8.setDetails(Rect(259, 4, 319, 87), 840, 22, 15, 13, 1, NULL);
_item15.setDetails(2, 840, 32, 33, 34, 1);
_coins.setDetails(3, 840, -1, 6, 7, 1);
@@ -2283,7 +2295,7 @@ void Scene840::postInit(SceneObjectList *OwnerList) {
_boatKeys.setFrame(1);
_boatKeys.setPosition(Common::Point(250, 83));
_boatKeys.fixPriority(120);
- _boatKeys.setDetails(840, -1, 8, 9, 2, NULL);
+ _boatKeys.setDetails(840, -1, 8, 9, 2, (SceneItem *)NULL);
_field1AC0 = 1;
}
@@ -2375,7 +2387,7 @@ void Scene840::signal() {
case 4:
_sceneMode = 8403;
_boatKeys.postInit();
- _boatKeys.setDetails(840, -1, 8, 9, 2, NULL);
+ _boatKeys.setDetails(840, -1, 8, 9, 2, (SceneItem *)NULL);
setAction(&_sequenceManager1, this, 8403, &_carter, &_boatKeys, NULL);
break;
case 5:
@@ -2667,7 +2679,7 @@ void Scene860::postInit(SceneObjectList *OwnerList) {
_object2.setVisage(880);
_object2.setPosition(Common::Point(196, 81));
BF_GLOBALS._sceneItems.push_back(&_object2);
- _object2.setDetails(860, 0, 1, -1, 1, NULL);
+ _object2.setDetails(860, 0, 1, -1, 1, (SceneItem *)NULL);
_object2.fixPriority(20);
_neRect = Rect(0, 0, 0, 0);
@@ -2864,7 +2876,7 @@ void Scene870::CrateInset::initContents() {
_jar.setPosition(Common::Point(scene->_crateInset._position.x + 5,
scene->_crateInset._position.y - 26));
_jar.fixPriority(251);
- _jar.setDetails(870, 39, 40, 41, 1, NULL);
+ _jar.setDetails(870, 39, 40, 41, 1, (SceneItem *)NULL);
BF_GLOBALS._sceneItems.remove(&_jar);
BF_GLOBALS._sceneItems.push_front(&_jar);
}
@@ -2878,7 +2890,7 @@ void Scene870::CrateInset::initContents() {
_rags.setPosition(Common::Point(scene->_crateInset._position.x - 18,
scene->_crateInset._position.y - 18));
_rags.fixPriority(251);
- _rags.setDetails(870, 42, 43, 44, 1, NULL);
+ _rags.setDetails(870, 42, 43, 44, 1, (SceneItem *)NULL);
BF_GLOBALS._sceneItems.remove(&_rags);
BF_GLOBALS._sceneItems.push_front(&_rags);
}
@@ -3051,7 +3063,7 @@ void Scene870::postInit(SceneObjectList *OwnerList) {
_lyle.setObjectWrapper(new SceneObjectWrapper());
_lyle.animate(ANIM_MODE_1, NULL);
_lyle._moveDiff = Common::Point(2, 1);
- _lyle.setDetails(870, 27, 28, 29, 1, NULL);
+ _lyle.setDetails(870, 27, 28, 29, 1, (SceneItem *)NULL);
}
_yacht.postInit();
@@ -3059,7 +3071,7 @@ void Scene870::postInit(SceneObjectList *OwnerList) {
_yacht.setStrip(4);
_yacht.setFrame(4);
_yacht.setPosition(Common::Point(232, 19));
- _yacht.setDetails(870, 30, 31, 32, 1, NULL);
+ _yacht.setDetails(870, 30, 31, 32, 1, (SceneItem *)NULL);
if ((BF_INVENTORY.getObjectScene(INV_RAGS) == 0) && (BF_INVENTORY.getObjectScene(INV_FLARE) == 0) &&
(BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 355)) {
@@ -3069,9 +3081,9 @@ void Scene870::postInit(SceneObjectList *OwnerList) {
_green.setPosition(Common::Point(127, 109));
if (BF_GLOBALS._bookmark == bFinishedWGreen) {
- _green.setDetails(870, 51, 54, 53, 1, NULL);
+ _green.setDetails(870, 51, 54, 53, 1, (SceneItem *)NULL);
} else {
- _green.setDetails(870, 51, 52, 53, 1, NULL);
+ _green.setDetails(870, 51, 52, 53, 1, (SceneItem *)NULL);
}
}
}
@@ -3103,7 +3115,7 @@ void Scene870::postInit(SceneObjectList *OwnerList) {
_lyle.setPosition(Common::Point(156, 148));
_lyle.fixPriority(149);
}
-
+
if ((BF_INVENTORY.getObjectScene(INV_HANDCUFFS) != 1) &&
(BF_INVENTORY.getObjectScene(INV_GRENADES) == 355)) {
_object4.postInit();
@@ -3123,7 +3135,7 @@ void Scene870::postInit(SceneObjectList *OwnerList) {
}
break;
}
-
+
_boat.setDetails(7, 870, 3, 4, 5, 1);
_crate.setDetails(14, 870, 12, 13, 14, 1);
_water.setDetails(5, 870, 24, 25, 26, 1);
@@ -3346,11 +3358,11 @@ void Scene880::postInit(SceneObjectList *OwnerList) {
_object2.postInit();
_object2.setVisage(880);
_object2.setPosition(Common::Point(209, 76));
- _object2.setDetails(880, 4, 5, 6, 1, NULL);
+ _object2.setDetails(880, 4, 5, 6, 1, (SceneItem *)NULL);
_object4.postInit();
_object4.setVisage(875);
- _object4.setDetails(880, 7, -1, 9, 1, NULL);
+ _object4.setDetails(880, 7, -1, 9, 1, (SceneItem *)NULL);
_object5.postInit();
_object5.setVisage(874);
@@ -3381,7 +3393,7 @@ void Scene880::postInit(SceneObjectList *OwnerList) {
_object4.setFrame2(_object4.getFrameCount());
_object4.fixPriority(160);
_object4.setPosition(Common::Point(255, 148));
-
+
_seqNumber = 8816;
} else if (BF_GLOBALS.getFlag(fBlowUpGoon)) {
_object4.setStrip(7);
@@ -3393,7 +3405,7 @@ void Scene880::postInit(SceneObjectList *OwnerList) {
} else {
_object4.setStrip(2);
_object4.setPosition(Common::Point(258, 147));
-
+
_object3.postInit();
_object3.setVisage(871);
_object3.setStrip(4);
@@ -3588,7 +3600,7 @@ void Scene880::handleAction(Action *action) {
action->_owner = NULL;
}
}
-
+
void Scene880::dispatch() {
SceneExt::dispatch();
diff --git a/engines/tsage/blue_force/blueforce_scenes9.cpp b/engines/tsage/blue_force/blueforce_scenes9.cpp
index 545edb91d6..2178f31b30 100644
--- a/engines/tsage/blue_force/blueforce_scenes9.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes9.cpp
@@ -35,7 +35,7 @@ namespace BlueForce {
*
*--------------------------------------------------------------------------*/
-bool Scene900::Item1::startAction(CursorType action, Event &event) {
+bool Scene900::Exterior::startAction(CursorType action, Event &event) {
if (action == CURSOR_LOOK) {
SceneItem::display2(900, 6);
return true;
@@ -44,7 +44,7 @@ bool Scene900::Item1::startAction(CursorType action, Event &event) {
}
}
-bool Scene900::Item4::startAction(CursorType action, Event &event) {
+bool Scene900::WestExit::startAction(CursorType action, Event &event) {
Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene;
BF_GLOBALS._player.disableControl();
@@ -62,37 +62,37 @@ bool Scene900::Gate::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE:
- if (BF_GLOBALS._v4CEC0 == 0) {
+ if (BF_GLOBALS._gateStatus == 0) {
return NamedObject::startAction(action, event);
} else {
BF_GLOBALS._player.disableControl();
- if (BF_GLOBALS._v4CEC0 == 2) {
+ if (BF_GLOBALS._gateStatus == 2) {
scene->_sceneMode = 9006;
- BF_GLOBALS._v4CEC0 = 1;
+ BF_GLOBALS._gateStatus = 1;
scene->setAction(&scene->_sequenceManager1, scene, 9006, &BF_GLOBALS._player, this, NULL);
} else {
- BF_GLOBALS._v4CEC0 = 2;
+ BF_GLOBALS._gateStatus = 2;
if (scene->_dog._flag == false) {
BF_GLOBALS._player.setAction(&scene->_action4);
} else {
scene->_sceneMode = 9005;
scene->setAction(&scene->_sequenceManager1, scene, 9005, &BF_GLOBALS._player, this, NULL);
- BF_GLOBALS._walkRegions.proc2(24);
+ BF_GLOBALS._walkRegions.enableRegion(24);
}
}
return true;
}
break;
case INV_WAREHOUSE_KEYS:
- if (BF_GLOBALS._v4CEC0 == 2) {
+ if (BF_GLOBALS._gateStatus == 2) {
SceneItem::display2(900, 14);
} else {
- if (BF_GLOBALS._v4CEC0 == 0) {
+ if (BF_GLOBALS._gateStatus == 0) {
if (!BF_GLOBALS.getFlag(fGotPointsForUnlockGate)) {
BF_GLOBALS.setFlag(fGotPointsForUnlockGate);
T2_GLOBALS._uiElements.addScore(30);
}
- BF_GLOBALS._v4CEC0 = 1;
+ BF_GLOBALS._gateStatus = 1;
} else {
if (!BF_GLOBALS.getFlag(fGotPointsForLockGate)) {
if (BF_GLOBALS._bookmark == bEndDayThree) {
@@ -100,7 +100,7 @@ bool Scene900::Gate::startAction(CursorType action, Event &event) {
T2_GLOBALS._uiElements.addScore(30);
}
}
- BF_GLOBALS._v4CEC0 = 0;
+ BF_GLOBALS._gateStatus = 0;
}
scene->_sceneMode = 9004;
BF_GLOBALS._player.disableControl();
@@ -117,12 +117,12 @@ bool Scene900::Door::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE:
- if (BF_GLOBALS._v4CEC0 == 2) {
+ if (BF_GLOBALS._gateStatus == 2) {
if (_flag) {
SceneItem::display2(900, 1);
} else {
BF_GLOBALS._player.disableControl();
- BF_GLOBALS._walkRegions.proc2(26);
+ BF_GLOBALS._walkRegions.enableRegion(26);
scene->_sceneMode = 9007;
scene->setAction(&scene->_sequenceManager1, scene, 9007, &BF_GLOBALS._player, &scene->_door, this, NULL);
}
@@ -131,7 +131,7 @@ bool Scene900::Door::startAction(CursorType action, Event &event) {
return NamedObject::startAction(action, event);
break;
case INV_WAREHOUSE_KEYS:
- if (BF_GLOBALS._v4CEC0 == 2) {
+ if (BF_GLOBALS._gateStatus == 2) {
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 9012;
scene->setAction(&scene->_sequenceManager1, scene, 9012, &BF_GLOBALS._player, &scene->_door, NULL);
@@ -180,11 +180,12 @@ bool Scene900::Lyle::startAction(CursorType action, Event &event) {
if (action == CURSOR_TALK) {
if (!_action) {
if (scene->_dog._flag) {
- if (BF_GLOBALS._v4CEC0 == 0)
+ // Dog is no longer there
+ if (BF_GLOBALS._gateStatus == 0)
scene->_stripManager.start(9004, &BF_GLOBALS._stripProxy);
else {
if (scene->_door._flag == 1) {
- if (BF_GLOBALS._v4CEC0 == 2)
+ if (BF_GLOBALS._gateStatus == 2)
scene->_stripManager.start(9005, &BF_GLOBALS._stripProxy);
else
scene->_stripManager.start(9001, &BF_GLOBALS._stripProxy);
@@ -192,10 +193,11 @@ bool Scene900::Lyle::startAction(CursorType action, Event &event) {
scene->_stripManager.start(9001, &BF_GLOBALS._stripProxy);
}
} else {
- if (scene->_field1974)
+ // Dog is there
+ if (scene->_lyleDialogCtr)
scene->_stripManager.start(9003, &BF_GLOBALS._stripProxy);
else {
- ++scene->_field1974;
+ ++scene->_lyleDialogCtr;
scene->_stripManager.start(9002, &BF_GLOBALS._stripProxy);
}
}
@@ -384,7 +386,7 @@ void Scene900::Action3::signal() {
break;
default:
break;
- }
+ }
}
void Scene900::Action4::signal() {
@@ -416,7 +418,7 @@ void Scene900::Action4::signal() {
/*--------------------------------------------------------------------------*/
Scene900::Scene900(): PalettedScene() {
- _field1974 = _field1976 = 0;
+ _lyleDialogCtr = _field1976 = 0;
}
void Scene900::postInit(SceneObjectList *OwnerList) {
@@ -425,7 +427,7 @@ void Scene900::postInit(SceneObjectList *OwnerList) {
if (BF_GLOBALS._sceneManager._previousScene == 910)
BF_GLOBALS._sound1.changeSound(91);
- _field1974 = 0;
+ _lyleDialogCtr = 0;
_field1976 = 0;
T2_GLOBALS._uiElements._active = true;
BF_GLOBALS.clearFlag(fCanDrawGun);
@@ -440,12 +442,12 @@ void Scene900::postInit(SceneObjectList *OwnerList) {
_body.fixPriority(120);
_body.setVisage(901);
_body.setPosition(Common::Point(159,128));
- _body.setDetails(900, 15, 16, 17, ANIM_MODE_1, NULL);
+ _body.setDetails(900, 15, 16, 17, ANIM_MODE_1, (SceneItem *)NULL);
}
if (BF_GLOBALS._sceneManager._previousScene == 910) {
_sceneBounds.moveTo(639, 0);
- BF_GLOBALS._v4CEC0 = 2;
+ BF_GLOBALS._gateStatus = 2;
BF_INVENTORY.setObjectScene(INV_FISHING_NET, 900);
_dog._flag = 1;
}
@@ -456,14 +458,14 @@ void Scene900::postInit(SceneObjectList *OwnerList) {
_stripManager.addSpeaker(&_jakeJacketSpeaker);
_stripManager.addSpeaker(&_lyleHatSpeaker);
- _item4.setDetails(Rect(0, 85, 20, 130), 900, -1, -1, -1, 1, 0);
+ _westExit.setDetails(Rect(0, 85, 20, 130), 900, -1, -1, -1, 1, 0);
BF_GLOBALS._player.postInit();
_dog.postInit();
_dog.setVisage(902);
_dog.setPosition(Common::Point(845, 135));
_dog.fixPriority(122);
- _dog.setDetails(900, 8, -1, 9, 1, NULL);
+ _dog.setDetails(900, 8, -1, 9, 1, (SceneItem *)NULL);
if (_dog._flag == 0) {
_dog.animate(ANIM_MODE_1, NULL);
@@ -485,10 +487,10 @@ void Scene900::postInit(SceneObjectList *OwnerList) {
_gate.setVisage(900);
_gate.setStrip(2);
- if (BF_GLOBALS._v4CEC0 == 2)
+ if (BF_GLOBALS._gateStatus == 2)
_gate.setPosition(Common::Point(758, 127));
else {
- BF_GLOBALS._walkRegions.proc1(24);
+ BF_GLOBALS._walkRegions.disableRegion(24);
_gate.setPosition(Common::Point(804, 132));
}
@@ -515,14 +517,14 @@ void Scene900::postInit(SceneObjectList *OwnerList) {
_door._flag = 1;
if ((BF_GLOBALS._sceneManager._previousScene == 880) || (BF_GLOBALS._sceneManager._previousScene != 910)) {
- BF_GLOBALS._walkRegions.proc1(26);
+ BF_GLOBALS._walkRegions.disableRegion(26);
BF_GLOBALS._player.disableControl();
if (BF_GLOBALS._bookmark == bFinishedWGreen) {
_sceneMode = 9013;
_lyle.postInit();
_lyle._moveDiff.y = 7;
_lyle._flags |= OBJFLAG_CHECK_REGION;
- _lyle.setDetails(900, 19, 20, 21, ANIM_MODE_1, NULL);
+ _lyle.setDetails(900, 19, 20, 21, ANIM_MODE_1, (SceneItem *)NULL);
_lyleHatSpeaker._xp = 210;
_jakeJacketSpeaker._xp = 75;
setAction(&_sequenceManager1, this, 9013, &BF_GLOBALS._player, &_lyle, NULL);
@@ -535,10 +537,10 @@ void Scene900::postInit(SceneObjectList *OwnerList) {
_lyle.setPosition(Common::Point(780, 153));
_lyle._moveDiff.y = 7;
_lyle._flags |= 0x1000;
- _lyle.setDetails(900, 19, 20, 21, ANIM_MODE_1, NULL);
+ _lyle.setDetails(900, 19, 20, 21, ANIM_MODE_1, (SceneItem *)NULL);
_lyle.animate(ANIM_MODE_1, NULL);
_lyle.setObjectWrapper(new SceneObjectWrapper());
- }
+ }
_sceneMode = 9000;
setAction(&_sequenceManager1, this, 9000, &BF_GLOBALS._player, NULL);
@@ -551,17 +553,17 @@ void Scene900::postInit(SceneObjectList *OwnerList) {
if (BF_GLOBALS.getFlag(fWithLyle)) {
_lyle.postInit();
_lyle._flags |= 0x1000;
- _lyle.setDetails(900, 19, 20, 21, ANIM_MODE_1, NULL);
+ _lyle.setDetails(900, 19, 20, 21, ANIM_MODE_1, (SceneItem *)NULL);
setAction(&_sequenceManager1, this, 9014, &BF_GLOBALS._player, &_door, &_lyle, NULL);
} else
setAction(&_sequenceManager1, this, 9002, &BF_GLOBALS._player, &_door, NULL);
}
- _gate.setDetails(900, 0, -1, 1, 1, 0);
- _door.setDetails(900, 2, -1, 5, 1, 0);
+ _gate.setDetails(900, 0, -1, 1, 1, (SceneItem *)NULL);
+ _door.setDetails(900, 2, -1, 5, 1, (SceneItem *)NULL);
_item2.setDetails(Rect(0, 0, 225, 21), 666, 25, -1, -1, 1, NULL);
_item3.setDetails(Rect(37, 21, 324, 50), 666, 26, -1, -1, 1, NULL);
- _item1.setDetails(Rect(0, 0, 960, 200), 900, 7, -1, -1, 1, NULL);
+ _exterior.setDetails(Rect(0, 0, 960, 200), 900, 7, -1, -1, 1, NULL);
}
void Scene900::signal() {
@@ -572,7 +574,7 @@ void Scene900::signal() {
BF_GLOBALS._sceneManager.changeScene(910);
break;
case 3:
- BF_GLOBALS._walkRegions.proc1(24);
+ BF_GLOBALS._walkRegions.disableRegion(24);
_sceneMode = 9004;
setAction(&_sequenceManager1, this, 9006, &BF_GLOBALS._player, &_gate, NULL);
break;
@@ -580,7 +582,7 @@ void Scene900::signal() {
BF_GLOBALS._player.enableControl();
break;
case 9001:
- if ((BF_INVENTORY.getObjectScene(INV_FISHING_NET) == 900) || (BF_GLOBALS._v4CEC0 != 0) ||
+ if ((BF_INVENTORY.getObjectScene(INV_FISHING_NET) == 900) || (BF_GLOBALS._gateStatus != 0) ||
(_door._flag == 0))
BF_GLOBALS.setFlag(fLeftTraceIn900);
else
@@ -589,11 +591,11 @@ void Scene900::signal() {
BF_GLOBALS._sceneManager.changeScene(880);
break;
case 9002:
- BF_GLOBALS._walkRegions.proc1(26);
+ BF_GLOBALS._walkRegions.disableRegion(26);
BF_GLOBALS._player.enableControl();
break;
case 9004:
- if (BF_GLOBALS._v4CEC0 == 0)
+ if (BF_GLOBALS._gateStatus == 0)
SceneItem::display2(900, 3);
else
SceneItem::display2(900, 4);
@@ -606,7 +608,7 @@ void Scene900::signal() {
BF_GLOBALS._player.enableControl();
break;
case 9006:
- BF_GLOBALS._walkRegions.proc1(24);
+ BF_GLOBALS._walkRegions.disableRegion(24);
BF_GLOBALS._player.enableControl();
break;
case 9007:
@@ -625,7 +627,7 @@ void Scene900::signal() {
break;
case 9010:
_sound1.play(92);
- if (BF_GLOBALS._v4CEC0 == 2) {
+ if (BF_GLOBALS._gateStatus == 2) {
_sceneMode = 9008;
setAction(&_sequenceManager1, this, 9008, &BF_GLOBALS._player, &_dog, NULL);
} else {
@@ -666,9 +668,9 @@ void Scene900::signal() {
BF_GLOBALS._player.enableControl();
break;
case 9016:
- if ((BF_GLOBALS._clip1Bullets == 0) && (BF_GLOBALS._clip2Bullets == 0)){
- BF_GLOBALS._clip1Bullets = 8;
+ if ((BF_GLOBALS._clip1Bullets == 0) && (BF_GLOBALS._clip2Bullets == 0)) {
BF_GLOBALS._clip1Bullets = 8;
+ BF_GLOBALS._clip2Bullets = 8;
SceneItem::display2(900, 25);
} else if (BF_GLOBALS._clip1Bullets == 0) {
BF_GLOBALS._clip1Bullets = 8;
@@ -690,7 +692,7 @@ void Scene900::process(Event &event) {
SceneExt::process(event);
if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
- if (_item4.contains(event.mousePos)) {
+ if (_westExit.contains(event.mousePos)) {
GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_W);
BF_GLOBALS._events.setCursor(surface);
} else {
@@ -718,7 +720,7 @@ void Scene900::dispatch() {
void Scene900::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_field1974);
+ s.syncAsSint16LE(_lyleDialogCtr);
s.syncAsSint16LE(_field1976);
}
@@ -755,26 +757,26 @@ void Scene910::Action2::signal() {
switch (_actionIndex++) {
case 0:
- scene->_object7.postInit();
- scene->_object7.setVisage(919);
- scene->_object7.setPosition(Common::Point(267, 51));
- scene->_object7.fixPriority(40);
+ scene->_shadow.postInit();
+ scene->_shadow.setVisage(919);
+ scene->_shadow.setPosition(Common::Point(267, 51));
+ scene->_shadow.fixPriority(40);
signal();
break;
case 1:
- scene->_object7.hide();
+ scene->_shadow.hide();
setDelay(600);
break;
case 2:
- scene->_object7.setStrip(BF_GLOBALS._randomSource.getRandomNumber(3) + 2);
- scene->_object7.setFrame(1);
- scene->_object7.show();
+ scene->_shadow.setStrip(BF_GLOBALS._randomSource.getRandomNumber(2) + 2);
+ scene->_shadow.setFrame(1);
+ scene->_shadow.show();
setDelay(6);
break;
case 3:
_actionIndex = 1;
- scene->_object7.setStrip(BF_GLOBALS._randomSource.getRandomNumber(3) + 2);
- scene->_object7.animate(ANIM_MODE_5, this);
+ scene->_shadow.setStrip(BF_GLOBALS._randomSource.getRandomNumber(2) + 2);
+ scene->_shadow.animate(ANIM_MODE_5, this);
break;
default:
break;
@@ -797,7 +799,7 @@ bool Scene910::Lyle::startAction(CursorType action, Event &event) {
else
return false;
} else if (action == CURSOR_TALK) {
- if ((BF_GLOBALS._v4CEE0 != 0) || (BF_GLOBALS._v4CEE2 != 0)) {
+ if ((BF_GLOBALS._hiddenDoorStatus != 0) || (BF_GLOBALS._v4CEE2 != 0)) {
scene->_stripManager.start(9100 + _field90, &BF_GLOBALS._stripProxy);
if (_field90 < 1)
_field90++;
@@ -822,7 +824,7 @@ bool Scene910::Nico::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE:
BF_GLOBALS._player.disableControl();
- scene->_field2DDA = 6;
+ scene->_sceneSubMode = 6;
scene->_sceneMode = 9123;
if (BF_GLOBALS._player._visage == 1911)
scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
@@ -844,10 +846,10 @@ bool Scene910::Nico::startAction(CursorType action, Event &event) {
scene->_stripManager.start(9103 + BF_GLOBALS._v4CEE6, &BF_GLOBALS._stripProxy);
return true;
break;
- case 1:
+ case INV_COLT45:
if (BF_GLOBALS._v4CEE2 > 1) {
if (BF_GLOBALS._v4CEE2 != 4) {
- if ((BF_GLOBALS.getFlag(gunDrawn)) && (BF_GLOBALS.getFlag(25)) && (BF_GLOBALS.getHasBullets())) {
+ if ((BF_GLOBALS.getFlag(gunDrawn)) && (BF_GLOBALS.getFlag(fGunLoaded)) && (BF_GLOBALS.getHasBullets())) {
if (scene->_field2DE0 == 0) {
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 9126;
@@ -868,7 +870,7 @@ bool Scene910::Nico::startAction(CursorType action, Event &event) {
return true;
}
} else {
- if ((BF_GLOBALS.getFlag(gunDrawn)) && (BF_GLOBALS.getFlag(25)) && (BF_GLOBALS.getHasBullets())) {
+ if ((BF_GLOBALS.getFlag(gunDrawn)) && (BF_GLOBALS.getFlag(fGunLoaded)) && (BF_GLOBALS.getHasBullets())) {
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 9125;
scene->setAction(&scene->_sequenceManager1, scene, 9125, &scene->_nico, NULL);
@@ -876,8 +878,8 @@ bool Scene910::Nico::startAction(CursorType action, Event &event) {
return NamedObject::startAction(action, event);
}
break;
- case 39:
- case 53:
+ case INV_BADGE:
+ case INV_ID:
if (BF_GLOBALS._v4CEE2 >= 4)
return NamedObject::startAction(action, event);
@@ -892,11 +894,11 @@ bool Scene910::Nico::startAction(CursorType action, Event &event) {
return true;
break;
- case 57:
+ case INV_YELLOW_CORD:
if (BF_GLOBALS._v4CEE2 < 4) {
BF_GLOBALS._player.disableControl();
scene->_yellowCord.fixPriority(121);
- scene->_field2DDA = 10;
+ scene->_sceneSubMode = 10;
scene->_sceneMode = 9123;
if (BF_GLOBALS._player._visage == 1911)
scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
@@ -914,7 +916,7 @@ bool Scene910::Nico::startAction(CursorType action, Event &event) {
return true;
}
break;
- case 58:
+ case INV_HALF_YELLOW_CORD:
if (BF_GLOBALS._v4CECC == 1)
SceneItem::display(910, 84, SET_WIDTH, 312,
SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
@@ -929,8 +931,8 @@ bool Scene910::Nico::startAction(CursorType action, Event &event) {
SET_EXT_FGCOLOR, 13, LIST_END);
return true;
break;
- case 59:
- case 61:
+ case INV_BLACK_CORD:
+ case INV_HALF_BLACK_CORD:
SceneItem::display(910, 83, SET_WIDTH, 312,
SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
@@ -950,7 +952,7 @@ bool Scene910::Stuart::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE:
BF_GLOBALS._player.disableControl();
- scene->_field2DDA = 7;
+ scene->_sceneSubMode = 7;
scene->_sceneMode = 9123;
if (BF_GLOBALS._player._visage == 1911)
scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
@@ -965,8 +967,8 @@ bool Scene910::Stuart::startAction(CursorType action, Event &event) {
scene->_stripManager.start(9107 + BF_GLOBALS._v4CEE8, &BF_GLOBALS._stripProxy);
return true;
break;
- case 1:
- if ((BF_GLOBALS.getFlag(gunDrawn)) && (BF_GLOBALS.getFlag(25)) && (BF_GLOBALS.getHasBullets())){
+ case INV_COLT45:
+ if ((BF_GLOBALS.getFlag(gunDrawn)) && (BF_GLOBALS.getFlag(fGunLoaded)) && (BF_GLOBALS.getHasBullets())){
BF_GLOBALS._player.disableControl();
if (BF_GLOBALS._v4CEE4 == 2) {
scene->_sceneMode = 9132;
@@ -983,7 +985,7 @@ bool Scene910::Stuart::startAction(CursorType action, Event &event) {
} else
return NamedObject::startAction(action, event);
break;
- case 57:
+ case INV_YELLOW_CORD:
if (BF_GLOBALS._v4CECC == 1) {
SceneItem::display(910, 84, SET_WIDTH, 312,
SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
@@ -994,7 +996,7 @@ bool Scene910::Stuart::startAction(CursorType action, Event &event) {
} else {
BF_GLOBALS._player.disableControl();
if (BF_GLOBALS._v4CEE2 == 4) {
- scene->_field2DDA = 11;
+ scene->_sceneSubMode = 11;
scene->_sceneMode = 9123;
if (BF_GLOBALS._player._visage == 1911)
scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
@@ -1002,7 +1004,7 @@ bool Scene910::Stuart::startAction(CursorType action, Event &event) {
scene->signal();
return true;
} else {
- scene->_field2DDA = 12;
+ scene->_sceneSubMode = 12;
scene->_sceneMode = 9123;
if (BF_GLOBALS._player._visage == 1911)
scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
@@ -1012,7 +1014,7 @@ bool Scene910::Stuart::startAction(CursorType action, Event &event) {
}
}
break;
- case 58:
+ case INV_HALF_YELLOW_CORD:
if (BF_GLOBALS._v4CECC == 1) {
SceneItem::display(910, 84, SET_WIDTH, 312,
SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
@@ -1022,7 +1024,7 @@ bool Scene910::Stuart::startAction(CursorType action, Event &event) {
return true;
} else {
BF_GLOBALS._player.disableControl();
- scene->_field2DDA = 11;
+ scene->_sceneSubMode = 11;
scene->_sceneMode = 9123;
if (BF_GLOBALS._player._visage == 1911)
scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
@@ -1031,8 +1033,8 @@ bool Scene910::Stuart::startAction(CursorType action, Event &event) {
return true;
}
break;
- case 59:
- case 61:
+ case INV_BLACK_CORD:
+ case INV_HALF_BLACK_CORD:
SceneItem::display(910, 83, SET_WIDTH, 312,
SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
@@ -1051,8 +1053,8 @@ bool Scene910::Forbes::startAction(CursorType action, Event &event) {
if (action == CURSOR_TALK) {
BF_GLOBALS._player.disableControl();
- BF_GLOBALS._walkRegions.proc2(1);
- BF_GLOBALS._walkRegions.proc2(16);
+ BF_GLOBALS._walkRegions.enableRegion(1);
+ BF_GLOBALS._walkRegions.enableRegion(16);
scene->_sceneMode = 9140;
scene->setAction(&scene->_sequenceManager1, scene, 9140, &scene->_forbes, &BF_GLOBALS._player, &scene->_lyle, NULL);
return true;
@@ -1074,15 +1076,15 @@ bool Scene910::PowerCord::startAction(CursorType action, Event &event) {
if ((action == CURSOR_LOOK) || (action == CURSOR_TALK) || (action < CURSOR_WALK)) {
if (_field90 == 1)
return false;
- if ((_field92 != 1) || (BF_GLOBALS._v4CEE0 == 0 ))
+ if ((_field92 != 1) || (BF_GLOBALS._hiddenDoorStatus == 0 ))
return NamedObject::startAction(action, event);
return false;
} else if (action == CURSOR_USE) {
if (_field90 == 0) {
- if ((BF_GLOBALS._v4CEE0 == 0) || (_field92 != 1)) {
+ if ((BF_GLOBALS._hiddenDoorStatus == 0) || (_field92 != 1)) {
BF_GLOBALS._player.disableControl();
if (_field92 == 1) {
- scene->_field2DDA = 8;
+ scene->_sceneSubMode = 8;
scene->_sceneMode = 9123;
if (BF_GLOBALS._player._visage == 1911)
scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
@@ -1092,7 +1094,7 @@ bool Scene910::PowerCord::startAction(CursorType action, Event &event) {
return true;
} else {
scene->_destPos = Common::Point(151, 186);
- scene->_field2DDA = 4;
+ scene->_sceneSubMode = 4;
scene->_sceneMode = 9123;
if (BF_GLOBALS._player._visage == 1911)
scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
@@ -1143,7 +1145,7 @@ bool Scene910::BreakerBox::startAction(CursorType action, Event &event) {
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 9102;
if (BF_GLOBALS.getFlag(gunDrawn)) {
- scene->_field2DDA = 1;
+ scene->_sceneSubMode = 1;
scene->_sceneMode = 9123;
scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
return true;
@@ -1173,7 +1175,7 @@ bool Scene910::FakeWall::startAction(CursorType action, Event &event) {
if (action == INV_YELLOW_CORD) {
BF_GLOBALS._player.disableControl();
scene->_destPos = Common::Point(285, 114);
- scene->_field2DDA = 9;
+ scene->_sceneSubMode = 9;
scene->_sceneMode = 9123;
if (BF_GLOBALS._player._visage == 1911)
scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
@@ -1192,23 +1194,23 @@ void Scene910::BreakerBoxInset::postInit(SceneObjectList *OwnerList) {
_lookLineNum = 7;
_useLineNum = 8;
BF_GLOBALS._sceneItems.push_back(this);
- scene->_field2DD8 = 0;
+ scene->_breakerButtonCtr = 0;
- _object13.setupBreaker(115, 44, 1, BF_GLOBALS._v4CECE[0]);
- _object14.setupBreaker(116, 63, 2, BF_GLOBALS._v4CECE[1]);
- _object15.setupBreaker(116, 69, 2, BF_GLOBALS._v4CECE[2]);
- _object16.setupBreaker(115, 76, 1, BF_GLOBALS._v4CECE[3]);
- _object17.setupBreaker(115, 95, 1, BF_GLOBALS._v4CECE[4]);
- _object18.setupBreaker(116, 114, 2, BF_GLOBALS._v4CECE[5]);
- _object19.setupBreaker(116, 120, 2, BF_GLOBALS._v4CECE[6]);
- _object20.setupBreaker(188, 45, 2, BF_GLOBALS._v4CECE[7]);
- _object21.setupBreaker(188, 51, 2, BF_GLOBALS._v4CECE[8]);
- _object22.setupBreaker(179, 59, 1, BF_GLOBALS._v4CECE[9]);
- _object23.setupBreaker(187, 78, 2, BF_GLOBALS._v4CECE[10]);
- _object24.setupBreaker(187, 84, 2, BF_GLOBALS._v4CECE[11]);
+ _object13.setupBreaker(115, 44, 1, BF_GLOBALS._breakerBoxStatusArr[0]);
+ _object14.setupBreaker(116, 63, 2, BF_GLOBALS._breakerBoxStatusArr[1]);
+ _object15.setupBreaker(116, 69, 2, BF_GLOBALS._breakerBoxStatusArr[2]);
+ _object16.setupBreaker(115, 76, 1, BF_GLOBALS._breakerBoxStatusArr[3]);
+ _object17.setupBreaker(115, 95, 1, BF_GLOBALS._breakerBoxStatusArr[4]);
+ _object18.setupBreaker(116, 114, 2, BF_GLOBALS._breakerBoxStatusArr[5]);
+ _object19.setupBreaker(116, 120, 2, BF_GLOBALS._breakerBoxStatusArr[6]);
+ _object20.setupBreaker(188, 45, 2, BF_GLOBALS._breakerBoxStatusArr[7]);
+ _object21.setupBreaker(188, 51, 2, BF_GLOBALS._breakerBoxStatusArr[8]);
+ _object22.setupBreaker(179, 59, 1, BF_GLOBALS._breakerBoxStatusArr[9]);
+ _object23.setupBreaker(187, 78, 2, BF_GLOBALS._breakerBoxStatusArr[10]);
+ _object24.setupBreaker(187, 84, 2, BF_GLOBALS._breakerBoxStatusArr[11]);
- _object25.subEBBDC(178, 90, 1, BF_GLOBALS._v4CECE[12]);
- _object26.subEBBDC(178, 108, 2, BF_GLOBALS._v4CECE[13]);
+ _object25.setupHiddenSwitch(178, 90, 1, BF_GLOBALS._breakerBoxStatusArr[12]);
+ _object26.setupHiddenSwitch(178, 108, 2, BF_GLOBALS._breakerBoxStatusArr[13]);
}
void Scene910::BreakerBoxInset::remove() {
@@ -1231,7 +1233,7 @@ void Scene910::BreakerBoxInset::remove() {
_object27.remove();
_object28.remove();
- if ((BF_GLOBALS._v4CECE[13] < 4) && (scene->_breakerBox._frame > 1))
+ if ((BF_GLOBALS._breakerBoxStatusArr[13] < 4) && (scene->_breakerBox._frame > 1))
scene->_breakerBox.animate(ANIM_MODE_6, NULL);
FocusObject::remove();
@@ -1239,20 +1241,20 @@ void Scene910::BreakerBoxInset::remove() {
void Scene910::Object13::synchronize(Serializer &s) {
NamedObject::synchronize(s);
- s.syncAsSint16LE(_field90);
- s.syncAsSint16LE(_field92);
+ s.syncAsSint16LE(_state);
+ s.syncAsSint16LE(_mode);
}
bool Scene910::Object13::startAction(CursorType action, Event &event) {
static uint32 black = 0;
Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
- int8 var2;
+ int8 xDiff;
- if (_field92 == 1)
- var2 = 12;
+ if (_mode == 1)
+ xDiff = 12;
else
- var2 = 7;
+ xDiff = 7;
switch (action) {
case CURSOR_LOOK:
@@ -1264,8 +1266,8 @@ bool Scene910::Object13::startAction(CursorType action, Event &event) {
return true;
case CURSOR_USE:
scene->_sound2.play(101);
- if (event.mousePos.x <= _position.x + var2) {
- if (_field92 != 1) {
+ if (event.mousePos.x <= _position.x + xDiff) {
+ if (_mode != 1) {
if (_frame > 6)
setFrame(_frame - 1);
} else {
@@ -1273,7 +1275,7 @@ bool Scene910::Object13::startAction(CursorType action, Event &event) {
setFrame(_frame - 1);
}
} else {
- if (_field92 == 1) {
+ if (_mode == 1) {
if (_frame < 3)
setFrame(_frame + 1);
} else {
@@ -1282,18 +1284,18 @@ bool Scene910::Object13::startAction(CursorType action, Event &event) {
}
}
- if (_field92 != 1)
- BF_GLOBALS._v4CECE[_field90 - 1] = (_field90 + 251) % 256;
+ if (_mode != 1)
+ BF_GLOBALS._breakerBoxStatusArr[_state - 1] = (_frame + 251) % 256;
else
- BF_GLOBALS._v4CECE[_field90 - 1] = _field90;
+ BF_GLOBALS._breakerBoxStatusArr[_state - 1] = _frame;
- switch (_field90) {
+ switch (_state) {
case 1:
if (BF_GLOBALS._v4CEE2 < 1) {
if (_frame == 2) {
- if (!BF_GLOBALS.getFlag(81)) {
+ if (!BF_GLOBALS.getFlag(fGotPointsForClosingDoor)) {
T2_GLOBALS._uiElements.addScore(30);
- BF_GLOBALS.setFlag(81);
+ BF_GLOBALS.setFlag(fGotPointsForClosingDoor);
}
scene->_sceneMode = 0;
if (BF_GLOBALS._dayNumber == 5) {
@@ -1302,7 +1304,7 @@ bool Scene910::Object13::startAction(CursorType action, Event &event) {
// _objectList.draw();
BF_GLOBALS._player.disableControl();
scene->_lyle.setVisage(912);
- scene->_object7.remove();
+ scene->_shadow.remove();
scene->_action2.remove();
scene->_nico.postInit();
scene->_sceneMode = 9129;
@@ -1332,9 +1334,9 @@ bool Scene910::Object13::startAction(CursorType action, Event &event) {
// _objectList.draw();
} else {
if (BF_GLOBALS._v4CEC8 == 1) {
- if (!BF_GLOBALS.getFlag(78)) {
+ if (!BF_GLOBALS.getFlag(fGotPointsForStartGenerator)) {
T2_GLOBALS._uiElements.addScore(30);
- BF_GLOBALS.setFlag(78);
+ BF_GLOBALS.setFlag(fGotPointsForStartGenerator);
}
BF_GLOBALS._player.disableControl();
BF_GLOBALS._v4CEC8 = 0;
@@ -1351,7 +1353,7 @@ bool Scene910::Object13::startAction(CursorType action, Event &event) {
return true;
case 4:
if (_frame == 2) {
- if (BF_GLOBALS._v4CECE[4] == 2) {
+ if (BF_GLOBALS._breakerBoxStatusArr[4] == 2) {
scene->_action1.setActionIndex(2);
scene->_action1.signal();
}
@@ -1362,7 +1364,7 @@ bool Scene910::Object13::startAction(CursorType action, Event &event) {
return true;
case 5:
if (_frame == 2) {
- if (BF_GLOBALS._v4CECE[3] == 2) {
+ if (BF_GLOBALS._breakerBoxStatusArr[3] == 2) {
scene->_action1.setActionIndex(2);
scene->_action1.signal();
}
@@ -1372,11 +1374,11 @@ bool Scene910::Object13::startAction(CursorType action, Event &event) {
}
return true;
case 15:
- if ((BF_GLOBALS._v4CECA == 2) && (BF_GLOBALS._v4CECE[17] == 1)) {
+ if ((BF_GLOBALS._v4CECA == 2) && (BF_GLOBALS._breakerBoxStatusArr[17] == 1)) {
if (_frame == 7)
- scene->subE83E1();
+ scene->closeHiddenDoor();
else
- scene->subE82BD();
+ scene->openHiddenDoor();
}
return true;
default:
@@ -1397,9 +1399,9 @@ void Scene910::Object13::setupBreaker(int x, int y, int mode, int8 frameNumber)
Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
NamedObject::postInit();
- _field92 = mode;
- scene->_field2DD8++;
- _field90 = scene->_field2DD8;
+ _mode = mode;
+ scene->_breakerButtonCtr++;
+ _state = scene->_breakerButtonCtr;
setVisage(910);
if (mode == 1) {
@@ -1432,18 +1434,18 @@ bool Scene910::Object25::startAction(CursorType action, Event &event) {
SceneItem::display2(910, 11);
return true;
case CURSOR_USE:
- _field92 = BF_GLOBALS._v4CECE[_field90 + 11];
+ _field92 = BF_GLOBALS._breakerBoxStatusArr[_field90 + 11];
switch (_field92 - 1) {
case 0:
_field92 = 2;
setStrip(7);
setFrame(1);
if (_field90 == 1) {
- scene->_field2DD8 = 14;
- scene->_breakerBoxInset._object27.setupBreaker(182, 92, 2, BF_GLOBALS._v4CECE[14]);
+ scene->_breakerButtonCtr = 14;
+ scene->_breakerBoxInset._object27.setupBreaker(182, 92, 2, BF_GLOBALS._breakerBoxStatusArr[14]);
} else {
- scene->_field2DD8 = 15;
- scene->_breakerBoxInset._object28.init(178, 108, 0, BF_GLOBALS._v4CECE[15]);
+ scene->_breakerButtonCtr = 15;
+ scene->_breakerBoxInset._object28.init(178, 108, 0, BF_GLOBALS._breakerBoxStatusArr[15]);
}
SceneItem::display2(910, 12);
break;
@@ -1461,11 +1463,11 @@ bool Scene910::Object25::startAction(CursorType action, Event &event) {
setStrip(7);
setFrame(1);
if (_field90 == 1) {
- scene->_field2DD8 = 14;
- scene->_breakerBoxInset._object27.setupBreaker(182, 96, 2, BF_GLOBALS._v4CECE[14]);
+ scene->_breakerButtonCtr = 14;
+ scene->_breakerBoxInset._object27.setupBreaker(182, 96, 2, BF_GLOBALS._breakerBoxStatusArr[14]);
} else {
- scene->_field2DD8 = 15;
- scene->_breakerBoxInset._object28.init(178, 108, 0, BF_GLOBALS._v4CECE[15]);
+ scene->_breakerButtonCtr = 15;
+ scene->_breakerBoxInset._object28.init(178, 108, 0, BF_GLOBALS._breakerBoxStatusArr[15]);
}
break;
case 3:
@@ -1475,7 +1477,7 @@ bool Scene910::Object25::startAction(CursorType action, Event &event) {
break;
}
- BF_GLOBALS._v4CECE[_field90 + 11] = _field92;
+ BF_GLOBALS._breakerBoxStatusArr[_field90 + 11] = _field92;
return true;
default:
return NamedObject::startAction(action, event);
@@ -1488,11 +1490,11 @@ void Scene910::Object25::remove() {
SceneObject::remove();
}
-void Scene910::Object25::subEBBDC(int x, int y, int arg8, int argA) {
+void Scene910::Object25::setupHiddenSwitch(int x, int y, int arg8, int argA) {
Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
NamedObject::postInit();
- scene->_field2DD8++;
+ scene->_breakerButtonCtr++;
_field90 = arg8;
_field92 = argA;
setVisage(910);
@@ -1504,11 +1506,11 @@ void Scene910::Object25::subEBBDC(int x, int y, int arg8, int argA) {
setStrip(7);
setFrame(1);
if (_field90 == 1) {
- scene->_field2DD8 = 14;
- scene->_breakerBoxInset._object27.setupBreaker(182, 96, 2, BF_GLOBALS._v4CECE[14]);
+ scene->_breakerButtonCtr = 14;
+ scene->_breakerBoxInset._object27.setupBreaker(182, 96, 2, BF_GLOBALS._breakerBoxStatusArr[14]);
} else {
- scene->_field2DD8 = 15;
- scene->_breakerBoxInset._object28.init(178, 108, 0, BF_GLOBALS._v4CECE[15]);
+ scene->_breakerButtonCtr = 15;
+ scene->_breakerBoxInset._object28.init(178, 108, 0, BF_GLOBALS._breakerBoxStatusArr[15]);
}
}
@@ -1529,7 +1531,7 @@ bool Scene910::BlackPlug::startAction(CursorType action, Event &event) {
SET_EXT_FGCOLOR, 13, LIST_END);
return true;
case CURSOR_USE:
- switch (_frame - _field90 - 2) {
+ switch (_frame - _state - 2) {
case 0:
SceneItem::display(910, 15, SET_WIDTH, 312,
SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
@@ -1544,11 +1546,11 @@ bool Scene910::BlackPlug::startAction(CursorType action, Event &event) {
BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, 910);
} else if (BF_GLOBALS._v4CECA == 2) {
BF_GLOBALS._v4CECA = 1;
- BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 3 - _field90);
+ BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 3 - _state);
BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, 1);
scene->_blackCord.setPosition(Common::Point(540, 100));
}
- setFrame(_field90 + 2);
+ setFrame(_state + 2);
break;
case 2:
if (BF_GLOBALS._v4CECC == 1) {
@@ -1557,14 +1559,14 @@ bool Scene910::BlackPlug::startAction(CursorType action, Event &event) {
BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 910);
} else if (BF_GLOBALS._v4CECC == 2) {
BF_GLOBALS._v4CECC = 1;
- BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 3 - _field90);
+ BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 3 - _state);
BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 1);
scene->_yellowCord.setPosition(Common::Point(540, 100));
}
- setFrame(_field90 + 2);
+ setFrame(_state + 2);
break;
case 3:
- if ((_position.x - 12) - (5 * _field90) < event.mousePos.x) {
+ if ((_position.x - 12) - (5 * _state) < event.mousePos.x) {
if (BF_GLOBALS._v4CECA == 1) {
BF_GLOBALS._v4CECA = 0;
BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 1);
@@ -1572,11 +1574,11 @@ bool Scene910::BlackPlug::startAction(CursorType action, Event &event) {
scene->_blackCord.setPosition(Common::Point(540, 100));
} else if (BF_GLOBALS._v4CECA == 2) {
BF_GLOBALS._v4CECA = 1;
- BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 3 - _field90);
+ BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 3 - _state);
BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, 1);
scene->_blackCord.setPosition(Common::Point(540, 100));
}
- setFrame(_field90 + 4);
+ setFrame(_state + 4);
} else {
if (BF_GLOBALS._v4CECC == 1) {
BF_GLOBALS._v4CECC = 0;
@@ -1584,25 +1586,25 @@ bool Scene910::BlackPlug::startAction(CursorType action, Event &event) {
BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 910);
} else if (BF_GLOBALS._v4CECC == 2) {
BF_GLOBALS._v4CECC = 1;
- BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 3 - _field90);
+ BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 3 - _state);
BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 1);
scene->_yellowCord.setPosition(Common::Point(540, 100));
}
- setFrame(_field90 + 3);
+ setFrame(_state + 3);
}
default:
break;
}
- BF_GLOBALS._v4CECE[_field90 + 15] = _frame;
- if (_field90 == 0) {
+ BF_GLOBALS._breakerBoxStatusArr[_state + 15] = _frame;
+ if (_state == 0) {
if (_frame == 2)
- BF_GLOBALS._v4CECE[13] = 2;
+ BF_GLOBALS._breakerBoxStatusArr[13] = 2;
else
- BF_GLOBALS._v4CECE[13] = 4;
+ BF_GLOBALS._breakerBoxStatusArr[13] = 4;
}
return true;
case INV_HALF_YELLOW_CORD:
- if (BF_INVENTORY.getObjectScene(INV_YELLOW_CORD) == _field90 + 2) {
+ if (BF_INVENTORY.getObjectScene(INV_YELLOW_CORD) == _state + 2) {
SceneItem::display(910, 85, SET_WIDTH, 312,
SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
@@ -1622,31 +1624,30 @@ bool Scene910::BlackPlug::startAction(CursorType action, Event &event) {
case INV_YELLOW_CORD:
if (BF_GLOBALS._v4CECC == 0) {
BF_GLOBALS._v4CECC = 1;
- BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, _field90 + 2);
+ BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, _state + 2);
BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 1);
} else if (BF_GLOBALS._v4CECC == 1) {
BF_GLOBALS._v4CECC = 2;
- BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, _field90 + 2);
+ BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, _state + 2);
scene->_yellowCord.setStrip(4);
scene->_yellowCord.setFrame(2);
scene->_yellowCord.setPosition(Common::Point(135, 93));
scene->_yellowCord.fixPriority(50);
}
- if (_frame - _field90 == 2)
- setFrame(_field90 + 4);
- else if (_frame - _field90 == 3)
- setFrame(_field90 + 5);
- BF_GLOBALS._v4CECE[15 + _field90] = _frame;
- BF_GLOBALS._v4CECE[_field90 + 15] = _frame;
- if (_field90 == 0) {
+ if (_frame - _state == 2)
+ setFrame(_state + 4);
+ else if (_frame - _state == 3)
+ setFrame(_state + 5);
+ BF_GLOBALS._breakerBoxStatusArr[_state + 15] = _frame;
+ if (_state == 0) {
if (_frame == 2)
- BF_GLOBALS._v4CECE[13] = 2;
+ BF_GLOBALS._breakerBoxStatusArr[13] = 2;
else
- BF_GLOBALS._v4CECE[13] = 4;
+ BF_GLOBALS._breakerBoxStatusArr[13] = 4;
}
return true;
case INV_HALF_BLACK_CORD:
- if (BF_INVENTORY.getObjectScene(INV_BLACK_CORD) == _field90 + 2) {
+ if (BF_INVENTORY.getObjectScene(INV_BLACK_CORD) == _state + 2) {
SceneItem::display(910, 85, SET_WIDTH, 312,
SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
@@ -1657,7 +1658,7 @@ bool Scene910::BlackPlug::startAction(CursorType action, Event &event) {
//No break on purpose
case INV_BLACK_CORD:
if (BF_GLOBALS._v4CECA == 0) {
- if (_field90 == 1) {
+ if (_state == 1) {
if (!BF_GLOBALS.getFlag(fGotPointsForBlackCord)) {
T2_GLOBALS._uiElements.addScore(30);
BF_GLOBALS.setFlag(fGotPointsForBlackCord);
@@ -1669,10 +1670,10 @@ bool Scene910::BlackPlug::startAction(CursorType action, Event &event) {
}
}
BF_GLOBALS._v4CECA = 1;
- BF_INVENTORY.setObjectScene(INV_BLACK_CORD, _field90 + 2);
+ BF_INVENTORY.setObjectScene(INV_BLACK_CORD, _state + 2);
BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, 1);
} else if (BF_GLOBALS._v4CECA == 1) {
- if (_field90 == 1) {
+ if (_state == 1) {
if (!BF_GLOBALS.getFlag(fGotPointsForBlackCord)) {
T2_GLOBALS._uiElements.addScore(30);
BF_GLOBALS.setFlag(fGotPointsForBlackCord);
@@ -1684,31 +1685,30 @@ bool Scene910::BlackPlug::startAction(CursorType action, Event &event) {
}
}
BF_GLOBALS._v4CECA = 2;
- BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, _field90 + 2);
+ BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, _state + 2);
scene->_blackCord.setStrip(4);
scene->_blackCord.setFrame(1);
scene->_blackCord.setPosition(Common::Point(135, 93));
scene->_blackCord.fixPriority(50);
scene->_blackCord.show();
scene->_blackCord._field90 = 1;
- if (BF_GLOBALS._v4CECE[17] == 1) {
- if (BF_GLOBALS._v4CECE[14] == 2)
- scene->subE83E1();
+ if (BF_GLOBALS._breakerBoxStatusArr[17] == 1) {
+ if (BF_GLOBALS._breakerBoxStatusArr[14] == 2)
+ scene->closeHiddenDoor();
else
- scene->subE82BD();
+ scene->openHiddenDoor();
}
}
- if (_frame - _field90 == 2)
- setFrame(_field90 + 3);
- else if (_frame - _field90 == 4)
- setFrame(_field90 + 5);
- BF_GLOBALS._v4CECE[15 + _field90] = _frame;
- BF_GLOBALS._v4CECE[_field90 + 15] = _frame;
- if (_field90 == 0) {
+ if (_frame - _state == 2)
+ setFrame(_state + 3);
+ else if (_frame - _state == 4)
+ setFrame(_state + 5);
+ BF_GLOBALS._breakerBoxStatusArr[_state + 15] = _frame;
+ if (_state == 0) {
if (_frame == 2)
- BF_GLOBALS._v4CECE[13] = 2;
+ BF_GLOBALS._breakerBoxStatusArr[13] = 2;
else
- BF_GLOBALS._v4CECE[13] = 4;
+ BF_GLOBALS._breakerBoxStatusArr[13] = 4;
}
return true;
default:
@@ -1718,10 +1718,10 @@ bool Scene910::BlackPlug::startAction(CursorType action, Event &event) {
void Scene910::BlackPlug::init(int x, int y, int arg8, int8 argA) {
NamedObject::postInit();
- _field90 = arg8;
- _field92 = argA;
+ _state = arg8;
+ _mode = argA;
setVisage(910);
- if (_field90 == 0)
+ if (_state == 0)
setStrip(7);
else
setStrip(3);
@@ -1745,11 +1745,11 @@ void Scene910::GeneratorInset::postInit(SceneObjectList *OwnerList) {
_useLineNum = 87;
BF_GLOBALS._sceneItems.push_front(this);
- scene->_field2DD8 = 16;
- _blackPlug.init(142, 86, 1, BF_GLOBALS._v4CECE[16]);
+ scene->_breakerButtonCtr = 16;
+ _blackPlug.init(142, 86, 1, BF_GLOBALS._breakerBoxStatusArr[16]);
- scene->_field2DD8 = 17;
- _powerButton.init(BF_GLOBALS._v4CECE[17]);
+ scene->_breakerButtonCtr = 17;
+ _powerButton.init(BF_GLOBALS._breakerBoxStatusArr[17]);
}
void Scene910::GeneratorInset::remove() {
@@ -1770,30 +1770,30 @@ bool Scene910::PowerButton::startAction(CursorType action, Event &event) {
if (_frame == 4) {
scene->_sound1.play(100);
scene->_sound1.holdAt(1);
- if (!BF_GLOBALS.getFlag(77)) {
+ if (!BF_GLOBALS.getFlag(fGotPointsForFuseBoxPlug)) {
T2_GLOBALS._uiElements.addScore(30);
- BF_GLOBALS.setFlag(77);
+ BF_GLOBALS.setFlag(fGotPointsForFuseBoxPlug);
}
setFrame(5);
_object32.setFrame(7);
if (BF_GLOBALS._v4CECA == 2) {
- if (BF_GLOBALS._v4CECE[14] == 2)
- scene->subE83E1();
+ if (BF_GLOBALS._breakerBoxStatusArr[14] == 2)
+ scene->closeHiddenDoor();
else
- scene->subE82BD();
+ scene->openHiddenDoor();
}
} else {
scene->_sound1.release();
- if (BF_GLOBALS._bookmark == 21) {
- if (!BF_GLOBALS.getFlag(82)) {
+ if (BF_GLOBALS._bookmark == bEndDayThree) {
+ if (!BF_GLOBALS.getFlag(fGotPointsForLightsOff)) {
T2_GLOBALS._uiElements.addScore(30);
- BF_GLOBALS.setFlag(82);
+ BF_GLOBALS.setFlag(fGotPointsForLightsOff);
}
}
setFrame(4);
_object32.setFrame(6);
}
- BF_GLOBALS._v4CECE[17] = (_frame + 252) % 256;
+ BF_GLOBALS._breakerBoxStatusArr[17] = (_frame + 252) % 256;
return true;
} else
return NamedObject::startAction(action, event);
@@ -1855,7 +1855,7 @@ bool Scene910::Item2::startAction(CursorType action, Event &event) {
if (action == 59) {
BF_GLOBALS._player.disableControl();
scene->_destPos = Common::Point(151, 186);
- scene->_field2DDA = 5;
+ scene->_sceneSubMode = 5;
scene->_sceneMode = 9123;
if (BF_GLOBALS._player._visage == 1911)
scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
@@ -1880,7 +1880,7 @@ bool Scene910::Item3::startAction(CursorType action, Event &event) {
}
bool Scene910::Item9::startAction(CursorType action, Event &event) {
- if (BF_GLOBALS._v4CEE0 == 0)
+ if (BF_GLOBALS._hiddenDoorStatus == 0)
return NamedHotspot::startAction(action, event);
else
return false;
@@ -1907,13 +1907,13 @@ bool Scene910::Item15::startAction(CursorType action, Event &event) {
bool Scene910::Item16::startAction(CursorType action, Event &event) {
Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
- if ((BF_GLOBALS._v4CEE0 == 0) || (BF_GLOBALS._v4CEE2 != 0))
+ if ((BF_GLOBALS._hiddenDoorStatus == 0) || (BF_GLOBALS._v4CEE2 != 0))
return false;
if (BF_GLOBALS._player._visage == 1911) {
BF_GLOBALS._player.disableControl();
scene->_destPos = Common::Point(292, 100);
- scene->_field2DDA = 0;
+ scene->_sceneSubMode = 0;
scene->_sceneMode = 9123;
scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL);
} else {
@@ -1940,8 +1940,8 @@ void Scene910::remove() {
void Scene910::synchronize(Serializer &s) {
PalettedScene::synchronize(s);
- s.syncAsSint16LE(_field2DDA);
- s.syncAsSint16LE(_field2DD8);
+ s.syncAsSint16LE(_sceneSubMode);
+ s.syncAsSint16LE(_breakerButtonCtr);
s.syncAsSint16LE(_field2DE0);
s.syncAsSint16LE(_field2DE2);
s.syncAsSint16LE(_field2DE4);
@@ -1979,7 +1979,7 @@ void Scene910::postInit(SceneObjectList *OwnerList) {
_vent.postInit();
_vent.setVisage(910);
- if ((BF_GLOBALS._v4CECE[3] == 2) && (BF_GLOBALS._v4CECE[4] == 2)) {
+ if ((BF_GLOBALS._breakerBoxStatusArr[3] == 2) && (BF_GLOBALS._breakerBoxStatusArr[4] == 2)) {
_action1.setActionIndex(4);
} else {
_vent.animate(ANIM_MODE_2, NULL);
@@ -2019,10 +2019,10 @@ void Scene910::postInit(SceneObjectList *OwnerList) {
if (BF_GLOBALS._v4CEE2 == 0)
_item16.setDetails(Rect(265, 18, 319, 102), 910, -1, -1, -1, 1, NULL);
- _breakerBox.setDetails(910, 6, -1, -1, 1, NULL);
+ _breakerBox.setDetails(910, 6, -1, -1, 1, (SceneItem *)NULL);
_item15.setDetails(Rect(0, 0, 320, 170), 910, 0, 1, 2, 1, NULL);
- _yellowCord.setDetails(910, 52, 53, -1, 1, NULL);
- _blackCord.setDetails(910, 54, 55, -1, 1, NULL);
+ _yellowCord.setDetails(910, 52, 53, -1, 1, (SceneItem *)NULL);
+ _blackCord.setDetails(910, 54, 55, -1, 1, (SceneItem *)NULL);
_item2.setDetails(3, 910, 22, -1, 24, 1);
_item4.setDetails(1, 910, 16, 17, 18, 1);
_item8.setDetails(4, 910, 25, 26, 27, 1);
@@ -2032,7 +2032,7 @@ void Scene910::postInit(SceneObjectList *OwnerList) {
_item9.setDetails(Rect(266, 39, 274, 70), 910, 43, 44, 45, 1, NULL);
_item10.setDetails(Rect(276, 27, 288, 83), 910, 46, 47, 48, 1, NULL);
_item11.setDetails(Rect(295, 42, 312, 87), 910, 49, 50, 51, 1, NULL);
- _fakeWall.setDetails(910, 28, -1, 30, 1, NULL);
+ _fakeWall.setDetails(910, 28, -1, 30, 1, (SceneItem *)NULL);
_item3.setDetails(7, 910, 59, 60, 61, 1);
_item5.setDetails(2, 910, 19, 20, 21, 1);
_backWall.setDetails(6, 910, 28, 29, 30, 1);
@@ -2041,7 +2041,7 @@ void Scene910::postInit(SceneObjectList *OwnerList) {
if (BF_GLOBALS._dayNumber == 0) {
BF_GLOBALS._dayNumber = 5;
BF_GLOBALS._sceneManager._previousScene = 900;
- BF_GLOBALS.setFlag(7);
+ BF_GLOBALS.setFlag(fWithLyle);
}
if ( (BF_GLOBALS._sceneManager._previousScene == 910)
@@ -2055,11 +2055,11 @@ void Scene910::postInit(SceneObjectList *OwnerList) {
_field2DE0 = 0;
_field2DE2 = 0;
_field2DE4 = 0;
- BF_GLOBALS.clearFlag(34);
+ BF_GLOBALS.clearFlag(fCanDrawGun);
_lyle._position.x = 0;
if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._sceneManager._previousScene == 900)){
- BF_GLOBALS.setFlag(34);
+ BF_GLOBALS.setFlag(fCanDrawGun);
BF_GLOBALS._v4CEC8 = 0;
BF_GLOBALS._player.setVisage(129);
@@ -2071,21 +2071,21 @@ void Scene910::postInit(SceneObjectList *OwnerList) {
_lyle._field90 = 0;
_lyle.setDetails(910, 69, 70, 71, 5, &_item4);
- BF_GLOBALS._v4CECE[0] = 3;
- BF_GLOBALS._v4CECE[12] = 2;
- BF_GLOBALS._v4CECE[13] = 4;
- BF_GLOBALS._v4CECE[14] = 3;
- BF_GLOBALS._v4CECE[15] = 3;
- BF_GLOBALS._v4CECE[16] = 4;
- BF_GLOBALS._v4CECE[17] = 1;
+ BF_GLOBALS._breakerBoxStatusArr[0] = 3;
+ BF_GLOBALS._breakerBoxStatusArr[12] = 2;
+ BF_GLOBALS._breakerBoxStatusArr[13] = 4;
+ BF_GLOBALS._breakerBoxStatusArr[14] = 3;
+ BF_GLOBALS._breakerBoxStatusArr[15] = 3;
+ BF_GLOBALS._breakerBoxStatusArr[16] = 4;
+ BF_GLOBALS._breakerBoxStatusArr[17] = 1;
BF_GLOBALS._v4CECA = 2;
- BF_GLOBALS._v4CEE0 = 1;
+ BF_GLOBALS._hiddenDoorStatus = 1;
_yellowCord.setPosition(Common::Point(291, -30));
BF_GLOBALS._v4CECC = 0;
}
if (BF_GLOBALS._sceneManager._previousScene == 920) {
- BF_GLOBALS.setFlag(34);
+ BF_GLOBALS.setFlag(fCanDrawGun);
BF_GLOBALS._player.setPosition(Common::Point(276, 119));
BF_GLOBALS._player.setStrip(6);
if (BF_GLOBALS._v4CECC == 0)
@@ -2116,7 +2116,7 @@ void Scene910::postInit(SceneObjectList *OwnerList) {
}
BF_GLOBALS._player.enableControl();
} else if (BF_GLOBALS._sceneManager._previousScene == 935) {
- BF_GLOBALS.setFlag(34);
+ BF_GLOBALS.setFlag(fCanDrawGun);
BF_GLOBALS._v4CEC8 = 0;
_lyle.postInit();
_lyle.setVisage(916);
@@ -2125,11 +2125,11 @@ void Scene910::postInit(SceneObjectList *OwnerList) {
_lyle.setFrame(3);
_lyle._field90 = 1;
_lyle.setDetails(910, 69, 70 ,71 , 5, &_item4);
-
- BF_GLOBALS._walkRegions.proc1(15);
- BF_GLOBALS._walkRegions.proc1(16);
- BF_GLOBALS._walkRegions.proc1(14);
- BF_GLOBALS._walkRegions.proc1(10);
+
+ BF_GLOBALS._walkRegions.disableRegion(15);
+ BF_GLOBALS._walkRegions.disableRegion(16);
+ BF_GLOBALS._walkRegions.disableRegion(14);
+ BF_GLOBALS._walkRegions.disableRegion(10);
if (BF_GLOBALS.getFlag(gunDrawn)) {
BF_GLOBALS._player.setVisage(1911);
BF_GLOBALS._player.animate(ANIM_MODE_NONE, 0, NULL);
@@ -2153,13 +2153,13 @@ void Scene910::postInit(SceneObjectList *OwnerList) {
else
add2Faders((const byte *)&unk_50E90, 2, 911, this);
} else {
- BF_GLOBALS.clearFlag(8);
+ BF_GLOBALS.clearFlag(gunDrawn);
BF_GLOBALS._player.disableControl();
}
if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._v4CEE2 == 0)){
- _object7.postInit();
- _object7.setAction(&_action2);
+ _shadow.postInit();
+ _shadow.setAction(&_action2);
}
if (BF_INVENTORY.getObjectScene(INV_YELLOW_CORD) == 1)
@@ -2197,22 +2197,22 @@ void Scene910::postInit(SceneObjectList *OwnerList) {
if (BF_GLOBALS._v4CEC8 == 0)
_object5.hide();
- if (BF_GLOBALS._v4CEE0 == 0) {
+ if (BF_GLOBALS._hiddenDoorStatus == 0) {
_object5.setFrame(1);
_fakeWall.setPosition(Common::Point(292, 107));
if (BF_GLOBALS._v4CECC != 2)
_yellowCord.setPosition(Common::Point(288, 57));
- BF_GLOBALS._walkRegions.proc1(10);
+ BF_GLOBALS._walkRegions.disableRegion(10);
} else {
_object5.setFrame(6);
_fakeWall.setPosition(Common::Point(295, 20));
_fakeWall.hide();
if (BF_GLOBALS._v4CECC != 2)
_yellowCord.setPosition(Common::Point(291, -30));
- BF_GLOBALS._walkRegions.proc1(10);
+ BF_GLOBALS._walkRegions.enableRegion(10);
}
- if (BF_GLOBALS._v4CECE[17] != 0) {
+ if (BF_GLOBALS._breakerBoxStatusArr[17] != 0) {
_sound1.play(100);
_sound1.holdAt(1);
}
@@ -2315,8 +2315,8 @@ void Scene910::signal() {
_sceneMode = 10;
addFader((const byte *)&black, 2, this);
BF_GLOBALS._v4CEE2 = 1;
- BF_GLOBALS._walkRegions.proc1(16);
- BF_GLOBALS._walkRegions.proc1(14);
+ BF_GLOBALS._walkRegions.disableRegion(16);
+ BF_GLOBALS._walkRegions.disableRegion(14);
BF_GLOBALS._sceneItems.remove(&_item16);
break;
case 17:
@@ -2375,11 +2375,11 @@ void Scene910::signal() {
break;
case 9100:
if (BF_GLOBALS._dayNumber == 5)
- BF_GLOBALS._walkRegions.proc1(1);
+ BF_GLOBALS._walkRegions.disableRegion(1);
BF_GLOBALS._player.enableControl();
break;
case 9101:
- if ((BF_GLOBALS._v4CEE0 == 0) && (BF_GLOBALS._v4CEC8 != 0) && (BF_GLOBALS._v4CECE[17] == 0) && (BF_INVENTORY.getObjectScene(INV_YELLOW_CORD) == 910) && (BF_INVENTORY.getObjectScene(INV_BLACK_CORD) == 910))
+ if ((BF_GLOBALS._hiddenDoorStatus == 0) && (BF_GLOBALS._v4CEC8 != 0) && (BF_GLOBALS._breakerBoxStatusArr[17] == 0) && (BF_INVENTORY.getObjectScene(INV_YELLOW_CORD) == 910) && (BF_INVENTORY.getObjectScene(INV_BLACK_CORD) == 910))
BF_GLOBALS.clearFlag(fGotPointsForSearchingDA);
else
BF_GLOBALS.setFlag(fGotPointsForSearchingDA);
@@ -2387,7 +2387,7 @@ void Scene910::signal() {
BF_GLOBALS._sceneManager.changeScene(900);
break;
case 9102:
- if ((BF_GLOBALS._v4CECE[13] < 4) && (_breakerBox._frame == 1))
+ if ((BF_GLOBALS._breakerBoxStatusArr[13] < 4) && (_breakerBox._frame == 1))
_breakerBox.animate(ANIM_MODE_5, NULL);
BF_GLOBALS._player.enableControl();
@@ -2457,7 +2457,7 @@ void Scene910::signal() {
_nico.postInit();
_nico.setDetails(910, 63, 64, 65, 5, &_item4);
BF_GLOBALS._v4CEE6 = 0;
- _object7.postInit();
+ _shadow.postInit();
_action2.remove();
_sceneMode = 9116;
setAction(&_sequenceManager1, this, 9116, &_nico, NULL);
@@ -2490,7 +2490,7 @@ void Scene910::signal() {
BF_GLOBALS._player.enableControl();
break;
case 9120:
- BF_GLOBALS._walkRegions.proc1(7);
+ BF_GLOBALS._walkRegions.disableRegion(7);
BF_GLOBALS._player.enableControl();
break;
case 9121:
@@ -2505,7 +2505,7 @@ void Scene910::signal() {
break;
case 9123:
BF_GLOBALS.clearFlag(gunDrawn);
- switch (_field2DDA - 1) {
+ switch (_sceneSubMode - 1) {
case 0:
_sceneMode = 9102;
setAction(&_sequenceManager1, this, 9102, &BF_GLOBALS._player, NULL);
@@ -2600,7 +2600,7 @@ void Scene910::signal() {
BF_GLOBALS.setFlag(fBackupAt340);
BF_GLOBALS._v4CEE2 = 4;
_stuart.postInit();
- _nico.setDetails(910, 72, 73, 74, 3, NULL);
+ _nico.setDetails(910, 72, 73, 74, 3, (SceneItem *)NULL);
_stuart.setDetails(910, 66, 67, 68, 5, &_nico);
BF_GLOBALS._v4CEE8 = 0;
_sceneMode = 9121;
@@ -2622,9 +2622,9 @@ void Scene910::signal() {
break;
case 9130:
_lyle.setAction(&_sequenceManager2, NULL, 9133, &_lyle, NULL);
- BF_GLOBALS._v4CECE[14] = 3;
- subE82BD();
- BF_GLOBALS._walkRegions.proc1(15);
+ BF_GLOBALS._breakerBoxStatusArr[14] = 3;
+ openHiddenDoor();
+ BF_GLOBALS._walkRegions.disableRegion(15);
break;
case 9132:
BF_GLOBALS._player.enableControl();
@@ -2644,7 +2644,7 @@ void Scene910::signal() {
BF_GLOBALS.setFlag(fGotPointsForCuffingNico);
}
_lyle.setAction(&_sequenceManager2, NULL, 9131, &_lyle, NULL);
- BF_GLOBALS._walkRegions.proc2(16);
+ BF_GLOBALS._walkRegions.enableRegion(16);
if (BF_GLOBALS._v4CEE2 == 4)
BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 0);
else
@@ -2655,7 +2655,7 @@ void Scene910::signal() {
setAction(&_sequenceManager1, this, 9139, &_forbes, &BF_GLOBALS._player, NULL);
break;
case 9139:
- BF_GLOBALS._walkRegions.proc1(4);
+ BF_GLOBALS._walkRegions.disableRegion(4);
_field2DE0 = 1;
BF_GLOBALS._player.enableControl();
break;
@@ -2730,7 +2730,7 @@ void Scene910::process(Event &event) {
if (_item17._bounds.contains(event.mousePos)) {
GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW);
BF_GLOBALS._events.setCursor(surface);
- } else if ((BF_GLOBALS._v4CEE0 == 0) || (BF_GLOBALS._v4CEE2 != 0)) {
+ } else if ((BF_GLOBALS._hiddenDoorStatus == 0) || (BF_GLOBALS._v4CEE2 != 0)) {
CursorType cursorId = BF_GLOBALS._events.getCursor();
BF_GLOBALS._events.setCursor(cursorId);
} else if (!_item16._bounds.contains(event.mousePos)) {
@@ -2781,7 +2781,7 @@ void Scene910::process(Event &event) {
if (BF_GLOBALS._player._visage == 1911) {
BF_GLOBALS._player.disableControl();
_destPos = event.mousePos;
- _field2DDA = 0;
+ _sceneSubMode = 0;
_sceneMode = 9123;
setAction(&_sequenceManager1, this, 9123, &BF_GLOBALS._player, NULL);
} else {
@@ -2792,7 +2792,7 @@ void Scene910::process(Event &event) {
} else if (BF_GLOBALS._player._visage == 1911) {
BF_GLOBALS._player.disableControl();
_destPos = event.mousePos;
- _field2DDA = 0;
+ _sceneSubMode = 0;
_sceneMode = 9123;
setAction(&_sequenceManager1, this, 9123, &BF_GLOBALS._player, NULL);
}
@@ -2813,17 +2813,17 @@ void Scene910::dispatch() {
setAction(&_sequenceManager1, this, 9101, &BF_GLOBALS._player, NULL);
} else {
_sceneMode = 9146;
- if (BF_GLOBALS._v4CEE0 == 0)
+ if (BF_GLOBALS._hiddenDoorStatus == 0)
setAction(&_sequenceManager1, this, 9146, &BF_GLOBALS._player, NULL);
else
setAction(&_sequenceManager1, this, 9145, &BF_GLOBALS._player, NULL);
}
}
- if ((BF_GLOBALS._player._position.x > 265) && (BF_GLOBALS._player._position.y < 102) && (BF_GLOBALS._v4CEE0 != 0) && (_sceneMode != 9143)) {
+ if ((BF_GLOBALS._player._position.x > 265) && (BF_GLOBALS._player._position.y < 102) && (BF_GLOBALS._hiddenDoorStatus != 0) && (_sceneMode != 9143)) {
BF_GLOBALS._player.disableControl();
if (BF_GLOBALS.getFlag(gunDrawn)) {
- _field2DDA = 3;
+ _sceneSubMode = 3;
_sceneMode = 9123;
setAction(&_sequenceManager1, this, 9123, &BF_GLOBALS._player, NULL);
} else if (BF_GLOBALS._v4CEE2 == 0) {
@@ -2840,9 +2840,9 @@ void Scene910::dispatch() {
}
}
- if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._player._position.x > 250) && (_sceneMode != 9135) && (_sceneMode != 11) && (BF_GLOBALS._v4CEE0 != 0) && (BF_GLOBALS._v4CEE2 == 0)) {
+ if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._player._position.x > 250) && (_sceneMode != 9135) && (_sceneMode != 11) && (BF_GLOBALS._hiddenDoorStatus != 0) && (BF_GLOBALS._v4CEE2 == 0)) {
BF_GLOBALS._player.disableControl();
- _object7.remove();
+ _shadow.remove();
_nico.remove();
_nico.postInit();
_nico.setDetails(910, 63, 64, 65, 5, &_item4);
@@ -2853,7 +2853,7 @@ void Scene910::dispatch() {
}
void Scene910::checkGun() {
- if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._v4CEE2 == 0) && (BF_GLOBALS._v4CEE0 != 0))
+ if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._v4CEE2 == 0) && (BF_GLOBALS._hiddenDoorStatus != 0))
SceneItem::display(910, 70, SET_WIDTH, 312,
SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4,
SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
@@ -2863,17 +2863,17 @@ void Scene910::checkGun() {
SceneExt::checkGun();
}
-void Scene910::subE82BD() {
- if (BF_GLOBALS._v4CEE0 != 0)
+void Scene910::openHiddenDoor() {
+ if (BF_GLOBALS._hiddenDoorStatus != 0)
return;
if (! BF_GLOBALS.getFlag(fGotPointsForLightsOn)) {
T2_GLOBALS._uiElements.addScore(50);
BF_GLOBALS.setFlag(fGotPointsForLightsOn);
}
- BF_GLOBALS._v4CEE0 = 1;
+ BF_GLOBALS._hiddenDoorStatus = 1;
BF_GLOBALS._player.disableControl();
- BF_GLOBALS._walkRegions.proc2(10);
+ BF_GLOBALS._walkRegions.enableRegion(10);
_sceneMode = 9114;
_sound2.play(42);
if ((BF_GLOBALS._v4CECC == 0) && (BF_INVENTORY.getObjectScene(INV_YELLOW_CORD) == 910))
@@ -2882,19 +2882,19 @@ void Scene910::subE82BD() {
setAction(&_sequenceManager1, this, 9114, &_fakeWall, &_object5, NULL);
}
-void Scene910::subE83E1() {
- if (BF_GLOBALS._v4CEE0 != 0) {
+void Scene910::closeHiddenDoor() {
+ if (BF_GLOBALS._hiddenDoorStatus != 0) {
_fakeWall.show();
- if ((BF_GLOBALS._bookmark == 21) && (!BF_GLOBALS.getFlag(80))) {
+ if ((BF_GLOBALS._bookmark == bEndDayThree) && (!BF_GLOBALS.getFlag(fGotPointsForOpeningDoor))) {
T2_GLOBALS._uiElements.addScore(30);
- BF_GLOBALS.setFlag(80);
+ BF_GLOBALS.setFlag(fGotPointsForOpeningDoor);
}
- BF_GLOBALS._v4CEE0 = 0;
- BF_GLOBALS._walkRegions.proc1(10);
+ BF_GLOBALS._hiddenDoorStatus = 0;
+ BF_GLOBALS._walkRegions.disableRegion(10);
BF_GLOBALS._player.disableControl();
_sceneMode = 9115;
_sound2.play(42);
- if ((BF_GLOBALS._v4CECC == 0) && (BF_INVENTORY.getObjectScene(57) == 910))
+ if ((BF_GLOBALS._v4CECC == 0) && (BF_INVENTORY.getObjectScene(INV_YELLOW_CORD) == 910))
setAction(&_sequenceManager1, this, 9128, &_fakeWall, &_yellowCord, &_object5, NULL);
else
setAction(&_sequenceManager1, this, 9115, &_fakeWall, &_object5, NULL);
@@ -2910,7 +2910,7 @@ void Scene910::subE83E1() {
BF_GLOBALS._player.disableControl();
_sceneMode = 9120;
BF_GLOBALS._player.setAction(&_sequenceManager2, NULL, 9120, &BF_GLOBALS._player, &_lyle, NULL);
- BF_GLOBALS._walkRegions.proc2(1);
+ BF_GLOBALS._walkRegions.enableRegion(1);
}
}
@@ -2941,7 +2941,7 @@ bool Scene920::Item1::startAction(CursorType action, Event &event) {
BF_GLOBALS._player.disableControl();
if (BF_GLOBALS.getFlag(fCrateOpen)) {
if (BF_GLOBALS._player._visage == 921) {
- if ((BF_INVENTORY.getObjectScene(15) != 1) && (BF_GLOBALS.getFlag(fSawGuns))) {
+ if ((BF_INVENTORY.getObjectScene(INV_AUTO_RIFLE) != 1) && (BF_GLOBALS.getFlag(fSawGuns))) {
scene->_sceneMode = 9207;
scene->setAction(&scene->_sequenceManager1, scene, 9207, &BF_GLOBALS._player, NULL);
} else {
@@ -3055,7 +3055,7 @@ void Scene920::signal() {
case 9207:
BF_GLOBALS._player.enableControl();
T2_GLOBALS._uiElements.addScore(30);
- BF_INVENTORY.setObjectScene(15, 1);
+ BF_INVENTORY.setObjectScene(INV_AUTO_RIFLE, 1);
BF_GLOBALS._bookmark = bEndDayThree;
break;
default:
@@ -3107,7 +3107,7 @@ bool Scene930::Object1::startAction(CursorType action, Event &event) {
Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene;
bool result;
- if ((action == CURSOR_USE) && (!BF_GLOBALS.getFlag(93))) {
+ if ((action == CURSOR_USE) && (!BF_GLOBALS.getFlag(fGotPointsForFBI))) {
scene->setAction(&scene->_action2);
result = true;
} else
@@ -3117,6 +3117,7 @@ bool Scene930::Object1::startAction(CursorType action, Event &event) {
}
bool Scene930::Object2::startAction(CursorType action, Event &event) {
+// Small box Inset
Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene;
if (action != CURSOR_USE)
@@ -3124,8 +3125,8 @@ bool Scene930::Object2::startAction(CursorType action, Event &event) {
NamedObject::startAction(action, event);
T2_GLOBALS._uiElements.addScore(30);
- BF_INVENTORY.setObjectScene(54, 1);
- BF_GLOBALS.setFlag(93);
+ BF_INVENTORY.setObjectScene(INV_9MM_BULLETS, 1);
+ BF_GLOBALS.setFlag(fGotPointsForFBI);
remove();
scene->_box.remove();
return true;
@@ -3138,13 +3139,13 @@ bool Scene930::Object3::startAction(CursorType action, Event &event) {
if (action != CURSOR_USE)
return NamedObject::startAction(action, event);
- if (scene->_v141C == 0)
+ if (!scene->_bootInsetDisplayed)
scene->setAction(&scene->_action1);
return true;
}
bool Scene930::Object4::startAction(CursorType action, Event &event) {
-// Boot window
+// Boot inset
Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene;
switch (action) {
@@ -3167,7 +3168,7 @@ bool Scene930::Object4::startAction(CursorType action, Event &event) {
if (BF_GLOBALS._bookmark >= bFlashBackTwo) {
_lookLineNum = 71;
NamedObject::startAction(action, event);
- scene->subF3D6F();
+ scene->ShowSoleInset();
remove();
} else
NamedObject::startAction(action, event);
@@ -3179,9 +3180,10 @@ bool Scene930::Object4::startAction(CursorType action, Event &event) {
}
void Scene930::Object4::remove() {
+// Boots inset
Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene;
- if (scene->_v141C && !BF_GLOBALS._sceneObjects->contains(&scene->_object5)) {
+ if (scene->_bootInsetDisplayed && !BF_GLOBALS._sceneObjects->contains(&scene->_soleInset)) {
scene->_boots.setAction(&scene->_action3);
}
@@ -3189,22 +3191,23 @@ void Scene930::Object4::remove() {
}
bool Scene930::Object5::startAction(CursorType action, Event &event) {
+// Boots sole inset
Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_WALK:
return true;
case CURSOR_USE:
- if (BF_INVENTORY.getObjectScene(55) == 1)
+ if (BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1)
return NamedObject::startAction(action, event);
- if (scene->_v141A == 0) {
+ if (!scene->_soleOpened) {
animate(ANIM_MODE_4, getFrameCount() - 1, 1, NULL);
- scene->_v141A = 1;
+ scene->_soleOpened = 1;
_lookLineNum = 76;
_useLineNum = 78;
} else {
T2_GLOBALS._uiElements.addScore(50);
- BF_INVENTORY.setObjectScene(55, 1);
+ BF_INVENTORY.setObjectScene(INV_SCHEDULE, 1);
setFrame2(getFrameCount());
_lookLineNum = 92;
_useLineNum = -1;
@@ -3244,7 +3247,7 @@ void Scene930::Action1::signal() {
case 0:
setDelay(10);
BF_GLOBALS._player.disableControl();
- scene->_v141C = 1;
+ scene->_bootInsetDisplayed = 1;
break;
case 1: {
Common::Point pt(50, 142);
@@ -3268,10 +3271,10 @@ void Scene930::Action1::signal() {
BF_GLOBALS._player.animate(ANIM_MODE_5, this);
break;
case 5:
- scene->showBootWindow();
- if (!BF_GLOBALS.getFlag(72)) {
+ scene->showBootInset();
+ if (!BF_GLOBALS.getFlag(fGotPointsForCPU)) {
T2_GLOBALS._uiElements.addScore(30);
- BF_GLOBALS.setFlag(72);
+ BF_GLOBALS.setFlag(fGotPointsForCPU);
}
SceneItem::display(0, 312);
BF_GLOBALS._player.enableControl();
@@ -3304,7 +3307,7 @@ void Scene930::Action2::signal() {
SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9,
SET_EXT_FGCOLOR, 13, LIST_END);
- scene->subF3C07();
+ scene->ShowBoxInset();
BF_GLOBALS._player.enableControl();
remove();
break;
@@ -3330,7 +3333,7 @@ void Scene930::Action3::signal() {
BF_GLOBALS._player.setVisage(368);
BF_GLOBALS._player.setStrip(6);
BF_GLOBALS._player.setFrame(1);
- scene->_v141C = 0;
+ scene->_bootInsetDisplayed = 0;
remove();
BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
BF_GLOBALS._player.enableControl();
@@ -3348,21 +3351,21 @@ void Scene930::postInit(SceneObjectList *OwnerList) {
if (BF_GLOBALS._dayNumber == 0)
BF_GLOBALS._dayNumber = 1;
setZoomPercents(83, 75, 140, 100);
- _v141A = 0;
- _v141C = 0;
- if (BF_INVENTORY.getObjectScene(54) != 1) {
+ _soleOpened = 0;
+ _bootInsetDisplayed = 0;
+ if (BF_INVENTORY.getObjectScene(INV_9MM_BULLETS) != 1) {
_box.postInit();
_box.setVisage(930);
_box.setStrip(1);
_box.setPosition(Common::Point(223, 21));
- _box.setDetails(930, 66, 67, 68, 1, NULL);
+ _box.setDetails(930, 66, 67, 68, 1, (SceneItem *)NULL);
}
_boots.postInit();
_boots.setVisage(930);
_boots.setStrip(2);
_boots.setPosition(Common::Point(9, 161));
_boots.fixPriority(120);
- _boots.setDetails(930, 62, 63, 64, 1, NULL);
+ _boots.setDetails(930, 62, 63, 64, 1, (SceneItem *)NULL);
BF_GLOBALS._player.postInit();
BF_GLOBALS._player.setVisage(368);
@@ -3372,6 +3375,7 @@ void Scene930::postInit(SceneObjectList *OwnerList) {
BF_GLOBALS._player.fixPriority(80);
BF_GLOBALS._player.changeZoom(-1);
BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._events.setCursor(CURSOR_WALK);
_item1.setDetails( 1, 930, 0, 1, 2, 1);
_item2.setDetails( 2, 930, 4, 5, 6, 1);
@@ -3400,7 +3404,8 @@ void Scene930::postInit(SceneObjectList *OwnerList) {
_sceneMode = 0;
setAction(&_sequenceManager1, this, 9300, &BF_GLOBALS._player, NULL);
} else {
- _v141C = 1;
+ // After flashback
+ _bootInsetDisplayed = 1;
BF_GLOBALS._player.animate(ANIM_MODE_NONE);
BF_GLOBALS._player.setPosition(Common::Point(50, 142));
BF_GLOBALS._player.setVisage(931);
@@ -3410,7 +3415,7 @@ void Scene930::postInit(SceneObjectList *OwnerList) {
BF_GLOBALS._player.enableControl();
BF_GLOBALS._player.changeZoom(110);
_boots.setFrame(2);
- showBootWindow();
+ showBootInset();
}
}
@@ -3448,49 +3453,49 @@ void Scene930::dispatch() {
SceneExt::dispatch();
}
-void Scene930::showBootWindow() {
- _bootsWindow.postInit();
- _bootsWindow.setVisage(930);
- _bootsWindow.setStrip(3);
- _bootsWindow.setFrame2(1);
- _bootsWindow.fixPriority(260);
- _bootsWindow.setPosition(Common::Point(147, 128));
- _bootsWindow.setDetails(930, 69, 70, 93);
+void Scene930::showBootInset() {
+ _bootsInset.postInit();
+ _bootsInset.setVisage(930);
+ _bootsInset.setStrip(3);
+ _bootsInset.setFrame2(1);
+ _bootsInset.fixPriority(260);
+ _bootsInset.setPosition(Common::Point(147, 128));
+ _bootsInset.setDetails(930, 69, 70, 93);
}
-void Scene930::subF3C07() {
- _object2.postInit();
- _object2.setVisage(930);
- _object2.setStrip(1);
- _object2.setFrame2(2);
- _object2.fixPriority(260);
- _object2.setPosition(Common::Point(147, 128));
- _object2.setDetails(930, 73, 74, 75);
+void Scene930::ShowBoxInset() {
+ _boxInset.postInit();
+ _boxInset.setVisage(930);
+ _boxInset.setStrip(1);
+ _boxInset.setFrame2(2);
+ _boxInset.fixPriority(260);
+ _boxInset.setPosition(Common::Point(147, 128));
+ _boxInset.setDetails(930, 73, 74, 75);
}
-void Scene930::subF3D6F() {
- _object5.postInit();
- _object5.setVisage(930);
- _object5.setStrip(3);
+void Scene930::ShowSoleInset() {
+ _soleInset.postInit();
+ _soleInset.setVisage(930);
+ _soleInset.setStrip(3);
if (BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) {
- _object5.setFrame(_object5.getFrameCount());
- _object5.setDetails(930, 92, 77, -1);
- } else if (_v141A == 0) {
- _object5.setFrame(2);
- _object5.setDetails(930, 93, 77, -1);
+ _soleInset.setFrame(_soleInset.getFrameCount());
+ _soleInset.setDetails(930, 92, 77, -1);
+ } else if (!_soleOpened) {
+ _soleInset.setFrame(2);
+ _soleInset.setDetails(930, 93, 77, -1);
} else {
- _object5.setFrame(_object5.getFrameCount());
- _object5.setDetails(930, 76, 77, 78);
+ _soleInset.setFrame(_soleInset.getFrameCount());
+ _soleInset.setDetails(930, 76, 77, 78);
}
- _object5.fixPriority(260);
- _object5.setPosition(Common::Point(147, 128));
+ _soleInset.fixPriority(260);
+ _soleInset.setPosition(Common::Point(147, 128));
}
void Scene930::synchronize(Serializer &s) {
SceneExt::synchronize(s);
- s.syncAsSint16LE(_v141A);
- s.syncAsSint16LE(_v141C);
+ s.syncAsSint16LE(_soleOpened);
+ s.syncAsSint16LE(_bootInsetDisplayed);
}
/*--------------------------------------------------------------------------
diff --git a/engines/tsage/blue_force/blueforce_scenes9.h b/engines/tsage/blue_force/blueforce_scenes9.h
index b0761713b1..74708b94de 100644
--- a/engines/tsage/blue_force/blueforce_scenes9.h
+++ b/engines/tsage/blue_force/blueforce_scenes9.h
@@ -41,11 +41,11 @@ using namespace TsAGE;
class Scene900: public PalettedScene {
/* Items */
- class Item1: public NamedHotspot {
+ class Exterior: public NamedHotspot {
public:
virtual bool startAction(CursorType action, Event &event);
};
- class Item4: public NamedHotspot {
+ class WestExit: public NamedHotspot {
public:
virtual bool startAction(CursorType action, Event &event);
};
@@ -94,7 +94,7 @@ public:
SpeakerGameText _gameTextSpeaker;
SpeakerJakeJacket _jakeJacketSpeaker;
SpeakerLyleHat _lyleHatSpeaker;
- Item1 _item1;
+ Exterior _exterior;
Gate _gate;
Door _door;
Dog _dog;
@@ -104,13 +104,13 @@ public:
NamedObject _object5;
Lyle _lyle;
Body _body;
- Item4 _item4;
+ WestExit _westExit;
ASoundExt _sound1;
Action1 _action1;
Action2 _action2;
Action3 _action3;
Action4 _action4;
- int _field1974;
+ int _lyleDialogCtr;
int _field1976;
Scene900();
@@ -170,7 +170,7 @@ class Scene910: public PalettedScene {
class Object13: public NamedObject {
protected:
- int _field90, _field92;
+ int _state, _mode;
public:
void setupBreaker(int x, int y, int mode, int8 frameNumber);
virtual void synchronize(Serializer &s);
@@ -180,7 +180,7 @@ class Scene910: public PalettedScene {
class BlackPlug: public Object13 {
public:
- void init(int x, int y, int arg8, int8 argA);
+ void init(int x, int y, int arg8, int8 mode);
virtual bool startAction(CursorType action, Event &event);
virtual void remove();
};
@@ -188,7 +188,7 @@ class Scene910: public PalettedScene {
class Object25: public NamedObject {
int _field90, _field92;
public:
- void subEBBDC(int x, int y, int arg8, int argA);
+ void setupHiddenSwitch(int x, int y, int arg8, int argA);
virtual void synchronize(Serializer &s);
virtual bool startAction(CursorType action, Event &event);
virtual void remove();
@@ -253,7 +253,7 @@ class Scene910: public PalettedScene {
virtual bool startAction(CursorType action, Event &event);
};
- int _field2DDA, _field2DD8, _field2DE0, _field2DE2, _field2DE4;
+ int _sceneSubMode, _breakerButtonCtr, _field2DE0, _field2DE2, _field2DE4;
Common::Point _destPos;
public:
SequenceManager _sequenceManager1, _sequenceManager2;
@@ -270,7 +270,7 @@ public:
Nico _nico;
Stuart _stuart;
Forbes _forbes;
- NamedObject _object5, _vent, _object7;
+ NamedObject _object5, _vent, _shadow;
PowerCord _blackCord, _yellowCord;
BreakerBox _breakerBox;
FakeWall _fakeWall;
@@ -295,8 +295,8 @@ public:
virtual void process(Event &event);
virtual void dispatch();
virtual void checkGun();
- void subE82BD();
- void subE83E1();
+ void openHiddenDoor();
+ void closeHiddenDoor();
};
class Scene920: public SceneExt {
@@ -378,16 +378,16 @@ class Scene930: public PalettedScene {
virtual void signal();
};
- void showBootWindow();
- void subF3C07();
- void subF3D6F();
+ void showBootInset();
+ void ShowBoxInset();
+ void ShowSoleInset();
public:
SequenceManager _sequenceManager1;
Object1 _box;
- Object2 _object2;
+ Object2 _boxInset;
Object3 _boots;
- Object4 _bootsWindow;
- Object5 _object5;
+ Object4 _bootsInset;
+ Object5 _soleInset;
Item1 _item1;
NamedHotspot _item2;
@@ -417,8 +417,8 @@ public:
SpeakerGameText gameTextSpeaker;
- int _v141A;
- int _v141C;
+ bool _soleOpened;
+ int _bootInsetDisplayed;
virtual void postInit(SceneObjectList *OwnerList = NULL);
virtual void signal();
diff --git a/engines/tsage/converse.cpp b/engines/tsage/converse.cpp
index d86548bd4b..06fbffb751 100644
--- a/engines/tsage/converse.cpp
+++ b/engines/tsage/converse.cpp
@@ -25,6 +25,7 @@
#include "tsage/tsage.h"
#include "tsage/globals.h"
#include "tsage/staticres.h"
+#include "ringworld2/ringworld2_speakers.h"
namespace TsAGE {
@@ -32,7 +33,7 @@ namespace TsAGE {
SequenceManager::SequenceManager() : Action() {
- Common::set_to(&_objectList[0], &_objectList[6], (SceneObject *)NULL);
+ Common::fill(&_objectList[0], &_objectList[6], (SceneObject *)NULL);
_sequenceData.clear();
_fontNum = 0;
_sequenceOffset = 0;
@@ -81,7 +82,7 @@ void SequenceManager::remove() {
if (g_globals->_sceneObjects->contains(&_sceneText))
_sceneText.remove();
- Common::set_to(&_objectList[0], &_objectList[6], (SceneObject *)NULL);
+ Common::fill(&_objectList[0], &_objectList[6], (SceneObject *)NULL);
Action::remove();
}
@@ -342,7 +343,7 @@ void SequenceManager::attached(EventHandler *newOwner, EventHandler *endHandler,
DEALLOCATE(seqData);
- Common::set_to(&_objectList[0], &_objectList[6], (SceneObject *)NULL);
+ Common::fill(&_objectList[0], &_objectList[6], (SceneObject *)NULL);
for (int idx = 0; idx < 6; ++idx) {
_objectList[idx] = va_arg(va, SceneObject *);
if (!_objectList[idx])
@@ -451,7 +452,7 @@ int ConversationChoiceDialog::execute(const Common::StringArray &choiceList) {
while (!g_globals->_events.getEvent(event, EVENT_KEYPRESS | EVENT_BUTTON_DOWN | EVENT_MOUSE_MOVE) &&
!g_vm->shouldQuit()) {
g_system->delayMillis(10);
- g_system->updateScreen();
+ GLOBALS._screenSurface.updateScreen();
}
if (g_vm->shouldQuit())
break;
@@ -531,26 +532,52 @@ void ConversationChoiceDialog::draw() {
/*--------------------------------------------------------------------------*/
void Obj44::load(const byte *dataP) {
- _id = READ_LE_UINT16(dataP);
+ Common::MemoryReadStream s(dataP, (g_vm->getGameID() == GType_Ringworld2) ? 126 : 68);
+
+ if (g_vm->getGameID() == GType_Ringworld2) {
+ _mode = s.readSint16LE();
+ _lookupValue = s.readSint16LE();
+ _lookupIndex = s.readSint16LE();
+ _field6 = s.readSint16LE();
+ _field8 = s.readSint16LE();
+ }
+
+ _id = s.readSint16LE();
for (int idx = 0; idx < OBJ44_LIST_SIZE; ++idx)
- _field2[idx] = READ_LE_UINT16(dataP + 2 + idx * 2);
+ _callbackId[idx] = s.readSint16LE();
+
+ if (g_vm->getGameID() == GType_Ringworld2) {
+ _field16 = s.readSint16LE();
+ s.skip(20);
+ } else {
+ s.skip(4);
+ }
- const byte *listP = dataP + 0x10;
- for (int idx = 0; idx < OBJ44_LIST_SIZE; ++idx, listP += 10) {
- _list[idx]._id = READ_LE_UINT16(listP);
- _list[idx]._scriptOffset = READ_LE_UINT16(listP + 2);
+ for (int idx = 0; idx < OBJ0A_LIST_SIZE; ++idx) {
+ _list[idx]._id = s.readSint16LE();
+ _list[idx]._scriptOffset = s.readSint16LE();
+ s.skip(6);
}
- _speakerOffset = READ_LE_UINT16(dataP + 0x42);
+ _speakerOffset = s.readSint16LE();
}
void Obj44::synchronize(Serializer &s) {
s.syncAsSint32LE(_id);
for (int idx = 0; idx < OBJ44_LIST_SIZE; ++idx)
- s.syncAsSint32LE(_field2[idx]);
- for (int idx = 0; idx < OBJ44_LIST_SIZE; ++idx)
+ s.syncAsSint32LE(_callbackId[idx]);
+ for (int idx = 0; idx < OBJ0A_LIST_SIZE; ++idx)
_list[idx].synchronize(s);
s.syncAsUint32LE(_speakerOffset);
+
+ if (g_vm->getGameID() == GType_Ringworld2) {
+ s.syncAsSint16LE(_mode);
+ s.syncAsSint16LE(_lookupValue);
+ s.syncAsSint16LE(_lookupIndex);
+ s.syncAsSint16LE(_field6);
+ s.syncAsSint16LE(_field8);
+ s.syncAsSint16LE(_field16);
+ }
}
/*--------------------------------------------------------------------------*/
@@ -581,6 +608,11 @@ void StripManager::start(int stripNum, EventHandler *owner, StripCallback *callb
owner->setAction(this, owner);
}
+void StripManager::start3(int stripNum, EventHandler *owner, byte *lookupList) {
+ _lookupList = lookupList;
+ start(stripNum, owner, NULL);
+}
+
void StripManager::reset() {
_actionIndex = 0;
_delayFrames = 0;
@@ -614,10 +646,12 @@ void StripManager::load() {
// Get the object list
byte *obj44List = g_resourceManager->getResource(RES_STRIP, _stripNum, 1);
int dataSize = g_vm->_memoryManager.getSize(obj44List);
- assert((dataSize % 0x44) == 0);
+
+ int obj44Size = (g_vm->getGameID() == GType_Ringworld2) ? 126 : 68;
+ assert((dataSize % obj44Size) == 0);
byte *dataP = obj44List;
- for (int idx = 0; idx < (dataSize / 0x44); ++idx, dataP += 0x44) {
+ for (int idx = 0; idx < (dataSize / obj44Size); ++idx, dataP += obj44Size) {
Obj44 obj;
obj.load(dataP);
_obj44List.push_back(obj);
@@ -703,7 +737,12 @@ void StripManager::signal() {
return;
} else if (_obj44Index == 10000) {
// Reached end of strip
+ EventHandler *endHandler = _endHandler;
remove();
+
+ if ((g_vm->getGameID() == GType_Ringworld2) && endHandler)
+ endHandler->signal();
+
return;
}
@@ -714,17 +753,54 @@ void StripManager::signal() {
load();
Obj44 &obj44 = _obj44List[_obj44Index];
- _field2E8 = obj44._id;
+
+ if (g_vm->getGameID() != GType_Ringworld2) {
+ _field2E8 = obj44._id;
+ } else {
+ // Return to Ringworld specific handling
+ if (obj44._field6)
+ _field2E8 = obj44._field6;
+
+ switch (obj44._mode) {
+ case 1:
+ ++_lookupList[obj44._lookupIndex - 1];
+ break;
+ case 2:
+ --_lookupList[obj44._lookupIndex - 1];
+ break;
+ case 3:
+ _lookupList[obj44._lookupIndex - 1] = obj44._lookupValue;
+ break;
+ default:
+ break;
+ }
+ }
+
Common::StringArray choiceList;
// Build up a list of script entries
int idx;
- for (idx = 0; idx < OBJ44_LIST_SIZE; ++idx) {
- if (!obj44._list[idx]._id)
- break;
- // Get the next one
- choiceList.push_back((const char *)&_script[0] + obj44._list[idx]._scriptOffset);
+ if (g_vm->getGameID() == GType_Ringworld2 && obj44._field16) {
+ // Special loading mode used in Return to Ringworld
+ for (idx = 0; idx < OBJ44_LIST_SIZE; ++idx) {
+ int objIndex = _lookupList[obj44._field16 - 1];
+
+ if (!obj44._list[objIndex]._id)
+ break;
+
+ // Get the next one
+ choiceList.push_back((const char *)&_script[0] + obj44._list[objIndex]._scriptOffset);
+ }
+ } else {
+ // Standard choices loading
+ for (idx = 0; idx < OBJ44_LIST_SIZE; ++idx) {
+ if (!obj44._list[idx]._id)
+ break;
+
+ // Get the next one
+ choiceList.push_back((const char *)&_script[0] + obj44._list[idx]._scriptOffset);
+ }
}
int strIndex = 0;
@@ -754,13 +830,16 @@ void StripManager::signal() {
if (_callbackObject) {
for (idx = 0; idx < OBJ44_LIST_SIZE; ++idx) {
- if (!obj44._field2[idx])
+ if (!obj44._callbackId[idx])
break;
- _callbackObject->stripCallback(obj44._field2[idx]);
+ _callbackObject->stripCallback(obj44._callbackId[idx]);
}
}
+ if ((g_vm->getGameID() == GType_Ringworld2) && (_obj44List.size() > 0))
+ static_cast<Ringworld2::VisualSpeaker *>(_activeSpeaker)->proc15();
+
_textShown = true;
_activeSpeaker->setText(choiceList[strIndex]);
}
@@ -813,6 +892,17 @@ Speaker *StripManager::getSpeaker(const char *speakerName) {
return _speakerList[idx];
}
+ // TODO: Check if it necessary to make a strcmp first.
+ //
+ // If nothing is found, recheck and ignore the case as
+ // in R2R, some character names aren't in uppercase.
+ if (g_vm->getGameID() == GType_Ringworld2) {
+ for (uint idx = 0; idx < _speakerList.size(); ++idx) {
+ if (!scumm_stricmp(_speakerList[idx]->_speakerName.c_str(), speakerName))
+ return _speakerList[idx];
+ }
+ }
+
return NULL;
}
diff --git a/engines/tsage/converse.h b/engines/tsage/converse.h
index f82c07a7dd..0c4eb9539d 100644
--- a/engines/tsage/converse.h
+++ b/engines/tsage/converse.h
@@ -178,13 +178,19 @@ public:
};
#define OBJ44_LIST_SIZE 5
+#define OBJ0A_LIST_SIZE ((g_vm->getGameID() == GType_Ringworld2) ? 8 : 5)
class Obj44 : public Serialisable {
public:
int _id;
- int _field2[OBJ44_LIST_SIZE];
- Obj0A _list[OBJ44_LIST_SIZE];
+ int _callbackId[OBJ44_LIST_SIZE];
+ Obj0A _list[8];
uint _speakerOffset;
+
+ // Return to Ringworld specific field
+ int _mode;
+ int _lookupValue, _lookupIndex, _field6;
+ int _field8, _field16;
public:
void load(const byte *dataP);
virtual void synchronize(Serializer &s);
@@ -215,6 +221,9 @@ public:
Common::Array<byte> _script;
StripProc _onBegin;
StripProc _onEnd;
+
+ // Ringworld 2 specific fields
+ byte *_lookupList;
public:
StripManager();
virtual ~StripManager();
@@ -225,6 +234,7 @@ public:
virtual void process(Event &event);
void start(int stripNum, EventHandler *owner, StripCallback *callback = NULL);
+ void start3(int stripNum, EventHandler *owner, byte *lookupList);
void setCallback(StripCallback *callback) { _callbackObject = callback; }
void setColors(int stdColor, int highlightColor) { _choiceDialog.setColors(stdColor, highlightColor); }
void setFontNumber(int fontNum) { _choiceDialog.setFontNumber(fontNum); }
diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp
index a56b30ad4d..292e74c09b 100644
--- a/engines/tsage/core.cpp
+++ b/engines/tsage/core.cpp
@@ -34,6 +34,7 @@
#include "tsage/globals.h"
#include "tsage/sound.h"
#include "tsage/blue_force/blueforce_logic.h"
+#include "tsage/ringworld2/ringworld2_logic.h"
namespace TsAGE {
@@ -71,14 +72,14 @@ InvObject::InvObject(int strip, int frame) {
_strip = strip;
_frame = frame;
- _visage = 0;
+ _visage = 7;
_sceneNumber = 0;
_iconResNum = 10;
}
void InvObject::setCursor() {
- if (g_vm->getGameID() == GType_BlueForce) {
- // Blue Force cursor handling
+ if (g_vm->getGameID() != GType_Ringworld) {
+ // All other games
_cursorId = (CursorType)BF_GLOBALS._inventory->indexOf(this);
g_globals->_events.setCursor(_cursorId);
} else {
@@ -94,6 +95,10 @@ void InvObject::setCursor() {
}
}
+bool InvObject::inInventory() const {
+ return _sceneNumber == ((g_vm->getGameID() != GType_Ringworld2) ? 1 : g_globals->_player._characterIndex);
+}
+
/*--------------------------------------------------------------------------*/
InvObjectList::InvObjectList() {
@@ -896,24 +901,28 @@ int PlayerMover::calculateRestOfRoute(int *routeList, int srcRegion, int destReg
// Check every connected region until we find a route to the destination (or we have no more to check).
int bestDistance = 31990;
while (((currDest = g_globals->_walkRegions._idxList[srcWalkRegion._idxListIndex + foundIndex]) != 0) && (!foundRoute)) {
- int newDistance = calculateRestOfRoute(tempList, currDest, destRegion, foundRoute);
+ // Only check the region if it isn't in the list of explicitly disabled regions
+ if (!contains(g_globals->_walkRegions._disabledRegions, (int)currDest)) {
+ int newDistance = calculateRestOfRoute(tempList, currDest, destRegion, foundRoute);
- if ((newDistance <= bestDistance) || foundRoute) {
- // We found a shorter possible route, or one leading to the destination.
+ if ((newDistance <= bestDistance) || foundRoute) {
+ // We found a shorter possible route, or one leading to the destination.
- // Overwrite the route with this new one.
- routeList[0] = ourListSize - 1;
+ // Overwrite the route with this new one.
+ routeList[0] = ourListSize - 1;
- for (int i = ourListSize; i <= tempList[0]; ++i) {
- routeList[i] = tempList[i];
- ++routeList[0];
+ for (int i = ourListSize; i <= tempList[0]; ++i) {
+ routeList[i] = tempList[i];
+ ++routeList[0];
+ }
+
+ bestDistance = newDistance;
}
- bestDistance = newDistance;
+ // Truncate our local list to the size it was before the call.
+ tempList[0] = ourListSize;
}
- // Truncate our local list to the size it was before the call.
- tempList[0] = ourListSize;
++foundIndex;
}
@@ -932,6 +941,8 @@ int PlayerMover::findDistance(const Common::Point &pt1, const Common::Point &pt2
return (int)sqrt(xx + yy);
}
+// Calculate intersection of the line segments pt1-pt2 and pt3-pt4.
+// Return true if they intersect, and return the intersection in ptOut.
bool PlayerMover::sub_F8E5_calculatePoint(const Common::Point &pt1, const Common::Point &pt2, const Common::Point &pt3,
const Common::Point &pt4, Common::Point *ptOut) {
double diffX1 = pt2.x - pt1.x;
@@ -1057,6 +1068,8 @@ PaletteRotation::PaletteRotation() : PaletteModifierCached() {
_percent = 0;
_delayCtr = 0;
_frameNumber = g_globals->_events.getFrameNumber();
+ _idxChange = 1;
+ _countdown = 0;
}
void PaletteRotation::synchronize(Serializer &s) {
@@ -1070,14 +1083,24 @@ void PaletteRotation::synchronize(Serializer &s) {
s.syncAsSint32LE(_rotationMode);
s.syncAsSint32LE(_duration);
s.syncBytes(&_palette[0], 256 * 3);
+
+ if (g_vm->getGameID() == GType_Ringworld2) {
+ s.syncAsSint16LE(_idxChange);
+ s.syncAsSint16LE(_countdown);
+ }
}
void PaletteRotation::signal() {
+ if (_countdown > 0) {
+ --_countdown;
+ return;
+ }
+
if (_delayCtr) {
uint32 frameNumber = g_globals->_events.getFrameNumber();
if (frameNumber >= _frameNumber) {
- _delayCtr = frameNumber - _frameNumber;
+ _delayCtr -= frameNumber - _frameNumber;
_frameNumber = frameNumber;
if (_delayCtr < 0)
@@ -1094,21 +1117,24 @@ void PaletteRotation::signal() {
bool flag = true;
switch (_rotationMode) {
case -1:
- if (--_currIndex < _start) {
+ _currIndex -= _idxChange;
+ if (_currIndex < _start) {
flag = decDuration();
if (flag)
_currIndex = _end - 1;
}
break;
case 1:
- if (++_currIndex >= _end) {
+ _currIndex += _idxChange;
+ if (_currIndex >= _end) {
flag = decDuration();
if (flag)
_currIndex = _start;
}
break;
case 2:
- if (++_currIndex >= _end) {
+ _currIndex += _idxChange;
+ if (_currIndex >= _end) {
flag = decDuration();
if (flag) {
_currIndex = _end - 2;
@@ -1117,7 +1143,8 @@ void PaletteRotation::signal() {
}
break;
case 3:
- if (--_currIndex < _start) {
+ _currIndex -= _idxChange;
+ if (_currIndex < _start) {
flag = decDuration();
if (flag) {
_currIndex = _start + 1;
@@ -1140,7 +1167,9 @@ void PaletteRotation::signal() {
void PaletteRotation::remove() {
Action *action = _action;
- g_system->getPaletteManager()->setPalette((const byte *)&_palette[_start * 3], _start, _end - _start);
+
+ if (_idxChange)
+ g_system->getPaletteManager()->setPalette((const byte *)&_palette[_start * 3], _start, _end - _start);
_scenePalette->_listeners.remove(this);
@@ -1272,6 +1301,13 @@ bool ScenePalette::loadPalette(int paletteNum) {
return true;
}
+/**
+ * Loads a palette from the passed raw data block
+ */
+void ScenePalette::loadPalette(const byte *pSrc, int start, int count) {
+ Common::copy(pSrc, pSrc + count * 3, &_palette[start * 3]);
+}
+
void ScenePalette::refresh() {
// Set indexes for standard colors to closest color in the palette
_colors.background = indexOf(255, 255, 255); // White background
@@ -1295,6 +1331,15 @@ void ScenePalette::setPalette(int index, int count) {
}
/**
+ * Get a palette entry
+ */
+void ScenePalette::getEntry(int index, uint *r, uint *g, uint *b) {
+ *r = _palette[index * 3];
+ *g = _palette[index * 3 + 1];
+ *b = _palette[index * 3 + 2];
+}
+
+/**
* Set a palette entry
*/
void ScenePalette::setEntry(int index, uint r, uint g, uint b) {
@@ -1309,13 +1354,15 @@ void ScenePalette::setEntry(int index, uint r, uint g, uint b) {
* @param g G component
* @param b B component
* @param threshold Closeness threshold.
+ * @param start Starting index
+ * @param count Number of indexes to scan
* @remarks A threshold may be provided to specify how close the matching color must be
*/
-uint8 ScenePalette::indexOf(uint r, uint g, uint b, int threshold) {
+uint8 ScenePalette::indexOf(uint r, uint g, uint b, int threshold, int start, int count) {
int palIndex = -1;
byte *palData = &_palette[0];
- for (int i = 0; i < 256; ++i) {
+ for (int i = start; i < (start + count); ++i) {
byte ir = *palData++;
byte ig = *palData++;
byte ib = *palData++;
@@ -1380,7 +1427,7 @@ void ScenePalette::fade(const byte *adjustData, bool fullAdjust, int percent) {
// Set the altered pale4tte
g_system->getPaletteManager()->setPalette((const byte *)&tempPalette[0], 0, 256);
- g_system->updateScreen();
+ GLOBALS._screenSurface.updateScreen();
}
PaletteRotation *ScenePalette::addRotation(int start, int end, int rotationMode, int duration, Action *action) {
@@ -1435,7 +1482,7 @@ void ScenePalette::changeBackground(const Rect &bounds, FadeMode fadeMode) {
Rect tempRect = bounds;
if (g_vm->getGameID() != GType_Ringworld)
- tempRect.setHeight(BF_GLOBALS._interfaceY);
+ tempRect.setHeight(T2_GLOBALS._interfaceY);
g_globals->_screenSurface.copyFrom(g_globals->_sceneManager._scene->_backSurface,
tempRect, Rect(0, 0, tempRect.width(), tempRect.height()), NULL);
@@ -1498,25 +1545,30 @@ bool SceneItem::startAction(CursorType action, Event &event) {
void SceneItem::doAction(int action) {
const char *msg = NULL;
- switch ((int)action) {
- case CURSOR_LOOK:
- msg = LOOK_SCENE_HOTSPOT;
- break;
- case CURSOR_USE:
- msg = USE_SCENE_HOTSPOT;
- break;
- case CURSOR_TALK:
- msg = TALK_SCENE_HOTSPOT;
- break;
- case 0x1000:
- msg = SPECIAL_SCENE_HOTSPOT;
- break;
- default:
- msg = DEFAULT_SCENE_HOTSPOT;
- break;
- }
+ if (g_vm->getGameID() == GType_Ringworld2) {
+ Event dummyEvent;
+ ((Ringworld2::SceneExt *)GLOBALS._sceneManager._scene)->display((CursorType)action, dummyEvent);
+ } else {
+ switch ((int)action) {
+ case CURSOR_LOOK:
+ msg = LOOK_SCENE_HOTSPOT;
+ break;
+ case CURSOR_USE:
+ msg = USE_SCENE_HOTSPOT;
+ break;
+ case CURSOR_TALK:
+ msg = TALK_SCENE_HOTSPOT;
+ break;
+ case 0x1000:
+ msg = SPECIAL_SCENE_HOTSPOT;
+ break;
+ default:
+ msg = DEFAULT_SCENE_HOTSPOT;
+ break;
+ }
- GUIErrorMessage(msg);
+ GUIErrorMessage(msg);
+ }
}
bool SceneItem::contains(const Common::Point &pt) {
@@ -1541,12 +1593,12 @@ void SceneItem::display(int resNum, int lineNum, ...) {
g_globals->_sceneObjects->draw();
}
- GfxFontBackup font;
Common::Point pos(160, 100);
Rect textRect;
int maxWidth = 120;
bool keepOnscreen = false;
- bool centerText = g_vm->getGameID() == GType_Ringworld;
+ bool centerText = g_vm->getGameID() != GType_BlueForce;
+ Common::List<int> playList;
if (resNum != 0) {
va_list va;
@@ -1555,6 +1607,17 @@ void SceneItem::display(int resNum, int lineNum, ...) {
if (resNum == -1)
msg = Common::String(va_arg(va, const char *));
+ if (g_vm->getGameID() == GType_Ringworld2) {
+ // Pre-process the string for any sound information
+ while (msg.hasPrefix("!")) {
+ msg.deleteChar(0);
+ playList.push_back(atoi(msg.c_str()));
+
+ while (!msg.empty() && (*msg.c_str() >= '0' && *msg.c_str() <= '9'))
+ msg.deleteChar(0);
+ }
+ }
+
int mode;
do {
// Get next instruction
@@ -1628,10 +1691,14 @@ void SceneItem::display(int resNum, int lineNum, ...) {
if (resNum) {
// Get required bounding size
- g_globals->gfxManager().getStringBounds(msg.c_str(), textRect, maxWidth);
- textRect.center(pos.x, pos.y);
+ GfxFont font;
+ font.setFontNumber(g_globals->_sceneText._fontNumber);
+ font.getStringBounds(msg.c_str(), textRect, maxWidth);
+ // Center the text at the specified position, and then constrain it to be-
+ textRect.center(pos.x, pos.y);
textRect.contain(g_globals->gfxManager()._bounds);
+
if (centerText) {
g_globals->_sceneText._color1 = g_globals->_sceneText._color2;
g_globals->_sceneText._color2 = 0;
@@ -1658,10 +1725,16 @@ void SceneItem::display(int resNum, int lineNum, ...) {
// Keep event on-screen until a mouse or keypress
while (!g_vm->shouldQuit() && !g_globals->_events.getEvent(event,
EVENT_BUTTON_DOWN | EVENT_KEYPRESS)) {
- g_system->updateScreen();
+ GLOBALS._screenSurface.updateScreen();
g_system->delayMillis(10);
}
+ // For Return to Ringworld, play the voice overs in sequence
+ if ((g_vm->getGameID() == GType_Ringworld2) && !playList.empty() && !R2_GLOBALS._playStream.isPlaying()) {
+ R2_GLOBALS._playStream.play(*playList.begin(), NULL);
+ playList.pop_front();
+ }
+
g_globals->_sceneText.remove();
}
@@ -1684,7 +1757,8 @@ void SceneItem::display2(int resNum, int lineNum) {
SET_EXT_FGCOLOR, 13, LIST_END);
break;
case GType_Ringworld2:
- display(resNum, lineNum, SET_WIDTH, 280, SET_X, 20, SET_Y, 20, SET_EXT_BGCOLOR, 60, LIST_END);
+ display(resNum, lineNum, SET_WIDTH, 280, SET_X, 160, SET_Y, 20, SET_POS_MODE, ALIGN_CENTER,
+ SET_EXT_BGCOLOR, 60, LIST_END);
break;
default:
display(resNum, lineNum, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
@@ -1705,13 +1779,55 @@ void SceneItem::display(const Common::String &msg) {
/*--------------------------------------------------------------------------*/
+SceneHotspot::SceneHotspot(): SceneItem() {
+ _lookLineNum = _useLineNum = _talkLineNum = 0;
+}
+
+void SceneHotspot::synchronize(Serializer &s) {
+ SceneItem::synchronize(s);
+
+ if (g_vm->getGameID() == GType_Ringworld2) {
+ // In R2R, the following fields were moved into the SceneItem class
+ s.syncAsSint16LE(_resNum);
+ s.syncAsSint16LE(_lookLineNum);
+ s.syncAsSint16LE(_useLineNum);
+ s.syncAsSint16LE(_talkLineNum);
+ }
+}
+
bool SceneHotspot::startAction(CursorType action, Event &event) {
- switch (action) {
+ switch (g_vm->getGameID()) {
case GType_BlueForce: {
BlueForce::SceneExt *scene = (BlueForce::SceneExt *)BF_GLOBALS._sceneManager._scene;
assert(scene);
return scene->display(action);
}
+ case GType_Ringworld2: {
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_lookLineNum != -1) {
+ SceneItem::display2(_resNum, _lookLineNum);
+ return true;
+ }
+ break;
+ case CURSOR_USE:
+ if (_useLineNum != -1) {
+ SceneItem::display2(_resNum, _useLineNum);
+ return true;
+ }
+ break;
+ case CURSOR_TALK:
+ if (_talkLineNum != -1) {
+ SceneItem::display2(_resNum, _talkLineNum);
+ return true;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return ((Ringworld2::SceneExt *)GLOBALS._sceneManager._scene)->display(action, event);
+ }
default:
return SceneItem::startAction(action, event);
}
@@ -1748,6 +1864,87 @@ void SceneHotspot::doAction(int action) {
}
}
+void SceneHotspot::setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum) {
+ setBounds(ys, xe, ye, xs);
+ _resNum = resnum;
+ _lookLineNum = lookLineNum;
+ _useLineNum = useLineNum;
+ _talkLineNum = -1;
+ g_globals->_sceneItems.addItems(this, NULL);
+}
+
+void SceneHotspot::setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) {
+ setBounds(bounds);
+ _resNum = resNum;
+ _lookLineNum = lookLineNum;
+ _talkLineNum = talkLineNum;
+ _useLineNum = useLineNum;
+
+ switch (mode) {
+ case 2:
+ g_globals->_sceneItems.push_front(this);
+ break;
+ case 4:
+ g_globals->_sceneItems.addBefore(item, this);
+ break;
+ case 5:
+ g_globals->_sceneItems.addAfter(item, this);
+ break;
+ default:
+ g_globals->_sceneItems.push_back(this);
+ break;
+ }
+}
+
+void SceneHotspot::setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode) {
+ _sceneRegionId = sceneRegionId;
+ _resNum = resNum;
+ _lookLineNum = lookLineNum;
+ _talkLineNum = talkLineNum;
+ _useLineNum = useLineNum;
+
+ // Handle adding hotspot to scene items list as necessary
+ switch (mode) {
+ case 2:
+ GLOBALS._sceneItems.push_front(this);
+ break;
+ case 3:
+ break;
+ default:
+ GLOBALS._sceneItems.push_back(this);
+ break;
+ }
+}
+
+void SceneHotspot::setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) {
+ _resNum = resNum;
+ _lookLineNum = lookLineNum;
+ _talkLineNum = talkLineNum;
+ _useLineNum = useLineNum;
+
+ switch (mode) {
+ case 2:
+ g_globals->_sceneItems.push_front(this);
+ break;
+ case 4:
+ g_globals->_sceneItems.addBefore(item, this);
+ break;
+ case 5:
+ g_globals->_sceneItems.addAfter(item, this);
+ break;
+ default:
+ g_globals->_sceneItems.push_back(this);
+ break;
+ }
+}
+
+void SceneHotspot::setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum) {
+ _resNum = resNum;
+ _lookLineNum = lookLineNum;
+ _talkLineNum = talkLineNum;
+ _useLineNum = useLineNum;
+}
+
/*--------------------------------------------------------------------------*/
void SceneObjectWrapper::setSceneObject(SceneObject *so) {
@@ -1823,7 +2020,6 @@ SceneObject::SceneObject() : SceneHotspot() {
_moveDiff.x = 5;
_moveDiff.y = 3;
_numFrames = 10;
- _numFrames = 10;
_moveRate = 10;
_regionBitList = 0;
_sceneRegionId = 0;
@@ -1835,6 +2031,11 @@ SceneObject::SceneObject() : SceneHotspot() {
_visage = 0;
_strip = 0;
_frame = 0;
+ _effect = 0;
+ _shade = _shade2 = 0;
+ _linkedActor = NULL;
+
+ _field8A = Common::Point(0, 0);
}
SceneObject::SceneObject(const SceneObject &so) : SceneHotspot() {
@@ -2137,6 +2338,14 @@ SceneObject *SceneObject::clone() const {
return obj;
}
+void SceneObject::copy(SceneObject *src) {
+ *this = *src;
+
+ _objectWrapper = NULL;
+ _mover = NULL;
+ _endAction = NULL;
+}
+
void SceneObject::checkAngle(const SceneObject *obj) {
checkAngle(obj->_position);
}
@@ -2201,8 +2410,19 @@ void SceneObject::synchronize(Serializer &s) {
SYNC_POINTER(_mover);
s.syncAsSint16LE(_moveDiff.x); s.syncAsSint16LE(_moveDiff.y);
s.syncAsSint32LE(_moveRate);
+ if (g_vm->getGameID() == GType_Ringworld2) {
+ s.syncAsSint16LE(_field8A.x);
+ s.syncAsSint16LE(_field8A.y);
+ }
SYNC_POINTER(_endAction);
s.syncAsUint32LE(_regionBitList);
+
+ if (g_vm->getGameID() == GType_Ringworld2) {
+ s.syncAsSint16LE(_effect);
+ s.syncAsSint16LE(_shade);
+ s.syncAsSint16LE(_shade2);
+ SYNC_POINTER(_linkedActor);
+ }
}
void SceneObject::postInit(SceneObjectList *OwnerList) {
@@ -2245,6 +2465,12 @@ void SceneObject::remove() {
}
void SceneObject::dispatch() {
+ if (g_vm->getGameID() == GType_Ringworld2) {
+ if (_shade != _shade2)
+ _flags |= OBJFLAG_PANES;
+ _shade2 = _shade;
+ }
+
uint32 currTime = g_globals->_events.getFrameNumber();
if (_action)
_action->dispatch();
@@ -2352,6 +2578,17 @@ void SceneObject::dispatch() {
if (!(_flags & OBJFLAG_FIXED_PRIORITY)) {
setPriority(_position.y);
}
+
+ if (g_vm->getGameID() == GType_Ringworld2) {
+ if (_linkedActor) {
+ _linkedActor->setPosition(_position);
+ _linkedActor->setStrip(_strip);
+ _linkedActor->setFrame(_frame);
+ }
+
+ if ((_effect == 1) && (getRegionIndex() < 11))
+ _shade = 0;
+ }
}
void SceneObject::calcAngle(const Common::Point &pt) {
@@ -2412,6 +2649,11 @@ void SceneObject::updateScreen() {
srcRect.right = ((srcRect.right + 3) / 4) * 4;
srcRect.clip(g_globals->_sceneManager._scene->_sceneBounds);
+ if (g_vm->getGameID() != GType_Ringworld) {
+ if (T2_GLOBALS._uiElements._visible)
+ srcRect.bottom = MIN<int16>(srcRect.bottom, T2_GLOBALS._interfaceY);
+ }
+
if (srcRect.isValidRect()) {
Rect destRect = srcRect;
destRect.translate(-sceneBounds.left, -sceneBounds.top);
@@ -2469,6 +2711,20 @@ void BackgroundSceneObject::draw() {
g_globals->_sceneManager._scene->_backSurface.copyFrom(frame, destRect, priorityRegion);
}
+void BackgroundSceneObject::setup2(int visage, int stripFrameNum, int frameNum, int posX, int posY, int priority, int32 arg10) {
+ warning("TODO: Implement properly BackgroundSceneObject::setup2()");
+ postInit();
+ setVisage(visage);
+ setStrip(stripFrameNum);
+ setFrame(frameNum);
+ setPosition(Common::Point(posX, posY), 0);
+ fixPriority(priority);
+}
+
+void BackgroundSceneObject::proc27() {
+ warning("STUB: BackgroundSceneObject::proc27()");
+}
+
/*--------------------------------------------------------------------------*/
void SceneObjectList::draw() {
@@ -2585,43 +2841,48 @@ void SceneObjectList::draw() {
}
g_globals->_paneRegions[paneNum].setRect(0, 0, 0, 0);
-redraw:
- // Main draw loop
- for (uint objIndex = 0; objIndex < objList.size(); ++objIndex) {
- SceneObject *obj = objList[objIndex];
-
- if ((obj->_flags & flagMask) && !(obj->_flags & OBJFLAG_HIDE)) {
- obj->_paneRects[paneNum] = obj->_bounds;
- obj->draw();
+
+ // FIXME: Currently, removing objects causes screen flickers when the removed object intersects
+ // another drawn object, since the background is briefly redrawn over the object. For now, I'm
+ // using a forced jump back to redraw objects. In the long term, I should figure out how the
+ // original game does this properly
+ bool redrawFlag = true;
+ while (redrawFlag) {
+ redrawFlag = false;
+
+ // Main draw loop
+ for (uint objIndex = 0; objIndex < objList.size(); ++objIndex) {
+ SceneObject *obj = objList[objIndex];
+
+ if ((obj->_flags & flagMask) && !(obj->_flags & OBJFLAG_HIDE)) {
+ obj->_paneRects[paneNum] = obj->_bounds;
+ obj->draw();
+ }
}
- }
- // Update the palette
- g_globals->_sceneManager.fadeInIfNecessary();
- g_globals->_sceneManager._loadMode = 0;
- g_globals->_paneRefreshFlag[paneNum] = 0;
-
- // Loop through the object list, removing any objects and refreshing the screen as necessary
- for (uint objIndex = 0; objIndex < objList.size(); ++objIndex) {
- SceneObject *obj = objList[objIndex];
-
- if (obj->_flags & OBJFLAG_HIDE)
- obj->_flags |= OBJFLAG_HIDING;
- obj->_flags &= ~flagMask;
- if (obj->_flags & OBJFLAG_REMOVE) {
- obj->_flags |= OBJFLAG_PANES;
-
- checkIntersection(objList, objIndex, CURRENT_PANENUM);
-
- obj->updateScreen();
- obj->removeObject();
-
- // FIXME: Currently, removing objects causes screen flickers when the removed object intersects
- // another drawn object, since the background is briefly redrawn over the object. For now, I'm
- // using a forced jump back to redraw objects. In the long term, I should figure out how the
- // original game does this properly
- objList.remove_at(objIndex);
- goto redraw;
+ // Update the palette
+ g_globals->_sceneManager.fadeInIfNecessary();
+ g_globals->_sceneManager._loadMode = 0;
+ g_globals->_paneRefreshFlag[paneNum] = 0;
+
+ // Loop through the object list, removing any objects and refreshing the screen as necessary
+ for (uint objIndex = 0; objIndex < objList.size() && !redrawFlag; ++objIndex) {
+ SceneObject *obj = objList[objIndex];
+
+ if (obj->_flags & OBJFLAG_HIDE)
+ obj->_flags |= OBJFLAG_HIDING;
+ obj->_flags &= ~flagMask;
+ if (obj->_flags & OBJFLAG_REMOVE) {
+ obj->_flags |= OBJFLAG_PANES;
+
+ checkIntersection(objList, objIndex, CURRENT_PANENUM);
+
+ obj->updateScreen();
+ obj->removeObject();
+
+ objList.remove_at(objIndex);
+ redrawFlag = true;
+ }
}
}
}
@@ -2730,6 +2991,7 @@ SceneText::SceneText() : SceneObject() {
_fontNumber = 2;
_width = 160;
_textMode = ALIGN_LEFT;
+ _color1 = 0;
_color2 = 0;
_color3 = 0;
}
@@ -2790,7 +3052,7 @@ void SceneText::synchronize(Serializer &s) {
void SceneText::updateScreen() {
// FIXME: Hack for Blue Force to handle not refreshing the screen if the user interface
// has been re-activated after showing some scene text
- if ((g_vm->getGameID() != GType_BlueForce) || (_bounds.top < UI_INTERFACE_Y) ||
+ if ((g_vm->getGameID() == GType_Ringworld) || (_bounds.top < UI_INTERFACE_Y) ||
!T2_GLOBALS._uiElements._visible)
SceneObject::updateScreen();
}
@@ -2905,6 +3167,16 @@ Player::Player(): SceneObject() {
_enabled = false;
_uiEnabled = false;
_field8C = 0;
+
+ // Return to Ringworld specific fields
+ _characterIndex = R2_NONE;
+
+ for (int i = 0; i < MAX_CHARACTERS; ++i) {
+ _characterScene[i] = 0;
+ _characterStrip[i] = 0;
+ _characterFrame[i] = 0;
+ _oldCharacterScene[i] = 0;
+ }
}
void Player::postInit(SceneObjectList *OwnerList) {
@@ -2914,8 +3186,25 @@ void Player::postInit(SceneObjectList *OwnerList) {
_uiEnabled = true;
_percent = 100;
_field8C = 10;
- _moveDiff.x = 4;
- _moveDiff.y = 2;
+
+ if (g_vm->getGameID() != GType_Ringworld2)
+ {
+ _moveDiff.x = 4;
+ _moveDiff.y = 2;
+ }
+ else
+ {
+ _moveDiff.x = 3;
+ _moveDiff.y = 2;
+ _effect = 1;
+ _shade = 0;
+
+ setObjectWrapper(new SceneObjectWrapper());
+ setPosition(_characterPos[_characterIndex]);
+ setStrip(_characterStrip[_characterIndex]);
+ setFrame(_characterFrame[_characterIndex]);
+ _characterScene[_characterIndex] = GLOBALS._sceneManager._sceneNumber;
+ }
}
void Player::disableControl() {
@@ -2924,7 +3213,7 @@ void Player::disableControl() {
g_globals->_events.setCursor(CURSOR_NONE);
_enabled = false;
- if ((g_vm->getGameID() == GType_BlueForce) && T2_GLOBALS._uiElements._active)
+ if ((g_vm->getGameID() != GType_Ringworld) && T2_GLOBALS._uiElements._active)
T2_GLOBALS._uiElements.hide();
}
@@ -2964,6 +3253,24 @@ void Player::enableControl() {
}
}
+void Player::disableControl(CursorType cursorId, CursorType objectId) {
+ if (cursorId != -1)
+ R2_GLOBALS._events.setCursor(cursorId);
+ else if (objectId != CURSOR_NONE)
+ R2_GLOBALS._events.setCursor(objectId);
+
+ disableControl();
+}
+
+void Player::enableControl(CursorType cursorId, CursorType objectId) {
+ enableControl();
+
+ if (cursorId != -1)
+ R2_GLOBALS._events.setCursor(cursorId);
+ else if (objectId != CURSOR_NONE)
+ R2_GLOBALS._events.setCursor(objectId);
+}
+
void Player::process(Event &event) {
if ((g_vm->getGameID() != GType_Ringworld) && _action)
_action->process(event);
@@ -2972,7 +3279,7 @@ void Player::process(Event &event) {
(g_globals->_events.getCursor() == CURSOR_WALK) && g_globals->_player._canWalk &&
(_position != event.mousePos) && g_globals->_sceneObjects->contains(this)) {
- if ((g_vm->getGameID() == GType_BlueForce) && !BF_GLOBALS._player._enabled)
+ if ((g_vm->getGameID() != GType_Ringworld) && !BF_GLOBALS._player._enabled)
return;
PlayerMover *newMover = new PlayerMover();
@@ -2991,8 +3298,20 @@ void Player::synchronize(Serializer &s) {
s.syncAsByte(_uiEnabled);
s.syncAsSint16LE(_field8C);
- if (g_vm->getGameID() == GType_BlueForce)
+ if (g_vm->getGameID() != GType_Ringworld)
s.syncAsByte(_enabled);
+
+ if (g_vm->getGameID() == GType_Ringworld2) {
+ s.syncAsSint16LE(_characterIndex);
+ for (int i = 0; i < MAX_CHARACTERS; ++i) {
+ s.syncAsSint16LE(_characterScene[i]);
+ s.syncAsSint16LE(_oldCharacterScene[i]);
+ s.syncAsSint16LE(_characterPos[i].x);
+ s.syncAsSint16LE(_characterPos[i].y);
+ s.syncAsSint16LE(_characterStrip[i]);
+ s.syncAsSint16LE(_characterFrame[i]);
+ }
+ }
}
/*--------------------------------------------------------------------------*/
@@ -3434,6 +3753,7 @@ void WalkRegions::clear() {
_field18.clear();
_idxList.clear();
_idxList2.clear();
+ _disabledRegions.clear();
}
void WalkRegions::load(int sceneNum) {
@@ -3606,6 +3926,39 @@ int WalkRegions::indexOf(const Common::Point &pt, const Common::List<int> *index
return -1;
}
+void WalkRegions::synchronize(Serializer &s) {
+ // Synchronise the list of disabled regions as a list of values terminated with a '-1'
+ int regionId = 0;
+ if (s.isLoading()) {
+ _disabledRegions.clear();
+
+ s.syncAsSint16LE(regionId);
+ while (regionId != -1) {
+ _disabledRegions.push_back(regionId);
+ s.syncAsSint16LE(regionId);
+ }
+ } else {
+ Common::List<int>::iterator i;
+ for (i = _disabledRegions.begin(); i != _disabledRegions.end(); ++i) {
+ regionId = *i;
+ s.syncAsSint16LE(regionId);
+ }
+
+ regionId = -1;
+ s.syncAsSint16LE(regionId);
+ }
+}
+
+void WalkRegions::disableRegion(int regionId) {
+ if (!contains(_disabledRegions, regionId))
+ _disabledRegions.push_back(regionId);
+}
+
+void WalkRegions::enableRegion(int regionId) {
+ _disabledRegions.remove(regionId);
+}
+
+
/*--------------------------------------------------------------------------*/
void ScenePriorities::load(int resNum) {
@@ -3756,7 +4109,8 @@ void SceneHandler::process(Event &event) {
// Check for displaying right-click dialog
if ((event.eventType == EVENT_BUTTON_DOWN) && (event.btnState == BTNSHIFT_RIGHT) &&
- g_globals->_player._uiEnabled) {
+ g_globals->_player._uiEnabled &&
+ ((g_vm->getGameID() != GType_Ringworld2) || (R2_GLOBALS._sceneManager._sceneNumber != 1330))) {
g_globals->_game->rightClick();
event.handled = true;
@@ -3809,7 +4163,7 @@ void SceneHandler::process(Event &event) {
}
// Mouse press handling
- bool enabled = (g_vm->getGameID() == GType_BlueForce) ? g_globals->_player._enabled :
+ bool enabled = (g_vm->getGameID() != GType_Ringworld) ? g_globals->_player._enabled :
g_globals->_player._uiEnabled;
if (enabled && (event.eventType == EVENT_BUTTON_DOWN) && !g_globals->_sceneItems.empty()) {
// Check if the mouse is on the player
@@ -3841,7 +4195,7 @@ void SceneHandler::process(Event &event) {
g_globals->_events.setCursor(CURSOR_USE);
}
- if (g_vm->getGameID() == GType_BlueForce)
+ if (g_vm->getGameID() != GType_Ringworld)
event.handled = true;
} else if (g_vm->getGameID() != GType_Ringworld) {
event.handled = true;
@@ -3897,7 +4251,7 @@ void SceneHandler::dispatch() {
do {
process(event);
} while (g_globals->_events.getEvent(event));
- } else if (g_vm->getGameID() == GType_BlueForce) {
+ } else if (g_vm->getGameID() != GType_Ringworld) {
// For Blue Force, 'none' events need to be generated in the absence of any
event.eventType = EVENT_NONE;
event.mousePos = g_globals->_events._mousePos;
@@ -3905,8 +4259,10 @@ void SceneHandler::dispatch() {
}
// Handle drawing the contents of the scene
- if (g_globals->_sceneManager._scene)
- g_globals->_sceneObjects->draw();
+ if ((g_vm->getGameID() != GType_Ringworld2) || (R2_GLOBALS._animationCtr == 0)) {
+ if (g_globals->_sceneManager._scene)
+ g_globals->_sceneObjects->draw();
+ }
// Check to see if any scene change is required
g_globals->_sceneManager.checkScene();
diff --git a/engines/tsage/core.h b/engines/tsage/core.h
index 0137134583..60a7930eab 100644
--- a/engines/tsage/core.h
+++ b/engines/tsage/core.h
@@ -64,7 +64,7 @@ public:
InvObject(int visage, int strip, int frame);
InvObject(int visage, int strip);
- bool inInventory() const { return _sceneNumber == 1; }
+ bool inInventory() const;
void setCursor();
virtual Common::String getClassName() { return "InvObject"; }
@@ -129,7 +129,7 @@ public:
virtual void dispatch();
virtual void setAction(Action *action) { setAction(action, NULL); }
virtual void setAction(Action *action, EventHandler *endHandler, ...);
- virtual void destroy() {};
+ virtual void destroy() {}
};
class Action : public EventHandler {
@@ -322,6 +322,8 @@ public:
int _end;
int _rotationMode;
int _duration;
+ int _idxChange;
+ int _countdown;
public:
PaletteRotation();
@@ -370,10 +372,13 @@ public:
~ScenePalette();
bool loadPalette(int paletteNum);
+ void loadPalette(const byte *pSrc, int start, int count);
+ void replace(const ScenePalette *src) { loadPalette(src->_palette, 0, 256); }
void refresh();
void setPalette(int index, int count);
+ void getEntry(int index, uint *r, uint *g, uint *b);
void setEntry(int index, uint r, uint g, uint b);
- uint8 indexOf(uint r, uint g, uint b, int threshold = 0xffff);
+ uint8 indexOf(uint r, uint g, uint b, int threshold = 0xffff, int start = 0, int count = 256);
void getPalette(int start = 0, int count = 256);
void signalListeners();
void clearListeners();
@@ -440,10 +445,19 @@ public:
class SceneHotspot : public SceneItem {
public:
- SceneHotspot() : SceneItem() {}
+ int _resNum, _lookLineNum, _useLineNum, _talkLineNum;
+public:
+ SceneHotspot();
+ virtual void synchronize(Serializer &s);
virtual bool startAction(CursorType action, Event &event);
virtual Common::String getClassName() { return "SceneHotspot"; }
virtual void doAction(int action);
+
+ void setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum);
+ void setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item);
+ void setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode = 0);
+ void setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item);
+ void setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum);
};
enum AnimateMode {ANIM_MODE_NONE = 0, ANIM_MODE_1 = 1, ANIM_MODE_2 = 2, ANIM_MODE_3 = 3,
@@ -504,8 +518,8 @@ private:
int getNewFrame();
void animEnded();
- int changeFrame();
public:
+ int changeFrame();
uint32 _updateStartFrame;
uint32 _walkStartFrame;
Common::Point _field2E;
@@ -528,8 +542,15 @@ public:
EventHandler *_mover;
Common::Point _moveDiff;
int _moveRate;
+ Common::Point _field8A;
Action *_endAction;
uint32 _regionBitList;
+
+ // Ringworld 2 specific fields
+ byte *_field9C;
+ int _shade, _shade2;
+ int _effect;
+ SceneObject *_linkedActor;
public:
SceneObject();
SceneObject(const SceneObject &so);
@@ -577,6 +598,8 @@ public:
// New methods introduced by Blue Force
virtual void updateAngle(const Common::Point &pt);
virtual void changeAngle(int angle);
+ // New methods introduced by Ringworld 2
+ virtual void copy(SceneObject *src);
void setup(int visage, int stripFrameNum, int frameNum, int posX, int posY, int priority);
void setup(int visage, int stripFrameNum, int frameNum);
@@ -587,6 +610,8 @@ public:
virtual Common::String getClassName() { return "BackgroundSceneObject"; }
virtual void postInit(SceneObjectList *OwnerList = NULL);
virtual void draw();
+ void setup2(int visage, int stripFrameNum, int frameNum, int posX, int posY, int priority, int32 arg10);
+ void proc27();
};
class SceneText : public SceneObject {
@@ -610,12 +635,23 @@ public:
virtual void updateScreen();
};
+#define MAX_CHARACTERS 4
+enum R2RCharacter { R2_NONE = 0, R2_QUINN = 1, R2_SEEKER = 2, R2_MIRANDA = 3 };
+
class Player : public SceneObject {
public:
bool _canWalk;
bool _uiEnabled;
int _field8C;
bool _enabled;
+
+ // Return to Ringworld specific fields
+ R2RCharacter _characterIndex;
+ int _characterScene[MAX_CHARACTERS];
+ int _oldCharacterScene[MAX_CHARACTERS];
+ Common::Point _characterPos[MAX_CHARACTERS];
+ int _characterStrip[MAX_CHARACTERS];
+ int _characterFrame[MAX_CHARACTERS];
public:
Player();
@@ -626,6 +662,8 @@ public:
void disableControl();
void enableControl();
+ void disableControl(CursorType cursorId, CursorType objectId = CURSOR_NONE);
+ void enableControl(CursorType cursorId, CursorType objectId = CURSOR_NONE);
};
/*--------------------------------------------------------------------------*/
@@ -801,8 +839,11 @@ public:
Common::Array<WRField18> _field18;
Common::Array<int> _idxList;
Common::Array<int> _idxList2;
+ Common::List<int> _disabledRegions;
public:
WalkRegions() { _resNum = -1; }
+ virtual ~WalkRegions() {}
+ virtual void synchronize(Serializer &s);
void clear();
void load(int sceneNum);
@@ -811,8 +852,8 @@ public:
assert((idx >= 1) && (idx <= (int)_regionList.size()));
return _regionList[idx - 1];
}
- void proc1(int v) { warning("TODO: WalkRegions::proc1"); }
- void proc2(int v) { warning("TODO: WalkRegions::proc2"); }
+ void disableRegion(int regionId);
+ void enableRegion(int regionId);
};
/*--------------------------------------------------------------------------*/
diff --git a/engines/tsage/debugger.cpp b/engines/tsage/debugger.cpp
index a0e8b9edba..82645f2d62 100644
--- a/engines/tsage/debugger.cpp
+++ b/engines/tsage/debugger.cpp
@@ -24,6 +24,8 @@
#include "tsage/globals.h"
#include "tsage/graphics.h"
#include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/blue_force/blueforce_logic.h"
+#include "tsage/ringworld2/ringworld2_logic.h"
namespace TsAGE {
@@ -95,6 +97,10 @@ bool Debugger::Cmd_WalkRegions(int argc, const char **argv) {
for (uint regionIndex = 0; regionIndex < g_globals->_walkRegions._regionList.size(); ++regionIndex, ++color) {
WalkRegion &wr = g_globals->_walkRegions._regionList[regionIndex];
+ // Skip the region if it's in the list of explicitly disabled regions
+ if (contains(g_globals->_walkRegions._disabledRegions, (int)regionIndex + 1))
+ continue;
+
for (int yp = wr._bounds.top; yp < wr._bounds.bottom; ++yp) {
LineSliceSet sliceSet = wr.getLineSlices(yp);
@@ -269,10 +275,88 @@ bool Debugger::Cmd_ClearFlag(int argc, const char **argv) {
return true;
}
+/**
+ * Show any active hotspot areas in the scene
+ */
+bool Debugger::Cmd_Hotspots(int argc, const char **argv) {
+ int colIndex = 16;
+ const Rect &sceneBounds = g_globals->_sceneManager._scene->_sceneBounds;
+
+ // Lock the background surface for access
+ Graphics::Surface destSurface = g_globals->_sceneManager._scene->_backSurface.lockSurface();
+
+ // Iterate through the scene items
+ SynchronizedList<SceneItem *>::iterator i;
+ for (i = g_globals->_sceneItems.reverse_begin(); i != g_globals->_sceneItems.end(); --i, ++colIndex) {
+ SceneItem *o = *i;
+
+ // Draw the contents of the hotspot area
+ if (o->_sceneRegionId == 0) {
+ // Scene item doesn't use a region, so fill in the entire area
+ if ((o->_bounds.right > o->_bounds.left) && (o->_bounds.bottom > o->_bounds.top))
+ destSurface.fillRect(Rect(o->_bounds.left - sceneBounds.left, o->_bounds.top - sceneBounds.top,
+ o->_bounds.right - sceneBounds.left - 1, o->_bounds.bottom - sceneBounds.top - 1), colIndex);
+ } else {
+ // Scene uses a region, so get it and use it to fill out only the correct parts
+ SceneRegions::iterator ri = g_globals->_sceneRegions.begin();
+ while ((ri != g_globals->_sceneRegions.end()) && ((*ri)._regionId != o->_sceneRegionId))
+ ++ri;
+
+ if (ri != g_globals->_sceneRegions.end()) {
+ // Fill out the areas defined by the region
+ Region &r = *ri;
+
+ for (int y = r._bounds.top; y < r._bounds.bottom; ++y) {
+ LineSliceSet set = r.getLineSlices(y);
+
+ for (uint p = 0; p < set.items.size(); ++p)
+ destSurface.hLine(set.items[p].xs - sceneBounds.left, y - sceneBounds.top,
+ set.items[p].xe - sceneBounds.left - 1, colIndex);
+ }
+ }
+ }
+ }
+
+ // Release the surface
+ g_globals->_sceneManager._scene->_backSurface.unlockSurface();
+
+ // Mark the scene as requiring a full redraw
+ g_globals->_paneRefreshFlag[0] = 2;
+
+ return false;
+}
+
+/**
+ * Play the specified sound
+ */
+bool Debugger::Cmd_Sound(int argc, const char **argv) {
+ if (argc != 2) {
+ DebugPrintf("Usage: %s <sound number>\n", argv[0]);
+ return true;
+ }
+
+ int soundNum = strToInt(argv[1]);
+ g_globals->_soundHandler.play(soundNum);
+ return false;
+}
+
+/*
+ * This command lists the objects available, and their ID
+ */
+bool DemoDebugger::Cmd_ListObjects(int argc, const char **argv) {
+ DebugPrintf("Not available in Demo\n");
+ return true;
+}
+
+bool DemoDebugger::Cmd_MoveObject(int argc, const char **argv) {
+ DebugPrintf("Not available in Demo\n");
+ return true;
+}
+
/*
* This command lists the objects available, and their ID
*/
-bool Debugger::Cmd_ListObjects(int argc, const char **argv) {
+bool RingworldDebugger::Cmd_ListObjects(int argc, const char **argv) {
if (argc != 1) {
DebugPrintf("Usage: %s\n", argv[0]);
return true;
@@ -318,7 +402,7 @@ bool Debugger::Cmd_ListObjects(int argc, const char **argv) {
/*
* This command gets an item, or move it to a room
*/
-bool Debugger::Cmd_MoveObject(int argc, const char **argv) {
+bool RingworldDebugger::Cmd_MoveObject(int argc, const char **argv) {
// Check for a flag to clear
if ((argc < 2) || (argc > 3)){
DebugPrintf("Usage: %s <object number> [<scene number>]\n", argv[0]);
@@ -439,69 +523,188 @@ bool Debugger::Cmd_MoveObject(int argc, const char **argv) {
return true;
}
-/**
- * Show any active hotspot areas in the scene
+/*
+ * This command lists the objects available, and their ID
*/
-bool Debugger::Cmd_Hotspots(int argc, const char **argv) {
- int colIndex = 16;
- const Rect &sceneBounds = g_globals->_sceneManager._scene->_sceneBounds;
-
- // Lock the background surface for access
- Graphics::Surface destSurface = g_globals->_sceneManager._scene->_backSurface.lockSurface();
-
- // Iterate through the scene items
- SynchronizedList<SceneItem *>::iterator i;
- for (i = g_globals->_sceneItems.reverse_begin(); i != g_globals->_sceneItems.end(); --i, ++colIndex) {
- SceneItem *o = *i;
-
- // Draw the contents of the hotspot area
- if (o->_sceneRegionId == 0) {
- // Scene item doesn't use a region, so fill in the entire area
- if ((o->_bounds.right > o->_bounds.left) && (o->_bounds.bottom > o->_bounds.top))
- destSurface.fillRect(Rect(o->_bounds.left - sceneBounds.left, o->_bounds.top - sceneBounds.top,
- o->_bounds.right - sceneBounds.left - 1, o->_bounds.bottom - sceneBounds.top - 1), colIndex);
- } else {
- // Scene uses a region, so get it and use it to fill out only the correct parts
- SceneRegions::iterator ri = g_globals->_sceneRegions.begin();
- while ((ri != g_globals->_sceneRegions.end()) && ((*ri)._regionId != o->_sceneRegionId))
- ++ri;
+bool BlueForceDebugger::Cmd_ListObjects(int argc, const char **argv) {
+ if (argc != 1) {
+ DebugPrintf("Usage: %s\n", argv[0]);
+ return true;
+ }
- if (ri != g_globals->_sceneRegions.end()) {
- // Fill out the areas defined by the region
- Region &r = *ri;
-
- for (int y = r._bounds.top; y < r._bounds.bottom; ++y) {
- LineSliceSet set = r.getLineSlices(y);
+ DebugPrintf("Available objects for this game are:\n");
+ DebugPrintf("1 - INV_COLT45\n");
+ DebugPrintf("2 - INV_AMMO_CLIP\n");
+ DebugPrintf("3 - INV_SPARE_CLIP\n");
+ DebugPrintf("4 - INV_HANDCUFFS\n");
+ DebugPrintf("5 - INV_GREENS_GUN\n");
+ DebugPrintf("6 - INV_TICKET_BOOK\n");
+ DebugPrintf("7 - INV_MIRANDA_CARD\n");
+ DebugPrintf("8 - INV_FOREST_RAP\n");
+ DebugPrintf("9 - INV_GREEN_ID\n");
+ DebugPrintf("10 - INV_BASEBALL_CARD\n");
+ DebugPrintf("11 - INV_BOOKING_GREEN\n");
+ DebugPrintf("12 - INV_FLARE\n");
+ DebugPrintf("13 - INV_COBB_RAP\n");
+ DebugPrintf("14 - INV_22_BULLET\n");
+ DebugPrintf("15 - INV_AUTO_RIFLE\n");
+ DebugPrintf("16 - INV_WIG\n");
+ DebugPrintf("17 - INV_FRANKIE_ID\n");
+ DebugPrintf("18 - INV_TYRONE_ID\n");
+ DebugPrintf("19 - INV_22_SNUB\n");
+ DebugPrintf("20 - INV_BOOKING_FRANKIE\n");
+ DebugPrintf("21 - INV_BOOKING_GANG\n");
+ DebugPrintf("22 - INV_FBI_TELETYPE\n");
+ DebugPrintf("23 - INV_DA_NOTE\n");
+ DebugPrintf("24 - INV_PRINT_OUT\n");
+ DebugPrintf("25 - INV_WAREHOUSE_KEYS\n");
+ DebugPrintf("26 - INV_CENTER_PUNCH\n");
+ DebugPrintf("27 - INV_TRANQ_GUN\n");
+ DebugPrintf("28 - INV_HOOK\n");
+ DebugPrintf("29 - INV_RAGS\n");
+ DebugPrintf("30 - INV_JAR\n");
+ DebugPrintf("31 - INV_SCREWDRIVER\n");
+ DebugPrintf("32 - INV_D_FLOPPY\n");
+ DebugPrintf("33 - INV_BLANK_DISK\n");
+ DebugPrintf("34 - INV_STICK\n");
+ DebugPrintf("35 - INV_CRATE1\n");
+ DebugPrintf("36 - INV_CRATE2\n");
+ DebugPrintf("37 - INV_SHOEBOX\n");
+ DebugPrintf("38 - INV_BADGE\n");
+ DebugPrintf("39 - INV_RENTAL_COUPON\n");
+ DebugPrintf("40 - INV_NICKEL\n");
+ DebugPrintf("41 - INV_LYLE_CARD\n");
+ DebugPrintf("42 - INV_CARTER_NOTE\n");
+ DebugPrintf("43 - INV_MUG_SHOT\n");
+ DebugPrintf("44 - INV_CLIPPING\n");
+ DebugPrintf("45 - INV_MICROFILM \n");
+ DebugPrintf("46 - INV_WAVE_KEYS\n");
+ DebugPrintf("47 - INV_RENTAL_KEYS\n");
+ DebugPrintf("48 - INV_NAPKIN\n");
+ DebugPrintf("49 - INV_DMV_PRINTOUT\n");
+ DebugPrintf("50 - INV_FISHING_NET\n");
+ DebugPrintf("51 - INV_ID\n");
+ DebugPrintf("52 - INV_9MM_BULLETS\n");
+ DebugPrintf("53 - INV_SCHEDULE\n");
+ DebugPrintf("54 - INV_GRENADES\n");
+ DebugPrintf("55 - INV_YELLOW_CORD\n");
+ DebugPrintf("56 - INV_HALF_YELLOW_CORD\n");
+ DebugPrintf("57 - INV_BLACK_CORD\n");
+ DebugPrintf("58 - INV_HALF_BLACK_CORD\n");
+ DebugPrintf("59 - INV_WARRANT\n");
+ DebugPrintf("60 - INV_JACKET\n");
+ DebugPrintf("61 - INV_GREENS_KNIFE\n");
+ DebugPrintf("62 - INV_DOG_WHISTLE\n");
+ DebugPrintf("63 - INV_AMMO_BELT\n");
+ DebugPrintf("64 - INV_CARAVAN_KEY\n");
+ return true;
+}
- for (uint p = 0; p < set.items.size(); ++p)
- destSurface.hLine(set.items[p].xs - sceneBounds.left, y - sceneBounds.top,
- set.items[p].xe - sceneBounds.left - 1, colIndex);
- }
- }
- }
+bool BlueForceDebugger::Cmd_MoveObject(int argc, const char **argv) {
+ // Check for a flag to clear
+ if ((argc < 2) || (argc > 3)){
+ DebugPrintf("Usage: %s <object number> [<scene number>]\n", argv[0]);
+ DebugPrintf("If no scene is specified, the object will be added to inventory\n");
+ return true;
}
- // Release the surface
- g_globals->_sceneManager._scene->_backSurface.unlockSurface();
+ int objNum = strToInt(argv[1]);
+ int sceneNum = 1;
+ if (argc == 3)
+ sceneNum = strToInt(argv[2]);
- // Mark the scene as requiring a full redraw
- g_globals->_paneRefreshFlag[0] = 2;
+ if ((objNum > 0) && (objNum < 65))
+ BF_INVENTORY.setObjectScene(objNum, sceneNum);
+ else
+ DebugPrintf("Invalid object Id %s\n", argv[1]);
- return false;
+ return true;
}
-/**
- * Play the specified sound
+/*
+ * This command lists the objects available, and their ID
*/
-bool Debugger::Cmd_Sound(int argc, const char **argv) {
- if (argc != 2) {
- DebugPrintf("Usage: %s <sound number>\n", argv[0]);
+bool Ringworld2Debugger::Cmd_ListObjects(int argc, const char **argv) {
+ if (argc != 1) {
+ DebugPrintf("Usage: %s\n", argv[0]);
return true;
}
- int soundNum = strToInt(argv[1]);
- g_globals->_soundHandler.play(soundNum);
- return false;
+ DebugPrintf("Available objects for this game are:\n");
+ DebugPrintf("1 - R2_OPTO_DISK\n");
+ DebugPrintf("2 - R2_2\n");
+ DebugPrintf("3 - R2_NEGATOR_GUN\n");
+ DebugPrintf("4 - R2_STEPPING_DISKS\n");
+ DebugPrintf("5 - R2_5\n");
+ DebugPrintf("6 - R2_6\n");
+ DebugPrintf("7 - R2_7\n");
+ DebugPrintf("8 - R2_8\n");
+ DebugPrintf("9 - R2_9\n");
+ DebugPrintf("10 - R2_10\n");
+ DebugPrintf("11 - R2_11\n");
+ DebugPrintf("12 - R2_12\n");
+ DebugPrintf("13 - R2_13\n");
+ DebugPrintf("14 - R2_14\n");
+ DebugPrintf("15 - R2_15\n");
+ DebugPrintf("16 - R2_16\n");
+ DebugPrintf("17 - R2_17\n");
+ DebugPrintf("18 - R2_18\n");
+ DebugPrintf("19 - R2_19\n");
+ DebugPrintf("20 - R2_20\n");
+ DebugPrintf("21 - R2_21\n");
+ DebugPrintf("22 - R2_22\n");
+ DebugPrintf("23 - R2_23\n");
+ DebugPrintf("24 - R2_24\n");
+ DebugPrintf("25 - R2_25\n");
+ DebugPrintf("26 - R2_26\n");
+ DebugPrintf("27 - R2_27\n");
+ DebugPrintf("28 - R2_28\n");
+ DebugPrintf("29 - R2_29\n");
+ DebugPrintf("30 - R2_30\n");
+ DebugPrintf("31 - R2_31\n");
+ DebugPrintf("32 - R2_32\n");
+ DebugPrintf("33 - R2_33\n");
+ DebugPrintf("34 - R2_34\n");
+ DebugPrintf("35 - R2_35\n");
+ DebugPrintf("36 - R2_36\n");
+ DebugPrintf("37 - R2_37\n");
+ DebugPrintf("38 - R2_38\n");
+ DebugPrintf("39 - R2_39\n");
+ DebugPrintf("40 - R2_40\n");
+ DebugPrintf("41 - R2_41\n");
+ DebugPrintf("42 - R2_42\n");
+ DebugPrintf("43 - R2_43\n");
+ DebugPrintf("44 - R2_44\n");
+ DebugPrintf("45 - R2_45\n");
+ DebugPrintf("46 - R2_46\n");
+ DebugPrintf("47 - R2_47\n");
+ DebugPrintf("48 - R2_48\n");
+ DebugPrintf("49 - R2_49\n");
+ DebugPrintf("50 - R2_50\n");
+ DebugPrintf("51 - R2_51\n");
+ DebugPrintf("52 - R2_52\n");
+
+ return true;
}
+bool Ringworld2Debugger::Cmd_MoveObject(int argc, const char **argv) {
+ // Check for a flag to clear
+ if ((argc < 2) || (argc > 3)){
+ DebugPrintf("Usage: %s <object number> [<scene number>]\n", argv[0]);
+ DebugPrintf("If no scene is specified, the object will be added to inventory\n");
+ return true;
+ }
+
+ int objNum = strToInt(argv[1]);
+ int sceneNum = 1;
+ if (argc == 3)
+ sceneNum = strToInt(argv[2]);
+
+ if ((objNum > 0) && (objNum < 53))
+ R2_INVENTORY.setObjectScene(objNum, sceneNum);
+ else
+ DebugPrintf("Invalid object Id %s\n", argv[1]);
+
+ return true;
+}
} // End of namespace TsAGE
diff --git a/engines/tsage/debugger.h b/engines/tsage/debugger.h
index fcdbc2d243..bf826a3f77 100644
--- a/engines/tsage/debugger.h
+++ b/engines/tsage/debugger.h
@@ -41,10 +41,34 @@ protected:
bool Cmd_SetFlag(int argc, const char **argv);
bool Cmd_GetFlag(int argc, const char **argv);
bool Cmd_ClearFlag(int argc, const char **argv);
- bool Cmd_ListObjects(int argc, const char **argv);
- bool Cmd_MoveObject(int argc, const char **argv);
bool Cmd_Hotspots(int argc, const char **argv);
bool Cmd_Sound(int argc, const char **argv);
+ virtual bool Cmd_ListObjects(int argc, const char **argv) = 0;
+ virtual bool Cmd_MoveObject(int argc, const char **argv) = 0;
+};
+
+class DemoDebugger : public Debugger {
+protected:
+ virtual bool Cmd_ListObjects(int argc, const char **argv);
+ virtual bool Cmd_MoveObject(int argc, const char **argv);
+};
+
+class RingworldDebugger : public Debugger {
+protected:
+ virtual bool Cmd_ListObjects(int argc, const char **argv);
+ virtual bool Cmd_MoveObject(int argc, const char **argv);
+};
+
+class BlueForceDebugger : public Debugger {
+protected:
+ virtual bool Cmd_ListObjects(int argc, const char **argv);
+ virtual bool Cmd_MoveObject(int argc, const char **argv);
+};
+
+class Ringworld2Debugger : public Debugger {
+protected:
+ virtual bool Cmd_ListObjects(int argc, const char **argv);
+ virtual bool Cmd_MoveObject(int argc, const char **argv);
};
} // End of namespace TsAGE
diff --git a/engines/tsage/detection.cpp b/engines/tsage/detection.cpp
index 12add10c58..0c458f5c35 100644
--- a/engines/tsage/detection.cpp
+++ b/engines/tsage/detection.cpp
@@ -74,7 +74,6 @@ enum {
class TSageMetaEngine : public AdvancedMetaEngine {
public:
TSageMetaEngine() : AdvancedMetaEngine(TsAGE::gameDescriptions, sizeof(TsAGE::tSageGameDescription), tSageGameTitles) {
- _md5Bytes = 5000;
_singleid = "tsage";
_guioptions = GUIO1(GUIO_NOSPEECH);
}
diff --git a/engines/tsage/detection_tables.h b/engines/tsage/detection_tables.h
index 360dbac0ae..d538cbacbf 100644
--- a/engines/tsage/detection_tables.h
+++ b/engines/tsage/detection_tables.h
@@ -105,7 +105,7 @@ static const tSageGameDescription gameDescriptions[] = {
AD_ENTRY1s("blue.rlb", "17c3993415e8a2cf93040eef7e88ec93", 1156508),
Common::EN_ANY,
Common::kPlatformPC,
- ADGF_UNSTABLE,
+ ADGF_TESTING,
GUIO2(GUIO_NOSPEECH, GUIO_NOSFX)
},
GType_BlueForce,
@@ -120,7 +120,7 @@ static const tSageGameDescription gameDescriptions[] = {
AD_ENTRY1s("blue.rlb", "17eabb456cb1546c66baf1aff387ba6a", 10032614),
Common::EN_ANY,
Common::kPlatformPC,
- ADGF_UNSTABLE,
+ ADGF_TESTING,
GUIO2(GUIO_NOSPEECH, GUIO_NOSFX)
},
GType_BlueForce,
@@ -134,13 +134,29 @@ static const tSageGameDescription gameDescriptions[] = {
AD_ENTRY1s("blue.rlb", "99983f48cb218f1f3760cf2f9a7ef11d", 63863322),
Common::EN_ANY,
Common::kPlatformPC,
- ADGF_CD | ADGF_UNSTABLE,
+ ADGF_CD | ADGF_TESTING,
GUIO2(GUIO_NOSPEECH, GUIO_NOSFX)
},
GType_BlueForce,
GF_CD | GF_ALT_REGIONS
},
-
+#if 0
+ // Blue Force Spanish doesn't yet work
+ // Blue Force Spanish CD
+ {
+ {
+ "blueforce",
+ "CD",
+ AD_ENTRY1s("blue.rlb", "5b2b35c51b62e82d82b0791540bfae2d", 10082565),
+ Common::ES_ESP,
+ Common::kPlatformPC,
+ ADGF_CD | ADGF_TESTING,
+ GUIO2(GUIO_NOSPEECH, GUIO_NOSFX)
+ },
+ GType_BlueForce,
+ GF_CD | GF_ALT_REGIONS
+ },
+#endif
// Return to Ringworld
{
{
@@ -150,7 +166,7 @@ static const tSageGameDescription gameDescriptions[] = {
Common::EN_ANY,
Common::kPlatformPC,
ADGF_CD | ADGF_UNSTABLE,
- GUIO2(GUIO_NOSPEECH, GUIO_NOSFX)
+ GUIO0()
},
GType_Ringworld2,
GF_CD | GF_ALT_REGIONS
diff --git a/engines/tsage/dialogs.cpp b/engines/tsage/dialogs.cpp
index 002835e76b..972d591c34 100644
--- a/engines/tsage/dialogs.cpp
+++ b/engines/tsage/dialogs.cpp
@@ -181,242 +181,6 @@ void ModalDialog::drawFrame() {
/*--------------------------------------------------------------------------*/
-bool GfxInvImage::process(Event &event) {
- if (!event.handled && (event.eventType == EVENT_BUTTON_DOWN)) {
- event.handled = _bounds.contains(event.mousePos);
- return event.handled;
- }
-
- return false;
-}
-
-/*--------------------------------------------------------------------------*/
-
-void InventoryDialog::show() {
- // Determine how many items are in the player's inventory
- int itemCount = 0;
- SynchronizedList<InvObject *>::iterator i;
- for (i = RING_INVENTORY._itemList.begin(); i != RING_INVENTORY._itemList.end(); ++i) {
- if ((*i)->inInventory())
- ++itemCount;
- }
-
- if (itemCount == 0) {
- MessageDialog::show(INV_EMPTY_MSG, OK_BTN_STRING);
- return;
- }
-
- InventoryDialog *dlg = new InventoryDialog();
- dlg->draw();
- dlg->execute();
- delete dlg;
-}
-
-InventoryDialog::InventoryDialog() {
- // Determine the maximum size of the image of any item in the player's inventory
- int imgWidth = 0, imgHeight = 0;
-
- SynchronizedList<InvObject *>::iterator i;
- for (i = RING_INVENTORY._itemList.begin(); i != RING_INVENTORY._itemList.end(); ++i) {
- InvObject *invObject = *i;
- if (invObject->inInventory()) {
- // Get the image for the item
- GfxSurface itemSurface = surfaceFromRes(invObject->_displayResNum, invObject->_rlbNum, invObject->_cursorNum);
-
- // Maintain the dimensions of the largest item image
- imgWidth = MAX(imgWidth, (int)itemSurface.getBounds().width());
- imgHeight = MAX(imgHeight, (int)itemSurface.getBounds().height());
-
- // Add the item to the display list
- GfxInvImage *img = new GfxInvImage();
- _images.push_back(img);
- img->setDetails(invObject->_displayResNum, invObject->_rlbNum, invObject->_cursorNum);
- img->_invObject = invObject;
- add(img);
- }
- }
- assert(_images.size() > 0);
-
- // Figure out the number of columns/rows to show all the items
- int cellsSize = 3;
- while ((cellsSize * cellsSize) < (int)_images.size())
- ++cellsSize;
-
- // Set the position of each inventory item to be displayed
- int cellX = 0;
- Common::Point pt(0, 0);
-
- for (uint idx = 0; idx < _images.size(); ++idx) {
- if (cellX == cellsSize) {
- // Move to the start of the next line
- pt.x = 0;
- pt.y += imgHeight + 2;
- cellX = 0;
- }
-
- _images[idx]->_bounds.moveTo(pt.x, pt.y);
-
- pt.x += imgWidth + 2;
- ++cellX;
- }
-
- // Set up the buttons
- pt.y += imgHeight + 2;
- _btnOk.setText(OK_BTN_STRING);
- _btnOk._bounds.moveTo((imgWidth + 2) * cellsSize - _btnOk._bounds.width(), pt.y);
- _btnLook.setText(LOOK_BTN_STRING);
- _btnLook._bounds.moveTo(_btnOk._bounds.left - _btnLook._bounds.width() - 2, _btnOk._bounds.top);
- addElements(&_btnLook, &_btnOk, NULL);
-
- frame();
- setCenter(SCREEN_CENTER_X, SCREEN_CENTER_Y);
-}
-
-InventoryDialog::~InventoryDialog() {
- for (uint idx = 0; idx < _images.size(); ++idx)
- delete _images[idx];
-}
-
-void InventoryDialog::execute() {
- if ((RING_INVENTORY._selectedItem) && RING_INVENTORY._selectedItem->inInventory())
- RING_INVENTORY._selectedItem->setCursor();
-
- GfxElement *hiliteObj;
- bool lookFlag = false;
- _gfxManager.activate();
-
- while (!g_vm->shouldQuit()) {
- // Get events
- Event event;
- while (!g_globals->_events.getEvent(event) && !g_vm->shouldQuit()) {
- g_system->delayMillis(10);
- g_system->updateScreen();
- }
- if (g_vm->shouldQuit())
- break;
-
- hiliteObj = NULL;
- if ((event.eventType == EVENT_BUTTON_DOWN) && !_bounds.contains(event.mousePos))
- break;
-
- // Pass event to elements
- event.mousePos.x -= _gfxManager._bounds.left;
- event.mousePos.y -= _gfxManager._bounds.top;
-
- for (GfxElementList::iterator i = _elements.begin(); i != _elements.end(); ++i) {
- if ((*i)->process(event))
- hiliteObj = *i;
- }
-
- if (!event.handled && event.eventType == EVENT_KEYPRESS) {
- if ((event.kbd.keycode == Common::KEYCODE_RETURN) || (event.kbd.keycode == Common::KEYCODE_ESCAPE)) {
- // Exit the dialog
- //hiliteObj = &_btnOk;
- break;
- }
- }
-
- if (hiliteObj == &_btnOk) {
- // Ok button clicked
- if (lookFlag)
- g_globals->_events.setCursor(CURSOR_WALK);
- break;
- } else if (hiliteObj == &_btnLook) {
- // Look button clicked
- if (_btnLook._message == LOOK_BTN_STRING) {
- _btnLook._message = PICK_BTN_STRING;
- lookFlag = 1;
- g_globals->_events.setCursor(CURSOR_LOOK);
- } else {
- _btnLook._message = LOOK_BTN_STRING;
- lookFlag = 0;
- g_globals->_events.setCursor(CURSOR_WALK);
- }
-
- hiliteObj->draw();
- } else if (hiliteObj) {
- // Inventory item selected
- InvObject *invObject = static_cast<GfxInvImage *>(hiliteObj)->_invObject;
- if (lookFlag) {
- g_globals->_screenSurface.displayText(invObject->_description);
- } else {
- RING_INVENTORY._selectedItem = invObject;
- invObject->setCursor();
- }
- }
- }
-
- _gfxManager.deactivate();
-}
-
-/*--------------------------------------------------------------------------*/
-
-void OptionsDialog::show() {
- OptionsDialog *dlg = new OptionsDialog();
- dlg->draw();
-
- GfxButton *btn = dlg->execute();
-
- if (btn == &dlg->_btnQuit) {
- // Quit game
- if (MessageDialog::show(QUIT_CONFIRM_MSG, CANCEL_BTN_STRING, QUIT_BTN_STRING) == 1) {
- g_vm->quitGame();
- }
- } else if (btn == &dlg->_btnRestart) {
- // Restart game
- g_globals->_game->restartGame();
- } else if (btn == &dlg->_btnSound) {
- // Sound dialog
- SoundDialog::execute();
- } else if (btn == &dlg->_btnSave) {
- // Save button
- g_globals->_game->saveGame();
- } else if (btn == &dlg->_btnRestore) {
- // Restore button
- g_globals->_game->restoreGame();
- }
-
- dlg->remove();
- delete dlg;
-}
-
-OptionsDialog::OptionsDialog() {
- // Set the element text
- _gfxMessage.set(OPTIONS_MSG, 140, ALIGN_LEFT);
- _btnRestore.setText(RESTORE_BTN_STRING);
- _btnSave.setText(SAVE_BTN_STRING);
- _btnRestart.setText(RESTART_BTN_STRING);
- _btnQuit.setText(QUIT_BTN_STRING);
- _btnSound.setText(SOUND_BTN_STRING);
- _btnResume.setText(RESUME_BTN_STRING);
-
- // Set position of the elements
- _gfxMessage._bounds.moveTo(0, 1);
- _btnRestore._bounds.moveTo(0, _gfxMessage._bounds.bottom + 1);
- _btnSave._bounds.moveTo(0, _btnRestore._bounds.bottom + 1);
- _btnRestart._bounds.moveTo(0, _btnSave._bounds.bottom + 1);
- _btnQuit._bounds.moveTo(0, _btnRestart._bounds.bottom + 1);
- _btnSound._bounds.moveTo(0, _btnQuit._bounds.bottom + 1);
- _btnResume._bounds.moveTo(0, _btnSound._bounds.bottom + 1);
-
- // Set all the buttons to the widest button
- GfxButton *btnList[6] = {&_btnRestore, &_btnSave, &_btnRestart, &_btnQuit, &_btnSound, &_btnResume};
- int16 btnWidth = 0;
- for (int idx = 0; idx < 6; ++idx)
- btnWidth = MAX(btnWidth, btnList[idx]->_bounds.width());
- for (int idx = 0; idx < 6; ++idx)
- btnList[idx]->_bounds.setWidth(btnWidth);
-
- // Add the items to the dialog
- addElements(&_gfxMessage, &_btnRestore, &_btnSave, &_btnRestart, &_btnQuit, &_btnSound, &_btnResume, NULL);
-
- // Set the dialog size and position
- frame();
- setCenter(160, 100);
-}
-
-/*--------------------------------------------------------------------------*/
-
void SoundDialog::execute() {
ConfigDialog *dlg = new ConfigDialog();
dlg->runModal();
diff --git a/engines/tsage/dialogs.h b/engines/tsage/dialogs.h
index 35ed60ba1a..33b55093d0 100644
--- a/engines/tsage/dialogs.h
+++ b/engines/tsage/dialogs.h
@@ -60,47 +60,6 @@ public:
/*--------------------------------------------------------------------------*/
-class GfxInvImage : public GfxImage {
-public:
- InvObject *_invObject;
-public:
- GfxInvImage() : GfxImage(), _invObject(NULL) {}
-
- virtual bool process(Event &event);
-};
-
-#define MAX_INVOBJECT_DISPLAY 20
-
-class InventoryDialog : public ModalDialog {
-private:
- Common::Array<GfxInvImage *> _images;
- GfxButton _btnOk, _btnLook;
-public:
- InventoryDialog();
- virtual ~InventoryDialog();
- void execute();
-
- static void show();
-};
-
-/*--------------------------------------------------------------------------*/
-
-class OptionsDialog : public ModalDialog {
-private:
- GfxButton _btnSave, _btnRestore, _btnRestart;
- GfxButton _btnQuit, _btnResume;
- GfxButton _btnSound;
- GfxMessage _gfxMessage;
-public:
- OptionsDialog();
- virtual ~OptionsDialog() {}
- GfxButton *execute() { return GfxDialog::execute(&_btnResume); }
-
- static void show();
-};
-
-/*--------------------------------------------------------------------------*/
-
class SoundDialog {
public:
static void execute();
diff --git a/engines/tsage/events.cpp b/engines/tsage/events.cpp
index 073cbc35b9..8f07a8243b 100644
--- a/engines/tsage/events.cpp
+++ b/engines/tsage/events.cpp
@@ -50,7 +50,7 @@ bool EventsClass::pollEvent() {
++_frameNumber;
// Update screen
- g_system->updateScreen();
+ GLOBALS._screenSurface.updateScreen();
}
if (!g_system->getEventManager()->pollEvent(_event)) return false;
@@ -221,7 +221,8 @@ void EventsClass::setCursor(CursorType cursorType) {
case CURSOR_WALK:
default:
- if (g_vm->getGameID() == GType_BlueForce) {
+ switch (g_vm->getGameID()) {
+ case GType_BlueForce:
if (cursorType == CURSOR_WALK) {
cursor = g_resourceManager->getSubResource(1, 5, 1, &size);
} else {
@@ -231,13 +232,45 @@ void EventsClass::setCursor(CursorType cursorType) {
questionEnabled = true;
}
_currentCursor = cursorType;
- } else {
+ break;
+ case GType_Ringworld2:
+ if (cursorType == CURSOR_WALK) {
+ cursor = CURSOR_WALK_DATA;
+ delFlag = false;
+ } else {
+ // Inventory icon
+ InvObject *invObject = g_globals->_inventory->getItem((int)cursorType);
+ cursor = g_resourceManager->getSubResource(6, invObject->_strip, invObject->_frame, &size);
+ questionEnabled = true;
+ }
+ _currentCursor = cursorType;
+ break;
+ default:
// For Ringworld, always treat as the walk cursor
cursor = CURSOR_WALK_DATA;
_currentCursor = CURSOR_WALK;
delFlag = false;
+ break;
}
break;
+
+ // Ringworld 2 specific cursors
+ case EXITCURSOR_N:
+ case EXITCURSOR_S:
+ case EXITCURSOR_W:
+ case EXITCURSOR_E:
+ case EXITCURSOR_LEFT_HAND:
+ case CURSOR_INVALID:
+ case EXITCURSOR_NE:
+ case EXITCURSOR_SE:
+ case EXITCURSOR_SW:
+ case EXITCURSOR_NW:
+ case SHADECURSOR_UP:
+ case SHADECURSOR_DOWN:
+ case SHADECURSOR_HAND:
+ _currentCursor = cursorType;
+ cursor = g_resourceManager->getSubResource(5, 1, cursorType - R2CURSORS_START, &size);
+ break;
}
// Decode the cursor
@@ -251,8 +284,8 @@ void EventsClass::setCursor(CursorType cursorType) {
if (delFlag)
DEALLOCATE(cursor);
- // For Blue Force, enable the question button when an inventory icon is selected
- if (g_vm->getGameID() == GType_BlueForce)
+ // For Blue Force and Return to Ringworld, enable the question button when an inventory icon is selected
+ if (g_vm->getGameID() != GType_Ringworld)
T2_GLOBALS._uiElements._question.setEnabled(questionEnabled);
}
@@ -320,7 +353,6 @@ void EventsClass::setCursor(Graphics::Surface &cursor, int transColor, const Com
}
void EventsClass::setCursor(GfxSurface &cursor) {
- // TODO: Find proper parameters for this form in Blue Force
Graphics::Surface s = cursor.lockSurface();
const byte *cursorData = (const byte *)s.getBasePtr(0, 0);
@@ -354,7 +386,7 @@ bool EventsClass::isCursorVisible() const {
*/
void EventsClass::delay(int numFrames) {
while (_frameNumber < (_prevDelayFrame + numFrames)) {
- uint32 delayAmount = CLIP(_priorFrameTime + GAME_FRAME_TIME - g_system->getMillis(),
+ uint32 delayAmount = CLIP(_priorFrameTime + GAME_SCRIPT_TIME - g_system->getMillis(),
(uint32)0, (uint32)GAME_FRAME_TIME);
if (delayAmount > 0)
g_system->delayMillis(delayAmount);
@@ -363,7 +395,7 @@ void EventsClass::delay(int numFrames) {
_priorFrameTime = g_system->getMillis();
}
- g_system->updateScreen();
+ GLOBALS._screenSurface.updateScreen();
_prevDelayFrame = _frameNumber;
_priorFrameTime = g_system->getMillis();
}
diff --git a/engines/tsage/events.h b/engines/tsage/events.h
index 874020f140..475db47315 100644
--- a/engines/tsage/events.h
+++ b/engines/tsage/events.h
@@ -36,9 +36,12 @@ enum EventType {EVENT_NONE = 0, EVENT_BUTTON_DOWN = 1, EVENT_BUTTON_UP = 2, EVEN
enum ButtonShiftFlags {BTNSHIFT_LEFT = 0, BTNSHIFT_RIGHT = 3, BTNSHIFT_MIDDLE = 4};
-// Intrinisc game delay between execution frames. This runs at 60Hz
-#define GAME_FRAME_RATE 60
-#define GAME_FRAME_TIME (1000 / 60)
+// Intrinisc game delay between execution frames
+#define GAME_FRAME_RATE 50
+#define GAME_FRAME_TIME (1000 / GAME_FRAME_RATE)
+
+#define GAME_SCRIPT_RATE 80
+#define GAME_SCRIPT_TIME (1000 / GAME_SCRIPT_RATE)
class GfxManager;
@@ -83,14 +86,28 @@ enum CursorType {
INV_CARAVAN_KEY = 67, BF_LAST_INVENT = 68,
// Ringworld 2 objects
- R2_1 = 1, R2_2 = 2, R2_3 = 3, R2_STEPPING_DISKS = 4, R2_5 = 5, R2_6 = 6, R2_7 = 7,
- R2_8 = 8, R2_9 = 9, R2_10 = 10, R2_11 = 11, R2_12 = 12, R2_13 = 13, R2_14 = 14,
- R2_15 = 15, R2_16 = 16, R2_17 = 17, R2_18 = 18, R2_19 = 19, R2_20 = 20, R2_21 = 21,
- R2_22 = 22, R2_23 = 23, R2_24 = 24, R2_25 = 25, R2_26 = 26, R2_27 = 27, R2_28 = 28,
- R2_29 = 29, R2_30 = 30, R2_31 = 31, R2_32 = 32, R2_33 = 33, R2_34 = 34, R2_35 = 35,
- R2_36 = 36, R2_37 = 37, R2_38 = 38, R2_39 = 39, R2_40 = 40, R2_41 = 41, R2_42 = 42,
- R2_43 = 43, R2_44 = 44, R2_45 = 45, R2_46 = 46, R2_47 = 47, R2_48 = 48, R2_49 = 49,
- R2_50 = 50, R2_51 = 51, R2_52 = 52,
+ R2_OPTO_DISK = 1, R2_READER = 2, R2_NEGATOR_GUN = 3, R2_STEPPING_DISKS = 4,
+ R2_ATTRACTOR_UNIT = 5, R2_SENSOR_PROBE = 6, R2_SONIC_STUNNER = 7,
+ R2_CABLE_HARNESS = 8, R2_COM_SCANNER = 9, R2_SPENT_POWER_CAPSULE = 10,
+ R2_CHARGED_POWER_CAPSULE = 11, R2_AEROSOL = 12, R2_REMOTE_CONTROL = 13,
+ R2_OPTICAL_FIBRE = 14, R2_CLAMP = 15, R2_ATTRACTOR_CABLE_HARNESS = 16,
+ R2_FUEL_CELL = 17, R2_GYROSCOPE = 18, R2_AIRBAG = 19, R2_REBREATHER_TANK = 20,
+ R2_RESERVE_REBREATHER_TANK = 21, R2_GUIDANCE_MODULE = 22, R2_THRUSTER_VALVE = 23,
+ R2_BALLOON_BACKPACK = 24, R2_RADAR_MECHANISM = 25, R2_JOYSTICK = 26,
+ R2_IGNITOR = 27, R2_DIAGNOSTICS_DISPLAY = 28, R2_GLASS_DOME = 29, R2_WICK_LAMP = 30,
+ R2_SCRITH_KEY = 31, R2_TANNER_MASK = 32, R2_PURE_GRAIN_ALCOHOL = 33, R2_SAPPHIRE_BLUE = 34,
+ R2_ANCIENT_SCROLLS = 35, R2_FLUTE = 36, R2_GUNPOWDER = 37, R2_NONAME = 38,
+ R2_COM_SCANNER_2 = 39, R2_SUPERCONDUCTOR_WIRE = 40, R2_PILLOW = 41, R2_FOOD_TRAY = 42,
+ R2_LASER_HACKSAW = 43, R2_PHOTON_STUNNER = 44, R2_BATTERY = 45, R2_SOAKED_FACEMASK = 46,
+ R2_LIGHT_BULB = 47, R2_ALCOHOL_LAMP = 48, R2_ALCOHOL_LAMP_2 = 49, R2_ALCOHOL_LAMP_3 = 50,
+ R2_BROKEN_DISPLAY = 51, R2_TOOLBOX = 52, R2_LAST_INVENT = 53,
+
+ // Ringworld 2 cursors
+ R2CURSORS_START = 0x8000, EXITCURSOR_N = 0x8007, EXITCURSOR_S = 0x8008, EXITCURSOR_W = 0x8009,
+ EXITCURSOR_E = 0x800A, EXITCURSOR_LEFT_HAND = 0x800B, CURSOR_INVALID = 0x800C,
+ EXITCURSOR_NE = 0x800D, EXITCURSOR_SE = 0x800E, EXITCURSOR_SW = 0x800F, EXITCURSOR_NW = 0x8010,
+ SHADECURSOR_UP = 0x8011, SHADECURSOR_DOWN = 0x8012, SHADECURSOR_HAND = 0x8013,
+ R2_CURSOR_20 = 0x8014, R2_CURSOR_21 = 0x8015, R2_CURSOR_22 = 0x8016, R2_CURSOR_23 = 0x8017,
// Cursors
CURSOR_WALK = 0x100, CURSOR_LOOK = 0x200, CURSOR_700 = 700, CURSOR_USE = 0x400, CURSOR_TALK = 0x800,
@@ -132,7 +149,7 @@ public:
Common::EventType type() { return _event.type; }
uint32 getFrameNumber() const { return _frameNumber; }
void delay(int numFrames);
- bool isInventoryIcon() const { return _currentCursor < 256; }
+ bool isInventoryIcon() const { return (_currentCursor >= 0) && (_currentCursor < 256); }
void proc1() { warning("TODO: EventsClass::proc1"); }
virtual void listenerSynchronize(Serializer &s);
diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp
index 7711e7fba7..59eb59b194 100644
--- a/engines/tsage/globals.cpp
+++ b/engines/tsage/globals.cpp
@@ -78,12 +78,15 @@ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface
_dialogCenter.y = 140;
} else if (g_vm->getGameID() == GType_Ringworld2) {
// Return to Ringworld
- _gfxFontNumber = 2;
- _gfxColors.background = 89;
- _gfxColors.foreground = 83;
- _fontColors.background = 88;
- _fontColors.foreground = 92;
- _dialogCenter.y = 140;
+ _gfxFontNumber = 50;
+ _gfxColors.background = 0;
+ _gfxColors.foreground = 59;
+ _fontColors.background = 4;
+ _fontColors.foreground = 15;
+ _color1 = 59;
+ _color2 = 15;
+ _color3 = 4;
+ _dialogCenter.y = 100;
} else if ((g_vm->getGameID() == GType_Ringworld) && (g_vm->getFeatures() & GF_CD)) {
_gfxFontNumber = 50;
_gfxColors.background = 53;
@@ -94,6 +97,7 @@ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface
_color2 = 18;
_color3 = 18;
} else {
+ // Ringworld
_gfxFontNumber = 50;
_gfxColors.background = 53;
_gfxColors.foreground = 18;
@@ -137,7 +141,7 @@ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface
case GType_Ringworld2:
_inventory = new Ringworld2::Ringworld2InvObjectList();
_game = new Ringworld2::Ringworld2Game();
- _sceneHandler = new SceneHandler();
+ _sceneHandler = new Ringworld2::SceneHandlerExt();
break;
}
}
@@ -151,7 +155,7 @@ Globals::~Globals() {
}
void Globals::reset() {
- Common::set_to(&_flags[0], &_flags[MAX_FLAGS], false);
+ Common::fill(&_flags[0], &_flags[MAX_FLAGS], false);
g_saver->addFactory(classFactoryProc);
}
@@ -184,6 +188,9 @@ void Globals::synchronize(Serializer &s) {
s.syncAsSint16LE(_prevSceneOffset.x); s.syncAsSint16LE(_prevSceneOffset.y);
SYNC_POINTER(_scrollFollower);
s.syncAsSint32LE(_stripNum);
+
+ if (s.getVersion() >= 8)
+ _walkRegions.synchronize(s);
}
void Globals::dispatchSound(ASound *obj) {
@@ -205,6 +212,12 @@ void TsAGE2Globals::reset() {
T2_GLOBALS._uiElements._active = false;
}
+void TsAGE2Globals::synchronize(Serializer &s) {
+ Globals::synchronize(s);
+
+ s.syncAsSint16LE(_interfaceY);
+}
+
/*--------------------------------------------------------------------------*/
namespace BlueForce {
@@ -213,24 +226,27 @@ BlueForceGlobals::BlueForceGlobals(): TsAGE2Globals() {
}
void BlueForceGlobals::synchronize(Serializer &s) {
- Globals::synchronize(s);
+ TsAGE2Globals::synchronize(s);
s.syncAsSint16LE(_dayNumber);
- s.syncAsSint16LE(_v4CEA4);
- s.syncAsSint16LE(_v4CEAA);
+ if (s.getVersion() < 9) {
+ int tmpVar = 0;
+ s.syncAsSint16LE(tmpVar);
+ }
+ s.syncAsSint16LE(_tonyDialogCtr);
s.syncAsSint16LE(_marinaWomanCtr);
- s.syncAsSint16LE(_v4CEB0);
+ s.syncAsSint16LE(_kateDialogCtr);
s.syncAsSint16LE(_v4CEB6);
s.syncAsSint16LE(_safeCombination);
- s.syncAsSint16LE(_v4CEC0);
+ s.syncAsSint16LE(_gateStatus);
s.syncAsSint16LE(_greenDay5TalkCtr);
s.syncAsSint16LE(_v4CEC4);
s.syncAsSint16LE(_v4CEC8);
s.syncAsSint16LE(_v4CECA);
s.syncAsSint16LE(_v4CECC);
for (int i = 0; i < 18; i++)
- s.syncAsByte(_v4CECE[i]);
- s.syncAsSint16LE(_v4CEE0);
+ s.syncAsByte(_breakerBoxStatusArr[i]);
+ s.syncAsSint16LE(_hiddenDoorStatus);
s.syncAsSint16LE(_v4CEE2);
s.syncAsSint16LE(_v4CEE4);
s.syncAsSint16LE(_v4CEE6);
@@ -244,15 +260,14 @@ void BlueForceGlobals::synchronize(Serializer &s) {
s.syncAsSint16LE(_v501FC);
s.syncAsSint16LE(_v5020C);
s.syncAsSint16LE(_v50696);
- s.syncAsSint16LE(_v5098C);
- s.syncAsSint16LE(_v5098D);
+ s.syncAsSint16LE(_subFlagBitArr1);
+ s.syncAsSint16LE(_subFlagBitArr2);
s.syncAsSint16LE(_v50CC2);
s.syncAsSint16LE(_v50CC4);
s.syncAsSint16LE(_v50CC6);
s.syncAsSint16LE(_v50CC8);
s.syncAsSint16LE(_v51C42);
s.syncAsSint16LE(_v51C44);
- s.syncAsSint16LE(_interfaceY);
s.syncAsSint16LE(_bookmark);
s.syncAsSint16LE(_mapLocationId);
s.syncAsSint16LE(_clip1Bullets);
@@ -275,37 +290,36 @@ void BlueForceGlobals::reset() {
_interfaceY = UI_INTERFACE_Y;
_dayNumber = 0;
- _v4CEA4 = 0;
- _v4CEAA = 0;
+ _tonyDialogCtr = 0;
_marinaWomanCtr = 0;
- _v4CEB0 = 0;
+ _kateDialogCtr = 0;
_v4CEB6 = 0;
_safeCombination = 0;
- _v4CEC0 = 0;
+ _gateStatus = 0;
_greenDay5TalkCtr = 0;
_v4CEC4 = 0;
_v4CEC8 = 1;
_v4CECA = 0;
_v4CECC = 0;
- _v4CECE[0] = 2;
- _v4CECE[1] = 2;
- _v4CECE[2] = 2;
- _v4CECE[3] = 1;
- _v4CECE[4] = 2;
- _v4CECE[5] = 2;
- _v4CECE[6] = 2;
- _v4CECE[7] = 2;
- _v4CECE[8] = 2;
- _v4CECE[9] = 2;
- _v4CECE[10] = 2;
- _v4CECE[11] = 2;
- _v4CECE[12] = 1;
- _v4CECE[13] = 1;
- _v4CECE[14] = 2;
- _v4CECE[15] = 2;
- _v4CECE[16] = 3;
- _v4CECE[17] = 0;
- _v4CEE0 = 0;
+ _breakerBoxStatusArr[0] = 2;
+ _breakerBoxStatusArr[1] = 2;
+ _breakerBoxStatusArr[2] = 2;
+ _breakerBoxStatusArr[3] = 1;
+ _breakerBoxStatusArr[4] = 2;
+ _breakerBoxStatusArr[5] = 2;
+ _breakerBoxStatusArr[6] = 2;
+ _breakerBoxStatusArr[7] = 2;
+ _breakerBoxStatusArr[8] = 2;
+ _breakerBoxStatusArr[9] = 2;
+ _breakerBoxStatusArr[10] = 2;
+ _breakerBoxStatusArr[11] = 2;
+ _breakerBoxStatusArr[12] = 1;
+ _breakerBoxStatusArr[13] = 1;
+ _breakerBoxStatusArr[14] = 2;
+ _breakerBoxStatusArr[15] = 2;
+ _breakerBoxStatusArr[16] = 3;
+ _breakerBoxStatusArr[17] = 0;
+ _hiddenDoorStatus = 0;
_v4CEE2 = 0;
_v4CEE4 = 0;
_v4CEE6 = 0;
@@ -317,8 +331,8 @@ void BlueForceGlobals::reset() {
_v501FC = 0;
_v5020C = 0;
_v50696 = 0;
- _v5098C = 0;
- _v5098D = 0;
+ _subFlagBitArr1 = 0;
+ _subFlagBitArr2 = 0;
_v50CC2 = 0;
_v50CC4 = 0;
_v50CC6 = 0;
@@ -359,9 +373,183 @@ void Ringworld2Globals::reset() {
R2_INVENTORY.reset();
T2_GLOBALS._uiElements.updateInventory();
T2_GLOBALS._uiElements._active = false;
-}
+ // Reset fields
+ Common::fill(&_v1000[0], &_v1000[0x1000], 0);
+ _v1000Flag = false;
+ _v5589E.set(0, 0, 0, 0);
+ _v558B6.set(0, 0, 0, 0);
+ _v558C2 = 0;
+ _animationCtr = 0;
+ _v5657C = 0;
+ _v565E1 = 0;
+ _v565E3 = 0;
+ _v565E5 = 0;
+ _v565E7 = 0;
+ _v565E9 = -5;
+ _v565EB = 26;
+ _v565F5 = 0;
+ _v565F6 = 0;
+ _v565FA = 0;
+ _v565AE = 0;
+ _v56605[0] = 0;
+ _v56605[1] = 3;
+ _v56605[2] = 5;
+ _v56605[3] = 1;
+ _v56605[4] = 2;
+ _v56605[5] = 5;
+ _v56605[6] = 9;
+ _v56605[7] = 14;
+ _v56605[8] = 15;
+ _v56605[9] = 18;
+ _v56605[10] = 20;
+ _v56605[11] = 25;
+ _v56605[12] = 27;
+ _v56605[13] = 31;
+
+ for (int i = 0; i < 18; i++) {
+ _v56613[(i * 4) ] = 1;
+ _v56613[(i * 4) + 2] = 0;
+ _v56613[(i * 4) + 3] = 0;
+ }
+ _v56613[( 0 * 4) + 1] = 1;
+ _v56613[( 1 * 4) + 1] = 2;
+ _v56613[( 2 * 4) + 1] = 2;
+ _v56613[( 3 * 4) + 1] = 3;
+ _v56613[( 4 * 4) + 1] = 2;
+ _v56613[( 5 * 4) + 1] = 2;
+ _v56613[( 6 * 4) + 1] = 3;
+ _v56613[( 7 * 4) + 1] = 1;
+ _v56613[( 8 * 4) + 1] = 1;
+ _v56613[( 9 * 4) + 1] = 3;
+ _v56613[(10 * 4) + 1] = 3;
+ _v56613[(11 * 4) + 1] = 1;
+ _v56613[(12 * 4) + 1] = 2;
+ _v56613[(13 * 4) + 1] = 3;
+ _v56613[(14 * 4) + 1] = 2;
+ _v56613[(15 * 4) + 1] = 3;
+ _v56613[(16 * 4) + 1] = 1;
+ _v56613[(17 * 4) + 1] = 1;
+
+ _v566A6 = 3800;
+ _v566A3 = 2;
+ _v566A4 = 1;
+ _v566A5 = 0;
+ _v566A8 = 5;
+ _v566A9 = 0;
+ _v566AA = 0;
+ for (int i = 0; i < 1000; i++)
+ _v566AB[i] = 0;
+ _v56A93 = -1;
+ _v56A99 = 5;
+ _scene1925CurrLevel = 0; //_v56A9C
+ _v56A9E = 0;
+ _v56AA0 = 0;
+ _v56AA1 = 0;
+ _v56AA2 = 60;
+ _v56AA4 = 660;
+ _v56AA6 = 1;
+ _v56AA7 = 1;
+ _v56AA8 = 1;
+ _v56AAB = 0;
+ _scene180Mode = -1;
+ _v57709 = 0;
+ _v5780C = 0;
+ _v5780E = 0;
+ _v57810 = 0;
+ _v57C2C = 0;
+ _v565EC[0] = 0;
+ _v565EC[1] = 27;
+ _v565EC[2] = 27;
+ _v565EC[3] = 4;
+ _v565EC[4] = 4;
+ Common::fill(&_v565F1[0], &_v565F1[MAX_CHARACTERS], 1);
+ _speechSubtitles = SPEECH_VOICE | SPEECH_TEXT;
+ _insetUp = 0;
+ _frameEdgeColour = 2;
+ Common::fill(&_stripManager_lookupList[0], &_stripManager_lookupList[12], 0);
+ _stripManager_lookupList[0] = 1;
+ _stripManager_lookupList[1] = 1;
+ _stripManager_lookupList[2] = 1;
+ _stripManager_lookupList[3] = 1;
+ _stripManager_lookupList[4] = 1;
+ _stripManager_lookupList[5] = 1;
+ _stripManager_lookupList[8] = 1;
+ _stripManager_lookupList[9] = 1;
+ _stripManager_lookupList[10] = 1;
+ _stripManager_lookupList[11] = 1;
+
+ // Reset fields stored in the player class
+ _player._characterIndex = R2_QUINN;
+ _player._characterScene[1] = 100;
+ _player._characterScene[2] = 300;
+ _player._characterScene[3] = 300;
+}
+void Ringworld2Globals::synchronize(Serializer &s) {
+ TsAGE2Globals::synchronize(s);
+ int i;
+
+ _v5589E.synchronize(s);
+ _v558B6.synchronize(s);
+
+ s.syncAsSint16LE(_v558C2);
+ s.syncAsSint16LE(_animationCtr);
+ s.syncAsSint16LE(_v5657C);
+ s.syncAsSint16LE(_v565E1);
+ s.syncAsSint16LE(_v565E3);
+ s.syncAsSint16LE(_v565E5);
+ s.syncAsSint16LE(_v565E7);
+ s.syncAsSint16LE(_v565E9);
+ s.syncAsSint16LE(_v565EB);
+ s.syncAsSint16LE(_v565F5);
+ s.syncAsSint16LE(_v565F6);
+ s.syncAsSint16LE(_v565FA);
+ s.syncAsSint16LE(_v566A3);
+ s.syncAsSint16LE(_v566A6);
+ s.syncAsSint16LE(_v56A93);
+ s.syncAsSint16LE(_scene1925CurrLevel); // _v56A9C
+ s.syncAsSint16LE(_v56A9E);
+ s.syncAsSint16LE(_v56AA2);
+ s.syncAsSint16LE(_v56AA4);
+ s.syncAsSint16LE(_v56AAB);
+ s.syncAsSint16LE(_scene180Mode);
+ s.syncAsSint16LE(_v57709);
+ s.syncAsSint16LE(_v5780C);
+ s.syncAsSint16LE(_v5780E);
+ s.syncAsSint16LE(_v57810);
+ s.syncAsSint16LE(_v57C2C);
+ s.syncAsSint16LE(_speechSubtitles);
+
+ for (i = 0; i < 5; i++)
+ s.syncAsByte(_v565EC[i]);
+
+ for (i = 0; i < MAX_CHARACTERS; ++i)
+ s.syncAsByte(_v565F1[i]);
+
+ s.syncAsByte(_v565AE);
+ s.syncAsByte(_v566A4);
+ s.syncAsByte(_v566A5);
+ s.syncAsByte(_v566A8);
+ s.syncAsByte(_v566A9);
+ s.syncAsByte(_v566AA);
+ s.syncAsByte(_v56AA0);
+ s.syncAsByte(_v56AA1);
+ s.syncAsByte(_v56AA6);
+ s.syncAsByte(_v56AA7);
+ s.syncAsByte(_v56AA8);
+
+ for (i = 0; i < 14; ++i)
+ s.syncAsByte(_v56605[i]);
+ for (i = 0; i < 1000; ++i)
+ s.syncAsByte(_v566AB[i]);
+ s.syncAsByte(_v56A99);
+ for (i = 0; i < 12; ++i)
+ s.syncAsByte(_stripManager_lookupList[i]);
+
+ s.syncAsSint16LE(_insetUp);
+ s.syncAsByte(_frameEdgeColour);
+}
} // end of namespace Ringworld2
diff --git a/engines/tsage/globals.h b/engines/tsage/globals.h
index a5293a5ad1..45226c921b 100644
--- a/engines/tsage/globals.h
+++ b/engines/tsage/globals.h
@@ -108,9 +108,11 @@ public:
UIElements _uiElements;
SelectItemProc _onSelectItem;
int _interfaceY;
+ ASoundExt _inventorySound;
TsAGE2Globals() { _onSelectItem = NULL; }
virtual void reset();
+ virtual void synchronize(Serializer &s);
};
extern Globals *g_globals;
@@ -182,23 +184,22 @@ enum Flag {
class BlueForceGlobals: public TsAGE2Globals {
public:
- ASoundExt _sound1, _sound2, _sound3;
+ ASoundExt _sound1, _sound3;
StripProxy _stripProxy;
int _dayNumber;
- int _v4CEA4;
- int _v4CEAA;
+ int _tonyDialogCtr;
int _marinaWomanCtr;
- int _v4CEB0;
+ int _kateDialogCtr;
int _v4CEB6;
int _safeCombination;
- int _v4CEC0;
+ int _gateStatus;
int _greenDay5TalkCtr;
int _v4CEC4;
int _v4CEC8;
int _v4CECA;
int _v4CECC;
- int8 _v4CECE[18];
- int _v4CEE0;
+ int8 _breakerBoxStatusArr[18];
+ int _hiddenDoorStatus;
int _v4CEE2;
int _v4CEE4;
int _v4CEE6;
@@ -212,8 +213,8 @@ public:
int _v501FC;
int _v5020C;
int _v50696;
- uint8 _v5098C;
- uint8 _v5098D;
+ uint8 _subFlagBitArr1;
+ uint8 _subFlagBitArr2;
int _v50CC2;
int _v50CC4;
int _v50CC6;
@@ -228,8 +229,8 @@ public:
bool getHasBullets();
virtual Common::String getClassName() { return "BFGlobals"; }
- virtual void synchronize(Serializer &s);
virtual void reset();
+ virtual void synchronize(Serializer &s);
void set2Flags(int flagNum);
bool removeFlag(int flagNum);
};
@@ -238,11 +239,74 @@ public:
namespace Ringworld2 {
+#define SPEECH_TEXT 1
+#define SPEECH_VOICE 2
+
+#define k5A78C 15
+#define k5A78D 16
+#define k5A790 18
+#define k5A791 17
+
class Ringworld2Globals: public TsAGE2Globals {
public:
ASoundExt _sound1, _sound2, _sound3, _sound4;
+ PlayStream _playStream;
+ StripProxy _stripProxy;
+ bool _v1000Flag;
+ byte _v1000[0x1000];
+ byte _palIndexList[10][256];
+ int _insetUp;
+ int _frameEdgeColour; // _v421e
+ Rect _v5589E;
+ Rect _v558B6;
+ int _v558C2;
+ int _animationCtr;
+ int _v565E1;
+ int _v565E3;
+ int _v565E5;
+ int _v565E7;
+ int _v565E9;
+ int _v565EB;
+ int _v565F5;
+ int _v565F6;
+ int _v565FA;
+ int _v5657C;
+ byte _v565AE;
+ byte _v56605[14];
+ int _v56613[76];
+ byte _v566A4;
+ byte _v566A5;
+ int _v566A6;
+ byte _v566A3;
+ byte _v566A8;
+ byte _v566A9;
+ byte _v566AA;
+ byte _v566AB[1000];
+ int _v56A93;
+ byte _v56A99;
+ int _scene1925CurrLevel; //_v56A9C
+ int _v56A9E;
+ byte _v56AA0;
+ byte _v56AA1;
+ int _v56AA2;
+ int _v56AA4;
+ byte _v56AA6;
+ byte _v56AA7;
+ byte _v56AA8;
+ int _v56AAB;
+ int _scene180Mode; // _v575f7
+ int _v57709;
+ int _v5780C;
+ int _v5780E;
+ int _v57810;
+ int _v57C2C;
+ int _speechSubtitles;
+ byte _v565EC[5];
+ byte _v565F1[4];
+ byte _stripManager_lookupList[12];
virtual void reset();
+ virtual void synchronize(Serializer &s);
};
} // End of namespace Ringworld2
diff --git a/engines/tsage/graphics.cpp b/engines/tsage/graphics.cpp
index 4b2da0b456..b3dceba292 100644
--- a/engines/tsage/graphics.cpp
+++ b/engines/tsage/graphics.cpp
@@ -81,7 +81,7 @@ GfxSurface surfaceFromRes(const byte *imgData) {
if (!rleEncoded) {
Common::copy(srcP, srcP + (r.width() * r.height()), destP);
} else {
- Common::set_to(destP, destP + (r.width() * r.height()), s._transColor);
+ Common::fill(destP, destP + (r.width() * r.height()), s._transColor);
for (int yp = 0; yp < r.height(); ++yp) {
int width = r.width();
@@ -105,7 +105,7 @@ GfxSurface surfaceFromRes(const byte *imgData) {
controlVal &= 0x3f;
int pixel = *srcP++;
- Common::set_to(destP, destP + controlVal, pixel);
+ Common::fill(destP, destP + controlVal, pixel);
destP += controlVal;
width -= controlVal;
}
@@ -220,16 +220,16 @@ void Rect::synchronize(Serializer &s) {
GfxSurface::GfxSurface() : _bounds(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT) {
_disableUpdates = false;
- _screenSurface = false;
_lockSurfaceCtr = 0;
_customSurface = NULL;
- _screenSurfaceP = NULL;
_transColor = -1;
+ _trackDirtyRects = false;
}
GfxSurface::GfxSurface(const GfxSurface &s) {
_lockSurfaceCtr = 0;
_customSurface = NULL;
+ _trackDirtyRects = false;
this->operator =(s);
}
@@ -244,24 +244,71 @@ GfxSurface::~GfxSurface() {
* Specifies that the surface will encapsulate the ScummVM screen surface
*/
void GfxSurface::setScreenSurface() {
- _screenSurface = true;
- _customSurface = NULL;
- _lockSurfaceCtr = 0;
+ _trackDirtyRects = true;
+ create(SCREEN_WIDTH, SCREEN_HEIGHT);
+}
+
+/**
+ * Updates the physical screen with the screen surface buffer
+ */
+void GfxSurface::updateScreen() {
+ assert(_trackDirtyRects);
+
+ // Merge any overlapping dirty rects
+ mergeDirtyRects();
+
+ // Loop through the dirty rect list to copy the affected areas to the sc
+ for (Common::List<Rect>::iterator i = _dirtyRects.begin(); i != _dirtyRects.end(); ++i) {
+ Rect r = *i;
+
+ // Make sure that there is something to update. If not, skip this
+ // rectangle. An example case is the speedbike closeup at the beginning
+ // of Ringworld (third screen).
+ if (r.isEmpty())
+ continue;
+
+ const byte *srcP = (const byte *)_customSurface->getBasePtr(r.left, r.top);
+ g_system->copyRectToScreen(srcP, _customSurface->pitch, r.left, r.top,
+ r.width(), r.height());
+ }
+
+ // Update the physical screen
+ g_system->updateScreen();
+
+ // Now that the dirty rects have been copied, clear the dirty rect list
+ _dirtyRects.clear();
+}
+
+/**
+ * Adds a rect to the dirty rect list
+ */
+void GfxSurface::addDirtyRect(const Rect &r) {
+ if (_trackDirtyRects) {
+ // Get the bounds and adjust to allow for sub-screen areas
+ Rect r2 = r;
+ r2.translate(_bounds.left, _bounds.top);
+
+ // Add to the dirty rect list
+ _dirtyRects.push_back(Rect(r2.left, r2.top,
+ MIN(r2.right + 1, SCREEN_WIDTH), MIN(r2.bottom + 1, SCREEN_HEIGHT)));
+ }
}
+
+
/**
* Specifies that the surface should maintain it's own internal surface
*/
void GfxSurface::create(int width, int height) {
assert((width >= 0) && (height >= 0));
- _screenSurface = false;
+
if (_customSurface) {
_customSurface->free();
delete _customSurface;
}
_customSurface = new Graphics::Surface();
_customSurface->create(width, height, Graphics::PixelFormat::createFormatCLUT8());
- Common::set_to((byte *)_customSurface->pixels, (byte *)_customSurface->pixels + (width * height), 0);
+ Common::fill((byte *)_customSurface->pixels, (byte *)_customSurface->pixels + (width * height), 0);
_bounds = Rect(0, 0, width, height);
}
@@ -271,13 +318,7 @@ void GfxSurface::create(int width, int height) {
Graphics::Surface GfxSurface::lockSurface() {
++_lockSurfaceCtr;
- Graphics::Surface *src;
- if (_screenSurface) {
- if (_lockSurfaceCtr == 1)
- _screenSurfaceP = g_system->lockScreen();
- src = _screenSurfaceP;
- } else
- src = _customSurface;
+ Graphics::Surface *src = _customSurface;
assert(src);
// Setup the returned surface either as one pointing to the same pixels as the source, or
@@ -298,15 +339,10 @@ Graphics::Surface GfxSurface::lockSurface() {
void GfxSurface::unlockSurface() {
assert(_lockSurfaceCtr > 0);
--_lockSurfaceCtr;
-
- if ((_lockSurfaceCtr == 0) && _screenSurface) {
- g_system->unlockScreen();
- }
}
void GfxSurface::synchronize(Serializer &s) {
assert(!_lockSurfaceCtr);
- assert(!_screenSurface);
s.syncAsByte(_disableUpdates);
_bounds.synchronize(s);
@@ -351,6 +387,7 @@ void GfxSurface::fillRect(const Rect &bounds, int color) {
Graphics::Surface surface = lockSurface();
surface.fillRect(bounds, color);
unlockSurface();
+ addDirtyRect(bounds);
}
GfxSurface &GfxSurface::operator=(const GfxSurface &s) {
@@ -363,7 +400,6 @@ GfxSurface &GfxSurface::operator=(const GfxSurface &s) {
}
_customSurface = s._customSurface;
- _screenSurface = s._screenSurface;
_disableUpdates = s._disableUpdates;
_bounds = s._bounds;
_centroid = s._centroid;
@@ -406,7 +442,7 @@ bool GfxSurface::displayText(const Common::String &msg, const Common::Point &pt)
// Display the text
gfxManager._font.writeLines(msg.c_str(), textRect, ALIGN_LEFT);
- // Write for a mouse or keypress
+ // Wait for a mouse or keypress
Event event;
while (!g_globals->_events.getEvent(event, EVENT_BUTTON_DOWN | EVENT_KEYPRESS) && !g_vm->shouldQuit())
;
@@ -455,7 +491,7 @@ static int *scaleLine(int size, int srcSize) {
int scale = PRECISION_FACTOR * size / srcSize;
assert(scale >= 0);
int *v = new int[size];
- Common::set_to(v, &v[size], -1);
+ Common::fill(v, &v[size], -1);
int distCtr = PRECISION_FACTOR / 2;
int *destP = v;
@@ -493,7 +529,7 @@ static GfxSurface ResizeSurface(GfxSurface &src, int xSize, int ySize, int trans
byte *destP = (byte *)destImage.getBasePtr(0, yp);
if (vertUsage[yp] == -1) {
- Common::set_to(destP, destP + xSize, transIndex);
+ Common::fill(destP, destP + xSize, transIndex);
} else {
const byte *srcP = (const byte *)srcImage.getBasePtr(0, vertUsage[yp]);
@@ -567,7 +603,11 @@ void GfxSurface::copyFrom(GfxSurface &src, Rect srcBounds, Rect destBounds, Regi
if (destBounds.bottom > destSurface.h)
destBounds.bottom = destSurface.h;
- if (destBounds.isValidRect()) {
+ if (destBounds.isValidRect() && !((destBounds.right < 0) || (destBounds.bottom < 0)
+ || (destBounds.left >= destSurface.w) || (destBounds.top >= destSurface.h))) {
+ // Register the affected area as dirty
+ addDirtyRect(destBounds);
+
const byte *pSrc = (const byte *)srcSurface.getBasePtr(srcX, srcY);
byte *pDest = (byte *)destSurface.getBasePtr(destBounds.left, destBounds.top);
@@ -613,6 +653,50 @@ void GfxSurface::draw(const Common::Point &pt, Rect *rect) {
}
}
+/**
+ * Merges any clipping rectangles that overlap to try and reduce
+ * the total number of clip rectangles.
+ */
+void GfxSurface::mergeDirtyRects() {
+ if (_dirtyRects.size() <= 1)
+ return;
+
+ Common::List<Rect>::iterator rOuter, rInner;
+
+ for (rOuter = _dirtyRects.begin(); rOuter != _dirtyRects.end(); ++rOuter) {
+ rInner = rOuter;
+ while (++rInner != _dirtyRects.end()) {
+
+ if ((*rOuter).intersects(*rInner)) {
+ // these two rectangles overlap or
+ // are next to each other - merge them
+
+ unionRectangle(*rOuter, *rOuter, *rInner);
+
+ // remove the inner rect from the list
+ _dirtyRects.erase(rInner);
+
+ // move back to beginning of list
+ rInner = rOuter;
+ }
+ }
+ }
+}
+
+/**
+ * Creates the union of two rectangles.
+ * Returns True if there is a union.
+ * @param pDest destination rectangle that is to receive the new union
+ * @param pSrc1 a source rectangle
+ * @param pSrc2 a source rectangle
+ */
+bool GfxSurface::unionRectangle(Common::Rect &destRect, const Rect &src1, const Rect &src2) {
+ destRect = src1;
+ destRect.extend(src2);
+
+ return !destRect.isEmpty();
+}
+
/*--------------------------------------------------------------------------*/
GfxElement::GfxElement() {
@@ -652,6 +736,9 @@ void GfxElement::highlight() {
}
}
+ // Mark the affected area as dirty
+ gfxManager.getSurface().addDirtyRect(tempRect);
+
// Release the surface
gfxManager.unlockSurface();
}
@@ -676,7 +763,39 @@ void GfxElement::drawFrame() {
Rect tempRect = _bounds;
tempRect.collapse(g_globals->_gfxEdgeAdjust, g_globals->_gfxEdgeAdjust);
tempRect.collapse(-1, -1);
- gfxManager.fillRect(tempRect, _colors.background);
+
+ if (g_vm->getGameID() == GType_Ringworld2) {
+ // For Return to Ringworld, use palette shading
+
+ // Get the current palette and determining a shading translation list
+ ScenePalette tempPalette;
+ tempPalette.getPalette(0, 256);
+ int transList[256];
+
+ for (int i = 0; i < 256; ++i) {
+ uint r, g, b, v;
+ tempPalette.getEntry(i, &r, &g, &b);
+ v = ((r >> 1) + (g >> 1) + (b >> 1)) / 4;
+
+ transList[i] = tempPalette.indexOf(v, v, v);
+ }
+
+ // Loop through the surface area to replace each pixel
+ // with its proper shaded replacement
+ Graphics::Surface surface = gfxManager.lockSurface();
+ for (int y = tempRect.top; y < tempRect.bottom; ++y) {
+ byte *lineP = (byte *)surface.getBasePtr(tempRect.left, y);
+ for (int x = 0; x < tempRect.width(); ++x) {
+ *lineP = transList[*lineP];
+ lineP++;
+ }
+ }
+ gfxManager.unlockSurface();
+
+ } else {
+ // Fill dialog content with specified background colour
+ gfxManager.fillRect(tempRect, _colors.background);
+ }
--tempRect.bottom; --tempRect.right;
gfxManager.fillArea(tempRect.left, tempRect.top, bgColor);
@@ -1058,7 +1177,7 @@ GfxButton *GfxDialog::execute(GfxButton *defaultButton) {
}
g_system->delayMillis(10);
- g_system->updateScreen();
+ GLOBALS._screenSurface.updateScreen();
}
_gfxManager.deactivate();
@@ -1077,7 +1196,7 @@ void GfxDialog::setPalette() {
g_globals->_scenePalette.setPalette(g_globals->_fontColors.background, 1);
g_globals->_scenePalette.setPalette(g_globals->_fontColors.foreground, 1);
g_globals->_scenePalette.setEntry(255, 0xff, 0xff, 0xff);
- g_globals->_scenePalette.setPalette(255, 1);
+ g_globals->_scenePalette.setPalette(255, 1);
} else {
g_globals->_scenePalette.loadPalette(0);
g_globals->_scenePalette.setPalette(0, 1);
@@ -1190,6 +1309,19 @@ int GfxManager::getAngle(const Common::Point &p1, const Common::Point &p2) {
return result;
}
}
+
+void GfxManager::copyFrom(GfxSurface &src, Rect destBounds, Region *priorityRegion) {
+ _surface.setBounds(_bounds);
+
+ _surface.copyFrom(src, destBounds, priorityRegion);
+}
+
+void GfxManager::copyFrom(GfxSurface &src, int destX, int destY) {
+ _surface.setBounds(_bounds);
+
+ _surface.copyFrom(src, destX, destY);
+}
+
/*--------------------------------------------------------------------------*/
@@ -1222,7 +1354,11 @@ void GfxFont::setFontNumber(uint32 fontNumber) {
if (!_fontData)
_fontData = g_resourceManager->getResource(RES_FONT, _fontNumber, 0);
- _numChars = READ_LE_UINT16(_fontData + 4);
+ // Since some TsAGE game versions don't have a valid character count at offset 4, use the offset of the
+ // first charactre data to calculate the number of characters in the offset table preceeding it
+ _numChars = (READ_LE_UINT32(_fontData + 12) - 12) / 4;
+ assert(_numChars <= 256);
+
_fontSize.y = READ_LE_UINT16(_fontData + 6);
_fontSize.x = READ_LE_UINT16(_fontData + 8);
_bpp = READ_LE_UINT16(_fontData + 10);
@@ -1392,7 +1528,12 @@ int GfxFont::writeChar(const char ch) {
}
}
+ // Mark the affected area as dirty
+ _gfxManager->getSurface().addDirtyRect(charRect);
+
+ // Move the text writing position
_position.x += charWidth;
+
_gfxManager->unlockSurface();
return charWidth;
}
diff --git a/engines/tsage/graphics.h b/engines/tsage/graphics.h
index 06b482d7b5..9c6f13e407 100644
--- a/engines/tsage/graphics.h
+++ b/engines/tsage/graphics.h
@@ -74,12 +74,17 @@ public:
class GfxSurface {
private:
Graphics::Surface *_customSurface;
- Graphics::Surface *_screenSurfaceP;
int _lockSurfaceCtr;
- bool _screenSurface;
bool _disableUpdates;
Rect _bounds;
+
+ bool _trackDirtyRects;
+ Common::List<Rect> _dirtyRects;
+
+ void mergeDirtyRects();
+ bool unionRectangle(Common::Rect &destRect, const Rect &src1, const Rect &src2);
+
public:
Common::Point _centroid;
int _transColor;
@@ -89,6 +94,8 @@ public:
~GfxSurface();
void setScreenSurface();
+ void updateScreen();
+ void addDirtyRect(const Rect &r);
Graphics::Surface lockSurface();
void unlockSurface();
void synchronize(Serializer &s);
@@ -292,17 +299,11 @@ public:
Common::copy(src, src + size, dest);
}
virtual void set(byte *dest, int size, byte val) {
- Common::set_to(dest, dest + size, val);
- }
- void copyFrom(GfxSurface &src, Rect destBounds, Region *priorityRegion = NULL) {
- _surface.setBounds(_bounds);
- _surface.copyFrom(src, destBounds, priorityRegion);
- }
- void copyFrom(GfxSurface &src, int destX, int destY) {
- _surface.setBounds(_bounds);
- _surface.copyFrom(src, destX, destY);
- g_system->updateScreen();
+ Common::fill(dest, dest + size, val);
}
+ void copyFrom(GfxSurface &src, Rect destBounds, Region *priorityRegion = NULL);
+ void copyFrom(GfxSurface &src, int destX, int destY);
+
GfxSurface &getSurface() {
_surface.setBounds(_bounds);
return _surface;
diff --git a/engines/tsage/module.mk b/engines/tsage/module.mk
index 0ea8916647..53c03e2e57 100644
--- a/engines/tsage/module.mk
+++ b/engines/tsage/module.mk
@@ -38,6 +38,10 @@ MODULE_OBJS := \
ringworld2/ringworld2_dialogs.o \
ringworld2/ringworld2_logic.o \
ringworld2/ringworld2_scenes0.o \
+ ringworld2/ringworld2_scenes1.o \
+ ringworld2/ringworld2_scenes2.o \
+ ringworld2/ringworld2_scenes3.o \
+ ringworld2/ringworld2_speakers.o \
saveload.o \
scenes.o \
sound.o \
diff --git a/engines/tsage/resources.cpp b/engines/tsage/resources.cpp
index 652ab32350..5987d78067 100644
--- a/engines/tsage/resources.cpp
+++ b/engines/tsage/resources.cpp
@@ -33,7 +33,7 @@ namespace TsAGE {
MemoryManager::MemoryManager() {
_memoryPool = new MemoryHeader*[MEMORY_POOL_SIZE];
- Common::set_to(&_memoryPool[0], &_memoryPool[MEMORY_POOL_SIZE], (MemoryHeader *)NULL);
+ Common::fill(&_memoryPool[0], &_memoryPool[MEMORY_POOL_SIZE], (MemoryHeader *)NULL);
}
MemoryManager::~MemoryManager() {
@@ -67,7 +67,7 @@ uint16 MemoryManager::allocate(uint32 size) {
byte *MemoryManager::allocate2(uint32 size) {
uint32 idx = allocate(size);
byte *result = lock(idx);
- Common::set_to(result, result + size, 0);
+ Common::fill(result, result + size, 0);
return result;
}
@@ -135,7 +135,7 @@ uint16 BitReader::readToken() {
/*-------------------------------------------------------------------------*/
TLib::TLib(MemoryManager &memManager, const Common::String &filename) :
- _memoryManager(memManager) {
+ _filename(filename), _memoryManager(memManager) {
// If the resource strings list isn't yet loaded, load them
if (_resStrings.size() == 0) {
@@ -158,35 +158,15 @@ TLib::~TLib() {
_resStrings.clear();
}
+/**
+ * Load a section index from the given position in the file
+ */
void TLib::loadSection(uint32 fileOffset) {
_resources.clear();
_file.seek(fileOffset);
_sections.fileOffset = fileOffset;
- if (_file.readUint32BE() != 0x544D492D)
- error("Data block is not valid Rlb data");
-
- /*uint8 unknown1 = */_file.readByte();
- uint16 numEntries = _file.readByte();
-
- for (uint i = 0; i < numEntries; ++i) {
- uint16 id = _file.readUint16LE();
- uint16 size = _file.readUint16LE();
- uint16 uncSize = _file.readUint16LE();
- uint8 sizeHi = _file.readByte();
- uint8 type = _file.readByte() >> 5;
- assert(type <= 1);
- uint32 offset = _file.readUint32LE();
-
- ResourceEntry re;
- re.id = id;
- re.fileOffset = offset;
- re.isCompressed = type != 0;
- re.size = ((sizeHi & 0xF) << 16) | size;
- re.uncompressedSize = ((sizeHi & 0xF0) << 12) | uncSize;
-
- _resources.push_back(re);
- }
+ ResourceManager::loadSection(_file, _resources);
}
struct DecodeReference {
@@ -332,6 +312,40 @@ byte *TLib::getResource(ResourceType resType, uint16 resNum, uint16 rlbNum, bool
return getResource(rlbNum, suppressErrors);
}
+/**
+ * Gets the offset of the start of a resource in the resource file
+ */
+uint32 TLib::getResourceStart(ResourceType resType, uint16 resNum, uint16 rlbNum, ResourceEntry &entry) {
+ // Find the correct section
+ SectionList::iterator i = _sections.begin();
+ while ((i != _sections.end()) && ((*i).resType != resType || (*i).resNum != resNum))
+ ++i;
+ if (i == _sections.end()) {
+ error("Unknown resource type %d num %d", resType, resNum);
+ }
+
+ // Load in the section index
+ loadSection((*i).fileOffset);
+
+ // Scan for an entry for the given Id
+ ResourceEntry *re = NULL;
+ ResourceList::iterator iter;
+ for (iter = _resources.begin(); iter != _resources.end(); ++iter) {
+ if ((*iter).id == rlbNum) {
+ re = &(*iter);
+ break;
+ }
+ }
+
+ // Throw an error if no resource was found, or the resource is compressed
+ if (!re || re->isCompressed)
+ error("Invalid resource Id #%d", rlbNum);
+
+ // Return the resource entry as well as the file offset
+ entry = *re;
+ return _sections.fileOffset + entry.fileOffset;
+}
+
void TLib::loadIndex() {
uint16 resNum, configId, fileOffset;
@@ -414,17 +428,28 @@ byte *TLib::getSubResource(int resNum, int rlbNum, int index, uint *size, bool s
*/
bool TLib::getMessage(int resNum, int lineNum, Common::String &result, bool suppressErrors) {
byte *msgData = getResource(RES_MESSAGE, resNum, 0, true);
- if (!msgData) {
+ if (!msgData || (lineNum < 0)) {
if (suppressErrors)
return false;
error("Unknown message %d line %d", resNum, lineNum);
}
+ int msgSize = _memoryManager.getSize(msgData);
const char *srcP = (const char *)msgData;
- while (lineNum-- > 0)
+ const char *endP = srcP + msgSize;
+
+ while (lineNum-- > 0) {
srcP += strlen(srcP) + 1;
+ if (srcP >= endP) {
+ if (suppressErrors)
+ return false;
+
+ error("Unknown message %d line %d", resNum, lineNum);
+ }
+ }
+
result = Common::String(srcP);
_memoryManager.deallocate(msgData);
return true;
@@ -503,7 +528,65 @@ Common::String ResourceManager::getMessage(int resNum, int lineNum, bool suppres
if (!suppressErrors)
error("Unknown message %d line %d", resNum, lineNum);
- return result;
+ return Common::String();
+}
+
+/*--------------------------------------------------------------------------*/
+
+/**
+ * Open up the given resource file using a passed file object. If the desired entry is found
+ * in the index, return the index entry for it, and move the file to the start of the resource
+ */
+bool ResourceManager::scanIndex(Common::File &f, ResourceType resType, int rlbNum, int resNum,
+ ResourceEntry &resEntry) {
+ // Load the root section index
+ ResourceList resList;
+ loadSection(f, resList);
+
+ // Loop through the index for the desired entry
+ ResourceList::iterator iter;
+ for (iter = resList.begin(); iter != resList.end(); ++iter) {
+ ResourceEntry &re = *iter;
+ if (re.id == resNum) {
+ // Found it, so exit
+ resEntry = re;
+ f.seek(re.fileOffset);
+ return true;
+ }
+ }
+
+ // No matching entry found
+ return false;
+}
+
+/**
+ * Inner logic for decoding a section index into a passed resource list object
+ */
+void ResourceManager::loadSection(Common::File &f, ResourceList &resources) {
+ if (f.readUint32BE() != 0x544D492D)
+ error("Data block is not valid Rlb data");
+
+ /*uint8 unknown1 = */f.readByte();
+ uint16 numEntries = f.readByte();
+
+ for (uint i = 0; i < numEntries; ++i) {
+ uint16 id = f.readUint16LE();
+ uint16 size = f.readUint16LE();
+ uint16 uncSize = f.readUint16LE();
+ uint8 sizeHi = f.readByte();
+ uint8 type = f.readByte() >> 5;
+ assert(type <= 1);
+ uint32 offset = f.readUint32LE();
+
+ ResourceEntry re;
+ re.id = id;
+ re.fileOffset = offset;
+ re.isCompressed = type != 0;
+ re.size = ((sizeHi & 0xF) << 16) | size;
+ re.uncompressedSize = ((sizeHi & 0xF0) << 12) | uncSize;
+
+ resources.push_back(re);
+ }
}
} // end of namespace TsAGE
diff --git a/engines/tsage/resources.h b/engines/tsage/resources.h
index 8f90b21908..45cecf8521 100644
--- a/engines/tsage/resources.h
+++ b/engines/tsage/resources.h
@@ -29,7 +29,6 @@
#include "common/list.h"
#include "common/str.h"
#include "common/str-array.h"
-#include "common/textconsole.h"
#include "common/util.h"
#include "graphics/surface.h"
@@ -146,6 +145,7 @@ private:
MemoryManager &_memoryManager;
private:
Common::File _file;
+ Common::String _filename;
ResourceList _resources;
SectionList _sections;
@@ -155,8 +155,11 @@ public:
TLib(MemoryManager &memManager, const Common::String &filename);
~TLib();
+ const Common::String &getFilename() { return _filename; }
+ const SectionList &getSections() { return _sections; }
byte *getResource(uint16 id, bool suppressErrors = false);
byte *getResource(ResourceType resType, uint16 resNum, uint16 rlbNum, bool suppressErrors = false);
+ uint32 getResourceStart(ResourceType resType, uint16 resNum, uint16 rlbNum, ResourceEntry &entry);
bool getPalette(int paletteNum, byte *palData, uint *startNum, uint *numEntries);
byte *getSubResource(int resNum, int rlbNum, int index, uint *size, bool suppressErrors = false);
bool getMessage(int resNum, int lineNum, Common::String &result, bool suppressErrors = false);
@@ -175,6 +178,10 @@ public:
void getPalette(int paletteNum, byte *palData, uint *startNum, uint *numEntries, bool suppressErrors = false);
byte *getSubResource(int resNum, int rlbNum, int index, uint *size, bool suppressErrors = false);
Common::String getMessage(int resNum, int lineNum, bool suppressErrors = false);
+ TLib &first() { return **_libList.begin(); }
+
+ static bool scanIndex(Common::File &f, ResourceType resType, int rlbNum, int resNum, ResourceEntry &resEntry);
+ static void loadSection(Common::File &f, ResourceList &resources);
};
diff --git a/engines/tsage/ringworld/ringworld_dialogs.cpp b/engines/tsage/ringworld/ringworld_dialogs.cpp
index 9d1a7effc2..0e451b8429 100644
--- a/engines/tsage/ringworld/ringworld_dialogs.cpp
+++ b/engines/tsage/ringworld/ringworld_dialogs.cpp
@@ -183,9 +183,11 @@ void RightClickDialog::execute() {
}
g_system->delayMillis(10);
- g_system->updateScreen();
+ GLOBALS._screenSurface.updateScreen();
}
+ _gfxManager.deactivate();
+
// Execute the specified action
switch (_selectedAction) {
case 1:
@@ -210,9 +212,243 @@ void RightClickDialog::execute() {
break;
case 6:
// Dialog options
- OptionsDialog::show();
+ Ringworld::OptionsDialog::show();
break;
}
+}
+
+/*--------------------------------------------------------------------------*/
+
+void OptionsDialog::show() {
+ OptionsDialog *dlg = new OptionsDialog();
+ dlg->draw();
+
+ GfxButton *btn = dlg->execute();
+
+ if (btn == &dlg->_btnQuit) {
+ // Quit game
+ if (MessageDialog::show(QUIT_CONFIRM_MSG, CANCEL_BTN_STRING, QUIT_BTN_STRING) == 1) {
+ g_vm->quitGame();
+ }
+ } else if (btn == &dlg->_btnRestart) {
+ // Restart game
+ g_globals->_game->restartGame();
+ } else if (btn == &dlg->_btnSound) {
+ // Sound dialog
+ SoundDialog::execute();
+ } else if (btn == &dlg->_btnSave) {
+ // Save button
+ g_globals->_game->saveGame();
+ } else if (btn == &dlg->_btnRestore) {
+ // Restore button
+ g_globals->_game->restoreGame();
+ }
+
+ dlg->remove();
+ delete dlg;
+}
+
+OptionsDialog::OptionsDialog() {
+ // Set the element text
+ _gfxMessage.set(OPTIONS_MSG, 140, ALIGN_LEFT);
+ _btnRestore.setText(RESTORE_BTN_STRING);
+ _btnSave.setText(SAVE_BTN_STRING);
+ _btnRestart.setText(RESTART_BTN_STRING);
+ _btnQuit.setText(QUIT_BTN_STRING);
+ _btnSound.setText(SOUND_BTN_STRING);
+ _btnResume.setText(RESUME_BTN_STRING);
+
+ // Set position of the elements
+ _gfxMessage._bounds.moveTo(0, 1);
+ _btnRestore._bounds.moveTo(0, _gfxMessage._bounds.bottom + 1);
+ _btnSave._bounds.moveTo(0, _btnRestore._bounds.bottom + 1);
+ _btnRestart._bounds.moveTo(0, _btnSave._bounds.bottom + 1);
+ _btnQuit._bounds.moveTo(0, _btnRestart._bounds.bottom + 1);
+ _btnSound._bounds.moveTo(0, _btnQuit._bounds.bottom + 1);
+ _btnResume._bounds.moveTo(0, _btnSound._bounds.bottom + 1);
+
+ // Set all the buttons to the widest button
+ GfxButton *btnList[6] = {&_btnRestore, &_btnSave, &_btnRestart, &_btnQuit, &_btnSound, &_btnResume};
+ int16 btnWidth = 0;
+ for (int idx = 0; idx < 6; ++idx)
+ btnWidth = MAX(btnWidth, btnList[idx]->_bounds.width());
+ for (int idx = 0; idx < 6; ++idx)
+ btnList[idx]->_bounds.setWidth(btnWidth);
+
+ // Add the items to the dialog
+ addElements(&_gfxMessage, &_btnRestore, &_btnSave, &_btnRestart, &_btnQuit, &_btnSound, &_btnResume, NULL);
+
+ // Set the dialog size and position
+ frame();
+ setCenter(160, 100);
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool GfxInvImage::process(Event &event) {
+ if (!event.handled && (event.eventType == EVENT_BUTTON_DOWN)) {
+ event.handled = _bounds.contains(event.mousePos);
+ return event.handled;
+ }
+
+ return false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+void InventoryDialog::show() {
+ // Determine how many items are in the player's inventory
+ int itemCount = 0;
+ SynchronizedList<InvObject *>::iterator i;
+ for (i = RING_INVENTORY._itemList.begin(); i != RING_INVENTORY._itemList.end(); ++i) {
+ if ((*i)->inInventory())
+ ++itemCount;
+ }
+
+ if (itemCount == 0) {
+ MessageDialog::show(INV_EMPTY_MSG, OK_BTN_STRING);
+ return;
+ }
+
+ InventoryDialog *dlg = new InventoryDialog();
+ dlg->draw();
+ dlg->execute();
+ delete dlg;
+}
+
+InventoryDialog::InventoryDialog() {
+ // Determine the maximum size of the image of any item in the player's inventory
+ int imgWidth = 0, imgHeight = 0;
+
+ SynchronizedList<InvObject *>::iterator i;
+ for (i = RING_INVENTORY._itemList.begin(); i != RING_INVENTORY._itemList.end(); ++i) {
+ InvObject *invObject = *i;
+ if (invObject->inInventory()) {
+ // Get the image for the item
+ GfxSurface itemSurface = surfaceFromRes(invObject->_displayResNum, invObject->_rlbNum, invObject->_cursorNum);
+
+ // Maintain the dimensions of the largest item image
+ imgWidth = MAX(imgWidth, (int)itemSurface.getBounds().width());
+ imgHeight = MAX(imgHeight, (int)itemSurface.getBounds().height());
+
+ // Add the item to the display list
+ GfxInvImage *img = new GfxInvImage();
+ _images.push_back(img);
+ img->setDetails(invObject->_displayResNum, invObject->_rlbNum, invObject->_cursorNum);
+ img->_invObject = invObject;
+ add(img);
+ }
+ }
+ assert(_images.size() > 0);
+
+ // Figure out the number of columns/rows to show all the items
+ int cellsSize = 3;
+ while ((cellsSize * cellsSize) < (int)_images.size())
+ ++cellsSize;
+
+ // Set the position of each inventory item to be displayed
+ int cellX = 0;
+ Common::Point pt(0, 0);
+
+ for (uint idx = 0; idx < _images.size(); ++idx) {
+ if (cellX == cellsSize) {
+ // Move to the start of the next line
+ pt.x = 0;
+ pt.y += imgHeight + 2;
+ cellX = 0;
+ }
+
+ _images[idx]->_bounds.moveTo(pt.x, pt.y);
+
+ pt.x += imgWidth + 2;
+ ++cellX;
+ }
+
+ // Set up the buttons
+ pt.y += imgHeight + 2;
+ _btnOk.setText(OK_BTN_STRING);
+ _btnOk._bounds.moveTo((imgWidth + 2) * cellsSize - _btnOk._bounds.width(), pt.y);
+ _btnLook.setText(LOOK_BTN_STRING);
+ _btnLook._bounds.moveTo(_btnOk._bounds.left - _btnLook._bounds.width() - 2, _btnOk._bounds.top);
+ addElements(&_btnLook, &_btnOk, NULL);
+
+ frame();
+ setCenter(SCREEN_CENTER_X, SCREEN_CENTER_Y);
+}
+
+InventoryDialog::~InventoryDialog() {
+ for (uint idx = 0; idx < _images.size(); ++idx)
+ delete _images[idx];
+}
+
+void InventoryDialog::execute() {
+ if ((RING_INVENTORY._selectedItem) && RING_INVENTORY._selectedItem->inInventory())
+ RING_INVENTORY._selectedItem->setCursor();
+
+ GfxElement *hiliteObj;
+ bool lookFlag = false;
+ _gfxManager.activate();
+
+ while (!g_vm->shouldQuit()) {
+ // Get events
+ Event event;
+ while (!g_globals->_events.getEvent(event) && !g_vm->shouldQuit()) {
+ g_system->delayMillis(10);
+ GLOBALS._screenSurface.updateScreen();
+ }
+ if (g_vm->shouldQuit())
+ break;
+
+ hiliteObj = NULL;
+ if ((event.eventType == EVENT_BUTTON_DOWN) && !_bounds.contains(event.mousePos))
+ break;
+
+ // Pass event to elements
+ event.mousePos.x -= _gfxManager._bounds.left;
+ event.mousePos.y -= _gfxManager._bounds.top;
+
+ for (GfxElementList::iterator i = _elements.begin(); i != _elements.end(); ++i) {
+ if ((*i)->process(event))
+ hiliteObj = *i;
+ }
+
+ if (!event.handled && event.eventType == EVENT_KEYPRESS) {
+ if ((event.kbd.keycode == Common::KEYCODE_RETURN) || (event.kbd.keycode == Common::KEYCODE_ESCAPE)) {
+ // Exit the dialog
+ //hiliteObj = &_btnOk;
+ break;
+ }
+ }
+
+ if (hiliteObj == &_btnOk) {
+ // Ok button clicked
+ if (lookFlag)
+ g_globals->_events.setCursor(CURSOR_WALK);
+ break;
+ } else if (hiliteObj == &_btnLook) {
+ // Look button clicked
+ if (_btnLook._message == LOOK_BTN_STRING) {
+ _btnLook._message = PICK_BTN_STRING;
+ lookFlag = 1;
+ g_globals->_events.setCursor(CURSOR_LOOK);
+ } else {
+ _btnLook._message = LOOK_BTN_STRING;
+ lookFlag = 0;
+ g_globals->_events.setCursor(CURSOR_WALK);
+ }
+
+ hiliteObj->draw();
+ } else if (hiliteObj) {
+ // Inventory item selected
+ InvObject *invObject = static_cast<GfxInvImage *>(hiliteObj)->_invObject;
+ if (lookFlag) {
+ g_globals->_screenSurface.displayText(invObject->_description);
+ } else {
+ RING_INVENTORY._selectedItem = invObject;
+ invObject->setCursor();
+ }
+ }
+ }
_gfxManager.deactivate();
}
diff --git a/engines/tsage/ringworld/ringworld_dialogs.h b/engines/tsage/ringworld/ringworld_dialogs.h
index 11a8f10e70..b14b3f6d78 100644
--- a/engines/tsage/ringworld/ringworld_dialogs.h
+++ b/engines/tsage/ringworld/ringworld_dialogs.h
@@ -63,6 +63,45 @@ public:
void execute();
};
+class OptionsDialog : public ModalDialog {
+private:
+ GfxButton _btnSave, _btnRestore, _btnRestart;
+ GfxButton _btnQuit, _btnResume;
+ GfxButton _btnSound;
+ GfxMessage _gfxMessage;
+public:
+ OptionsDialog();
+ virtual ~OptionsDialog() {}
+ GfxButton *execute() { return GfxDialog::execute(&_btnResume); }
+
+ static void show();
+};
+
+/*--------------------------------------------------------------------------*/
+
+class GfxInvImage : public GfxImage {
+public:
+ InvObject *_invObject;
+public:
+ GfxInvImage() : GfxImage(), _invObject(NULL) {}
+
+ virtual bool process(Event &event);
+};
+
+#define MAX_INVOBJECT_DISPLAY 20
+
+class InventoryDialog : public ModalDialog {
+private:
+ Common::Array<GfxInvImage *> _images;
+ GfxButton _btnOk, _btnLook;
+public:
+ InventoryDialog();
+ virtual ~InventoryDialog();
+ void execute();
+
+ static void show();
+};
+
} // End of namespace Ringworld
} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld/ringworld_logic.cpp b/engines/tsage/ringworld/ringworld_logic.cpp
index ad67b66f69..00c219f2ee 100644
--- a/engines/tsage/ringworld/ringworld_logic.cpp
+++ b/engines/tsage/ringworld/ringworld_logic.cpp
@@ -196,14 +196,17 @@ Scene *RingworldGame::createScene(int sceneNumber) {
* Returns true if it is currently okay to restore a game
*/
bool RingworldGame::canLoadGameStateCurrently() {
- return !g_globals->getFlag(50);
+ // Don't allow a game to be loaded if a dialog is active
+ return !g_globals->getFlag(50) && (g_globals->_gfxManagers.size() == 1);
+
}
/**
* Returns true if it is currently okay to save the game
*/
bool RingworldGame::canSaveGameStateCurrently() {
- return !g_globals->getFlag(50);
+ // Don't allow a game to be saved if a dialog is active
+ return !g_globals->getFlag(50) && (g_globals->_gfxManagers.size() == 1);
}
/*--------------------------------------------------------------------------*/
@@ -312,7 +315,7 @@ void SceneArea::wait() {
// Wait until a mouse or keypress
Event event;
while (!g_vm->shouldQuit() && !g_globals->_events.getEvent(event)) {
- g_system->updateScreen();
+ GLOBALS._screenSurface.updateScreen();
g_system->delayMillis(10);
}
@@ -623,58 +626,6 @@ void NamedHotspot::doAction(int action) {
SceneHotspot::doAction(action);
}
-void NamedHotspot::setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum) {
- setBounds(ys, xe, ye, xs);
- _resNum = resnum;
- _lookLineNum = lookLineNum;
- _useLineNum = useLineNum;
- _talkLineNum = -1;
- g_globals->_sceneItems.addItems(this, NULL);
-}
-
-void NamedHotspot::setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) {
- setBounds(bounds);
- _resNum = resNum;
- _lookLineNum = lookLineNum;
- _talkLineNum = talkLineNum;
- _useLineNum = useLineNum;
-
- switch (mode) {
- case 2:
- g_globals->_sceneItems.push_front(this);
- break;
- case 4:
- g_globals->_sceneItems.addBefore(item, this);
- break;
- case 5:
- g_globals->_sceneItems.addAfter(item, this);
- break;
- default:
- g_globals->_sceneItems.push_back(this);
- break;
- }
-}
-
-void NamedHotspot::setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode) {
- _sceneRegionId = sceneRegionId;
- _resNum = resNum;
- _lookLineNum = lookLineNum;
- _talkLineNum = talkLineNum;
- _useLineNum = useLineNum;
-
- // Handle adding hotspot to scene items list as necessary
- switch (mode) {
- case 2:
- GLOBALS._sceneItems.push_front(this);
- break;
- case 3:
- break;
- default:
- GLOBALS._sceneItems.push_back(this);
- break;
- }
-}
-
void NamedHotspot::synchronize(Serializer &s) {
SceneHotspot::synchronize(s);
s.syncAsSint16LE(_resNum);
diff --git a/engines/tsage/ringworld/ringworld_logic.h b/engines/tsage/ringworld/ringworld_logic.h
index 6f6a66cc26..e902ac127f 100644
--- a/engines/tsage/ringworld/ringworld_logic.h
+++ b/engines/tsage/ringworld/ringworld_logic.h
@@ -161,15 +161,11 @@ public:
class NamedHotspot : public SceneHotspot {
public:
- int _resNum, _lookLineNum, _useLineNum, _talkLineNum;
NamedHotspot();
virtual void doAction(int action);
virtual Common::String getClassName() { return "NamedHotspot"; }
virtual void synchronize(Serializer &s);
- virtual void setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum);
- virtual void setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item);
- virtual void setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode);
};
class NamedHotspotExt : public NamedHotspot {
diff --git a/engines/tsage/ringworld/ringworld_scenes10.cpp b/engines/tsage/ringworld/ringworld_scenes10.cpp
index 5aeb127915..f9a8e7996a 100644
--- a/engines/tsage/ringworld/ringworld_scenes10.cpp
+++ b/engines/tsage/ringworld/ringworld_scenes10.cpp
@@ -20,7 +20,6 @@
*
*/
-#include "graphics/cursorman.h"
#include "tsage/ringworld/ringworld_scenes10.h"
#include "tsage/scenes.h"
#include "tsage/tsage.h"
@@ -709,7 +708,7 @@ void Scene9360::postInit(SceneObjectList *OwnerList) {
*
*--------------------------------------------------------------------------*/
Scene9400::Scene9400() {
- _field1032 = 0;
+ _hittingAnvil = false;
}
void Scene9400::SceneHotspot7::doAction(int action) {
@@ -767,12 +766,12 @@ void Scene9400::signal() {
void Scene9400::dispatch() {
if ((_object1._animateMode == 2) && (_object1._strip == 1) && (_object1._frame == 4)){
- if (_field1032 == 0) {
+ if (_hittingAnvil == false) {
_soundHandler.play(296);
- _field1032 = 1;
+ _hittingAnvil = true;
}
} else {
- _field1032 = 0;
+ _hittingAnvil = false;
}
if (_action == 0) {
if (g_globals->_player._position.y < 120) {
@@ -826,7 +825,7 @@ void Scene9400::postInit(SceneObjectList *OwnerList) {
void Scene9400::synchronize(Serializer &s) {
Scene::synchronize(s);
if (s.getVersion() >= 3)
- s.syncAsSint16LE(_field1032);
+ s.syncAsSint16LE(_hittingAnvil);
}
/*--------------------------------------------------------------------------
diff --git a/engines/tsage/ringworld/ringworld_scenes10.h b/engines/tsage/ringworld/ringworld_scenes10.h
index 0193d5af63..48859ab454 100644
--- a/engines/tsage/ringworld/ringworld_scenes10.h
+++ b/engines/tsage/ringworld/ringworld_scenes10.h
@@ -236,7 +236,7 @@ public:
NamedHotspot _hotspot5;
NamedHotspot _hotspot6;
ASound _soundHandler;
- int _field1032;
+ bool _hittingAnvil;
SceneHotspot7 _hotspot7;
SceneHotspot8 _hotspot8;
diff --git a/engines/tsage/ringworld/ringworld_scenes3.cpp b/engines/tsage/ringworld/ringworld_scenes3.cpp
index 81190aea7b..0e4ccd1269 100644
--- a/engines/tsage/ringworld/ringworld_scenes3.cpp
+++ b/engines/tsage/ringworld/ringworld_scenes3.cpp
@@ -532,7 +532,7 @@ void Scene2100::Action1::signal() {
// Wait for an event
Event event;
if (!g_globals->_events.getEvent(event)) {
- g_system->updateScreen();
+ GLOBALS._screenSurface.updateScreen();
g_system->delayMillis(10);
continue;
}
@@ -2263,7 +2263,7 @@ void Scene2150::Action1::signal() {
// Wait for an event
Event event;
if (!g_globals->_events.getEvent(event)) {
- g_system->updateScreen();
+ GLOBALS._screenSurface.updateScreen();
g_system->delayMillis(10);
continue;
}
@@ -5118,7 +5118,7 @@ void Scene2320::Action3::signal() {
// Wait for an event
Event event;
if (!g_globals->_events.getEvent(event)) {
- g_system->updateScreen();
+ GLOBALS._screenSurface.updateScreen();
g_system->delayMillis(10);
continue;
}
diff --git a/engines/tsage/ringworld/ringworld_scenes5.cpp b/engines/tsage/ringworld/ringworld_scenes5.cpp
index 3cf1207e9e..3b415bdb6a 100644
--- a/engines/tsage/ringworld/ringworld_scenes5.cpp
+++ b/engines/tsage/ringworld/ringworld_scenes5.cpp
@@ -1478,7 +1478,7 @@ void Scene4025::Hole::doAction(int action) {
void Scene4025::Peg::synchronize(Serializer &s) {
SceneObject::synchronize(s);
- s.syncAsSint16LE(_field88);
+ s.syncAsSint16LE(_pegId);
s.syncAsSint16LE(_armStrip);
}
@@ -1513,35 +1513,35 @@ void Scene4025::postInit(SceneObjectList *OwnerList) {
_pegPtr = _pegPtr2 = NULL;
_peg1.postInit();
- _peg1._field88 = 1;
+ _peg1._pegId = 1;
_peg1.setVisage(4025);
_peg1.setStrip(2);
_peg1.setFrame(1);
_peg1.setPosition(Common::Point(203, 61));
_peg2.postInit();
- _peg2._field88 = 4;
+ _peg2._pegId = 4;
_peg2.setVisage(4025);
_peg2.setStrip(2);
_peg2.setFrame(2);
_peg2.setPosition(Common::Point(195, 57));
_peg3.postInit();
- _peg3._field88 = 0;
+ _peg3._pegId = 0;
_peg3.setVisage(4025);
_peg3.setStrip(2);
_peg3.setFrame(3);
_peg3.setPosition(Common::Point(202, 66));
_peg4.postInit();
- _peg4._field88 = 3;
+ _peg4._pegId = 3;
_peg4.setVisage(4025);
_peg4.setStrip(2);
_peg4.setFrame(4);
_peg4.setPosition(Common::Point(194, 68));
_peg5.postInit();
- _peg5._field88 = 2;
+ _peg5._pegId = 2;
_peg5.setVisage(4025);
_peg5.setStrip(1);
_peg5.setFrame(5);
@@ -2173,7 +2173,7 @@ void Scene4050::Action4::signal() {
case 5:
scene->_hotspot16.setStrip2(4);
scene->_hotspot16.setFrame(1);
- scene->_hotspot16.animate(ANIM_MODE_4, 4, 1, this);;
+ scene->_hotspot16.animate(ANIM_MODE_4, 4, 1, this);
break;
case 6:
scene->_hotspot16.animate(ANIM_MODE_5, NULL);
@@ -2810,7 +2810,7 @@ void Scene4150::Action1::signal() {
case 4: {
for (int idx = 100; idx >= 0; idx -= 5) {
g_globals->_scenePalette.fade(adjustData, false, idx);
- g_system->updateScreen();
+ GLOBALS._screenSurface.updateScreen();
g_system->delayMillis(10);
}
@@ -2838,7 +2838,7 @@ void Scene4150::Action1::signal() {
case 7:
for (int idx = 100; idx >= 0; idx -= 5) {
g_globals->_scenePalette.fade(adjustData, false, idx);
- g_system->updateScreen();
+ GLOBALS._screenSurface.updateScreen();
g_system->delayMillis(10);
}
@@ -4311,7 +4311,7 @@ void Scene4301::Action1::signal() {
setDelay(20);
break;
case 21:
- scene->_field68E = true;
+ scene->_puzzleDone = true;
remove();
break;
}
@@ -4412,7 +4412,7 @@ void Scene4301::postInit(SceneObjectList *OwnerList) {
Scene::postInit();
setZoomPercents(0, 100, 200, 100);
- _field68E = false;
+ _puzzleDone = false;
RING_INVENTORY._stasisBox2._sceneNumber = 1;
_hotspot4.setDetails(97, 76, 127, 102, 4300, 5, 6);
@@ -4432,8 +4432,8 @@ void Scene4301::postInit(SceneObjectList *OwnerList) {
void Scene4301::dispatch() {
if (_action) {
_action->dispatch();
- } else if (_field68E) {
- _field68E = 0;
+ } else if (_puzzleDone) {
+ _puzzleDone = false;
g_globals->clearFlag(50);
g_globals->_sceneManager._fadeMode = FADEMODE_NONE;
g_globals->_sceneManager.setNewScene(4300);
diff --git a/engines/tsage/ringworld/ringworld_scenes5.h b/engines/tsage/ringworld/ringworld_scenes5.h
index 80e67755bd..c93df2a1d8 100644
--- a/engines/tsage/ringworld/ringworld_scenes5.h
+++ b/engines/tsage/ringworld/ringworld_scenes5.h
@@ -215,10 +215,10 @@ class Scene4025 : public Scene {
};
class Peg : public SceneObject {
public:
- int _field88;
+ int _pegId;
int _armStrip;
- Peg() : SceneObject() { _field88 = 0; _armStrip = 3; }
+ Peg() : SceneObject() { _pegId = 0; _armStrip = 3; }
virtual void synchronize(Serializer &s);
virtual void doAction(int action);
};
@@ -682,13 +682,13 @@ public:
SceneObject _hotspot1, _hotspot2, _hotspot3;
Hotspot4 _hotspot4;
Hotspot5 _hotspot5;
- bool _field68E;
+ bool _puzzleDone;
virtual void postInit(SceneObjectList *OwnerList = NULL);
virtual void dispatch();
virtual void synchronize(Serializer &s) {
Scene::synchronize(s);
- s.syncAsSint16LE(_field68E);
+ s.syncAsSint16LE(_puzzleDone);
}
};
diff --git a/engines/tsage/ringworld/ringworld_scenes6.cpp b/engines/tsage/ringworld/ringworld_scenes6.cpp
index 57a073caee..30a91b57aa 100644
--- a/engines/tsage/ringworld/ringworld_scenes6.cpp
+++ b/engines/tsage/ringworld/ringworld_scenes6.cpp
@@ -1124,7 +1124,7 @@ void Scene5100::postInit(SceneObjectList *OwnerList) {
_hotspot4.setVisage(5363);
_hotspot4.setPosition(Common::Point(1025, 65));
_hotspot4.setStrip(4);
- _hotspot4.animate(ANIM_MODE_7, 0, NULL);;
+ _hotspot4.animate(ANIM_MODE_7, 0, NULL);
g_globals->_sceneItems.push_back(&_hotspot4);
_hotspot9.postInit();
diff --git a/engines/tsage/ringworld/ringworld_scenes8.cpp b/engines/tsage/ringworld/ringworld_scenes8.cpp
index f8fb8b01e7..9cb85a6930 100644
--- a/engines/tsage/ringworld/ringworld_scenes8.cpp
+++ b/engines/tsage/ringworld/ringworld_scenes8.cpp
@@ -1879,12 +1879,12 @@ void Scene7700::SceneHotspot8::doAction(int action) {
scene->_soundHandler.play(259);
scene->_object15.setFrame(scene->_object15.getFrameCount());
scene->_object15.animate(ANIM_MODE_6, scene);
- if ((scene->_field977 == 2) && (scene->_field97B == 0)) {
- scene->_field979++;
+ if ((scene->_seatCountLeft1 == 2) && (scene->_seatCountLeft2 == 0)) {
+ scene->_seatCountRight++;
} else {
- scene->_field97B = 0;
- scene->_field979 = 0;
- scene->_field977 = 0;
+ scene->_seatCountLeft2 = 0;
+ scene->_seatCountRight = 0;
+ scene->_seatCountLeft1 = 0;
}
break;
default:
@@ -1905,26 +1905,26 @@ void Scene7700::SceneHotspot9::doAction(int action) {
scene->_soundHandler.play(259);
scene->_object15.setFrame(1);
scene->_object15.animate(ANIM_MODE_5, scene);
- if (scene->_field977 > 2) {
- scene->_field97B = 0;
- scene->_field979 = 0;
- scene->_field977 = 0;
+ if (scene->_seatCountLeft1 > 2) {
+ scene->_seatCountLeft2 = 0;
+ scene->_seatCountRight = 0;
+ scene->_seatCountLeft1 = 0;
}
- if (scene->_field979 != 0) {
- if (scene->_field979 != 4) {
- scene->_field97B = 0;
- scene->_field979 = 0;
- scene->_field977 = 0;
+ if (scene->_seatCountRight != 0) {
+ if (scene->_seatCountRight != 4) {
+ scene->_seatCountLeft2 = 0;
+ scene->_seatCountRight = 0;
+ scene->_seatCountLeft1 = 0;
} else {
- scene->_field97B++;
- if (scene->_field97B == 3) {
+ scene->_seatCountLeft2++;
+ if (scene->_seatCountLeft2 == 3) {
g_globals->_player.disableControl();
scene->setAction(&scene->_action3);
}
}
} else {
- scene->_field977++;
+ scene->_seatCountLeft1++;
}
break;
default:
@@ -2315,9 +2315,9 @@ void Scene7700::postInit(SceneObjectList *OwnerList) {
Scene::postInit();
setZoomPercents(100, 80, 200, 100);
g_globals->setFlag(53);
- _field97B = 0;
- _field979 = 0;
- _field977 = 0;
+ _seatCountLeft2 = 0;
+ _seatCountRight = 0;
+ _seatCountLeft1 = 0;
_stripManager.addSpeaker(&_speakerEText);
_stripManager.addSpeaker(&_speakerQText);
@@ -2538,9 +2538,9 @@ Scene7700::Scene7700() {
void Scene7700::synchronize(Serializer &s) {
Scene::synchronize(s);
if (s.getVersion() >= 3) {
- s.syncAsSint16LE(_field977);
- s.syncAsSint16LE(_field979);
- s.syncAsSint16LE(_field97B);
+ s.syncAsSint16LE(_seatCountLeft1);
+ s.syncAsSint16LE(_seatCountRight);
+ s.syncAsSint16LE(_seatCountLeft2);
}
}
diff --git a/engines/tsage/ringworld/ringworld_scenes8.h b/engines/tsage/ringworld/ringworld_scenes8.h
index 84178c36f9..b24f220f8c 100644
--- a/engines/tsage/ringworld/ringworld_scenes8.h
+++ b/engines/tsage/ringworld/ringworld_scenes8.h
@@ -480,7 +480,7 @@ public:
SceneHotspot11 _sceneHotspot34;
SceneHotspot11 _sceneHotspot35;
SceneHotspot11 _sceneHotspot36;
- int _field977, _field979, _field97B;
+ int _seatCountLeft1, _seatCountRight, _seatCountLeft2;
Scene7700();
virtual void postInit(SceneObjectList *OwnerList = NULL);
diff --git a/engines/tsage/ringworld2/ringworld2_dialogs.cpp b/engines/tsage/ringworld2/ringworld2_dialogs.cpp
index 8d4863f332..30ae6be7b1 100644
--- a/engines/tsage/ringworld2/ringworld2_dialogs.cpp
+++ b/engines/tsage/ringworld2/ringworld2_dialogs.cpp
@@ -31,6 +31,7 @@
#include "tsage/staticres.h"
#include "tsage/globals.h"
#include "tsage/ringworld2/ringworld2_dialogs.h"
+#include "tsage/ringworld2/ringworld2_logic.h"
namespace TsAGE {
@@ -49,7 +50,7 @@ RightClickDialog::RightClickDialog() : GfxDialog() {
_btnList[5] = Common::Point(83, 47);
// Set the palette and change the cursor
- BF_GLOBALS._events.setCursor(CURSOR_ARROW);
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
setPalette();
@@ -95,7 +96,7 @@ bool RightClickDialog::process(Event &event) {
case EVENT_MOUSE_MOVE: {
// Check whether a button is highlighted
int buttonIndex;
- for (buttonIndex = 6; buttonIndex >= 0; --buttonIndex) {
+ for (buttonIndex = 5; buttonIndex >= 0; --buttonIndex) {
Rect tempRect(0, 0, 28, 29);
tempRect.moveTo(_btnList[buttonIndex].x, _btnList[buttonIndex].y);
@@ -152,7 +153,7 @@ void RightClickDialog::execute() {
}
g_system->delayMillis(10);
- g_system->updateScreen();
+ GLOBALS._screenSurface.updateScreen();
}
// Execute the specified action
@@ -176,6 +177,7 @@ void RightClickDialog::execute() {
break;
case 4:
// Change player
+ CharacterDialog::show();
break;
case 5:
// Options dialog
@@ -183,11 +185,263 @@ void RightClickDialog::execute() {
}
if (cursorNum != CURSOR_NONE)
- BF_GLOBALS._events.setCursor(cursorNum);
+ R2_GLOBALS._events.setCursor(cursorNum);
_gfxManager.deactivate();
}
+/*--------------------------------------------------------------------------*/
+
+void CharacterDialog::show() {
+ CharacterDialog *dlg = new CharacterDialog();
+ dlg->draw();
+
+ // Make the default button the currently active character
+ GfxButton *btn = NULL;
+ int oldCharacter = R2_GLOBALS._player._characterIndex;
+ switch (oldCharacter) {
+ case 1:
+ btn = &dlg->_btnQuinn;
+ break;
+ case 2:
+ btn = &dlg->_btnSeeker;
+ break;
+ case 3:
+ btn = &dlg->_btnMiranda;
+ break;
+ default:
+ break;
+ }
+
+ // Show the character selection dialog
+ btn = dlg->execute(btn);
+
+ // Figure out the new selected character
+ if (btn == &dlg->_btnQuinn)
+ R2_GLOBALS._player._characterIndex = R2_QUINN;
+ else if (btn == &dlg->_btnSeeker)
+ R2_GLOBALS._player._characterIndex = R2_SEEKER;
+ else if (btn == &dlg->_btnMiranda)
+ R2_GLOBALS._player._characterIndex = R2_MIRANDA;
+
+ // Remove the dialog
+ dlg->remove();
+ delete dlg;
+
+ // Only do transfer if a different character was selected
+ if (R2_GLOBALS._player._characterIndex != oldCharacter) {
+ // Save the details of the previously active character
+ SceneExt *scene = (SceneExt *)R2_GLOBALS._sceneManager._scene;
+ scene->saveCharacter(oldCharacter);
+
+ // Play a transition sound as the character is changed
+ if (R2_GLOBALS._player._characterScene[0] != 300) {
+ switch (R2_GLOBALS._v565F1[R2_GLOBALS._player._characterIndex]) {
+ case 0:
+ R2_GLOBALS._sound4.stop();
+ break;
+ case 1:
+ R2_GLOBALS._sound4.play(45);
+ break;
+ case 2:
+ R2_GLOBALS._sound4.play(4);
+ break;
+ case 3:
+ R2_GLOBALS._sound4.play(5);
+ break;
+ case 4:
+ R2_GLOBALS._sound4.play(6);
+ break;
+ default:
+ break;
+ }
+ } else if (R2_GLOBALS._v565F1[R2_GLOBALS._player._characterIndex] > 1) {
+ switch (R2_GLOBALS._v565F1[R2_GLOBALS._player._characterIndex]) {
+ case 2:
+ R2_GLOBALS._sound4.play(45);
+ break;
+ case 3:
+ R2_GLOBALS._sound4.play(4);
+ break;
+ case 4:
+ R2_GLOBALS._sound4.play(5);
+ break;
+ case 5:
+ R2_GLOBALS._sound4.play(6);
+ break;
+ default:
+ break;
+ }
+ } else if ((R2_GLOBALS._player._characterScene[1] == 300) && (R2_GLOBALS._v565F1[1] != 1)) {
+ switch (R2_GLOBALS._v565F1[1]) {
+ case 2:
+ R2_GLOBALS._sound4.play(45);
+ break;
+ case 3:
+ R2_GLOBALS._sound4.play(4);
+ break;
+ case 4:
+ R2_GLOBALS._sound4.play(5);
+ break;
+ case 5:
+ R2_GLOBALS._sound4.play(6);
+ break;
+ default:
+ break;
+ }
+ } else if (R2_GLOBALS._player._characterScene[2] != 300) {
+ R2_GLOBALS._sound4.stop();
+ } else if (R2_GLOBALS._v565F1[2] == 1) {
+ R2_GLOBALS._sound4.stop();
+ } else {
+ switch (R2_GLOBALS._v565F1[1]) {
+ case 2:
+ R2_GLOBALS._sound4.play(45);
+ break;
+ case 3:
+ R2_GLOBALS._sound4.play(4);
+ break;
+ case 4:
+ R2_GLOBALS._sound4.play(5);
+ break;
+ case 5:
+ R2_GLOBALS._sound4.play(6);
+ break;
+ default:
+ break;
+ }
+ }
+
+ // Change to whichever scene the newly selected character is in
+ R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._player._characterScene[R2_GLOBALS._player._characterIndex]);
+ }
+}
+
+CharacterDialog::CharacterDialog() {
+ // Set the element text
+ _msgTitle.set(CHAR_TITLE, 140, ALIGN_LEFT);
+ _btnQuinn.setText(CHAR_QUINN_MSG);
+ _btnSeeker.setText(CHAR_SEEKER_MSG);
+ _btnMiranda.setText(CHAR_MIRANDA_MSG);
+ _btnCancel.setText(CHAR_CANCEL_MSG);
+
+ // Set position of the elements
+ _msgTitle._bounds.moveTo(5, 5);
+ _btnQuinn._bounds.moveTo(25, _msgTitle._bounds.bottom + 1);
+ _btnSeeker._bounds.moveTo(25, _btnQuinn._bounds.bottom + 1);
+ _btnMiranda._bounds.moveTo(25, _btnSeeker._bounds.bottom + 1);
+ _btnCancel._bounds.moveTo(25, _btnMiranda._bounds.bottom + 1);
+
+ // Add the items to the dialog
+ addElements(&_msgTitle, &_btnQuinn, &_btnSeeker, &_btnMiranda, &_btnCancel, NULL);
+
+ // Set the dialog size and position
+ frame();
+ _bounds.collapse(-6, -6);
+ setCenter(160, 100);
+}
+
+/*--------------------------------------------------------------------------*/
+
+void HelpDialog::show() {
+ // Set the palette and change the cursor
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+
+ // Create the dialog and draw it
+ HelpDialog *dlg = new HelpDialog();
+ dlg->draw();
+
+ // Show the character selection dialog
+ GfxButton *btn = dlg->execute(&dlg->_btnResume);
+
+ // If a function button was selected, take care of it
+ Event evt;
+ evt.eventType = EVENT_KEYPRESS;
+ evt.kbd.keycode = Common::KEYCODE_INVALID;
+ if (btn == &dlg->_btnList[0]) {
+ evt.kbd.keycode = Common::KEYCODE_F2;
+ } else if (btn == &dlg->_btnList[1]) {
+ evt.kbd.keycode = Common::KEYCODE_F3;
+ } else if (btn == &dlg->_btnList[2]) {
+ evt.kbd.keycode = Common::KEYCODE_F4;
+ } else if (btn == &dlg->_btnList[3]) {
+ evt.kbd.keycode = Common::KEYCODE_F5;
+ } else if (btn == &dlg->_btnList[4]) {
+ evt.kbd.keycode = Common::KEYCODE_F7;
+ } else if (btn == &dlg->_btnList[5]) {
+ evt.kbd.keycode = Common::KEYCODE_F8;
+ } else if (btn == &dlg->_btnList[6]) {
+ evt.kbd.keycode = Common::KEYCODE_F10;
+ }
+
+ // Remove the dialog
+ dlg->remove();
+ delete dlg;
+
+ // If a action button was selected, dispatch to handle it
+ if (evt.kbd.keycode != Common::KEYCODE_INVALID)
+ R2_GLOBALS._game->processEvent(evt);
+}
+
+HelpDialog::HelpDialog() {
+ // Set the title and game version
+ _msgTitle.set(HELP_MSG, 172, ALIGN_CENTER);
+ _msgTitle._bounds.moveTo(5, 0);
+ _msgVersion.set(GAME_VERSION, 172, ALIGN_CENTER);
+ _msgVersion._bounds.moveTo(5, _msgTitle._bounds.bottom + 3);
+ addElements(&_msgTitle, &_msgVersion, NULL);
+
+ // Set buttons
+ _btnList[0].setText(F2);
+ _btnList[0]._bounds.moveTo(5, _msgVersion._bounds.bottom + 2);
+ _btnDescription[0].set(SOUND_OPTIONS, 140, ALIGN_LEFT);
+ _btnDescription[0]._bounds.moveTo(_btnList[0]._bounds.right + 2, _btnList[0]._bounds.top + 4);
+
+ _btnList[1].setText(F3);
+ _btnList[1]._bounds.moveTo(5, _btnList[0]._bounds.bottom);
+ _btnDescription[1].set(QUIT_GAME, 140, ALIGN_LEFT);
+ _btnDescription[1]._bounds.moveTo(_btnList[1]._bounds.right + 2, _btnList[1]._bounds.top + 4);
+
+ _btnList[2].setText(F4);
+ _btnList[2]._bounds.moveTo(5, _btnList[1]._bounds.bottom);
+ _btnDescription[2].set(RESTART_GAME, 140, ALIGN_LEFT);
+ _btnDescription[2]._bounds.moveTo(_btnList[2]._bounds.right + 2, _btnList[2]._bounds.top + 4);
+
+ _btnList[3].setText(F5);
+ _btnList[3]._bounds.moveTo(5, _btnList[2]._bounds.bottom);
+ _btnDescription[3].set(SAVE_GAME, 140, ALIGN_LEFT);
+ _btnDescription[3]._bounds.moveTo(_btnList[3]._bounds.right + 2, _btnList[3]._bounds.top + 4);
+
+ _btnList[4].setText(F7);
+ _btnList[4]._bounds.moveTo(5, _btnList[3]._bounds.bottom);
+ _btnDescription[4].set(RESTORE_GAME, 140, ALIGN_LEFT);
+ _btnDescription[4]._bounds.moveTo(_btnList[4]._bounds.right + 2, _btnList[4]._bounds.top + 4);
+
+ _btnList[5].setText(F8);
+ _btnList[5]._bounds.moveTo(5, _btnList[4]._bounds.bottom);
+ _btnDescription[5].set(SHOW_CREDITS, 140, ALIGN_LEFT);
+ _btnDescription[5]._bounds.moveTo(_btnList[5]._bounds.right + 2, _btnList[5]._bounds.top + 4);
+
+ _btnList[6].setText(F10);
+ _btnList[6]._bounds.moveTo(5, _btnList[5]._bounds.bottom);
+ _btnDescription[6].set(PAUSE_GAME, 140, ALIGN_LEFT);
+ _btnDescription[6]._bounds.moveTo(_btnList[6]._bounds.right + 2, _btnList[6]._bounds.top + 4);
+
+ for (int i = 0; i < 7; ++i) {
+ addElements(&_btnList[i], &_btnDescription[i], NULL);
+ }
+
+ // Add 'Resume' button
+ _btnResume.setText(RESUME_PLAY);
+ _btnResume._bounds.moveTo(5, _btnList[6]._bounds.bottom + 2);
+ addElements(&_btnResume, NULL);
+
+ // Set the dialog size and position
+ frame();
+ _bounds.collapse(-6, -6);
+ setCenter(160, 100);
+}
+
} // End of namespace Ringworld2
} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld2/ringworld2_dialogs.h b/engines/tsage/ringworld2/ringworld2_dialogs.h
index bbc35da3ea..02a1aed81c 100644
--- a/engines/tsage/ringworld2/ringworld2_dialogs.h
+++ b/engines/tsage/ringworld2/ringworld2_dialogs.h
@@ -59,6 +59,31 @@ public:
void execute();
};
+class CharacterDialog: public GfxDialog {
+private:
+ GfxMessage _msgTitle;
+ GfxButton _btnQuinn, _btnMiranda, _btnSeeker;
+ GfxButton _btnCancel;
+public:
+ CharacterDialog();
+ virtual ~CharacterDialog() {}
+
+ static void show();
+};
+
+class HelpDialog: public GfxDialog {
+private:
+ GfxMessage _msgTitle, _msgVersion;
+ GfxButton _btnList[7];
+ GfxMessage _btnDescription[7];
+ GfxButton _btnResume;
+public:
+ HelpDialog();
+ virtual ~HelpDialog() {}
+
+ static void show();
+};
+
} // End of namespace Ringworld2
} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld2/ringworld2_logic.cpp b/engines/tsage/ringworld2/ringworld2_logic.cpp
index 0bdcf36d0c..a06899fe5a 100644
--- a/engines/tsage/ringworld2/ringworld2_logic.cpp
+++ b/engines/tsage/ringworld2/ringworld2_logic.cpp
@@ -27,17 +27,255 @@
#include "tsage/ringworld2/ringworld2_logic.h"
#include "tsage/ringworld2/ringworld2_dialogs.h"
#include "tsage/ringworld2/ringworld2_scenes0.h"
+#include "tsage/ringworld2/ringworld2_scenes1.h"
+#include "tsage/ringworld2/ringworld2_scenes2.h"
+#include "tsage/ringworld2/ringworld2_scenes3.h"
namespace TsAGE {
namespace Ringworld2 {
Scene *Ringworld2Game::createScene(int sceneNumber) {
+ warning("Switching to scene %d", sceneNumber);
+
switch (sceneNumber) {
/* Scene group #0 */
- // Quinn's room
- case 100: return new Scene100();
-
+ case 50:
+ // Waking up cutscene
+ return new Scene50();
+ case 100:
+ // Quinn's room
+ return new Scene100();
+ case 125:
+ // Computer console
+ return new Scene125();
+ case 150:
+ // Empty Bedroom #1
+ return new Scene150();
+ case 160:
+ // Credits
+ return new Scene160();
+ case 175:
+ // Empty Bedroom #2
+ return new Scene175();
+ case 180:
+ // Title Screen
+ return new Scene180();
+ case 200:
+ // Deck #2 - By Lift
+ return new Scene200();
+ case 205:
+ // Star-field Credits
+ return new Scene205();
+ case 250:
+ // Lift
+ return new Scene250();
+ case 300:
+ // Bridge
+ return new Scene300();
+ case 325:
+ // Bridge Console
+ return new Scene325();
+ case 400:
+ // Science Lab
+ return new Scene400();
+ case 500:
+ // Lander Bay 2 Storage
+ return new Scene500();
+ case 525:
+ // Cutscene - Walking in hall
+ return new Scene525();
+ case 600:
+ return new Scene600();
+ case 700:
+ return new Scene700();
+ case 800:
+ // Sick bay
+ return new Scene800();
+ case 825:
+ // Autodoc
+ return new Scene825();
+ case 850:
+ // Deck #5 - By Lift
+ return new Scene850();
+ case 900:
+ return new Scene900();
+ /* Scene group #1 */
+ //
+ case 1000:
+ error("Missing scene %d from group 1", sceneNumber);
+ case 1010:
+ // Cutscene - trip in space
+ return new Scene1010();
+ case 1020:
+ return new Scene1020();
+ case 1100:
+ return new Scene1100();
+ case 1200:
+ return new Scene1200();
+ case 1337:
+ case 1330:
+ // Card Game
+ return new Scene1337();
+ case 1500:
+ // Cutscene: Ship landing
+ return new Scene1500();
+ case 1525:
+ // Cutscene - Ship
+ return new Scene1525();
+ case 1530:
+ // Cutscene - Elevator
+ return new Scene1530();
+ case 1550:
+ return new Scene1550();
+ case 1575:
+ return new Scene1575();
+ case 1580:
+ // Inside wreck
+ return new Scene1580();
+ case 1625:
+ // Miranda being questioned
+ return new Scene1625();
+ case 1700:
+ return new Scene1700();
+ case 1750:
+ return new Scene1750();
+ case 1800:
+ return new Scene1800();
+ case 1850:
+ return new Scene1850();
+ case 1875:
+ return new Scene1875();
+ case 1900:
+ return new Scene1900();
+ case 1925:
+ return new Scene1925();
+ case 1945:
+ return new Scene1945();
+ case 1950:
+ return new Scene1950();
+ /* Scene group #2 */
+ //
+ case 2000:
+ // Ice Maze
+ return new Scene2000();
+ case 2350:
+ // Ice Maze: Balloon Launch Platform
+ return new Scene2350();
+ case 2400:
+ // Ice Maze: Large empty room
+ return new Scene2400();
+ case 2425:
+ // Ice Maze:
+ return new Scene2425();
+ case 2430:
+ // Ice Maze: Bedroom
+ return new Scene2430();
+ case 2435:
+ // Ice Maze: Throne room
+ return new Scene2435();
+ case 2440:
+ // Ice Maze: Another bedroom
+ return new Scene2440();
+ case 2445:
+ // Ice Maze:
+ return new Scene2445();
+ case 2450:
+ // Ice Maze: Another bedroom
+ return new Scene2450();
+ case 2455:
+ // Ice Maze: Inside crevasse
+ return new Scene2455();
+ case 2500:
+ // Ice Maze: Large Cave
+ return new Scene2500();
+ case 2525:
+ // Ice Maze: Furnace room
+ return new Scene2525();
+ case 2530:
+ // Ice Maze: Well
+ return new Scene2530();
+ case 2535:
+ // Ice Maze: Tannery
+ return new Scene2535();
+ case 2600:
+ // Ice Maze: Exit
+ return new Scene2600();
+ case 2700:
+ // Forest Maze
+ return new Scene2700();
+ case 2750:
+ // Forest Maze
+ return new Scene2750();
+ case 2800:
+ // Exiting Forest
+ return new Scene2800();
+ case 2900:
+ error("Missing scene %d from group 2", sceneNumber);
+ /* Scene group #3 */
+ //
+ case 3100:
+ return new Scene3100();
+ case 3125:
+ // Ghouls dormitory
+ return new Scene3125();
+ case 3150:
+ // Jail
+ return new Scene3150();
+ case 3175:
+ // Autopsy room
+ return new Scene3175();
+ case 3200:
+ // Cutscene : Guards - Discussion
+ return new Scene3200();
+ case 3210:
+ // Cutscene : Captain and Private - Discussion
+ return new Scene3210();
+ case 3220:
+ // Cutscene : Guards in cargo zone
+ return new Scene3220();
+ case 3230:
+ // Cutscene : Guards on duty
+ return new Scene3230();
+ case 3240:
+ // Cutscene : Teal monolog
+ return new Scene3240();
+ case 3245:
+ // Cutscene : Discussions with Dr. Tomko
+ return new Scene3245();
+ case 3250:
+ // Room with large stasis field negator
+ return new Scene3250();
+ case 3255:
+ return new Scene3255();
+ case 3260:
+ // Computer room
+ return new Scene3260();
+ case 3275:
+ // Hall
+ return new Scene3275();
+ case 3350:
+ // Cutscene - Ship landing
+ return new Scene3350();
+ case 3375:
+ return new Scene3375();
+ case 3385:
+ return new Scene3385();
+ case 3395:
+ return new Scene3395();
+ case 3400:
+ return new Scene3400();
+ case 3500:
+ return new Scene3500();
+ case 3600:
+ return new Scene3600();
+ case 3700:
+ // Cutscene - Teleport outside
+ return new Scene3700();
+ case 3800:
+ return new Scene3800();
+ case 3900:
+ return new Scene3900();
default:
error("Unknown scene number - %d", sceneNumber);
break;
@@ -48,14 +286,16 @@ Scene *Ringworld2Game::createScene(int sceneNumber) {
* Returns true if it is currently okay to restore a game
*/
bool Ringworld2Game::canLoadGameStateCurrently() {
- return true;
+ // Don't allow a game to be loaded if a dialog is active
+ return g_globals->_gfxManagers.size() == 1;
}
/**
* Returns true if it is currently okay to save the game
*/
bool Ringworld2Game::canSaveGameStateCurrently() {
- return true;
+ // Don't allow a game to be saved if a dialog is active
+ return g_globals->_gfxManagers.size() == 1;
}
/*--------------------------------------------------------------------------*/
@@ -64,6 +304,8 @@ SceneExt::SceneExt(): Scene() {
_stripManager._onBegin = SceneExt::startStrip;
_stripManager._onEnd = SceneExt::endStrip;
+ for (int i = 0; i < 256; i++)
+ _field312[i] = 0;
_field372 = _field37A = 0;
_savedPlayerEnabled = false;
_savedUiEnabled = false;
@@ -76,21 +318,29 @@ void SceneExt::postInit(SceneObjectList *OwnerList) {
// Exclude the bottom area of the screen to allow room for the UI
T2_GLOBALS._interfaceY = UI_INTERFACE_Y;
+
+ // Initialise fields
+ _action = NULL;
+ _field12 = 0;
+ _sceneMode = 0;
+
+ int prevScene = R2_GLOBALS._sceneManager._previousScene;
+ int sceneNumber = R2_GLOBALS._sceneManager._sceneNumber;
+ if (((prevScene == -1) && (sceneNumber != 180) && (sceneNumber != 205) && (sceneNumber != 50))
+ || (sceneNumber == 50)
+ || ((prevScene == 205) && (sceneNumber == 100))
+ || ((prevScene == 180) && (sceneNumber == 100))) {
+ static_cast<SceneHandlerExt *>(R2_GLOBALS._sceneHandler)->setupPaletteMaps();
+ R2_GLOBALS._uiElements._active = true;
+ R2_GLOBALS._uiElements.show();
+ } else {
+ R2_GLOBALS._uiElements.updateInventory();
+ }
}
void SceneExt::remove() {
-/*
- R2_GLOBALS._uiElements.hide();
- R2_GLOBALS._uiElements.resetClear();
-
- if (_action) {
- if (_action->_endHandler)
- _action->_endHandler = NULL;
- _action->remove();
- }
-
- _focusObject = NULL;
-*/
+ _sceneAreas.clear();
+ Scene::remove();
}
void SceneExt::process(Event &event) {
@@ -120,23 +370,71 @@ void SceneExt::loadScene(int sceneNum) {
_v51C34.top = 0;
_v51C34.bottom = 300;
+
+ int prevScene = R2_GLOBALS._sceneManager._previousScene;
+ int sceneNumber = R2_GLOBALS._sceneManager._sceneNumber;
+
+ if (((prevScene == -1) && (sceneNumber != 180) && (sceneNumber != 205) && (sceneNumber != 50)) ||
+ (sceneNumber == 50) || ((prevScene == 205) && (sceneNumber == 100)) ||
+ ((prevScene == 180) && (sceneNumber == 100))) {
+ // TODO: sub_17875
+ R2_GLOBALS._uiElements._active = true;
+ R2_GLOBALS._uiElements.show();
+ } else {
+ // Update the user interface
+ R2_GLOBALS._uiElements.updateInventory();
+ }
}
-bool SceneExt::display(CursorType action) {
+bool SceneExt::display(CursorType action, Event &event) {
switch (action) {
+ case CURSOR_CROSSHAIRS:
+ case CURSOR_WALK:
+ return false;
case CURSOR_LOOK:
- SceneItem::display2(9000, R2_GLOBALS._randomSource.getRandomNumber(2));
+ SceneItem::display2(1, R2_GLOBALS._randomSource.getRandomNumber(4));
break;
case CURSOR_USE:
- SceneItem::display2(9000, R2_GLOBALS._randomSource.getRandomNumber(2) + 6);
+ SceneItem::display2(1, R2_GLOBALS._randomSource.getRandomNumber(4) + 5);
break;
case CURSOR_TALK:
- SceneItem::display2(9000, R2_GLOBALS._randomSource.getRandomNumber(2) + 3);
+ SceneItem::display2(1, R2_GLOBALS._randomSource.getRandomNumber(4) + 10);
+ break;
+ case R2_NEGATOR_GUN:
+ if (R2_GLOBALS.getFlag(1))
+ SceneItem::display2(2, action);
+ else
+ SceneItem::display2(5, 0);
+ break;
+ case R2_SONIC_STUNNER:
+ if ((R2_GLOBALS._v565F1[1] == 2) || ((R2_GLOBALS._v565F1[1] == 1) &&
+ (R2_GLOBALS._v565F1[2] == 2) && (R2_GLOBALS._sceneManager._previousScene == 300))) {
+ R2_GLOBALS._sound4.stop();
+ R2_GLOBALS._sound3.play(46);
+ SceneItem::display2(5, 15);
+ } else {
+ R2_GLOBALS._sound3.play(43, 0);
+ SceneItem::display2(2, 0);
+ }
+
+ R2_GLOBALS._sound4.play(45);
+ break;
+ case R2_COM_SCANNER:
+ case R2_COM_SCANNER_2:
+ R2_GLOBALS._sound3.play(44);
+ SceneItem::display2(2, action);
+ R2_GLOBALS._sound3.stop();
+ break;
+ case R2_PHOTON_STUNNER:
+ R2_GLOBALS._sound3.play(99);
+ SceneItem::display2(2, action);
break;
default:
- return false;
+ SceneItem::display2(2, action);
+ break;
}
+ event.handled = true;
return true;
}
@@ -219,6 +517,162 @@ void SceneExt::refreshBackground(int xAmount, int yAmount) {
DEALLOCATE(dataP);
}
+/**
+ * Saves the current player position and view in the details for the specified character index
+ */
+void SceneExt::saveCharacter(int characterIndex) {
+ R2_GLOBALS._player._characterPos[characterIndex] = R2_GLOBALS._player._position;
+ R2_GLOBALS._player._characterStrip[characterIndex] = R2_GLOBALS._player._strip;
+ R2_GLOBALS._player._characterFrame[characterIndex] = R2_GLOBALS._player._frame;
+}
+
+void SceneExt::scalePalette(int RFactor, int GFactor, int BFactor) {
+ byte *tmpPal = R2_GLOBALS._scenePalette._palette;
+ byte newR, newG, newB;
+ int tmp, varC, varD = 0;
+
+ for (int i = 0; i < 256; i++) {
+ newR = (RFactor * tmpPal[(3 * i)]) / 100;
+ newG = (GFactor * tmpPal[(3 * i) + 1]) / 100;
+ newB = (BFactor * tmpPal[(3 * i) + 2]) / 100;
+
+ varC = 769;
+ for (int j = 255; j >= 0; j--) {
+ tmp = abs(tmpPal[(3 * j)] - newR);
+ if (tmp >= varC)
+ continue;
+
+ tmp += abs(tmpPal[(3 * j) + 1] - newG);
+ if (tmp >= varC)
+ continue;
+
+ tmp += abs(tmpPal[(3 * j) + 2] - newB);
+ if (tmp >= varC)
+ continue;
+
+ varC = tmp;
+ varD = j;
+ }
+ this->_field312[i] = varD;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void SceneHandlerExt::postInit(SceneObjectList *OwnerList) {
+ SceneHandler::postInit(OwnerList);
+}
+
+void SceneHandlerExt::process(Event &event) {
+ if (T2_GLOBALS._uiElements._active && R2_GLOBALS._player._uiEnabled) {
+ T2_GLOBALS._uiElements.process(event);
+ if (event.handled)
+ return;
+ }
+
+ SceneExt *scene = static_cast<SceneExt *>(R2_GLOBALS._sceneManager._scene);
+ if (scene && R2_GLOBALS._player._uiEnabled) {
+ // Handle any scene areas that have been registered
+ SynchronizedList<SceneArea *>::iterator saIter;
+ for (saIter = scene->_sceneAreas.begin(); saIter != scene->_sceneAreas.end() && !event.handled; ++saIter) {
+ (*saIter)->process(event);
+ }
+ }
+
+ if (!event.handled)
+ SceneHandler::process(event);
+}
+
+void SceneHandlerExt::setupPaletteMaps() {
+ byte *palP = &R2_GLOBALS._scenePalette._palette[0];
+
+ if (!R2_GLOBALS._v1000Flag) {
+ R2_GLOBALS._v1000Flag = true;
+
+ for (int idx = 0; idx < 10; ++idx) {
+ for (int palIndex = 0; palIndex < 224; ++palIndex) {
+ int r, g, b;
+
+ // Get adjusted RGB values
+ switch (idx) {
+ case 7:
+ r = palP[palIndex * 3] * 85 / 100;
+ g = palP[palIndex * 3 + 1] * 7 / 10;
+ b = palP[palIndex * 3 + 2] * 7 / 10;
+ break;
+ case 8:
+ r = palP[palIndex * 3] * 7 / 10;
+ g = palP[palIndex * 3 + 1] * 85 / 100;
+ b = palP[palIndex * 3 + 2] * 7 / 10;
+ break;
+ case 9:
+ r = palP[palIndex * 3] * 8 / 10;
+ g = palP[palIndex * 3 + 1] * 5 / 10;
+ b = palP[palIndex * 3 + 2] * 9 / 10;
+ break;
+ default:
+ r = palP[palIndex * 3] * (10 - idx) / 10;
+ g = palP[palIndex * 3 + 1] * (10 - idx) / 12;
+ b = palP[palIndex * 3 + 2] * (10 - idx) / 10;
+ break;
+ }
+
+ // Scan for the palette index with the closest matching colour
+ int threshold = 769;
+ int foundIndex = -1;
+ for (int pIndex2 = 223; pIndex2 >= 0; --pIndex2) {
+ int diffSum = ABS(palP[pIndex2 * 3] - r);
+ if (diffSum >= threshold)
+ continue;
+
+ diffSum += ABS(palP[pIndex2 * 3 + 1] - g);
+ if (diffSum >= threshold)
+ continue;
+
+ diffSum += ABS(palP[pIndex2 * 3 + 2] - b);
+ if (diffSum >= threshold)
+ continue;
+
+ threshold = diffSum;
+ foundIndex = pIndex2;
+ }
+
+ R2_GLOBALS._palIndexList[idx][palIndex] = foundIndex;
+ }
+ }
+ }
+
+ for (int palIndex = 0; palIndex < 224; ++palIndex) {
+ int r = palP[palIndex * 3] >> 2;
+ int g = palP[palIndex * 3 + 1] >> 2;
+ int b = palP[palIndex * 3 + 2] >> 2;
+
+ int idx = (((r << 4) | g) << 4) | b;
+ R2_GLOBALS._v1000[idx] = palIndex;
+ }
+
+ int vdx = 0;
+ int idx = 0;
+ int palIndex = 224;
+
+ for (int vIndex = 0; vIndex < 4096; ++vIndex) {
+ int v = R2_GLOBALS._v1000[vIndex];
+ if (!v) {
+ R2_GLOBALS._v1000[vIndex] = idx;
+ } else {
+ idx = v;
+ }
+
+ if (!palIndex) {
+ vdx = palIndex;
+ } else {
+ int idxTemp = palIndex;
+ palIndex = (palIndex + vdx) / 2;
+ vdx = idxTemp;
+ }
+ }
+}
+
/*--------------------------------------------------------------------------*/
DisplayHotspot::DisplayHotspot(int regionId, ...) {
@@ -281,7 +735,7 @@ Ringworld2InvObjectList::Ringworld2InvObjectList():
_none(1, 1),
_inv1(1, 2),
_inv2(1, 3),
- _inv3(1, 4),
+ _negatorGun(1, 4),
_steppingDisks(1, 5),
_inv5(1, 6),
_inv6(1, 7),
@@ -336,7 +790,7 @@ Ringworld2InvObjectList::Ringworld2InvObjectList():
_itemList.push_back(&_none);
_itemList.push_back(&_inv1);
_itemList.push_back(&_inv2);
- _itemList.push_back(&_inv3);
+ _itemList.push_back(&_negatorGun);
_itemList.push_back(&_steppingDisks);
_itemList.push_back(&_inv5);
_itemList.push_back(&_inv6);
@@ -398,58 +852,58 @@ void Ringworld2InvObjectList::reset() {
}
// Set up default inventory
- setObjectScene(R2_1, 800);
- setObjectScene(R2_2, 400);
- setObjectScene(R2_3, 100);
+ setObjectScene(R2_OPTO_DISK, 800);
+ setObjectScene(R2_READER, 400);
+ setObjectScene(R2_NEGATOR_GUN, 100);
setObjectScene(R2_STEPPING_DISKS, 100);
- setObjectScene(R2_5, 400);
- setObjectScene(R2_6, 400);
- setObjectScene(R2_7, 500);
- setObjectScene(R2_8, 700);
- setObjectScene(R2_9, 800);
- setObjectScene(R2_10, 100);
- setObjectScene(R2_11, 400);
- setObjectScene(R2_12, 500);
- setObjectScene(R2_13, 1550);
- setObjectScene(R2_14, 850);
- setObjectScene(R2_15, 850);
- setObjectScene(R2_16, 0);
- setObjectScene(R2_17, 1550);
- setObjectScene(R2_18, 1550);
- setObjectScene(R2_19, 1550);
- setObjectScene(R2_20, 500);
- setObjectScene(R2_21, 500);
- setObjectScene(R2_22, 1550);
- setObjectScene(R2_23, 1580);
- setObjectScene(R2_24, 9999);
- setObjectScene(R2_25, 1550);
- setObjectScene(R2_26, 1550);
- setObjectScene(R2_27, 1580);
- setObjectScene(R2_28, 1550);
- setObjectScene(R2_29, 2525);
- setObjectScene(R2_30, 2440);
- setObjectScene(R2_31, 2455);
- setObjectScene(R2_32, 2535);
- setObjectScene(R2_33, 2530);
- setObjectScene(R2_34, 1950);
- setObjectScene(R2_35, 1950);
- setObjectScene(R2_36, 9999);
- setObjectScene(R2_37, 2430);
- setObjectScene(R2_38, 9999);
- setObjectScene(R2_39, 2);
- setObjectScene(R2_40, 9999);
- setObjectScene(R2_41, 3150);
- setObjectScene(R2_42, 0);
- setObjectScene(R2_43, 3260);
- setObjectScene(R2_44, 2);
- setObjectScene(R2_45, 1550);
- setObjectScene(R2_46, 0);
- setObjectScene(R2_47, 3150);
- setObjectScene(R2_48, 2435);
- setObjectScene(R2_49, 2440);
- setObjectScene(R2_50, 2435);
- setObjectScene(R2_51, 1580);
- setObjectScene(R2_52, 3260);
+ setObjectScene(R2_ATTRACTOR_UNIT, 400);
+ setObjectScene(R2_SENSOR_PROBE, 400);
+ setObjectScene(R2_SONIC_STUNNER, 500);
+ setObjectScene(R2_CABLE_HARNESS, 700);
+ setObjectScene(R2_COM_SCANNER, 800);
+ setObjectScene(R2_SPENT_POWER_CAPSULE, 100);
+ setObjectScene(R2_CHARGED_POWER_CAPSULE, 400);
+ setObjectScene(R2_AEROSOL, 500);
+ setObjectScene(R2_REMOTE_CONTROL, 1550);
+ setObjectScene(R2_OPTICAL_FIBRE, 850);
+ setObjectScene(R2_CLAMP, 850);
+ setObjectScene(R2_ATTRACTOR_CABLE_HARNESS, 0);
+ setObjectScene(R2_FUEL_CELL, 1550);
+ setObjectScene(R2_GYROSCOPE, 1550);
+ setObjectScene(R2_AIRBAG, 1550);
+ setObjectScene(R2_REBREATHER_TANK, 500);
+ setObjectScene(R2_RESERVE_REBREATHER_TANK, 500);
+ setObjectScene(R2_GUIDANCE_MODULE, 1550);
+ setObjectScene(R2_THRUSTER_VALVE, 1580);
+ setObjectScene(R2_BALLOON_BACKPACK, 9999);
+ setObjectScene(R2_RADAR_MECHANISM, 1550);
+ setObjectScene(R2_JOYSTICK, 1550);
+ setObjectScene(R2_IGNITOR, 1580);
+ setObjectScene(R2_DIAGNOSTICS_DISPLAY, 1550);
+ setObjectScene(R2_GLASS_DOME, 2525);
+ setObjectScene(R2_WICK_LAMP, 2440);
+ setObjectScene(R2_SCRITH_KEY, 2455);
+ setObjectScene(R2_TANNER_MASK, 2535);
+ setObjectScene(R2_PURE_GRAIN_ALCOHOL, 2530);
+ setObjectScene(R2_SAPPHIRE_BLUE, 1950);
+ setObjectScene(R2_ANCIENT_SCROLLS, 1950);
+ setObjectScene(R2_FLUTE, 9999);
+ setObjectScene(R2_GUNPOWDER, 2430);
+ setObjectScene(R2_NONAME, 9999);
+ setObjectScene(R2_COM_SCANNER_2, 2);
+ setObjectScene(R2_SUPERCONDUCTOR_WIRE, 9999);
+ setObjectScene(R2_PILLOW, 3150);
+ setObjectScene(R2_FOOD_TRAY, 0);
+ setObjectScene(R2_LASER_HACKSAW, 3260);
+ setObjectScene(R2_PHOTON_STUNNER, 2);
+ setObjectScene(R2_BATTERY, 1550);
+ setObjectScene(R2_SOAKED_FACEMASK, 0);
+ setObjectScene(R2_LIGHT_BULB, 3150);
+ setObjectScene(R2_ALCOHOL_LAMP, 2435);
+ setObjectScene(R2_ALCOHOL_LAMP_2, 2440);
+ setObjectScene(R2_ALCOHOL_LAMP_3, 2435);
+ setObjectScene(R2_BROKEN_DISPLAY, 1580);
+ setObjectScene(R2_TOOLBOX, 3260);
}
void Ringworld2InvObjectList::setObjectScene(int objectNum, int sceneNumber) {
@@ -483,11 +937,12 @@ void Ringworld2Game::start() {
}
if (slot >= 0)
- g_globals->_sceneHandler->_loadGameSlot = slot;
+ R2_GLOBALS._sceneHandler->_loadGameSlot = slot;
else {
// Switch to the first game scene
- g_globals->_events.setCursor(CURSOR_WALK);
- g_globals->_sceneManager.setNewScene(100);
+ R2_GLOBALS._events.setCursor(CURSOR_WALK);
+ R2_GLOBALS._uiElements._active = true;
+ R2_GLOBALS._sceneManager.setNewScene(100);
}
g_globals->_events.showCursor();
@@ -536,7 +991,7 @@ void Ringworld2Game::processEvent(Event &event) {
switch (event.kbd.keycode) {
case Common::KEYCODE_F1:
// F1 - Help
-// MessageDialog::show(HELP_MSG, OK_BTN_STRING);
+ HelpDialog::show();
break;
case Common::KEYCODE_F2:
@@ -562,6 +1017,11 @@ void Ringworld2Game::processEvent(Event &event) {
g_globals->_events.setCursorFromFlag();
break;
+ case Common::KEYCODE_F8:
+ // F8 - Credits
+ warning("TODO: Show Credits");
+ break;
+
case Common::KEYCODE_F10:
// F10 - Pause
GfxDialog::setPalette();
@@ -616,84 +1076,13 @@ bool NamedHotspot::startAction(CursorType action, Event &event) {
}
}
-void NamedHotspot::setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum) {
- setBounds(ys, xe, ye, xs);
- _resNum = resnum;
- _lookLineNum = lookLineNum;
- _useLineNum = useLineNum;
- _talkLineNum = -1;
- g_globals->_sceneItems.addItems(this, NULL);
-}
-
-void NamedHotspot::setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) {
- setBounds(bounds);
- _resNum = resNum;
- _lookLineNum = lookLineNum;
- _talkLineNum = talkLineNum;
- _useLineNum = useLineNum;
-
- switch (mode) {
- case 2:
- g_globals->_sceneItems.push_front(this);
- break;
- case 4:
- g_globals->_sceneItems.addBefore(item, this);
- break;
- case 5:
- g_globals->_sceneItems.addAfter(item, this);
- break;
- default:
- g_globals->_sceneItems.push_back(this);
- break;
- }
-}
-
-void NamedHotspot::setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode) {
- _sceneRegionId = sceneRegionId;
- _resNum = resNum;
- _lookLineNum = lookLineNum;
- _talkLineNum = talkLineNum;
- _useLineNum = useLineNum;
-
- // Handle adding hotspot to scene items list as necessary
- switch (mode) {
- case 2:
- GLOBALS._sceneItems.push_front(this);
- break;
- case 3:
- break;
- default:
- GLOBALS._sceneItems.push_back(this);
- break;
- }
-}
-
-void NamedHotspot::synchronize(Serializer &s) {
- SceneHotspot::synchronize(s);
- s.syncAsSint16LE(_resNum);
- s.syncAsSint16LE(_lookLineNum);
- s.syncAsSint16LE(_useLineNum);
-
- if (g_vm->getGameID() == GType_BlueForce)
- s.syncAsSint16LE(_talkLineNum);
-}
+/*--------------------------------------------------------------------------*/
void SceneActor::postInit(SceneObjectList *OwnerList) {
_lookLineNum = _talkLineNum = _useLineNum = -1;
SceneObject::postInit();
}
-void SceneActor::synchronize(Serializer &s) {
- SceneObject::synchronize(s);
- s.syncAsSint16LE(_resNum);
- s.syncAsSint16LE(_lookLineNum);
- s.syncAsSint16LE(_talkLineNum);
- s.syncAsSint16LE(_useLineNum);
-
- s.syncAsSint16LE(_effect);
- s.syncAsSint16LE(_shade);
-}
-
bool SceneActor::startAction(CursorType action, Event &event) {
bool handled = true;
@@ -722,39 +1111,895 @@ bool SceneActor::startAction(CursorType action, Event &event) {
}
if (!handled)
- handled = ((SceneExt *)R2_GLOBALS._sceneManager._scene)->display(action);
+ handled = ((SceneExt *)R2_GLOBALS._sceneManager._scene)->display(action, event);
return handled;
}
-void SceneActor::setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) {
- _resNum = resNum;
- _lookLineNum = lookLineNum;
- _talkLineNum = talkLineNum;
- _useLineNum = useLineNum;
+/*--------------------------------------------------------------------------*/
+
+SceneArea::SceneArea(): EventHandler() {
+ _enabled = true;
+ _insideArea = false;
+ _savedCursorNum = CURSOR_NONE;
+ _cursorState = 0;
+}
+
+void SceneArea::synchronize(Serializer &s) {
+ EventHandler::synchronize(s);
+
+ _bounds.synchronize(s);
+ s.syncAsSint16LE(_enabled);
+ s.syncAsSint16LE(_insideArea);
+ s.syncAsSint16LE(_cursorNum);
+ s.syncAsSint16LE(_savedCursorNum);
+ s.syncAsSint16LE(_cursorState);
+}
+
+void SceneArea::remove() {
+ static_cast<SceneExt *>(R2_GLOBALS._sceneManager._scene)->_sceneAreas.remove(this);
+}
+
+void SceneArea::process(Event &event) {
+ if (!R2_GLOBALS._insetUp && _enabled && R2_GLOBALS._events.isCursorVisible()) {
+ CursorType cursor = R2_GLOBALS._events.getCursor();
+
+ if (_bounds.contains(event.mousePos)) {
+ // Cursor moving in bounded area
+ if (cursor != _cursorNum) {
+ _savedCursorNum = cursor;
+ _cursorState = 0;
+ R2_GLOBALS._events.setCursor(_cursorNum);
+ }
+ _insideArea = true;
+ } else if ((event.mousePos.y < 171) && _insideArea && (_cursorNum == cursor) &&
+ (_savedCursorNum != CURSOR_NONE)) {
+ // Cursor moved outside bounded area
+ R2_GLOBALS._events.setCursor(_savedCursorNum);
+ }
+ }
+}
+
+void SceneArea::setDetails(const Rect &bounds, CursorType cursor) {
+ _bounds = bounds;
+ _cursorNum = cursor;
+
+ static_cast<SceneExt *>(R2_GLOBALS._sceneManager._scene)->_sceneAreas.push_front(this);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SceneExit::SceneExit(): SceneArea() {
+ _moving = false;
+ _destPos = Common::Point(-1, -1);
+}
+
+void SceneExit::synchronize(Serializer &s) {
+ SceneArea::synchronize(s);
+
+ s.syncAsSint16LE(_moving);
+ s.syncAsSint16LE(_destPos.x);
+ s.syncAsSint16LE(_destPos.y);
+}
+
+void SceneExit::setDetails(const Rect &bounds, CursorType cursor, int sceneNumber) {
+ _sceneNumber = sceneNumber;
+ SceneArea::setDetails(bounds, cursor);
+}
+
+void SceneExit::changeScene() {
+ R2_GLOBALS._sceneManager.setNewScene(_sceneNumber);
+}
+
+void SceneExit::process(Event &event) {
+ if (!R2_GLOBALS._insetUp) {
+ SceneArea::process(event);
+
+ if (_enabled) {
+ if (event.eventType == EVENT_BUTTON_DOWN) {
+ if (!_bounds.contains(event.mousePos))
+ _moving = false;
+ else if (!R2_GLOBALS._player._canWalk) {
+ _moving = false;
+ changeScene();
+ event.handled = true;
+ } else {
+ Common::Point dest((_destPos.x == -1) ? event.mousePos.x : _destPos.x,
+ (_destPos.y == -1) ? event.mousePos.y : _destPos.y);
+ ADD_PLAYER_MOVER(dest.x, dest.y);
+
+ _moving = true;
+ event.handled = true;
+ }
+ }
+
+ if (_moving && (_bounds.contains(R2_GLOBALS._player._position) || (R2_GLOBALS._player._position == _destPos)))
+ changeScene();
+ }
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void SceneAreaObject::remove() {
+ _object1.remove();
+ SceneArea::remove();
+ --R2_GLOBALS._insetUp;
+}
+
+void SceneAreaObject::process(Event &event) {
+ if (_insetCount == R2_GLOBALS._insetUp) {
+ CursorType cursor = R2_GLOBALS._events.getCursor();
+
+ if (_bounds.contains(event.mousePos)) {
+ // Cursor moving in bounded area
+ if (cursor == _cursorNum) {
+ R2_GLOBALS._events.setCursor(_savedCursorNum);
+ }
+ } else if (event.mousePos.y < 168) {
+ if (_cursorNum != cursor)
+ // Cursor moved outside bounded area
+ R2_GLOBALS._events.setCursor(_savedCursorNum);
+
+ if (event.eventType == EVENT_BUTTON_DOWN) {
+ R2_GLOBALS._events.setCursor(_savedCursorNum);
+ event.handled = true;
+ }
+ }
+ }
+}
+
+void SceneAreaObject::setDetails(int visage, int strip, int frameNumber, const Common::Point &pt) {
+ _object1.postInit();
+ _object1.setup(visage, strip, frameNumber);
+ _object1.setPosition(pt);
+ _object1.fixPriority(250);
+
+ _cursorNum = CURSOR_INVALID;
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
+ scene->_sceneAreas.push_front(this);
+
+ _insetCount = ++R2_GLOBALS._insetUp;
+}
+
+void SceneAreaObject::setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum) {
+ ((SceneHotspot *)(this))->setDetails(resNum, lookLineNum, talkLineNum, useLineNum,
+ 2, (SceneItem *)NULL);
+}
+
+/*****************************************************************************/
+
+UnkObject1200::UnkObject1200() {
+ _field16 = _field3A = NULL;
+ _field12 = _field14 = 0;
+ _field26 = _field28 = _field2A = _field2C = _field2E = _field30 = 0;
+ _field32 = _field34 = _field36 = _field38 = _field3E = _field40 = 0;
+}
+
+void UnkObject1200::synchronize(Serializer &s) {
+ SavedObject::synchronize(s);
+
+ _rect1.synchronize(s);
+ _rect2.synchronize(s);
+
+ // FIXME: syncrhonize _field16 and _field3A
+
+ s.syncAsSint16LE(_field12);
+ s.syncAsSint16LE(_field14);
+ s.syncAsSint16LE(_field26);
+ s.syncAsSint16LE(_field28);
+ s.syncAsSint16LE(_field2A);
+ s.syncAsSint16LE(_field2C);
+ s.syncAsSint16LE(_field2E);
+ s.syncAsSint16LE(_field30);
+ s.syncAsSint16LE(_field32);
+ s.syncAsSint16LE(_field34);
+ s.syncAsSint16LE(_field36);
+ s.syncAsSint16LE(_field38);
+ s.syncAsSint16LE(_field3E);
+ s.syncAsSint16LE(_field40);
+}
+
+void UnkObject1200::sub51AE9(int arg1) {
+ warning("STUB: UnkObject1200::sub51AE9()");
+}
+
+int UnkObject1200::sub51AF8(Common::Point pt) {
+ if (!_rect1.contains(pt))
+ return -1;
+
+ int tmp1 = (pt.x - _rect1.left + _field2E) / _field2A;
+ int tmp2 = (pt.y - _rect1.top + _field30) / _field2C;
+
+ if ((tmp1 >= 0) && (tmp2 >= 0) && (_field26 > tmp1) && (_field28 > tmp2))
+ return _field16[(((_field26 * tmp2) + tmp1)* 2)];
+
+ return -1;
+}
+
+bool UnkObject1200::sub51AFD(Common::Point pt) {
+ int retval = false;
+
+ _field2E = pt.x;
+ _field30 = pt.y;
+
+ if (_field2E < _rect2.top) {
+ _field2E = _rect2.top;
+ retval = true;
+ }
+
+ if (_field30 < _rect2.left) {
+ _field30 = _rect2.left;
+ retval = true;
+ }
+
+ if (_field2E + _rect1.width() > _rect2.right) {
+ _field2E = _rect2.right - _rect1.width();
+ retval = true;
+ }
+
+ if (_field30 + _rect1.height() > _rect2.bottom) {
+ _field30 = _rect2.bottom - _rect1.height();
+ retval = true;
+ }
+
+ return retval;
+}
+
+void UnkObject1200::sub51B02() {
+ warning("STUB: UnkObject1200::sub51B02()");
+}
+
+void UnkObject1200::sub9EDE8(Rect rect) {
+ _rect1 = rect;
+ warning("FIXME: UnkObject1200::sub9EDE8()");
+// _rect1.clip(g_globals->gfxManager()._bounds);
+}
+
+int UnkObject1200::sub9EE22(int &arg1, int &arg2) {
+ arg1 /= _field2A;
+ arg2 /= _field2C;
+
+ if ((arg1 >= 0) && (arg2 >= 0) && (_field26 > arg1) && (_field28 > arg2)) {
+ return _field16[(((_field26 * arg2) + arg1) * 2)];
+ }
+
+ return -1;
+}
- switch (mode) {
+void Scene1200::sub9DAD6(int indx) {
+ _object1.sub9EE22(R2_GLOBALS._v56AA2, R2_GLOBALS._v56AA4);
+
+ switch (indx) {
+ case 0:
+ if ( ((_object1.sub51AF8(Common::Point(200, 50)) > 36) || (_object1.sub51AF8(Common::Point(200, 88)) > 36))
+ && ( ((R2_GLOBALS._v56AA2 == 3) && (R2_GLOBALS._v56AA4 == 33) && (_field418 != 4))
+ || ((R2_GLOBALS._v56AA2 == 13) && (R2_GLOBALS._v56AA4 == 21) && (_field418 != 2))
+ || ((R2_GLOBALS._v56AA2 == 29) && (R2_GLOBALS._v56AA4 == 17) && (_field418 != 1))
+ || ((R2_GLOBALS._v56AA2 == 33) && (R2_GLOBALS._v56AA4 == 41)) )
+ ) {
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 1200;
+ setAction(&_sequenceManager, this, 1200, &_actor1, NULL);
+ } else if (_object1.sub51AF8(Common::Point(200, 69)) == 36) {
+ switch (_field412 - 1) {
+ case 0:
+ if (R2_GLOBALS._player._visage == 3155)
+ _sceneMode = 15;
+ else
+ _sceneMode = 10;
+ break;
+ case 1:
+ if (R2_GLOBALS._player._visage == 3156)
+ _sceneMode = 76;
+ else
+ _sceneMode = 75;
+ break;
+ case 2:
+ if (R2_GLOBALS._player._visage == 3156)
+ _sceneMode = 101;
+ else
+ _sceneMode = 100;
+ break;
+ case 3:
+ if (R2_GLOBALS._player._visage == 3156)
+ _sceneMode = 111;
+ else
+ _sceneMode = 110;
+ break;
+ default:
+ break;
+ }
+ R2_GLOBALS._player.disableControl();
+ _field412 = 1;
+ signal();
+ }
+ break;
+ case 1:
+ if ( ((_object1.sub51AF8(Common::Point(120, 50)) > 36) || (_object1.sub51AF8(Common::Point(120, 88)) > 36))
+ && ( ((R2_GLOBALS._v56AA2 == 7) && (R2_GLOBALS._v56AA4 == 33) && (_field418 != 4))
+ || ((R2_GLOBALS._v56AA2 == 17) && (R2_GLOBALS._v56AA4 == 21) && (_field418 != 2))
+ || ((R2_GLOBALS._v56AA2 == 33) && (R2_GLOBALS._v56AA4 == 17) && (_field418 != 1))
+ || ((R2_GLOBALS._v56AA2 == 5) && (R2_GLOBALS._v56AA4 == 5)) )
+ ) {
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 1201;
+ setAction(&_sequenceManager, this, 1201, &_actor1, NULL);
+ } else if (_object1.sub51AF8(Common::Point(120, 69)) == 36) {
+ switch (_field412 - 1) {
+ case 0:
+ if (R2_GLOBALS._player._visage == 3156)
+ _sceneMode = 56;
+ else
+ _sceneMode = 55;
+ break;
+ case 1:
+ if (R2_GLOBALS._player._visage == 3155)
+ _sceneMode = 25;
+ else
+ _sceneMode = 20;
+ break;
+ case 2:
+ if (R2_GLOBALS._player._visage == 3156)
+ _sceneMode = 91;
+ else
+ _sceneMode = 90;
+ break;
+ case 3:
+ if (R2_GLOBALS._player._visage == 3156)
+ _sceneMode = 121;
+ else
+ _sceneMode = 120;
+ break;
+ default:
+ break;
+ }
+ R2_GLOBALS._player.disableControl();
+ _field412 = 2;
+ signal();
+ }
+ break;
case 2:
- g_globals->_sceneItems.push_front(this);
+ if ( ((_object1.sub51AF8(Common::Point(140, 110)) > 36) || (_object1.sub51AF8(Common::Point(178, 110)) > 36))
+ && ( ((R2_GLOBALS._v56AA2 == 17) && (R2_GLOBALS._v56AA4 == 5) && (_field418 != 3))
+ || ((R2_GLOBALS._v56AA2 == 41) && (R2_GLOBALS._v56AA4 == 21)) )
+ ) {
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 1203;
+ setAction(&_sequenceManager, this, 1203, &_actor1, NULL);
+ } else if (_object1.sub51AF8(Common::Point(160, 110)) == 36) {
+ switch (_field412 - 1) {
+ case 0:
+ if (R2_GLOBALS._player._visage == 3156)
+ _sceneMode = 51;
+ else
+ _sceneMode = 50;
+ break;
+ case 1:
+ if (R2_GLOBALS._player._visage == 3156)
+ _sceneMode = 81;
+ else
+ _sceneMode = 80;
+ break;
+ case 2:
+ if (R2_GLOBALS._player._visage == 3155)
+ _sceneMode = 35;
+ else
+ _sceneMode = 30;
+ break;
+ case 3:
+ if (R2_GLOBALS._player._visage == 3156)
+ _sceneMode = 116;
+ else
+ _sceneMode = 115;
+ break;
+ default:
+ break;
+ }
+ R2_GLOBALS._player.disableControl();
+ _field412 = 3;
+ signal();
+ }
+ break;
+ case 3:
+ if ( ((_object1.sub51AF8(Common::Point(140, 30)) > 36) || (_object1.sub51AF8(Common::Point(178, 30)) > 36))
+ && ( ((R2_GLOBALS._v56AA2 == 17) && (R2_GLOBALS._v56AA4 == 9) && (_field418 != 3))
+ || ((R2_GLOBALS._v56AA2 == 35) && (R2_GLOBALS._v56AA4 == 17)) )
+ ) {
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 1202;
+ setAction(&_sequenceManager, this, 1202, &_actor1, NULL);
+ } else if (_object1.sub51AF8(Common::Point(160, 30)) == 36) {
+ switch (_field412 - 1) {
+ case 0:
+ if (R2_GLOBALS._player._visage == 3156)
+ _sceneMode = 61;
+ else
+ _sceneMode = 60;
+ break;
+ case 1:
+ if (R2_GLOBALS._player._visage == 3156)
+ _sceneMode = 71;
+ else
+ _sceneMode = 70;
+ break;
+ case 2:
+ if (R2_GLOBALS._player._visage == 3156)
+ _sceneMode = 96;
+ else
+ _sceneMode = 95;
+ break;
+ case 3:
+ if (R2_GLOBALS._player._visage == 3155)
+ _sceneMode = 45;
+ else
+ _sceneMode = 40;
+ break;
+ default:
+ _sceneMode = 1;
+ R2_GLOBALS._player.setup(3156, 4, 6);
+ break;
+ }
+ R2_GLOBALS._player.disableControl();
+ _field412 = 4;
+ signal();
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void AnimationSlice::load(Common::File &f) {
+ f.skip(2);
+ _sliceOffset = f.readUint16LE();
+ f.skip(6);
+ _drawMode = f.readByte();
+ _secondaryIndex = f.readByte();
+}
+
+/*--------------------------------------------------------------------------*/
+
+AnimationSlices::AnimationSlices() {
+ _pixelData = NULL;
+}
+
+AnimationSlices::~AnimationSlices() {
+ delete[] _pixelData;
+}
+
+void AnimationSlices::load(Common::File &f) {
+ f.skip(4);
+ _dataSize = f.readUint32LE();
+ f.skip(8);
+ _dataSize2 = f.readUint32LE();
+ f.skip(28);
+
+ // Load the four slice indexes
+ for (int idx = 0; idx < 4; ++idx)
+ _slices[idx].load(f);
+}
+
+int AnimationSlices::loadPixels(Common::File &f, int slicesSize) {
+ delete[] _pixelData;
+ _pixelData = new byte[slicesSize];
+ return f.read(_pixelData, slicesSize);
+}
+
+/*--------------------------------------------------------------------------*/
+
+void AnimationPlayerSubData::load(Common::File &f) {
+ uint32 posStart = f.pos();
+
+ f.skip(6);
+ _duration = f.readUint32LE();
+ _frameRate = f.readUint16LE();
+ _framesPerSlices = f.readUint16LE();
+ _drawType = f.readUint16LE();
+ f.skip(2);
+ _sliceSize = f.readUint16LE();
+ _ySlices = f.readUint16LE();
+ _field16 = f.readUint32LE();
+ f.skip(2);
+ _palStart = f.readUint16LE();
+ _palSize = f.readUint16LE();
+ f.read(_palData, 768);
+ _totalSize = f.readSint32LE();
+ f.skip(12);
+ _slices.load(f);
+
+ uint32 posEnd = f.pos();
+ assert((posEnd - posStart) == 0x390);
+}
+
+/*--------------------------------------------------------------------------*/
+
+AnimationPlayer::AnimationPlayer(): EventHandler() {
+ _endAction = NULL;
+
+ _animData1 = NULL;
+ _animData2 = NULL;
+
+ _screenBounds = R2_GLOBALS._gfxManagerInstance._bounds;
+ _rect1 = R2_GLOBALS._gfxManagerInstance._bounds;
+ _paletteMode = ANIMPALMODE_REPLACE_PALETTE;
+ _field3A = 1;
+ _sliceHeight = 1;
+ _field58 = 1;
+ _endAction = NULL;
+}
+
+AnimationPlayer::~AnimationPlayer() {
+ if (!isCompleted())
+ close();
+}
+
+void AnimationPlayer::synchronize(Serializer &s) {
+ EventHandler::synchronize(s);
+ warning("TODO AnimationPlayer::load");
+}
+
+void AnimationPlayer::remove() {
+ if (_endAction)
+ _endAction->signal();
+
+ _endAction = NULL;
+}
+
+void AnimationPlayer::process(Event &event) {
+ if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE) &&
+ (_field3A)) {
+ // Move the current position to the end
+ _position = _subData._duration;
+ }
+}
+
+void AnimationPlayer::dispatch() {
+ uint32 gameFrame = R2_GLOBALS._events.getFrameNumber();
+ uint32 gameDiff = gameFrame - _gameFrame;
+
+ if (gameDiff >= _frameDelay) {
+ drawFrame(_playbackTick % _subData._framesPerSlices);
+ ++_playbackTick;
+ _position = _playbackTick / _subData._framesPerSlices;
+
+ if (_position == _nextSlicesPosition)
+ nextSlices();
+
+ _playbackTickPrior = _playbackTick;
+ _gameFrame = gameFrame;
+ }
+}
+
+bool AnimationPlayer::load(int animId, Action *endAction) {
+ // Open up the main resource file for access
+ TLib &libFile = g_resourceManager->first();
+ if (!_resourceFile.open(libFile.getFilename()))
+ error("Could not open resource");
+
+ // Get the offset of the given resource and seek to it in the player's file reference
+ ResourceEntry entry;
+ uint32 fileOffset = libFile.getResourceStart(RES_IMAGE, animId, 0, entry);
+ _resourceFile.seek(fileOffset);
+
+ // At this point, the file is pointing to the start of the resource data
+
+ // Set the end action
+ _endAction = endAction;
+
+ // Load the sub data block
+ _subData.load(_resourceFile);
+
+ // Set other properties
+ _playbackTickPrior = -1;
+ _playbackTick = 0;
+
+ // The final multiplication is used to deliberately slow down playback, since the original
+ // was slowed down by the amount of time spent to decode and display the frames
+ _frameDelay = (60 / _subData._frameRate) * 8;
+ _gameFrame = R2_GLOBALS._events.getFrameNumber();
+
+ if (_subData._totalSize) {
+ _dataNeeded = _subData._totalSize;
+ } else {
+ int v = (_subData._sliceSize + 2) * _subData._ySlices * _subData._framesPerSlices;
+ _dataNeeded = (_subData._field16 / _subData._framesPerSlices) + v + 96;
+ }
+
+ debugC(1, ktSageDebugGraphics, "Data needed %d", _dataNeeded);
+
+ // Set up animation data objects
+ _animData1 = new AnimationData();
+ _sliceCurrent = _animData1;
+
+ if (_subData._framesPerSlices <= 1) {
+ _animData2 = NULL;
+ _sliceNext = _sliceCurrent;
+ } else {
+ _animData2 = new AnimationData();
+ _sliceNext = _animData2;
+ }
+
+ _position = 0;
+ _nextSlicesPosition = 1;
+
+ // Load up the first slices set
+ _sliceCurrent->_dataSize = _subData._slices._dataSize;
+ _sliceCurrent->_slices = _subData._slices;
+ int slicesSize = _sliceCurrent->_dataSize - 96;
+ int readSize = _sliceCurrent->_slices.loadPixels(_resourceFile, slicesSize);
+ _sliceCurrent->_animSlicesSize = readSize + 96;
+
+ if (_sliceNext != _sliceCurrent) {
+ getSlices();
+ }
+
+ // Handle starting palette
+ switch (_paletteMode) {
+ case ANIMPALMODE_REPLACE_PALETTE:
+ // Use the palette provided with the animation directly
+ _palette.getPalette();
+ for (int idx = _subData._palStart; idx < (_subData._palStart + _subData._palSize); ++idx) {
+ byte r = _subData._palData[idx * 3];
+ byte g = _subData._palData[idx * 3 + 1];
+ byte b = _subData._palData[idx * 3 + 2];
+
+ R2_GLOBALS._scenePalette.setEntry(idx, r, g, b);
+ }
+
+ R2_GLOBALS._sceneManager._hasPalette = true;
+ break;
+ case ANIMPALMODE_NONE:
break;
- case 4:
- g_globals->_sceneItems.addBefore(item, this);
+
+ default:
+ // ANIMPALMODE_CURR_PALETTE
+ // Use the closest matching colours in the currently active palette to those specified in the animation
+ for (int idx = _subData._palStart; idx < (_subData._palStart + _subData._palSize); ++idx) {
+ byte r = _subData._palData[idx * 3];
+ byte g = _subData._palData[idx * 3 + 1];
+ byte b = _subData._palData[idx * 3 + 2];
+
+ int palIndex = R2_GLOBALS._scenePalette.indexOf(r, g, b);
+ _palIndexes[idx] = palIndex;
+ }
break;
- case 5:
- g_globals->_sceneItems.addAfter(item, this);
+ }
+
+ ++R2_GLOBALS._animationCtr;
+ _field38 = 1;
+ return true;
+}
+
+void AnimationPlayer::drawFrame(int sliceIndex) {
+ assert(sliceIndex < 4);
+ AnimationSlices &slices = _sliceCurrent->_slices;
+ AnimationSlice &slice = _sliceCurrent->_slices._slices[sliceIndex];
+
+ byte *sliceDataStart = &slices._pixelData[slice._sliceOffset - 96];
+ byte *sliceData1 = sliceDataStart;
+
+ Rect playerBounds = _screenBounds;
+ int y = _screenBounds.top;
+ R2_GLOBALS._screenSurface.addDirtyRect(playerBounds);
+
+ Graphics::Surface surface = R2_GLOBALS._screenSurface.lockSurface();
+
+ // Handle different drawing modes
+ switch (slice._drawMode) {
+ case 0:
+ // Draw from uncompressed source
+ for (int sliceNum = 0; sliceNum < _subData._ySlices; ++sliceNum) {
+ for (int yIndex = 0; yIndex < _sliceHeight; ++yIndex) {
+ // TODO: Check of _subData._drawType was done for two different kinds of
+ // line slice drawing in original
+ const byte *pSrc = (const byte *)sliceDataStart + READ_LE_UINT16(sliceData1 + sliceNum * 2);
+ byte *pDest = (byte *)surface.getBasePtr(playerBounds.left, y++);
+
+ Common::copy(pSrc, pSrc + _subData._sliceSize, pDest);
+ }
+ }
break;
+
+ case 1:
+ switch (slice._secondaryIndex) {
+ case 0xfe:
+ // Draw from uncompressed source with optional skipped rows
+ for (int sliceNum = 0; sliceNum < _subData._ySlices; ++sliceNum) {
+ for (int yIndex = 0; yIndex < _sliceHeight; ++yIndex, playerBounds.top++) {
+ int offset = READ_LE_UINT16(sliceData1 + sliceNum * 2);
+
+ if (offset) {
+ const byte *pSrc = (const byte *)sliceDataStart + offset;
+ byte *pDest = (byte *)surface.getBasePtr(playerBounds.left, playerBounds.top);
+
+ //Common::copy(pSrc, pSrc + playerBounds.width(), pDest);
+ rleDecode(pSrc, pDest, playerBounds.width());
+ }
+ }
+ }
+ break;
+ case 0xff:
+ // Draw from RLE compressed source
+ for (int sliceNum = 0; sliceNum < _subData._ySlices; ++sliceNum) {
+ for (int yIndex = 0; yIndex < _sliceHeight; ++yIndex, playerBounds.top++) {
+ // TODO: Check of _subData._drawType was done for two different kinds of
+ // line slice drawing in original
+ const byte *pSrc = (const byte *)sliceDataStart + READ_LE_UINT16(sliceData1 + sliceNum * 2);
+ byte *pDest = (byte *)surface.getBasePtr(playerBounds.left, playerBounds.top);
+
+ rleDecode(pSrc, pDest, _subData._sliceSize);
+ }
+ }
+ break;
+ default: {
+ // Draw from two slice sets simultaneously
+ AnimationSlice &slice2 = _sliceCurrent->_slices._slices[slice._secondaryIndex];
+ byte *sliceData2 = &slices._pixelData[slice2._sliceOffset - 96];
+
+ for (int sliceNum = 0; sliceNum < _subData._ySlices; ++sliceNum) {
+ for (int yIndex = 0; yIndex < _sliceHeight; ++yIndex) {
+ const byte *pSrc1 = (const byte *)sliceDataStart + READ_LE_UINT16(sliceData2 + sliceNum * 2);
+ const byte *pSrc2 = (const byte *)sliceDataStart + READ_LE_UINT16(sliceData1 + sliceNum * 2);
+ byte *pDest = (byte *)surface.getBasePtr(playerBounds.left, y++);
+
+ if (slice2._drawMode == 0) {
+ // Uncompressed background, foreground compressed
+ Common::copy(pSrc1, pSrc1 + _subData._sliceSize, pDest);
+ rleDecode(pSrc2, pDest, _subData._sliceSize);
+ } else {
+ // Both background and foreground is compressed
+ rleDecode(pSrc1, pDest, _subData._sliceSize);
+ rleDecode(pSrc2, pDest, _subData._sliceSize);
+ }
+ }
+ }
+ break;
+ }
+ }
default:
- g_globals->_sceneItems.push_back(this);
break;
}
+
+ // Unlock the screen surface
+ R2_GLOBALS._screenSurface.unlockSurface();
+
+ if (_objectMode == 42) {
+ _screenBounds.expandPanes();
+
+ // Copy the drawn frame to the back surface
+ Rect srcRect = R2_GLOBALS._screenSurface.getBounds();
+ Rect destRect = srcRect;
+ destRect.translate(-g_globals->_sceneOffset.x, -g_globals->_sceneOffset.y);
+ R2_GLOBALS._sceneManager._scene->_backSurface.copyFrom(R2_GLOBALS._screenSurface,
+ srcRect, destRect);
+
+ // Draw any objects into the scene
+ R2_GLOBALS._sceneObjects->draw();
+ } else {
+ if (R2_GLOBALS._sceneManager._hasPalette) {
+ R2_GLOBALS._sceneManager._hasPalette = false;
+ R2_GLOBALS._scenePalette.refresh();
+ }
+ }
+}
+
+/**
+ * Read the next frame's slice set
+ */
+void AnimationPlayer::nextSlices() {
+ _position = _nextSlicesPosition++;
+ _playbackTick = _position * _subData._framesPerSlices;
+ _playbackTickPrior = _playbackTick - 1;
+
+ if (_sliceNext == _sliceCurrent) {
+ int dataSize = _sliceCurrent->_slices._dataSize2;
+ _sliceCurrent->_dataSize = dataSize;
+ debugC(1, ktSageDebugGraphics, "Next frame size = %xh", dataSize);
+ if (dataSize == 0)
+ return;
+
+ dataSize -= 96;
+ assert(dataSize >= 0);
+ _sliceCurrent->_slices.load(_resourceFile);
+ _sliceCurrent->_animSlicesSize = _sliceCurrent->_slices.loadPixels(_resourceFile, dataSize);
+ } else {
+ SWAP(_sliceCurrent, _sliceNext);
+ getSlices();
+ }
+}
+
+bool AnimationPlayer::isCompleted() {
+ return (_position >= _subData._duration);
+}
+
+void AnimationPlayer::close() {
+ if (_field38) {
+ switch (_paletteMode) {
+ case 0:
+ R2_GLOBALS._scenePalette.replace(&_palette);
+ changePane();
+ R2_GLOBALS._sceneManager._hasPalette = true;
+ break;
+ case 2:
+ closing();
+ break;
+ default:
+ changePane();
+ break;
+ }
+ }
+
+ // Close the resource file
+ _resourceFile.close();
+
+ if (_objectMode != 42) {
+ // flip screen in original
+ }
+
+ // Free animation objects
+ delete _animData1;
+ delete _animData2;
+ _animData1 = NULL;
+ _animData2 = NULL;
+
+ _field38 = 0;
+ if (g_globals != NULL)
+ R2_GLOBALS._animationCtr = MAX(R2_GLOBALS._animationCtr, 0);
}
-void SceneActor::setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum) {
- _resNum = resNum;
- _lookLineNum = lookLineNum;
- _talkLineNum = talkLineNum;
- _useLineNum = useLineNum;
+void AnimationPlayer::rleDecode(const byte *pSrc, byte *pDest, int size) {
+ while (size > 0) {
+ byte v = *pSrc++;
+ if (!(v & 0x80)) {
+ // Following uncompressed set of bytes
+ Common::copy(pSrc, pSrc + v, pDest);
+ pSrc += v;
+ pDest += v;
+ size -= v;
+ } else {
+ int count = v & 0x3F;
+ size -= count;
+
+ if (!(v & 0x40)) {
+ // Skip over a number of bytes
+ pDest += count;
+ } else {
+ // Replicate a number of bytes
+ Common::fill(pDest, pDest + count, *pSrc++);
+ pDest += count;
+ }
+ }
+ }
}
+void AnimationPlayer::getSlices() {
+ assert((_sliceNext == _animData1) || (_sliceNext == _animData2));
+ assert((_sliceCurrent == _animData1) || (_sliceCurrent == _animData2));
+
+ _sliceNext->_dataSize = _sliceCurrent->_slices._dataSize2;
+ if (_sliceNext->_dataSize) {
+ if (_sliceNext->_dataSize >= _dataNeeded)
+ error("Bogus dataNeeded == %d / %d", _sliceNext->_dataSize, _dataNeeded);
+ }
+
+ int dataSize = _sliceNext->_dataSize - 96;
+ _sliceNext->_slices.load(_resourceFile);
+ _sliceNext->_animSlicesSize = _sliceNext->_slices.loadPixels(_resourceFile, dataSize);
+}
+
+/*--------------------------------------------------------------------------*/
+
+AnimationPlayerExt::AnimationPlayerExt(): AnimationPlayer() {
+ _v = 0;
+ _field3A = 0;
+}
+
+void AnimationPlayerExt::synchronize(Serializer &s) {
+ AnimationPlayer::synchronize(s);
+ s.syncAsSint16LE(_v);
+}
} // End of namespace Ringworld2
diff --git a/engines/tsage/ringworld2/ringworld2_logic.h b/engines/tsage/ringworld2/ringworld2_logic.h
index bfb3281d5d..0b573bf7f0 100644
--- a/engines/tsage/ringworld2/ringworld2_logic.h
+++ b/engines/tsage/ringworld2/ringworld2_logic.h
@@ -42,11 +42,44 @@ public:
static Scene *createScene(int sceneNumber);
};
+class SceneArea: public EventHandler {
+public:
+ Rect _bounds;
+ bool _enabled;
+ bool _insideArea;
+ CursorType _cursorNum;
+ CursorType _savedCursorNum;
+ int _cursorState;
+public:
+ SceneArea();
+ void setDetails(const Rect &bounds, CursorType cursor);
+
+ virtual void synchronize(Serializer &s);
+ virtual void remove();
+ virtual void process(Event &event);
+};
+
+class SceneExit: public SceneArea {
+public:
+ bool _moving;
+ int _sceneNumber;
+ Common::Point _destPos;
+public:
+ SceneExit();
+ virtual void setDetails(const Rect &bounds, CursorType cursor, int sceneNumber);
+ virtual void setDest(const Common::Point &p) { _destPos = p; }
+ virtual void changeScene();
+
+ virtual void synchronize(Serializer &s);
+ virtual void process(Event &event);
+};
+
class SceneExt: public Scene {
private:
static void startStrip();
static void endStrip();
public:
+ byte _field312[256];
int _field372;
bool _savedPlayerEnabled;
bool _savedUiEnabled;
@@ -55,6 +88,7 @@ public:
SceneObject *_focusObject;
Visage _cursorVisage;
+ SynchronizedList<SceneArea *> _sceneAreas;
Rect _v51C34;
public:
@@ -67,12 +101,24 @@ public:
virtual void dispatch();
virtual void loadScene(int sceneNum);
virtual void refreshBackground(int xAmount, int yAmount);
+ virtual void saveCharacter(int characterIndex);
+ virtual void restore() {}
- bool display(CursorType action);
+ bool display(CursorType action, Event &event);
void fadeOut();
void clearScreen();
+ void scalePalette(int RFactor, int GFactor, int BFactor);
};
+class SceneHandlerExt: public SceneHandler {
+public:
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void process(Event &event);
+
+ void setupPaletteMaps();
+};
+
+
class DisplayHotspot : public SceneObject {
private:
Common::Array<int> _actions;
@@ -117,7 +163,7 @@ public:
InvObject _none;
InvObject _inv1;
InvObject _inv2;
- InvObject _inv3;
+ InvObject _negatorGun;
InvObject _steppingDisks;
InvObject _inv5;
InvObject _inv6;
@@ -192,15 +238,10 @@ public:
class NamedHotspot : public SceneHotspot {
public:
- int _resNum, _lookLineNum, _useLineNum, _talkLineNum;
NamedHotspot();
virtual bool startAction(CursorType action, Event &event);
virtual Common::String getClassName() { return "NamedHotspot"; }
- virtual void synchronize(Serializer &s);
- virtual void setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum);
- virtual void setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item);
- virtual void setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode = 0);
};
class NamedHotspotExt : public NamedHotspot {
@@ -217,17 +258,9 @@ public:
class SceneActor: public SceneObject {
public:
- int _resNum;
- int _lookLineNum, _talkLineNum, _useLineNum;
- int _effect, _shade;
-
virtual Common::String getClassName() { return "SceneActor"; }
- virtual void synchronize(Serializer &s);
virtual void postInit(SceneObjectList *OwnerList = NULL);
virtual bool startAction(CursorType action, Event &event);
-
- void setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item);
- void setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum);
};
class SceneActorExt: public SceneActor {
@@ -235,6 +268,7 @@ public:
int _state;
SceneActorExt() { _state = 0; }
+
virtual Common::String getClassName() { return "SceneActorExt"; }
virtual void synchronize(Serializer &s) {
SceneActor::synchronize(s);
@@ -242,6 +276,161 @@ public:
}
};
+class SceneAreaObject: public SceneArea {
+ class Object1: public SceneActor {
+ public:
+ };
+public:
+ Object1 _object1;
+ int _insetCount;
+
+ virtual void remove();
+ virtual void process(Event &event);
+ void setDetails(int visage, int strip, int frameNumber, const Common::Point &pt);
+ void setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum);
+};
+
+class UnkObject1200 : public SavedObject {
+public:
+ Rect _rect1;
+ Rect _rect2;
+
+ int *_field16;
+ int *_field3A;
+
+ int _field12;
+ int _field14;
+ int _field26;
+ int _field28;
+ int _field2A;
+ int _field2C;
+ int _field2E;
+ int _field30;
+ int _field32;
+ int _field34;
+ int _field36;
+ int _field38;
+ int _field3E;
+ int _field40;
+
+ UnkObject1200();
+ void synchronize(Serializer &s);
+
+ void sub51AE9(int arg1);
+ int sub51AF8(Common::Point pt);
+ bool sub51AFD(Common::Point pt);
+ void sub51B02();
+ void sub9EDE8(Rect rect);
+ int sub9EE22(int &arg1, int &arg2);
+ virtual Common::String getClassName() { return "UnkObject1200"; }
+};
+
+/*--------------------------------------------------------------------------*/
+
+class AnimationSlice {
+public:
+ int _sliceOffset;
+ int _drawMode;
+ int _secondaryIndex;
+public:
+ void load(Common::File &f);
+};
+
+class AnimationSlices {
+public:
+ int _dataSize;
+ int _dataSize2;
+ AnimationSlice _slices[4];
+ byte *_pixelData;
+public:
+ AnimationSlices();
+ ~AnimationSlices();
+
+ void load(Common::File &f);
+ int loadPixels(Common::File &f, int slicesSize);
+};
+
+class AnimationPlayerSubData {
+public:
+ int _duration;
+ int _frameRate;
+ int _framesPerSlices;
+ int _drawType;
+ int _sliceSize;
+ int _ySlices;
+ int _field16;
+ int _palStart;
+ int _palSize;
+ byte _palData[256 * 3];
+ int32 _totalSize;
+ AnimationSlices _slices;
+public:
+ void load(Common::File &f);
+};
+
+class AnimationData {
+public:
+ AnimationSlices _slices;
+ int _dataSize;
+ int _animSlicesSize;
+};
+
+enum AnimationPaletteMode { ANIMPALMODE_REPLACE_PALETTE = 0, ANIMPALMODE_CURR_PALETTE = 1,
+ ANIMPALMODE_NONE = 2 };
+
+class AnimationPlayer: public EventHandler {
+private:
+ void rleDecode(const byte *pSrc, byte *pDest, int size);
+
+ void drawFrame(int sliceIndex);
+ void nextSlices();
+ void getSlices();
+public:
+ AnimationData *_animData1, *_animData2;
+ AnimationData *_sliceCurrent;
+ AnimationData *_sliceNext;
+ Common::File _resourceFile;
+ Rect _rect1, _screenBounds;
+ int _field38;
+ int _field3A, _paletteMode;
+ int _objectMode;
+ int _field58, _sliceHeight;
+ byte _palIndexes[256];
+ ScenePalette _palette;
+ AnimationPlayerSubData _subData;
+ Action *_endAction;
+ int _dataNeeded;
+ int _playbackTick;
+ int _playbackTickPrior;
+ int _position;
+ int _nextSlicesPosition;
+ uint _frameDelay;
+ uint32 _gameFrame;
+public:
+ AnimationPlayer();
+ ~AnimationPlayer();
+
+ virtual void synchronize(Serializer &s);
+ virtual void remove();
+ virtual void process(Event &event);
+ virtual void dispatch();
+ virtual void flipPane() {}
+ virtual void changePane() {}
+ virtual void closing() {}
+
+ bool load(int animId, Action *endAction = NULL);
+ bool isCompleted();
+ void close();
+};
+
+class AnimationPlayerExt: public AnimationPlayer {
+public:
+ int _v;
+public:
+ AnimationPlayerExt();
+
+ virtual void synchronize(Serializer &s);
+};
} // End of namespace Ringworld2
diff --git a/engines/tsage/ringworld2/ringworld2_scenes0.cpp b/engines/tsage/ringworld2/ringworld2_scenes0.cpp
index 526bf6e3c9..4c98fcf00a 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes0.cpp
+++ b/engines/tsage/ringworld2/ringworld2_scenes0.cpp
@@ -23,18 +23,62 @@
#include "tsage/scenes.h"
#include "tsage/tsage.h"
#include "tsage/staticres.h"
+#include "tsage/ringworld2/ringworld2_dialogs.h"
#include "tsage/ringworld2/ringworld2_scenes0.h"
+#include "tsage/ringworld2/ringworld2_speakers.h"
namespace TsAGE {
namespace Ringworld2 {
+void Scene50::Action1::signal() {
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(2);
+ break;
+ case 1:
+ setDelay(180);
+ break;
+ case 2:
+ R2_GLOBALS._sceneManager.changeScene(100);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene50::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit(OwnerList);
+ loadScene(110);
+
+ R2_GLOBALS._uiElements._active = false;
+ R2_GLOBALS._scenePalette.loadPalette(0);
+
+ R2_GLOBALS._sound2.play(10);
+ R2_GLOBALS._player.disableControl();
+
+ setAction(&_action1);
+}
+
+void Scene50::process(Event &event) {
+ if ((event.eventType != EVENT_BUTTON_DOWN) && (event.eventType != EVENT_KEYPRESS) && (event.eventType == 27)) {
+ event.handled = true;
+ warning("TODO: incomplete Scene50::process()");
+ // CursorType _oldCursorId = _cursorId;
+ g_globals->_events.setCursor(CURSOR_ARROW);
+ // _cursorManager.sub_1D474(2, 0);
+ // sub_5566A(1);
+ // _cursorManager._fieldE = _oldCursorId;
+ R2_GLOBALS._sceneManager.changeScene(100);
+ }
+}
+
/*--------------------------------------------------------------------------
* Scene 100 - Quinn's Room
*
*--------------------------------------------------------------------------*/
-bool Scene100::Object7::startAction(CursorType action, Event &event) {
+bool Scene100::Door::startAction(CursorType action, Event &event) {
Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
switch (action) {
@@ -51,11 +95,11 @@ bool Scene100::Object7::startAction(CursorType action, Event &event) {
if (_state) {
SceneItem::display2(100, 26);
_state = 0;
- scene->_object10.setFrame(1);
+ scene->_doorDisplay.setFrame(1);
} else {
SceneItem::display2(100, 27);
_state = 1;
- scene->_object10.setFrame(2);
+ scene->_doorDisplay.setFrame(2);
}
return true;
default:
@@ -63,7 +107,7 @@ bool Scene100::Object7::startAction(CursorType action, Event &event) {
}
}
-bool Scene100::Object8::startAction(CursorType action, Event &event) {
+bool Scene100::Table::startAction(CursorType action, Event &event) {
Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
switch (action) {
@@ -72,46 +116,46 @@ bool Scene100::Object8::startAction(CursorType action, Event &event) {
if (_strip == 2) {
scene->_sceneMode = 108;
scene->_object3.postInit();
- scene->_object9.postInit();
+ scene->_stasisNegator.postInit();
- if (R2_INVENTORY.getObjectScene(R2_3) == 1) {
- scene->_object9.setup(100, 7, 2);
+ if (R2_INVENTORY.getObjectScene(R2_NEGATOR_GUN) == 1) {
+ scene->_stasisNegator.setup(100, 7, 2);
} else {
- scene->_object9.setup(100, 7, 1);
- scene->_object9.setDetails(100, 21, 22, 23, 2, NULL);
+ scene->_stasisNegator.setup(100, 7, 1);
+ scene->_stasisNegator.setDetails(100, 21, 22, 23, 2, (SceneItem *)NULL);
}
- scene->setAction(&scene->_sequenceManager2, scene, 108, this, &scene->_object3,
- &scene->_object9, &R2_GLOBALS._player, NULL);
+ scene->setAction(&scene->_sequenceManager2, scene, 108, this, &scene->_object3,
+ &scene->_stasisNegator, &R2_GLOBALS._player, NULL);
} else {
scene->_sceneMode = 109;
- scene->setAction(&scene->_sequenceManager2, scene, 109, this, &scene->_object3,
- &scene->_object9, &R2_GLOBALS._player, NULL);
+ scene->setAction(&scene->_sequenceManager2, scene, 109, this, &scene->_object3,
+ &scene->_stasisNegator, &R2_GLOBALS._player, NULL);
}
return true;
case CURSOR_TALK:
R2_GLOBALS._player.disableControl();
-
+
if (_strip == 2) {
SceneItem::display2(100, 18);
scene->_sceneMode = 102;
scene->_object3.postInit();
- scene->_object9.postInit();
+ scene->_stasisNegator.postInit();
- if (R2_INVENTORY.getObjectScene(R2_3) == 1) {
- scene->_object9.setup(100, 7, 2);
+ if (R2_INVENTORY.getObjectScene(R2_NEGATOR_GUN) == 1) {
+ scene->_stasisNegator.setup(100, 7, 2);
} else {
- scene->_object9.setup(100, 7, 1);
- scene->_object9.setDetails(100, 21, 22, 23, 2, NULL);
+ scene->_stasisNegator.setup(100, 7, 1);
+ scene->_stasisNegator.setDetails(100, 21, 22, 23, 2, (SceneItem *)NULL);
}
- scene->setAction(&scene->_sequenceManager2, scene, 102, this, &scene->_object3,
- &scene->_object9, NULL);
+ scene->setAction(&scene->_sequenceManager2, scene, 102, this, &scene->_object3,
+ &scene->_stasisNegator, NULL);
} else {
SceneItem::display2(100, 19);
scene->_sceneMode = 103;
- scene->setAction(&scene->_sequenceManager2, scene, 103, this, &scene->_object3,
- &scene->_object9, NULL);
+ scene->setAction(&scene->_sequenceManager2, scene, 103, this, &scene->_object3,
+ &scene->_stasisNegator, NULL);
}
return true;
default:
@@ -119,21 +163,21 @@ bool Scene100::Object8::startAction(CursorType action, Event &event) {
}
}
-bool Scene100::Object9::startAction(CursorType action, Event &event) {
+bool Scene100::StasisNegator::startAction(CursorType action, Event &event) {
Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_USE:
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 107;
- scene->setAction(&scene->_sequenceManager1, scene, 107, &R2_GLOBALS._player, &scene->_object9, NULL);
+ scene->setAction(&scene->_sequenceManager1, scene, 107, &R2_GLOBALS._player, &scene->_stasisNegator, NULL);
return true;
default:
return SceneActor::startAction(action, event);
}
}
-bool Scene100::Object10::startAction(CursorType action, Event &event) {
+bool Scene100::DoorDisplay::startAction(CursorType action, Event &event) {
Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
switch (action) {
@@ -169,6 +213,22 @@ bool Scene100::SteppingDisks::startAction(CursorType action, Event &event) {
/*--------------------------------------------------------------------------*/
+bool Scene100::Terminal::startAction(CursorType action, Event &event) {
+ Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 105;
+ scene->setAction(&scene->_sequenceManager1, scene, 105, &R2_GLOBALS._player, this, NULL);
+ return true;
+ default:
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
void Scene100::postInit(SceneObjectList *OwnerList) {
SceneExt::postInit();
loadScene(100);
@@ -177,59 +237,60 @@ void Scene100::postInit(SceneObjectList *OwnerList) {
if (R2_GLOBALS._sceneManager._previousScene != 125)
R2_GLOBALS._sound1.play(10);
- _object7.postInit();
- _object7._state = 0;
- _object7.setVisage(100);
- _object7.setPosition(Common::Point(160, 84));
- _object7.setDetails(100, 3, 4, 5, 1, NULL);
+ _door.postInit();
+ _door._state = 0;
+ _door.setVisage(100);
+ _door.setPosition(Common::Point(160, 84));
+ _door.setDetails(100, 3, 4, 5, 1, (SceneItem *)NULL);
- _object10.postInit();
- _object10.setup(100, 2, 1);
- _object10.setDetails(100, -1, -1, -1, 1, NULL);
+ _doorDisplay.postInit();
+ _doorDisplay.setup(100, 2, 1);
+ _doorDisplay.setPosition(Common::Point(202, 53));
+ _doorDisplay.setDetails(100, -1, -1, -1, 1, (SceneItem *)NULL);
- _object8.postInit();
- _object8.setup(100, 2, 3);
- _object8.setPosition(Common::Point(175, 157));
- _object8.setDetails(100, 17, 18, 20, 1, NULL);
+ _table.postInit();
+ _table.setup(100, 2, 3);
+ _table.setPosition(Common::Point(175, 157));
+ _table.setDetails(100, 17, 18, 20, 1, (SceneItem *)NULL);
- _object1.postInit();
- _object1.setup(100, 3, 1);
- _object1.setPosition(Common::Point(89, 79));
- _object1.fixPriority(250);
- _object1.animate(ANIM_MODE_2, NULL);
- _object1._numFrames = 3;
-
- _object2.postInit();
- _object2.setup(100, 3, 1);
- _object2.setPosition(Common::Point(89, 147));
- _object2.fixPriority(250);
- _object2.animate(ANIM_MODE_7, 0, NULL);
- _object2._numFrames = 3;
+ _bedLights1.postInit();
+ _bedLights1.setup(100, 3, 1);
+ _bedLights1.setPosition(Common::Point(89, 79));
+ _bedLights1.fixPriority(250);
+ _bedLights1.animate(ANIM_MODE_2, NULL);
+ _bedLights1._numFrames = 3;
- _object6.postInit();
- _object6.setVisage(101);
- _object6.setPosition(Common::Point(231, 126));
- _object6.fixPriority(10);
- _object6.setDetails(100, 37, -1, 39, 1, NULL);
+ _bedLights2.postInit();
+ _bedLights2.setup(100, 3, 1);
+ _bedLights2.setPosition(Common::Point(89, 147));
+ _bedLights2.fixPriority(250);
+ _bedLights2.animate(ANIM_MODE_7, 0, NULL);
+ _bedLights2._numFrames = 3;
+
+ _wardrobe.postInit();
+ _wardrobe.setVisage(101);
+ _wardrobe.setPosition(Common::Point(231, 126));
+ _wardrobe.fixPriority(10);
+ _wardrobe.setDetails(100, 37, -1, 39, 1, (SceneItem *)NULL);
if (R2_INVENTORY.getObjectScene(R2_STEPPING_DISKS) == 100) {
_steppingDisks.postInit();
_steppingDisks.setup(100, 8, 1);
_steppingDisks.setPosition(Common::Point(274, 130));
- _steppingDisks.setDetails(100, 40, -1, 42, 1, NULL);
+ _steppingDisks.setDetails(100, 40, -1, 42, 1, (SceneItem *)NULL);
}
- _item5.setDetails(11, 100, 14, 15, 16);
- _item4.setDetails(12, 100, 11, -1, 13);
- _item3.setDetails(13, 100, 8, 9, 10);
- _item2.setDetails(14, 100, 34, -1, 36);
+ _terminal.setDetails(11, 100, 14, 15, 16);
+ _desk.setDetails(12, 100, 11, -1, 13);
+ _bed.setDetails(13, 100, 8, 9, 10);
+ _duct.setDetails(14, 100, 34, -1, 36);
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.setVisage(10);
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player.disableControl();
-
- _item1.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 100, 0, 1, -1, 1, NULL);
+
+ _background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 100, 0, 1, -1, 1, NULL);
switch (R2_GLOBALS._sceneManager._previousScene) {
case 50:
@@ -237,7 +298,7 @@ void Scene100::postInit(SceneObjectList *OwnerList) {
_object5.postInit();
_object4.postInit();
_sceneMode = 104;
- setAction(&_sequenceManager1, this, 104, &R2_GLOBALS._player, &_object6, &_object4, &_object5, NULL);
+ setAction(&_sequenceManager1, this, 104, &R2_GLOBALS._player, &_wardrobe, &_object4, &_object5, NULL);
break;
case 125:
_sceneMode = 100;
@@ -245,7 +306,7 @@ void Scene100::postInit(SceneObjectList *OwnerList) {
break;
case 200:
_sceneMode = 100;
- setAction(&_sequenceManager1, this, 100, &R2_GLOBALS._player, &_object7, NULL);
+ setAction(&_sequenceManager1, this, 100, &R2_GLOBALS._player, &_door, NULL);
break;
default:
R2_GLOBALS._player.setStrip(3);
@@ -267,11 +328,11 @@ void Scene100::signal() {
break;
case 103:
case 109:
- _object8.setStrip(2);
- _object8.setFrame(3);
-
+ _table.setStrip(2);
+ _table.setFrame(3);
+
_object3.remove();
- _object9.remove();
+ _stasisNegator.remove();
R2_GLOBALS._player.enableControl();
break;
case 104:
@@ -288,22 +349,27 @@ void Scene100::signal() {
R2_GLOBALS._sceneManager.changeScene(125);
break;
case 107:
- R2_GLOBALS._sceneItems.remove(&_object9);
+ R2_GLOBALS._sceneItems.remove(&_stasisNegator);
- _object9.setFrame(2);
- R2_INVENTORY.setObjectScene(3, 1);
+ _stasisNegator.setFrame(2);
+ R2_INVENTORY.setObjectScene(R2_NEGATOR_GUN, 1);
R2_GLOBALS._player.enableControl();
break;
case 110:
- if (_object7._state) {
- _object7._state = 0;
- _object10.setFrame(1);
+ if (_door._state) {
+ _door._state = 0;
+ _doorDisplay.setFrame(1);
} else {
- _object7._state = 1;
- _object10.setFrame(2);
+ _door._state = 1;
+ _doorDisplay.setFrame(2);
}
R2_GLOBALS._player.enableControl();
break;
+ case 111:
+ R2_INVENTORY.setObjectScene(R2_STEPPING_DISKS, 1);
+ _steppingDisks.remove();
+ R2_GLOBALS._player.enableControl();
+ break;
default:
R2_GLOBALS._player.enableControl();
break;
@@ -311,19 +377,7100 @@ void Scene100::signal() {
}
void Scene100::dispatch() {
-/*
int regionIndex = R2_GLOBALS._player.getRegionIndex();
if (regionIndex == 13)
R2_GLOBALS._player._shade = 4;
if ((R2_GLOBALS._player._visage == 13) || (R2_GLOBALS._player._visage == 101))
- (R2_GLOBALS._player._shade = 0;
-*/
+ R2_GLOBALS._player._shade = 0;
+
SceneExt::dispatch();
- if ((_sceneMode == 101) && (_object7._frame == 2) && (_object8._strip == 5)) {
- _object8.setAction(&_sequenceManager2, NULL, 103, &_object8, &_object3, &_object9, NULL);
+ if ((_sceneMode == 101) && (_door._frame == 2) && (_table._strip == 5)) {
+ _table.setAction(&_sequenceManager2, NULL, 103, &_table, &_object3, &_stasisNegator, NULL);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 125 - Computer Terminal
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene125::Object5::startAction(CursorType action, Event &event) {
+ if (action == CURSOR_USE)
+ return true;
+ else
+ return SceneActor::startAction(action, event);
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene125::Icon::Icon(): SceneActor() {
+ _lookLineNum = 0;
+ _field98 = 0;
+ _pressed = false;
+}
+
+void Scene125::Icon::postInit(SceneObjectList *OwnerList) {
+ SceneObject::postInit();
+
+ _object1.postInit();
+ _object1.fixPriority(255);
+ _object1.hide();
+
+ _sceneText1._color1 = 92;
+ _sceneText1._color2 = 0;
+ _sceneText1._width = 200;
+ _sceneText2._color1 = 0;
+ _sceneText2._color2 = 0;
+ _sceneText2._width = 200;
+ setDetails(125, -1, -1, -1, 2, (SceneItem *)NULL);
+}
+
+void Scene125::Icon::synchronize(Serializer &s) {
+ SceneActor::synchronize(s);
+ s.syncAsSint16LE(_lookLineNum);
+ s.syncAsSint16LE(_field98);
+ s.syncAsSint16LE(_pressed);
+}
+
+void Scene125::Icon::process(Event &event) {
+ Scene125 *scene = (Scene125 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!event.handled && !(_flags & OBJFLAG_HIDING) && R2_GLOBALS._player._uiEnabled) {
+
+ if (event.eventType == EVENT_BUTTON_DOWN) {
+ int regionIndex = R2_GLOBALS._sceneRegions.indexOf(event.mousePos);
+
+ switch (R2_GLOBALS._events.getCursor()) {
+ case CURSOR_LOOK:
+ if (regionIndex == _sceneRegionId) {
+ event.handled = true;
+ if (_lookLineNum == 26) {
+ SceneItem::display2(130, 7);
+ } else {
+ SceneItem::display2(130, _lookLineNum);
+ }
+ }
+ break;
+
+ case CURSOR_USE:
+ if ((regionIndex == _sceneRegionId) && !_pressed) {
+ scene->_sound1.play(14);
+ setFrame(2);
+
+ switch (_object1._strip) {
+ case 1:
+ _object1.setStrip(2);
+ break;
+ case 3:
+ _object1.setStrip(4);
+ break;
+ case 5:
+ _object1.setStrip(6);
+ break;
+ default:
+ break;
+ }
+
+ _pressed = true;
+ event.handled = true;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if ((event.eventType == EVENT_BUTTON_UP) && _pressed) {
+ setFrame(1);
+
+ switch (_object1._strip) {
+ case 2:
+ _object1.setStrip(1);
+ break;
+ case 4:
+ _object1.setStrip(3);
+ break;
+ case 6:
+ _object1.setStrip(5);
+ break;
+ default:
+ break;
+ }
+
+ _pressed = false;
+ event.handled = true;
+ scene->consoleAction(_lookLineNum);
+ }
+ }
+}
+
+void Scene125::Icon::setIcon(int id) {
+ Scene125 *scene = (Scene125 *)R2_GLOBALS._sceneManager._scene;
+
+ _lookLineNum = _field98 = id;
+ SceneActor::_lookLineNum = id;
+
+ _sceneText1.remove();
+ _sceneText2.remove();
+
+ if (_lookLineNum) {
+ showIcon();
+ _object1.setup(161, ((id - 1) / 10) * 2 + 1, ((id - 1) % 10) + 1);
+ _object1.setPosition(_position);
+
+ _sceneText1._fontNumber = scene->_iconFontNumber;
+ _sceneText1.setup(CONSOLE125_MESSAGES[id]);
+ _sceneText1.fixPriority(20);
+
+ _sceneText2._fontNumber = scene->_iconFontNumber;
+ _sceneText2.setup(CONSOLE125_MESSAGES[id]);
+ _sceneText2.fixPriority(20);
+
+ _sceneText2._fontNumber = scene->_iconFontNumber;
+ _sceneText2.setup(CONSOLE125_MESSAGES[id]);
+ _sceneText2.fixPriority(10);
+
+ switch (_lookLineNum) {
+ case 5:
+ _sceneText1.setPosition(Common::Point(62, _position.y + 8));
+ _sceneText2.setPosition(Common::Point(64, _position.y + 10));
+ break;
+ case 6:
+ case 7:
+ case 24:
+ case 25:
+ _sceneText1.setPosition(Common::Point(65, _position.y + 8));
+ _sceneText2.setPosition(Common::Point(67, _position.y + 10));
+ break;
+ case 26:
+ _sceneText1.setPosition(Common::Point(83, _position.y + 8));
+ _sceneText2.setPosition(Common::Point(85, _position.y + 10));
+ break;
+ default:
+ _sceneText1.setPosition(Common::Point(121, _position.y + 8));
+ _sceneText2.setPosition(Common::Point(123, _position.y + 10));
+ break;
+ }
+ } else {
+ hideIcon();
+ }
+}
+
+void Scene125::Icon::showIcon() {
+ _sceneText1.show();
+ _sceneText2.show();
+ _object1.show();
+ _object2.show();
+ show();
+}
+
+void Scene125::Icon::hideIcon() {
+ _sceneText1.hide();
+ _sceneText2.hide();
+ _object1.hide();
+ _object2.hide();
+ hide();
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene125::Item4::startAction(CursorType action, Event &event) {
+ Scene125 *scene = (Scene125 *)R2_GLOBALS._sceneManager._scene;
+ switch (action) {
+ case CURSOR_USE:
+ if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == R2_GLOBALS._player._oldCharacterScene[1]) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 126;
+ scene->setAction(&scene->_sequenceManager, scene, 126, &scene->_object7, NULL);
+ return true;
+ }
+ break;
+ case R2_OPTO_DISK:
+ if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 1) {
+ R2_GLOBALS._player.disableControl();
+ scene->_object7.postInit();
+ scene->_sceneMode = 125;
+ scene->setAction(&scene->_sequenceManager, scene, 125, &scene->_object7, NULL);
+ return true;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return SceneHotspot::startAction(action, event);
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene125::Scene125(): SceneExt() {
+ _iconFontNumber = 50;
+ _consoleMode = 5;
+ _logIndex = _databaseIndex = _infodiskIndex = 0;
+
+ _soundCount = _soundIndex = 0;
+ for (int i = 0; i < 10; ++i)
+ _soundIndexes[i] = 0;
+}
+
+void Scene125::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(160);
+ _palette.loadPalette(0);
+
+ if (R2_GLOBALS._sceneManager._previousScene != 125)
+ // Save the prior scene to return to when the console is turned off
+ R2_GLOBALS._player._oldCharacterScene[1] = R2_GLOBALS._sceneManager._previousScene;
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.hide();
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == R2_GLOBALS._player._oldCharacterScene[1]) {
+ _object7.postInit();
+ _object7.setup(160, 3, 5);
+ _object7.setPosition(Common::Point(47, 167));
+ }
+
+ _object6.postInit();
+ _object6.setup(162, 1, 1);
+ _object6.setPosition(Common::Point(214, 168));
+
+ _item4.setDetails(Rect(27, 145, 81, 159), 126, 9, -1, -1, 1, NULL);
+ _item3.setDetails(Rect(144, 119, 286, 167), 126, 6, 7, 8, 1, NULL);
+ _item2.setDetails(1, 126, 3, 4, 5);
+ _background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 126, 0, 1, -1, 1, NULL);
+
+ _sceneMode = 1;
+ signal();
+}
+
+void Scene125::signal() {
+ switch (_sceneMode) {
+ case 1:
+ _icon1.postInit();
+ _icon1._sceneRegionId = 2;
+ _icon2.postInit();
+ _icon2._sceneRegionId = 3;
+ _icon3.postInit();
+ _icon3._sceneRegionId = 4;
+ _icon4.postInit();
+ _icon4._sceneRegionId = 5;
+
+ _sceneMode = 2;
+ setAction(&_sequenceManager, this, 127, &_icon1, &_icon2, &_icon3, &_icon4, &R2_GLOBALS._player, NULL);
+ break;
+ case 2:
+ _icon1.setup(160, 1, 1);
+ _icon1.setPosition(Common::Point(65, 17));
+ _icon1._object2.postInit();
+ _icon1._object2.setup(160, 7, 1);
+ _icon1._object2.setPosition(Common::Point(106, 41));
+
+ _icon2.setup(160, 1, 1);
+ _icon2.setPosition(Common::Point(80, 32));
+ _icon2._object2.postInit();
+ _icon2._object2.setup(160, 7, 2);
+ _icon2._object2.setPosition(Common::Point(106, 56));
+
+ _icon3.setup(160, 1, 1);
+ _icon3.setPosition(Common::Point(65, 47));
+ _icon3._object2.postInit();
+ _icon3._object2.setup(160, 7, 1);
+ _icon3._object2.setPosition(Common::Point(106, 71));
+
+ _icon4.setup(160, 1, 1);
+ _icon4.setPosition(Common::Point(80, 62));
+ _icon4._sceneRegionId = 5;
+ _icon4._object2.postInit();
+ _icon4._object2.setup(160, 7, 2);
+ _icon4._object2.setPosition(Common::Point(106, 86));
+
+ _icon5.postInit();
+ _icon5.setup(160, 1, 1);
+ _icon5.setPosition(Common::Point(37, 92));
+ _icon5.setIcon(6);
+ _icon5._sceneRegionId = 7;
+
+ _icon6.postInit();
+ _icon6.setup(160, 1, 1);
+ _icon6.setPosition(Common::Point(106, 110));
+ _icon6.setIcon(5);
+ _icon6._sceneRegionId = 8;
+
+ consoleAction(5);
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ case 10:
+ switch (_consoleMode) {
+ case 12:
+ _sceneMode = 129;
+
+ _object1.postInit();
+ _object2.postInit();
+ _object3.postInit();
+
+ if (R2_GLOBALS.getFlag(13)) {
+ _object4.postInit();
+ setAction(&_sequenceManager, this, 130, &R2_GLOBALS._player, &_object1, &_object2,
+ &_object3, &_object4, NULL);
+ } else {
+ setAction(&_sequenceManager, this, 129, &R2_GLOBALS._player, &_object1, &_object2, &_object3, NULL);
+ }
+ break;
+ case 13:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ _infodiskIndex = 0;
+ setDetails(129, 0);
+ break;
+ case 23:
+ R2_GLOBALS._sceneManager.changeScene(1330);
+ break;
+ case 27:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ _databaseIndex = 0;
+ setDetails(128, 0);
+ break;
+ case 28:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ _databaseIndex = 37;
+ setDetails(128, 37);
+ break;
+ case 29:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ _databaseIndex = 68;
+ setDetails(128, 68);
+ break;
+ case 30:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ _databaseIndex = 105;
+ setDetails(128, 105);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ _logIndex = 0;
+ setDetails(127, 0);
+ break;
+ }
+ break;
+ case 11:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+
+ if ((_consoleMode >= 27) && (_consoleMode <= 30)) {
+ consoleAction(11);
+ }
+ consoleAction(2);
+ _icon6.setIcon(5);
+ break;
+ case 12:
+ if (_soundCount > 0)
+ --_soundCount;
+ if (!_soundCount || (R2_GLOBALS._speechSubtitles & SPEECH_VOICE)) {
+ _soundIndex = 0;
+ R2_GLOBALS._playStream.stop();
+ } else {
+ _sceneMode = 12;
+ R2_GLOBALS._playStream.play(_soundIndexes[_soundIndex++], this);
+ }
+ break;
+ case 125:
+ R2_INVENTORY.setObjectScene(R2_OPTO_DISK, R2_GLOBALS._player._oldCharacterScene[1]);
+ break;
+ case 126:
+ R2_INVENTORY.setObjectScene(R2_OPTO_DISK, 1);
+ _object7.remove();
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ case 128:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ SceneItem::display2(126, 12);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ }
+}
+
+void Scene125::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_consoleMode);
+ s.syncAsSint16LE(_iconFontNumber);
+ s.syncAsSint16LE(_logIndex);
+ s.syncAsSint16LE(_databaseIndex);
+ s.syncAsSint16LE(_infodiskIndex);
+ s.syncAsSint16LE(_soundCount);
+ s.syncAsSint16LE(_soundIndex);
+
+ for (int i = 0; i < 10; ++i)
+ s.syncAsSint16LE(_soundIndexes[i]);
+}
+
+void Scene125::process(Event &event) {
+ SceneExt::process(event);
+
+ if (R2_GLOBALS._player._uiEnabled) {
+ _icon1.process(event);
+ _icon2.process(event);
+ _icon3.process(event);
+ _icon4.process(event);
+ _icon5.process(event);
+ _icon6.process(event);
+ }
+}
+
+void Scene125::dispatch() {
+ if (_soundCount)
+ R2_GLOBALS._playStream.proc1();
+
+ Scene::dispatch();
+}
+
+/**
+ * Handles actions on the console screen.
+ */
+void Scene125::consoleAction(int id) {
+ _icon3.setIcon(0);
+ _icon4.setIcon(0);
+
+ if (id == 5)
+ _icon5.setIcon(6);
+ else {
+ switch (_consoleMode) {
+ case 10:
+ case 12:
+ case 13:
+ case 27:
+ case 28:
+ case 29:
+ case 30:
+ break;
+ default:
+ _icon5.setIcon(7);
+ break;
+ }
+ }
+
+ switch (id) {
+ case 1:
+ _icon1.setIcon(8);
+ _icon2.setIcon(9);
+ break;
+ case 2:
+ _icon1.setIcon(10);
+ _icon2.setIcon(11);
+ _icon3.setIcon(12);
+ _icon4.setIcon(13);
+ break;
+ case 3:
+ _icon1.setIcon(15);
+ _icon2.setIcon(16);
+ _icon3.setIcon(17);
+ break;
+ case 4:
+ _icon1.setIcon(22);
+ _icon2.setIcon(23);
+ break;
+ case 6:
+ R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._player._oldCharacterScene[1]);
+ break;
+ case 7:
+ if (_consoleMode == 11)
+ consoleAction(2);
+ else if (_consoleMode == 22)
+ consoleAction(4);
+ else
+ consoleAction(5);
+ break;
+ case 8:
+ _iconFontNumber = 50;
+ stop();
+ _icon6.setIcon(5);
+ consoleAction(1);
+ break;
+ case 9:
+ _iconFontNumber = 52;
+ stop();
+ _icon6.setIcon(5);
+ consoleAction(1);
+ break;
+ case 10:
+ R2_GLOBALS._player.disableControl();
+ consoleAction(2);
+ _icon1.hideIcon();
+ _icon2.hideIcon();
+ _icon3.hideIcon();
+ _icon5.setIcon(24);
+
+ _icon4.setPosition(Common::Point(52, 107));
+ _icon4._sceneRegionId = 9;
+ _icon4.setIcon(25);
+ _icon4._object2.hide();
+
+ _icon6.setIcon(26);
+ _sceneMode = 10;
+
+ _palette.loadPalette(161);
+ R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this);
+ break;
+ case 11:
+ _icon1.setIcon(27);
+ _icon2.setIcon(28);
+ _icon3.setIcon(29);
+ _icon4.setIcon(30);
+ break;
+ case 12:
+ R2_GLOBALS._player.disableControl();
+ consoleAction(2);
+ _icon1.hideIcon();
+ _icon2.hideIcon();
+ _icon3.hideIcon();
+ _icon4.hideIcon();
+ _icon5.hideIcon();
+
+ _icon6.setIcon(26);
+ _sceneMode = 10;
+ _palette.loadPalette(161);
+ R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this);
+ break;
+ case 13:
+ consoleAction(2);
+ if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) != R2_GLOBALS._player._oldCharacterScene[1]) {
+ SceneItem::display2(126, 17);
+ } else {
+ R2_GLOBALS._player.disableControl();
+
+ _icon1.hideIcon();
+ _icon2.hideIcon();
+ _icon3.hideIcon();
+ _icon5.setIcon(24);
+
+ _icon4.setPosition(Common::Point(52, 107));
+ _icon4._sceneRegionId = 9;
+ _icon4.setIcon(25);
+ _icon4._object2.hide();
+
+ _icon6.setIcon(26);
+ _sceneMode = 10;
+
+ _palette.loadPalette(161);
+ R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this);
+ }
+ break;
+ case 15:
+ consoleAction(3);
+
+ if (R2_GLOBALS._v565F5 < 3) {
+ R2_GLOBALS._player.disableControl();
+ _object5.postInit();
+ _object5.setup(162, 2, 2);
+ _object5.setPosition(Common::Point(216, UI_INTERFACE_Y));
+
+ R2_GLOBALS._v565F5 += 2;
+ } else if (R2_GLOBALS._v565F5 == 3) {
+ SceneItem::display2(126, 13);
+ } else {
+ SceneItem::display2(126, 14);
+ }
+ break;
+ case 16:
+ consoleAction(3);
+
+ if (R2_GLOBALS._v565F5 < 4) {
+ R2_GLOBALS._player.disableControl();
+ _object5.postInit();
+ _object5.setup(162, 2, 3);
+ _object5.setPosition(Common::Point(218, UI_INTERFACE_Y));
+
+ ++R2_GLOBALS._v565F5;
+ } else {
+ SceneItem::display2(126, 15);
+ }
+ break;
+ case 17:
+ consoleAction(3);
+
+ if (R2_GLOBALS._v565F5 < 4) {
+ R2_GLOBALS._player.disableControl();
+ _object5.postInit();
+ _object5.setup(162, 2, 1);
+ _object5.setPosition(Common::Point(215, UI_INTERFACE_Y));
+
+ ++R2_GLOBALS._v565F5;
+ } else {
+ SceneItem::display2(126, 16);
+ }
+ break;
+ case 22:
+ _icon1.setIcon(31);
+ _icon2.setIcon(32);
+ _icon3.setIcon(33);
+ _icon4.setIcon(34);
+ break;
+ case 23:
+ R2_GLOBALS._player.disableControl();
+ consoleAction(4);
+ _icon1.hideIcon();
+ _icon2.hideIcon();
+ _icon3.hideIcon();
+ _icon4.hideIcon();
+ _icon5.hideIcon();
+ _icon6.hideIcon();
+
+ _sceneMode = 10;
+ _palette.loadPalette(161);
+ R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this);
+ break;
+ case 24:
+ _icon4.setIcon(25);
+ _icon4._object2.hide();
+
+ if (_consoleMode == 10) {
+ setDetails(127, --_logIndex);
+ } else if (_consoleMode == 13) {
+ setDetails(129, --_infodiskIndex);
+ } else {
+ setDetails(128, --_databaseIndex);
+ }
+ break;
+ case 25:
+ _icon4.setIcon(25);
+ _icon4._object2.hide();
+
+ if (_consoleMode == 10) {
+ setDetails(127, ++_logIndex);
+ } else if (_consoleMode == 13) {
+ setDetails(129, ++_infodiskIndex);
+ } else {
+ setDetails(128, ++_databaseIndex);
+ }
+ break;
+ case 26:
+ R2_GLOBALS._player.disableControl();
+ stop();
+ _icon4.setPosition(Common::Point(80, 62));
+ _icon4._sceneRegionId = 5;
+ _icon4.hideIcon();
+
+ R2_GLOBALS._player.hide();
+ _object1.hide();
+ _object2.hide();
+ _object3.hide();
+ _object4.hide();
+
+ _sceneMode = 11;
+ _palette.loadPalette(160);
+ R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this);
+ break;
+ case 27:
+ case 28:
+ case 29:
+ case 30:
+ R2_GLOBALS._player.disableControl();
+ consoleAction(11);
+ _consoleMode = id;
+
+ _icon1.hideIcon();
+ _icon2.hideIcon();
+ _icon3.hideIcon();
+ _icon4.hideIcon();
+ _icon5.setIcon(24);
+
+ _icon4.setPosition(Common::Point(52, 107));
+ _icon4._sceneRegionId = 9;
+ _icon4.setIcon(25);
+ _icon4._object2.hide();
+
+ _icon6.setIcon(26);
+ _sceneMode = 10;
+
+ _palette.loadPalette(161);
+ R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this);
+ break;
+ case 31:
+ consoleAction(22);
+ R2_GLOBALS._sound1.play((R2_GLOBALS._sound1.getSoundNum() == 10) ? 63 : 10);
+ break;
+ case 32:
+ consoleAction(22);
+ R2_GLOBALS._sound1.play((R2_GLOBALS._sound1.getSoundNum() == 10) ? 64 : 10);
+ break;
+ case 33:
+ consoleAction(22);
+ R2_GLOBALS._sound1.play((R2_GLOBALS._sound1.getSoundNum() == 10) ? 65 : 10);
+ break;
+ case 34:
+ consoleAction(22);
+ R2_GLOBALS._sound1.play((R2_GLOBALS._sound1.getSoundNum() == 10) ? 66 : 10);
+ break;
+ default:
+ _icon1.setIcon(1);
+ _icon2.setIcon(2);
+ _icon3.setIcon(3);
+ _icon4.setIcon(4);
+ break;
+ }
+
+ if ((id != 6) && (id != 7) && (id != 24) && (id != 25))
+ _consoleMode = id;
+}
+
+/**
+ * Sets the message to be displayed on the console screen.
+ */
+void Scene125::setDetails(int resNum, int lineNum) {
+ stop();
+
+ Common::String msg = g_resourceManager->getMessage(resNum, lineNum, true);
+
+ if (!msg.empty()) {
+ // Check for any specified sound numbers embedded in the message
+ msg = parseMessage(msg);
+
+ _sceneText._fontNumber = _iconFontNumber;
+ _sceneText._color1 = 92;
+ _sceneText._color2 = 0;
+ _sceneText._width = 221;
+ _sceneText.fixPriority(20);
+ _sceneText.setup(msg);
+ _sceneText.setPosition(Common::Point(49, 19));
+
+ R2_GLOBALS._sceneObjects->draw();
+
+ if ((_soundCount > 0) && (R2_GLOBALS._speechSubtitles & SPEECH_VOICE)) {
+ _sceneMode = 12;
+ R2_GLOBALS._playStream.play(_soundIndexes[_soundIndex], this);
+ }
+ } else {
+ // Passed the start or end of the message set, so return to the menu
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._player.hide();
+
+ _icon4.setPosition(Common::Point(80, 62));
+ _icon4._sceneRegionId = 5;
+ _icon4.hideIcon();
+
+ _consoleMode = 0;
+ _palette.loadPalette(160);
+ _sceneMode = 11;
+ R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this);
+ }
+}
+
+/**
+ * Stops any playing console sounds and hides any current console message.
+ */
+void Scene125::stop() {
+ _sceneText.remove();
+ _soundIndex = 0;
+ _soundCount = 0;
+
+ R2_GLOBALS._playStream.stop();
+}
+
+/**
+ * Parses a message to be displayed on the console to see whether there are any sounds to be played.
+ */
+Common::String Scene125::parseMessage(const Common::String &msg) {
+ _soundIndex = 0;
+ _soundCount = 0;
+
+ const char *msgP = msg.c_str();
+ while (*msgP == '!') {
+ // Get the sound number
+ _soundIndexes[_soundCount++] = atoi(++msgP);
+
+ while (!((*msgP == '\0') || (*msgP < '0') || (*msgP > '9')))
+ ++msgP;
+ }
+
+ return Common::String(msgP);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 150 - Empty Bedroom
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene150::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(100);
+
+ _door.postInit();
+ _door._state = 0;
+ _door.setVisage(100);
+ _door.setPosition(Common::Point(160, 84));
+ _door.setDetails(100, 3, -1, -1, 1, (SceneItem *)NULL);
+
+ _doorDisplay.postInit();
+ _doorDisplay.setup(100, 2, 1);
+ _doorDisplay.setPosition(Common::Point(202, 53));
+ _doorDisplay.setDetails(100, -1, -1, -1, 1, (SceneItem *)NULL);
+
+ _emptyRoomTable.postInit();
+ _emptyRoomTable.setVisage(100);
+ _emptyRoomTable.setStrip(4);
+ _emptyRoomTable.setFrame(1);
+ _emptyRoomTable.setPosition(Common::Point(175, 157));
+ _emptyRoomTable.setDetails(150, 3, 4, 5, 1, (SceneItem *)NULL);
+
+ _wardrobe.postInit();
+ _wardrobe.setVisage(101);
+ _wardrobe.setPosition(Common::Point(231, 126));
+ _wardrobe.fixPriority(10);
+ _wardrobe.setDetails(100, 37, -1, 39, 1, (SceneItem *)NULL);
+
+ _terminal.setDetails(11, 100, 14, 15, 16);
+ _desk.setDetails(12, 100, 11, -1, 13);
+ _bed.setDetails(13, 100, 8, 9, 10);
+ _duct.setDetails(14, 100, 34, -1, 36);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.setVisage(10);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.disableControl();
+
+ _background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 150, 0, 1, -1, 1, NULL);
+ _sceneMode = 100;
+
+ switch (R2_GLOBALS._sceneManager._previousScene) {
+ case 100:
+ setAction(&_sequenceManager1, this, 106, &R2_GLOBALS._player, NULL);
+ break;
+ case 200:
+ setAction(&_sequenceManager1, this, 100, &R2_GLOBALS._player, &_door, NULL);
+ break;
+ default:
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.setPosition(Common::Point(180, 100));
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene150::remove() {
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene150::signal() {
+ switch (_sceneMode) {
+ case 101:
+ R2_GLOBALS._sceneManager.changeScene(200);
+ break;
+ case 105:
+ R2_GLOBALS._sceneManager.changeScene(125);
+ break;
+ case 110:
+ if (_door._state) {
+ _door._state = 0;
+ _doorDisplay.setFrame(1);
+ } else {
+ _door._state = 1;
+ _doorDisplay.setFrame(2);
+ }
+ R2_GLOBALS._player.enableControl();
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 160 - Credits
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene160::Action1::signal() {
+ Scene160 *scene = (Scene160 *)R2_GLOBALS._sceneManager._scene;
+ bool breakFlag;
+ SynchronizedList<SceneText *>::iterator i;
+ SceneText *topItem;
+
+ switch (_actionIndex) {
+ case 0:
+ scene->_yChange = 1;
+ scene->_lineNum = 0;
+ ++_actionIndex;
+ // Deliberate fall-through
+
+ case 1:
+ setDelay(5);
+ breakFlag = true;
+ do {
+ if (!scene->_lineNum || ((scene->_lineNum != -1) &&
+ (((*scene->_creditsList.reverse_begin())->_position.y < 164) || !breakFlag))) {
+ breakFlag = true;
+ Common::String msg = g_resourceManager->getMessage(160, scene->_lineNum++);
+
+ if (*msg.c_str() == '^') {
+ scene->_lineNum = -1;
+ } else {
+ if (msg.size() == 0)
+ msg = " ";
+
+ SceneText *sceneText = new SceneText();
+ sceneText->_fontNumber = 50;
+
+ switch (*msg.c_str()) {
+ case '$': {
+ // Centered text
+ msg.deleteChar(0);
+ int width = R2_GLOBALS.gfxManager()._font.getStringWidth(msg.c_str());
+
+ sceneText->_textMode = ALIGN_CENTER;
+ sceneText->setPosition(Common::Point(160 - (width / 2), 175));
+ sceneText->_width = 320;
+ break;
+ }
+
+ case '%': {
+ // Text for position name
+ msg.deleteChar(0);
+ int width = R2_GLOBALS.gfxManager()._font.getStringWidth(msg.c_str());
+
+ sceneText->_textMode = ALIGN_RIGHT;
+ sceneText->setPosition(Common::Point(151 - width, 175));
+ sceneText->_width = 320;
+ breakFlag = false;
+ break;
+ }
+
+ case '@':
+ // Text for who was in the position
+ msg.deleteChar(0);
+ sceneText->_textMode = ALIGN_LEFT;
+ sceneText->_position = Common::Point(167, 175);
+ sceneText->_width = 153;
+ break;
+
+ default:
+ sceneText->_width = 151;
+ sceneText->setPosition(Common::Point(151, 175));
+ sceneText->_textMode = ALIGN_RIGHT;
+ break;
+ }
+
+ sceneText->_color1 = 191;
+ sceneText->_color2 = 191;
+ sceneText->_color3 = 191;
+ sceneText->setup(msg);
+ sceneText->_flags |= OBJFLAG_CLONED;
+ sceneText->fixPriority(5);
+
+ scene->_creditsList.push_back(sceneText);
+ }
+ }
+
+ } while (!breakFlag);
+
+ // Move all the active credits
+ for (i = scene->_creditsList.begin(); i != scene->_creditsList.end(); ++i) {
+ SceneObject *item = *i;
+ item->setPosition(Common::Point(item->_position.x, item->_position.y - scene->_yChange));
+ }
+
+ topItem = *scene->_creditsList.begin();
+ if (topItem->_position.y < 25) {
+ // Credit has reached the top, so remove it
+ topItem->remove();
+ scene->_creditsList.remove(topItem);
+
+ if (scene->_creditsList.size() == 0) {
+ // No more items left
+ setDelay(10);
+ ++_actionIndex;
+ }
+ }
+ break;
+
+ case 2:
+ HelpDialog::show();
+ setDelay(4);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene160::Scene160(): SceneExt() {
+ _frameNumber = _yChange = 0;
+ _lineNum = 0;
+}
+
+void Scene160::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(4001);
+
+ R2_GLOBALS._player._uiEnabled = false;
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+
+ R2_GLOBALS._uiElements.hide();
+ R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
+
+ _lineNum = 0;
+ _frameNumber = R2_GLOBALS._events.getFrameNumber();
+
+ _sound1.play(337);
+ setAction(&_action1);
+}
+
+void Scene160::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_frameNumber);
+ s.syncAsSint16LE(_yChange);
+ s.syncAsSint16LE(_lineNum);
+}
+
+void Scene160::remove() {
+ // Clear the credit list
+ SynchronizedList<SceneText *>::iterator i;
+ for (i = _creditsList.begin(); i != _creditsList.end(); ++i) {
+ SceneText *item = *i;
+
+ item->remove();
+ }
+ _creditsList.clear();
+
+ _sound1.fadeOut(NULL);
+ SceneExt::remove();
+}
+
+void Scene160::process(Event &event) {
+ if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE)) {
+ event.handled = true;
+ HelpDialog::show();
+ }
+
+ if (!event.handled)
+ SceneExt::process(event);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 180 - Title Screen
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene180::Action1::signal() {
+ Scene180 *scene = (Scene180 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ case 1:
+ case 2:
+ scene->_object5.setStrip((_actionIndex == 1) ? 1 : 2);
+ scene->_object5.setFrame(1);
+ scene->_object5.animate(ANIM_MODE_5, this);
+ break;
+ case 4:
+ scene->_object5.setStrip(3);
+ scene->_object5.setFrame(1);
+ scene->_object5.animate(ANIM_MODE_5, this);
+ _actionIndex = 0;
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene180::Scene180(): SceneExt(), _webbsterSpeaker(27) {
+ _field412 = 0;
+ _frameInc = 0;
+ _frameNumber = R2_GLOBALS._events.getFrameNumber();
+ _field480 = 1;
+ _field482 = -1;
+ _fontNumber = R2_GLOBALS.gfxManager()._font._fontNumber;
+
+ GfxFont font;
+ font.setFontNumber(7);
+ _fontHeight = font.getHeight() + 1;
+
+ _sceneMode = (R2_GLOBALS._sceneManager._previousScene == 205) ? 10 : 0;
+ _gameTextSpeaker._displayMode = 9;
+}
+
+void Scene180::postInit(SceneObjectList *OwnerList) {
+ loadScene(9999);
+ SceneExt::postInit();
+
+ R2_GLOBALS._uiElements._active = true;
+ R2_GLOBALS._player.disableControl();
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ _stripManager.addSpeaker(&_webbsterSpeaker);
+ _stripManager.addSpeaker(&_tealSpeaker);
+ _stripManager.addSpeaker(&_dutyOfficerSpeaker);
+
+ signal();
+}
+
+void Scene180::remove() {
+ _stripManager._field2E8 = -1;
+// _stripManager._field2EA = -1;
+ SceneExt::remove();
+
+ R2_GLOBALS._events.setCursor(CURSOR_WALK);
+ // word_575F7 = 0;
+ R2_GLOBALS._playStream.stop();
+ R2_GLOBALS._sound2.fadeOut2(NULL);
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+}
+
+void Scene180::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_frameNumber);
+ s.syncAsSint16LE(_field412);
+ s.syncAsSint16LE(_field480);
+ s.syncAsSint16LE(_field482);
+ s.syncAsSint16LE(_frameInc);
+ s.syncAsSint16LE(_fontNumber);
+ s.syncAsSint16LE(_fontHeight);
+}
+
+void Scene180::signal() {
+ R2_GLOBALS._playStream.stop();
+
+ switch (_sceneMode++) {
+ case 0:
+ setSceneDelay(6);
+ break;
+
+ case 1:
+ _field412 = 1;
+ R2_GLOBALS._sceneManager._hasPalette = true;
+ _animationPlayer._paletteMode = ANIMPALMODE_NONE;
+ _animationPlayer._v = 1;
+ _animationPlayer._objectMode = 1;
+ R2_GLOBALS._scene180Mode = 1;
+
+ _animationPlayer.load(1);
+ R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
+
+ R2_GLOBALS._sound1.play(1);
+ break;
+
+ case 2:
+ R2_GLOBALS._scene180Mode = 1;
+ R2_GLOBALS._paneRefreshFlag[0] = 3;
+
+ if (R2_GLOBALS._sound1.isPlaying()) {
+ setSceneDelay(1);
+ } else {
+ setSceneDelay(180);
+ }
+ break;
+
+ case 3:
+ R2_GLOBALS._scene180Mode = 1;
+
+ if (R2_GLOBALS._sound1.isPlaying())
+ _sceneMode = 3;
+
+ setSceneDelay(1);
+ break;
+
+ case 4:
+ case 8:
+ case 30:
+ case 43:
+ case 47:
+ _field412 = 0;
+ _palette.loadPalette(0);
+ _palette.loadPalette(9998);
+ R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 8, this);
+ break;
+
+ case 5:
+ _animationPlayer._paletteMode = ANIMPALMODE_NONE;
+ _animationPlayer._v = 1;
+ _animationPlayer._objectMode = 1;
+ R2_GLOBALS._scene180Mode = 2;
+ _animationPlayer.load(2);
+
+ _field412 = 1;
+ R2_GLOBALS._scenePalette.addFader(_animationPlayer._subData._palData, 256, 6, NULL);
+ R2_GLOBALS._sound1.play(2);
+ break;
+
+ case 6:
+ R2_GLOBALS._scene180Mode = 2;
+ R2_GLOBALS._paneRefreshFlag[0] = 3;
+
+ if (R2_GLOBALS._sound1.isPlaying()) {
+ setSceneDelay(1);
+ } else {
+ setSceneDelay(180);
+ }
+ break;
+
+ case 7:
+ // Title screen. Wait until title music finishes playing
+ R2_GLOBALS._scene180Mode = 2;
+ if (R2_GLOBALS._sound1.isPlaying())
+ _sceneMode = 7;
+ setSceneDelay(1);
+ break;
+
+ case 9:
+ R2_GLOBALS._sound1.play(3);
+ clearScreen();
+ setSceneDelay(2);
+ break;
+
+ case 10:
+ loadScene(4002);
+ R2_GLOBALS._scenePalette.loadPalette(0);
+ setSceneDelay(6);
+ break;
+
+ case 11:
+ _field412 = 1;
+ _object4.postInit();
+ _object5.postInit();
+ setAction(&_sequenceManager, this, 4000, &_object4, &_object5, NULL);
+ break;
+
+ case 12:
+ case 14:
+ case 16:
+ case 18:
+ case 20:
+ case 22:
+ case 24:
+ case 26:
+ case 46:
+ setSceneDelay((R2_GLOBALS._speechSubtitles & 1) ? 1 : 18);
+ break;
+
+ case 13:
+ setAction(&_sequenceManager, this, 4001, &_object4, &_object5, NULL);
+ break;
+
+ case 15:
+ setAction(&_sequenceManager, this, 4002, &_object4, &_object5, NULL);
+ break;
+
+ case 17:
+ setAction(&_sequenceManager, this, 4003, &_object4, &_object5, NULL);
+ break;
+
+ case 19:
+ setAction(&_sequenceManager, this, 4004, &_object4, &_object5, NULL);
+ break;
+
+ case 21:
+ setAction(&_sequenceManager, this, 4005, &_object4, &_object5, NULL);
+ break;
+
+ case 23:
+ setAction(&_sequenceManager, this, 4006, &_object4, &_object5, NULL);
+ break;
+
+ case 25:
+ setAction(&_sequenceManager, this, 4007, &_object4, &_object5, NULL);
+ break;
+
+ case 27:
+ _field412 = 0;
+ _object4.remove();
+ _object5.remove();
+ setSceneDelay(2);
+ break;
+
+ case 28:
+ _field412 = 0;
+ _palette.loadPalette(0);
+ _palette.loadPalette(9998);
+ R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 100, this);
+ break;
+
+ case 29:
+ _field412 = 1;
+ _animationPlayer._paletteMode = ANIMPALMODE_REPLACE_PALETTE;
+ _animationPlayer._v = 1;
+ _animationPlayer._objectMode = 42;
+ R2_GLOBALS._scene180Mode = 3;
+ _animationPlayer.load(3);
+ break;
+
+ case 31:
+ R2_GLOBALS._sound2.play(7);
+
+ _object4.postInit();
+ _object4.setVisage(76);
+ _object4.setStrip(1);
+ _object4.setFrame(1);
+ _object4.setPosition(Common::Point(288, 143));
+ _object4.fixPriority(210);
+
+ loadScene(75);
+
+ R2_GLOBALS._scenePalette.loadPalette(0);
+ R2_GLOBALS._scenePalette.loadPalette(75);
+
+ if (R2_GLOBALS._sceneManager._hasPalette)
+ R2_GLOBALS._scenePalette.refresh();
+ setSceneDelay(6);
+ break;
+
+ case 32:
+ _field412 = 1;
+
+ _object2.postInit();
+ _object2.setPosition(Common::Point(161, 97));
+ _object2.hide();
+
+ _object3.postInit();
+ _object3.setPosition(Common::Point(60, 96));
+ _object3.hide();
+ R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 11, this);
+ break;
+
+ case 33:
+ _object2.hide();
+
+ _object3.setup(76, 4, 1);
+ _object3.setFrame(_object3.getFrameCount());
+
+ _object5.postInit();
+ _object5.setup(75, 1, 1);
+ _object5.setPosition(Common::Point(221, 125));
+ _object5.fixPriority(210);
+ _object5.setAction(&_action1);
+ R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 12, this);
+ break;
+
+ case 34:
+ _object2.hide();
+ _object3.hide();
+
+ _object1.postInit();
+ _object1.setup(76, 2, 1);
+ _object1.setPosition(Common::Point(287, 135));
+ _object1.fixPriority(200);
+
+ _sound1.play(19);
+ R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this);
+ break;
+
+ case 35:
+ R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 13, this);
+ break;
+
+ case 36:
+ _object2.remove();
+ _sound1.play(19);
+
+ R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 6, this);
+ break;
+
+ case 37:
+ _field412 = 0;
+ _object1.remove();
+ _palette.loadPalette(9998);
+ R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 8, this);
+ break;
+
+ case 38:
+ _object4.remove();
+ _object5.setAction(NULL);
+ _object5.remove();
+
+ R2_GLOBALS._sound2.fadeOut2(NULL);
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ break;
+
+ case 39:
+ R2_GLOBALS._sound1.changeSound(8);
+ setSceneDelay(1);
+ break;
+
+ case 40:
+ _animationPlayer._paletteMode = ANIMPALMODE_NONE;
+ _animationPlayer._objectMode = 1;
+ R2_GLOBALS._scene180Mode = 4;
+ if (_animationPlayer.load(4)) {
+ _animationPlayer.dispatch();
+ R2_GLOBALS._scenePalette.addFader(_animationPlayer._subData._palData, 256, 8, this);
+ } else {
+ _sceneMode = 43;
+ setSceneDelay(1);
+ }
+ break;
+
+ case 41:
+ _field412 = 1;
+ _animationPlayer._v = 1;
+ break;
+
+ case 42:
+ R2_GLOBALS._scene180Mode = 4;
+ R2_GLOBALS._paneRefreshFlag[0] = 3;
+ setSceneDelay(1);
+ break;
+
+ case 44:
+ loadScene(9997);
+ R2_GLOBALS._scenePalette.loadPalette(9997);
+ if (R2_GLOBALS._sceneManager._hasPalette)
+ R2_GLOBALS._scenePalette.refresh();
+
+ setSceneDelay(6);
+ break;
+
+ case 45:
+ R2_GLOBALS._scenePalette.addFader(_animationPlayer._subData._palData, 256, 28, this);
+ break;
+
+ case 48:
+ _field412 = 1;
+ _animationPlayer._paletteMode = ANIMPALMODE_NONE;
+ _animationPlayer._v = 1;
+ _animationPlayer._objectMode = 1;
+ R2_GLOBALS._scene180Mode = 15;
+ _animationPlayer.load(15, NULL);
+
+ R2_GLOBALS._sound1.play(9);
+ R2_GLOBALS._scenePalette.addFader(_animationPlayer._subData._palData, 256, 6, NULL);
+ break;
+
+ case 49:
+ R2_GLOBALS._scene180Mode = 15;
+ R2_GLOBALS._paneRefreshFlag[0] = 3;
+ setSceneDelay(1);
+ break;
+
+ case 50:
+ R2_GLOBALS._scene180Mode = 0;
+ _field412 = 0;
+ R2_GLOBALS._sceneManager.changeScene(100);
+ break;
+ }
+}
+
+void Scene180::setSceneDelay(int v) {
+ _frameInc = v;
+ _frameNumber = R2_GLOBALS._events.getFrameNumber();
+}
+
+void Scene180::process(Event &event) {
+ if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE)) {
+ event.handled = 1;
+ if (!_field412) {
+ if (R2_GLOBALS._scenePalette._listeners.size() == 0) {
+ HelpDialog::show();
+ }
+ }
+ }
+
+ if (!event.handled)
+ SceneExt::process(event);
+}
+
+void Scene180::dispatch() {
+ if (_frameInc) {
+ uint32 gameFrame = R2_GLOBALS._events.getFrameNumber();
+
+ if (gameFrame >= (uint32)_frameNumber) {
+ _frameInc -= gameFrame - _frameNumber;
+ _frameNumber = gameFrame;
+
+ if (_frameInc <= 0) {
+ _frameInc = 0;
+ signal();
+ }
+ }
+ }
+
+ if (_animationPlayer._v) {
+ if (_animationPlayer.isCompleted()) {
+ _animationPlayer._v = 0;
+ _animationPlayer.close();
+ _animationPlayer.remove();
+
+ signal();
+ } else {
+ _animationPlayer.dispatch();
+ }
+ }
+
+ Scene::dispatch();
+}
+
+void Scene180::restore() {
+ R2_GLOBALS._gfxColors.background = 0;
+ R2_GLOBALS._gfxColors.foreground = 0xff;
+ R2_GLOBALS._fontColors.background = 0;
+ R2_GLOBALS._fontColors.foreground = 0xff;
+
+ switch (R2_GLOBALS._scene180Mode) {
+ case 0:
+ R2_GLOBALS._events.setCursor(SHADECURSOR_HAND);
+
+ R2_GLOBALS._gfxColors.foreground = 4;
+ R2_GLOBALS._gfxColors.background = 3;
+ R2_GLOBALS._fontColors.background = 3;
+ R2_GLOBALS._frameEdgeColour = 3;
+ break;
+
+ case 1:
+ R2_GLOBALS._events.setCursor(R2_CURSOR_20);
+
+ R2_GLOBALS._gfxColors.foreground = 25;
+ R2_GLOBALS._gfxColors.background = 43;
+ R2_GLOBALS._fontColors.background = 48;
+ R2_GLOBALS._frameEdgeColour = 48;
+ break;
+
+ case 2:
+ R2_GLOBALS._events.setCursor(R2_CURSOR_21);
+
+ R2_GLOBALS._gfxColors.foreground = 106;
+ R2_GLOBALS._gfxColors.background = 136;
+ R2_GLOBALS._fontColors.background = 48;
+ R2_GLOBALS._fontColors.foreground = 253;
+ R2_GLOBALS._frameEdgeColour = 48;
+ break;
+
+ case 3:
+ R2_GLOBALS._events.setCursor(R2_CURSOR_22);
+
+ R2_GLOBALS._gfxColors.foreground = 84;
+ R2_GLOBALS._gfxColors.background = 118;
+ R2_GLOBALS._fontColors.background = 47;
+ R2_GLOBALS._frameEdgeColour = 48;
+ break;
+
+ case 14:
+ R2_GLOBALS._events.setCursor(R2_CURSOR_23);
+
+ R2_GLOBALS._fontColors.background = 38;
+ R2_GLOBALS._fontColors.foreground = 38;
+ R2_GLOBALS._gfxColors.foreground = 192;
+ R2_GLOBALS._gfxColors.background = 30;
+ R2_GLOBALS._frameEdgeColour = 48;
+ break;
+
+ default:
+ R2_GLOBALS._gfxColors.background = 0;
+ R2_GLOBALS._gfxColors.foreground = 59;
+ R2_GLOBALS._fontColors.background = 4;
+ R2_GLOBALS._fontColors.foreground = 15;
+
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 200 - Ship Corridor
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene200::NorthDoor::startAction(CursorType action, Event &event) {
+ Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 202;
+ scene->setAction(&scene->_sequenceManager, scene, 202, &R2_GLOBALS._player, this, NULL);
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene200::EastDoor::startAction(CursorType action, Event &event) {
+ Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 200;
+ scene->setAction(&scene->_sequenceManager, scene, 200, &R2_GLOBALS._player, this, NULL);
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene200::WestDoor::startAction(CursorType action, Event &event) {
+ Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 204;
+ scene->setAction(&scene->_sequenceManager, scene, 204, &R2_GLOBALS._player, this, NULL);
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene200::EastExit::changeScene() {
+ Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 206;
+ scene->setAction(&scene->_sequenceManager, scene, 206, &R2_GLOBALS._player, NULL);
+}
+
+void Scene200::WestExit::changeScene() {
+ Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 208;
+ scene->setAction(&scene->_sequenceManager, scene, 208, &R2_GLOBALS._player, NULL);
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene200::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(200);
+
+ _westExit.setDetails(Rect(94, 0, 123, 58), EXITCURSOR_W, 175);
+ _westExit.setDest(Common::Point(125, 52));
+ _eastExit.setDetails(Rect(133, 0, 167, 58), EXITCURSOR_E, 150);
+ _eastExit.setDest(Common::Point(135, 52));
+
+ _northDoor.postInit();
+ _northDoor.setVisage(200);
+ _northDoor.setPosition(Common::Point(188, 79));
+ _northDoor.setDetails(200, 3, -1, -1, 1, (SceneItem *)NULL);
+
+ _eastDoor.postInit();
+ _eastDoor.setVisage(200);
+ _eastDoor.setStrip(2);
+ _eastDoor.setPosition(Common::Point(305, 124));
+ _eastDoor.setDetails(200, 6, -1, -1, 1, (SceneItem *)NULL);
+
+ _westDoor.postInit();
+ _westDoor.setVisage(200);
+ _westDoor.setStrip(3);
+ _westDoor.setPosition(Common::Point(62, 84));
+ _westDoor.setDetails(200, 9, -1, -1, 1, (SceneItem *)NULL);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.setVisage(10);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.disableControl();
+
+ _compartment.setDetails(Rect(4, 88, 153, 167), 200, 12, -1, -1, 1, NULL);
+ _westDoorDisplay.setDetails(Rect(41, 51, 48, 61), 200, 15, -1, -1, 1, NULL);
+ _eastDoorDisplay.setDetails(Rect(279, 67, 286, 78), 200, 18, -1, -1, 1, NULL);
+ _background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 200, 0, -1, -1, 1, NULL);
+
+ switch (R2_GLOBALS._sceneManager._previousScene) {
+ case 100:
+ _sceneMode = 201;
+ setAction(&_sequenceManager, this, 201, &R2_GLOBALS._player, &_eastDoor, NULL);
+ break;
+ case 150:
+ _sceneMode = 207;
+ setAction(&_sequenceManager, this, 207, &R2_GLOBALS._player, NULL);
+ break;
+ case 175:
+ _sceneMode = 209;
+ setAction(&_sequenceManager, this, 209, &R2_GLOBALS._player, NULL);
+ break;
+ case 250:
+ _sceneMode = 203;
+ setAction(&_sequenceManager, this, 203, &R2_GLOBALS._player, &_northDoor, NULL);
+ break;
+ case 400:
+ _sceneMode = 205;
+ setAction(&_sequenceManager, this, 205, &R2_GLOBALS._player, &_westDoor, NULL);
+ break;
+ default:
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.setPosition(Common::Point(215, 115));
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene200::signal() {
+ switch (_sceneMode) {
+ case 200:
+ R2_GLOBALS._sceneManager.changeScene(100);
+ break;
+ case 202:
+ R2_GLOBALS._sceneManager.changeScene(250);
+ break;
+ case 204:
+ R2_GLOBALS._sceneManager.changeScene(400);
+ break;
+ case 206:
+ R2_GLOBALS._sceneManager.changeScene(150);
+ break;
+ case 208:
+ R2_GLOBALS._sceneManager.changeScene(175);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 205 - Star-field Credits
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene205::Action1::signal() {
+ Scene205 *scene = (Scene205 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(2);
+ break;
+
+ case 1:
+ scene->_yp = 100 - (scene->_fontHeight * 3 / 2);
+ scene->handleText();
+
+ for (int idx = 1; idx <= 2; ++idx) {
+ ++scene->_textIndex;
+ scene->_yp += scene->_fontHeight;
+ scene->handleText();
+ }
+ setDelay(240);
+ break;
+
+ case 2:
+ case 4:
+ case 6:
+ case 8:
+ case 10:
+ case 12:
+ case 14:
+ case 16:
+ case 18:
+ case 20:
+ textLoop();
+ setDelay(120);
+ break;
+
+ case 3:
+ scene->_textIndex = 1;
+ scene->_yp = 100 - ((scene->_fontHeight * 2) / 2);
+ scene->handleText();
+
+ ++scene->_textIndex;
+ scene->_yp += scene->_fontHeight;
+ scene->handleText();
+ setDelay(240);
+ break;
+
+ case 5:
+ scene->_textIndex = 1;
+ scene->_yp = 100 - ((scene->_fontHeight * 7) / 2);
+ scene->handleText();
+
+ for (int idx = 1; idx <= 6; ++idx) {
+ ++scene->_textIndex;
+ scene->_yp += scene->_fontHeight;
+ scene->handleText();
+ }
+
+ setDelay(480);
+ break;
+
+ case 7:
+ scene->_textIndex = 1;
+ scene->_yp = 100 - ((scene->_fontHeight * 6) / 2);
+ scene->handleText();
+
+ for (int idx = 1; idx <= 5; ++idx) {
+ ++scene->_textIndex;
+ scene->_yp += scene->_fontHeight;
+ scene->handleText();
+ }
+
+ setDelay(300);
+ break;
+
+ case 9:
+ scene->_textIndex = 1;
+ scene->_yp = 100 - ((scene->_fontHeight * 8) / 2);
+ scene->handleText();
+
+ for (int idx = 1; idx <= 7; ++idx) {
+ ++scene->_textIndex;
+ scene->_yp += scene->_fontHeight;
+ scene->handleText();
+ }
+
+ setDelay(480);
+ break;
+
+ case 11:
+ scene->_textIndex = 1;
+ scene->_yp = 100 - ((scene->_fontHeight * 3) / 2);
+ scene->handleText();
+
+ for (int idx = 1; idx <= 2; ++idx) {
+ ++scene->_textIndex;
+ scene->_yp += scene->_fontHeight;
+ scene->handleText();
+ }
+
+ setDelay(240);
+ break;
+
+ case 13:
+ scene->_textIndex = 1;
+ scene->_yp = 100 - ((scene->_fontHeight * 3) / 2);
+ scene->handleText();
+
+ for (int idx = 1; idx <= 2; ++idx) {
+ ++scene->_textIndex;
+ scene->_yp += scene->_fontHeight;
+ scene->handleText();
+ }
+
+ setDelay(240);
+ break;
+
+ case 15:
+ scene->_textIndex = 1;
+ scene->_yp = 100 - ((scene->_fontHeight * 5) / 2);
+ scene->handleText();
+
+ for (int idx = 1; idx <= 4; ++idx) {
+ ++scene->_textIndex;
+ scene->_yp += scene->_fontHeight;
+ scene->handleText();
+ }
+
+ setDelay(240);
+ break;
+
+ case 17:
+ scene->_textIndex = 1;
+ scene->_yp = 100 - ((scene->_fontHeight * 5) / 2);
+ scene->handleText();
+
+ for (int idx = 1; idx <= 4; ++idx) {
+ ++scene->_textIndex;
+ scene->_yp += scene->_fontHeight;
+ scene->handleText();
+ }
+
+ setDelay(360);
+ break;
+
+ case 19:
+ scene->_textIndex = 1;
+ scene->_yp = 100 - ((scene->_fontHeight * 3) / 2);
+ scene->handleText();
+
+ for (int idx = 1; idx <= 2; ++idx) {
+ ++scene->_textIndex;
+ scene->_yp += scene->_fontHeight;
+ scene->handleText();
+ }
+
+ setDelay(480);
+ break;
+
+ case 21:
+ R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._sceneManager._previousScene);
+
+ default:
+ break;
+ }
+}
+
+void Scene205::Action1::textLoop() {
+ Scene205 *scene = (Scene205 *)R2_GLOBALS._sceneManager._scene;
+
+ for (int idx = 1; idx <= 14; ++idx) {
+ if (R2_GLOBALS._sceneObjects->contains(&scene->_textList[idx])) {
+ scene->_textList[idx].remove();
+ }
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene205::Object::Object(): SceneObject() {
+ _x100 = _y100 = 0;
+}
+
+void Scene205::Object::synchronize(Serializer &s) {
+ EventHandler::synchronize(s);
+
+ s.syncAsSint32LE(_x100);
+ s.syncAsSint32LE(_y100);
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene205::Scene205(): SceneExt() {
+ _yp = 0;
+ _textIndex = 1;
+ _lineNum = -1;
+
+ GfxFont font;
+ font.setFontNumber(4);
+ _fontHeight = font.getHeight();
+}
+
+void Scene205::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(4000);
+ R2_GLOBALS._player._uiEnabled = false;
+
+ R2_GLOBALS._sound1.play(337);
+ R2_GLOBALS._scenePalette.loadPalette(0);
+ R2_GLOBALS._player.disableControl();
+
+ setup();
+ setAction(&_action1);
+}
+
+void Scene205::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ for (int idx = 0; idx < 3; ++idx)
+ SYNC_POINTER(_objList1[idx]);
+ for (int idx = 0; idx < 3; ++idx)
+ SYNC_POINTER(_objList2[idx]);
+ for (int idx = 0; idx < 4; ++idx)
+ SYNC_POINTER(_objList3[idx]);
+
+ s.syncAsSint16LE(_textIndex);
+ s.syncAsSint16LE(_lineNum);
+ s.syncAsSint16BE(_yp);
+}
+
+void Scene205::remove() {
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene205::process(Event &event) {
+ if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE)) {
+ event.handled = true;
+ R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._sceneManager._previousScene);
+ } else {
+ Scene::process(event);
+ }
+}
+
+void Scene205::dispatch() {
+ processList(_objList3, 4, Common::Rect(0, 0, 319, 200), 1, 1, 160, 100);
+ processList(_objList2, 3, Common::Rect(0, 0, 319, 200), 2, 2, 160, 100);
+ processList(_objList1, 3, Common::Rect(0, 0, 319, 200), 4, 3, 160, 100);
+
+ Scene::dispatch();
+}
+
+void Scene205::setup() {
+ const Common::Point pointList1[3] = { Common::Point(2, 50), Common::Point(100, 28), Common::Point(53, 15) };
+ const Common::Point pointList2[3] = { Common::Point(289, 192), Common::Point(125, 60), Common::Point(130, 40) };
+ const Common::Point pointList3[4] = {
+ Common::Point(140, 149), Common::Point(91, 166), Common::Point(299, 46), Common::Point(314, 10)
+ };
+
+ // Set up the first object list
+ for (int idx = 0; idx < 3; ++idx) {
+ Object *obj = new Object();
+ _objList1[idx] = obj;
+
+ obj->postInit();
+ obj->_flags |= OBJFLAG_CLONED;
+ obj->setVisage(205);
+ obj->_strip = 1;
+ obj->_frame = 1;
+ obj->setPosition(pointList1[idx]);
+ obj->_x100 = obj->_position.x * 100;
+ obj->_y100 = obj->_position.y * 100;
+ obj->fixPriority(12);
+ }
+
+ // Setup the second object list
+ for (int idx = 0; idx < 3; ++idx) {
+ Object *obj = new Object();
+ _objList2[idx] = obj;
+
+ obj->postInit();
+ obj->_flags |= OBJFLAG_CLONED;
+ obj->setVisage(205);
+ obj->_strip = 1;
+ obj->_frame = 2;
+ obj->setPosition(pointList2[idx]);
+ obj->_x100 = obj->_position.x * 100;
+ obj->_y100 = obj->_position.y * 100;
+ obj->fixPriority(11);
+ }
+
+ // Setup the third object list
+ for (int idx = 0; idx < 4; ++idx) {
+ Object *obj = new Object();
+ _objList3[idx] = obj;
+
+ obj->postInit();
+ obj->_flags |= OBJFLAG_CLONED;
+ obj->setVisage(205);
+ obj->_strip = 1;
+ obj->_frame = 3;
+ obj->setPosition(pointList3[idx]);
+ obj->_x100 = obj->_position.x * 100;
+ obj->_y100 = obj->_position.y * 100;
+ obj->fixPriority(10);
+ }
+}
+
+/**
+ * Handles moving a group of stars in the scene background
+ */
+void Scene205::processList(Object **ObjList, int count, const Common::Rect &bounds,
+ int xMultiply, int yMultiply, int xCenter, int yCenter) {
+ for (int idx = 0; idx < count; ++idx) {
+ Object *obj = ObjList[idx];
+ Common::Point pt(obj->_position.x - xCenter, obj->_position.y - yCenter);
+
+ if ((obj->_position.x <= 319) && (obj->_position.x >= 0) &&
+ (obj->_position.y <= 199) && (obj->_position.y >= 0)) {
+ if (!pt.x && !pt.y) {
+ pt.x = pt.y = 1;
+ }
+
+ pt.x *= xMultiply;
+ pt.y *= yMultiply;
+ obj->_x100 += pt.x;
+ obj->_y100 += pt.y;
+ } else {
+ obj->_x100 = (bounds.left + R2_GLOBALS._randomSource.getRandomNumber(bounds.right)) * 100;
+ obj->_y100 = (bounds.top + R2_GLOBALS._randomSource.getRandomNumber(bounds.bottom)) * 100;
+ }
+
+ obj->setPosition(Common::Point(obj->_x100 / 100, obj->_y100 / 100));
+ }
+}
+
+void Scene205::handleText() {
+ _message = g_resourceManager->getMessage(205, ++_lineNum);
+
+ _textList[_textIndex]._fontNumber = 4;
+ _textList[_textIndex]._color1 = 0;
+ _textList[_textIndex]._color2 = 10;
+ _textList[_textIndex]._color3 = 7;
+ _textList[_textIndex]._width = 400;
+ _textList[_textIndex].setup(_message);
+ _textList[_textIndex].fixPriority(199);
+
+ GfxFont font;
+ font.setFontNumber(4);
+ int width = font.getStringWidth(_message.c_str());
+
+ _textList[_textIndex].setPosition(Common::Point(160 - (width / 2), _yp));
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 250 - Lift
+ *
+ *--------------------------------------------------------------------------*/
+
+Scene250::Button::Button(): SceneActor() {
+ _floorNumber = _v2 = 0;
+}
+
+void Scene250::Button::synchronize(Serializer &s) {
+ SceneActor::synchronize(s);
+
+ s.syncAsSint16LE(_floorNumber);
+ s.syncAsSint16LE(_v2);
+}
+
+bool Scene250::Button::startAction(CursorType action, Event &event) {
+ Scene250 *scene = (Scene250 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (scene->_field414) {
+ SceneItem::display2(250, 15);
+ } else {
+ switch (_floorNumber) {
+ case 1:
+ case 2:
+ case 5:
+ case 9:
+ scene->_sound1.play(14);
+ scene->changeFloor(_floorNumber);
+ break;
+ case 10:
+ // Current Floor
+ scene->_sound1.play(14);
+ R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._sceneManager._previousScene);
+ break;
+ default:
+ SceneItem::display2(250, 16);
+ break;
+ }
+ }
+ return true;
+
+ case CURSOR_LOOK:
+ switch (_floorNumber) {
+ case 1:
+ case 2:
+ case 5:
+ case 9:
+ SceneItem::display2(250, 12);
+ break;
+ case 10:
+ SceneItem::display2(250, 13);
+ break;
+ case 11:
+ SceneItem::display2(250, 14);
+ break;
+ default:
+ SceneItem::display2(250, 16);
+ break;
+ }
+ return true;
+
+ default:
+ return SceneActor::startAction(action, event);
+ }
+}
+
+void Scene250::Button::setFloor(int floorNumber) {
+ SceneActor::postInit();
+ _floorNumber = floorNumber;
+ _v2 = 0;
+
+ if (_floorNumber <= 9) {
+ SceneObject::setup(250, 1, 4);
+
+ switch (_floorNumber) {
+ case 1:
+ case 2:
+ case 5:
+ case 9:
+ setFrame(6);
+ break;
+ default:
+ break;
+ }
+
+ setPosition(Common::Point(111, (_floorNumber - 1) * 12 + 43));
+ fixPriority(10);
+ setDetails(250, -1, -1, -1, 1, (SceneItem *)NULL);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene250::Scene250(): SceneExt() {
+ _field412 = _field414 = _field416 = _field418 = _field41A = 0;
+}
+
+void Scene250::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field412);
+ s.syncAsSint16LE(_field414);
+ s.syncAsSint16LE(_field416);
+ s.syncAsSint16LE(_field418);
+ s.syncAsSint16LE(_field41A);
+}
+
+void Scene250::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(250);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.setVisage(10);
+ R2_GLOBALS._player.hide();
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+
+ _currentFloor.setFloor(10);
+ _currentFloor.setup(250, 1, 5);
+ _currentFloor.setDetails(250, 13, -1, -1, 1, (SceneItem *)NULL);
+
+ _button1.setFloor(11);
+ _button1.setup(250, 1, 3);
+ _button1.setPosition(Common::Point(400, 100));
+ _button1.setDetails(250, 14, -1, -1, 1, (SceneItem *)NULL);
+ _button1.fixPriority(190);
+ _button1.hide();
+
+ _floor1.setFloor(1);
+ _floor2.setFloor(2);
+ _floor3.setFloor(3);
+ _floor4.setFloor(4);
+ _floor5.setFloor(5);
+ _floor6.setFloor(6);
+ _floor7.setFloor(7);
+ _floor8.setFloor(8);
+ _floor9.setFloor(9);
+
+ _item2.setDetails(Rect(0, 0, 73, SCREEN_HEIGHT), 250, 9, -1, 9, 1, NULL);
+ _item4.setDetails(Rect(239, 16, 283, 164), 250, 6, -1, -1, 1, NULL);
+ _background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 250, 0, 1, -1, 1, NULL);
+
+ R2_GLOBALS._events.setCursor(CURSOR_USE);
+
+ switch (R2_GLOBALS._sceneManager._previousScene) {
+ case 200:
+ _field412 = 55;
+ break;
+ case 300:
+ _field412 = 43;
+ break;
+ case 700:
+ _field412 = 139;
+ break;
+ case 850:
+ _field412 = 91;
+ break;
+ default:
+ R2_GLOBALS._sceneManager._previousScene = 200;
+ _field412 = 55;
+ break;
+ }
+
+ _currentFloor.setPosition(Common::Point(111, _field412));
+}
+
+void Scene250::signal() {
+ if (_field41A)
+ _sceneMode = 20;
+
+ switch (_sceneMode) {
+ case 1:
+ _sound1.play(22);
+ R2_GLOBALS._player.show();
+ R2_GLOBALS._player.setup(250, 1, 2);
+ R2_GLOBALS._player.setPosition(Common::Point(261, 185));
+ ADD_MOVER(R2_GLOBALS._player, 261, 15);
+
+ _field416 = 0;
+ _sceneMode = 2;
+ break;
+ case 2:
+ _sceneMode = ((_field414 - 12) == _field412) ? 4 : 3;
+ signal();
+ break;
+ case 3:
+ _currentFloor.setPosition(Common::Point(111, _currentFloor._position.y + 12));
+ _field412 += 12;
+ R2_GLOBALS._player.setPosition(Common::Point(261, 185));
+ ADD_MOVER(R2_GLOBALS._player, 261, 15);
+
+ if ((_field414 - 12) == _field412)
+ _sceneMode = 4;
+ break;
+ case 4:
+ _sound1.play(21);
+
+ _currentFloor.setPosition(Common::Point(111, _currentFloor._position.y + 12));
+ R2_GLOBALS._player.setPosition(Common::Point(261, 185));
+ ADD_MOVER(R2_GLOBALS._player, 261, 15);
+ _sceneMode = 5;
+ break;
+ case 5:
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 20;
+ signal();
+ break;
+ case 6:
+ _sound1.play(22);
+ R2_GLOBALS._player.show();
+ R2_GLOBALS._player.setup(250, 1, 2);
+ R2_GLOBALS._player.setPosition(Common::Point(261, 15));
+ ADD_MOVER(R2_GLOBALS._player, 261, 185);
+ _field416 = 0;
+ _sceneMode = 7;
+ break;
+ case 7:
+ _field418 = 1;
+ if ((_field414 + 12) == _field412)
+ _sceneMode = 8;
+ signal();
+ break;
+ case 8:
+ _currentFloor.setPosition(Common::Point(111, _currentFloor._position.y - 12));
+ _field412 -= 12;
+ R2_GLOBALS._player.setPosition(Common::Point(261, 15));
+ ADD_MOVER(R2_GLOBALS._player, 261, 185);
+
+ if ((_field414 + 12) == _field412)
+ _sceneMode = 9;
+ break;
+ case 9:
+ _sound1.play(21);
+ _currentFloor.setPosition(Common::Point(111, _currentFloor._position.y - 12));
+ R2_GLOBALS._player.setPosition(Common::Point(261, 15));
+ ADD_MOVER(R2_GLOBALS._player, 261, 185);
+ _sceneMode = 10;
+ break;
+ case 10:
+ _sceneMode = 20;
+ signal();
+ break;
+ case 20:
+ // Handle changing scene
+ switch (_field414) {
+ case 55:
+ R2_GLOBALS._sceneManager.changeScene(200);
+ break;
+ case 43:
+ R2_GLOBALS._sceneManager.changeScene(300);
+ break;
+ case 139:
+ R2_GLOBALS._sceneManager.changeScene(139);
+ break;
+ case 91:
+ R2_GLOBALS._sceneManager.changeScene(850);
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene250::changeFloor(int floorNumber) {
+ _field414 = (floorNumber - 1) * 12 + 43;
+ _button1.setPosition(Common::Point(111, _field414));
+ _button1.show();
+
+ _sceneMode = (_field412 >= _field414) ? 6 : 1;
+ if (_field414 == _field412)
+ _sceneMode = 20;
+
+ signal();
+}
+
+void Scene250::process(Event &event) {
+ if (!event.handled) {
+ if (((event.eventType == EVENT_KEYPRESS) || (event.btnState != 0)) && _field418) {
+ _field41A = 1;
+ event.handled = true;
+ }
+
+ SceneExt::process(event);
+ }
+}
+
+void Scene250::dispatch() {
+ SceneExt::dispatch();
+
+ if (((_sceneMode == 2) || (_sceneMode == 7)) && (_field416 < 100)) {
+ ++_field416;
+ R2_GLOBALS._player._moveDiff.y = _field416 / 5;
+ }
+
+ if (((_sceneMode == 5) || (_sceneMode == 10)) && (R2_GLOBALS._player._moveDiff.y > 4)) {
+ --_field416;
+ R2_GLOBALS._player._moveDiff.y = _field416 / 7 + 3;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 300 - Bridge
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene300::Action1::signal() {
+ Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex) {
+ case 0:
+ setAction(&scene->_sequenceManager2, this, 311, (R2_GLOBALS._player._characterIndex == 1) ?
+ (SceneObject *)&R2_GLOBALS._player : (SceneObject *)&scene->_quinn);
+ _actionIndex = 2;
+ break;
+ case 1:
+ setAction(&scene->_sequenceManager2, this, 312, (R2_GLOBALS._player._characterIndex == 1) ?
+ (SceneObject *)&R2_GLOBALS._player : (SceneObject *)&scene->_quinn);
+ _actionIndex = 0;
+ break;
+ case 2:
+ if (!R2_GLOBALS._playStream.isPlaying())
+ _actionIndex = R2_GLOBALS._randomSource.getRandomNumber(1);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene300::Action2::signal() {
+ Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex) {
+ case 0:
+ setAction(&scene->_sequenceManager3, this, 302, &scene->_seeker, NULL);
+ _actionIndex = 2;
+ break;
+ case 1:
+ setAction(&scene->_sequenceManager3, this, 303, &scene->_seeker, NULL);
+ _actionIndex = 2;
+ break;
+ case 2:
+ if (!R2_GLOBALS._playStream.isPlaying())
+ _actionIndex = R2_GLOBALS._randomSource.getRandomNumber(1);
+
+ setDelay(60 + R2_GLOBALS._randomSource.getRandomNumber(119));
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene300::Action3::signal() {
+ Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex) {
+ case 0:
+ setAction(&scene->_sequenceManager3, this, 304, &scene->_miranda, NULL);
+ _actionIndex = 2;
+ break;
+ case 1:
+ setAction(&scene->_sequenceManager3, this, 305, &scene->_miranda, NULL);
+ _actionIndex = 2;
+ break;
+ case 2:
+ if (!R2_GLOBALS._playStream.isPlaying())
+ _actionIndex = R2_GLOBALS._randomSource.getRandomNumber(1);
+
+ setDelay(60 + R2_GLOBALS._randomSource.getRandomNumber(119));
+ break;
+ default:
+ break;
+ }
+}
+
+
+void Scene300::Action4::signal() {
+ Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!R2_GLOBALS._playStream.isPlaying()) {
+ scene->_object7.setStrip2(R2_GLOBALS._randomSource.getRandomNumber(2));
+ scene->_object7.setFrame(1);
+
+ scene->_object9.setStrip2(3);
+ scene->_object9.setFrame(1);
+ }
+
+ setDelay(60 + R2_GLOBALS._randomSource.getRandomNumber(479));
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene300::QuinnWorkstation::startAction(CursorType action, Event &event) {
+ Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (R2_GLOBALS._player._characterIndex != 1)
+ SceneItem::display2(300, 46);
+ else if (R2_GLOBALS.getFlag(44)) {
+ R2_GLOBALS._player.setAction(NULL);
+ R2_GLOBALS._sceneManager.changeScene(325);
+ } else {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 306;
+ scene->setAction(&scene->_sequenceManager1, scene, 306, &R2_GLOBALS._player, NULL);
+ }
+ return true;
+
+ case CURSOR_LOOK:
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ SceneItem::display2(300, 47);
+ return true;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return NamedHotspot::startAction(action, event);
+}
+
+bool Scene300::MirandaWorkstation::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_USE:
+ if (R2_GLOBALS._player._characterIndex != 3)
+ SceneItem::display2(300, 49);
+ else
+ R2_GLOBALS._sceneManager.changeScene(325);
+ return true;
+
+ case CURSOR_LOOK:
+ if (R2_GLOBALS._player._characterIndex == 3) {
+ SceneItem::display2(300, 47);
+ return true;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return NamedHotspot::startAction(action, event);
+}
+
+bool Scene300::SeekerWorkstation::startAction(CursorType action, Event &event) {
+ switch (action) {
+ case CURSOR_LOOK:
+ if (R2_GLOBALS._player._characterIndex == 2) {
+ SceneItem::display2(300, 47);
+ return true;
+ }
+ break;
+
+ case CURSOR_USE:
+ if (R2_GLOBALS._player._characterIndex != 2)
+ SceneItem::display2(300, 48);
+ else
+ R2_GLOBALS._sceneManager.changeScene(325);
+ return true;
+
+ default:
+ break;
+ }
+
+ return NamedHotspot::startAction(action, event);
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene300::Miranda::startAction(CursorType action, Event &event) {
+ Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_TALK:
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ // Quinn talking to Miranda
+ R2_GLOBALS._player.disableControl();
+
+ if (!R2_GLOBALS.getFlag(44)) {
+ if (R2_GLOBALS.getFlag(40))
+ scene->_stripId = 119;
+ else if (R2_GLOBALS.getFlag(38))
+ scene->_stripId = 101;
+ else {
+ R2_GLOBALS._sound1.play(69);
+ scene->_stripId = 100;
+ }
+
+ scene->_sceneMode = 309;
+ scene->setAction(&scene->_sequenceManager1, scene, 309, &R2_GLOBALS._player, NULL);
+ } else if (!R2_GLOBALS.getFlag(55)) {
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ scene->_sceneMode = 10;
+ scene->_stripManager.start3(scene->_stripId, scene, R2_GLOBALS._stripManager_lookupList);
+ } else {
+ scene->_sceneMode = 16;
+
+ if (!R2_GLOBALS.getFlag(57)) {
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ scene->_stripManager.start3(434, scene, R2_GLOBALS._stripManager_lookupList);
+ } else if (R2_GLOBALS._player._characterScene[R2_MIRANDA] != 500) {
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ scene->_stripManager.start3(407, scene, R2_GLOBALS._stripManager_lookupList);
+ } else {
+ scene->_stripId = 433;
+ scene->_sceneMode = 309;
+ scene->setAction(&scene->_sequenceManager1, scene, 309, &R2_GLOBALS._player, NULL);
+ }
+ }
+ } else {
+ // Seeker talking to Miranda
+ scene->_sceneMode = 10;
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+
+ if (!R2_GLOBALS.getFlag(44))
+ scene->_stripId = 174 + R2_GLOBALS._randomSource.getRandomNumber(2);
+ else if (!R2_GLOBALS.getFlag(55))
+ scene->_stripId = 211;
+ else
+ scene->_stripId = 438;
+
+ scene->_stripManager.start3(scene->_stripId, scene, R2_GLOBALS._stripManager_lookupList);
+ }
+ return true;
+
+ case R2_OPTO_DISK:
+ SceneItem::display2(300, 54);
+ return true;
+
+ case R2_READER:
+ if (!R2_GLOBALS.getFlag(2) || !R2_GLOBALS.getFlag(3) || (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 1))
+ SceneItem::display2(300, 55);
+ else {
+ R2_GLOBALS._player.disableControl();
+ scene->_stripId = R2_GLOBALS.getFlag(4) ? 121 : 120;
+ scene->_sceneMode = 309;
+ scene->setAction(&scene->_sequenceManager1, scene, 309, &R2_GLOBALS._player, NULL);
+ }
+ return true;
+
+ default:
+ break;
+ }
+
+ return SceneActor::startAction(action, event);
+}
+
+bool Scene300::Seeker::startAction(CursorType action, Event &event) {
+ Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_TALK:
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ if (R2_GLOBALS.getFlag(44)) {
+ if (!R2_GLOBALS.getFlag(38)) {
+ R2_GLOBALS._sound1.play(69);
+ scene->_stripId = 181;
+ scene->_sceneMode = 310;
+ scene->setAction(&scene->_sequenceManager1, scene, 309, &R2_GLOBALS._player, NULL);
+ } else {
+ scene->_stripId = R2_GLOBALS.getFlag(40) ? 170 : 150;
+ scene->_sceneMode = 310;
+ scene->setAction(&scene->_sequenceManager1, scene, 309, &R2_GLOBALS._player, NULL);
+ }
+ } else {
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ if (!R2_GLOBALS.getFlag(55)) {
+ scene->_sceneMode = 10;
+ scene->_stripManager.start3(205, scene, R2_GLOBALS._stripManager_lookupList);
+ } else {
+ scene->_sceneMode = 16;
+ scene->_stripManager.start3(R2_GLOBALS.getFlag(57) ? 407 : 401, scene, R2_GLOBALS._stripManager_lookupList);
+ }
+ }
+ } else {
+ scene->_sceneMode = 10;
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+
+ if (!R2_GLOBALS.getFlag(44))
+ scene->_stripId = 122 + R2_GLOBALS._randomSource.getRandomNumber(2);
+ else if (!R2_GLOBALS.getFlag(55))
+ scene->_stripId = 209;
+ else
+ scene->_stripId = 440;
+
+ scene->_stripManager.start3(scene->_stripId, scene, R2_GLOBALS._stripManager_lookupList);
+ }
+ return true;
+
+ case R2_OPTO_DISK:
+ if (R2_GLOBALS.getFlag(13)) {
+ SceneItem::display2(300, 53);
+ } else {
+ R2_GLOBALS._player.disableControl();
+ scene->_stripId = 171;
+ }
+
+ scene->_sceneMode = 310;
+ scene->setAction(&scene->_sequenceManager1, scene, 310, &R2_GLOBALS._player, NULL);
+ return true;
+
+ case R2_READER:
+ if (!R2_GLOBALS.getFlag(2) || !R2_GLOBALS.getFlag(3) || (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 1))
+ break;
+
+ R2_GLOBALS._player.disableControl();
+ scene->_stripId = R2_GLOBALS.getFlag(4) ? 173 : 172;
+ scene->_sceneMode = 310;
+ scene->setAction(&scene->_sequenceManager1, scene, 310, &R2_GLOBALS._player, NULL);
+ return true;
+
+ default:
+ break;
+ }
+
+ return SceneActor::startAction(action, event);
+}
+
+bool Scene300::Quinn::startAction(CursorType action, Event &event) {
+ Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_TALK:
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ scene->_sceneMode = 10;
+
+ if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) {
+ if (R2_GLOBALS._player._characterScene[R2_MIRANDA] == 500)
+ scene->_stripId = 442;
+ else if (!R2_GLOBALS.getFlag(44))
+ scene->_stripId = 177 + R2_GLOBALS._randomSource.getRandomNumber(2);
+ else if (!R2_GLOBALS.getFlag(55))
+ scene->_stripId = 208;
+ else
+ scene->_stripId = 441;
+ } else if (R2_GLOBALS._player._characterScene[R2_MIRANDA] == 500) {
+ scene->_stripId = 442;
+ } else if (R2_GLOBALS.getFlag(44)) {
+ scene->_stripId = R2_GLOBALS.getFlag(55) ? 441 : 208;
+ } else {
+ scene->_stripId = 125 + R2_GLOBALS._randomSource.getRandomNumber(2);
+ }
+
+ scene->_stripManager.start3(scene->_stripId, scene, R2_GLOBALS._stripManager_lookupList);
+ return true;
+
+ default:
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene300::Doorway::startAction(CursorType action, Event &event) {
+ Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ if ((R2_GLOBALS._player._characterIndex == R2_QUINN) &&
+ (!R2_GLOBALS.getFlag(44) || R2_GLOBALS._player._characterScene[R2_MIRANDA] == 500)) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 301;
+ scene->setAction(&scene->_sequenceManager1, scene, 301, &R2_GLOBALS._player, this, NULL);
+ } else {
+ SceneItem::display2(300, 45);
+ }
+
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene300::Scene300(): SceneExt() {
+ _stripId = 0;
+ _rotation = NULL;
+}
+
+void Scene300::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_stripId);
+ SYNC_POINTER(_rotation);
+}
+
+void Scene300::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(300);
+ _sound1.play(23);
+ setZoomPercents(75, 93, 120, 100);
+
+ if (R2_GLOBALS._sceneManager._previousScene == -1) {
+ R2_GLOBALS._sceneManager._previousScene = 1000;
+ R2_GLOBALS._player._characterIndex = R2_QUINN;
+ }
+
+ _stripManager.setColors(60, 255);
+ _stripManager.setFontNumber(3);
+ _stripManager.addSpeaker(&_mirandaSpeaker);
+ _stripManager.addSpeaker(&_seekerSpeaker);
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_quinnLSpeaker);
+ _stripManager.addSpeaker(&_seekerLSpeaker);
+ _stripManager.addSpeaker(&_tealSpeaker);
+ _stripManager.addSpeaker(&_soldierSpeaker);
+
+ _rotation = R2_GLOBALS._scenePalette.addRotation(237, 254, -1);
+ _rotation->setDelay(3);
+ _rotation->_countdown = 1;
+
+ if (R2_GLOBALS.getFlag(51) && !R2_GLOBALS.getFlag(25)) {
+ _object1.postInit();
+ _object1.setup(301, 7, 2);
+ _object1.setPosition(Common::Point(65, 24));
+
+ _object2.postInit();
+ _object2.setup(301, 8, 2);
+ _object2.setPosition(Common::Point(254, 24));
+ }
+
+ _doorway.postInit();
+ _doorway.setVisage(300);
+ _doorway.setPosition(Common::Point(159, 79));
+
+ _object3.postInit();
+ _object3.setup(300, 4, 1);
+ _object3.setPosition(Common::Point(84, 48));
+ _object3.animate(ANIM_MODE_2, NULL);
+ _object3._numFrames = 5;
+
+ _object4.postInit();
+ _object4.setup(300, 5, 1);
+ _object4.setPosition(Common::Point(236, 48));
+ _object4.animate(ANIM_MODE_2, NULL);
+
+ _protocolDisplay.postInit();
+ _protocolDisplay.setup(300, 6, 1);
+ _protocolDisplay.setPosition(Common::Point(287, 71));
+ _protocolDisplay.animate(ANIM_MODE_7, NULL);
+ _protocolDisplay._numFrames = 5;
+
+ _object6.postInit();
+ _object6.setup(300, 7, 1);
+ _object6.setPosition(Common::Point(214, 37));
+ _object6.animate(ANIM_MODE_2, NULL);
+ _object6._numFrames = 3;
+
+ _object7.postInit();
+ _object7.setup(301, 1, 1);
+ _object7.setPosition(Common::Point(39, 97));
+ _object7.fixPriority(124);
+ _object7.animate(ANIM_MODE_2, NULL);
+ _object7._numFrames = 5;
+ _object7.setAction(&_action4);
+
+ _object8.postInit();
+ _object8.setup(300, 8, 1);
+ _object8.setPosition(Common::Point(105, 37));
+ _object8.animate(ANIM_MODE_2, NULL);
+ _object8._numFrames = 5;
+
+ _object9.postInit();
+ _object9.setup(301, 6, 1);
+ _object9.setPosition(Common::Point(274, 116));
+ _object9.fixPriority(143);
+ _object9.animate(ANIM_MODE_2, NULL);
+ _object9._numFrames = 5;
+
+ _quinnWorkstation1.setDetails(Rect(243, 148, 315, 167), 300, 30, 31, 32, 1, NULL);
+ _mirandaWorkstation1.setDetails(Rect(4, 128, 69, 167), 300, 33, 31, 35, 1, NULL);
+
+ switch (R2_GLOBALS._player._characterIndex) {
+ case 1:
+ _miranda.postInit();
+ _miranda.setup(302, 2, 1);
+ _miranda.setPosition(Common::Point(47, 128));
+ _miranda.setAction(&_action3);
+ _miranda.setDetails(300, 39, 40, 41, 1, (SceneItem *)NULL);
+
+ if ((R2_GLOBALS._player._characterScene[2] == 300) || (R2_GLOBALS._player._characterScene[2] == 325)) {
+ _seeker.postInit();
+ _seeker.setVisage(302);
+ _seeker.setPosition(Common::Point(158, 108));
+ _seeker.fixPriority(130);
+ _seeker.setAction(&_action2);
+ _seeker.setDetails(300, 42, 43, 44, 1, (SceneItem *)NULL);
+ }
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.setVisage(10);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.disableControl();
+ break;
+
+ case 2:
+ _miranda.postInit();
+ _miranda.setup(302, 2, 1);
+ _miranda.setPosition(Common::Point(47, 128));
+ _miranda.setAction(&_action3);
+ _miranda.setDetails(300, 39, 40, 41, 1, (SceneItem *)NULL);
+
+ if ((R2_GLOBALS._player._characterScene[1] == 300) || (R2_GLOBALS._player._characterScene[1] == 325)) {
+ _quinn.postInit();
+ _quinn.setup(302, 3, 1);
+ _quinn.setPosition(Common::Point(271, 150));
+ _quinn.setAction(&_action1);
+ _quinn.setDetails(300, 50, 51, 52, 1, (SceneItem *)NULL);
+ }
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.setup(302, 1, 3);
+ R2_GLOBALS._player.setPosition(Common::Point(158, 108));
+ R2_GLOBALS._player.fixPriority(130);
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ break;
+
+ case 3:
+ if ((R2_GLOBALS._player._characterScene[2] == 300) || (R2_GLOBALS._player._characterScene[2] == 325)) {
+ _seeker.postInit();
+ _seeker.setVisage(302);
+ _seeker.setPosition(Common::Point(158, 108));
+ _seeker.fixPriority(130);
+ _seeker.setAction(&_action2);
+ _seeker.setDetails(300, 42, 43, 44, 1, (SceneItem *)NULL);
+ }
+
+ if ((R2_GLOBALS._player._characterScene[1] == 300) || (R2_GLOBALS._player._characterScene[1] == 325)) {
+ _quinn.postInit();
+ _quinn.setup(302, 3, 1);
+ _quinn.setPosition(Common::Point(271, 150));
+ _quinn.setAction(&_action1);
+ _quinn.setDetails(300, 50, 51, 52, 1, (SceneItem *)NULL);
+ }
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.setup(302, 2, 1);
+ R2_GLOBALS._player.setPosition(Common::Point(47, 128));
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ break;
+
+ default:
+ break;
+ }
+
+ _seekerWorkstation.setDetails(Rect(101, 95, 217, 143), 300, 36, 31, 35, 1, NULL);
+ _quinnWorkstation2.setDetails(Rect(224, 102, 315, 143), 300, 30, 31, 32, 1, NULL);
+ _mirandaWorkstation2.setDetails(Rect(4, 83, 84, 124), 300, 33, 31, 35, 1, NULL);
+ _hull.setDetails(11, 300, 6, -1, -1);
+ _statusDisplays.setDetails(12, 300, 9, 10, -1);
+ _damageControl.setDetails(13, 300, 12, -1, -1);
+ _manualOverrides.setDetails(14, 300, 15, -1, 17);
+ _scanners1.setDetails(Rect(126, 15, 183, 25), 300, 18, -1, 20, 1, NULL);
+ _scanners2.setDetails(Rect(126, 80, 183, 90), 300, 18, -1, 20, 1, NULL);
+ _protocolDisplay.setDetails(300, 27, -1, 29, 1, (SceneItem *)NULL);
+ _indirectLighting1.setDetails(Rect(74, 71, 122, 89), 300, 21, -1, -1, 1, NULL);
+ _indirectLighting2.setDetails(Rect(197, 71, 245, 89), 300, 21, -1, -1, 1, NULL);
+ _lighting.setDetails(Rect(129, 3, 190, 14), 300, 24, -1, -1, 1, NULL);
+ _doorway.setDetails(300, 3, -1, 5, 1, (SceneItem *)NULL);
+ _background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 300, 0, -1, -1, 1, NULL);
+
+ switch (R2_GLOBALS._player._characterIndex) {
+ case 1:
+ _sceneMode = 300;
+
+ switch (R2_GLOBALS._sceneManager._previousScene) {
+ case 250:
+ setAction(&_sequenceManager1, this, 300, &R2_GLOBALS._player, &_doorway, NULL);
+ break;
+ case 325:
+ if (!R2_GLOBALS.getFlag(44) || R2_GLOBALS.getFlag(25))
+ setAction(&_sequenceManager1, this, 309, &R2_GLOBALS._player, NULL);
+ else {
+ R2_GLOBALS.setFlag(60);
+ R2_GLOBALS._player.setup(302, 3, 1);
+ R2_GLOBALS._player.setPosition(Common::Point(271, 150));
+ R2_GLOBALS._player.setAction(&_action1);
+
+ if (R2_GLOBALS.getFlag(55)) {
+ if (R2_GLOBALS.getFlag(57)) {
+ R2_GLOBALS.clearFlag(60);
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ _sceneMode = 16;
+ _stripManager.start(404, this);
+ } else {
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ }
+ } else {
+ if (R2_GLOBALS.getFlag(45)) {
+ R2_GLOBALS.clearFlag(60);
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ _sceneMode = 12;
+ _stripManager.start3(204, this, R2_GLOBALS._stripManager_lookupList);
+ } else {
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ }
+ }
+ }
+ break;
+ case 1000:
+ R2_GLOBALS.setFlag(60);
+ R2_GLOBALS._player.setup(302, 3, 1);
+ R2_GLOBALS._player.setPosition(Common::Point(271, 150));
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+
+ if (R2_GLOBALS.getFlag(51)) {
+ _sceneMode = 13;
+ _stripManager.start3(300, this, R2_GLOBALS._stripManager_lookupList);
+ } else {
+ _sceneMode = 11;
+ _stripManager.start3(200, this, R2_GLOBALS._stripManager_lookupList);
+ }
+ break;
+
+ case 1100:
+ R2_GLOBALS._player.setVisage(10);
+ R2_GLOBALS._player.setPosition(Common::Point(160, 95));
+ _stripId = 400;
+ _sceneMode = 309;
+ setAction(&_sequenceManager1, this, 309, &R2_GLOBALS._player, NULL);
+ break;
+
+ case 1500:
+ R2_GLOBALS.clearFlag(60);
+ R2_GLOBALS._player.setup(302, 3, 1);
+ R2_GLOBALS._player.setPosition(Common::Point(271, 150));
+ _sceneMode = 17;
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ _stripManager.start(413, this);
+ break;
+
+ default:
+ if (R2_GLOBALS.getFlag(60)) {
+ R2_GLOBALS._player.setup(302, 3, 1);
+ R2_GLOBALS._player.setPosition(Common::Point(271, 150));
+ R2_GLOBALS._player.setAction(&_action1);
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+ } else {
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.setPosition(Common::Point(200, 150));
+ R2_GLOBALS._player.enableControl();
+ }
+ break;
+ }
+ break;
+
+ case 3:
+ if (R2_GLOBALS._sceneManager._previousScene == 1500) {
+ R2_GLOBALS._player._oldCharacterScene[3] = 3150;
+ R2_GLOBALS._player._characterScene[3] = 3150;
+ R2_GLOBALS._player._effect = 0;
+ R2_GLOBALS._player.setAction(NULL);
+ R2_GLOBALS._player.disableControl();
+
+ _quinn.postInit();
+ _quinn.setVisage(10);
+ _quinn.setPosition(Common::Point(10, 10));
+ _quinn.hide();
+
+ _seeker.postInit();
+ _seeker.setVisage(20);
+ _seeker.setPosition(Common::Point(20, 20));
+ _seeker.hide();
+
+ _teal.postInit();
+ _soldier.postInit();
+ _object12.postInit();
+
+ R2_GLOBALS._sound1.play(107);
+ _sceneMode = 308;
+
+ setAction(&_sequenceManager1, this, 308, &R2_GLOBALS._player, &_teal, &_soldier, &_object12, &_doorway, NULL);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene300::remove() {
+ R2_GLOBALS._player.setAction(NULL);
+ SceneExt::remove();
+}
+
+void Scene300::signal() {
+ switch (_sceneMode) {
+ case 10:
+ switch (_stripManager._field2E8) {
+ case 0:
+ R2_GLOBALS._sound1.changeSound(10);
+ R2_GLOBALS.setFlag(38);
+ break;
+ case 1:
+ R2_GLOBALS.setFlag(3);
+ break;
+ case 2:
+ R2_GLOBALS.setFlag(4);
+ break;
+ case 3:
+ R2_GLOBALS.setFlag(13);
+ if (R2_GLOBALS._stripManager_lookupList[1] == 6)
+ R2_GLOBALS.setFlag(40);
+ break;
+ case 4:
+ if (R2_GLOBALS._stripManager_lookupList[1] == 6)
+ R2_GLOBALS.setFlag(40);
+ break;
+ case 5:
+ R2_GLOBALS._sceneManager.changeScene(1000);
+ break;
+ default:
+ break;
+ }
+
+ _stripManager._field2E8 = 0;
+ switch (_stripId) {
+ case 400:
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 15;
+ setAction(&_sequenceManager1, this, 306, &R2_GLOBALS._player, NULL);
+ break;
+ case 181:
+ R2_GLOBALS._player.setStrip(6);
+ // Deliberate fall-through
+ default:
+ R2_GLOBALS._player.enableControl(CURSOR_TALK);
+
+ if ((R2_GLOBALS._player._characterIndex != 1) || R2_GLOBALS.getFlag(44))
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ }
+ break;
+
+ case 11:
+ R2_GLOBALS.setFlag(44);
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ break;
+
+ case 12:
+ R2_GLOBALS._player.setAction(NULL);
+ R2_GLOBALS._sceneManager.changeScene(1010);
+ break;
+
+ case 13:
+ R2_GLOBALS._player.disableControl();
+ _seeker.changeZoom(-1);
+ _sceneMode = 313;
+ _seeker.setAction(NULL);
+ setAction(&_sequenceManager1, this, 313, &R2_GLOBALS._player, &_seeker, NULL);
+ break;
+
+ case 14:
+ if (_seeker._action)
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 314;
+ break;
+
+ case 15:
+ R2_GLOBALS.setFlag(55);
+ R2_GLOBALS.setFlag(38);
+ R2_GLOBALS.setFlag(44);
+ R2_GLOBALS.setFlag(51);
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ _sceneMode = 16;
+ _stripManager.start3(401, this, R2_GLOBALS._stripManager_lookupList);
+ break;
+
+ case 16:
+ if (_stripManager._field2E8 == 1) {
+ R2_GLOBALS._player.setAction(NULL);
+ R2_GLOBALS._sceneManager.changeScene(1000);
+ } else {
+ R2_GLOBALS._player.setAction(&_action1);
+ R2_GLOBALS._player.enableControl(CURSOR_TALK);
+ }
+ break;
+
+ case 17:
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 316;
+ _seeker.changeZoom(-1);
+ _seeker.setAction(&_sequenceManager3, this, 316, &_seeker, &_doorway, NULL);
+ R2_GLOBALS._player.setAction(&_sequenceManager1, NULL, 307, &R2_GLOBALS._player, NULL);
+ break;
+
+ case 18:
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 317;
+ setAction(&_sequenceManager1, this, 317, &_teal, &_doorway, NULL);
+ break;
+
+ case 19:
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 318;
+ setAction(&_sequenceManager1, this, 318, &R2_GLOBALS._player, &_teal, &_soldier, &_object12, NULL);
+ break;
+
+ case 20:
+ R2_GLOBALS._player._characterIndex = R2_QUINN;
+ R2_GLOBALS._sceneManager.changeScene(1500);
+ break;
+
+ case 300:
+ case 307:
+ R2_GLOBALS._player.enableControl();
+ break;
+
+ case 301:
+ R2_GLOBALS._sceneManager.changeScene(250);
+ break;
+
+ case 306:
+ R2_GLOBALS._sceneManager.changeScene(325);
+ break;
+
+ case 308:
+ _sceneMode = 18;
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ _stripManager.start(418, this);
+ break;
+
+ case 310:
+ R2_GLOBALS._player.setStrip(5);
+ // Deliberate fall-through
+ case 309:
+ signal309();
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ _sceneMode = 10;
+ _stripManager.start3(_stripId, this, R2_GLOBALS._stripManager_lookupList);
+ break;
+
+ case 313:
+ _sceneMode = 14;
+ R2_GLOBALS._player._effect = 0;
+ _seeker.setAction(&_sequenceManager3, this, 314, &_seeker, &_doorway, NULL);
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ _stripManager.start(301, this);
+ break;
+
+ case 314:
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 315;
+ R2_GLOBALS._player._effect = 1;
+ setAction(&_sequenceManager1, this, 315, &R2_GLOBALS._player, &_doorway, NULL);
+ break;
+
+ case 315:
+ R2_GLOBALS._sceneManager.changeScene(1100);
+ break;
+
+ case 316:
+ R2_GLOBALS._player._characterScene[2] = 500;
+ _seeker.remove();
+ R2_GLOBALS._player.enableControl(CURSOR_CROSSHAIRS);
+ break;
+
+ case 317:
+ _sceneMode = 19;
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ _stripManager.start(419, this);
+ break;
+
+ case 318:
+ _sceneMode = 20;
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ _stripManager.start(420, this);
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene300::signal309() {
+ if (R2_GLOBALS.getFlag(2))
+ R2_GLOBALS._stripManager_lookupList[0] = (R2_INVENTORY.getObjectScene(R2_READER) == 1) ? 3 : 2;
+
+ if (R2_GLOBALS.getFlag(4))
+ R2_GLOBALS._stripManager_lookupList[0] = 4;
+
+ if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 1)
+ R2_GLOBALS._stripManager_lookupList[0] = 5;
+
+ if (R2_GLOBALS.getFlag(13)) {
+ R2_GLOBALS._stripManager_lookupList[0] = 6;
+ R2_GLOBALS._stripManager_lookupList[2] = 2;
+ }
+
+ if (R2_GLOBALS.getFlag(39))
+ R2_GLOBALS._stripManager_lookupList[1] = 2;
+
+ if (R2_GLOBALS.getFlag(5))
+ R2_GLOBALS._stripManager_lookupList[1] = 3;
+
+ if (R2_GLOBALS.getFlag(6))
+ R2_GLOBALS._stripManager_lookupList[1] = 4;
+
+ if (R2_GLOBALS.getFlag(8))
+ R2_GLOBALS._stripManager_lookupList[1] = 5;
+
+ if (R2_GLOBALS.getFlag(9)) {
+ R2_GLOBALS._stripManager_lookupList[1] = 6;
+ R2_GLOBALS._stripManager_lookupList[3] = 2;
+ }
+
+ if (R2_GLOBALS.getFlag(48))
+ R2_GLOBALS._stripManager_lookupList[4] = 2;
+
+ if (R2_GLOBALS.getFlag(49))
+ R2_GLOBALS._stripManager_lookupList[4] = 3;
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 325 - Bridge Console
+ *
+ *--------------------------------------------------------------------------*/
+
+const double ADJUST_FACTOR = 0.06419999999999999;
+
+/*--------------------------------------------------------------------------*/
+
+Scene325::Icon::Icon(): SceneActor() {
+ _lookLineNum = 0;
+ _field98 = 0;
+ _pressed = false;
+}
+
+void Scene325::Icon::postInit(SceneObjectList *OwnerList) {
+ SceneObject::postInit();
+
+ _object1.postInit();
+ _object1.fixPriority(21);
+ _object1.hide();
+
+ _sceneText1._color1 = 92;
+ _sceneText1._color2 = 0;
+ _sceneText1._width = 200;
+ _sceneText2._color1 = 0;
+ _sceneText2._color2 = 0;
+ _sceneText2._width = 200;
+ fixPriority(20);
+}
+
+void Scene325::Icon::synchronize(Serializer &s) {
+ SceneActor::synchronize(s);
+ s.syncAsSint16LE(_lookLineNum);
+ s.syncAsSint16LE(_field98);
+ s.syncAsSint16LE(_pressed);
+}
+
+void Scene325::Icon::process(Event &event) {
+ Scene325 *scene = (Scene325 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!event.handled && !(_flags & OBJFLAG_HIDING) && R2_GLOBALS._player._uiEnabled) {
+
+ if (event.eventType == EVENT_BUTTON_DOWN) {
+ int regionIndex = R2_GLOBALS._sceneRegions.indexOf(event.mousePos);
+
+ switch (R2_GLOBALS._events.getCursor()) {
+ case CURSOR_LOOK:
+ if (regionIndex == _sceneRegionId) {
+ event.handled = true;
+ SceneItem::display2(326, _lookLineNum);
+ }
+ break;
+
+ case CURSOR_USE:
+ if ((regionIndex == _sceneRegionId) && !_pressed) {
+ scene->_sound1.play(14);
+ setFrame(2);
+
+ switch (_object1._strip) {
+ case 1:
+ _object1.setStrip(2);
+ break;
+ case 3:
+ _object1.setStrip(4);
+ break;
+ case 5:
+ _object1.setStrip(6);
+ break;
+ case 7:
+ _object1.setStrip(8);
+ break;
+ default:
+ break;
+ }
+
+ _pressed = true;
+ event.handled = true;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if ((event.eventType == EVENT_BUTTON_UP) && _pressed) {
+ setFrame(1);
+
+ switch (_object1._strip) {
+ case 2:
+ _object1.setStrip(1);
+ break;
+ case 4:
+ _object1.setStrip(3);
+ break;
+ case 6:
+ _object1.setStrip(5);
+ break;
+ default:
+ break;
+ }
+
+ _pressed = false;
+ event.handled = true;
+ scene->consoleAction(_lookLineNum);
+ }
+ }
+}
+
+void Scene325::Icon::setIcon(int id) {
+ Scene325 *scene = (Scene325 *)R2_GLOBALS._sceneManager._scene;
+
+ _lookLineNum = _field98 = id;
+ SceneActor::_lookLineNum = id;
+
+ _sceneText1.remove();
+ _sceneText2.remove();
+
+ if (_lookLineNum) {
+ showIcon();
+ _object1.setup(325, ((id - 1) / 10) * 2 + 1, ((id - 1) % 10) + 1);
+ _object1.setPosition(_position);
+
+ _sceneText1._fontNumber = scene->_iconFontNumber;
+ _sceneText1.setup(CONSOLE325_MESSAGES[id]);
+ _sceneText1.fixPriority(20);
+
+ _sceneText2._fontNumber = scene->_iconFontNumber;
+ _sceneText2.setup(CONSOLE325_MESSAGES[id]);
+ _sceneText2.fixPriority(20);
+
+ _sceneText2._fontNumber = scene->_iconFontNumber;
+ _sceneText2.setup(CONSOLE325_MESSAGES[id]);
+ _sceneText2.fixPriority(10);
+
+ switch (_lookLineNum) {
+ case 7:
+ _sceneText1.setPosition(Common::Point(62, _position.y + 8));
+ _sceneText2.setPosition(Common::Point(64, _position.y + 10));
+ break;
+ case 8:
+ case 9:
+ _sceneText1.setPosition(Common::Point(65, _position.y + 8));
+ _sceneText2.setPosition(Common::Point(67, _position.y + 10));
+ break;
+ case 12:
+ _sceneText1.setPosition(Common::Point(83, _position.y + 8));
+ _sceneText2.setPosition(Common::Point(85, _position.y + 10));
+ break;
+ default:
+ _sceneText1.setPosition(Common::Point(121, _position.y + 8));
+ _sceneText2.setPosition(Common::Point(123, _position.y + 10));
+ break;
+ }
+ } else {
+ hideIcon();
+ }
+}
+
+void Scene325::Icon::showIcon() {
+ _sceneText1.show();
+ _sceneText2.show();
+ _object1.show();
+ _object2.show();
+ show();
+}
+
+void Scene325::Icon::hideIcon() {
+ _sceneText1.hide();
+ _sceneText2.hide();
+ _object1.hide();
+ _object2.hide();
+ hide();
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene325::Scene325(): SceneExt() {
+ _field412 = 7;
+ _iconFontNumber = 50;
+ _field416 = _field418 = 0;
+ _field41A = _field41C = _field41E = _field420 = 0;
+ _soundCount = _soundIndex = 0;
+
+ for (int idx = 0; idx < 10; ++idx)
+ _soundQueue[idx] = 0;
+}
+
+void Scene325::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(325);
+
+ R2_GLOBALS.clearFlag(50);
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _palette.loadPalette(0);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.hide();
+ R2_GLOBALS._player.disableControl();
+
+ _item2.setDetails(1, 325, 3, 4, 5);
+ _background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 325, 0, 1, 2, 1, (SceneItem *)NULL);
+ _sceneMode = 1;
+ signal();
+}
+
+void Scene325::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field412);
+ s.syncAsSint16LE(_iconFontNumber);
+ s.syncAsSint16LE(_field416);
+ s.syncAsSint16LE(_field418);
+ s.syncAsSint16LE(_field41A);
+ s.syncAsSint16LE(_field41C);
+ s.syncAsSint16LE(_field41E);
+ s.syncAsSint16LE(_field420);
+ s.syncAsSint16LE(_soundCount);
+ s.syncAsSint16LE(_soundIndex);
+
+ for (int idx = 0; idx < 10; ++idx)
+ s.syncAsSint16LE(_soundQueue[idx]);
+}
+
+void Scene325::remove() {
+ removeText();
+ SceneExt::remove();
+}
+
+void Scene325::signal() {
+ switch (_sceneMode - 1) {
+ case 0:
+ _icon1.postInit();
+ _icon1._sceneRegionId = 2;
+ _icon2.postInit();
+ _icon2._sceneRegionId = 3;
+ _icon3.postInit();
+ _icon3._sceneRegionId = 4;
+ _icon4.postInit();
+ _icon4._sceneRegionId = 5;
+
+ setAction(&_sequenceManager1, this, 127, &_icon1, &_icon2, &_icon3, &_icon4,
+ &R2_GLOBALS._player, NULL);
+ _sceneMode = 2;
+ break;
+ case 1:
+ _icon1.setup(160, 1, 1);
+ _icon1.setPosition(Common::Point(65, 17));
+ _icon1._object2.postInit();
+ _icon1._object2.setup(160, 7, 1);
+ _icon1._object2.setPosition(Common::Point(106, 41));
+
+ _icon2.setup(160, 1, 1);
+ _icon2.setPosition(Common::Point(80, 32));
+ _icon2._object2.postInit();
+ _icon2._object2.setup(160, 7, 2);
+ _icon2._object2.setPosition(Common::Point(106, 56));
+
+ _icon3.setup(160, 1, 1);
+ _icon3.setPosition(Common::Point(65, 47));
+ _icon3._object2.postInit();
+ _icon3._object2.setup(160, 7, 1);
+ _icon3._object2.setPosition(Common::Point(106, 71));
+
+ _icon4.setup(160, 1, 1);
+ _icon4.setPosition(Common::Point(80, 62));
+ _icon4._sceneRegionId = 5;
+ _icon4._object2.postInit();
+ _icon4._object2.setup(160, 7, 2);
+ _icon4._object2.setPosition(Common::Point(106, 86));
+
+ _icon5.postInit();
+ _icon5.setup(160, 1, 1);
+ _icon5._sceneRegionId = 7;
+ _icon5.setPosition(Common::Point(37, 92));
+ _icon5.setIcon(8);
+
+ _icon6.postInit();
+ _icon6.setup(160, 1, 1);
+ _icon6.setPosition(Common::Point(106, 110));
+ _icon6.setIcon(7);
+ _icon6._sceneRegionId = 8;
+
+ consoleAction(7);
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ case 9:
+ switch (_field412) {
+ case 3:
+ _sceneMode = 129;
+ _object1.postInit();
+ _object2.postInit();
+ _object3.postInit();
+ if (R2_GLOBALS.getFlag(13)) {
+ _object4.postInit();
+ setAction(&_sequenceManager1, this, 130, &R2_GLOBALS._player, &_object1,
+ &_object2, &_object3, &_object4, NULL);
+ } else {
+ setAction(&_sequenceManager1, this, 129, &R2_GLOBALS._player, &_object1,
+ &_object2, &_object3, NULL);
+ }
+ break;
+ case 17:
+ case 18:
+ case 19:
+ case 20: {
+ int v = 10 - ((21 - _field412) * 2);
+ if (R2_GLOBALS.getFlag(50))
+ --v;
+ if (_field418 == 5)
+ v += 8;
+ if (R2_GLOBALS.getFlag(51) && (v == 2))
+ R2_GLOBALS.setFlag(57);
+
+ if (R2_GLOBALS.getFlag(44) && !R2_GLOBALS.getFlag(51)) {
+ if (v != 13) {
+ setMessage(328, 0);
+ } else {
+ _field420 = 864;
+
+ _object12.postInit();
+ _object2.setup(326, 4, 1);
+ _object12.setPosition(Common::Point(149, 128));
+ _object12.fixPriority(20);
+
+ _object13.postInit();
+ _object13.setup(326, 4, 2);
+ _object13.setPosition(Common::Point(149, (int)(_field420 * ADJUST_FACTOR)));
+ _object13.fixPriority(21);
+
+ _object10.postInit();
+ _object10.setup(326, 1, 1);
+ _object10.setPosition(Common::Point(210, 20));
+ _object10.fixPriority(10);
+
+ _object1.postInit();
+ _object1.setup(326, 1, 1);
+ _object1.setPosition(Common::Point(210, 32));
+ _object10.fixPriority(10);
+
+ _object2.postInit();
+ _object2.setup(326, 1, 1);
+ _object2.setPosition(Common::Point(210, 44));
+ _object2.fixPriority(10);
+
+ _object3.postInit();
+ _object3.setup(326, 1, 1);
+ _object3.setPosition(Common::Point(210, 56));
+ _object3.fixPriority(10);
+
+ _object4.postInit();
+ _object4.setup(326, 1, 1);
+ _object4.setPosition(Common::Point(210, 68));
+ _object4.fixPriority(10);
+
+ _object5.postInit();
+ _object5.setup(326, 1, 1);
+ _object5.setPosition(Common::Point(210, 80));
+ _object5.fixPriority(10);
+
+ _object6.postInit();
+ _object6.setup(326, 1, 1);
+ _object6.setPosition(Common::Point(210, 92));
+ _object6.fixPriority(10);
+
+ _object7.postInit();
+ _object7.setup(326, 1, 1);
+ _object7.setPosition(Common::Point(210, 104));
+ _object7.fixPriority(10);
+
+ _object8.postInit();
+ _object8.setup(326, 1, 1);
+ _object8.setPosition(Common::Point(210, 116));
+ _object8.fixPriority(10);
+
+ _object9.postInit();
+ _object9.setup(326, 1, 1);
+ _object9.setPosition(Common::Point(210, 128));
+ _object9.fixPriority(10);
+
+ _object11.postInit();
+ _object11.setup(326, 1, 1);
+ _object11.setPosition(Common::Point(210, 150));
+ _object11.fixPriority(10);
+ }
+ } else if (R2_GLOBALS.getFlag(51)) {
+ setMessage(329, (v == 12) ? 10 : v);
+ } else {
+ setMessage(327, (v < 15) ? 1 : v);
+ }
+ break;
+ }
+ case 21:
+ _sceneMode = 129;
+
+ _object1.postInit();
+ _object1.setup(327, 1, 1);
+ _object1.setPosition(Common::Point(170, 80));
+ _object1.fixPriority(10);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ case 22:
+ _sceneMode = 129;
+
+ _object1.postInit();
+ _object1.setup(327, 2, 1);
+ _object1.setPosition(Common::Point(160, 80));
+ _object1.fixPriority(10);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ case 24:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ _field416 = 37;
+ setMessage(128, _field416);
+ break;
+ case 25:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ _field416 = 68;
+ setMessage(128, _field416);
+ break;
+ case 26:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ _field416 = 105;
+ setMessage(128, _field416);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ _field416 = 105;
+ setMessage(128, _field416);
+ break;
+ }
+ break;
+ case 10:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+
+ if ((_field412 >= 17) && (_field412 <= 20)) {
+ _icon5.setIcon(8);
+ consoleAction(4);
+ } else {
+ consoleAction(7);
+ }
+
+ _icon6.setIcon(7);
+ break;
+ case 11:
+ R2_GLOBALS.setFlag(45);
+ R2_GLOBALS._sceneManager.changeScene(300);
+ break;
+ case 12:
+ R2_GLOBALS.setFlag(57);
+ R2_GLOBALS._sceneManager.changeScene(300);
+ break;
+ case 14:
+ if (_soundCount)
+ --_soundCount;
+
+ if (!_soundCount || (R2_GLOBALS._speechSubtitles == 2)) {
+ _soundIndex = 0;
+ R2_GLOBALS._playStream.stop();
+ } else {
+ _sceneMode = 15;
+ R2_GLOBALS._playStream.play(_soundQueue[_soundIndex], this);
+ }
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ }
+}
+
+void Scene325::removeText() {
+ _text1.remove();
+ _soundCount = 0;
+ _soundIndex = 0;
+ R2_GLOBALS._playStream.stop();
+}
+
+void Scene325::consoleAction(int id) {
+ _icon1.setIcon(0);
+ _icon2.setIcon(0);
+ _icon3.setIcon(0);
+ _icon4.setIcon(0);
+
+ if (id == 7)
+ _icon5.setIcon(9);
+ else if ((_field412 != 3) && ((_field412 < 17) || (_field412 > 26)))
+ _icon5.setIcon(8);
+
+ switch (id - 1) {
+ case 0:
+ _icon1.setIcon(10);
+ _icon2.setIcon(11);
+ break;
+ case 1:
+ _icon1.setIcon(23);
+ _icon2.setIcon(24);
+ _icon3.setIcon(25);
+ _icon4.setIcon(26);
+ case 2:
+ case 16:
+ case 17:
+ case 18:
+ case 19:
+ case 20:
+ case 21:
+ R2_GLOBALS._player.disableControl();
+ consoleAction(7);
+ _icon1.hideIcon();
+ _icon2.hideIcon();
+ _icon3.hideIcon();
+ // TODO: Finish
+ break;
+ case 3:
+ _icon1.setIcon(5);
+ _icon2.setIcon(6);
+ _icon3.setIcon(R2_GLOBALS.getFlag(50) ? 16 : 15);
+ break;
+ case 4:
+ case 5:
+ _field418 = id;
+ _icon1.setIcon(17);
+ _icon2.setIcon(18);
+ _icon3.setIcon(19);
+ break;
+ case 7:
+ consoleAction(((_field412 == 5) || (_field412 == 6) || (_field412 == 15)) ? 4 : 7);
+ break;
+ case 8:
+ R2_GLOBALS._sceneManager.changeScene(300);
+ case 9:
+ case 10:
+ _iconFontNumber = (id - 1) == 9 ? 50 : 52;
+ _text1.remove();
+ _icon6.setIcon(7);
+ break;
+ case 11:
+ if (R2_GLOBALS.getFlag(57) && (R2_GLOBALS._player._characterIndex == 1) && !R2_GLOBALS.getFlag(25)) {
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ _sceneMode = 13;
+ _stripManager.start(403, this);
+ } else {
+ R2_GLOBALS._player.disableControl();
+ _text1.remove();
+
+ _icon4.setPosition(Common::Point(80, 62));
+ _icon4._sceneRegionId = 5;
+ _icon4.hideIcon();
+
+ _object12.remove();
+ _object13.remove();
+ _object10.remove();
+ _object1.remove();
+ _object2.remove();
+ _object3.remove();
+ _object4.remove();
+ _object5.remove();
+ _object6.remove();
+ _object7.remove();
+ _object8.remove();
+ _object9.remove();
+ _object11.remove();
+
+ _palette.loadPalette(160);
+ _sceneMode = 11;
+
+ BF_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
+ }
+ break;
+ case 12:
+ _icon4.setIcon(14);
+ _icon4._object2.hide();
+
+ switch (_field412) {
+ case 17:
+ case 18:
+ case 19:
+ case 20:
+ if (_field420) {
+ R2_GLOBALS._player.disableControl();
+ _field41A = 1296;
+ _field41E = 1;
+ }
+ break;
+ default:
+ setMessage(128, --_field416);
+ break;
+ }
+ return;
+ case 13:
+ _icon4.setIcon(14);
+ _icon4._object2.hide();
+
+ switch (_field412) {
+ case 17:
+ case 18:
+ case 19:
+ case 20:
+ if (_field420 < 1620) {
+ R2_GLOBALS._player.disableControl();
+ _field41A = 1296;
+ _field41E = -1;
+ }
+ break;
+ }
+ return;
+ case 14:
+ if (R2_GLOBALS.getFlag(55)) {
+ SceneItem::display2(329, 17);
+ } else {
+ R2_GLOBALS.setFlag(50);
+ consoleAction(4);
+ }
+ id = 4;
+ break;
+ case 15:
+ R2_GLOBALS.clearFlag(50);
+ consoleAction(4);
+ id = 4;
+ break;
+ case 22:
+ case 23:
+ case 24:
+ case 25:
+ R2_GLOBALS._player.disableControl();
+ consoleAction(2);
+ _field412 = id;
+
+ _icon1.hideIcon();
+ _icon2.hideIcon();
+ _icon3.hideIcon();
+ _icon4.hideIcon();
+
+ _icon5.setIcon(13);
+ _icon4.setPosition(Common::Point(52, 107));
+ _icon4._sceneRegionId = 9;
+ _icon4.setIcon(14);
+ _icon4._object2.hide();
+
+ _icon6.setIcon(12);
+ _sceneMode = 10;
+ _palette.loadPalette(161);
+
+ BF_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
+ break;
+ case 6:
+ default:
+ _icon1.setIcon(1);
+ _icon2.setIcon(2);
+ _icon3.setIcon(3);
+ int idList[3] = { 4, 22, 21 };
+ _icon4.setIcon(idList[R2_GLOBALS._player._characterIndex - 1]);
+ break;
+ }
+
+ if (id != 8)
+ _field412 = id;
+}
+
+void Scene325::process(Event &event) {
+ SceneExt::process(event);
+
+ if (R2_GLOBALS._player._uiEnabled) {
+ _icon1.process(event);
+ _icon2.process(event);
+ _icon3.process(event);
+ _icon4.process(event);
+ _icon5.process(event);
+ _icon6.process(event);
+ }
+}
+
+void Scene325::dispatch() {
+ if (_field41A) {
+ switch (_field41A) {
+ case 13:
+ _field41C = 1;
+ break;
+ case 1296:
+ R2_GLOBALS._sound3.play(87);
+ _field41C = 1;
+ break;
+ case 33:
+ case 1283:
+ _field41C = 2;
+ break;
+ case 63:
+ case 1263:
+ _field41C = 3;
+ break;
+ case 103:
+ case 1233:
+ _field41C = 4;
+ break;
+ case 153:
+ case 1193:
+ _field41C = 5;
+ break;
+ case 213:
+ case 1143:
+ _field41C = 6;
+ break;
+ case 283:
+ case 1083:
+ _field41C = 7;
+ break;
+ case 1013:
+ _field41C = 8;
+ break;
+ default:
+ break;
+ }
+
+ _field41A -= _field41C;
+ int yp = _field41E * _field41C + _object10._position.y;
+ bool flag = false;
+
+ if (yp >= 30) {
+ yp -= 12;
+ --_field420;
+ flag = true;
+ }
+ if (yp <= 10) {
+ yp += 12;
+ ++_field420;
+ flag = true;
+ }
+ _object3.setPosition(Common::Point(149, (int)(_field420 * ADJUST_FACTOR) + 22));
+
+ for (int idx = 0; idx < 4; ++idx)
+ _objList[idx].remove();
+
+ if (flag) {
+ int v = _field420 - 758;
+ _object10.setFrame((v++ <= 0) ? 1 : v);
+ _object1.setFrame((v++ <= 0) ? 1 : v);
+ _object2.setFrame((v++ <= 0) ? 1 : v);
+ _object3.setFrame((v++ <= 0) ? 1 : v);
+ _object4.setFrame((v++ <= 0) ? 1 : v);
+ _object5.setFrame((v++ <= 0) ? 1 : v);
+ _object6.setFrame((v++ <= 0) ? 1 : v);
+ _object7.setFrame((v++ <= 0) ? 1 : v);
+ _object8.setFrame((v++ <= 0) ? 1 : v);
+ _object9.setFrame((v++ <= 0) ? 1 : v);
+ _object11.setFrame((v++ <= 0) ? 1 : v);
+ }
+
+ _object10.setPosition(Common::Point(210, yp));
+ yp += 12;
+ _object1.setPosition(Common::Point(210, yp));
+ yp += 12;
+ _object2.setPosition(Common::Point(210, yp));
+ yp += 12;
+ _object3.setPosition(Common::Point(210, yp));
+ yp += 12;
+ _object4.setPosition(Common::Point(210, yp));
+ yp += 12;
+ _object5.setPosition(Common::Point(210, yp));
+ yp += 12;
+ _object6.setPosition(Common::Point(210, yp));
+ yp += 12;
+ _object7.setPosition(Common::Point(210, yp));
+ yp += 12;
+ _object8.setPosition(Common::Point(210, yp));
+ yp += 12;
+ _object9.setPosition(Common::Point(210, yp));
+ yp += 12;
+ _object11.setPosition(Common::Point(210, yp));
+
+ if (!_field41A) {
+ R2_GLOBALS._sound3.stop();
+ _field41C = 0;
+
+ if (_field420 == 756) {
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_USE);
+ _sceneMode = 12;
+ _stripManager.start(212, this);
+ } else {
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ }
+ }
+ }
+
+ SceneExt::dispatch();
+}
+
+void Scene325::setMessage(int resNum, int lineNum) {
+ Common::String msg = g_resourceManager->getMessage(resNum, lineNum);
+
+ if (!msg.empty()) {
+ Common::String msgText = parseMessage(msg);
+
+ _text1._fontNumber = _iconFontNumber;
+ _text1._color1 = 92;
+ _text1._color2 = 0;
+ _text1._width = 221;
+ _text1.fixPriority(20);
+ _text1.setup(msgText);
+ _text1.setPosition(Common::Point(49, 19));
+
+ R2_GLOBALS._sceneObjects->draw();
+
+ if ((_soundCount != 0) && (R2_GLOBALS._speechSubtitles != 2)) {
+ _sceneMode = 15;
+ R2_GLOBALS._playStream.play(_soundQueue[_soundIndex++], this);
+ }
+ } else {
+ _field412 = 13;
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._player.hide();
+
+ _icon4.setPosition(Common::Point(80, 62));
+ _icon4._sceneRegionId = 5;
+ _icon4.hideIcon();
+
+ _palette.loadPalette(160);
+ _sceneMode = 11;
+ BF_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
+ }
+}
+
+/**
+ * Parses a message to be displayed on the console to see whether there are any sounds to be played.
+ */
+Common::String Scene325::parseMessage(const Common::String &msg) {
+ _soundIndex = 0;
+ _soundCount = 0;
+
+ const char *msgP = msg.c_str();
+ while (*msgP == '!') {
+ // Get the sound number
+ _soundQueue[_soundCount++] = atoi(++msgP);
+
+ while (!((*msgP == '\0') || (*msgP < '0') || (*msgP > '9')))
+ ++msgP;
+ }
+
+ return Common::String(msgP);
+}
+/*--------------------------------------------------------------------------
+ * Scene 400 - Science Lab
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene400::Terminal::startAction(CursorType action, Event &event) {
+ Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 402;
+ scene->setAction(&scene->_sequenceManager1, scene, 402, &R2_GLOBALS._player, this, NULL);
+
+ return true;
+ } else {
+ return NamedHotspot::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene400::Door::startAction(CursorType action, Event &event) {
+ Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 401;
+ scene->setAction(&scene->_sequenceManager1, scene, 401, &R2_GLOBALS._player, this, NULL);
+
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene400::Reader::startAction(CursorType action, Event &event) {
+ Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 405;
+ scene->setAction(&scene->_sequenceManager1, scene, 405, &R2_GLOBALS._player, this, NULL);
+
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene400::SensorProbe::startAction(CursorType action, Event &event) {
+ Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 404;
+ scene->setAction(&scene->_sequenceManager1, scene, 404, &R2_GLOBALS._player, this, NULL);
+
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene400::AttractorUnit::startAction(CursorType action, Event &event) {
+ Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 406;
+ scene->setAction(&scene->_sequenceManager1, scene, 406, &R2_GLOBALS._player, this, NULL);
+
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene400::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(400);
+ _sound1.play(20);
+
+ _door.postInit();
+ _door.setVisage(100);
+ _door.setPosition(Common::Point(123, 84));
+ _door.setDetails(400, 24, -1, 26, 1, (SceneItem *)NULL);
+
+ _consoleDisplay.postInit();
+ _consoleDisplay.setup(400, 4, 1);
+ _consoleDisplay.setPosition(Common::Point(236, 92));
+ _consoleDisplay.fixPriority(120);
+ _consoleDisplay.animate(ANIM_MODE_2, NULL);
+ _consoleDisplay._numFrames = 5;
+
+ _testerDisplay.postInit();
+ _testerDisplay.setup(400, 2, 1);
+ _testerDisplay.setPosition(Common::Point(198, 83));
+ _testerDisplay.animate(ANIM_MODE_2, NULL);
+ _testerDisplay._numFrames = 20;
+
+ if (R2_INVENTORY.getObjectScene(R2_READER) == 400) {
+ _reader.postInit();
+ _reader.setup(400, 5, 2);
+ _reader.setPosition(Common::Point(301, 95));
+ _reader.setDetails(400, 54, -1, 56, 1, (SceneItem *)NULL);
+ }
+
+ if (R2_INVENTORY.getObjectScene(R2_SENSOR_PROBE) == 400) {
+ _sensorProbe.postInit();
+ _sensorProbe.setup(400, 5, 1);
+ _sensorProbe.setPosition(Common::Point(251, 104));
+ _sensorProbe.fixPriority(121);
+ _sensorProbe.setDetails(400, 57, -1, 59, 1, (SceneItem *)NULL);
+ }
+
+ if (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_UNIT) == 400) {
+ _attractorUnit.postInit();
+ _attractorUnit.setup(400, 5, 3);
+ _attractorUnit.setPosition(Common::Point(265, 129));
+ _attractorUnit.setDetails(400, 60, -1, 62, 1, (SceneItem *)NULL);
+ }
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.setVisage(10);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.disableControl();
+
+ _equipment1.setDetails(11, 400, 3, -1, -1);
+ _equipment2.setDetails(24, 400, 3, -1, -1);
+ _equipment3.setDetails(25, 400, 3, -1, -1);
+ _equipment4.setDetails(26, 400, 3, -1, -1);
+ _equipment5.setDetails(28, 400, 3, -1, -1);
+ _equipment6.setDetails(29, 400, 3, -1, -1);
+ _desk.setDetails(12, 400, 6, -1, -1);
+ _desk2.setDetails(27, 400, 6, -1, -1);
+ _terminal.setDetails(13, 400, 6, -1, 11);
+ _duct.setDetails(14, 400, 12, -1, -1);
+ _console.setDetails(15, 400, 15, -1, 17);
+ _equalizer.setDetails(Rect(284, 99, 308, 108), 400, 36, -1, 38, 1, NULL);
+ _transducer.setDetails(Rect(295, 67, 314, 79), 400, 39, -1, 41, 1, NULL);
+ _optimizer.setDetails(Rect(308, 106, 315, 113), 400, 42, -1, 44, 1, NULL);
+ _soundModule.setDetails(Rect(291, 118, 315, 131), 400, 45, -1, 47, 1, NULL);
+ _tester.setDetails(Rect(179, 62, 217, 92), 400, 30, -1, 32, 1, NULL);
+ _helmet.setDetails(Rect(181, 53, 197, 65), 400, 48, -1, 50, 1, NULL);
+ _nullifier.setDetails(Rect(201, 56, 212, 65), 400, 51, -1, 50, 1, NULL);
+ _shelves.setDetails(16, 400, 18, -1, 20);
+ _cabinet.setDetails(17, 400, 21, -1, -1);
+ _doorDisplay.setDetails(Rect(161, 43, 166, 52), 400, 27, -1, -1, 1, NULL);
+ _lights.setDetails(Rect(113, 3, 168, 14), 400, 33, -1, -1, 1, NULL);
+ _background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 400, 0, 1, -1, 1, NULL);
+
+ _sceneMode = 400;
+ switch (R2_GLOBALS._sceneManager._previousScene) {
+ case 125:
+ setAction(&_sequenceManager1, this, 403, &R2_GLOBALS._player, NULL);
+ break;
+ case 200:
+ setAction(&_sequenceManager1, this, 400, &R2_GLOBALS._player, &_door, NULL);
+ break;
+ default:
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.setPosition(Common::Point(180, 100));
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene400::remove() {
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene400::signal() {
+ switch (_sceneMode) {
+ case 400:
+ case 403:
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 401:
+ R2_GLOBALS._sceneManager.changeScene(200);
+ break;
+ case 402:
+ R2_GLOBALS._sceneManager.changeScene(125);
+ break;
+ case 404:
+ // Getting the sensor probe
+ R2_INVENTORY.setObjectScene(R2_SENSOR_PROBE, 1);
+ _sensorProbe.remove();
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 405:
+ // Getting the reader
+ R2_INVENTORY.setObjectScene(R2_READER, 1);
+ _reader.remove();
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 406:
+ R2_INVENTORY.setObjectScene(R2_ATTRACTOR_UNIT, 1);
+ _attractorUnit.remove();
+ R2_GLOBALS._player.enableControl();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene400::dispatch() {
+ SceneExt::dispatch();
+
+ switch (R2_GLOBALS._player.getRegionIndex() - 15) {
+ case 0:
+ case 11:
+ case 12:
+ R2_GLOBALS._player._shade = 2;
+ break;
+ case 9:
+ R2_GLOBALS._player._shade = 0;
+ break;
+ case 10:
+ R2_GLOBALS._player._shade = 1;
+ break;
+ case 13:
+ R2_GLOBALS._player._shade = 3;
+ break;
+ case 14:
+ R2_GLOBALS._player._shade = 4;
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 500 - Lander Bay 2 Storage
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene500::ControlPanel::startAction(CursorType action, Event &event) {
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_QUINN)) {
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_GLOBALS.getFlag(26)) {
+ scene->_stripNumber = 1104;
+ scene->_sceneMode = 524;
+ scene->setAction(&scene->_sequenceManager1, scene, 524, &R2_GLOBALS._player, NULL);
+ } else {
+ scene->_sceneMode = 510;
+ scene->setAction(&scene->_sequenceManager1, scene, 510, &R2_GLOBALS._player, NULL);
+ }
+ return true;
+ } else {
+ return SceneHotspot::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene500::Object2::startAction(CursorType action, Event &event) {
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_TALK) {
+ R2_GLOBALS._player.disableControl();
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ scene->_stripNumber = R2_GLOBALS.getFlag(26) ? 1101 : 1103;
+ } else {
+ scene->_stripNumber = R2_GLOBALS.getFlag(26) ? 1102 : 1105;
+ }
+
+ scene->setAction(&scene->_sequenceManager1, scene, 524, &R2_GLOBALS._player, NULL);
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene500::Object3::startAction(CursorType action, Event &event) {
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(500, R2_GLOBALS.getFlag(28) ? 28 : _strip + 25);
+ return true;
+
+ case CURSOR_USE:
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ if ((_strip != 3) && (_strip != 7))
+ SceneItem::display2(500, _strip);
+ else if (R2_GLOBALS.getFlag(26)) {
+ R2_GLOBALS._player.disableControl();
+ scene->_stripNumber = 1103;
+ scene->_sceneMode = 524;
+ scene->setAction(&scene->_sequenceManager1, scene, 524, &R2_GLOBALS._player, NULL);
+ } else if (!R2_GLOBALS.getFlag(28))
+ SceneItem::display2(500, 41);
+ else if (!R2_GLOBALS.getFlag(40))
+ SceneItem::display2(500, 40);
+ else {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 512;
+ scene->setAction(&scene->_sequenceManager1, scene, 524, &R2_GLOBALS._player, &scene->_object3, NULL);
+ R2_GLOBALS.setFlag(26);
+ }
+ } else {
+ SceneItem::display2(500, 42);
+ }
+ return true;
+
+ case R2_REBREATHER_TANK:
+ if (!R2_GLOBALS.getFlag(25))
+ SceneItem::display2(500, 10);
+ else if (_strip != 3)
+ SceneItem::display2(500, _strip + 25);
+ else {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 515;
+ scene->setAction(&scene->_sequenceManager1, scene, 515, &R2_GLOBALS._player, &scene->_object3, NULL);
+ R2_GLOBALS.setFlag(28);
+ }
+ return true;
+
+ case R2_RESERVE_REBREATHER_TANK:
+ SceneItem::display2(500, 53);
+ return true;
+
+ default:
+ if (action < R2_LAST_INVENT) {
+ SceneItem::display2(500, action);
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+ }
+}
+
+bool Scene500::Doorway::startAction(CursorType action, Event &event) {
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_QUINN)) {
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_GLOBALS.getFlag(26)) {
+ scene->_stripNumber = 1104;
+ scene->_sceneMode = 524;
+ scene->setAction(&scene->_sequenceManager1, scene, 524, &R2_GLOBALS._player, NULL);
+ } else {
+ scene->_sceneMode = 500;
+ scene->setAction(&scene->_sequenceManager1, scene, 500, &R2_GLOBALS._player, NULL);
+ }
+
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene500::OxygenTanks::startAction(CursorType action, Event &event) {
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(500, R2_INVENTORY.getObjectScene(R2_REBREATHER_TANK) ? 50 : 49);
+ return true;
+
+ case CURSOR_USE:
+ if (R2_GLOBALS._player._characterIndex != R2_QUINN) {
+ SceneItem::display2(500, 52);
+ return true;
+ } else if ((R2_INVENTORY.getObjectScene(R2_REBREATHER_TANK) != 1) &&
+ (R2_GLOBALS._player._characterIndex != R2_SEEKER) && !R2_GLOBALS.getFlag(28)) {
+ R2_GLOBALS._player.disableControl();
+
+ if (_position.y == 120) {
+ scene->_sceneMode = 513;
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player,
+ &scene->_tanks1, NULL);
+ } else {
+ scene->_sceneMode = 514;
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player,
+ &scene->_tanks2, NULL);
+ }
+ return true;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return SceneActor::startAction(action, event);
+}
+
+bool Scene500::AirLock::startAction(CursorType action, Event &event) {
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action == CURSOR_USE) && R2_GLOBALS.getFlag(26)) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = (R2_GLOBALS._player._characterIndex == R2_QUINN) ? 521 : 522;
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player,
+ &scene->_object2, &scene->_airLock, NULL);
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene500::Aerosol::startAction(CursorType action, Event &event) {
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 503;
+ scene->setAction(&scene->_sequenceManager1, scene, 503, &R2_GLOBALS._player, this, NULL);
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene500::SonicStunner::startAction(CursorType action, Event &event) {
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_QUINN)) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = R2_GLOBALS.getFlag(26) ? 520 : 502;
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene500::Locker1::startAction(CursorType action, Event &event) {
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_QUINN)) {
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_GLOBALS.getFlag(11))
+ scene->_sceneMode = R2_GLOBALS.getFlag(26) ? 517 : 505;
+ else
+ scene->_sceneMode = R2_GLOBALS.getFlag(26) ? 516 : 504;
+
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, this, NULL);
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene500::Locker2::startAction(CursorType action, Event &event) {
+ Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_QUINN)) {
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_GLOBALS.getFlag(12))
+ scene->_sceneMode = R2_GLOBALS.getFlag(26) ? 519 : 507;
+ else
+ scene->_sceneMode = R2_GLOBALS.getFlag(26) ? 518 : 506;
+
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, this, NULL);
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene500::Object::startAction(CursorType action, Event &event) {
+ if (action == CURSOR_USE) {
+ return false;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene500::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(500);
+
+ Common::fill(&_buffer[0], &_buffer[2710], 0);
+ _stripManager.setColors(60, 255);
+ _stripManager.setFontNumber(50);
+ _stripManager.addSpeaker(&_seekerSpeaker);
+ _stripManager.addSpeaker(&_quinnSpeaker);
+
+ if (R2_GLOBALS.getFlag(25)) {
+ R2_GLOBALS._player._characterScene[R2_SEEKER] = 500;
+
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ R2_GLOBALS._walkRegions.disableRegion(1);
+
+ _object2.postInit();
+ _object2._effect = 1;
+ _object2.setup(1505, 1, 1);
+ _object2._moveDiff.x = 5;
+ _object2.setPosition(Common::Point(42, 151));
+ _object2.setDetails(500, 34, 35, 36, 1, (SceneItem *)NULL);
+ } else if (R2_GLOBALS._player._characterScene[R2_QUINN] == 500) {
+ _object2.postInit();
+ _object2._effect = 1;
+ _object2.setup(R2_GLOBALS.getFlag(26) ? 1500 : 10, 1, 1);
+ _object2.setPosition(Common::Point(42, 151));
+
+ R2_GLOBALS._walkRegions.disableRegion(1);
+ R2_GLOBALS._walkRegions.disableRegion(2);
+ R2_GLOBALS._walkRegions.disableRegion(3);
+
+ _object2.setDetails(500, 37, 38, -1, 1, (SceneItem *)NULL);
+ }
+ }
+
+ if ((R2_INVENTORY.getObjectScene(R2_REBREATHER_TANK) != 500) && R2_GLOBALS.getFlag(27)) {
+ _tanks1.postInit();
+ _tanks1.setup(502, 7, 1);
+ _tanks1.setPosition(Common::Point(281, 120));
+ _tanks1.setDetails(500, -1, -1, -1, 1, (SceneItem *)NULL);
+ } else {
+ if (R2_INVENTORY.getObjectScene(R2_REBREATHER_TANK) == 500) {
+ _tanks1.postInit();
+ _tanks1.setup(502, 7, 1);
+ _tanks1.setPosition(Common::Point(281, 120));
+ _tanks1.setDetails(500, -1, -1, -1, 1, (SceneItem *)NULL);
+ }
+
+ _tanks2.postInit();
+ _tanks2.setup(502, 7, 1);
+ _tanks2.setPosition(Common::Point(286, 121));
+ _tanks2.setDetails(500, -1, -1, -1, 1, (SceneItem *)NULL);
+ }
+
+ _doorway.postInit();
+ _doorway.setup(501, 1, 1);
+ _doorway.setPosition(Common::Point(132, 85));
+ _doorway.setDetails(500, 15, -1, 17, 1, (SceneItem *)NULL);
+
+ _airLock.postInit();
+ _airLock.setup(501, 2, 1);
+ _airLock.setPosition(Common::Point(41, 121));
+
+ if (!R2_GLOBALS.getFlag(25))
+ _airLock.setDetails(500, 6, -1, 10, 1, (SceneItem *)NULL);
+ else if ((R2_GLOBALS._player._characterScene[R2_QUINN] != 500) ||
+ (R2_GLOBALS._player._characterScene[R2_SEEKER] != 500))
+ _airLock.setDetails(500, 6, -1, 40, 1, (SceneItem *)NULL);
+ else
+ _airLock.setDetails(500, 6, -1, 9, 1, (SceneItem *)NULL);
+
+ _locker1.postInit();
+ _locker1.setup(500, 3, R2_GLOBALS.getFlag(11) ? 6 : 1);
+ _locker1.setPosition(Common::Point(220, 82));
+ _locker1.setDetails(500, 27, -1, -1, 1, (SceneItem *)NULL);
+
+ _locker2.postInit();
+ _locker2.setup(500, 4, R2_GLOBALS.getFlag(12) ? 6 : 1);
+ _locker2.setPosition(Common::Point(291, 98));
+ _locker2.fixPriority(121);
+ _locker2.setDetails(500, 27, -1, -1, 1, (SceneItem *)NULL);
+
+ if (R2_INVENTORY.getObjectScene(R2_AEROSOL) == 500) {
+ _aerosol.postInit();
+ _aerosol.setup(500, 5, 2);
+ _aerosol.setPosition(Common::Point(286, 91));
+ _aerosol.fixPriority(120);
+ _aerosol.setDetails(500, 24, 25, 26, 1, (SceneItem *)NULL);
+ }
+
+ if (R2_INVENTORY.getObjectScene(R2_SONIC_STUNNER) == 500) {
+ _sonicStunner.postInit();
+ _sonicStunner.setup(500, 5, 1);
+ _sonicStunner.setPosition(Common::Point(214, 76));
+ _sonicStunner.setDetails(500, 21, 22, 23, 1, (SceneItem *)NULL);
+ }
+
+ _object1.postInit();
+ _object1._effect = 1;
+ _object1.setup(502, 1, 1);
+ _object1.setPosition(Common::Point(258, 99));
+ _object1.fixPriority(50);
+
+ _object8.postInit();
+ _object8.setPosition(Common::Point(250, 111));
+
+ if (!R2_GLOBALS.getFlag(35)) {
+ _object8.setup(501, 3, 1);
+ } else {
+ _object8.setup(500, 8, 7);
+
+ _object3.postInit();
+ _object3._effect = 1;
+ _object3.setPosition(Common::Point(247, 52));
+ _object3.setDetails(500, -1, -1, -1, 2, (SceneItem *)NULL);
+
+ if (!R2_GLOBALS.getFlag(26)) {
+ if (R2_GLOBALS.getFlag(28))
+ _object3.setup(502, 7, 2);
+ else
+ _object3.setup(502, R2_GLOBALS._v566A3 + 2, 7);
+ }
+ }
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.setVisage(10);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
+ R2_GLOBALS._player._moveDiff.x = 5;
+
+ _controlPanel.setDetails(Rect(175, 62, 191, 80), 500, 31, 32, 33, 1, (SceneItem *)NULL);
+ _item2.setDetails(Rect(13, 58, 70, 118), 500, 12, -1, -1, 1, (SceneItem *)NULL);
+ _background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 500, 0, -1, -1, 1, (SceneItem *)NULL);
+
+ if ((R2_GLOBALS._player._characterIndex == R2_QUINN) && (R2_GLOBALS._sceneManager._previousScene == 700)) {
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 501;
+ setAction(&_sequenceManager1, this, 501, &R2_GLOBALS._player, &_doorway, NULL);
+ } else {
+ if (R2_GLOBALS._player._characterIndex != R2_QUINN) {
+ R2_GLOBALS._player.setup(1505, 6, 1);
+ } else {
+ R2_GLOBALS._player.setup(R2_GLOBALS.getFlag(26) ? 1500 : 10, 6, 1);
+ }
+
+ R2_GLOBALS._player.setPosition(Common::Point(123, 135));
+ R2_GLOBALS._player.enableControl();
+ }
+}
+
+void Scene500::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ s.syncAsSint16LE(_stripNumber);
+}
+
+void Scene500::signal() {
+ switch (_sceneMode) {
+ case 3:
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 5:
+ _sceneMode = 12;
+ _sound1.play(127);
+ _object1.animate(ANIM_MODE_6, this);
+
+ R2_GLOBALS.clearFlag(35);
+ _object3.remove();
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 6:
+ _sceneMode = 11;
+ _sound1.play(127);
+ _object1.animate(ANIM_MODE_5, this);
+
+ R2_GLOBALS.clearFlag(35);
+ _object3.remove();
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 7:
+ _sound1.play(126);
+ _object8.animate(ANIM_MODE_6, this);
+
+ R2_GLOBALS.clearFlag(35);
+ _object3.remove();
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 500:
+ R2_GLOBALS._sceneManager.changeScene(700);
+ break;
+ case 501:
+ if (R2_GLOBALS._player._characterScene[R2_QUINN] == 500) {
+ _stripNumber = 1100;
+ _sceneMode = 523;
+ setAction(&_sequenceManager1, this, 523, &R2_GLOBALS._player, NULL);
+ } else {
+ R2_GLOBALS._player.enableControl();
+ }
+ break;
+ case 502:
+ case 520:
+ R2_INVENTORY.setObjectScene(R2_SONIC_STUNNER, 1);
+ _sonicStunner.remove();
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 503:
+ R2_INVENTORY.setObjectScene(R2_AEROSOL, 1);
+ _aerosol.remove();
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 504:
+ case 516:
+ R2_GLOBALS.setFlag(11);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 505:
+ case 517:
+ R2_GLOBALS.clearFlag(11);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 506:
+ case 518:
+ R2_GLOBALS.setFlag(11);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 507:
+ case 519:
+ R2_GLOBALS.clearFlag(12);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 509:
+ R2_GLOBALS.clearFlag(35);
+ _object3.remove();
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 510:
+ R2_GLOBALS._player.enableControl();
+ _area1.setDetails(500, 6, 1, Common::Point(160, 120));
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 513:
+ R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 1);
+ _tanks1.remove();
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 514:
+ R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 1);
+ R2_GLOBALS.setFlag(27);
+ _tanks2.remove();
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 515:
+ R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 0);
+ R2_GLOBALS.setFlag(28);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 521:
+ case 522:
+ R2_GLOBALS._sceneManager.changeScene(525);
+ break;
+ case 523:
+ case 524:
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ _sceneMode = 8;
+ _stripManager.start(_stripNumber, this);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+
+/*--------------------------------------------------------------------------
+ * Scene 525 - Cutscene - Walking in hall
+ *
+ *--------------------------------------------------------------------------*/
+void Scene525::postInit(SceneObjectList *OwnerList) {
+ loadScene(525);
+ R2_GLOBALS._uiElements._active = false;
+ SceneExt::postInit();
+
+ R2_GLOBALS._sound1.play(105);
+
+ _actor1.postInit();
+ _actor1._effect = 1;
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.disableControl();
+
+ setAction(&_sequenceManager, this, 525, &R2_GLOBALS._player, &_actor1, NULL);
+}
+
+void Scene525::signal() {
+ R2_GLOBALS._sceneManager.changeScene(1525);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 600 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene600::Scene600() {
+ _field412 = 0;
+ for (int i = 0; i < 256; i++)
+ _fieldAD2[i] = 0;
+}
+
+void Scene600::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field412);
+ for (int i = 0; i < 256; i++)
+ s.syncAsByte(_fieldAD2[i]);
+}
+
+bool Scene600::Item1::startAction(CursorType action, Event &event) {
+ if ((action != R2_NEGATOR_GUN) || (!R2_GLOBALS.getFlag(5)) || (R2_GLOBALS.getFlag(8)))
+ return SceneHotspot::startAction(action, event);
+
+ SceneItem::display(600, 32, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ return true;
+}
+
+bool Scene600::Item4::startAction(CursorType action, Event &event) {
+ if ((action != R2_NEGATOR_GUN) || (!R2_GLOBALS.getFlag(1)))
+ return SceneHotspot::startAction(action, event);
+
+ if ((R2_GLOBALS.getFlag(5)) && (!R2_GLOBALS.getFlag(8))) {
+ SceneItem::display(600, 32, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ return true;
+ }
+
+ if (R2_GLOBALS.getFlag(5)) {
+ SceneItem::display(600, 30, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ return true;
+ }
+
+ if ((!R2_GLOBALS.getFlag(8)) || (R2_GLOBALS.getFlag(9)))
+ return SceneHotspot::startAction(action, event);
+
+ R2_GLOBALS._player.disableControl();
+
+ Scene600 *scene = (Scene600 *)R2_GLOBALS._sceneManager._scene;
+
+ scene->_object1.setup2(603, 3, 1, 239, 54, 10, 0);
+ scene->_actor3.postInit();
+ scene->_actor2.postInit();
+
+ scene->_sceneMode = 612;
+ setAction(&scene->_sequenceManager1, this, 612, &scene->_actor3, &scene->_actor2, &R2_GLOBALS._player, NULL);
+ return true;
+}
+
+void Scene600::Actor4::signal() {
+ Common::Point pt(36, 177 + R2_GLOBALS._randomSource.getRandomNumber(5));
+ NpcMover *mover = new NpcMover();
+ addMover(mover, &pt, this);
+}
+
+bool Scene600::Actor4::startAction(CursorType action, Event &event) {
+ if ((action >= CURSOR_WALK) && (action < R2CURSORS_START))
+ // Only action cursors
+ return SceneActor::startAction(action, event);
+
+ return false;
+}
+
+void Scene600::Actor4::draw() {
+ warning("TODO: Actor4::draw()");
+ SceneActor::draw();
+}
+
+bool Scene600::Actor5::startAction(CursorType action, Event &event) {
+ if ((action < CURSOR_WALK) && (action >= R2CURSORS_START))
+ return false;
+
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ Scene600 *scene = (Scene600 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((R2_INVENTORY.getObjectScene(R2_CLAMP) == 600) && (!R2_GLOBALS.getFlag(6))) {
+ R2_GLOBALS._player.disableControl();
+ scene->_actor6.setDetails(600, 11, -1, -1, 3, (SceneItem *) NULL);
+ R2_GLOBALS.setFlag(6);
+ scene->_sceneMode = 609;
+ scene->setAction(&scene->_sequenceManager1, scene, 609, &R2_GLOBALS._player, &scene->_actor5, &scene->_actor6, &scene->_actor1, NULL);
+ return true;
+ }
+
+ if (_frame != 1)
+ return false;
+
+ if (!R2_GLOBALS.getFlag(6)) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 616;
+ scene->setAction(&scene->_sequenceManager1, scene, 616, &R2_GLOBALS._player, &scene->_actor5, &scene->_actor6, NULL);
+ return true;
+ }
+
+ if ((R2_GLOBALS.getFlag(9)) && (R2_INVENTORY.getObjectScene(R2_COM_SCANNER) == 600))
+ SceneItem::display(600, 31, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ else {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 601;
+ scene->setAction(&scene->_sequenceManager1, scene, 601, &R2_GLOBALS._player, &scene->_actor5, NULL);
+ }
+ return true;
+}
+
+bool Scene600::Actor6::startAction(CursorType action, Event &event) {
+ Scene600 *scene = (Scene600 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action < CURSOR_WALK) && (action >= R2CURSORS_START)) {
+ switch (action) {
+ case R2_COM_SCANNER:
+ if (R2_GLOBALS.getFlag(6)) {
+ if (R2_GLOBALS.getFlag(8)) {
+ SceneItem::display(600, 29, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ return true;
+ } else {
+ R2_GLOBALS._player.disableControl();
+ scene->_actor8.postInit();
+ scene->_actor8.setDetails(600, 20, -1, -1, 4, &scene->_actor6);
+ scene->_sceneMode = 607;
+ scene->setAction(&scene->_sequenceManager1, scene, 607, &R2_GLOBALS._player, &scene->_actor8, NULL);
+ return true;
+ }
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+ break;
+ case R2_AEROSOL:
+ if (R2_GLOBALS.getFlag(5)) {
+ SceneItem::display(600, 28, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ return true;
+ } else {
+ R2_GLOBALS._player.disableControl();
+ scene->_actor7.postInit();
+ scene->_actor7.setDetails(600, 27, -1, -1, 5, &scene->_actor6);
+
+ scene->_actor4.postInit();
+ scene->_actor4.setup(601, 3, 1);
+ scene->_actor4._effect = 3;
+ scene->_actor4._moveDiff = Common::Point(1, 1);
+ scene->_actor4._moveRate = 2;
+ scene->_actor4._numFrames = 3;
+ scene->_actor4.setDetails(600, 24, 25, 26, 5, &scene->_actor7);
+
+ scene->_sceneMode = 605;
+
+ scene->setAction(&scene->_sequenceManager1, scene, 605, &R2_GLOBALS._player, &scene->_actor7, &scene->_actor4, &scene->_actor5, NULL);
+ return true;
+ }
+ break;
+ case R2_CLAMP:
+ if (R2_GLOBALS.getFlag(5)) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 606;
+ scene->setAction(&scene->_sequenceManager1, scene, 606, &R2_GLOBALS._player, &scene->_actor6, NULL);
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+ break;
+ default:
+ return false;
+ break;
+ }
+ } else if (action != CURSOR_USE) {
+ if (R2_GLOBALS.getFlag(5)) {
+ return SceneActor::startAction(action, event);
+ } else {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 610;
+ scene->setAction(&scene->_sequenceManager1, scene, 610, &scene->_actor1, &R2_GLOBALS._player, NULL);
+ return true;
+ }
+ } else
+ return SceneActor::startAction(action, event);
+}
+
+bool Scene600::Actor7::startAction(CursorType action, Event &event) {
+ Scene600 *scene = (Scene600 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action < CURSOR_WALK) && (action >= R2CURSORS_START)) {
+ return false;
+ } else if (action == CURSOR_USE) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 614;
+ scene->setAction(&scene->_sequenceManager1, scene, 614, &R2_GLOBALS._player, &scene->_actor7, NULL);
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene600::Actor8::startAction(CursorType action, Event &event) {
+ Scene600 *scene = (Scene600 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action == CURSOR_USE) && (R2_INVENTORY.getObjectScene(9) == 600)) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 615;
+ scene->setAction(&scene->_sequenceManager1, scene, 615, &R2_GLOBALS._player, &scene->_actor8, NULL);
+ } else if ((action == R2_SONIC_STUNNER) && (R2_INVENTORY.getObjectScene(9) == 600) && (R2_GLOBALS._v565F1[1] == 2) && (!R2_GLOBALS.getFlag(8))){
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 608;
+ scene->setAction(&scene->_sequenceManager1, scene, 608, &R2_GLOBALS._player, &scene->_actor4, NULL);
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+
+ return true;
+}
+
+void Scene600::postInit(SceneObjectList *OwnerList) {
+ loadScene(600);
+ SceneExt::postInit();
+ R2_GLOBALS.setFlag(39);
+ R2_GLOBALS._walkRegions.enableRegion(3);
+ _field412 = 0;
+
+ warning("FIXME: loop to initialize _fieldAD2[]");
+
+ _actor5.postInit();
+ _actor5.setVisage(600);
+ _actor5.setPosition(Common::Point(29, 147));
+ _actor5.fixPriority(10);
+ _actor5.setDetails(300, 3, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor6.postInit();
+ _actor6.setPosition(Common::Point(246, 41));
+
+ if (R2_INVENTORY.getObjectScene(9) == 600) {
+ _actor8.postInit();
+ _actor8.setup(602, 5, 1);
+ _actor8.setPosition(Common::Point(246, 41));
+ _actor8.setDetails(600, 20, -1, -1, 1, (SceneItem *) NULL);
+ switch (R2_GLOBALS._v565F1[1] - 2) {
+ case 0:
+ R2_GLOBALS._sound4.play(45);
+ break;
+ case 1:
+ R2_GLOBALS._sound4.play(4);
+ break;
+ case 2:
+ R2_GLOBALS._sound4.play(5);
+ break;
+ case 3:
+ R2_GLOBALS._sound4.play(6);
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (R2_GLOBALS.getFlag(6)) {
+ _actor6.setup(602, 7, 1);
+ _actor6.setDetails(600, 11, -1, -1, 1, (SceneItem *) NULL);
+ } else {
+ _actor6.setup(600, 2, 1);
+ _actor6.setDetails(600, 10, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor1.postInit();
+ _actor1.setup(600, 3, 5);
+ _actor1.setPosition(Common::Point(223, 51));
+ _actor1.fixPriority(200);
+ }
+
+ if (! R2_GLOBALS.getFlag(9))
+ _object1.setup2(603, 1, 1, 244, 50, 10, 0);
+
+ if (R2_GLOBALS.getFlag(5)) {
+ if (R2_INVENTORY.getObjectScene(12) == 600) {
+ _actor7.postInit();
+ _actor7.setup(602, 2, 2);
+ _actor7.setPosition(Common::Point(189, 95));
+ _actor7.setDetails(600, 27, -1, -1, 1, (SceneItem *) NULL);
+ }
+
+ if (R2_GLOBALS.getFlag(8)) {
+ if (R2_GLOBALS.getFlag(9)) {
+ _actor2.postInit();
+ _actor2.setup(603, 2, 1);
+ _actor2.setPosition(Common::Point(233, 45));
+ _actor2.animate(ANIM_MODE_2, NULL);_actor2.fixPriority(11);
+ }
+ } else {
+ _actor4.postInit();
+ _actor4.setup(601, 1, 1);
+ _actor4.setPosition(Common::Point(180, 110));
+ _actor4._moveDiff = Common::Point(1, 1);
+ _actor4._moveRate = 2;
+ _actor4._numFrames = 3;
+ _actor4.animate(ANIM_MODE_2, NULL);
+ _actor4.fixPriority(130);
+ _actor4._effect = 3;
+ _actor4.setDetails(600, 24, 25, 26, 1, (SceneItem *) NULL);
+ _actor4.signal();
+ }
+ }
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.setVisage(10);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.disableControl();
+
+ _item2.setDetails(12, 600, 17, -1, 19);
+ _item3.setDetails(11, 600, 14, -1, -1);
+
+ if (R2_GLOBALS.getFlag(9)) {
+ _item1.setDetails(Rect(159, 3, 315, 95), 600, 7, -1, -1, 1, NULL);
+ } else {
+ _item4.setDetails(Rect(173, 15, 315, 45), 600, 21, -1, 23, 1, NULL);
+ _item1.setDetails(Rect(159, 3, 315, 95), 600, 6, -1, -1, 1, NULL);
+ }
+ _item5.setDetails(Rect(0, 0, 320, 200), 600, 0, -1, -1, 1, NULL);
+
+ _sceneMode = 600;
+ if (R2_GLOBALS._sceneManager._previousScene == 700) {
+ if (R2_GLOBALS.getFlag(6)) {
+ setAction(&_sequenceManager1, this, 600, &R2_GLOBALS._player, &_actor5, NULL);
+ } else if (R2_GLOBALS.getFlag(5)) {
+ setAction(&_sequenceManager1, this, 603, &R2_GLOBALS._player, &_actor5, &_actor6, &_actor1, NULL);
+ } else {
+ setAction(&_sequenceManager1, this, 602, &R2_GLOBALS._player, &_actor5, &_actor6, &_actor1, NULL);
+ }
+ } else if (R2_GLOBALS.getFlag(5)) {
+ R2_GLOBALS._player.setPosition(Common::Point(50, 140));
+ R2_GLOBALS._player.setStrip(3);
+ _actor6.setFrame(_actor6.getFrameCount());
+ signal();
+ } else {
+ _actor5.setFrame(7);
+ _actor6.setFrame(7);
+ R2_GLOBALS._player.setPosition(Common::Point(28, 140));
+ R2_GLOBALS._player.setStrip(5);
+ signal();
+ }
+}
+
+void Scene600::remove() {
+ if (R2_INVENTORY.getObjectScene(9) == 600)
+ R2_GLOBALS._sound4.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene600::signal() {
+ switch (_sceneMode) {
+ case 601:
+ // No break on purpose
+ case 613:
+ // No break on purpose
+ case 616:
+ R2_GLOBALS._sceneManager.changeScene(700);
+ break;
+ case 605:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._walkRegions.enableRegion(6);
+ R2_GLOBALS._walkRegions.enableRegion(7);
+ R2_GLOBALS._walkRegions.enableRegion(9);
+ R2_GLOBALS._walkRegions.enableRegion(10);
+
+ R2_INVENTORY.setObjectScene(12, 600);
+ R2_GLOBALS.setFlag(5);
+
+ _actor4._effect = 3;
+ _actor4.signal();
+ break;
+ case 606:
+ R2_INVENTORY.setObjectScene(15, 600);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 607:
+ R2_INVENTORY.setObjectScene(9, 600);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 608:
+ R2_GLOBALS.setFlag(8);
+ _actor4.remove();
+ R2_GLOBALS._walkRegions.disableRegion(6);
+ R2_GLOBALS._walkRegions.disableRegion(9);
+ R2_GLOBALS._walkRegions.disableRegion(10);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 612:
+ R2_GLOBALS.setFlag(9);
+ _actor3.remove();
+ R2_GLOBALS._sceneItems.remove(&_item4);
+ _actor2.setDetails(600, 21, -1, 23, 4, &_item4);
+ _item1.setDetails(600, 7, -1, -1, 3, (SceneItem *) NULL);
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ break;
+ case 614:
+ R2_GLOBALS._player.enableControl();
+ _actor7.remove();
+ R2_INVENTORY.setObjectScene(12, 1);
+ R2_GLOBALS._walkRegions.disableRegion(7);
+ break;
+ case 615:
+ _actor8.remove();
+ R2_INVENTORY.setObjectScene(9, 1);
+ R2_GLOBALS._player.enableControl();
+ break;
+ default:
+ _field412 = 0;
+ _sceneMode = 0;
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene600::process(Event &event) {
+ if ((!R2_GLOBALS._player._canWalk) && (!R2_GLOBALS.getFlag(6)) && (event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == R2_NEGATOR_GUN)) {
+ if (!_actor5.contains(event.mousePos) || (_actor5._frame <= 1)) {
+ if (R2_GLOBALS.getFlag(5)) {
+ _field412 += 10;
+ } else {
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 604;
+ setAction(&_sequenceManager1, this, 604, &_actor1, &R2_GLOBALS._player, NULL);
+ event.handled = true;
+ }
+ } else {
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 613;
+ setAction(&_sequenceManager1, this, 613, &R2_GLOBALS._player, &_actor6, NULL);
+ event.handled = true;
+ }
+ } else if ((!R2_GLOBALS.getFlag(6)) && (R2_GLOBALS._player._mover) && (_field412 < 10)){
+ _field412 += 10;
+ }
+
+ Scene::process(event);
+}
+
+void Scene600::dispatch() {
+ if ((_field412 != 0) && (_sceneMode != 600) && (_sceneMode != 603) && (_sceneMode != 602)) {
+ if ( ((_actor6._strip == 4) && (_actor6._frame > 1))
+ || (_sceneMode == 601)
+ || ((_sceneMode == 616) && (_actor5._frame > 1)) )
+ _field412 = 0;
+ else {
+ _field412--;
+ if (_field412 % 10 == 0) {
+ _actor1.setAction(&_sequenceManager2, NULL, 611, &_actor1, NULL);
+ }
+ if ((_field412 == 0) && (R2_GLOBALS._player._mover))
+ _field412 = 10;
+ }
+ }
+
+ if (_actor1._frame == 2)
+ _aSound1.play(40);
+
+ Scene::dispatch();
+ if ((_actor4._strip == 3) && (_actor4._frame == 3)) {
+ _actor1.setStrip(4);
+ _actor1.setFrame(1);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 700 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene700::Scene700() {
+ _rotation = NULL;
+}
+
+void Scene700::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ SYNC_POINTER(_rotation);
+}
+
+bool Scene700::Item11::startAction(CursorType action, Event &event) {
+ if ((action == CURSOR_USE) && (R2_GLOBALS._player._position.x < 100))
+ return false;
+
+ return NamedHotspot::startAction(action, event);
+}
+
+bool Scene700::Item12::startAction(CursorType action, Event &event) {
+ Scene700 *scene = (Scene700 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case R2_CABLE_HARNESS:
+ R2_GLOBALS._player.disableControl();
+ scene->_actor5.postInit();
+ scene->_actor5.setup(701, 3, 2);
+ scene->_actor5.setPosition(Common::Point(243, 98));
+ scene->_actor5.setDetails(700, 37, -1, -1, 2, (SceneItem *) NULL);
+ scene->_actor5.hide();
+ scene->_sceneMode = 20;
+ break;
+ case R2_ATTRACTOR_CABLE_HARNESS:
+ R2_GLOBALS._player.disableControl();
+ scene->_actor5.postInit();
+ scene->_actor5.setup(701, 2, 8);
+ scene->_actor5.setPosition(Common::Point(243, 98));
+ scene->_actor5.setDetails(700, 38, -1, -1, 2, (SceneItem *) NULL);
+ scene->_actor5.hide();
+ scene->_sceneMode = 21;
+ break;
+ default:
+ return NamedHotspot::startAction(action, event);
+ break;
+ }
+
+ scene->setAction(&scene->_sequenceManager, this, 707, &R2_GLOBALS._player, &scene->_actor5, NULL);
+ return true;
+}
+
+bool Scene700::Actor2::startAction(CursorType action, Event &event) {
+ Scene700 *scene = (Scene700 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ if (R2_GLOBALS._player._position.y <= 100)
+ return false;
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 701;
+ scene->setAction(&scene->_sequenceManager, scene, 701, &R2_GLOBALS._player, this, NULL);
+
+ return true;
+}
+
+bool Scene700::Actor3::startAction(CursorType action, Event &event) {
+ Scene700 *scene = (Scene700 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ if (R2_GLOBALS._player._position.y <= 100)
+ return false;
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 702;
+ scene->setAction(&scene->_sequenceManager, scene, 702, &R2_GLOBALS._player, this, NULL);
+
+ return true;
+}
+
+bool Scene700::Actor4::startAction(CursorType action, Event &event) {
+ Scene700 *scene = (Scene700 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ if (R2_GLOBALS._player._position.y <= 100)
+ return false;
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 704;
+ scene->setAction(&scene->_sequenceManager, scene, 704, &R2_GLOBALS._player, this, NULL);
+
+ return true;
+}
+
+bool Scene700::Actor5::startAction(CursorType action, Event &event) {
+ Scene700 *scene = (Scene700 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ switch (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS)) {
+ case 0:
+ if ((_strip == 2) && (_frame == 1)) {
+ R2_GLOBALS._player.disableControl();
+ if (R2_GLOBALS._player._position.x <= 100) {
+ scene->_sceneMode = 710;
+ scene->setAction(&scene->_sequenceManager, scene, 710, &R2_GLOBALS._player, this, NULL);
+ } else {
+ scene->_sceneMode = 709;
+ scene->setAction(&scene->_sequenceManager, scene, 709, &R2_GLOBALS._player, this, NULL);
+ }
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+ break;
+ case 700: {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 10;
+ Common::Point pt(_position.x - 12, _position.y + 1);
+ PlayerMover *mover = new PlayerMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ case R2_ATTRACTOR_UNIT:
+ R2_GLOBALS._player.disableControl();
+ if (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 700) {
+ scene->_sceneMode = 706;
+ scene->setAction(&scene->_sequenceManager, scene, 706, &R2_GLOBALS._player, &scene->_actor5, NULL);
+ } else {
+ scene->_sceneMode = 15;
+ Common::Point pt(_position.x - 12, _position.y + 1);
+ PlayerMover *mover = new PlayerMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ }
+ break;
+ default:
+ return SceneActor::startAction(action, event);
+ break;
+ }
+
+ return true;
+}
+
+bool Scene700::Actor6::startAction(CursorType action, Event &event) {
+ Scene700 *scene = (Scene700 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action != CURSOR_USE) || (R2_GLOBALS._player._position.y >= 100))
+ return SceneActor::startAction(action, event);
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1;
+ Common::Point pt(_position.x, 69);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+
+ return true;
+}
+
+void Scene700::postInit(SceneObjectList *OwnerList) {
+ if (R2_GLOBALS._sceneManager._previousScene == 900)
+ g_globals->gfxManager()._bounds.moveTo(Common::Point(160, 0));
+
+ loadScene(700);
+ R2_GLOBALS._v558B6.set(60, 0, 260, 200);
+ SceneExt::postInit();
+
+ _rotation = R2_GLOBALS._scenePalette.addRotation(237, 246, -1);
+ _rotation->setDelay(5);
+ _rotation->_countdown = 1;
+
+ _actor2.postInit();
+ _actor2.setVisage(700);
+ _actor2.setPosition(Common::Point(21, 128));
+ _actor2.fixPriority(10);
+ _actor2.setDetails(700, 3, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor3.postInit();
+ _actor3.setup(700, 2, 1);
+ _actor3.setPosition(Common::Point(217, 120));
+ _actor3.fixPriority(10);
+ _actor3.setDetails(700, 15, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor1.postInit();
+ _actor1.setup(700, 4, 1);
+ _actor1.setPosition(Common::Point(355 - ((R2_GLOBALS._v565E3 * 8) / 5), ((R2_GLOBALS._v565E1 + 20 ) / 5) - 12));
+ _actor1.fixPriority(10);
+ _actor1.setDetails(700, 12, -1, 14, 1, (SceneItem *) NULL);
+
+ _actor6.postInit();
+ _actor6.setup(700, 8, 1);
+ _actor6.setPosition(Common::Point(85, 53));
+ _actor6.setDetails(700, 33, -1, 35, 1, (SceneItem *) NULL);
+
+ _actor7.postInit();
+ _actor7.setup(700, 8, 1);
+ _actor7.setPosition(Common::Point(164, 53));
+ _actor7.setDetails(700, 33, -1, 35, 1, (SceneItem *) NULL);
+
+ _actor8.postInit();
+ _actor8.setup(700, 8, 1);
+ _actor8.setPosition(Common::Point(243, 53));
+ _actor8.setDetails(700, 33, -1, 35, 1, (SceneItem *) NULL);
+
+ _actor9.postInit();
+ _actor9.setup(700, 8, 1);
+ _actor9.setPosition(Common::Point(324, 53));
+ _actor9.setDetails(700, 33, -1, 35, 1, (SceneItem *) NULL);
+
+ if ((R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) != 1) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) != 1)) {
+ _actor5.postInit();
+ _actor5.fixPriority(10);
+ switch (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS)) {
+ case 0:
+ switch (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS)) {
+ case 0:
+ _actor5.setup(701, 3, 2);
+ _actor5.setPosition(Common::Point(243, 98));
+ _actor5.setDetails(700, 37, -1, -1, 1, (SceneItem *) NULL);
+ break;
+ case 700:
+ _actor5.setup(701, 3, 1);
+ _actor5.setPosition(Common::Point(356 - (R2_GLOBALS._v565EB * 8), 148 - (((R2_GLOBALS._v565E9 + 10) / 5) * 4)));
+ _actor5.setDetails(700, 37, -1, -1, 1, (SceneItem *) NULL);
+ break;
+ default:
+ break;
+ }
+ break;
+ case 700:
+ switch (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS)) {
+ case 0:
+ if ((R2_GLOBALS._v565E5 != 0) && (R2_GLOBALS._v565E1 == 20) && (R2_GLOBALS._v565E3 == 70))
+ _actor5.setup(701, 2, 1);
+ else
+ _actor5.setup(701, 2, 8);
+ _actor5.setPosition(Common::Point(243, 98));
+ _actor5.fixPriority(77);
+ _actor5.setDetails(700, 38, -1, -1, 1, (SceneItem *) NULL);
+ break;
+ case 700:
+ _actor5.setup(701, 1, 8);
+ if (R2_GLOBALS._v565E7 == 0) {
+ _actor5.setPosition(Common::Point(356 - (R2_GLOBALS._v565EB * 8), 148 - (((R2_GLOBALS._v565E9 + 10) / 5) * 4)));
+ } else {
+ _actor5.setup(701, 1, 1);
+ _actor5.setPosition(Common::Point(_actor1._position.x + 1, _actor1._position.y + 120));
+ }
+ _actor5.setDetails(700, 38, -1, -1, 1, (SceneItem *) NULL);
+ break;
+ default:
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ _actor4.postInit();
+ _actor4.setup(700, 3, 1);
+ _actor4.setPosition(Common::Point(454, 117));
+ _actor4.setDetails(700, 27, -1, -1, 1, (SceneItem *) NULL);
+
+ _item12.setDetails(Rect(234, 90, 252, 110), 700, 39, -1, -1, 1, NULL);
+ _item6.setDetails(Rect(91, 158, 385, 167), 700, 6, -1, 8, 1, NULL);
+ _item2.setDetails(Rect(47, 115, 149, 124), 700, 40, -1, 41, 1, NULL);
+ _item3.setDetails(Rect(151, 108, 187, 124), 700, 40, -1, 41, 1, NULL);
+ _item4.setDetails(Rect(247, 108, 275, 124), 700, 40, -1, 41, 1, NULL);
+ _item5.setDetails(Rect(300, 105, 321, 124), 700, 40, -1, 41, 1, NULL);
+ _item7.setDetails(Rect(255, 74, 368, 115), 700, 9, -1, 11, 1, NULL);
+ _item8.setDetails(Rect(69, 74, 182, 115), 700, 9, -1, 11, 1, NULL);
+ _item9.setDetails(Rect(370, 58, 475, 103), 700, 18, -1, -1, 1, NULL);
+ _item10.setDetails(Rect(17, 11, 393, 31), 700, 24, -1, -1, 1, NULL);
+ _item11.setDetails(Rect(42, 32, 368, 66), 700, 30, -1, 32, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 480, 200), 700, 0, -1, -1, 1, NULL);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.setVisage(11);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player._moveDiff.x = 2;
+ R2_GLOBALS._player.disableControl();
+
+ R2_GLOBALS._sound1.play(34);
+
+ _sceneMode = 700;
+
+ switch (R2_GLOBALS._sceneManager._previousScene) {
+ case 250:
+ setAction(&_sequenceManager, this, 700, &R2_GLOBALS._player, &_actor2, NULL);
+ break;
+ case 500:
+ setAction(&_sequenceManager, this, 703, &R2_GLOBALS._player, &_actor3, NULL);
+ break;
+ case 600: {
+ _sceneMode = 4;
+ _actor7.setFrame(5);
+ R2_GLOBALS._player.setPosition(Common::Point(164, 74));
+ R2_GLOBALS._player.setStrip2(3);
+ Common::Point pt(164, 69);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 900:
+ setAction(&_sequenceManager, this, 705, &R2_GLOBALS._player, &_actor4, NULL);
+ break;
+ default:
+ if (R2_GLOBALS.getFlag(41))
+ R2_GLOBALS._player.setPosition(Common::Point(107, 67));
+ else
+ R2_GLOBALS._player.setPosition(Common::Point(60, 140));
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ break;
+ }
+}
+
+void Scene700::remove() {
+ R2_GLOBALS._sound1.play(10);
+// CHECKME: Present in the original... But it crashes badly.
+// The instruction was removed as it's not used in other scene coded the same way
+// and reversed by dreammaster. A double check is required in order to verify it doesn't hide
+// a memory leak
+// _rotation->remove();
+ SceneExt::remove();
+}
+
+void Scene700::signal() {
+ switch (_sceneMode) {
+ case 1:
+ _sceneMode = 2;
+ R2_GLOBALS._player.setStrip(4);
+ if (R2_GLOBALS._player._position.x != 164) {
+ SceneItem::display(700, 36, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ R2_GLOBALS._player.enableControl();
+ } else {
+ R2_GLOBALS._sound2.play(19);
+ _actor7.animate(ANIM_MODE_5, this);
+ }
+ break;
+ case 2: {
+ _sceneMode = 3;
+ R2_GLOBALS._player.setStrip2(4);
+ Common::Point pt(R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y + 5);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 3:
+ R2_INVENTORY.setObjectScene(5, 600);
+ R2_INVENTORY.setObjectScene(16, 700);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 4:
+ _sceneMode = 5;
+ R2_GLOBALS._player.setStrip2(-1);
+ R2_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ R2_GLOBALS._sound2.play(19);
+ _actor7.animate(ANIM_MODE_6, this);
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS.setFlag(41);
+ break;
+ case 10:
+ _sceneMode = 11;
+ R2_GLOBALS._player.setup(16, 7, 1);
+ R2_GLOBALS._player.changeZoom(50);
+ R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 11:
+ _sceneMode = 12;
+ _actor5.remove();
+ R2_GLOBALS._player.animate(ANIM_MODE_6, this);
+ break;
+ case 12:
+ R2_GLOBALS._player.setVisage(11);
+ R2_GLOBALS._player.changeZoom(100);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ R2_GLOBALS._player._strip = 7;
+ if (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_UNIT) == 0) {
+ R2_INVENTORY.setObjectScene(R2_ATTRACTOR_CABLE_HARNESS, 1);
+ R2_INVENTORY.setObjectScene(R2_CABLE_HARNESS, 0);
+ } else {
+ R2_INVENTORY.setObjectScene(R2_CABLE_HARNESS, 1);
+ }
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 15:
+ _sceneMode = 16;
+ R2_GLOBALS._player.setup(16, 7, 1);
+ R2_GLOBALS._player.changeZoom(50);
+ R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 16:
+ _sceneMode = 17;
+ _actor5.setup(701, 1, 8);
+ _actor5.setDetails(700, 38, -1, -1, 3, (SceneItem *) NULL);
+ if ((R2_GLOBALS._v565E5 != 0) && (_actor5._position.x == _actor1._position.x + 1) && (_actor5._position.x == 148 - (((R2_GLOBALS._v565E1 + 10) / 5) * 4))) {
+ _actor5.animate(ANIM_MODE_6, NULL);
+ Common::Point pt(_actor5._position.x, _actor1._position.y + 120);
+ NpcMover *mover = new NpcMover();
+ _actor5.addMover(mover, &pt, NULL);
+ R2_GLOBALS._v565E7 = 1;
+ }
+ R2_GLOBALS._player.animate(ANIM_MODE_6, this);
+ break;
+ case 17:
+ R2_INVENTORY.setObjectScene(R2_ATTRACTOR_UNIT, 0);
+ R2_INVENTORY.setObjectScene(R2_ATTRACTOR_CABLE_HARNESS, 700);
+ R2_GLOBALS._player.setVisage(11);
+ R2_GLOBALS._player.changeZoom(100);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ R2_GLOBALS._player._strip = 7;
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 20:
+ R2_INVENTORY.setObjectScene(R2_CABLE_HARNESS, 0);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 21:
+ _actor5.fixPriority(77);
+ if ((R2_GLOBALS._v565E5 != 0) && (R2_GLOBALS._v565E1 == 20) && (R2_GLOBALS._v565E3 == 70))
+ _actor5.animate(ANIM_MODE_6, NULL);
+
+ R2_INVENTORY.setObjectScene(R2_ATTRACTOR_CABLE_HARNESS, 700);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 701:
+ R2_GLOBALS._sceneManager.changeScene(250);
+ break;
+ case 702:
+ R2_GLOBALS._sceneManager.changeScene(500);
+ break;
+ case 704:
+ R2_GLOBALS._sceneManager.changeScene(900);
+ break;
+ case 706:
+ _actor5.setDetails(700, 38, -1, -1, 3, (SceneItem *) NULL);
+ _actor5.fixPriority(77);
+ if ((R2_GLOBALS._v565E5 != 0) && (R2_GLOBALS._v565E1 == 20) && (R2_GLOBALS._v565E3 == 70))
+ _actor5.animate(ANIM_MODE_6, NULL);
+ R2_INVENTORY.setObjectScene(R2_ATTRACTOR_UNIT, 0);
+ R2_INVENTORY.setObjectScene(R2_ATTRACTOR_CABLE_HARNESS, 700);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 709:
+ R2_GLOBALS.setFlag(41);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 710:
+ R2_GLOBALS.clearFlag(41);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 5:
+ // No break on purpose
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 800 - Sick Bay
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene800::Button::startAction(CursorType action, Event &event) {
+ Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE) {
+ return NamedHotspot::startAction(action, event);
+ } else {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 802;
+ scene->setAction(&scene->_sequenceManager1, scene, 802, &R2_GLOBALS._player, &scene->_autodocCover, NULL);
+ return true;
+ }
+}
+
+bool Scene800::CableJunction::startAction(CursorType action, Event &event) {
+ Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != R2_OPTICAL_FIBRE) {
+ return NamedHotspot::startAction(action, event);
+ } else {
+ R2_GLOBALS._player.disableControl();
+ scene->_opticalFibre.postInit();
+ scene->_sceneMode = 803;
+
+ if (R2_INVENTORY.getObjectScene(R2_READER) == 800)
+ scene->setAction(&scene->_sequenceManager1, scene, 813, &R2_GLOBALS._player, &scene->_opticalFibre, &scene->_reader, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager1, scene, 803, &R2_GLOBALS._player, &scene->_opticalFibre, NULL);
+
+ return true;
+ }
+}
+
+bool Scene800::DeviceSlot::startAction(CursorType action, Event &event) {
+ Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (R2_INVENTORY.getObjectScene(R2_READER) != 800)
+ break;
+
+ R2_GLOBALS._player.disableControl();
+ scene->_reader.postInit();
+
+ if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBRE) == 800)
+ scene->setAction(&scene->_sequenceManager1, scene, 814, &R2_GLOBALS._player, &scene->_reader, &scene->_opticalFibre, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager1, scene, 804, &R2_GLOBALS._player, &scene->_reader, NULL);
+ return true;
+ default:
+ break;
+ }
+
+ return NamedHotspot::startAction(action, event);
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene800::Door::startAction(CursorType action, Event &event) {
+ Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 801;
+ scene->setAction(&scene->_sequenceManager1, scene, 801, &R2_GLOBALS._player, &scene->_door, NULL);
+ return true;
+ default:
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene800::Tray::startAction(CursorType action, Event &event) {
+ Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (!R2_GLOBALS.getFlag(10)) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 806;
+ scene->setAction(&scene->_sequenceManager1, scene, 806, &R2_GLOBALS._player, &scene->_tray, NULL);
+ } else if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 825) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 808;
+ scene->setAction(&scene->_sequenceManager1, scene, 808, &R2_GLOBALS._player, &scene->_tray, NULL);
+ } else {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 807;
+ scene->setAction(&scene->_sequenceManager1, scene, 807, &R2_GLOBALS._player, &scene->_tray, NULL);
+ }
+ return true;
+ default:
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene800::ComScanner::startAction(CursorType action, Event &event) {
+ Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (scene->_cabinet._frame == 1)
+ return false;
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 811;
+ scene->setAction(&scene->_sequenceManager1, scene, 811, &R2_GLOBALS._player, &scene->_comScanner, NULL);
+ return true;
+ case CURSOR_TALK:
+ SceneItem::display2(800, 35);
+ return true;
+ default:
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene800::Cabinet::startAction(CursorType action, Event &event) {
+ Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ R2_GLOBALS._player.disableControl();
+
+ if (scene->_cabinet._frame == 1) {
+ scene->_sceneMode = 810;
+ scene->setAction(&scene->_sequenceManager1, scene, 810, &R2_GLOBALS._player, &scene->_cabinet, NULL);
+ R2_GLOBALS.setFlag(56);
+ } else {
+ scene->_sceneMode = 812;
+ scene->setAction(&scene->_sequenceManager1, scene, 812, &R2_GLOBALS._player, &scene->_cabinet, NULL);
+ R2_GLOBALS.clearFlag(56);
+ }
+ return true;
+ default:
+ return SceneActor::startAction(action, event);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene800::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(800);
+
+ _door.postInit();
+ _door.setVisage(800);
+ _door.setPosition(Common::Point(286, 108));
+ _door.fixPriority(50);
+ _door.setDetails(800, 3, -1, -1, 1, (SceneItem *)NULL);
+
+ _autodocCover.postInit();
+ _autodocCover.setup(800, 2, 1);
+ _autodocCover.setPosition(Common::Point(119, 161));
+ _autodocCover.setDetails(800, 6, 7, -1, 1, (SceneItem *)NULL);
+
+ if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBRE) == 800) {
+ _opticalFibre.postInit();
+ if (R2_INVENTORY.getObjectScene(R2_READER) == 800)
+ _opticalFibre.setup(800, 4, 1);
+ else
+ _opticalFibre.setup(800, 7, 2);
+
+ _opticalFibre.setPosition(Common::Point(220, 124));
+ _opticalFibre.fixPriority(140);
+ }
+
+ if (R2_INVENTORY.getObjectScene(R2_READER) == 800) {
+ _reader.postInit();
+
+ if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBRE) == 800) {
+ _opticalFibre.setup(800, 4, 1);
+ _reader.hide();
+ } else {
+ _reader.setup(800, 7, 1);
+ }
+
+ _reader.setPosition(Common::Point(230, 120));
+ _reader.fixPriority(140);
+ }
+
+ _cabinet.postInit();
+ _cabinet.setup(801, 1, R2_GLOBALS.getFlag(56) ? 6 : 1);
+ _cabinet.setPosition(Common::Point(169, 79));
+ _cabinet.setDetails(800, 41, -1, -1, 1, (SceneItem *)NULL);
+
+ if (R2_INVENTORY.getObjectScene(R2_COM_SCANNER) == 800) {
+ _comScanner.postInit();
+ _comScanner.setup(801, 2, 1);
+ _comScanner.setPosition(Common::Point(174, 73));
+ _comScanner.setDetails(800, 34, 35, -1, 1, (SceneItem *)NULL);
+ }
+
+ _tray.postInit();
+ _tray.setup(800, R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 825 ? 6 : 5, 1);
+ if (R2_GLOBALS.getFlag(10))
+ _tray.setFrame(5);
+ _tray.setPosition(Common::Point(203, 144));
+ _tray.setDetails(800, 12, -1, 14, 1, (SceneItem *)NULL);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.setVisage(10);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.disableControl();
+
+ _dataConduits.setDetails(13, 800, 21, -1, -1);
+ _cableJunction.setDetails(Rect(206, 111, 223, 125), 800, 24, -1, -1, 1, NULL);
+ _deviceSlot.setDetails(Rect(220, 108, 239, 122), 800, 27, -1, -1, 1, NULL);
+ _diskSlot.setDetails(Rect(209, 124, 226, 133), 800, 9, -1, 11, 1, NULL);
+
+ if (R2_INVENTORY.getObjectScene(R2_READER) == 800)
+ _deviceSlot._lookLineNum = 33;
+
+ _button.setDetails(Rect(189, 112, 204, 124), 800, 30, -1, -1, 1, NULL);
+ _couch.setDetails(11, 800, 15, -1, 17);
+ _autoDoc.setDetails(Rect(152, 92, 247, 151), 800, 6, 7, -1, 1, NULL);
+ _medicalDatabase.setDetails(12, 800, 18, -1, -1);
+ _background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 800, 0, -1, -1, 1, NULL);
+
+ switch (R2_GLOBALS._sceneManager._previousScene) {
+ case 825:
+ _sceneMode = 800;
+ setAction(&_sequenceManager1, this, 805, &R2_GLOBALS._player, &_autodocCover, NULL);
+ break;
+ case 850:
+ _sceneMode = 800;
+ setAction(&_sequenceManager1, this, 800, &R2_GLOBALS._player, &_door, NULL);
+ break;
+ default:
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.setPosition(Common::Point(277, 132));
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene800::signal() {
+ switch (_sceneMode) {
+ case 801:
+ R2_GLOBALS._sceneManager.changeScene(850);
+ break;
+ case 802:
+ R2_GLOBALS._sceneManager.changeScene(825);
+ break;
+ case 803:
+ R2_GLOBALS._player.enableControl();
+ R2_INVENTORY.setObjectScene(R2_OPTICAL_FIBRE, 800);
+ break;
+ case 804:
+ R2_GLOBALS._player.enableControl();
+ _deviceSlot._lookLineNum = 33;
+ R2_INVENTORY.setObjectScene(R2_READER, 800);
+ break;
+ case 806:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS.setFlag(10);
+ break;
+ case 807:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS.clearFlag(10);
+ break;
+ case 808:
+ R2_GLOBALS._player.enableControl();
+ R2_INVENTORY.setObjectScene(R2_OPTO_DISK, 1);
+ break;
+ case 809:
+ R2_GLOBALS._player.enableControl();
+ R2_INVENTORY.setObjectScene(R2_READER, 1);
+ break;
+ case 811:
+ R2_GLOBALS._player.enableControl();
+ _comScanner.remove();
+ R2_INVENTORY.setObjectScene(R2_COM_SCANNER, 1);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 825 - Autodoc
+ *
+ *--------------------------------------------------------------------------*/
+
+Scene825::Button::Button(): SceneObject() {
+ _buttonId = 0;
+ _v2 = 0;
+ _buttonDown = false;
+}
+
+void Scene825::Button::synchronize(Serializer &s) {
+ SceneObject::synchronize(s);
+ s.syncAsSint16LE(_buttonId);
+ s.syncAsSint16LE(_v2);
+ s.syncAsSint16LE(_buttonDown);
+}
+
+void Scene825::Button::process(Event &event) {
+ Scene825 *scene = (Scene825 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!event.handled) {
+ if ((event.eventType == EVENT_BUTTON_DOWN) && _bounds.contains(event.mousePos) && !_buttonDown) {
+ scene->_sound1.play(14);
+ setFrame(2);
+ _buttonDown = true;
+ event.handled = true;
+ }
+
+ if ((event.eventType == EVENT_BUTTON_UP) && _buttonDown) {
+ setFrame(1);
+ _buttonDown = false;
+ event.handled = true;
+
+ scene->doButtonPress(_buttonId);
+ }
+ }
+}
+
+bool Scene825::Button::startAction(CursorType action, Event &event) {
+ if (action == CURSOR_USE)
+ return false;
+ else
+ return SceneObject::startAction(action, event);
+}
+
+void Scene825::Button::setButton(int buttonId) {
+ SceneObject::postInit();
+ _v2 = buttonId;
+ _buttonDown = 0;
+ _sceneText._color1 = 92;
+ _sceneText._color2 = 0;
+ _sceneText._width = 200;
+ _sceneText.fixPriority(20);
+ _sceneText._fontNumber = 50;
+
+ switch (buttonId) {
+ case 1:
+ _sceneText.setPosition(Common::Point(95, 58));
+ break;
+ case 2:
+ _sceneText.setPosition(Common::Point(98, 75));
+ break;
+ case 3:
+ _sceneText.setPosition(Common::Point(102, 95));
+ break;
+ case 4:
+ _sceneText.setPosition(Common::Point(180, 58));
+ _sceneText._textMode = ALIGN_RIGHT;
+ break;
+ case 5:
+ _sceneText.setPosition(Common::Point(177, 75));
+ _sceneText._textMode = ALIGN_RIGHT;
+ break;
+ case 6:
+ _sceneText.setPosition(Common::Point(175, 95));
+ _sceneText._textMode = ALIGN_RIGHT;
+ break;
+ default:
+ break;
+ }
+
+ setDetails(825, 6, 7, -1, 2, (SceneItem *)NULL);
+}
+
+void Scene825::Button::setText(int textId) {
+ Scene825 *scene = (Scene825 *)R2_GLOBALS._sceneManager._scene;
+
+ _buttonId = textId;
+ _lookLineNum = textId;
+
+ _sceneText.remove();
+ if (_buttonId != 0)
+ _sceneText.setup(scene->_autodocItems[textId - 1]);
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene825::Scene825(): SceneExt() {
+ _menuId = _frame1 = _frame2 = 0;
+
+ // Setup Autodoc items list
+ _autodocItems[0] = MAIN_MENU;
+ _autodocItems[1] = DIAGNOSIS;
+ _autodocItems[2] = ADVANCED_PROCEDURES;
+ _autodocItems[3] = VITAL_SIGNS;
+ _autodocItems[4] = OPEN_DOOR;
+ _autodocItems[5] = TREATMENTS;
+ _autodocItems[6] = NO_MALADY_DETECTED;
+ _autodocItems[7] = NO_TREATMENT_REQUIRED;
+ _autodocItems[8] = ACCESS_CODE_REQUIRED;
+ _autodocItems[9] = INVALID_ACCESS_CODE;
+ _autodocItems[10] = FOREIGN_OBJECT_EXTRACTED;
+}
+
+void Scene825::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(825);
+ R2_GLOBALS._player._uiEnabled = false;
+ BF_GLOBALS._interfaceY = 200;
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player._effect = 0;
+ R2_GLOBALS._player.setVisage(10);
+ R2_GLOBALS._player.hide();
+ R2_GLOBALS._player.disableControl();
+
+ _item2.setDetails(1, 825, 3, 4, 5);
+ _background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 825, 0, -1, -1, 1, NULL);
+
+ _sceneMode = 10;
+ signal();
+}
+
+void Scene825::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_menuId);
+ s.syncAsSint16LE(_frame1);
+ s.syncAsSint16LE(_frame2);
+}
+
+void Scene825::remove() {
+ SceneExt::remove();
+ R2_GLOBALS._player._uiEnabled = true;
+}
+
+void Scene825::signal() {
+ switch (_sceneMode) {
+ case 10:
+ _button1.setButton(1);
+ _button1.setup(825, 1, 1);
+ _button1.setPosition(Common::Point(71, 71));
+ _button2.setButton(2);
+ _button2.setup(825, 3, 1);
+ _button2.setPosition(Common::Point(74, 90));
+ _button3.setButton(3);
+ _button3.setup(825, 5, 1);
+ _button3.setPosition(Common::Point(78, 109));
+ _button4.setButton(4);
+ _button4.setup(825, 2, 1);
+ _button4.setPosition(Common::Point(248, 71));
+ _button5.setButton(5);
+ _button5.setup(825, 4, 1);
+ _button5.setPosition(Common::Point(245, 90));
+ _button6.setButton(6);
+ _button6.setup(825, 6, 1);
+ _button6.setPosition(Common::Point(241, 109));
+
+ doButtonPress(1);
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ case 825:
+ _object5.remove();
+ _sceneText._color1 = 92;
+ _sceneText._color2 = 0;
+ _sceneText._width = 200;
+ _sceneText.fixPriority(20);
+ _sceneText._fontNumber = 50;
+ _sceneText.setPosition(Common::Point(120, 75));
+ _sceneText.setup(NO_MALADY_DETECTED);
+ _sceneMode = 826;
+ setAction(&_sequenceManager1, this, 826, &R2_GLOBALS._player, NULL);
+ break;
+ case 826:
+ _sceneText.remove();
+ doButtonPress(1);
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ case 827:
+ _object5.remove();
+ R2_INVENTORY.setObjectScene(R2_OPTO_DISK, 825);
+ _sceneText.setPosition(Common::Point(108, 75));
+ _sceneText.setup(FOREIGN_OBJECT_EXTRACTED);
+ _sceneMode = 826;
+ setAction(&_sequenceManager1, this, 826, &R2_GLOBALS._player, NULL);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ }
+}
+
+void Scene825::process(Event &event) {
+ SceneExt::process(event);
+
+ if (R2_GLOBALS._player._uiEnabled) {
+ _button1.process(event);
+ _button2.process(event);
+ _button3.process(event);
+ _button4.process(event);
+ _button5.process(event);
+ _button6.process(event);
+ }
+}
+
+void Scene825::dispatch() {
+ if (R2_GLOBALS._sceneObjects->contains(&_object4) &&
+ ((_object4._frame == 1) || (_object4._frame == 3)) &&
+ (_object4._frame != _frame1)) {
+ _sound2.play(25);
+ }
+
+ if (R2_GLOBALS._sceneObjects->contains(&_object1) &&
+ (_object1._frame == 3) && (_object1._frame != _frame2)) {
+ _sound3.play(26);
+ }
+
+ _frame1 = _object4._frame;
+ _frame2 = _object1._frame;
+
+ Scene::dispatch();
+}
+
+void Scene825::doButtonPress(int buttonId) {
+ if ((_menuId != 4) || (buttonId == 5)) {
+ _button1.setText(0);
+ _button2.setText(0);
+ _button3.setText(0);
+ _button4.setText(0);
+ _button5.setText(0);
+ _button6.setText(0);
+
+ switch (buttonId) {
+ case 2:
+ R2_GLOBALS._player.disableControl();
+ _object5.postInit();
+ _sceneMode = 825;
+ setAction(&_sequenceManager1, this, 825, &R2_GLOBALS._player, &_object5, NULL);
+ break;
+ case 3:
+ R2_GLOBALS._player.disableControl();
+ _sceneText._color1 = 92;
+ _sceneText._color2 = 0;
+ _sceneText._width = 200;
+ _sceneText.fixPriority(20);
+ _sceneText._fontNumber = 50;
+ _sceneText.setPosition(Common::Point(115, 75));
+
+ if (R2_GLOBALS.getFlag(4)) {
+ if ((R2_INVENTORY.getObjectScene(R2_READER) != 800) ||
+ (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBRE) != 800)) {
+ _sceneText.setPosition(Common::Point(116, 75));
+ _sceneText.setup(ACCESS_CODE_REQUIRED);
+ } else if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) != 800) {
+ _sceneText.setPosition(Common::Point(115, 75));
+ _sceneText.setup(NO_TREATMENT_REQUIRED);
+ } else {
+ _button6._buttonId = 5;
+
+ _object5.postInit();
+ setAction(&_sequenceManager1, this, 827, &_object5, NULL);
+ }
+ } else {
+ R2_GLOBALS.setFlag(2);
+
+ if ((R2_INVENTORY.getObjectScene(R2_READER) != 800) ||
+ (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBRE) != 800)) {
+ _sceneText.setPosition(Common::Point(116, 75));
+ _sceneText.setup(ACCESS_CODE_REQUIRED);
+ } else {
+ _sceneText.setPosition(Common::Point(119, 75));
+ _sceneText.setup(INVALID_ACCESS_CODE);
+ }
+ }
+
+ if (_sceneMode != 827) {
+ _sceneMode = 826;
+ setAction(&_sequenceManager1, this, 826, &R2_GLOBALS._player, NULL);
+ }
+ break;
+ case 4:
+ _sound4.play(27);
+ _button6._buttonId = 5;
+
+ _object1.postInit();
+ _object1.setup(826, 7, 1);
+ _object1.setPosition(Common::Point(112, 67));
+ _object1._numFrames = 1;
+ _object1.animate(ANIM_MODE_2);
+
+ _object2.postInit();
+ _object2.setup(826, 5, 1);
+ _object2.setPosition(Common::Point(158, 67));
+ _object2._numFrames = 5;
+ _object2.animate(ANIM_MODE_2);
+
+ _object3.postInit();
+ _object3.setup(826, 6, 1);
+ _object3.setPosition(Common::Point(206, 67));
+ _object3._numFrames = 1;
+ _object3.animate(ANIM_MODE_2);
+
+ _object4.postInit();
+ _object4.setup(826, 8, 1);
+ _object4.setPosition(Common::Point(158, 84));
+ _object4._numFrames = 1;
+ _object4.animate(ANIM_MODE_2);
+
+ _object5.postInit();
+ _object5.setup(826, 4, 1);
+ _object5.setPosition(Common::Point(161, 110));
+ break;
+ case 5:
+ R2_GLOBALS._player.disableControl();
+ if (_menuId == 4) {
+ _menuId = 0;
+
+ _object1.remove();
+ _object2.remove();
+ _object3.remove();
+ _object4.remove();
+ _object5.remove();
+
+ _sound2.stop();
+ _sound3.stop();
+ _sound4.stop();
+
+ doButtonPress(1);
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ } else {
+ R2_GLOBALS._sceneManager.changeScene(800);
+ }
+ break;
+ case 6:
+ R2_GLOBALS._player.disableControl();
+ _sceneText._color1 = 92;
+ _sceneText._color2 = 0;
+ _sceneText._width = 200;
+ _sceneText.fixPriority(20);
+ _sceneText._fontNumber = 50;
+ _sceneText.setPosition(Common::Point(115, 75));
+ _sceneText.setup(NO_TREATMENT_REQUIRED);
+
+ _sceneMode = 826;
+ setAction(&_sequenceManager1, this, 826, &R2_GLOBALS._player, NULL);
+ break;
+ default:
+ _button1.setText(2);
+ _button2.setText(3);
+ _button3.setText(4);
+ _button4.setText(6);
+ _button6.setText(5);
+ break;
+ }
+
+ _menuId = buttonId;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 850 - Deck #5 - By Lift
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene850::Indicator::startAction(CursorType action, Event &event) {
+ Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action != CURSOR_USE) || (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBRE) != 850))
+ return NamedHotspot::startAction(action, event);
+ else {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 851;
+ scene->setAction(&scene->_sequenceManager1, scene, 851, &R2_GLOBALS._player, &scene->_fibre, NULL);
+ return true;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+bool Scene850::LiftDoor::startAction(CursorType action, Event &event) {
+ Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+ else {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 202;
+ scene->setAction(&scene->_sequenceManager1, scene, 202, &R2_GLOBALS._player, this, NULL);
+ return true;
+ }
+}
+
+bool Scene850::SickBayDoor::startAction(CursorType action, Event &event) {
+ Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+ else {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 204;
+ scene->setAction(&scene->_sequenceManager1, scene, 204, &R2_GLOBALS._player, this, NULL);
+ return true;
+ }
+}
+
+bool Scene850::Clamp::startAction(CursorType action, Event &event) {
+ Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!R2_GLOBALS.getFlag(7))
+ return false;
+ else if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+ else {
+ R2_GLOBALS._player.disableControl();
+ scene->_object1.postInit();
+ scene->_sceneMode = 850;
+ scene->setAction(&scene->_sequenceManager1, scene, 850, &R2_GLOBALS._player, this, &scene->_object1, NULL);
+ return true;
+ }
+}
+
+bool Scene850::Panel::startAction(CursorType action, Event &event) {
+ Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action != CURSOR_USE) || R2_GLOBALS.getFlag(7))
+ return SceneActor::startAction(action, event);
+ else {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 852;
+ scene->setAction(&scene->_sequenceManager1, scene, 852, &R2_GLOBALS._player, this, &scene->_object1, NULL);
+ return true;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene850::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(850);
+
+ _liftDoor.postInit();
+ _liftDoor.setup(850, 2, 1);
+ _liftDoor.setPosition(Common::Point(188, 79));
+ _liftDoor.setDetails(850, 3, -1, -1, 1, (SceneItem *)NULL);
+
+ _sickBayDoor.postInit();
+ _sickBayDoor.setup(850, 3, 1);
+ _sickBayDoor.setPosition(Common::Point(62, 84));
+ _sickBayDoor.setDetails(850, 9, -1, -1, 1, (SceneItem *)NULL);
+
+ if (R2_INVENTORY.getObjectScene(R2_CLAMP) == 850) {
+ _clamp.postInit();
+ _clamp.setup(850, 5, 1);
+ _clamp.setPosition(Common::Point(242, 93));
+ _clamp.fixPriority(81);
+ _clamp.animate(ANIM_MODE_2, NULL);
+ _clamp.setDetails(850, 27, -1, -1, 1, (SceneItem *)NULL);
+ }
+
+ _panel.postInit();
+ _panel.setVisage(850);
+
+ if (R2_GLOBALS.getFlag(7))
+ _panel.setFrame(7);
+
+ _panel.setPosition(Common::Point(232, 119));
+ _panel.fixPriority(82);
+ _panel.setDetails(850, 24, -1, -1, 1, (SceneItem *)NULL);
+
+ if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBRE) == 850) {
+ _fibre.postInit();
+ _fibre.setup(850, 6, 1);
+ _fibre.setPosition(Common::Point(280, 87));
+ }
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.setVisage(10);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.disableControl();
+
+ _eastDoor.setDetails(Rect(289, 53, 315, 125), 850, 6, -1, 8, 1, NULL);
+ _indicator.setDetails(Rect(275, 67, 286, 79), 850, 18, -1, 20, 1, NULL);
+ _sickBayIndicator.setDetails(Rect(41, 51, 48, 61), 850, 15, -1, -1, 1, NULL);
+ _liftControls.setDetails(Rect(156, 32, 166, 44), 850, 21, -1, -1, 1, NULL);
+ _compartment.setDetails(Rect(4, 88, 153, 167), 850, 12, -1, -1, 1, NULL);
+ _background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 850, 0, -1, -1, 1, NULL);
+
+ switch (R2_GLOBALS._sceneManager._previousScene) {
+ case 250:
+ _sceneMode = 203;
+ setAction(&_sequenceManager1, this, 203, &R2_GLOBALS._player, &_liftDoor, NULL);
+ break;
+ case 800:
+ _sceneMode = 205;
+ setAction(&_sequenceManager1, this, 205, &R2_GLOBALS._player, &_sickBayDoor, NULL);
+ break;
+ default:
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.setPosition(Common::Point(215, 115));
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene850::signal() {
+ switch (_sceneMode) {
+ case 202:
+ R2_GLOBALS._sceneManager.changeScene(250);
+ break;
+ case 204:
+ R2_GLOBALS._sceneManager.changeScene(800);
+ break;
+ case 850:
+ R2_INVENTORY.setObjectScene(R2_CLAMP, 1);
+ _clamp.remove();
+ _object1.remove();
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 851:
+ R2_INVENTORY.setObjectScene(R2_OPTICAL_FIBRE, 1);
+ _fibre.remove();
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 852:
+ R2_GLOBALS.setFlag(7);
+ R2_GLOBALS._player.enableControl();
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 900 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene900::Actor4::Actor4() {
+ _fieldA4 = 0;
+}
+
+void Scene900::Actor4::synchronize(Serializer &s) {
+ SceneActor::synchronize(s);
+
+ s.syncAsSint16LE(_fieldA4);
+}
+
+void Scene900::Actor4::sub96135(int arg1) {
+ _fieldA4 = arg1;
+ setDetails(900, -1, -1, -1, 2, (SceneItem *) NULL);
+}
+
+Scene900::Scene900() {
+ _field412 = 0;
+ _field414 = 0;
+ _field416 = 0;
+}
+
+void Scene900::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field412);
+ s.syncAsSint16LE(_field414);
+ s.syncAsSint16LE(_field416);
+}
+
+bool Scene900::Actor4::startAction(CursorType action, Event &event) {
+ Scene900 *scene = (Scene900 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ R2_GLOBALS._sound2.play(14);
+ switch (_fieldA4) {
+ case 2:
+ if (scene->_field412 == 1) {
+ scene->_sceneMode = 2;
+ scene->signal();
+ } else if (scene->_field412 == 2) {
+ if (R2_GLOBALS._v565E5 == 0) {
+ scene->_aSound1.play(30);
+ setup(900, 3, 11);
+ R2_GLOBALS._v565E5 = 1;
+ if ((R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 0) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS == 700)) && (R2_GLOBALS._v565E1 == 20) && (R2_GLOBALS._v565E3 == 70) && (scene->_actor2._animateMode != ANIM_MODE_6)) {
+ scene->_actor2.animate(ANIM_MODE_6, NULL);
+ } else {
+ if (((scene->_actor3._percent * 49) / 100) + scene->_actor3._position.x == scene->_actor2._position.x) {
+ if (scene->_actor2._position.x == 166 - (R2_GLOBALS._v565E3 / 15)) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 4;
+ scene->_actor2._moveDiff.y = (scene->_actor2._position.y - (scene->_actor3._position.y + ((scene->_actor3._percent * 3) / 10) - 2)) / 9;
+ Common::Point pt(scene->_actor3._position.x + ((scene->_actor3._percent * 49) / 100), scene->_actor3._position.y + ((scene->_actor3._percent * 3) / 10) - 2);
+ NpcMover *mover = new NpcMover();
+ scene->_actor2.addMover(mover, &pt, this);
+ scene->_actor2.animate(ANIM_MODE_6, NULL);
+ }
+ }
+ }
+ } else {
+ scene->_aSound1.play(53);
+ setup(900, 3, 9);
+ R2_GLOBALS._v565E5 = 0;
+
+ if ((R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 0) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) == 700) && (scene->_actor2._frame < 8) && (scene->_actor2._animateMode != ANIM_MODE_5)) {
+ scene->_actor2.animate(ANIM_MODE_5, NULL);
+ } else if ((R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 700) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) == 700) && (scene->_actor2._frame < 8)) {
+ R2_GLOBALS._v565E7 = 0;
+ if (scene->_actor2._animateMode != 5) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 5;
+ scene->_actor2.animate(ANIM_MODE_5, NULL);
+ scene->_actor2._moveDiff.y = (166 - scene->_actor2._position.y) / 9;
+ Common::Point pt(scene->_actor2._position.x, 166 - (R2_GLOBALS._v565E3 / 15));
+ NpcMover *mover = new NpcMover();
+ scene->_actor2.addMover(mover, &pt, this);
+ }
+ }
+ }
+ }
+ return true;
+ break;
+ case 3:
+ if (scene->_field412 == 1) {
+ scene->_sceneMode = 3;
+ scene->signal();
+ }
+ return true;
+ break;
+ case 4:
+ if ((scene->_field416 == 0) && (scene->_field414 == 0) && (R2_GLOBALS._v565E3 != 0)) {
+ scene->_aSound1.play(38);
+ scene->_field416 = -5;
+ }
+ return true;
+ break;
+ case 5:
+ if ((scene->_field416 == 0) && (scene->_field414 == 0) && (R2_GLOBALS._v565E3 < 135)) {
+ scene->_aSound1.play(38);
+ scene->_field416 = 5;
+ }
+ return true;
+ break;
+ case 6:
+ if ((scene->_field416 == 0) && (scene->_field414 == 0) && (R2_GLOBALS._v565E1 > -10)) {
+ scene->_aSound1.play(38);
+ scene->_field414 = -5;
+ }
+ return true;
+ break;
+ case 7:
+ if ((scene->_field416 == 0) && (scene->_field414 == 0) && (R2_GLOBALS._v565E1 < 20)) {
+ scene->_aSound1.play(38);
+ scene->_field414 = 5;
+ }
+ return true;
+ break;
+ case 8:
+ SceneItem::display(5, 11, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ return true;
+ break;
+ case 9:
+ SceneItem::display(5, 12, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ return true;
+ break;
+ default:
+ if (scene->_field412 == 1) {
+ R2_GLOBALS._player.disableControl();
+ scene->_actor5.remove();
+ scene->_actor6.remove();
+ scene->_actor7.remove();
+ scene->_actor8.remove();
+ scene->_actor9.remove();
+ scene->_actor10.remove();
+ R2_GLOBALS._sound2.play(37);
+ scene->_sceneMode = 901;
+ scene->setAction(&scene->_sequenceManager1, scene, 901, &scene->_actor1, this ,NULL);
+ } else if ((scene->_field412 == 2) || (scene->_field412 == 3)) {
+ scene->_sceneMode = 1;
+ scene->signal();
+ }
+
+ return true;
+ break;
+ }
+ } else if (action == CURSOR_LOOK) {
+ if ((_fieldA4 == 2) && (scene->_field412 == 2))
+ SceneItem::display(900, 21, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ else
+ SceneItem::display(900, _fieldA4, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+}
+
+void Scene900::postInit(SceneObjectList *OwnerList) {
+ g_globals->gfxManager()._bounds.moveTo(Common::Point(0, 0));
+ loadScene(900);
+ SceneExt::postInit();
+ R2_GLOBALS._sound1.play(34);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.hide();
+ R2_GLOBALS._player.disableControl();
+
+ _actor1.postInit();
+ _actor1.setDetails(900, 3, -1, -1, 1, (SceneItem *) NULL);
+
+ _field414 = 0;
+ _field416 = 0;
+
+ _actor3.postInit();
+ _actor3.fixPriority(1);
+ // useless, the original use it for debugging purposes: strcpy(_actor3._actorName, "Crane");
+ _actor3.setup(900, 1, 2);
+ _actor3.setPosition(Common::Point(89, 0));
+ _actor3._effect = 1;
+ _actor3.setDetails(900, 6, -1, 8, 1, (SceneItem *) NULL);
+
+ if ((R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) != 1) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) != 1)) {
+ _actor2.postInit();
+ _actor2.setPosition(Common::Point(0, 0));
+ _actor2.fixPriority(1);
+
+ if (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 0) {
+ if (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) != 700) {
+ _actor2.setup(901, 3, 2);
+ } else if ((R2_GLOBALS._v565E5 != 0) && (R2_GLOBALS._v565E1 == 20) && (R2_GLOBALS._v565E3 == 70)) {
+ _actor2.setup(901, 2, 1);
+ } else {
+ _actor2.setup(901, 2, 8);
+ }
+ _actor2.setPosition(Common::Point(171, 145));
+ _actor2.setDetails(700, -1, -1, -1, 1, (SceneItem *) NULL);
+ } else {
+ _actor2.setDetails(700, -1, -1, -1, 1, (SceneItem *) NULL);
+ if (R2_GLOBALS._v565E7 == 0) {
+ _actor2.setup(901, 1, 8);
+ // Original set two times the same values: skipped
+ _actor2.setPosition(Common::Point((((100 - ((R2_GLOBALS._v565EB * 350) / 100)) * 49) / 100) + ((R2_GLOBALS._v565E9 * _actor3._percent * 6) / 100) + 89, 166 - (R2_GLOBALS._v565EB / 3)));
+ _actor2.changeZoom(((100 - ((R2_GLOBALS._v565EB * 350) / 100) + 52) / 10) * 10);
+ }
+ }
+ }
+ _item1.setDetails(Rect(0, 0, 320, 200), 900, 0, -1, -1, 1, NULL);
+ _sceneMode = 900;
+ setAction(&_sequenceManager1, this, 900, &_actor1, NULL);
+}
+
+void Scene900::remove() {
+ if (_sceneMode != 901)
+ R2_GLOBALS._sound1.play(10);
+
+ SceneExt::remove();
+}
+
+void Scene900::signal() {
+ switch (_sceneMode) {
+ case 1:
+ _field412 = 1;
+ R2_GLOBALS._sound2.play(37);
+
+ _actor5.remove();
+ _actor6.remove();
+ _actor7.remove();
+ _actor8.remove();
+ _actor9.remove();
+ _actor10.remove();
+
+ _actor5.sub96135(2);
+ _actor5.setup(900, 2, 1);
+ _actor5.setPosition(Common::Point(36, 166));
+
+ _actor6.sub96135(3);
+ _actor6.setup(900, 2, 5);
+ _actor6.setPosition(Common::Point(117, 166));
+ break;
+ case 2:
+ _field412 = 2;
+
+ _actor5.remove();
+ _actor6.remove();
+
+ _actor5.sub96135(2);
+ if (R2_GLOBALS._v565E5 == 0)
+ _actor5.setup(900, 3, 9);
+ else
+ _actor5.setup(900, 3, 11);
+ _actor5.setPosition(Common::Point(36, 166));
+
+ _actor7.sub96135(5);
+ _actor7.setup(900, 3, 3);
+ _actor7.setPosition(Common::Point(76, 134));
+
+ _actor8.sub96135(4);
+ _actor8.setup(900, 3, 7);
+ _actor8.setPosition(Common::Point(76, 156));
+
+ _actor9.sub96135(6);
+ _actor9.setup(900, 3, 1);
+ _actor9.setPosition(Common::Point(55, 144));
+
+ _actor10.sub96135(7);
+ _actor10.setup(900, 3, 5);
+ _actor10.setPosition(Common::Point(99, 144));
+
+ break;
+ case 3:
+ _field412 = 3;
+
+ _actor5.remove();
+ _actor6.remove();
+ _actor7.remove();
+ _actor8.remove();
+ _actor9.remove();
+ _actor10.remove();
+
+ _actor5.sub96135(8);
+ _actor5.setup(900, 4, 1);
+ _actor5.setPosition(Common::Point(36, 166));
+
+ _actor6.sub96135(9);
+ _actor6.setup(900, 4, 5);
+ _actor6.setPosition(Common::Point(117, 166));
+ break;
+ case 4:
+ _sceneMode = 0;
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ R2_GLOBALS._v565E7 = 1;
+ break;
+ case 900:
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+
+ _actor1.setup(900, 1, 1);
+
+ _actor4.sub96135(1);
+ _actor4.setup(900, 1, 3);
+ _actor4.setPosition(Common::Point(77, 168));
+
+ _sceneMode = 1;
+ signal();
+ break;
+ case 901:
+ R2_GLOBALS._sceneManager.changeScene(700);
+ break;
+ case 5:
+ _sceneMode = 0;
+ // No break on purpose
+ default:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ }
+}
+
+void Scene900::dispatch() {
+ if (_field416 != 0) {
+ if (_field416 < 0) {
+ R2_GLOBALS._v565E3--;
+ ++_field416;
+ } else {
+ ++R2_GLOBALS._v565E3;
+ _field416--;
+ }
+ }
+
+ if (_field414 != 0) {
+ R2_GLOBALS._v565E1--;
+ ++_field414;
+ } else {
+ ++R2_GLOBALS._v565E1;
+ _field414++;
+ }
+
+ if (R2_GLOBALS._sceneObjects->contains(&_actor2)) {
+ if ((R2_GLOBALS._v565E5 != 0) && (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 0) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) == 700) && (R2_GLOBALS._v565E1 == 20) && (R2_GLOBALS._v565E3 == 70)) {
+ if ((_actor2._frame > 1) && (_actor2._animateMode != ANIM_MODE_6))
+ _actor2.animate(ANIM_MODE_6, NULL);
+ } else {
+ if ((_actor2._frame < 8) && (_actor2._animateMode != ANIM_MODE_5) && (R2_GLOBALS._v565E7 == 0) && (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 0) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) == 700) && (_sceneMode != 4))
+ _actor2.animate(ANIM_MODE_5, NULL);
+ }
+ }
+
+ _actor3.changeZoom(100 - ((R2_GLOBALS._v565E3 * 70) / 100));
+ _actor3.setPosition(Common::Point(((_actor3._percent * R2_GLOBALS._v565E1 * 6) / 100) + 89, R2_GLOBALS._v565E3));
+
+ if ((R2_GLOBALS._sceneObjects->contains(&_actor2)) && (R2_GLOBALS._v565E7 != 0) && (!_actor2._mover) && (_actor2._animateMode == ANIM_MODE_NONE)) {
+ _actor2.setPosition(Common::Point(_actor3._position.x + ((_actor3._percent * 49) / 100), _actor3._position.y + ((_actor3._percent * 3) / 10)));
+ if (R2_GLOBALS._v565E3 >= 75) {
+ _actor2.setup(901, 1, 1);
+ _actor2.changeZoom(((_actor3._percent + 52) / 10) * 10);
+ } else {
+ _actor2.setup(901, 5, 1);
+ _actor2.changeZoom(((_actor3._percent / 10) * 10) + 30);
+ }
}
+ Scene::dispatch();
}
} // End of namespace Ringworld2
diff --git a/engines/tsage/ringworld2/ringworld2_scenes0.h b/engines/tsage/ringworld2/ringworld2_scenes0.h
index c51b044137..2f52f9578f 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes0.h
+++ b/engines/tsage/ringworld2/ringworld2_scenes0.h
@@ -31,6 +31,7 @@
#include "tsage/globals.h"
#include "tsage/sound.h"
#include "tsage/ringworld2/ringworld2_logic.h"
+#include "tsage/ringworld2/ringworld2_speakers.h"
namespace TsAGE {
@@ -38,21 +39,35 @@ namespace Ringworld2 {
using namespace TsAGE;
+class Scene50: public SceneExt {
+
+ class Action1: public Action {
+ public:
+ void signal();
+ };
+
+public:
+ Action1 _action1;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void process(Event &event);
+};
+
class Scene100: public SceneExt {
/* Objects */
- class Object7: public SceneActorExt {
+ class Door: public SceneActorExt {
public:
bool startAction(CursorType action, Event &event);
};
- class Object8: public SceneActor {
+ class Table: public SceneActor {
public:
bool startAction(CursorType action, Event &event);
};
- class Object9: public SceneActor {
+ class StasisNegator: public SceneActor {
public:
bool startAction(CursorType action, Event &event);
};
- class Object10: public SceneActorExt {
+ class DoorDisplay: public SceneActorExt {
public:
bool startAction(CursorType action, Event &event);
};
@@ -60,21 +75,829 @@ class Scene100: public SceneExt {
public:
bool startAction(CursorType action, Event &event);
};
+
+ /* Items */
+ class Terminal: public NamedHotspot{
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+
+public:
+ NamedHotspot _background, _duct, _bed, _desk;
+ Terminal _terminal;
+ SceneActor _bedLights1, _bedLights2, _object3, _object4, _object5;
+ SceneActor _wardrobe;
+ Door _door;
+ Table _table;
+ StasisNegator _stasisNegator;
+ DoorDisplay _doorDisplay;
+ SteppingDisks _steppingDisks;
+ SequenceManager _sequenceManager1, _sequenceManager2;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene125: public SceneExt {
+ /* Objects */
+ class Object5: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Icon: public SceneActor {
+ public:
+ int _lookLineNum, _field98;
+ bool _pressed;
+ SceneObject _object1, _object2;
+ SceneText _sceneText1, _sceneText2;
+
+ Icon();
+ virtual Common::String getClassName() { return "Scene125_Icon"; }
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void synchronize(Serializer &s);
+ virtual void process(Event &event);
+
+ void setIcon(int id);
+ void showIcon();
+ void hideIcon();
+ };
+
+ /* Items */
+ class Item4: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
public:
- NamedHotspot _item1, _item2, _item3, _item4, _item5;
+ ScenePalette _palette;
+ ASoundExt _sound1;
+ NamedHotspot _background, _item2, _item3;
+ Item4 _item4;
+ SceneActor _object1, _object2, _object3, _object4, _object5, _object6, _object7;
+ Icon _icon1, _icon2, _icon3, _icon4, _icon5, _icon6;
+ SequenceManager _sequenceManager;
+ SceneText _sceneText;
+ int _consoleMode, _iconFontNumber, _logIndex, _databaseIndex, _infodiskIndex;
+ int _soundCount, _soundIndex;
+ int _soundIndexes[10];
+
+ Scene125();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void synchronize(Serializer &s);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+
+ void consoleAction(int id);
+ void setDetails(int resNum, int lineNum);
+ void stop();
+ Common::String parseMessage(const Common::String &msg);
+};
+
+class Scene150: public Scene100 {
+public:
+ SceneActor _emptyRoomTable;
+public:
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+};
+
+class Scene160: public SceneExt {
+ class Action1: public Action {
+ public:
+ void signal();
+ };
+public:
+ ASound _sound1;
+ Action1 _action1;
+ int _frameNumber, _yChange;
+ SceneObject _object1, _object2, _object3;
+ int _lineNum;
+ SynchronizedList<SceneText *> _creditsList;
+public:
+ Scene160();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void synchronize(Serializer &s);
+ virtual void remove();
+ virtual void process(Event &event);
+};
+
+class Scene175: public Scene150 {
+};
+
+class Scene180: public SceneExt {
+ class Action1: public Action {
+ public:
+ void signal();
+ };
+private:
+ void setSceneDelay(int v);
+public:
+ SpeakerWebbster _webbsterSpeaker;
+ SpeakerDutyOfficer _dutyOfficerSpeaker;
+ SpeakerTeal _tealSpeaker;
+ SpeakerGameText _gameTextSpeaker;
SceneActor _object1, _object2, _object3, _object4, _object5;
- SceneActor _object6;
- Object7 _object7;
+ ScenePalette _palette;
+ SceneText _textList[20];
+ AnimationPlayerExt _animationPlayer;
+ SequenceManager _sequenceManager;
+ Action1 _action1;
+ ASoundExt _sound1;
+
+ int _frameNumber;
+ int _field412, _field480;
+ int _field482, _frameInc;
+ int _fontNumber, _fontHeight;
+ int _scene180Mode;
+public:
+ Scene180();
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void synchronize(Serializer &s);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+ virtual void restore();
+};
+
+class Scene200: public SceneExt {
+ /* Objects */
+ class NorthDoor: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class EastDoor: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class WestDoor: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Scene Exits */
+ class EastExit: public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class WestExit: public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+public:
+ NamedHotspot _background, _compartment, _westDoorDisplay, _eastDoorDisplay;
+ NorthDoor _northDoor;
+ EastDoor _eastDoor;
+ WestDoor _westDoor;
+ EastExit _eastExit;
+ WestExit _westExit;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene205: public SceneExt {
+ /* Actions */
+ class Action1: public Action {
+ private:
+ void textLoop();
+ public:
+ virtual void signal();
+ };
+
+ /* Objects */
+ class Object: public SceneObject {
+ public:
+ int _x100, _y100;
+ public:
+ Object();
+
+ virtual void synchronize(Serializer &s);
+ };
+private:
+ void setup();
+ void processList(Object **ObjList, int count, const Common::Rect &bounds,
+ int xMultiply, int yMultiply, int xCenter, int yCenter);
+ void handleText();
+public:
+ AnimationPlayer _animationPlayer;
+ int _fontHeight;
+ SceneText _textList[15];
+ Object *_objList1[3];
+ Object *_objList2[3];
+ Object *_objList3[4];
+ ASound _sound1;
+ Action1 _action1;
+ int _yp;
+ int _textIndex, _lineNum;
+ Common::String _message;
+public:
+ Scene205();
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void synchronize(Serializer &s);
+ virtual void remove();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+
+class Scene250: public SceneExt {
+ class Button: public SceneActor {
+ public:
+ int _floorNumber, _v2;
+ Button();
+ void setFloor(int floorNumber);
+
+ virtual void synchronize(Serializer &s);
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ int _field412, _field414, _field416, _field418, _field41A;
+ NamedHotspot _background, _item2, _item3, _item4;
+ Button _button1, _currentFloor;
+ Button _floor1, _floor2, _floor3, _floor4, _floor5;
+ Button _floor6, _floor7, _floor8, _floor9;
+ ASoundExt _sound1;
+ SequenceManager _sequenceManager1;
+public:
+ Scene250();
+ void changeFloor(int floorNumber);
+
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene300: public SceneExt {
+ /* Actions */
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action3: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action4: public Action {
+ public:
+ virtual void signal();
+ };
+
+ /* Items */
+ class QuinnWorkstation: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class MirandaWorkstation: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class SeekerWorkstation: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Objects */
+ class Miranda: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Seeker: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Quinn: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Doorway: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3, _sequenceManager4;
+ ASoundExt _sound1;
+ SpeakerMiranda300 _mirandaSpeaker;
+ SpeakerSeeker300 _seekerSpeaker;
+ SpeakerSeekerL _seekerLSpeaker;
+ SpeakerQuinn300 _quinnSpeaker;
+ SpeakerQuinnL _quinnLSpeaker;
+ SpeakerTeal300 _tealSpeaker;
+ SpeakerSoldier300 _soldierSpeaker;
+
+ NamedHotspot _background, _hull, _statusDisplays, _damageControl, _manualOverrides;
+ NamedHotspot _scanners1, _scanners2, _indirectLighting1, _indirectLighting2, _lighting;
+ QuinnWorkstation _quinnWorkstation1, _quinnWorkstation2;
+ SeekerWorkstation _seekerWorkstation;
+ MirandaWorkstation _mirandaWorkstation1, _mirandaWorkstation2;
+ SceneActor _object1, _object2, _object3, _object4, _protocolDisplay;
+ SceneActor _object6, _object7, _object8, _object9;
+ SceneActor _teal, _soldier, _object12;
+ Doorway _doorway;
+ Miranda _miranda;
+ Seeker _seeker;
+ Quinn _quinn;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ PaletteRotation *_rotation;
+ int _stripId;
+
+ Scene300();
+ void signal309();
+
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+};
+
+class Scene325: public SceneExt {
+ class Icon: public SceneActor {
+ public:
+ int _lookLineNum, _field98;
+ bool _pressed;
+ SceneObject _object1, _object2;
+ SceneText _sceneText1, _sceneText2;
+
+ Icon();
+ virtual Common::String getClassName() { return "Scene325_Icon"; }
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void synchronize(Serializer &s);
+ virtual void process(Event &event);
+
+ void setIcon(int id);
+ void showIcon();
+ void hideIcon();
+ };
+
+private:
+ void removeText();
+ void consoleAction(int id);
+ void setMessage(int resNum, int lineNum);
+ Common::String parseMessage(const Common::String &msg);
+public:
+ int _field412, _iconFontNumber, _field416, _field418;
+ int _field41A, _field41C, _field41E, _field420;
+ int _soundCount, _soundIndex;
+ int _soundQueue[10];
+ SpeakerQuinn _quinnSpeaker;
+ ScenePalette _palette;
+ SceneHotspot _background, _item2;
+ SceneObject _object1, _object2, _object3, _object4, _object5;
+ SceneObject _object6, _object7, _object8, _object9, _object10;
+ SceneObject _object11, _object12, _object13;
+ SceneObject _objList[4];
+ Icon _icon1, _icon2, _icon3, _icon4, _icon5, _icon6;
+ ASoundExt _sound1;
+ SequenceManager _sequenceManager1;
+ SceneText _text1;
+public:
+ Scene325();
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void synchronize(Serializer &s);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+
+class Scene400: public SceneExt {
+ /* Items */
+ class Terminal: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Objects */
+ class Door: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Reader: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class SensorProbe: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class AttractorUnit: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ NamedHotspot _background, _equipment1, _equipment2, _equipment3;
+ NamedHotspot _equipment4, _equipment5, _equipment6;
+ NamedHotspot _desk, _desk2, _console;
+ NamedHotspot _duct, _shelves, _cabinet, _doorDisplay, _lights;
+ NamedHotspot _equalizer, _transducer, _optimizer, _soundModule, _tester;
+ NamedHotspot _helmet, _nullifier;
+ Terminal _terminal;
+ SceneActor _consoleDisplay, _testerDisplay;
+ Door _door;
+ Reader _reader;
+ SensorProbe _sensorProbe;
+ AttractorUnit _attractorUnit;
+ SequenceManager _sequenceManager1;
+ ASoundExt _sound1;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene500: public SceneExt {
+ /* Items */
+ class ControlPanel: public SceneHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Objects */
+ class Object2: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object3: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Doorway: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class OxygenTanks: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class AirLock: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object8: public SceneActor {
+ // This classes uses a custom draw method
+ };
+ class Aerosol: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class SonicStunner: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Locker1: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Locker2: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Object: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ int _stripNumber;
+ byte _buffer[2710];
+ SpeakerSeeker _seekerSpeaker;
+ SpeakerQuinn _quinnSpeaker;
+ SceneHotspot _background, _item2;
+ ControlPanel _controlPanel;
+ SceneActor _object1;
+ Object2 _object2;
+ Object3 _object3;
+ Doorway _doorway;
+ OxygenTanks _tanks1, _tanks2;
+ AirLock _airLock;
Object8 _object8;
- Object9 _object9;
- Object10 _object10;
- SteppingDisks _steppingDisks;
+ Aerosol _aerosol;
+ SonicStunner _sonicStunner;
+ Locker1 _locker1;
+ Locker2 _locker2;
+ SceneAreaObject _area1;
+ Object _obj1, _obj2, _obj3;
+ ASoundExt _sound1;
SequenceManager _sequenceManager1, _sequenceManager2;
+public:
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void synchronize(Serializer &s);
+ virtual void signal();
+};
+
+class Scene525: public SceneExt {
+public:
+ SceneActor _actor1;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+
+};
+
+class Scene600 : public SceneExt {
+ class Item1 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item4 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor4 : public SceneActor {
+ public:
+ virtual void signal();
+ virtual bool startAction(CursorType action, Event &event);
+ virtual void draw();
+ };
+ class Actor5 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor6 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor7 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor8 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ int _field412;
+ Item1 _item1;
+ Item1 _item2;
+ Item1 _item3;
+ Item4 _item4;
+ Item1 _item5;
+ BackgroundSceneObject _object1;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ Actor4 _actor4;
+ Actor5 _actor5;
+ Actor6 _actor6;
+ Actor7 _actor7;
+ Actor8 _actor8;
+ ASoundExt _aSound1;
+ SequenceManager _sequenceManager1;
+ SequenceManager _sequenceManager2;
+ byte _fieldAD2[256];
+
+ Scene600();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+ virtual void synchronize(Serializer &s);
+};
+
+class Scene700: public SceneExt {
+ class Item11 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item12 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor2 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor3 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor4 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor5 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor6 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ NamedHotspot _item3;
+ NamedHotspot _item4;
+ NamedHotspot _item5;
+ NamedHotspot _item6;
+ NamedHotspot _item7;
+ NamedHotspot _item8;
+ NamedHotspot _item9;
+ NamedHotspot _item10;
+ Item11 _item11;
+ Item12 _item12;
+ SceneActor _actor1;
+ Actor2 _actor2;
+ Actor3 _actor3;
+ Actor4 _actor4;
+ Actor5 _actor5;
+ Actor6 _actor6;
+ Actor6 _actor7;
+ Actor6 _actor8;
+ Actor6 _actor9;
+ SequenceManager _sequenceManager;
+ PaletteRotation *_rotation;
+ int _field100E;
+
+ Scene700();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void synchronize(Serializer &s);
+};
+
+class Scene800: public SceneExt {
+ /* Items */
+ class Button: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class CableJunction: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class DeviceSlot: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Objects */
+ class Door: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Tray: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class ComScanner: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Cabinet: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ NamedHotspot _background, _autoDoc, _diskSlot, _couch;
+ NamedHotspot _medicalDatabase, _dataConduits;
+ Button _button;
+ CableJunction _cableJunction;
+ DeviceSlot _deviceSlot;
+ SceneActor _autodocCover, _opticalFibre, _reader;
+ Door _door;
+ Tray _tray;
+ ComScanner _comScanner;
+ Cabinet _cabinet;
+ SequenceManager _sequenceManager1;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene825: public SceneExt {
+ /* Objects */
+ class Button: public SceneObject {
+ public:
+ int _buttonId, _v2;
+ bool _buttonDown;
+ SceneText _sceneText;
+ public:
+ Button();
+ void setButton(int buttonId);
+ void setText(int textId);
+
+ virtual void synchronize(Serializer &s);
+ virtual void process(Event &event);
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ NamedHotspot _background, _item2;
+ SceneActor _object1, _object2, _object3, _object4, _object5;
+ Button _button1, _button2, _button3, _button4, _button5, _button6;
+ ASoundExt _sound1, _sound2, _sound3, _sound4;
+ SequenceManager _sequenceManager1;
+ SceneText _sceneText;
+ int _menuId, _frame1, _frame2;
+ const char *_autodocItems[11];
+public:
+ Scene825();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+
+ void doButtonPress(int buttonId);
+};
+
+class Scene850: public SceneExt {
+ /* Items */
+ class Indicator: public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ /* Objects */
+ class LiftDoor: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class SickBayDoor: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Clamp: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Panel: public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ NamedHotspot _background, _eastDoor, _compartment, _sickBayIndicator;
+ NamedHotspot _liftControls;
+ Indicator _indicator;
+ SceneActor _object1, _fibre;
+ LiftDoor _liftDoor;
+ SickBayDoor _sickBayDoor;
+ Clamp _clamp;
+ Panel _panel;
+ SequenceManager _sequenceManager1;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene900 : public SceneExt {
+ class Actor4 : public SceneActor {
+ public:
+ int _fieldA4;
+
+ Actor4();
+ void sub96135(int arg1);
+ virtual void synchronize(Serializer &s);
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ int _field412;
+ int _field414;
+ int _field416;
+ NamedHotspot _item1;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ Actor4 _actor4;
+ Actor4 _actor5;
+ Actor4 _actor6;
+ Actor4 _actor7;
+ Actor4 _actor8;
+ Actor4 _actor9;
+ Actor4 _actor10;
+ ASoundExt _aSound1;
+ SequenceManager _sequenceManager1;
+ Scene900();
virtual void postInit(SceneObjectList *OwnerList = NULL);
virtual void remove();
virtual void signal();
virtual void dispatch();
+ virtual void synchronize(Serializer &s);
};
} // End of namespace Ringworld2
diff --git a/engines/tsage/ringworld2/ringworld2_scenes1.cpp b/engines/tsage/ringworld2/ringworld2_scenes1.cpp
new file mode 100644
index 0000000000..304d3a4298
--- /dev/null
+++ b/engines/tsage/ringworld2/ringworld2_scenes1.cpp
@@ -0,0 +1,14622 @@
+/* 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 "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+#include "tsage/ringworld2/ringworld2_scenes1.h"
+
+namespace TsAGE {
+
+namespace Ringworld2 {
+
+/*--------------------------------------------------------------------------
+ * Scene 1010 - Cutscene: A pixel lost in space!
+ *
+ *--------------------------------------------------------------------------*/
+void Scene1010::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(1010);
+
+ R2_GLOBALS._uiElements._active = false;
+ setZoomPercents(100, 1, 160, 100);
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.setObjectWrapper(NULL);
+ R2_GLOBALS._player.setPosition(Common::Point(30, 264));
+ R2_GLOBALS._player.changeZoom(-1);
+ R2_GLOBALS._player.disableControl();
+
+ setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+
+ if (R2_GLOBALS.getFlag(57))
+ _sceneMode = 1;
+ else {
+ R2_GLOBALS._sound1.play(89);
+ _sceneMode = 0;
+ }
+}
+
+void Scene1010::signal() {
+ switch (_sceneMode) {
+ case 1: {
+ _sceneMode = 2;
+ R2_GLOBALS._player.setup(1010, 2, 1);
+ R2_GLOBALS._player.setPosition(Common::Point(297, 101));
+ Common::Point pt(30, 264);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 2:
+ _sceneMode = 3;
+ setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+ R2_GLOBALS._player.hide();
+ break;
+ case 3:
+ if (R2_GLOBALS.getFlag(57))
+ R2_GLOBALS._sceneManager.changeScene(1500);
+ else
+ R2_GLOBALS._sceneManager.changeScene(1000);
+ break;
+ default: {
+ _sceneMode = 2;
+ R2_GLOBALS._player.setup(1010, 1, 1);
+ Common::Point pt(297, 101);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 1020 -
+ *
+ *--------------------------------------------------------------------------*/
+void Scene1020::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(1020);
+
+ if (R2_GLOBALS._sceneManager._previousScene == 1010)
+ g_globals->gfxManager()._bounds.moveTo(Common::Point(160, 0));
+
+ R2_GLOBALS._v558B6.set(160, 0, 160, 161);
+ R2_GLOBALS._uiElements._active = false;
+ R2_GLOBALS._player.postInit();
+
+ if (R2_GLOBALS._sceneManager._previousScene == 1010) {
+ R2_GLOBALS._player.setPosition(Common::Point(500, 100));
+ R2_GLOBALS._player.setup(1020, 1, 1);
+ } else {
+ R2_GLOBALS._player.setPosition(Common::Point(0, 100));
+ R2_GLOBALS._player.setup(1020, 2, 1);
+ }
+
+ R2_GLOBALS._player.setObjectWrapper(NULL);
+ R2_GLOBALS._player.hide();
+ R2_GLOBALS._player.disableControl();
+ setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+
+ if (R2_GLOBALS._sceneManager._previousScene == 1010)
+ _sceneMode = 0;
+ else
+ _sceneMode = 10;
+}
+
+void Scene1020::signal() {
+ switch (_sceneMode) {
+ case 0: {
+ _sceneMode = 1;
+ R2_GLOBALS._player.show();
+ R2_GLOBALS._player.setPosition(Common::Point(347, 48));
+ R2_GLOBALS._player._moveDiff = Common::Point(2, 1);
+ R2_GLOBALS._player.setZoom(0);
+ Common::Point pt(392, 41);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 1:
+ _sceneMode = 2;
+ R2_GLOBALS._player.setZoom(100);
+ R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 2: {
+ _sceneMode = 3;
+ R2_GLOBALS._player._moveDiff = Common::Point(30, 15);
+ Common::Point pt(-15, 149);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 3:
+ _sceneMode = 4;
+ setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+ break;
+ case 4:
+ R2_GLOBALS.setFlag(51);
+ R2_GLOBALS._sceneManager.changeScene(300);
+ break;
+ case 10: {
+ _sceneMode = 11;
+ R2_GLOBALS._player.setPosition(Common::Point(25, 133));
+ R2_GLOBALS._player._moveDiff = Common::Point(30, 15);
+ R2_GLOBALS._player.setZoom(100);
+ Common::Point pt(355, 60);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 11:
+ R2_GLOBALS._player.setPosition(Common::Point(355, 57));
+ _sceneMode = 12;
+ R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 12: {
+ R2_GLOBALS._player.setPosition(Common::Point(355, 60));
+ _sceneMode = 13;
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 1);
+ Common::Point pt(347, 48);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 13:
+ setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+ if (R2_GLOBALS._player._percent < 1)
+ _sceneMode = 14;
+ break;
+ case 14:
+ R2_GLOBALS._sceneManager.changeScene(1010);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene1020::dispatch() {
+ if (_sceneMode == 1) {
+ R2_GLOBALS._player.setZoom(R2_GLOBALS._player._percent + 1);
+ if (R2_GLOBALS._player._percent > 10)
+ R2_GLOBALS._player._moveDiff.x = 3;
+ if (R2_GLOBALS._player._percent > 20)
+ R2_GLOBALS._player._moveDiff.x = 4;
+ }
+
+ if ((_sceneMode == 13) && (R2_GLOBALS._player._percent != 0)) {
+ R2_GLOBALS._player.setZoom(R2_GLOBALS._player._percent - 2);
+ if (R2_GLOBALS._player._percent < 80)
+ R2_GLOBALS._player._moveDiff.x = 2;
+ if (R2_GLOBALS._player._percent < 70)
+ R2_GLOBALS._player._moveDiff.x = 1;
+ }
+
+ Scene::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 1100 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene1100::Scene1100() {
+ _field412 = 0;
+ _field414 = 0;
+}
+
+void Scene1100::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field412);
+ s.syncAsSint16LE(_field414);
+}
+
+bool Scene1100::Actor16::startAction(CursorType action, Event &event) {
+ Scene1100 *scene = (Scene1100 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_TALK)
+ return SceneActor::startAction(action, event);
+
+ if (R2_GLOBALS.getFlag(52)) {
+ R2_GLOBALS._player.disableControl();
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->_field412 = 327;
+ else
+ scene->_field412 = 328;
+ scene->_sceneMode = 53;
+ scene->setAction(&scene->_sequenceManager1, scene, 1122, &R2_GLOBALS._player, NULL);
+ } else {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 55;
+ if (R2_GLOBALS._v565AE >= 3) {
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->_stripManager.start3(329, scene, R2_GLOBALS._stripManager_lookupList);
+ else
+ scene->_stripManager.start3(330, scene, R2_GLOBALS._stripManager_lookupList);
+ } else {
+ ++R2_GLOBALS._v565AE;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->_stripManager.start3(304, scene, R2_GLOBALS._stripManager_lookupList);
+ else
+ scene->_stripManager.start3(308, scene, R2_GLOBALS._stripManager_lookupList);
+ }
+ }
+ return true;
+}
+
+bool Scene1100::Actor17::startAction(CursorType action, Event &event) {
+ Scene1100 *scene = (Scene1100 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case R2_NEGATOR_GUN:
+ if (_visage == 1105) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1114;
+ scene->setAction(&scene->_sequenceManager1, scene, 1114, &R2_GLOBALS._player, &scene->_actor17, NULL);
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+ break;
+ case R2_SONIC_STUNNER:
+ // No break on purpose
+ case R2_PHOTON_STUNNER:
+ if (_visage == 1105) {
+ R2_GLOBALS._player.disableControl();
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ scene->_sceneMode = 1112;
+ scene->setAction(&scene->_sequenceManager1, scene, 1112, &R2_GLOBALS._player, &scene->_actor17, NULL);
+ } else {
+ scene->_sceneMode = 1115;
+ scene->setAction(&scene->_sequenceManager1, scene, 1115, &R2_GLOBALS._player, &scene->_actor17, NULL);
+ }
+ return true;
+ } else if (_strip == 2) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1113;
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ scene->setAction(&scene->_sequenceManager1, scene, 1113, &R2_GLOBALS._player, &scene->_actor17, NULL);
+ } else {
+ scene->setAction(&scene->_sequenceManager1, scene, 1118, &R2_GLOBALS._player, &scene->_actor17, NULL);
+ }
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+ break;
+ default:
+ return SceneActor::startAction(action, event);
+ break;
+ }
+}
+
+bool Scene1100::Actor18::startAction(CursorType action, Event &event) {
+ Scene1100 *scene = (Scene1100 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action == CURSOR_TALK) && (!R2_GLOBALS.getFlag(54)) && (R2_GLOBALS.getFlag(52))) {
+ scene->_field412 = 0;
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 53;
+ scene->setAction(&scene->_sequenceManager1, scene, 1122, &R2_GLOBALS._player, NULL);
+ return true;
+ }
+
+ return SceneActor::startAction(action, event);
+}
+
+void Scene1100::postInit(SceneObjectList *OwnerList) {
+ if ((R2_GLOBALS._sceneManager._previousScene == 300) || (R2_GLOBALS._sceneManager._previousScene == 1100))
+ loadScene(1150);
+ else
+ loadScene(1100);
+
+ if ((R2_GLOBALS._sceneManager._previousScene == 1000) && (!R2_GLOBALS.getFlag(44))) {
+ R2_GLOBALS._uiElements._active = false;
+ R2_GLOBALS._v5589E.left = 0;
+ R2_GLOBALS._v5589E.right = 200;
+ }
+
+ if (R2_GLOBALS._player._characterScene[1] == 1100)
+ R2_GLOBALS._sceneManager._previousScene = 1100;
+
+ if (R2_GLOBALS._sceneManager._previousScene == -1) {
+ R2_GLOBALS._uiElements._active = false;
+ R2_GLOBALS._v5589E.left = 0;
+ R2_GLOBALS._v5589E.right = 200;
+ }
+
+ SceneExt::postInit();
+
+ if (R2_GLOBALS._sceneManager._previousScene == -1)
+ R2_GLOBALS._sceneManager._previousScene = 1000;
+
+ _stripManager.setColors(60, 255);
+ _stripManager.setFontNumber(3);
+ _stripManager.addSpeaker(&_seekerSpeaker);
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_chiefSpeaker);
+
+ scalePalette(65, 65, 65);
+
+ _actor2.postInit();
+ _actor2.setup(1100, 1, 1);
+ _actor2.fixPriority(10);
+
+ R2_GLOBALS._scrollFollower = NULL;
+
+ _item3.setDetails(Rect(56, 47, 68, 83), 1100, 7, -1, -1, 1, NULL);
+ _item4.setDetails(Rect(167, 132, 183, 167), 1100, 7, -1, -1, 1, NULL);
+ _item5.setDetails(Rect(26, 112, 87, 145), 1100, 13, -1, -1, 1, NULL);
+ _item7.setDetails(Rect(4, 70, 79, 167), 1100, 16, -1, -1, 1, NULL);
+
+ R2_GLOBALS._sound1.stop();
+
+ if (R2_GLOBALS._sceneManager._previousScene == 300) {
+ if (R2_GLOBALS._player._characterIndex == 3)
+ R2_GLOBALS._player._characterIndex = R2_QUINN;
+ R2_GLOBALS._player._characterScene[1] = 1100;
+ R2_GLOBALS._player._characterScene[2] = 1100;
+ _actor2.setPosition(Common::Point(150, 30));
+ R2_GLOBALS._sound1.play(93);
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.hide();
+ R2_GLOBALS._player.disableControl();
+
+ _actor16.postInit();
+ _actor16.hide();
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _actor16.setDetails(9002, 0, 4, 3, 1, (SceneItem *) NULL);
+ else
+ _actor16.setDetails(9001, 0, 5, 3, 1, (SceneItem *) NULL);
+
+ _actor18.postInit();
+ _actor18.setup(1113, 3, 1);
+ _actor18.setPosition(Common::Point(181, 125));
+ _actor18.fixPriority(110);
+
+ if (R2_GLOBALS.getFlag(54))
+ _actor18.setDetails(1100, 4, -1, -1, 1, (SceneItem *) NULL);
+ else
+ _actor18.setDetails(1100, 3, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor17.postInit();
+ _actor17.setup(1105, 3, 1);
+ _actor17.setPosition(Common::Point(312, 165));
+ _actor17._numFrames = 5;
+ _actor17.setDetails(1100, 22, 23, 24, 1, (SceneItem *) NULL);
+
+ _actor1.postInit();
+ _actor1.setup(1512, 1, 1);
+ _actor1.setPosition(Common::Point(187, -25));
+ _actor1.fixPriority(48);
+ _actor1._moveDiff.y = 1;
+ _actor1.setDetails(1100, 37, -1, -1, 1, (SceneItem *) NULL);
+
+ _sceneMode = 20;
+
+ setAction(&_sequenceManager1, this, 1, &R2_GLOBALS._player, NULL);
+ } else if (R2_GLOBALS._sceneManager._previousScene == 1000) {
+ _actor2.setPosition(Common::Point(50, 30));
+ _field414 = 0;
+ _palette1.loadPalette(1101);
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._player._effect = 5;
+ R2_GLOBALS._player._field9C = _field312;
+ R2_GLOBALS._player.setup(1102, 3, 2);
+ R2_GLOBALS._player.setObjectWrapper(NULL);
+ R2_GLOBALS._player.setPosition(Common::Point(111,-20));
+ R2_GLOBALS._player.fixPriority(150);
+ R2_GLOBALS._player._moveRate = 30;
+ R2_GLOBALS._player._moveDiff = Common::Point(16, 2);
+
+ _object1.setup2(1104, 2, 1, 175, 125, 102, 1);
+ _object2.setup2(1102, 5, 1, 216, 167, 1, 0);
+
+ _actor12.postInit();
+ _actor12.setup(1113, 2, 1);
+ _actor12.setPosition(Common::Point(67, 151));
+ _actor12.fixPriority(255);
+
+ _actor3.postInit();
+ _actor3.setup(1102, 6, 1);
+ _actor3._moveRate = 30;
+ _actor3._moveDiff.x = 2;
+
+ _actor4.postInit();
+ _actor4.setup(1102, 6, 2);
+ _actor4._moveRate = 30;
+ _actor4._moveDiff.x = 2;
+ _actor4._effect = 5;
+ _actor4._field9C = _field312;
+
+ R2_GLOBALS._sound1.play(86);
+
+ _sceneMode = 0;
+
+ setAction(&_sequenceManager1, this, 1, &R2_GLOBALS._player, NULL);
+ } else {
+ _actor2.setPosition(Common::Point(180, 30));
+ if (R2_GLOBALS.getFlag(52))
+ R2_GLOBALS._sound1.play(98);
+ else
+ R2_GLOBALS._sound1.play(95);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+
+ _actor16.postInit();
+
+ if (R2_GLOBALS.getFlag(52)) {
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ R2_GLOBALS._player.setup(19, 7, 1);
+ _actor16.setup(29, 6, 1);
+ } else {
+ R2_GLOBALS._player.setup(29, 7, 1);
+ _actor16.setup(19, 6, 1);
+ }
+ R2_GLOBALS._player.setPosition(Common::Point(140, 124));
+ _actor16.setPosition(Common::Point(237, 134));
+ R2_GLOBALS._player.enableControl();
+ } else {
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ R2_GLOBALS._player.setup(1107, 2, 1);
+ _actor16.setup(1107, 4, 1);
+ R2_GLOBALS._player.setPosition(Common::Point(247, 169));
+ _actor16.setPosition(Common::Point(213, 169));
+ } else {
+ R2_GLOBALS._player.setup(1107, 4, 1);
+ _actor16.setup(1107, 2, 1);
+ R2_GLOBALS._player.setPosition(Common::Point(213, 169));
+ _actor16.setPosition(Common::Point(247, 169));
+ }
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ }
+
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _actor16.setDetails(9002, 0, 4, 3, 1, (SceneItem *) NULL);
+ else
+ _actor16.setDetails(9001, 0, 5, 3, 1, (SceneItem *) NULL);
+
+ _actor18.postInit();
+ _actor18.setup(1113, 3, 1);
+ _actor18.setPosition(Common::Point(181, 125));
+ _actor18.fixPriority(110);
+
+ if (R2_GLOBALS.getFlag(54))
+ _actor18.setDetails(1100, 4, -1, -1, 1, (SceneItem *) NULL);
+ else
+ _actor18.setDetails(1100, 3, -1, -1, 1, (SceneItem *) NULL);
+
+ if (!R2_GLOBALS.getFlag(52)) {
+ _actor17.postInit();
+ if (R2_GLOBALS.getFlag(53))
+ _actor17.setup(1106, 2, 4);
+ else
+ _actor17.setup(1105, 4, 4);
+
+ _actor17.setPosition(Common::Point(17, 54));
+ _actor17._numFrames = 5;
+
+ if (R2_GLOBALS.getFlag(53))
+ _actor17.setDetails(1100, 28, -1, -1, 1, (SceneItem *) NULL);
+ else
+ _actor17.setDetails(1100, 22, 23, 24, 1, (SceneItem *) NULL);
+
+ _actor17.fixPriority(200);
+ }
+ _actor1.postInit();
+ _actor1.setup(1512, 1, 1);
+ _actor1.setPosition(Common::Point(187, 45));
+ _actor1.fixPriority(48);
+ _actor1._moveDiff.y = 1;
+ _actor1.setDetails(1100, 37, -1, -1, 1, (SceneItem *) NULL);
+ }
+ _item6.setDetails(Rect(123, 69, 222, 105), 1100, 13, -1, -1, 1, NULL);
+ _item2.setDetails(Rect(0, 0, 480, 46), 1100, 0, -1, -1, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 480, 200), 1100, 40, 41, 42, 1, NULL);
+}
+
+void Scene1100::remove() {
+ R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
+ if (_sceneMode > 20)
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ g_globals->gfxManager()._bounds.moveTo(Common::Point(0, 0));
+ R2_GLOBALS._uiElements._active = true;
+ SceneExt::remove();
+}
+
+void Scene1100::signal() {
+ switch (_sceneMode++) {
+ case 0:
+ _actor3.setPosition(Common::Point(350, 20));
+ setAction(&_sequenceManager1, this, 1, &R2_GLOBALS._player, NULL);
+ break;
+ case 1:{
+ Common::Point pt(-150, 20);
+ NpcMover *mover = new NpcMover();
+ _actor3.addMover(mover, &pt, this);
+ _actor4.setPosition(Common::Point(350, 55));
+
+ Common::Point pt2(-150, 55);
+ NpcMover *mover2 = new NpcMover();
+ _actor4.addMover(mover2, &pt2, NULL);
+ }
+ break;
+ case 2:
+ _actor3.remove();
+ _actor4.remove();
+ _actor5.postInit();
+ _actor6.postInit();
+ _actor7.postInit();
+ _actor8.postInit();
+ _actor9.postInit();
+ _actor10.postInit();
+ setAction(&_sequenceManager1, this, 1102, &_actor5, &_actor6, &_actor7, &_actor8, &_actor9, &_actor10, NULL);
+ break;
+ case 3: {
+ R2_GLOBALS._sound2.play(84);
+ R2_GLOBALS._player.setPosition(Common::Point(-50, 126));
+ Common::Point pt(350, 226);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 4:
+ _actor18.postInit();
+ _actor18.show();
+ setAction(&_sequenceManager1, this, 1101, &_actor18, &_actor10, NULL);
+ break;
+ case 5:
+ _actor13.postInit();
+ _actor13._effect = 6;
+ _actor13.setup(1103, 3, 1);
+ _actor13._moveRate = 30;
+
+ _actor14.postInit();
+ _actor14._effect = 6;
+ _actor14.setup(1103, 4, 1);
+ _actor4._moveRate = 25;
+
+ _actor13.setAction(&_sequenceManager2, this, 1109, &_actor13, &_actor14, NULL);
+ break;
+ case 6: {
+ _actor13.remove();
+ _actor14.remove();
+ R2_GLOBALS._player.setPosition(Common::Point(-50, 136));
+ R2_GLOBALS._sound2.play(84);
+ Common::Point pt(350, 236);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 7:
+ setAction(&_sequenceManager1, this, 1103, &_actor18, &_actor10);
+ break;
+ case 8:
+ R2_GLOBALS._player._effect = 0;
+ _actor11.postInit();
+ setAction(&_sequenceManager1, this, 1105, &R2_GLOBALS._player, &_actor10, &_actor11, &_actor18, NULL);
+ break;
+ case 9:
+ _object1.proc27();
+
+ _actor15.postInit();
+ _actor15.setup(1103, 2, 1);
+ _actor15._moveRate = 30;
+ _actor15.setAction(&_sequenceManager3, this, 1107, &_actor15, NULL);
+ break;
+ case 10:
+ _actor13.postInit();
+ _actor13.setup(1103, 1, 1);
+ _actor13._moveRate = 15;
+ _actor13.setAction(&_sequenceManager2, this, 1108, &_actor13, NULL);
+ break;
+ case 11: {
+ setAction(&_sequenceManager1, this, 1116, &_actor11, &_actor10, &_actor12, NULL);
+ R2_GLOBALS._player._effect = 5;
+ R2_GLOBALS._player.setup(1102, 3, 2);
+ R2_GLOBALS._player.setPosition(Common::Point(-50, 131));
+ R2_GLOBALS._sound2.play(84);
+ Common::Point pt(350, 231);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 12:
+ // Really nothing
+ break;
+ case 13:
+ _actor17.postInit();
+ R2_GLOBALS._scrollFollower = &_actor17;
+
+ _actor11.setup(1100, 2, 1);
+ _actor11.setPosition(Common::Point(408, 121));
+
+ _actor10.setup(1100, 3, 5);
+ _actor10.setPosition(Common::Point(409, 121));
+
+ setAction(&_sequenceManager1, this, 1104, &_actor17, NULL);
+ break;
+ case 14:
+ setAction(&_sequenceManager1, this, 1100, &_actor11, &_actor10, NULL);
+ break;
+ case 15:
+ R2_GLOBALS._sceneManager.changeScene(1000);
+ break;
+ case 20: {
+ Common::Point pt(187, -13);
+ NpcMover *mover = new NpcMover();
+ _actor1.addMover(mover, &pt, this);
+ }
+ break;
+ case 21: {
+ R2_GLOBALS._sound2.play(92);
+ _actor17.animate(ANIM_MODE_5, NULL);
+ Common::Point pt(187, 45);
+ NpcMover *mover = new NpcMover();
+ _actor1.addMover(mover, &pt, this);
+ }
+ break;
+ case 22:
+ setAction(&_sequenceManager1, this, 1110, &_actor16, &R2_GLOBALS._player, NULL);
+ break;
+ case 23:
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(312, this);
+ R2_GLOBALS._player.setAction(&_sequenceManager1, this, 1119, &R2_GLOBALS._player, NULL);
+ break;
+ case 24:
+ if (!_stripManager._endHandler)
+ R2_GLOBALS._player.disableControl();
+ break;
+ case 25:
+ R2_GLOBALS._player.disableControl();
+ _stripManager._lookupList[9] = 1;
+ _stripManager._lookupList[10] = 1;
+ _stripManager._lookupList[11] = 1;
+ R2_GLOBALS._sound1.play(95);
+ setAction(&_sequenceManager1, this, 1111, &_actor17, &R2_GLOBALS._player, &_actor16, NULL);
+ break;
+ case 26:
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(302, this);
+ break;
+ case 27:
+ R2_GLOBALS._player.disableControl();
+ setAction(&_sequenceManager1, this, 1120, &_actor16, &R2_GLOBALS._player, NULL);
+ break;
+ case 28:
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(303, this);
+ break;
+ case 51:
+ R2_GLOBALS.setFlag(53);
+ _actor17.setDetails(1100, 28, -1, -1, 3, (SceneItem *) NULL);
+ // No break on purpose
+ case 50:
+ // No break on purpose
+ case 29:
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ break;
+ case 52:
+ R2_GLOBALS._sound1.play(98);
+ R2_GLOBALS.setFlag(52);
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 1116;
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ setAction(&_sequenceManager1, this, 1116, &R2_GLOBALS._player, NULL);
+ _actor16.setAction(&_sequenceManager2, NULL, 1123, &_actor16, NULL);
+ } else {
+ setAction(&_sequenceManager1, this, 1124, &R2_GLOBALS._player, NULL);
+ _actor16.setAction(&_sequenceManager2, NULL, 1117, &_actor16, NULL);
+ }
+ break;
+ case 53:
+ _sceneMode = 54;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ if (_field412 == 0) {
+ R2_GLOBALS.setFlag(55);
+ if (R2_GLOBALS.getFlag(55)) {
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _stripManager.start(318, this);
+ else
+ _stripManager.start(323, this);
+ } else {
+ // This part is totally useless as flag 55 has been set right before the check
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _stripManager.start(317, this);
+ else
+ _stripManager.start(322, this);
+ }
+ } else {
+ _stripManager.start3(_field412, this, _stripManager._lookupList);
+ }
+ break;
+ case 54:
+ if (_stripManager._field2E8 == 1) {
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 1125;
+ setAction(&_sequenceManager1, this, 1125, &R2_GLOBALS._player, &_actor16, NULL);
+ } else
+ R2_GLOBALS._player.enableControl(CURSOR_TALK);
+ break;
+ case 55:
+ R2_GLOBALS._player.enableControl(CURSOR_TALK);
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ case 99:
+ R2_GLOBALS._player._characterScene[1] = 300;
+ R2_GLOBALS._player._characterScene[2] = 300;
+ R2_GLOBALS._player._characterIndex = R2_QUINN;
+ R2_GLOBALS._sceneManager.changeScene(300);
+ break;
+ case 1112:
+ _sceneMode = 50;
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start3(313, this, _stripManager._lookupList);
+ break;
+ case 1113:
+ _sceneMode = 52;
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ R2_GLOBALS._sound1.play(96);
+ _stripManager.start3(316, this, _stripManager._lookupList);
+ break;
+ case 1114:
+ _sceneMode = 51;
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start3(315, this, _stripManager._lookupList);
+ break;
+ case 1115:
+ _sceneMode = 50;
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start3(314, this, _stripManager._lookupList);
+ break;
+ case 1116:
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ _stripManager._lookupList[9] = 1;
+ _stripManager._lookupList[10] = 1;
+ _stripManager._lookupList[11] = 1;
+ break;
+ case 1125: {
+ _sceneMode = 99;
+ R2_GLOBALS._sound2.play(100);
+ R2_GLOBALS._sound1.play(101);
+ Common::Point pt(187, -13);
+ NpcMover *mover = new NpcMover();
+ _actor1.addMover(mover, &pt, this);
+ }
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ }
+}
+
+void Scene1100::dispatch() {
+ if ((g_globals->_sceneObjects->contains(&_actor10)) && (_actor10._visage == 1102) && (_actor10._strip == 4) && (_actor10._frame == 1) && (_actor10._flags & OBJFLAG_HIDING)) {
+ if (_field414 == 1) {
+ _field414 = 2;
+ R2_GLOBALS._scenePalette.refresh();
+ }
+ } else {
+ if (_field414 == 2)
+ R2_GLOBALS._scenePalette.refresh();
+ _field414 = 1;
+ }
+
+ Scene::dispatch();
+
+ if (R2_GLOBALS._player._bounds.contains(_actor13._position))
+ _actor13._shade = 3;
+ else
+ _actor13._shade = 0;
+
+ if (R2_GLOBALS._player._bounds.contains(_actor14._position))
+ _actor14._shade = 3;
+ else
+ _actor14._shade = 0;
+
+ if (R2_GLOBALS._player._bounds.contains(_actor15._position))
+ _actor15._shade = 3;
+ else
+ _actor15._shade = 0;
+}
+
+void Scene1100::saveCharacter(int characterIndex) {
+ if (R2_GLOBALS._player._characterIndex == 3)
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ SceneExt::saveCharacter(characterIndex);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 1200 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene1200::Scene1200() {
+ _field412 = 0;
+ _field414 = 0;
+ _field416 = 0;
+ _field418 = 0;
+ _field41A = 0;
+ _field41C = 1; //CHECKME: Only if fixup_flag == 6??
+}
+
+void Scene1200::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field412);
+ s.syncAsSint16LE(_field414);
+ s.syncAsSint16LE(_field416);
+ s.syncAsSint16LE(_field418);
+ s.syncAsSint16LE(_field41A);
+ s.syncAsSint16LE(_field41C);
+}
+
+Scene1200::Area1::Area1() {
+ _field20 = 0;
+}
+
+void Scene1200::Area1::synchronize(Serializer &s) {
+ SceneArea::synchronize(s);
+
+ s.syncAsByte(_field20);
+}
+
+void Scene1200::Area1::Actor3::init(int state) {
+ _state = state;
+
+ SceneActor::postInit();
+ setup(1003, 1, 1);
+ fixPriority(255);
+
+ switch (_state) {
+ case 1:
+ switch (R2_GLOBALS._v56AA6) {
+ case 1:
+ setFrame2(2);
+ setPosition(Common::Point(129, 101));
+ break;
+ case 2:
+ setFrame2(3);
+ setPosition(Common::Point(135, 95));
+ break;
+ default:
+ break;
+ }
+ case 2:
+ switch (R2_GLOBALS._v56AA7) {
+ case 1:
+ setFrame2(2);
+ setPosition(Common::Point(152, 101));
+ break;
+ case 2:
+ setFrame2(3);
+ setPosition(Common::Point(158, 122));
+ break;
+ case 3:
+ setFrame2(3);
+ setPosition(Common::Point(135, 122));
+ break;
+ default:
+ break;
+ }
+ case 3:
+ switch (R2_GLOBALS._v56AA8) {
+ case 1:
+ setFrame2(3);
+ setPosition(Common::Point(158, 95));
+ break;
+ case 2:
+ setFrame2(2);
+ setPosition(Common::Point(175, 101));
+ break;
+ default:
+ break;
+ }
+ default:
+ break;
+ }
+
+ setDetails(1200, 12, -1, -1, 2, (SceneItem *) NULL);
+}
+
+bool Scene1200::Area1::Actor3::startAction(CursorType action, Event &event) {
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ R2_GLOBALS._sound2.play(260);
+ switch (_state) {
+ case 1:
+ if (R2_GLOBALS._v56AA6 == 1) {
+ R2_GLOBALS._v56AA6 = 2;
+ setFrame2(3);
+ setPosition(Common::Point(135, 95));
+ } else {
+ R2_GLOBALS._v56AA6 = 1;
+ setFrame2(2);
+ setPosition(Common::Point(129, 101));
+ }
+ break;
+ case 2:
+ ++R2_GLOBALS._v56AA7;
+ if (R2_GLOBALS._v56AA7 == 4)
+ R2_GLOBALS._v56AA7 = 1;
+
+ switch (R2_GLOBALS._v56AA7) {
+ case 1:
+ setFrame2(1);
+ setPosition(Common::Point(152, 101));
+ break;
+ case 2:
+ setFrame2(3);
+ setPosition(Common::Point(158, 122));
+ break;
+ case 3:
+ setFrame2(3);
+ setPosition(Common::Point(135, 122));
+ break;
+ default:
+ break;
+ }
+ break;
+ case 3:
+ if (R2_GLOBALS._v56AA8 == 1) {
+ R2_GLOBALS._v56AA8 = 2;
+ setFrame2(2);
+ setPosition(Common::Point(175, 101));
+ } else {
+ R2_GLOBALS._v56AA8 = 1;
+ setFrame2(3);
+ setPosition(Common::Point(158, 95));
+ }
+ break;
+ default:
+ break;
+ }
+
+ Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene;
+ scene->_field418 = 0;
+
+ if ((R2_GLOBALS._v56AA6 == 1) && (R2_GLOBALS._v56AA7 == 1) && (R2_GLOBALS._v56AA8 == 1))
+ scene->_field418 = 1;
+ else if ((R2_GLOBALS._v56AA6 == 2) && (R2_GLOBALS._v56AA7 == 1) && (R2_GLOBALS._v56AA8 == 1))
+ scene->_field418 = 2;
+ else if ((R2_GLOBALS._v56AA6 == 2) && (R2_GLOBALS._v56AA7 == 1) && (R2_GLOBALS._v56AA8 == 2))
+ scene->_field418 = 3;
+ else if ((R2_GLOBALS._v56AA6 == 2) && (R2_GLOBALS._v56AA7 == 3) && (R2_GLOBALS._v56AA8 == 1))
+ scene->_field418 = 4;
+
+ return true;
+}
+
+void Scene1200::Area1::postInit(SceneObjectList *OwnerList) {
+ Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene;
+
+ scene->_field41A = 1;
+ R2_GLOBALS._events.setCursor(CURSOR_USE);
+ proc12(1003, 1, 1, 100, 40);
+ proc13(1200, 11, -1, -1);
+ R2_GLOBALS._sound2.play(259);
+ _actor3.init(1);
+ _actor4.init(2);
+ _actor5.init(3);
+
+ R2_GLOBALS._player._canWalk = false;
+}
+
+void Scene1200::Area1::remove() {
+ Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene;
+
+ scene->_field41A = 0;
+ warning("Unexpected _sceneAreas.remove() call");
+// scene->_sceneAreas.remove(&_actor3);
+// scene->_sceneAreas.remove(&_actor4);
+// scene->_sceneAreas.remove(&_actor5);
+ _actor3.remove();
+ _actor4.remove();
+ _actor5.remove();
+
+ // sub201EA
+ R2_GLOBALS._sceneItems.remove((SceneItem *)this);
+ _actor2.remove();
+ SceneArea::remove();
+ R2_GLOBALS._insetUp--;
+ //
+
+ R2_GLOBALS._player._canWalk = true;
+}
+
+void Scene1200::Area1::process(Event &event) {
+ if (_field20 != R2_GLOBALS._insetUp)
+ return;
+
+ CursorType cursor = R2_GLOBALS._events.getCursor();
+
+ if (_actor2._bounds.contains(event.mousePos.x + g_globals->gfxManager()._bounds.left , event.mousePos.y)) {
+ if (cursor == _cursorNum)
+ warning("TODO: _cursorState = ???");
+ R2_GLOBALS._events.setCursor(_savedCursorNum); //, _cursorState);
+ } else if (event.mousePos.y < 168) {
+ if (cursor != _cursorNum) {
+ _savedCursorNum = cursor;
+ warning("TODO: _cursorState = ???");
+ R2_GLOBALS._events.setCursor(CURSOR_INVALID);
+ }
+ if (event.eventType == EVENT_BUTTON_DOWN) {
+ event.handled = true;
+ warning("TODO: _cursorState = ???");
+ R2_GLOBALS._events.setCursor(_savedCursorNum); //, _cursorState);
+ remove();
+ }
+ }
+}
+
+void Scene1200::Area1::proc12(int visage, int stripFrameNum, int frameNum, int posX, int posY) {
+ Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene;
+
+ _actor2.postInit();
+ _actor2.setup(visage, stripFrameNum, frameNum);
+ _actor2.setPosition(Common::Point(posX, posY));
+ _actor2.fixPriority(250);
+ _cursorNum = CURSOR_INVALID;
+ scene->_sceneAreas.push_front(this);
+ ++R2_GLOBALS._insetUp;
+ _field20 = R2_GLOBALS._insetUp;
+}
+
+void Scene1200::Area1::proc13(int resNum, int lookLineNum, int talkLineNum, int useLineNum) {
+ _actor2.setDetails(resNum, lookLineNum, talkLineNum, useLineNum, 2, (SceneItem *) NULL);
+}
+
+void Scene1200::postInit(SceneObjectList *OwnerList) {
+ Rect tmpRect;
+
+ loadScene(1200);
+ SceneExt::postInit();
+
+ if (R2_GLOBALS._sceneManager._previousScene < 3200)
+ R2_GLOBALS._sound1.play(257);
+
+ _field412 = 1;
+ _field414 = 0;
+ _field416 = 0;
+ _field418 = 0;
+ _field41A = 0;
+ _field41C = 0;
+
+ if ((R2_GLOBALS._v56AA6 == 1) && (R2_GLOBALS._v56AA7 == 1) && (R2_GLOBALS._v56AA8 == 1))
+ _field418 = 1;
+ else if ((R2_GLOBALS._v56AA6 == 2) && (R2_GLOBALS._v56AA7 == 1) && (R2_GLOBALS._v56AA8 == 1))
+ _field418 = 2;
+ else if ((R2_GLOBALS._v56AA6 == 2) && (R2_GLOBALS._v56AA7 == 1) && (R2_GLOBALS._v56AA8 == 2))
+ _field418 = 3;
+ else if ((R2_GLOBALS._v56AA6 == 2) && (R2_GLOBALS._v56AA7 == 3) && (R2_GLOBALS._v56AA8 == 1))
+ _field418 = 4;
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._player.setup(3156, 1, 6);
+ R2_GLOBALS._player.setPosition(Common::Point(160, 70));
+ R2_GLOBALS._player._numFrames = 10;
+ R2_GLOBALS._player._oldCharacterScene[3] = 1200;
+
+ _actor1.postInit();
+ _actor1.hide();
+
+ tmpRect.set(110, 20, 210, 120);
+ _object1.sub9EDE8(tmpRect);
+
+ _object1.sub51AE9(1);
+ _object1.sub51AFD(Common::Point(R2_GLOBALS._v56AA2, R2_GLOBALS._v56AA4));
+ warning("int unk = set_pane_p(_paneNumber);");
+ _object1.sub51B02();
+ warning("set_pane_p(unk);");
+
+ R2_GLOBALS._player.enableControl();
+ _item1.setDetails(Rect(0, 0, 320, 200), 1200, 0, 1, 2, 1, NULL);
+}
+
+void Scene1200::signal() {
+ switch (_sceneMode++) {
+ case 1:
+ // No break on purpose
+ case 1200:
+ // No break on purpose
+ case 1201:
+ // No break on purpose
+ case 1202:
+ // No break on purpose
+ case 1203:
+ R2_GLOBALS._player.enableControl();
+ warning("_eventManager.waitEvent()");
+ _sceneMode = 2;
+ break;
+ case 10:
+ _field416 = 1;
+ _field414 = 6;
+ R2_GLOBALS._player._numFrames = 5;
+ R2_GLOBALS._player.setStrip(1);
+ R2_GLOBALS._player.setFrame(5);
+ R2_GLOBALS._player.animate(ANIM_MODE_6, this);
+ break;
+ case 11:
+ // No break on purpose
+ case 21:
+ // No break on purpose
+ case 31:
+ // No break on purpose
+ case 41:
+ _field416 = 0;
+ break;
+ case 12:
+ _field414 = 14;
+ R2_GLOBALS._player._numFrames = 10;
+ R2_GLOBALS._player.setup(3155, 1, 4);
+ R2_GLOBALS._player.setPosition(Common::Point(160, 70));
+ R2_GLOBALS._player.animate(ANIM_MODE_2, NULL);
+ break;
+ case 13:
+ // No break on purpose
+ case 16:
+ // No break on purpose
+ case 23:
+ // No break on purpose
+ case 26:
+ // No break on purpose
+ case 33:
+ // No break on purpose
+ case 36:
+ // No break on purpose
+ case 43:
+ // No break on purpose
+ case 46:
+ R2_GLOBALS._player.setFrame(4);
+ _sceneMode = 1;
+ setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+ break;
+ case 15:
+ // No break on purpose
+ case 25:
+ // No break on purpose
+ case 35:
+ // No break on purpose
+ case 45:
+ _field414 = 20;
+ R2_GLOBALS._player.animate(ANIM_MODE_2, NULL);
+ break;
+ case 20:
+ _field416 = 1;
+ _field414 = 6;
+ R2_GLOBALS._player._numFrames = 5;
+ R2_GLOBALS._player.setStrip(2);
+ R2_GLOBALS._player.setFrame(5);
+ R2_GLOBALS._player.animate(ANIM_MODE_6, this);
+ break;
+ case 22:
+ _field414 = 14;
+ R2_GLOBALS._player._numFrames = 10;
+ R2_GLOBALS._player.setup(3155, 2, 4);
+ R2_GLOBALS._player.setPosition(Common::Point(160, 70));
+ R2_GLOBALS._player.animate(ANIM_MODE_2, NULL);
+ break;
+ case 30:
+ _field416 = 1;
+ _field414 = 6;
+ R2_GLOBALS._player._numFrames = 5;
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.setFrame(5);
+ R2_GLOBALS._player.animate(ANIM_MODE_6, this);
+ break;
+ case 32:
+ _field414 = 14;
+ R2_GLOBALS._player._numFrames = 10;
+ R2_GLOBALS._player.setup(3155, 3, 4);
+ R2_GLOBALS._player.setPosition(Common::Point(160, 70));
+ R2_GLOBALS._player.animate(ANIM_MODE_2, NULL);
+ break;
+ case 40:
+ _field416 = 1;
+ _field414 = 6;
+ R2_GLOBALS._player._numFrames = 5;
+ R2_GLOBALS._player.setStrip(4);
+ R2_GLOBALS._player.setFrame(5);
+ R2_GLOBALS._player.animate(ANIM_MODE_6, this);
+ break;
+ case 42:
+ _field414 = 14;
+ R2_GLOBALS._player._numFrames = 10;
+ R2_GLOBALS._player.setup(3155, 4, 4);
+ R2_GLOBALS._player.setPosition(Common::Point(160, 70));
+ R2_GLOBALS._player.animate(ANIM_MODE_2, NULL);
+ break;
+ case 50:
+ // No break on purpose
+ case 55:
+ // No break on purpose
+ case 60:
+ R2_GLOBALS._player.setup(3156, 5, 1);
+ R2_GLOBALS._player._numFrames = 5;
+ R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 51:
+ // No break on purpose
+ case 56:
+ // No break on purpose
+ case 117:
+ R2_GLOBALS._player.setup(3157, 1, 1);
+ R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 52:
+ // No break on purpose
+ case 82:
+ // No break on purpose
+ case 118:
+ R2_GLOBALS._player.setup(3156, 3, 6);
+ _sceneMode = 1;
+ setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+ break;
+ case 57:
+ // No break on purpose
+ case 91:
+ // No break on purpose
+ case 96:
+ R2_GLOBALS._player.setup(3157, 2, 1);
+ R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 58:
+ // No break on purpose
+ case 92:
+ // No break on purpose
+ case 122:
+ R2_GLOBALS._player.setup(3156, 2, 6);
+ _sceneMode = 1;
+ setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+ break;
+ case 61:
+ R2_GLOBALS._player.setup(3157, 4, 5);
+ R2_GLOBALS._player.animate(ANIM_MODE_6, this);
+ break;
+ case 62:
+ // No break on purpose
+ case 72:
+ // No break on purpose
+ case 98:
+ R2_GLOBALS._player.setup(3156, 4, 6);
+ _sceneMode = 1;
+ setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+ break;
+ case 70:
+ // No break on purpose
+ case 75:
+ // No break on purpose
+ case 80:
+ R2_GLOBALS._player.setup(3156, 6, 1);
+ R2_GLOBALS._player._numFrames = 5;
+ R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 71:
+ // No break on purpose
+ case 76:
+ // No break on purpose
+ case 97:
+ R2_GLOBALS._player.setup(3157, 3, 1);
+ R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 77:
+ // No break on purpose
+ case 111:
+ // No break on purpose
+ case 116:
+ R2_GLOBALS._player.setup(3157, 3, 1);
+ R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 78:
+ // No break on purpose
+ case 102:
+ // No break on purpose
+ case 112:
+ R2_GLOBALS._player.setup(3156, 1, 6);
+ _sceneMode = 1;
+ setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+ break;
+ case 81:
+ R2_GLOBALS._player.setup(3157, 2, 5);
+ R2_GLOBALS._player.animate(ANIM_MODE_6, this);
+ break;
+ case 90:
+ // No break on purpose
+ case 95:
+ // No break on purpose
+ case 100:
+ R2_GLOBALS._player.setup(3156, 7, 1);
+ R2_GLOBALS._player._numFrames = 5;
+ R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 101:
+ R2_GLOBALS._player.setup(3157, 1, 5);
+ R2_GLOBALS._player.animate(ANIM_MODE_6, this);
+ break;
+ case 110:
+ // No break on purpose
+ case 115:
+ // No break on purpose
+ case 120:
+ R2_GLOBALS._player.setup(3156, 8, 1);
+ R2_GLOBALS._player._numFrames = 5;
+ R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 121:
+ R2_GLOBALS._player.setup(3157, 3, 5);
+ R2_GLOBALS._player.animate(ANIM_MODE_6, this);
+ break;
+ default:
+ warning("_eventManager.waitEvent()");
+ _sceneMode = 2;
+ break;
+ }
+}
+
+void Scene1200::process(Event &event) {
+ if (_field414 != 0)
+ return;
+
+ Scene::process(event);
+
+ if (!R2_GLOBALS._player._canWalk)
+ return;
+
+ if (event.eventType == EVENT_BUTTON_DOWN) {
+ _object1.sub9EE22(R2_GLOBALS._v56AA2, R2_GLOBALS._v56AA4);
+ int unk = _object1.sub51AF8(event.mousePos);
+ switch (R2_GLOBALS._events.getCursor()) {
+ case CURSOR_ARROW:
+ event.handled = true;
+ if ((event.mousePos.x > 179) && (event.mousePos.x < 210) && (event.mousePos.y > 50) && (event.mousePos.y < 89))
+ sub9DAD6(1);
+
+ if ((event.mousePos.x > 109) && (event.mousePos.x < 140) && (event.mousePos.y > 50) && (event.mousePos.y < 89))
+ sub9DAD6(2);
+
+ if ((event.mousePos.x > 140) && (event.mousePos.x < 179) && (event.mousePos.y > 89) && (event.mousePos.y < 120))
+ sub9DAD6(3);
+
+ if ((event.mousePos.x > 140) && (event.mousePos.x < 179) && (event.mousePos.y > 19) && (event.mousePos.y < 50))
+ sub9DAD6(4);
+ break;
+ case CURSOR_USE:
+ if (unk > 36) {
+ if ( ((R2_GLOBALS._v56AA2 == 3) && (R2_GLOBALS._v56AA4 == 33))
+ || ((R2_GLOBALS._v56AA2 == 7) && (R2_GLOBALS._v56AA4 == 33))
+ || ((R2_GLOBALS._v56AA2 == 33) && (R2_GLOBALS._v56AA4 == 41))
+ || ((R2_GLOBALS._v56AA2 == 5) && (R2_GLOBALS._v56AA4 == 5))
+ || ((R2_GLOBALS._v56AA2 == 13) && (R2_GLOBALS._v56AA4 == 21))
+ || ((R2_GLOBALS._v56AA2 == 17) && (R2_GLOBALS._v56AA4 == 21))
+ || ((R2_GLOBALS._v56AA2 == 17) && (R2_GLOBALS._v56AA4 == 5))
+ || ((R2_GLOBALS._v56AA2 == 17) && (R2_GLOBALS._v56AA4 == 9))
+ || ((R2_GLOBALS._v56AA2 == 29) && (R2_GLOBALS._v56AA4 == 17))
+ || ((R2_GLOBALS._v56AA2 == 33) && (R2_GLOBALS._v56AA4 == 17))
+ || ((R2_GLOBALS._v56AA2 == 35) && (R2_GLOBALS._v56AA4 == 17))
+ || ((R2_GLOBALS._v56AA2 == 41) && (R2_GLOBALS._v56AA4 == 21)) ) {
+ _area1.postInit();
+ event.handled = true;
+ }
+ }
+
+ if ((unk == 1) || (unk == 4) || (unk == 11) || (unk == 14)) {
+ if ( ((R2_GLOBALS._v56AA2 == 3) && (R2_GLOBALS._v56AA4 == 9))
+ || ((R2_GLOBALS._v56AA2 == 11) && (R2_GLOBALS._v56AA4 == 27))
+ || ((R2_GLOBALS._v56AA2 == 17) && (R2_GLOBALS._v56AA4 == 7))
+ || ((R2_GLOBALS._v56AA2 == 17) && (R2_GLOBALS._v56AA4 == 27))
+ || ((R2_GLOBALS._v56AA2 == 17) && (R2_GLOBALS._v56AA4 == 33))
+ || (R2_GLOBALS._v56AA2 == 33) ) {
+ switch (R2_GLOBALS._v56AA2) {
+ case 3:
+ R2_GLOBALS._sceneManager.changeScene(3150);
+ break;
+ case 33:
+ if (R2_GLOBALS._v56AA1 >= 4)
+ R2_GLOBALS._sceneManager.changeScene(3250);
+ else
+ SceneItem::display(1200, 6, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ break;
+ default:
+ SceneItem::display(1200, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ break;
+ }
+ event.handled = true;
+ }
+ }
+ break;
+ case CURSOR_LOOK:
+ if ((unk == 1) || (unk == 4) || (unk == 11) || (unk == 14)) {
+ event.handled = true;
+ switch (R2_GLOBALS._v56AA2) {
+ case 3:
+ SceneItem::display(1200, 8, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ break;
+ case 9:
+ R2_GLOBALS._sceneManager.changeScene(3240);
+ break;
+ case 11:
+ if (R2_GLOBALS._v56AA4 == 27)
+ R2_GLOBALS._sceneManager.changeScene(3210);
+ else
+ SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ break;
+ case 17:
+ switch (R2_GLOBALS._v56AA4) {
+ case 5:
+ R2_GLOBALS._sceneManager.changeScene(3230);
+ break;
+ case 21:
+ R2_GLOBALS._sceneManager.changeScene(3220);
+ break;
+ case 33:
+ R2_GLOBALS._sceneManager.changeScene(3200);
+ break;
+ default:
+ SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ break;
+ }
+ case 33:
+ R2_GLOBALS._sceneManager.changeScene(3245);
+ break;
+ default:
+ SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ break;
+ }
+ }
+ if (unk > 36) {
+ event.handled = true;
+ SceneItem::display(1200, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ }
+ break;
+ case CURSOR_TALK:
+ event.handled = true;
+ break;
+ default:
+ return;
+ }
+ } else if (event.eventType == EVENT_KEYPRESS) {
+ if (_field414 == 0) {
+ event.handled = false;
+ return;
+ }
+
+ switch (event.kbd.keycode) {
+ case Common::KEYCODE_1:
+ warning("FIXME: keycode = 0x4800");
+ sub9DAD6(4);
+ break;
+ case Common::KEYCODE_2:
+ warning("FIXME: keycode = 0x4B00");
+ sub9DAD6(2);
+ break;
+ case Common::KEYCODE_3:
+ warning("FIXME: keycode = 0x4D00");
+ sub9DAD6(1);
+ break;
+ case Common::KEYCODE_4:
+ warning("FIXME: keycode = 0x5000");
+ sub9DAD6(3);
+ break;
+ default:
+ event.handled = false;
+ return;
+ break;
+ }
+ } else {
+ return;
+ }
+}
+
+void Scene1200::dispatch() {
+ Rect tmpRect;
+ Scene::dispatch();
+ if (_field41C != 0) {
+ _object1.sub51AFD(Common::Point(R2_GLOBALS._v56AA2, R2_GLOBALS._v56AA4));
+ warning("int unk = set_pane_p(_paneNumber);");
+ _object1.sub51B02();
+ warning("_gfxManager.sub294AC(unk);");
+ warning("tmpRect.sub14DF3();");
+ _field41C = 0;
+ }
+
+ if (_field414 != 0) {
+ tmpRect.set(110, 20, 210, 120);
+ _field414--;
+ switch (_field412 - 1) {
+ case 0:
+ R2_GLOBALS._v56AA2 += 2;
+ break;
+ case 1:
+ R2_GLOBALS._v56AA2 -= 2;
+ break;
+ case 2:
+ R2_GLOBALS._v56AA4 += 2;
+ break;
+ case 3:
+ R2_GLOBALS._v56AA4 -= 2;
+ break;
+ default:
+ break;
+ }
+ _object1.sub51AFD(Common::Point(R2_GLOBALS._v56AA2, R2_GLOBALS._v56AA4));
+ warning("int unk = set_pane_p(_paneNumber);");
+ _object1.sub51B02();
+ warning("_gfxManager.sub294AC(unk);");
+ warning("tmpRect.sub14DF3();");
+
+ if (_field416 != 0) {
+ switch(_field412 - 1) {
+ case 0:
+ R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x - 2, R2_GLOBALS._player._position.y));
+ break;
+ case 1:
+ R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x + 2, R2_GLOBALS._player._position.y));
+ break;
+ case 2:
+ R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y - 2));
+ break;
+ case 3:
+ R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y + 2));
+ break;
+ default:
+ break;
+ }
+ }
+ if (_field414 == 0) {
+ if (_field416 == 0)
+ R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL);
+ signal();
+ }
+ }
+}
+
+void Scene1200::saveCharacter(int characterIndex) {
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ SceneExt::saveCharacter(characterIndex);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 1337 - Card game
+ *
+ *--------------------------------------------------------------------------*/
+
+Scene1337::unkObj1337sub1::unkObj1337sub1() {
+ _field34 = 0;
+ _field36 = Common::Point(0, 0);
+}
+
+void Scene1337::unkObj1337sub1::synchronize(Serializer &s) {
+ warning("STUBBED: unkObj1337sub1::synchronize()");
+}
+
+Scene1337::unkObj1337_1::unkObj1337_1() {
+ _fieldB94 = Common::Point(0, 0);
+ _fieldB98 = Common::Point(0, 0);
+ _fieldB9C = Common::Point(0, 0);
+ _fieldBA0 = Common::Point(0, 0);
+ _fieldBA4 = 0;
+}
+
+void Scene1337::unkObj1337_1::synchronize(Serializer &s) {
+ warning("STUBBED: unkObj1337_1::synchronize()");
+}
+
+Scene1337::Scene1337() {
+ _autoplay = false;
+ _field3E24 = 0;
+ _field3E26 = 0;
+
+ for (int i = 0; i < 100; i++)
+ _field3E28[i] = 0;
+
+ _field423C = 0;
+ _field423E = 0;
+ _field4240 = 0;
+ _field4242 = 0;
+ _field4244 = 0;
+ _field4246 = 0;
+ _field4248 = 0;
+ _field424A = 0;
+ _field424C = 0;
+ _field424E = 0;
+}
+
+void Scene1337::synchronize(Serializer &s) {
+ warning("STUBBED: Scene1337::synchronize()");
+}
+
+void Scene1337::Action1337::subD18B5(int resNum, int stripNum, int frameNum) {
+ warning("STUBBED: Action1337::subD18B5()");
+}
+
+void Scene1337::Action1337::skipFrames(int32 skipCount) {
+ uint32 firstFrameNumber = g_globals->_events.getFrameNumber();
+ uint32 tmpFrameNumber = firstFrameNumber;
+
+ while (tmpFrameNumber < firstFrameNumber + skipCount)
+ tmpFrameNumber = g_globals->_events.getFrameNumber();
+
+ warning("_eventManager.waitEvent(-1)");
+}
+
+void Scene1337::Action1::signal() {
+ Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 1: {
+ scene->actionDisplay(1331, 6, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ R2_GLOBALS._sceneObjects->draw();
+ scene->actionDisplay(1331, 7, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ scene->actionDisplay(1331, 8, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+
+ scene->_arrunkObj1337[1]._arr2[0]._field34 = 2;
+ scene->_arrunkObj1337[1]._arr2[0]._object1.postInit();
+ scene->_arrunkObj1337[1]._arr2[0]._object1.setVisage(1332);
+ scene->_arrunkObj1337[1]._arr2[0]._object1.setPosition(scene->_arrunkObj1337[1]._arr2[0]._field36, 0);
+ scene->_arrunkObj1337[1]._arr2[0]._object1.setStrip(2);
+ scene->_arrunkObj1337[1]._arr2[0]._object1.setFrame(scene->_arrunkObj1337[1]._arr2[0]._field34);
+ scene->_arrunkObj1337[1]._arr2[0]._object1.fixPriority(170);
+ scene->setAnimationInfo(&scene->_arrunkObj1337[1]._arr2[0]);
+
+ scene->_arrunkObj1337[1]._arr2[1]._field34 = 3;
+ scene->_arrunkObj1337[1]._arr2[1]._object1.postInit();
+ scene->_arrunkObj1337[1]._arr2[1]._object1.setVisage(1332);
+ scene->_arrunkObj1337[1]._arr2[1]._object1.setPosition(scene->_arrunkObj1337[1]._arr2[1]._field36, 0);
+ scene->_arrunkObj1337[1]._arr2[1]._object1.setStrip(2);
+ scene->_arrunkObj1337[1]._arr2[1]._object1.setFrame(scene->_arrunkObj1337[1]._arr2[1]._field34);
+ scene->_arrunkObj1337[1]._arr2[1]._object1.fixPriority(170);
+ scene->setAnimationInfo(&scene->_arrunkObj1337[1]._arr2[1]);
+
+ scene->_arrunkObj1337[2]._arr2[0]._field34 = 4;
+ scene->_arrunkObj1337[2]._arr2[0]._object1.postInit();
+ scene->_arrunkObj1337[2]._arr2[0]._object1.setVisage(1332);
+ scene->_arrunkObj1337[2]._arr2[0]._object1.setPosition(scene->_arrunkObj1337[2]._arr2[0]._field36, 0);
+ scene->_arrunkObj1337[2]._arr2[0]._object1.setStrip(2);
+ scene->_arrunkObj1337[2]._arr2[0]._object1.setFrame(scene->_arrunkObj1337[2]._arr2[0]._field34);
+ scene->_arrunkObj1337[2]._arr2[0]._object1.fixPriority(170);
+ scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr2[0]);
+
+ scene->_arrunkObj1337[3]._arr2[0]._field34 = 5;
+ scene->_arrunkObj1337[3]._arr2[0]._object1.postInit();
+ scene->_arrunkObj1337[3]._arr2[0]._object1.setVisage(1332);
+ scene->_arrunkObj1337[3]._arr2[0]._object1.setPosition(scene->_arrunkObj1337[3]._arr2[0]._field36, 0);
+ scene->_arrunkObj1337[3]._arr2[0]._object1.setStrip(2);
+ scene->_arrunkObj1337[3]._arr2[0]._object1.setFrame(scene->_arrunkObj1337[3]._arr2[0]._field34);
+ scene->_arrunkObj1337[3]._arr2[0]._object1.fixPriority(170);
+ scene->setAnimationInfo(&scene->_arrunkObj1337[3]._arr2[0]);
+
+ scene->_arrunkObj1337[3]._arr2[1]._field34 = 6;
+ scene->_arrunkObj1337[3]._arr2[1]._object1.postInit();
+ scene->_arrunkObj1337[3]._arr2[1]._object1.setVisage(1332);
+ scene->_arrunkObj1337[3]._arr2[1]._object1.setPosition(scene->_arrunkObj1337[3]._arr2[1]._field36, 0);
+ scene->_arrunkObj1337[3]._arr2[1]._object1.setStrip(2);
+ scene->_arrunkObj1337[3]._arr2[1]._object1.setFrame(scene->_arrunkObj1337[3]._arr2[1]._field34);
+ scene->_arrunkObj1337[3]._arr2[1]._object1.fixPriority(170);
+ scene->setAnimationInfo(&scene->_arrunkObj1337[3]._arr2[1]);
+
+ scene->_arrunkObj1337[3]._arr2[2]._field34 = 7;
+ scene->_arrunkObj1337[3]._arr2[2]._object1.postInit();
+ scene->_arrunkObj1337[3]._arr2[2]._object1.setVisage(1332);
+ scene->_arrunkObj1337[3]._arr2[2]._object1.setPosition(scene->_arrunkObj1337[3]._arr2[2]._field36, 0);
+ scene->_arrunkObj1337[3]._arr2[2]._object1.setStrip(2);
+ scene->_arrunkObj1337[3]._arr2[2]._object1.setFrame(scene->_arrunkObj1337[3]._arr2[2]._field34);
+ scene->_arrunkObj1337[3]._arr2[2]._object1.fixPriority(170);
+ scene->setAnimationInfo(&scene->_arrunkObj1337[3]._arr2[2]);
+
+ scene->_arrunkObj1337[0]._arr2[0]._field34 = 8;
+ scene->_arrunkObj1337[0]._arr2[0]._object1.postInit();
+ scene->_arrunkObj1337[0]._arr2[0]._object1.setVisage(1332);
+ scene->_arrunkObj1337[0]._arr2[0]._object1.setPosition(scene->_arrunkObj1337[0]._arr2[0]._field36, 0);
+ scene->_arrunkObj1337[0]._arr2[0]._object1.setStrip(2);
+ scene->_arrunkObj1337[0]._arr2[0]._object1.setFrame(scene->_arrunkObj1337[0]._arr2[0]._field34);
+ scene->_arrunkObj1337[0]._arr2[0]._object1.fixPriority(170);
+ scene->setAnimationInfo(&scene->_arrunkObj1337[0]._arr2[0]);
+
+ scene->_arrunkObj1337[0]._arr2[1]._field34 = 9;
+ scene->_arrunkObj1337[0]._arr2[1]._object1.postInit();
+ scene->_arrunkObj1337[0]._arr2[1]._object1.setVisage(1332);
+ scene->_arrunkObj1337[0]._arr2[1]._object1.setPosition(scene->_arrunkObj1337[0]._arr2[1]._field36, 0);
+ scene->_arrunkObj1337[0]._arr2[1]._object1.setStrip(2);
+ scene->_arrunkObj1337[0]._arr2[1]._object1.setFrame(scene->_arrunkObj1337[0]._arr2[1]._field34);
+ scene->_arrunkObj1337[0]._arr2[1]._object1.fixPriority(170);
+ scene->setAnimationInfo(&scene->_arrunkObj1337[0]._arr2[1]);
+
+ R2_GLOBALS._sceneObjects->draw();
+
+ skipFrames(60);
+ scene->actionDisplay(1331, 9, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+
+ scene->_arrunkObj1337[2]._arr2[1]._field34 = 2;
+ scene->_arrunkObj1337[2]._arr2[1]._object1.postInit();
+ scene->_arrunkObj1337[2]._arr2[1]._object1.setVisage(1332);
+ scene->_arrunkObj1337[2]._arr2[1]._object1.setPosition(scene->_arrunkObj1337[2]._arr2[1]._field36, 0);
+ scene->_arrunkObj1337[2]._arr2[1]._object1.setStrip(2);
+ scene->_arrunkObj1337[2]._arr2[1]._object1.setFrame(scene->_arrunkObj1337[2]._arr2[1]._field34);
+ scene->_arrunkObj1337[2]._arr2[1]._object1.fixPriority(170);
+ scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr2[1]);
+
+ scene->_arrunkObj1337[2]._arr2[2]._field34 = 3;
+ scene->_arrunkObj1337[2]._arr2[2]._object1.postInit();
+ scene->_arrunkObj1337[2]._arr2[2]._object1.setVisage(1332);
+ scene->_arrunkObj1337[2]._arr2[2]._object1.setPosition(scene->_arrunkObj1337[2]._arr2[2]._field36, 0);
+ scene->_arrunkObj1337[2]._arr2[2]._object1.setStrip(2);
+ scene->_arrunkObj1337[2]._arr2[2]._object1.setFrame(scene->_arrunkObj1337[2]._arr2[2]._field34);
+ scene->_arrunkObj1337[2]._arr2[2]._object1.fixPriority(170);
+ scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr2[2]);
+
+ scene->_arrunkObj1337[2]._arr2[3]._field34 = 5;
+ scene->_arrunkObj1337[2]._arr2[3]._object1.postInit();
+ scene->_arrunkObj1337[2]._arr2[3]._object1.setVisage(1332);
+ scene->_arrunkObj1337[2]._arr2[3]._object1.setPosition(scene->_arrunkObj1337[2]._arr2[3]._field36, 0);
+ scene->_arrunkObj1337[2]._arr2[3]._object1.setStrip(2);
+ scene->_arrunkObj1337[2]._arr2[3]._object1.setFrame(scene->_arrunkObj1337[2]._arr2[3]._field34);
+ scene->_arrunkObj1337[2]._arr2[3]._object1.fixPriority(170);
+ scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr2[3]);
+
+ scene->_arrunkObj1337[2]._arr2[4]._field34 = 6;
+ scene->_arrunkObj1337[2]._arr2[4]._object1.postInit();
+ scene->_arrunkObj1337[2]._arr2[4]._object1.setVisage(1332);
+ scene->_arrunkObj1337[2]._arr2[4]._object1.setPosition(scene->_arrunkObj1337[2]._arr2[4]._field36, 0);
+ scene->_arrunkObj1337[2]._arr2[4]._object1.setStrip(2);
+ scene->_arrunkObj1337[2]._arr2[4]._object1.setFrame(scene->_arrunkObj1337[2]._arr2[4]._field34);
+ scene->_arrunkObj1337[2]._arr2[4]._object1.fixPriority(170);
+ scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr2[4]);
+
+ scene->_arrunkObj1337[2]._arr2[5]._field34 = 7;
+ scene->_arrunkObj1337[2]._arr2[5]._object1.postInit();
+ scene->_arrunkObj1337[2]._arr2[5]._object1.setVisage(1332);
+ scene->_arrunkObj1337[2]._arr2[5]._object1.setPosition(scene->_arrunkObj1337[2]._arr2[5]._field36, 0);
+ scene->_arrunkObj1337[2]._arr2[5]._object1.setStrip(2);
+ scene->_arrunkObj1337[2]._arr2[5]._object1.setFrame(scene->_arrunkObj1337[2]._arr2[5]._field34);
+ scene->_arrunkObj1337[2]._arr2[5]._object1.fixPriority(170);
+ scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr2[5]);
+
+ scene->_arrunkObj1337[2]._arr2[6]._field34 = 8;
+ scene->_arrunkObj1337[2]._arr2[6]._object1.postInit();
+ scene->_arrunkObj1337[2]._arr2[6]._object1.setVisage(1332);
+ scene->_arrunkObj1337[2]._arr2[6]._object1.setPosition(scene->_arrunkObj1337[2]._arr2[6]._field36, 0);
+ scene->_arrunkObj1337[2]._arr2[6]._object1.setStrip(2);
+ scene->_arrunkObj1337[2]._arr2[6]._object1.setFrame(scene->_arrunkObj1337[2]._arr2[6]._field34);
+ scene->_arrunkObj1337[2]._arr2[6]._object1.fixPriority(170);
+ scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr2[6]);
+
+ scene->_arrunkObj1337[2]._arr2[7]._field34 = 9;
+ scene->_arrunkObj1337[2]._arr2[7]._object1.postInit();
+ scene->_arrunkObj1337[2]._arr2[7]._object1.setVisage(1332);
+ scene->_arrunkObj1337[2]._arr2[7]._object1.setPosition(scene->_arrunkObj1337[2]._arr2[7]._field36, 0);
+ scene->_arrunkObj1337[2]._arr2[7]._object1.setStrip(2);
+ scene->_arrunkObj1337[2]._arr2[7]._object1.setFrame(scene->_arrunkObj1337[2]._arr2[7]._field34);
+ scene->_arrunkObj1337[2]._arr2[7]._object1.fixPriority(170);
+ scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr2[7]);
+
+ scene->_aSound1.play(62);
+
+ R2_GLOBALS._sceneObjects->draw();
+
+ skipFrames(120);
+ scene->_arrunkObj1337[2]._arr2[0]._object1.remove();
+ scene->_arrunkObj1337[2]._arr2[1]._object1.remove();
+ scene->_arrunkObj1337[2]._arr2[2]._object1.remove();
+ scene->_arrunkObj1337[2]._arr2[3]._object1.remove();
+ scene->_arrunkObj1337[2]._arr2[4]._object1.remove();
+ scene->_arrunkObj1337[2]._arr2[5]._object1.remove();
+ scene->_arrunkObj1337[2]._arr2[6]._object1.remove();
+ scene->_arrunkObj1337[2]._arr2[7]._object1.remove();
+
+ scene->_arrunkObj1337[1]._arr2[0]._object1.remove();
+ scene->_arrunkObj1337[1]._arr2[1]._object1.remove();
+
+ scene->_arrunkObj1337[3]._arr2[0]._object1.remove();
+ scene->_arrunkObj1337[3]._arr2[1]._object1.remove();
+ scene->_arrunkObj1337[3]._arr2[2]._object1.remove();
+
+ scene->_arrunkObj1337[0]._arr2[0]._object1.remove();
+ scene->_arrunkObj1337[0]._arr2[1]._object1.remove();
+
+ scene->_background2.setup2(1332, 5, 1, 165, 95, 110, 1);
+
+ scene->_arrunkObj1337[1]._arr1[0]._object1.postInit();
+ scene->_arrunkObj1337[1]._arr1[0]._object1.setVisage(1332);
+ scene->_arrunkObj1337[1]._arr1[0]._object1.setPosition(scene->_arrunkObj1337[1]._arr1[0]._field36, 0);
+ scene->_arrunkObj1337[1]._arr1[0]._object1.setStrip(1);
+ scene->_arrunkObj1337[1]._arr1[0]._object1.setFrame(4);
+ scene->_arrunkObj1337[1]._arr1[0]._object1.fixPriority(170);
+
+ scene->_arrunkObj1337[1]._arr1[1]._object1.postInit();
+ scene->_arrunkObj1337[1]._arr1[1]._object1.setVisage(1332);
+ scene->_arrunkObj1337[1]._arr1[1]._object1.setPosition(scene->_arrunkObj1337[1]._arr1[1]._field36, 0);
+ scene->_arrunkObj1337[1]._arr1[1]._object1.setStrip(1);
+ scene->_arrunkObj1337[1]._arr1[1]._object1.setFrame(4);
+ scene->_arrunkObj1337[1]._arr1[1]._object1.fixPriority(170);
+
+ scene->_arrunkObj1337[1]._arr1[2]._object1.postInit();
+ scene->_arrunkObj1337[1]._arr1[2]._object1.setVisage(1332);
+ scene->_arrunkObj1337[1]._arr1[2]._object1.setPosition(scene->_arrunkObj1337[1]._arr1[2]._field36, 0);
+ scene->_arrunkObj1337[1]._arr1[2]._object1.setStrip(1);
+ scene->_arrunkObj1337[1]._arr1[2]._object1.setFrame(4);
+ scene->_arrunkObj1337[1]._arr1[2]._object1.fixPriority(170);
+
+ scene->_arrunkObj1337[2]._arr1[0]._field34 = 30;
+ scene->_arrunkObj1337[2]._arr1[0]._object1.postInit();
+ scene->_arrunkObj1337[2]._arr1[0]._object1.setVisage(1332);
+ scene->_arrunkObj1337[2]._arr1[0]._object1.setPosition(scene->_arrunkObj1337[2]._arr1[0]._field36, 0);
+ scene->_arrunkObj1337[2]._arr1[0]._object1.setStrip(1);
+ scene->_arrunkObj1337[2]._arr1[0]._object1.setFrame(2);
+ scene->_arrunkObj1337[2]._arr1[0]._object1.fixPriority(170);
+ scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr1[0]);
+
+ scene->_arrunkObj1337[2]._arr1[1]._field34 = 16;
+ scene->_arrunkObj1337[2]._arr1[1]._object1.postInit();
+ scene->_arrunkObj1337[2]._arr1[1]._object1.setVisage(1332);
+ scene->_arrunkObj1337[2]._arr1[1]._object1.setPosition(scene->_arrunkObj1337[2]._arr1[1]._field36, 0);
+ scene->_arrunkObj1337[2]._arr1[1]._object1.setStrip(1);
+ scene->_arrunkObj1337[2]._arr1[1]._object1.setFrame(2);
+ scene->_arrunkObj1337[2]._arr1[1]._object1.fixPriority(170);
+ scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr1[1]);
+
+ scene->_arrunkObj1337[2]._arr1[2]._field34 = 1;
+ scene->_arrunkObj1337[2]._arr1[2]._object1.postInit();
+ scene->_arrunkObj1337[2]._arr1[2]._object1.setVisage(1332);
+ scene->_arrunkObj1337[2]._arr1[2]._object1.setPosition(scene->_arrunkObj1337[2]._arr1[2]._field36, 0);
+ scene->_arrunkObj1337[2]._arr1[2]._object1.setStrip(1);
+ scene->_arrunkObj1337[2]._arr1[2]._object1.setFrame(2);
+ scene->_arrunkObj1337[2]._arr1[2]._object1.fixPriority(170);
+ scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr1[2]);
+
+ scene->_arrunkObj1337[3]._arr1[0]._object1.postInit();
+ scene->_arrunkObj1337[3]._arr1[0]._object1.setVisage(1332);
+ scene->_arrunkObj1337[3]._arr1[0]._object1.setPosition(scene->_arrunkObj1337[3]._arr1[0]._field36, 0);
+ scene->_arrunkObj1337[3]._arr1[0]._object1.setStrip(1);
+ scene->_arrunkObj1337[3]._arr1[0]._object1.setFrame(3);
+ scene->_arrunkObj1337[3]._arr1[0]._object1.fixPriority(170);
+
+ scene->_arrunkObj1337[3]._arr1[1]._object1.postInit();
+ scene->_arrunkObj1337[3]._arr1[1]._object1.setVisage(1332);
+ scene->_arrunkObj1337[3]._arr1[1]._object1.setPosition(scene->_arrunkObj1337[3]._arr1[1]._field36, 0);
+ scene->_arrunkObj1337[3]._arr1[1]._object1.setStrip(1);
+ scene->_arrunkObj1337[3]._arr1[1]._object1.setFrame(3);
+ scene->_arrunkObj1337[3]._arr1[1]._object1.fixPriority(170);
+
+ scene->_arrunkObj1337[3]._arr1[2]._object1.postInit();
+ scene->_arrunkObj1337[3]._arr1[2]._object1.setVisage(1332);
+ scene->_arrunkObj1337[3]._arr1[2]._object1.setPosition(scene->_arrunkObj1337[3]._arr1[2]._field36, 0);
+ scene->_arrunkObj1337[3]._arr1[2]._object1.setStrip(1);
+ scene->_arrunkObj1337[3]._arr1[2]._object1.setFrame(3);
+ scene->_arrunkObj1337[3]._arr1[2]._object1.fixPriority(170);
+
+ scene->_arrunkObj1337[0]._arr1[0]._object1.postInit();
+ scene->_arrunkObj1337[0]._arr1[0]._object1.setVisage(1332);
+ scene->_arrunkObj1337[0]._arr1[0]._object1.setPosition(scene->_arrunkObj1337[0]._arr1[0]._field36, 0);
+ scene->_arrunkObj1337[0]._arr1[0]._object1.setStrip(1);
+ scene->_arrunkObj1337[0]._arr1[0]._object1.setFrame(2);
+ scene->_arrunkObj1337[0]._arr1[0]._object1.fixPriority(170);
+
+ scene->_arrunkObj1337[0]._arr1[1]._object1.postInit();
+ scene->_arrunkObj1337[0]._arr1[1]._object1.setVisage(1332);
+ scene->_arrunkObj1337[0]._arr1[1]._object1.setPosition(scene->_arrunkObj1337[0]._arr1[1]._field36, 0);
+ scene->_arrunkObj1337[0]._arr1[1]._object1.setStrip(1);
+ scene->_arrunkObj1337[0]._arr1[1]._object1.setFrame(2);
+ scene->_arrunkObj1337[0]._arr1[1]._object1.fixPriority(170);
+
+ scene->_arrunkObj1337[0]._arr1[2]._object1.postInit();
+ scene->_arrunkObj1337[0]._arr1[2]._object1.setVisage(1332);
+ scene->_arrunkObj1337[0]._arr1[2]._object1.setPosition(scene->_arrunkObj1337[0]._arr1[2]._field36, 0);
+ scene->_arrunkObj1337[0]._arr1[2]._object1.setStrip(1);
+ scene->_arrunkObj1337[0]._arr1[2]._object1.setFrame(2);
+ scene->_arrunkObj1337[0]._arr1[2]._object1.fixPriority(170);
+
+ R2_GLOBALS._sceneObjects->draw();
+
+ scene->actionDisplay(1331, 10, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ scene->_item2._object1.setPosition(Common::Point(162, 95), 0);
+ scene->_item2._object1.show();
+ scene->_aSound2.play(61);
+
+ Common::Point pt(91, 174);
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &pt, this);
+ }
+ break;
+ case 2: {
+ scene->_arrunkObj1337[2]._arr1[3]._field34 = 2;
+ scene->_arrunkObj1337[2]._arr1[3]._object1.postInit();
+ scene->_arrunkObj1337[2]._arr1[3]._object1.setVisage(1332);
+ scene->_arrunkObj1337[2]._arr1[3]._object1.setPosition(scene->_arrunkObj1337[2]._arr1[3]._field36, 0);
+ scene->_arrunkObj1337[2]._arr1[3]._object1.setStrip(1);
+ scene->_arrunkObj1337[2]._arr1[3]._object1.setFrame(2);
+ scene->_arrunkObj1337[2]._arr1[3]._object1.fixPriority(170);
+
+ scene->_item2._object1.hide();
+ scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr1[3]);
+
+ R2_GLOBALS._sceneObjects->draw();
+
+ skipFrames(60);
+ scene->actionDisplay(1331, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ scene->actionDisplay(1331, 12, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+
+ scene->_arrunkObj1337[2]._arr2[1]._field34 = 1;
+ scene->_arrunkObj1337[2]._arr2[1]._object1.postInit();
+ scene->_arrunkObj1337[2]._arr2[1]._object1.setVisage(1332);
+ scene->_arrunkObj1337[2]._arr2[1]._object1.setPosition(scene->_arrunkObj1337[2]._arr2[1]._field36, 0);
+ scene->_arrunkObj1337[2]._arr2[1]._object1.hide();
+
+ scene->_item2._object1.setStrip(scene->_arrunkObj1337[2]._arr1[2]._object1._strip);
+ scene->_item2._object1.setFrame(scene->_arrunkObj1337[2]._arr1[2]._object1._frame);
+ scene->_item2._object1.animate(ANIM_MODE_NONE, NULL);
+
+ scene->_arrunkObj1337[2]._arr1[2]._field34 = 0;
+ scene->_arrunkObj1337[2]._arr1[2]._object1.remove();
+
+ scene->_item2._object1.setPosition(scene->_arrunkObj1337[2]._arr1[2]._field36, 0);
+ scene->_item2._object1.show();
+
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_arrunkObj1337[2]._arr2[1]._field36, this);
+ }
+ break;
+ case 3: {
+ scene->_item2._object1.hide();
+ scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr2[1]);
+ scene->_aSound1.play(59);
+
+ R2_GLOBALS._sceneObjects->draw();
+
+ skipFrames(60);
+ scene->actionDisplay(1331, 13, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+
+ scene->_arrunkObj1337[2]._arr2[1]._field34 = scene->_arrunkObj1337[2]._arr1[3]._field34;
+
+ scene->_item2._object1.setStrip(scene->_arrunkObj1337[2]._arr1[3]._object1._strip);
+ scene->_item2._object1.setFrame(scene->_arrunkObj1337[2]._arr1[3]._object1._frame);
+
+ scene->_arrunkObj1337[2]._arr1[3]._field34 = 0;
+ scene->_arrunkObj1337[2]._arr1[3]._object1.remove();
+
+ scene->_item2._object1.setPosition(scene->_arrunkObj1337[2]._arr1[3]._field36, 0);
+ scene->_item2._object1.show();
+
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_arrunkObj1337[2]._arr2[1]._field36, this);
+ }
+ break;
+ case 4: {
+ scene->_item2._object1.hide();
+ scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr2[1]);
+ scene->_aSound1.play(59);
+
+ scene->_item7._field34 = 1;
+ scene->_item7._object1.hide();
+
+ scene->_item2._object1.setStrip(5);
+ scene->_item2._object1.setFrame(1);
+ scene->_item2._object1.animate(ANIM_MODE_2, NULL);
+ scene->_item2._object1.setPosition(scene->_arrunkObj1337[2]._arr2[1]._field36, 0);
+ scene->_item2._object1.show();
+
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_item7._field36, this);
+ }
+ break;
+ case 5: {
+ scene->_item2._object1.hide();
+
+ scene->_item7._object1.postInit();
+ scene->_item7._object1.setVisage(1332);
+ scene->_item7._object1.setPosition(scene->_item7._field36, 0);
+ scene->setAnimationInfo(&scene->_item7);
+ scene->_aSound2.play(61);
+
+ R2_GLOBALS._sceneObjects->draw();
+
+ skipFrames(60);
+ scene->actionDisplay(1331, 14, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+
+ scene->_arrunkObj1337[2]._arr3[0]._object1.postInit();
+ scene->_arrunkObj1337[2]._arr3[0]._object1.setVisage(1332);
+ scene->_arrunkObj1337[2]._arr3[0]._object1.setPosition(scene->_arrunkObj1337[2]._arr3[0]._field36, 0);
+ scene->_arrunkObj1337[2]._arr3[0]._object1.hide();
+
+ scene->_arrunkObj1337[3]._arr1[2]._field34 = 0;
+ scene->_arrunkObj1337[3]._arr1[2].remove();
+
+ scene->_item2._object1.setPosition(scene->_arrunkObj1337[3]._arr1[2]._field36, 0);
+ scene->_item2._object1.show();
+
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_arrunkObj1337[2]._arr3[0]._field36, this);
+ }
+ break;
+ case 6: {
+ scene->_item2._object1.hide();
+ scene->_arrunkObj1337[2]._arr3[0]._field34 = 21;
+ scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr3[0]);
+ scene->_aSound1.play(57);
+
+ R2_GLOBALS._sceneObjects->draw();
+
+ skipFrames(60);
+ scene->actionDisplay(1331, 15, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+
+ int tmpVal = 15;
+ int i = -1;
+
+ for (i = 0; i <= 7; i++) {
+ tmpVal += 29;
+
+ scene->_arrObject1[i].postInit();
+ scene->_arrObject1[i].setVisage(1332);
+ scene->_arrObject1[i].setPosition(Common::Point(tmpVal, 90), 0);
+ scene->_arrObject1[i].setStrip(3);
+ scene->_arrObject1[i].fixPriority(190);
+
+ scene->_arrObject2[i].postInit();
+ scene->_arrObject2[i].setVisage(1332);
+ scene->_arrObject2[i].setPosition(Common::Point(tmpVal, 90), 0);
+ scene->_arrObject2[i].setStrip(7);
+ scene->_arrObject2[i].setFrame(1);
+ scene->_arrObject2[i].fixPriority(180);
+ }
+
+ scene->_arrObject1[0].setFrame(1);
+ scene->_arrObject1[1].setFrame(3);
+ scene->_arrObject1[2].setFrame(6);
+ scene->_arrObject1[3].setFrame(8);
+ scene->_arrObject1[4].setFrame(9);
+ scene->_arrObject1[5].setFrame(10);
+ scene->_arrObject1[6].setFrame(11);
+ scene->_arrObject1[7].setFrame(12);
+
+ R2_GLOBALS._sceneObjects->draw();
+
+ skipFrames(240);
+
+ scene->_arrObject1[0].remove();
+ scene->_arrObject1[1].remove();
+ scene->_arrObject1[2].remove();
+ scene->_arrObject1[3].remove();
+ scene->_arrObject1[4].remove();
+ scene->_arrObject1[5].remove();
+ scene->_arrObject1[6].remove();
+ scene->_arrObject1[7].remove();
+
+ scene->_arrObject2[0].remove();
+ scene->_arrObject2[1].remove();
+ scene->_arrObject2[2].remove();
+ scene->_arrObject2[3].remove();
+ scene->_arrObject2[4].remove();
+ scene->_arrObject2[5].remove();
+ scene->_arrObject2[6].remove();
+ scene->_arrObject2[7].remove();
+
+ scene->_item7._field34 = scene->_arrunkObj1337[2]._arr3[0]._field34;
+
+ scene->_arrunkObj1337[2]._arr3[0]._field34 = 0;
+ scene->_arrunkObj1337[2]._arr3[0]._object1.remove();
+
+ scene->_item2._object1.setPosition(scene->_arrunkObj1337[2]._arr3[0]._field36, 0);
+ scene->_item2._object1.show();
+
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_item7._field36, this);
+ }
+ break;
+ case 7: {
+ scene->_item2._object1.hide();
+ scene->setAnimationInfo(&scene->_item7);
+ scene->_aSound2.play(61);
+
+ R2_GLOBALS._sceneObjects->draw();
+
+ scene->_arrunkObj1337[2]._arr3[0]._object1.postInit();
+ scene->_arrunkObj1337[2]._arr3[0]._object1.setVisage(1332);
+ scene->_arrunkObj1337[2]._arr3[0]._object1.setPosition(scene->_arrunkObj1337[2]._arr3[0]._field36, 0);
+ scene->_arrunkObj1337[2]._arr3[0]._object1.hide();
+
+ scene->_arrunkObj1337[3]._arr1[1]._field34 = 0;
+ scene->_arrunkObj1337[3]._arr1[1].remove();
+
+ scene->_item2._object1.setPosition(scene->_arrunkObj1337[3]._arr1[1]._field36, 0);
+ scene->_item2._object1.show();
+
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_arrunkObj1337[2]._arr3[0]._field36, this);
+ }
+ break;
+ case 8: {
+ scene->_item2._object1.hide();
+ scene->_arrunkObj1337[2]._arr3[0]._field34 = 14;
+ scene->setAnimationInfo(&scene->_arrunkObj1337[2]._arr3[0]);
+ scene->_aSound1.play(57);
+
+ R2_GLOBALS._sceneObjects->draw();
+
+ scene->actionDisplay(1331, 16, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ int tmpVal = 72;
+ int i = -1;
+
+ for (i = 0; i <= 3; i++) {
+ tmpVal += 29;
+ scene->_arrObject1[i].postInit();
+ scene->_arrObject1[i].setVisage(1332);
+ scene->_arrObject1[i].setPosition(Common::Point(tmpVal, 71), 0);
+ scene->_arrObject1[i].setStrip(3);
+ scene->_arrObject1[i].fixPriority(190);
+
+ scene->_arrObject2[i].postInit();
+ scene->_arrObject2[i].setVisage(1332);
+ scene->_arrObject2[i].setPosition(Common::Point(tmpVal, 71), 0);
+ scene->_arrObject2[i].setStrip(7);
+ scene->_arrObject2[i].setFrame(1);
+ scene->_arrObject2[i].fixPriority(180);
+ }
+
+ scene->_arrObject1[0].setFrame(2);
+ scene->_arrObject1[1].setFrame(5);
+ scene->_arrObject1[2].setFrame(7);
+ scene->_arrObject1[3].setFrame(15);
+
+ R2_GLOBALS._sceneObjects->draw();
+
+ skipFrames(240);
+ scene->actionDisplay(1331, 17, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+
+ tmpVal = 72;
+ for (i = 4; i <= 7; i++) {
+ tmpVal += 29;
+
+ scene->_arrObject1[i].postInit();
+ scene->_arrObject1[i].setVisage(1332);
+ scene->_arrObject1[i].setPosition(Common::Point(tmpVal, 100), 0);
+ scene->_arrObject1[i].setStrip(4);
+ scene->_arrObject1[i].fixPriority(190);
+
+ scene->_arrObject2[i].postInit();
+ scene->_arrObject2[i].setVisage(1332);
+ scene->_arrObject2[i].setPosition(Common::Point(tmpVal, 100), 0);
+ scene->_arrObject2[i].setStrip(7);
+ scene->_arrObject2[i].setFrame(1);
+ scene->_arrObject2[i].fixPriority(180);
+ }
+
+ scene->_arrObject1[4].setFrame(1);
+ scene->_arrObject1[5].setFrame(5);
+ scene->_arrObject1[6].setFrame(7);
+ scene->_arrObject1[7].setFrame(3);
+
+ R2_GLOBALS._sceneObjects->draw();
+
+ skipFrames(240);
+
+ scene->_arrObject1[0].remove();
+ scene->_arrObject1[1].remove();
+ scene->_arrObject1[2].remove();
+ scene->_arrObject1[3].remove();
+ scene->_arrObject1[4].remove();
+ scene->_arrObject1[5].remove();
+ scene->_arrObject1[6].remove();
+ scene->_arrObject1[7].remove();
+
+ scene->_arrObject2[0].remove();
+ scene->_arrObject2[1].remove();
+ scene->_arrObject2[2].remove();
+ scene->_arrObject2[3].remove();
+ scene->_arrObject2[4].remove();
+ scene->_arrObject2[5].remove();
+ scene->_arrObject2[6].remove();
+ scene->_arrObject2[7].remove();
+
+ scene->_item7._field34 = scene->_arrunkObj1337[2]._arr1[0]._field34;
+
+ scene->_item2._object1.setStrip(scene->_arrunkObj1337[2]._arr1[0]._object1._strip);
+ scene->_item2._object1.setFrame(scene->_arrunkObj1337[2]._arr1[0]._object1._frame);
+ scene->_item2._object1.animate(ANIM_MODE_NONE, NULL);
+
+ scene->_arrunkObj1337[2]._arr1[0]._field34 = 0;
+ scene->_arrunkObj1337[2]._arr1[0]._object1.remove();
+
+ scene->_item2._object1.setPosition(scene->_arrunkObj1337[2]._arr1[0]._field36, 0);
+ scene->_item2._object1.show();
+
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_arrunkObj1337[2]._arr3[0]._field36, this);
+ }
+ break;
+ case 9: {
+ scene->_aSound1.play(58);
+ scene->_arrunkObj1337[2]._arr3[0]._field34 = 0;
+ scene->_arrunkObj1337[2]._arr3[0].remove();
+ scene->_item2._object1.setStrip(5);
+ scene->_item2._object1.setFrame(1);
+ scene->_item2._object1.animate(ANIM_MODE_2, NULL);
+ scene->_item2._object1.setPosition(scene->_arrunkObj1337[2]._arr3[0]._field36, 0);
+ scene->_item2._object1.show();
+
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_item7._field36, this);
+ }
+ break;
+ case 10: {
+ scene->_item2._object1.hide();
+ scene->setAnimationInfo(&scene->_item7);
+ scene->_aSound2.play(61);
+
+ R2_GLOBALS._sceneObjects->draw();
+ scene->actionDisplay(1331, 18, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+
+ scene->_arrObject1[0].postInit();
+ scene->_arrObject1[0].setVisage(1332);
+ scene->_arrObject1[0].setPosition(Common::Point(131, 71), 0);
+ scene->_arrObject1[0].fixPriority(190);
+ scene->_arrObject1[0].setStrip(3);
+ scene->_arrObject1[0].setFrame(4);
+
+ scene->_arrObject2[0].postInit();
+ scene->_arrObject2[0].setVisage(1332);
+ scene->_arrObject2[0].setPosition(Common::Point(131, 71), 0);
+ scene->_arrObject2[0].setStrip(7);
+ scene->_arrObject2[0].setFrame(1);
+ scene->_arrObject2[0].fixPriority(180);
+
+ scene->_arrObject1[1].postInit();
+ scene->_arrObject1[1].setVisage(1332);
+ scene->_arrObject1[1].setPosition(Common::Point(160, 71), 0);
+ scene->_arrObject1[1].fixPriority(190);
+ scene->_arrObject1[1].setStrip(3);
+ scene->_arrObject1[1].setFrame(16);
+
+ scene->_arrObject2[1].postInit();
+ scene->_arrObject2[1].setVisage(1332);
+ scene->_arrObject2[1].setPosition(Common::Point(160, 71), 0);
+ scene->_arrObject2[1].setStrip(7);
+ scene->_arrObject2[1].setFrame(1);
+ scene->_arrObject2[1].fixPriority(180);
+
+ scene->_arrObject1[2].postInit();
+ scene->_arrObject1[2].setVisage(1332);
+ scene->_arrObject1[2].setPosition(Common::Point(131, 100), 0);
+ scene->_arrObject1[2].fixPriority(190);
+ scene->_arrObject1[2].setStrip(4);
+ scene->_arrObject1[2].setFrame(4);
+
+ scene->_arrObject2[2].postInit();
+ scene->_arrObject2[2].setVisage(1332);
+ scene->_arrObject2[2].setPosition(Common::Point(131, 100), 0);
+ scene->_arrObject2[2].setStrip(7);
+ scene->_arrObject2[2].setFrame(1);
+ scene->_arrObject2[2].fixPriority(180);
+
+ scene->_arrObject1[3].postInit();
+ scene->_arrObject1[3].setVisage(1332);
+ scene->_arrObject1[3].setPosition(Common::Point(160, 100), 0);
+ scene->_arrObject1[3].fixPriority(190);
+ scene->_arrObject1[3].setStrip(4);
+ scene->_arrObject1[3].setFrame(2);
+
+ scene->_arrObject2[3].postInit();
+ scene->_arrObject2[3].setVisage(1332);
+ scene->_arrObject2[3].setPosition(Common::Point(160, 100), 0);
+ scene->_arrObject2[3].setStrip(7);
+ scene->_arrObject2[3].setFrame(1);
+ scene->_arrObject2[3].fixPriority(180);
+
+ R2_GLOBALS._sceneObjects->draw();
+
+ skipFrames(240);
+
+ scene->_arrObject1[0].remove();
+ scene->_arrObject1[1].remove();
+ scene->_arrObject1[2].remove();
+ scene->_arrObject1[3].remove();
+
+ scene->_arrObject2[0].remove();
+ scene->_arrObject2[1].remove();
+ scene->_arrObject2[2].remove();
+ scene->_arrObject2[3].remove();
+
+ scene->_object1.setFrame(1);
+ scene->_object1.show();
+ scene->_object1.animate(ANIM_MODE_2, NULL);
+
+ R2_GLOBALS._sceneObjects->draw();
+
+ scene->actionDisplay(1331, 19, 159, 10, 1, 220, 0, 7, 0, 154, 154);
+
+ scene->_object1.hide();
+
+ scene->actionDisplay(1331, 20, 159, 10, 1, 220, 0, 7, 0, 154, 154);
+ scene->actionDisplay(1331, 21, 159, 10, 1, 220, 0, 7, 0, 154, 154);
+
+ scene->_item7._field34 = scene->_arrunkObj1337[2]._arr1[1]._field34;
+
+ scene->_item2._object1.setStrip(scene->_arrunkObj1337[2]._arr1[1]._object1._strip);
+ scene->_item2._object1.setFrame(scene->_arrunkObj1337[2]._arr1[1]._object1._frame);
+ scene->_item2._object1.animate(ANIM_MODE_NONE, NULL);
+
+ scene->_arrunkObj1337[2]._arr1[1]._field34 = 0;
+ scene->_arrunkObj1337[2]._arr1[1]._object1.remove();
+
+ scene->_item2._object1.setPosition(scene->_arrunkObj1337[2]._arr1[1]._field36, 0);
+ scene->_item2._object1.show();
+
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_item7._field36, this);
+ }
+ break;
+ case 11: {
+ scene->_item2._object1.hide();
+ scene->setAnimationInfo(&scene->_item7);
+ scene->_aSound2.play(61);
+ scene->_item2._object1.setStrip(5);
+ scene->_item2._object1.setFrame(1);
+ scene->_item2._object1.animate(ANIM_MODE_2, NULL);
+
+ R2_GLOBALS._sceneObjects->draw();
+
+ scene->actionDisplay(1331, 22, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+
+ int i = -1;
+ for (i = 0; i <= 3; i ++) {
+ scene->_arrunkObj1337[3]._arr1[i]._field34 = 0;
+ scene->_arrunkObj1337[3]._arr1[i]._object1.remove();
+
+ scene->_arrunkObj1337[2]._arr1[i]._field34 = 0;
+ scene->_arrunkObj1337[2]._arr1[i]._object1.remove();
+
+ scene->_arrunkObj1337[0]._arr1[i]._field34 = 0;
+ scene->_arrunkObj1337[0]._arr1[i]._object1.remove();
+
+ scene->_arrunkObj1337[1]._arr1[i]._field34 = 0;
+ scene->_arrunkObj1337[1]._arr1[i]._object1.remove();
+ }
+
+ for (i = 0; i <= 7; i++) {
+ scene->_arrunkObj1337[3]._arr2[i]._field34 = 0;
+ scene->_arrunkObj1337[3]._arr2[i]._object1.remove();
+
+ scene->_arrunkObj1337[2]._arr2[i]._field34 = 0;
+ scene->_arrunkObj1337[2]._arr2[i]._object1.remove();
+
+ scene->_arrunkObj1337[0]._arr2[i]._field34 = 0;
+ scene->_arrunkObj1337[0]._arr2[i]._object1.remove();
+
+ scene->_arrunkObj1337[1]._arr2[i]._field34 = 0;
+ scene->_arrunkObj1337[1]._arr2[i]._object1.remove();
+ }
+
+ scene->_arrunkObj1337[2]._arr3[0]._field34 = 0;
+ scene->_arrunkObj1337[2]._arr3[0]._object1.remove();
+
+ scene->_item7._field34 = 0;
+ scene->_item7._object1.remove();
+
+ scene->_background2.remove();
+ }
+ // No break on purpose
+ case 0:
+ R2_GLOBALS._sceneObjects->draw();
+ signal();
+ break;
+ case 12:
+ scene->suggestInstructions();
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene1337::Action2::signal() {
+ Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_item3._object1.postInit();
+ scene->_item3._object1.setVisage(1332);
+ scene->_item3._object1.setStrip(8);
+ scene->_item3._object1.setFrame(1);
+ scene->_item3._object1.fixPriority(300);
+ scene->_item3._object1.setPosition(Common::Point(156, 108));
+
+ scene->_item7._object1.remove();
+ scene->_item7._field34 = 0;
+
+ scene->_aSound1.play(60);
+ scene->_item3._object1.animate(ANIM_MODE_5, this);
+ break;
+ case 1:
+ scene->_item3._object1.setFrame(1);
+
+ scene->_aSound1.play(60);
+ scene->_item3._object1.animate(ANIM_MODE_5, this);
+ break;
+ case 2: {
+ Common::Point pt(156, 108);
+ NpcMover *mover = new NpcMover();
+ scene->_item3._object1.addMover(mover, &pt, this);
+ }
+ break;
+ case 3:
+ scene->_item3._object1.remove();
+ scene->_background2.setup2(1332, 5, 1, 162, 95, 110, 1);
+ scene->_field423C = 1;
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene1337::Action3::signal() {
+ Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
+
+ scene->_item2._object1.setPosition(Common::Point(162, 95), 0);
+
+ switch (_actionIndex++) {
+ case 0: {
+ scene->_item2._object1._moveDiff = Common::Point(30, 30);
+ scene->_item2._object1.setVisage(1332);
+ scene->_item2._object1.setStrip(5);
+ scene->_item2._object1.setFrame(1);
+ scene->_item2._object1.fixPriority(400);
+ scene->_item2._object1.animate(ANIM_MODE_2, NULL);
+ scene->_aSound2.play(61);
+
+ Common::Point pt(283, 146);
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &pt, this);
+
+ scene->_item2._object1.show();
+ scene->_arrunkObj1337[1]._arr1[0]._field34 = scene->_field3E28[scene->_field3E24];
+ }
+ break;
+ case 1: {
+ scene->_arrunkObj1337[1]._arr1[0]._object1.postInit();
+ scene->_arrunkObj1337[1]._arr1[0]._object1._moveDiff = Common::Point(30, 30);
+ scene->_arrunkObj1337[1]._arr1[0]._object1.setVisage(1332);
+ scene->_arrunkObj1337[1]._arr1[0]._object1.setPosition(scene->_arrunkObj1337[1]._arr1[0]._field36, 0);
+ scene->_arrunkObj1337[1]._arr1[0]._object1.setStrip(1);
+ scene->_arrunkObj1337[1]._arr1[0]._object1.setFrame(4);
+ scene->_arrunkObj1337[1]._arr1[0]._object1.fixPriority(170);
+ scene->_aSound2.play(61);
+
+ Common::Point pt(10, 174);
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &pt, this);
+
+ scene->_arrunkObj1337[2]._arr1[0]._field34 = scene->_field3E28[scene->_field3E24];
+ }
+ break;
+ case 2: {
+ scene->_arrunkObj1337[2]._arr1[0]._object1.postInit();
+ scene->_arrunkObj1337[2]._arr1[0]._object1._moveDiff = Common::Point(30, 30);
+ scene->_arrunkObj1337[2]._arr1[0]._object1.setVisage(1332);
+ scene->_arrunkObj1337[2]._arr1[0]._object1.setPosition(scene->_arrunkObj1337[2]._arr1[0]._field36, 0);
+ scene->_arrunkObj1337[2]._arr1[0]._object1.fixPriority(170);
+ if (scene->_arrunkObj1337[2]._arr1[0]._field34 > 9) {
+ if (scene->_arrunkObj1337[2]._arr1[0]._field34 > 25) {
+ scene->_arrunkObj1337[2]._arr1[0]._object1.setStrip(4);
+ scene->_arrunkObj1337[2]._arr1[0]._object1.setFrame(scene->_arrunkObj1337[2]._arr1[0]._field34 - 25);
+ } else {
+ scene->_arrunkObj1337[2]._arr1[0]._object1.setStrip(3);
+ scene->_arrunkObj1337[2]._arr1[0]._object1.setFrame(scene->_arrunkObj1337[2]._arr1[0]._field34 - 9);
+ }
+ } else {
+ scene->_arrunkObj1337[2]._arr1[0]._object1.setStrip(2);
+ scene->_arrunkObj1337[2]._arr1[0]._object1.setFrame(scene->_arrunkObj1337[2]._arr1[0]._field34);
+ }
+ scene->_aSound2.play(61);
+
+ Common::Point pt(14, 14);
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &pt, this);
+
+ scene->_arrunkObj1337[3]._arr1[0]._field34 = scene->_field3E28[scene->_field3E24];
+ }
+ break;
+ case 3: {
+ scene->_arrunkObj1337[3]._arr1[0]._object1.postInit();
+ scene->_arrunkObj1337[3]._arr1[0]._object1._moveDiff = Common::Point(30, 30);
+ scene->_arrunkObj1337[3]._arr1[0]._object1.setVisage(1332);
+ scene->_arrunkObj1337[3]._arr1[0]._object1.setPosition(scene->_arrunkObj1337[3]._arr1[0]._field36, 0);
+ scene->_arrunkObj1337[3]._arr1[0]._object1.setStrip(1);
+ scene->_arrunkObj1337[3]._arr1[0]._object1.setFrame(3);
+ scene->_arrunkObj1337[3]._arr1[0]._object1.fixPriority(170);
+ scene->_aSound2.play(61);
+
+ Common::Point pt(280, 5);
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &pt, this);
+
+ scene->_arrunkObj1337[0]._arr1[0]._field34 = scene->_field3E28[scene->_field3E24];
+ }
+ break;
+ case 4: {
+ scene->_arrunkObj1337[0]._arr1[0]._object1.postInit();
+ scene->_arrunkObj1337[0]._arr1[0]._object1._moveDiff = Common::Point(30,30);
+ scene->_arrunkObj1337[0]._arr1[0]._object1.setVisage(1332);
+ scene->_arrunkObj1337[0]._arr1[0]._object1.setPosition(scene->_arrunkObj1337[0]._arr1[0]._field36, 0);
+ scene->_arrunkObj1337[0]._arr1[0]._object1.setStrip(5);
+ scene->_arrunkObj1337[0]._arr1[0]._object1.setFrame(1);
+ scene->_arrunkObj1337[0]._arr1[0]._object1.fixPriority(170);
+ scene->_aSound2.play(61);
+
+ Common::Point pt(283, 124);
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &pt, this);
+
+ scene->_arrunkObj1337[1]._arr1[1]._field34 = scene->_field3E28[scene->_field3E24];
+ }
+ break;
+ case 5: {
+ scene->_arrunkObj1337[1]._arr1[1]._object1.postInit();
+ scene->_arrunkObj1337[1]._arr1[1]._object1._moveDiff = Common::Point(30, 30);
+ scene->_arrunkObj1337[1]._arr1[1]._object1.setVisage(1332);
+ scene->_arrunkObj1337[1]._arr1[1]._object1.setPosition(scene->_arrunkObj1337[1]._arr1[1]._field36, 0);
+ scene->_arrunkObj1337[1]._arr1[1]._object1.setStrip(1);
+ scene->_arrunkObj1337[1]._arr1[1]._object1.setFrame(4);
+ scene->_arrunkObj1337[1]._arr1[1]._object1.fixPriority(170);
+ scene->_aSound2.play(61);
+
+ Common::Point pt(37, 174);
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &pt, this);
+
+ scene->_arrunkObj1337[2]._arr1[1]._field34 = scene->_field3E28[scene->_field3E24];
+ }
+ break;
+ case 6: {
+ scene->_arrunkObj1337[2]._arr1[1]._object1.postInit();
+ scene->_arrunkObj1337[2]._arr1[1]._object1._moveDiff = Common::Point(30, 30);
+ scene->_arrunkObj1337[2]._arr1[1]._object1.setVisage(1332);
+ scene->_arrunkObj1337[2]._arr1[1]._object1.setPosition(scene->_arrunkObj1337[2]._arr1[1]._field36, 0);
+ scene->_arrunkObj1337[2]._arr1[1]._object1.fixPriority(170);
+
+ if (scene->_arrunkObj1337[2]._arr1[1]._field34 > 9) {
+ if (scene->_arrunkObj1337[2]._arr1[1]._field34 > 25) {
+ scene->_arrunkObj1337[2]._arr1[1]._object1.setStrip(4);
+ scene->_arrunkObj1337[2]._arr1[1]._object1.setFrame(scene->_arrunkObj1337[2]._arr1[1]._field34 - 25);
+ } else {
+ scene->_arrunkObj1337[2]._arr1[1]._object1.setStrip(3);
+ scene->_arrunkObj1337[2]._arr1[1]._object1.setFrame(scene->_arrunkObj1337[2]._arr1[1]._field34 - 9);
+ }
+ } else {
+ scene->_arrunkObj1337[2]._arr1[1]._object1.setStrip(2);
+ scene->_arrunkObj1337[2]._arr1[1]._object1.setFrame(scene->_arrunkObj1337[2]._arr1[1]._field34);
+ }
+
+ scene->_aSound2.play(61);
+
+ Common::Point pt(14, 36);
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &pt, this);
+
+ scene->_arrunkObj1337[3]._arr1[1]._field34 = scene->_field3E28[scene->_field3E24];
+ }
+ break;
+ case 7: {
+ scene->_arrunkObj1337[3]._arr1[1]._object1.postInit();
+ scene->_arrunkObj1337[3]._arr1[1]._object1._moveDiff = Common::Point(30, 30);
+ scene->_arrunkObj1337[3]._arr1[1]._object1.setVisage(1332);
+ scene->_arrunkObj1337[3]._arr1[1]._object1.setPosition(scene->_arrunkObj1337[3]._arr1[1]._field36);
+ scene->_arrunkObj1337[3]._arr1[1]._object1.setStrip(1);
+ scene->_arrunkObj1337[3]._arr1[1]._object1.setFrame(3);
+ scene->_arrunkObj1337[3]._arr1[1]._object1.fixPriority(170);
+ scene->_aSound2.play(61);
+
+ Common::Point pt(253, 5);
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &pt, this);
+
+ scene->_arrunkObj1337[0]._arr1[1]._field34 = scene->_field3E28[scene->_field3E24];
+ }
+ break;
+ case 8: {
+ scene->_arrunkObj1337[0]._arr1[1]._object1.postInit();
+ scene->_arrunkObj1337[0]._arr1[1]._object1._moveDiff = Common::Point(30, 30);
+ scene->_arrunkObj1337[0]._arr1[1]._object1.setVisage(1332);
+ scene->_arrunkObj1337[0]._arr1[1]._object1.setPosition(scene->_arrunkObj1337[0]._arr1[1]._field36, 0);
+ scene->_arrunkObj1337[0]._arr1[1]._object1.setStrip(5);
+ scene->_arrunkObj1337[0]._arr1[1]._object1.setFrame(1);
+ scene->_arrunkObj1337[0]._arr1[1]._object1.fixPriority(170);
+ scene->_aSound2.play(61);
+
+ Common::Point pt(283, 102);
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &pt, this);
+
+ scene->_arrunkObj1337[1]._arr1[2]._field34 = scene->_field3E28[scene->_field3E24];
+ }
+ break;
+ case 9: {
+ scene->_arrunkObj1337[1]._arr1[2]._object1.postInit();
+ scene->_arrunkObj1337[1]._arr1[2]._object1._moveDiff = Common::Point(30, 30);
+ scene->_arrunkObj1337[1]._arr1[2]._object1.setVisage(1332);
+ scene->_arrunkObj1337[1]._arr1[2]._object1.setPosition(scene->_arrunkObj1337[1]._arr1[2]._field36, 0);
+ scene->_arrunkObj1337[1]._arr1[2]._object1.setStrip(1);
+ scene->_arrunkObj1337[1]._arr1[2]._object1.setFrame(4);
+ scene->_arrunkObj1337[1]._arr1[2]._object1.fixPriority(170);
+ scene->_aSound2.play(61);
+
+ Common::Point pt(64, 174);
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &pt, this);
+
+ scene->_arrunkObj1337[2]._arr1[2]._field34 = scene->_field3E28[scene->_field3E24];
+ }
+ break;
+ case 10: {
+ scene->_arrunkObj1337[2]._arr1[2]._object1.postInit();
+ scene->_arrunkObj1337[2]._arr1[2]._object1._moveDiff = Common::Point(30, 30);
+ scene->_arrunkObj1337[2]._arr1[2]._object1.setVisage(1332);
+ scene->_arrunkObj1337[2]._arr1[2]._object1.setPosition(scene->_arrunkObj1337[2]._arr1[2]._field36, 0);
+ scene->_arrunkObj1337[2]._arr1[2]._object1.fixPriority(170);
+
+ if (scene->_arrunkObj1337[2]._arr1[2]._field34 > 9) {
+ if (scene->_arrunkObj1337[2]._arr1[2]._field34 > 25) {
+ scene->_arrunkObj1337[2]._arr1[2]._object1.setStrip(4);
+ scene->_arrunkObj1337[2]._arr1[2]._object1.setFrame(scene->_arrunkObj1337[2]._arr1[2]._field34 - 25);
+ } else {
+ scene->_arrunkObj1337[2]._arr1[2]._object1.setStrip(3);
+ scene->_arrunkObj1337[2]._arr1[2]._object1.setFrame(scene->_arrunkObj1337[2]._arr1[2]._field34 - 9);
+ }
+ } else {
+ scene->_arrunkObj1337[2]._arr1[2]._object1.setStrip(2);
+ scene->_arrunkObj1337[2]._arr1[2]._object1.setFrame(scene->_arrunkObj1337[2]._arr1[2]._field34);
+ }
+
+ scene->_aSound2.play(61);
+
+ Common::Point pt(14, 58);
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &pt, this);
+
+ scene->_arrunkObj1337[3]._arr1[2]._field34 = scene->_field3E28[scene->_field3E24];
+ }
+ break;
+ case 11: {
+ scene->_arrunkObj1337[3]._arr1[2]._object1.postInit();
+ scene->_arrunkObj1337[3]._arr1[2]._object1._moveDiff = Common::Point(30, 30);
+ scene->_arrunkObj1337[3]._arr1[2]._object1.setVisage(1332);
+ scene->_arrunkObj1337[3]._arr1[2]._object1.setPosition(scene->_arrunkObj1337[3]._arr1[2]._field36, 0);
+ scene->_arrunkObj1337[3]._arr1[2]._object1.setStrip(1);
+ scene->_arrunkObj1337[3]._arr1[2]._object1.setFrame(3);
+ scene->_arrunkObj1337[3]._arr1[2]._object1.fixPriority(170);
+ scene->_aSound2.play(61);
+
+ Common::Point pt(226, 5);
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &pt, this);
+
+ scene->_arrunkObj1337[0]._arr1[2]._field34 = scene->_field3E28[scene->_field3E24];
+ }
+ break;
+ case 12:
+ scene->_arrunkObj1337[0]._arr1[2]._object1.postInit();
+ scene->_arrunkObj1337[0]._arr1[2]._object1._moveDiff = Common::Point(30, 30);
+ scene->_arrunkObj1337[0]._arr1[2]._object1.setVisage(1332);
+ scene->_arrunkObj1337[0]._arr1[2]._object1.setPosition(scene->_arrunkObj1337[0]._arr1[2]._field36, 0);
+ scene->_arrunkObj1337[0]._arr1[2]._object1.setStrip(5);
+ scene->_arrunkObj1337[0]._arr1[2]._object1.setFrame(1);
+ scene->_arrunkObj1337[0]._arr1[2]._object1.fixPriority(170);
+ scene->_arrunkObj1337[0]._arr1[2]._object1.hide();
+ default:
+ break;
+ }
+
+ if (_actionIndex > 12) {
+ scene->_field423E = 0;
+ R2_GLOBALS._sceneObjects->draw();
+ scene->actionDisplay(1330, 0, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ scene->subC20F9();
+ } else if (_actionIndex >= 1) {
+ scene->_field3E28[scene->_field3E24] = 0;
+ scene->_field3E24--;
+ }
+}
+
+void Scene1337::Action4::signal() {
+ Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ if ((scene->_arrunkObj1337[scene->_field423E]._arr1[0]._field34 == 0) && (scene->subC264B(scene->_arrunkObj1337[scene->_field423E]._arr3[0]._field34))) {
+ if (scene->_field3E24 < 0)
+ scene->subC264B(scene->_arrunkObj1337[scene->_field423E]._arr3[0]._field34);
+ scene->_item2._object1.setPosition(Common::Point(162, 95), 0);
+ scene->_item2._object1.show();
+ scene->_aSound2.play(61);
+
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_arrunkObj1337[scene->_field423E]._fieldB94, this);
+
+ scene->_arrunkObj1337[scene->_field423E]._arr1[0]._field34 = scene->_field3E28[scene->_field3E24];
+ scene->_field3E28[scene->_field3E24] = 0;
+ scene->_field3E24--;
+
+ if (scene->_field3E24 < 0)
+ scene->_background2.remove();
+ } else {
+ // Self call, forcing next actionIndex
+ signal();
+ }
+ break;
+ case 1:
+ if ( ( scene->_item2._object1._position.x == scene->_arrunkObj1337[scene->_field423E]._fieldB94.x)
+ && ( scene->_item2._object1._position.y == scene->_arrunkObj1337[scene->_field423E]._fieldB94.y) ) {
+ scene->_arrunkObj1337[scene->_field423E]._arr1[0]._object1.postInit();
+ scene->_arrunkObj1337[scene->_field423E]._arr1[0]._object1._moveDiff = Common::Point(30, 30);
+ scene->_arrunkObj1337[scene->_field423E]._arr1[0]._object1.setVisage(1332);
+ scene->_arrunkObj1337[scene->_field423E]._arr1[0]._object1.setPosition(scene->_arrunkObj1337[scene->_field423E]._arr1[0]._field36, 0);
+ scene->_arrunkObj1337[scene->_field423E]._arr1[0]._object1.setStrip(1);
+ scene->_arrunkObj1337[scene->_field423E]._arr1[0]._object1.setFrame(scene->_arrunkObj1337[scene->_field423E]._fieldBA4);
+ scene->_arrunkObj1337[scene->_field423E]._arr1[0]._object1.fixPriority(170);
+ }
+
+ if ((scene->_field4248 == 1) || (scene->_field423E == 2))
+ scene->setAnimationInfo(&scene->_arrunkObj1337[scene->_field423E]._arr1[0]);
+
+ scene->_item2._object1.hide();
+ if ((scene->_arrunkObj1337[scene->_field423E]._arr1[0]._field34 == 0) && (scene->subC264B(scene->_arrunkObj1337[scene->_field423E]._arr3[0]._field34 == 0))) {
+ if (scene->_field3E24 < 0)
+ scene->shuffleCards();
+ scene->_item2._object1.setPosition(Common::Point(162, 95));
+ scene->_item2._object1.show();
+
+ scene->_aSound2.play(61);
+
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_arrunkObj1337[scene->_field423E]._fieldB98, this);
+
+ scene->_arrunkObj1337[scene->_field423E]._arr1[1]._field34 = scene->_field3E28[scene->_field3E24];
+ scene->_field3E28[scene->_field3E24] = 0;
+ scene->_field3E24--;
+ if (scene->_field3E24 < 0)
+ scene->_background2.remove();
+ } else
+ signal();
+ break;
+ case 2:
+ if ( ( scene->_item2._object1._position.x == scene->_arrunkObj1337[scene->_field423E]._fieldB98.x)
+ && ( scene->_item2._object1._position.y == scene->_arrunkObj1337[scene->_field423E]._fieldB98.y) ) {
+ scene->_arrunkObj1337[scene->_field423E]._arr1[1]._object1.postInit();
+ scene->_arrunkObj1337[scene->_field423E]._arr1[1]._object1._moveDiff = Common::Point(30, 30);
+ scene->_arrunkObj1337[scene->_field423E]._arr1[1]._object1.setVisage(1332);
+ scene->_arrunkObj1337[scene->_field423E]._arr1[1]._object1.setPosition(scene->_arrunkObj1337[scene->_field423E]._arr1[1]._field36, 0);
+ scene->_arrunkObj1337[scene->_field423E]._arr1[1]._object1.setStrip(1);
+ scene->_arrunkObj1337[scene->_field423E]._arr1[1]._object1.setFrame(scene->_arrunkObj1337[scene->_field423E]._fieldBA4);
+ scene->_arrunkObj1337[scene->_field423E]._arr1[1]._object1.fixPriority(170);
+ }
+
+ if ((scene->_field4248 == 1) || (scene->_field423E == 2))
+ scene->setAnimationInfo(&scene->_arrunkObj1337[scene->_field423E]._arr1[1]);
+
+ scene->_item2._object1.hide();
+ if ((scene->_arrunkObj1337[scene->_field423E]._arr1[2]._field34 == 0) && (scene->subC264B(scene->_arrunkObj1337[scene->_field423E]._arr3[0]._field34 == 0))) {
+ if (scene->_field3E24 < 0)
+ scene->shuffleCards();
+ scene->_item2._object1.setPosition(Common::Point(162, 95));
+ scene->_item2._object1.show();
+
+ scene->_aSound2.play(61);
+
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_arrunkObj1337[scene->_field423E]._fieldB9C, this);
+
+ scene->_arrunkObj1337[scene->_field423E]._arr1[2]._field34 = scene->_field3E28[scene->_field3E24];
+ scene->_field3E28[scene->_field3E24] = 0;
+ scene->_field3E24--;
+ if (scene->_field3E24 < 0)
+ scene->_background2.remove();
+ } else
+ signal();
+ break;
+ case 3:
+ if ( ( scene->_item2._object1._position.x == scene->_arrunkObj1337[scene->_field423E]._fieldB9C.x)
+ && ( scene->_item2._object1._position.y == scene->_arrunkObj1337[scene->_field423E]._fieldB9C.y) ) {
+ scene->_arrunkObj1337[scene->_field423E]._arr1[2]._object1.postInit();
+ scene->_arrunkObj1337[scene->_field423E]._arr1[2]._object1._moveDiff = Common::Point(30, 30);
+ scene->_arrunkObj1337[scene->_field423E]._arr1[2]._object1.setVisage(1332);
+ scene->_arrunkObj1337[scene->_field423E]._arr1[2]._object1.setPosition(scene->_arrunkObj1337[scene->_field423E]._arr1[2]._field36, 0);
+ scene->_arrunkObj1337[scene->_field423E]._arr1[2]._object1.setStrip(1);
+ scene->_arrunkObj1337[scene->_field423E]._arr1[2]._object1.setFrame(scene->_arrunkObj1337[scene->_field423E]._fieldBA4);
+ scene->_arrunkObj1337[scene->_field423E]._arr1[2]._object1.fixPriority(170);
+ }
+
+ if ((scene->_field4248 == 1) || (scene->_field423E == 2))
+ scene->setAnimationInfo(&scene->_arrunkObj1337[scene->_field423E]._arr1[2]);
+
+ scene->_item2._object1.hide();
+ if ((scene->_arrunkObj1337[scene->_field423E]._arr1[3]._field34 == 0) && (scene->subC264B(scene->_arrunkObj1337[scene->_field423E]._arr3[0]._field34 == 0))) {
+ if (scene->_field3E24 < 0)
+ scene->shuffleCards();
+ scene->_item2._object1.setPosition(Common::Point(162, 95));
+ scene->_item2._object1.show();
+
+ scene->_aSound2.play(61);
+
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_arrunkObj1337[scene->_field423E]._fieldBA0, this);
+
+ scene->_arrunkObj1337[scene->_field423E]._arr1[3]._field34 = scene->_field3E28[scene->_field3E24];
+ scene->_field3E28[scene->_field3E24] = 0;
+ scene->_field3E24--;
+ if (scene->_field3E24 < 0)
+ scene->_background2.remove();
+ } else
+ signal();
+ break;
+ case 4:
+ if ( ( scene->_item2._object1._position.x == scene->_arrunkObj1337[scene->_field423E]._fieldBA0.x)
+ && ( scene->_item2._object1._position.y == scene->_arrunkObj1337[scene->_field423E]._fieldBA0.y) ) {
+ scene->_arrunkObj1337[scene->_field423E]._arr1[3]._object1.postInit();
+ scene->_arrunkObj1337[scene->_field423E]._arr1[3]._object1._moveDiff = Common::Point(30, 30);
+ scene->_arrunkObj1337[scene->_field423E]._arr1[3]._object1.setVisage(1332);
+ scene->_arrunkObj1337[scene->_field423E]._arr1[3]._object1.setPosition(scene->_arrunkObj1337[scene->_field423E]._arr1[3]._field36, 0);
+ scene->_arrunkObj1337[scene->_field423E]._arr1[3]._object1.setStrip(1);
+ scene->_arrunkObj1337[scene->_field423E]._arr1[3]._object1.setFrame(scene->_arrunkObj1337[scene->_field423E]._fieldBA4);
+ scene->_arrunkObj1337[scene->_field423E]._arr1[3]._object1.fixPriority(170);
+ }
+
+ if ((scene->_field4248 == 1) || (scene->_field423E == 2))
+ scene->setAnimationInfo(&scene->_arrunkObj1337[scene->_field423E]._arr1[3]);
+
+ scene->_item2._object1.hide();
+ switch (scene->_field423E) {
+ case 0:
+ scene->subCF979();
+ break;
+ case 1:
+ scene->subCF31D();
+ break;
+ case 2:
+ scene->subD0281();
+ break;
+ case 3:
+ scene->subC2C2F();
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene1337::Action5::signal() {
+ Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ scene->_field3E28[scene->_field3E26] = scene->_field3EF0->_field34;
+ scene->_field3E26--;
+ if (!g_globals->_sceneObjects->contains(&scene->_item7._object1)) {
+ scene->_item7._object1.postInit();
+ scene->_item7._object1.hide();
+ scene->_item7._object1.setVisage(1332);
+ scene->_item7._object1.setPosition(scene->_item7._field36, 0);
+ scene->_item7._object1.fixPriority(170);
+ }
+
+ scene->_item7._field34 = scene->_field3EF0->_field34;
+ scene->_field3EF0->_field34 = 0;
+ scene->_field3EF0->_object1.remove();
+
+ if (scene->_field3EF0 == &scene->_item6) {
+ subD18B5(5, 1, 4);
+ scene->subC4CEC();
+ }
+ scene->_item2._object1.setPosition(scene->_field3EF0->_field36, 0);
+ scene->_item2._object1.show();
+ Common::Point pt(128, 95);
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &pt, this);
+ }
+ break;
+ case 1:
+ scene->_item2._object1.hide();
+ scene->setAnimationInfo(&scene->_item7);
+ scene->_aSound2.play(61);
+ scene->subC20F9();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene1337::Action6::signal() {
+ Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ scene->_field3EF4->_field34 = 1;
+ scene->_field3EF4->_object1.postInit();
+ scene->_field3EF4->_object1.hide();
+ scene->_field3EF4->_object1.setVisage(1332);
+ scene->_field3EF4->_object1.setPosition(scene->_field3EF4->_field36);
+ scene->_field3EF4->_object1.fixPriority(170);
+
+ scene->_field3EF0->_field34 = 0;
+ scene->_field3EF0->_object1.remove();
+
+ scene->_item2._object1.setPosition(scene->_field3EF0->_field36);
+ scene->_item2._object1.show();
+
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_field3EF4->_field36, this);
+ }
+ break;
+ case 1:
+ scene->_item2._object1.hide();
+ scene->setAnimationInfo(scene->_field3EF4);
+ scene->_aSound1.play(59);
+ if (scene->_field3EF0 == &scene->_item6) {
+ subD18B5(5, 1, 4);
+ scene->subC4CEC();
+ }
+ scene->subC20F9();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene1337::Action7::signal() {
+ Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ scene->_field3EF4->_field34 = scene->_field3EF0->_field34;
+
+ scene->_field3EF0->_field34 = 0;
+ scene->_field3EF0->_object1.remove();
+
+ scene->_item2._object1.setPosition(scene->_field3EF0->_field36, 0);
+ scene->_item2._object1.show();
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_field3EF4->_field36, this);
+ }
+ break;
+ case 1:
+ if (scene->_field3EF0 == &scene->_item6) {
+ subD18B5(5, 1, 4);
+ scene->subC4CEC();
+ }
+ scene->setAnimationInfo(scene->_field3EF4);
+ scene->_aSound1.play(59);
+ scene->_item5._field34 = 1;
+ scene->_item5._field36.x = scene->_field3EF4->_field36.x;
+ scene->_item5._field36.y = scene->_field3EF4->_field36.y;
+ scene->_item5._object1.postInit();
+ scene->_item5._object1.hide();
+ scene->_item5._object1._flags = 0x200;
+
+ scene->subC4A39(&scene->_item5);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene1337::Action8::signal() {
+ Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ scene->_field3E28[scene->_field3E26] = scene->_field3EF4->_field34;
+ scene->_field3E26--;
+
+ scene->_field3EF4->_field34 = scene->_field3EF0->_field34;
+ scene->_field3EF0->_object1.remove();
+
+ scene->_item2._object1.setPosition(scene->_field3EF0->_field36, 0);
+ scene->_item2._object1.show();
+
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_field3EF4->_field36, this);
+ }
+ break;
+ case 1:
+ scene->_item2._object1.hide();
+
+ if (scene->_field3EF0 == &scene->_item6) {
+ subD18B5(5, 1, 4);
+ scene->subC4CEC();
+ }
+ scene->setAnimationInfo(scene->_field3EF4);
+ scene->_aSound1.play(58);
+ scene->subC4A39(scene->_field3EF4);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene1337::Action9::signal() {
+ Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ scene->_field3EF4->_field34 = scene->_field3EF0->_field34;
+ scene->_field3EF4->_object1.postInit();
+ scene->_field3EF4->_object1.hide();
+ scene->_field3EF4->_object1.setVisage(1332);
+ scene->_field3EF4->_object1.setPosition(scene->_field3EF4->_field36, 0);
+ scene->_field3EF4->_object1.fixPriority(170);
+
+ scene->_field3EF0->_field34 = 0;
+ scene->_field3EF0->_object1.remove();
+
+ scene->_item2._object1.setPosition(scene->_field3EF0->_field36, 0);
+ scene->_item2._object1.show();
+
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_field3EF4->_field36, this);
+ }
+ break;
+ case 1:
+ scene->_item2._object1.hide();
+ scene->setAnimationInfo(scene->_field3EF4);
+ scene->_aSound1.play(57);
+
+ if (scene->_field3EF0 == &scene->_item6) {
+ subD18B5(5, 1, 4);
+ scene->subC4CEC();
+ }
+
+ scene->subC20F9();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene1337::Action10::signal() {
+ Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ scene->_field3EF8->_object1.postInit();
+ scene->_field3EF8->_object1.hide();
+ scene->_field3EF8->_object1.setVisage(1332);
+ scene->_field3EF8->_object1.setPosition(scene->_field3EF8->_field36, 0);
+ scene->_field3EF8->_object1.fixPriority(170);
+ scene->_field3EF8->_field34 = scene->_field3EF0->_field34;
+
+ scene->_field3EF0->_field34 = 0;
+ scene->_field3EF0->_object1.remove();
+
+ if (scene->_field3EF0 == &scene->_item6) {
+ subD18B5(5, 1, 4);
+ scene->subC4CEC();
+ }
+
+ scene->_item2._object1.setPosition(scene->_field3EF0->_field36, 0);
+ scene->_item2._object1.show();
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_field3EF8->_field36, this);
+ }
+ break;
+ case 1: {
+ scene->_item2._object1.hide();
+ scene->setAnimationInfo(scene->_field3EF8);
+ scene->_aSound1.play(57);
+
+ bool found = false;
+ int indexFound = -1;
+
+ switch (scene->_field4240) {
+ case 0:
+ for (indexFound = 0; indexFound < 3; indexFound++) {
+ if (scene->_arrunkObj1337[0]._arr1[indexFound]._field34 == 29) {
+ found = true;
+ break;
+ }
+ }
+ break;
+ case 1:
+ for (indexFound = 0; indexFound < 3; indexFound++) {
+ if (scene->_arrunkObj1337[1]._arr1[indexFound]._field34 == 29) {
+ found = true;
+ break;
+ }
+ }
+ break;
+ case 2:
+ for (indexFound = 0; indexFound < 3; indexFound++) {
+ if (scene->_arrunkObj1337[2]._arr1[indexFound]._field34 == 29) {
+ found = true;
+ break;
+ }
+ }
+ break;
+ case 3:
+ for (indexFound = 0; indexFound < 3; indexFound++) {
+ if (scene->_arrunkObj1337[3]._arr1[indexFound]._field34 == 29) {
+ found = true;
+ break;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ bool found2 = false;
+
+ if (found) {
+ switch (scene->_field4240) {
+ case 0:
+ scene->subC51A0(&scene->_arrunkObj1337[0]._arr1[indexFound], scene->_field3EF8);
+ found2 = true;
+ break;
+ case 1:
+ scene->subC51A0(&scene->_arrunkObj1337[1]._arr1[indexFound], scene->_field3EF8);
+ found2 = true;
+ break;
+ case 2:
+ scene->subC4CD2();
+ if (MessageDialog::show(USE_INTERCEPTOR, NO_MSG, YES_MSG) == 0)
+ scene->subC4CEC();
+ else {
+ scene->subC51A0(&scene->_arrunkObj1337[2]._arr1[indexFound], scene->_field3EF8);
+ found2 = true;
+ }
+ break;
+ case 3:
+ scene->subC51A0(&scene->_arrunkObj1337[3]._arr1[indexFound], scene->_field3EF8);
+ found2 = true;
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (!found2)
+ break;
+
+ if (scene->_field4240 == 2) {
+ int j = 0;
+ for (int i = 0; i <= 7; i++) {
+ if (scene->_arrunkObj1337[2]._arr2[i]._field34 != 0)
+ ++j;
+ }
+
+ if (j <= 1) {
+ for (int i = 0; i <= 7; i++) {
+ if (scene->_arrunkObj1337[2]._arr2[i]._field34 != 0) {
+ scene->_field3EF4 = &scene->_arrunkObj1337[2]._arr2[i];
+ break;
+ }
+ }
+ } else {
+ scene->subC4CD2();
+
+ found2 = false;
+ while (!found2) {
+ scene->actionDisplay(1330, 130, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+
+ // Wait for a mouse or keypress
+ Event event;
+ while (!g_globals->_events.getEvent(event, EVENT_BUTTON_DOWN | EVENT_KEYPRESS) && !g_vm->shouldQuit()) {
+ g_globals->_scenePalette.signalListeners();
+ R2_GLOBALS._sceneObjects->draw();
+ g_globals->_events.delay(g_globals->_sceneHandler->_delayTicks);
+ }
+
+ scene->_item6._field36 = event.mousePos;
+
+ for (int i = 0; i <= 7; i++) {
+ if ((scene->subC2BF8(&scene->_arrunkObj1337[2]._arr2[i], scene->_item6._field36) != 0) && (scene->_arrunkObj1337[2]._arr2[i]._field34 != 0)) {
+ scene->_field3EF4 = &scene->_arrunkObj1337[2]._arr2[0];
+ found2 = true;
+ break;
+ }
+ }
+ }
+ scene->subC4CEC();
+ }
+ }
+
+ scene->_field3E28[scene->_field3E26] = scene->_field3EF4->_field34;
+ scene->_field3E26--;
+ scene->_field3EF4->_field34 = 0;
+ scene->_field3EF4->_object1.remove();
+
+ scene->_item2._object1.setPosition(scene->_field3EF4->_field36, 0);
+ scene->_item2._object1.show();
+
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_field3EF8->_field36, this);
+ }
+ break;
+ case 2:
+ scene->_item2._object1.hide();
+ scene->subC4A39(scene->_field3EF8);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene1337::Action11::signal() {
+ Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
+
+ bool noAction = true;
+
+ switch (_actionIndex++) {
+ case 0: {
+ scene->_field3EF4->_object1.postInit();
+ scene->_field3EF4->_object1.hide();
+ scene->_field3EF4->_object1.setVisage(1332);
+ scene->_field3EF4->_object1.setPosition(scene->_field3EF4->_field36, 0);
+ scene->_field3EF4->_object1.fixPriority(170);
+ scene->_field3EF4->_field34 = 25;
+
+ if (scene->_field4240 == 2) {
+ scene->_item2._object1.setPosition(scene->_field3EF4->_field36, 0);
+ subD18B5(5, 1, 4);
+ } else {
+ scene->_field3EF0->_field34 = 0;
+ scene->_field3EF0->_object1.remove();
+ scene->_item2._object1.setPosition(scene->_field3EF0->_field36, 0);
+ }
+ scene->_item2._object1.show();
+
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_field3EF4->_field36, this);
+ }
+ break;
+ case 1: {
+ scene->_item2._object1.hide();
+ scene->setAnimationInfo(scene->_field3EF4);
+ scene->_aSound1.play(57);
+
+ bool found = false;
+ int i = -1;
+
+ switch (scene->_field4242) {
+ case 0:
+ for (i = 0; i <= 3; i++) {
+ if (scene->_arrunkObj1337[0]._arr1[i]._field34 == 27) {
+ found = true;
+ break;
+ }
+ }
+
+ if ((found) && (scene->subC3E92(scene->_field4240) != -1)) {
+ scene->_field3EF0 = &scene->_arrunkObj1337[0]._arr1[i];
+ scene->_field3EF4 = &scene->_arrunkObj1337[0]._arr4[0];
+ if (scene->_field4240 != 0) {
+ int tmpVal = scene->subC3E92(scene->_field4240);
+ scene->_field3EF8 = &scene->_arrunkObj1337[scene->_field4240]._arr1[tmpVal];
+ }
+ scene->_item1.setAction(&scene->_action12);
+ noAction = false;
+ }
+ break;
+ case 1:
+ for (i = 0; i <= 3; i++) {
+ if (scene->_arrunkObj1337[1]._arr1[i]._field34 == 27) {
+ found = true;
+ break;
+ }
+ }
+
+ if ((found) && (scene->subC3E92(scene->_field4240) != -1)) {
+ scene->_field3EF0 = &scene->_arrunkObj1337[1]._arr1[i];
+ scene->_field3EF4 = &scene->_arrunkObj1337[1]._arr4[0];
+ if (scene->_field4240 != 1) {
+ int tmpVal = scene->subC3E92(scene->_field4240);
+ scene->_field3EF8 = &scene->_arrunkObj1337[scene->_field4240]._arr1[tmpVal];
+ }
+ scene->_item1.setAction(&scene->_action12);
+ noAction = false;
+ }
+ break;
+ case 2:
+ for (i = 0; i <= 3; i++) {
+ if (scene->_arrunkObj1337[2]._arr1[i]._field34 == 27) {
+ found = true;
+ break;
+ }
+ }
+
+ if ((found) && (scene->subC3E92(scene->_field4240) != -1)) {
+ scene->subC4CD2();
+ if (MessageDialog::show(USE_DOUBLE_AGENT, NO_MSG, YES_MSG) == 0)
+ scene->subC4CEC();
+ else {
+ scene->subC4CEC();
+ scene->_field3EF0 = &scene->_arrunkObj1337[2]._arr1[i];
+ scene->_field3EF4 = &scene->_arrunkObj1337[2]._arr4[0];
+ if (scene->_field4240 != 2) {
+ int tmpVal = scene->subC3E92(scene->_field4240);
+ scene->_field3EF8 = &scene->_arrunkObj1337[scene->_field4240]._arr1[tmpVal];
+ }
+ scene->_item1.setAction(&scene->_action12);
+ noAction = false;
+ }
+ }
+ break;
+ case 3:
+ for (i = 0; i <= 3; i++) {
+ if (scene->_arrunkObj1337[3]._arr1[i]._field34 == 27) {
+ found = true;
+ break;
+ }
+ }
+
+ if ((found) && (scene->subC3E92(scene->_field4240) != -1)) {
+ scene->_field3EF0 = &scene->_arrunkObj1337[3]._arr1[i];
+ scene->_field3EF4 = &scene->_arrunkObj1337[3]._arr4[0];
+ if (scene->_field4240 != 3) {
+ int tmpVal = scene->subC3E92(scene->_field4240);
+ scene->_field3EF8 = &scene->_arrunkObj1337[scene->_field4240]._arr1[tmpVal];
+ }
+ scene->_item1.setAction(&scene->_action12);
+ noAction = false;
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (!noAction)
+ return;
+
+ if (scene->_field4240 == 2) {
+ int count = 0;
+ if (scene->_field4242 != 2) {
+ for (i = 0; i <= 3; i++) {
+ if (scene->_arrunkObj1337[scene->_field4242]._arr1[i]._field34 == 0)
+ ++count;
+ }
+ }
+
+ if (count > 1) {
+ scene->subC4CD2();
+
+ found = false;
+ while (!found) {
+ switch (scene->_field4242) {
+ case 0:
+ scene->actionDisplay(1330, 131, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 1:
+ scene->actionDisplay(1330, 132, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 3:
+ scene->actionDisplay(1330, 133, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ default:
+ break;
+ }
+
+ Event event;
+ while (!g_globals->_events.getEvent(event, EVENT_BUTTON_DOWN | EVENT_KEYPRESS) && !g_vm->shouldQuit()) {
+ g_globals->_scenePalette.signalListeners();
+ R2_GLOBALS._sceneObjects->draw();
+ g_globals->_events.delay(g_globals->_sceneHandler->_delayTicks);
+ }
+
+ scene->_item6._field36 = event.mousePos;
+
+ found = false;
+
+ if (scene->_field4242 != 2) {
+ for (i = 0; i <= 3; i++) {
+ if ((scene->subC2BF8(&scene->_arrunkObj1337[scene->_field4242]._arr1[i], scene->_item6._field36) != 0) && (scene->_arrunkObj1337[scene->_field4242]._arr1[i]._field34 != 0)) {
+ scene->_field3EF8 = &scene->_arrunkObj1337[scene->_field4242]._arr1[i];
+ found = true;
+ break;
+ }
+ }
+ }
+ } // while
+ scene->_field4246 = 1;
+ scene->subC4CEC();
+ } else {
+ if (scene->_field4242 != 2) {
+ int tmpVal = scene->subC3E92(scene->_field4242);
+ scene->_field3EF8 = &scene->_arrunkObj1337[scene->_field4242]._arr1[tmpVal];
+ }
+ }
+ }
+
+ scene->_field3EF0->_object1.postInit();
+ scene->_field3EF0->_object1.hide();
+ scene->_field3EF0->_object1.setVisage(1332);
+ scene->_field3EF0->_object1.setPosition(scene->_field3EF0->_field36, 0);
+ scene->_field3EF0->_object1.fixPriority(170);
+ scene->_field3EF0->_object1.setStrip2(1);
+ scene->_field3EF0->_field34 = scene->_field3EF8->_field34;
+
+ scene->_field3EF8->_field34 = 0;
+ scene->_field3EF8->_object1.remove();
+
+ scene->_item2._object1.setPosition(scene->_field3EF8->_field36, 0);
+ scene->_item2._object1.show();
+
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_field3EF0->_field36, this);
+ }
+ break;
+ case 2:
+ scene->_item2._object1.hide();
+ switch (scene->_field4240) {
+ case 0:
+ scene->_field3EF0->_object1.setFrame(2);
+ scene->_field3EF0->_object1.show();
+ scene->_field423E--;
+ scene->_field4244 = 0;
+ break;
+ case 1:
+ scene->_field3EF0->_object1.setFrame(4);
+ scene->_field3EF0->_object1.show();
+ scene->_field423E--;
+ scene->_field4244 = 0;
+ break;
+ case 3:
+ scene->_field3EF0->_object1.setFrame(3);
+ scene->_field3EF0->_object1.show();
+ scene->_field423E--;
+ scene->_field4244 = 0;
+ break;
+ default:
+ scene->setAnimationInfo(scene->_field3EF0);
+ break;
+ }
+
+ scene->subC4A39(scene->_field3EF4);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene1337::Action12::signal() {
+ Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ signal();
+ break;
+ case 1: {
+ scene->_field3E28[scene->_field3E26] = scene->_field3EF4->_field34;
+ scene->_field3EF4->_field34 = scene->_field3EF0->_field34;
+ scene->_field3EF0->_field34 = 0;
+ scene->_field3EF0->_object1.remove();
+ scene->_item2._object1.setPosition(scene->_field3EF0->_field36, 0);
+ scene->_item2._object1.show();
+
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_field3EF4->_field36, this);
+ }
+ break;
+ case 2:
+ scene->_item2._object1.hide();
+ scene->setAnimationInfo(scene->_field3EF4);
+ scene->_aSound1.play(58);
+ if (scene->_field4242 == 2) {
+ int count = 0;
+ int i = -1;
+ switch (scene->_field4240) {
+ case 0:
+ for (i = 0; i <= 3; i++) {
+ if (scene->_arrunkObj1337[0]._arr1[i]._field34 != 0)
+ ++count;
+ }
+ break;
+ case 1:
+ for (i = 0; i <= 3; i++) {
+ if (scene->_arrunkObj1337[3]._arr1[i]._field34 != 0)
+ ++count;
+ }
+ break;
+ case 3:
+ for (i = 0; i <= 3; i++) {
+ if (scene->_arrunkObj1337[3]._arr1[i]._field34 != 0)
+ ++count;
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (count > 1) {
+ scene->subC4CD2();
+
+ bool found = false;
+
+ while (!found) {
+ switch (scene->_field4240) {
+ case 0:
+ scene->actionDisplay(1330, 131, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 1:
+ scene->actionDisplay(1330, 132, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 3:
+ scene->actionDisplay(1330, 133, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ default:
+ break;
+ }
+
+ Event event;
+ while (!g_globals->_events.getEvent(event, EVENT_BUTTON_DOWN | EVENT_KEYPRESS) && !g_vm->shouldQuit()) {
+ g_globals->_scenePalette.signalListeners();
+ R2_GLOBALS._sceneObjects->draw();
+ g_globals->_events.delay(g_globals->_sceneHandler->_delayTicks);
+ }
+
+ scene->_item6._field36 = event.mousePos;
+
+ if (scene->_field4240 == 0) {
+ for (i = 0; i <= 3; i++) {
+ if ((scene->subC2BF8(&scene->_arrunkObj1337[0]._arr1[i], scene->_item6._field36) != 0) && (scene->_arrunkObj1337[0]._arr1[i]._field34 != 0)) {
+ found = true;
+ scene->_field3EF8 = &scene->_arrunkObj1337[0]._arr1[i];
+ break;
+ }
+ }
+ }
+
+ if (scene->_field4240 == 3) {
+ for (i = 0; i <= 3; i++) {
+ if ((scene->subC2BF8(&scene->_arrunkObj1337[3]._arr1[i], scene->_item6._field36) != 0) && (scene->_arrunkObj1337[3]._arr1[i]._field34 != 0)) {
+ found = true;
+ scene->_field3EF8 = &scene->_arrunkObj1337[3]._arr1[i];
+ break;
+ }
+ }
+ }
+
+ if (scene->_field4240 == 1) {
+ for (i = 0; i <= 3; i++) {
+ if ((scene->subC2BF8(&scene->_arrunkObj1337[1]._arr1[i], scene->_item6._field36) != 0) && (scene->_arrunkObj1337[1]._arr1[i]._field34 != 0)) {
+ found = true;
+ scene->_field3EF8 = &scene->_arrunkObj1337[1]._arr1[i];
+ break;
+ }
+ }
+ }
+ }
+ scene->subC4CEC();
+ } else {
+ if (scene->_field4240 != 1) {
+ switch (scene->_field4240) {
+ case 0:
+ scene->_field3EF8 = &scene->_arrunkObj1337[0]._arr1[scene->subC3E92(0)];
+ break;
+ case 3:
+ scene->_field3EF8 = &scene->_arrunkObj1337[3]._arr1[scene->subC3E92(3)];
+ break;
+ default:
+ break;
+ }
+ } else {
+ scene->_field3EF8 = &scene->_arrunkObj1337[1]._arr1[scene->subC3E92(1)];
+ }
+ }
+
+ scene->_field3EF0->_object1.postInit();
+ scene->_field3EF0->_object1.hide();
+ scene->_field3EF0->_object1.setVisage(1332);
+ scene->_field3EF0->_object1.setPosition(scene->_field3EF0->_field36);
+ scene->_field3EF0->_object1.fixPriority(170);
+ scene->_field3EF0->_object1.setStrip2(1);
+ scene->_field3EF0->_field34 = scene->_field3EF8->_field34;
+
+ scene->_field3EF8->_field34 = 0;
+ scene->_field3EF8->_object1.remove();
+
+ scene->_item2._object1.setPosition(scene->_field3EF8->_field36);
+ scene->_item2._object1.show();
+ scene->_aSound1.play(57);
+
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_field3EF0->_field36, this);
+ }
+ break;
+ case 3:
+ scene->_item2._object1.hide();
+ switch (scene->_field4242) {
+ case 0:
+ scene->_field3EF0->_object1.setFrame2(2);
+ scene->_field3EF0->_object1.show();
+ break;
+ case 1:
+ scene->_field3EF0->_object1.setFrame2(4);
+ scene->_field3EF0->_object1.show();
+ break;
+ case 3:
+ scene->_field3EF0->_object1.setFrame2(3);
+ scene->_field3EF0->_object1.show();
+ break;
+ default:
+ scene->setAnimationInfo(scene->_field3EF0);
+ break;
+ }
+ scene->subC4A39(scene->_field3EF4);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene1337::Action13::signal() {
+ Scene1337 *scene = (Scene1337 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ scene->_field3E28[scene->_field3E26] = scene->_field3EF4->_field34;
+ scene->_field3E26--;
+
+ scene->_field3EF4->_field34 = scene->_field3EF0->_field34;
+
+ scene->_field3EF0->_field34 = 0;
+ scene->_field3EF0->_object1.remove();
+
+ scene->_item2._object1.setPosition(scene->_field3EF0->_field36, 0);
+ scene->_item2._object1.show();
+
+ NpcMover *mover = new NpcMover();
+ scene->_item2._object1.addMover(mover, &scene->_field3EF4->_field36, this);
+ }
+ break;
+ case 1:
+ scene->_item2._object1.hide();
+ scene->setAnimationInfo(scene->_field3EF4);
+ scene->_aSound1.play(58);
+ signal();
+ break;
+ case 2:
+ scene->subC4A39(scene->_field3EF4);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene1337::postInit(SceneObjectList *OwnerList) {
+// In the original, may be found in subPostInit.
+// Without it, enableControl asserts
+ loadScene(1330);
+ SceneExt::postInit();
+//
+
+ // Hide the user interface
+ R2_GLOBALS._uiElements._active = false;
+ BF_GLOBALS._interfaceY = 200;
+
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+
+ _unkFctPtr412 = NULL;
+
+ _field3EF0 = NULL;
+ _field3EF4 = NULL;
+ _field3EF8 = NULL;
+
+ _arrunkObj1337[2]._arr1[0]._field36 = Common::Point(10, 174);
+ _arrunkObj1337[2]._arr1[1]._field36 = Common::Point(37, 174);
+ _arrunkObj1337[2]._arr1[2]._field36 = Common::Point(64, 174);
+ _arrunkObj1337[2]._arr1[3]._field36 = Common::Point(91, 174);
+
+ _arrunkObj1337[2]._arr2[0]._field36 = Common::Point(119, 174);
+ _arrunkObj1337[2]._arr2[1]._field36 = Common::Point(119, 148);
+ _arrunkObj1337[2]._arr2[2]._field36 = Common::Point(119, 122);
+ _arrunkObj1337[2]._arr2[3]._field36 = Common::Point(145, 122);
+ _arrunkObj1337[2]._arr2[4]._field36 = Common::Point(171, 122);
+ _arrunkObj1337[2]._arr2[5]._field36 = Common::Point(171, 148);
+ _arrunkObj1337[2]._arr2[6]._field36 = Common::Point(171, 174);
+ _arrunkObj1337[2]._arr2[7]._field36 = Common::Point(145, 174);
+
+ _arrunkObj1337[2]._arr3[0]._field36 = Common::Point(199, 174);
+
+ _arrunkObj1337[2]._arr4[0]._field36 = Common::Point(145, 148);
+
+ _arrunkObj1337[2]._fieldB94 = Common::Point(10, 174);
+ _arrunkObj1337[2]._fieldB98 = Common::Point(37, 174);
+ _arrunkObj1337[2]._fieldB9C = Common::Point(64, 174);
+ _arrunkObj1337[2]._fieldBA0 = Common::Point(91, 174);
+ _arrunkObj1337[2]._fieldBA4 = 2;
+
+ _arrunkObj1337[3]._arr1[0]._field36 = Common::Point(14, 14);
+ _arrunkObj1337[3]._arr1[1]._field36 = Common::Point(14, 36);
+ _arrunkObj1337[3]._arr1[2]._field36 = Common::Point(14, 58);
+ _arrunkObj1337[3]._arr1[3]._field36 = Common::Point(14, 80);
+
+ _arrunkObj1337[3]._arr2[0]._field36 = Common::Point(37, 66);
+ _arrunkObj1337[3]._arr2[1]._field36 = Common::Point(63, 66);
+ _arrunkObj1337[3]._arr2[2]._field36 = Common::Point(89, 66);
+ _arrunkObj1337[3]._arr2[3]._field36 = Common::Point(89, 92);
+ _arrunkObj1337[3]._arr2[4]._field36 = Common::Point(89, 118);
+ _arrunkObj1337[3]._arr2[5]._field36 = Common::Point(63, 118);
+ _arrunkObj1337[3]._arr2[6]._field36 = Common::Point(37, 118);
+ _arrunkObj1337[3]._arr2[7]._field36 = Common::Point(37, 92);
+
+ _arrunkObj1337[3]._arr3[0]._field36 = Common::Point(37, 145);
+
+ _arrunkObj1337[3]._arr4[0]._field36 = Common::Point(63, 92);
+
+ _arrunkObj1337[3]._fieldB94 = Common::Point(14, 14);
+ _arrunkObj1337[3]._fieldB98 = Common::Point(14, 36);
+ _arrunkObj1337[3]._fieldB9C = Common::Point(14, 58);
+ _arrunkObj1337[3]._fieldBA0 = Common::Point(14, 80);
+ _arrunkObj1337[3]._fieldBA4 = 3;
+
+ _arrunkObj1337[0]._arr1[0]._field36 = Common::Point(280, 5);
+ _arrunkObj1337[0]._arr1[1]._field36 = Common::Point(253, 5);
+ _arrunkObj1337[0]._arr1[2]._field36 = Common::Point(226, 5);
+ _arrunkObj1337[0]._arr1[3]._field36 = Common::Point(199, 5);
+
+ _arrunkObj1337[0]._arr2[0]._field36 = Common::Point(171, 16);
+ _arrunkObj1337[0]._arr2[1]._field36 = Common::Point(171, 42);
+ _arrunkObj1337[0]._arr2[2]._field36 = Common::Point(171, 68);
+ _arrunkObj1337[0]._arr2[3]._field36 = Common::Point(145, 68);
+ _arrunkObj1337[0]._arr2[4]._field36 = Common::Point(119, 68);
+ _arrunkObj1337[0]._arr2[5]._field36 = Common::Point(119, 42);
+ _arrunkObj1337[0]._arr2[6]._field36 = Common::Point(119, 16);
+ _arrunkObj1337[0]._arr2[7]._field36 = Common::Point(145, 16);
+
+ _arrunkObj1337[0]._arr3[0]._field36 = Common::Point(91, 16);
+
+ _arrunkObj1337[0]._arr4[0]._field36 = Common::Point(145, 42);
+
+ _arrunkObj1337[0]._fieldB94 = Common::Point(280, 5);
+ _arrunkObj1337[0]._fieldB98 = Common::Point(253, 5);
+ _arrunkObj1337[0]._fieldB9C = Common::Point(226, 5);
+ _arrunkObj1337[0]._fieldBA0 = Common::Point(199, 5);
+ _arrunkObj1337[0]._fieldBA4 = 2;
+
+ _arrunkObj1337[1]._arr1[0]._field36 = Common::Point(283, 146);
+ _arrunkObj1337[1]._arr1[1]._field36 = Common::Point(283, 124);
+ _arrunkObj1337[1]._arr1[2]._field36 = Common::Point(283, 102);
+ _arrunkObj1337[1]._arr1[3]._field36 = Common::Point(283, 80);
+
+ _arrunkObj1337[1]._arr2[0]._field36 = Common::Point(253, 122);
+ _arrunkObj1337[1]._arr2[1]._field36 = Common::Point(227, 122);
+ _arrunkObj1337[1]._arr2[2]._field36 = Common::Point(201, 122);
+ _arrunkObj1337[1]._arr2[3]._field36 = Common::Point(201, 96);
+ _arrunkObj1337[1]._arr2[4]._field36 = Common::Point(201, 70);
+ _arrunkObj1337[1]._arr2[5]._field36 = Common::Point(227, 70);
+ _arrunkObj1337[1]._arr2[6]._field36 = Common::Point(253, 70);
+ _arrunkObj1337[1]._arr2[7]._field36 = Common::Point(253, 96);
+
+ _arrunkObj1337[1]._arr3[0]._field36 = Common::Point(253, 43);
+
+ _arrunkObj1337[1]._arr4[0]._field36 = Common::Point(227, 96);
+
+ _arrunkObj1337[1]._fieldB94 = Common::Point(283, 146);
+ _arrunkObj1337[1]._fieldB98 = Common::Point(283, 124);
+ _arrunkObj1337[1]._fieldB9C = Common::Point(283, 102);
+ _arrunkObj1337[1]._fieldBA0 = Common::Point(283, 80);
+ _arrunkObj1337[1]._fieldBA4 = 4;
+
+ subPostInit();
+}
+
+void Scene1337::remove() {
+ if (R2_GLOBALS._v57709 > 1) {
+ subD1917();
+ subD1940(false);
+ }
+
+ R2_GLOBALS._uiElements._active = true;
+ SceneExt::remove();
+}
+
+void Scene1337::process(Event &event) {
+ if (event.eventType == EVENT_BUTTON_DOWN) {
+ if (event.btnState != BTNSHIFT_RIGHT) {
+ subD183F(R2_GLOBALS._v5780E, 1);
+ event.handled = true;
+ } else if (_unkFctPtr412) {
+ FunctionPtrType tmpFctPtr = _unkFctPtr412;
+ _unkFctPtr412 = NULL;
+ (this->*tmpFctPtr)();
+ event.handled = true;
+ }
+ } else if (event.eventType == EVENT_KEYPRESS) {
+ if (event.kbd.keycode == Common::KEYCODE_SPACE) {
+ if (_unkFctPtr412) {
+ FunctionPtrType tmpFctPtr = _unkFctPtr412;
+ _unkFctPtr412 = NULL;
+ (this->*tmpFctPtr)();
+ event.handled = true;
+ }
+ } else
+ warning("Fixme: Find proper keycode value");
+ }
+
+ if (!event.handled)
+ Scene::process(event);
+}
+
+void Scene1337::dispatch() {
+ if (_field424C == 0) {
+ ++_field424E;
+ if (_field424E == 4) {
+ _field424C = 1;
+ suggestInstructions();
+ }
+ }
+ Scene::dispatch();
+}
+
+void Scene1337::actionDisplay(int resNum, int lineNum, int x, int y, int arg5, int width, int textMode, int fontNum, int colFG, int colBGExt, int colFGExt) {
+ // TODO: Check if it's normal that arg5 is unused and replaced by an hardcoded 0 value
+ // May hide an original bug
+
+ SceneItem::display(resNum, lineNum, SET_X, x, SET_Y, y, SET_KEEP_ONSCREEN, 0, SET_WIDTH, width, SET_POS_MODE, -1, SET_TEXT_MODE, textMode, SET_FONT, fontNum, SET_FG_COLOR, colFG, SET_EXT_BGCOLOR, colBGExt, SET_EXT_FGCOLOR, colFGExt, LIST_END);
+}
+
+void Scene1337::setAnimationInfo(unkObj1337sub1 *subObj) {
+ if (!subObj)
+ return;
+
+ if (subObj->_field34 > 9) {
+ if (subObj->_field34 > 25) {
+ subObj->_object1.setStrip2(4);
+ subObj->_object1.setFrame(subObj->_field34 - 25);
+ } else {
+ subObj->_object1.setStrip2(3);
+ subObj->_object1.setFrame(subObj->_field34 - 9);
+ }
+ } else {
+ subObj->_object1.setStrip2(2);
+ subObj->_object1.setFrame(subObj->_field34);
+ }
+
+ subObj->_object1.show();
+ R2_GLOBALS._sceneObjects->draw();
+}
+
+void Scene1337::subC20E5() {
+ subC2586();
+}
+
+void Scene1337::subC20F9() {
+ switch (_field424A) {
+ case -1:
+ ++_field423E;
+ if (_field423E == 3)
+ _field423E = 0;
+
+ if (_field4244 == 1) {
+ _object1.show();
+ switch (_field423E) {
+ case 0:
+ _object1.setStrip(3);
+ break;
+ case 1:
+ _object1.setStrip(4);
+ break;
+ case 2:
+ subD1975(174, 107);
+ _object1.setStrip(1);
+ break;
+ case 3:
+ subC4CEC();
+ _object1.setStrip(2);
+ break;
+ default:
+ break;
+ }
+
+ if (!_autoplay)
+ _unkFctPtr412 = &Scene1337::subC20E5;
+ else
+ subC20E5();
+ } else {
+ subC20E5();
+ }
+ break;
+ case 0:
+ _aSound2.play(62);
+ actionDisplay(1330, 135, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ actionDisplay(1330, 121, 20, 99, 1, 136, 0, 7, 0, 172, 172);
+ actionDisplay(1330, 122, 300, 99, 1, 136, 0, 7, 0, 117, 117);
+ R2_GLOBALS._sceneObjects->draw();
+ actionDisplay(1330, 123, 159, 134, 1, 200, 0, 7, 0, 105, 105);
+ break;
+ case 1:
+ _aSound2.play(62);
+ actionDisplay(1330, 151, 300, 99, 1, 136, 0, 7, 0, 117, 117);
+ actionDisplay(1330, 118, 20, 99, 1, 136, 0, 7, 0, 172, 172);
+ actionDisplay(1330, 119, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ R2_GLOBALS._sceneObjects->draw();
+ actionDisplay(1330, 120, 159, 134, 1, 200, 0, 7, 0, 105, 105);
+ break;
+ case 2:
+ _aSound2.play(62);
+ actionDisplay(1330, 134, 159, 134, 1, 200, 0, 7, 0, 105, 105);
+ actionDisplay(1330, 124, 20, 99, 1, 136, 0, 7, 0, 172, 172);
+ actionDisplay(1330, 126, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ R2_GLOBALS._sceneObjects->draw();
+ actionDisplay(1330, 125, 300, 99, 1, 136, 0, 7, 0, 117, 117);
+ break;
+ case 3:
+ _aSound2.play(62);
+ actionDisplay(1330, 150, 20, 99, 1, 136, 0, 7, 0, 172, 172);
+ actionDisplay(1330, 115, 300, 99, 1, 136, 0, 7, 0, 117, 117);
+ actionDisplay(1330, 116, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ R2_GLOBALS._sceneObjects->draw();
+ actionDisplay(1330, 117, 159, 134, 1, 200, 0, 7, 0, 105, 105);
+ break;
+ default:
+ break;
+ }
+
+ if (_field424A != -1)
+ R2_GLOBALS._sceneManager.changeScene(125);
+
+}
+
+void Scene1337::subC2586() {
+ if (_field4244 != 0)
+ _object1.hide();
+
+ switch (_field423E) {
+ case 2:
+ subC4CD2();
+ if (_field4246 == 1)
+ actionDisplay(1330, 114, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ _field4246 = 0;
+ // No break on purpose
+ case 0:
+ // No break on purpose
+ case 1:
+ // No break on purpose
+ case 3:
+ _item1.setAction(&_action4);
+ default:
+ break;
+ }
+
+ _field4244 = 1;
+
+}
+
+bool Scene1337::subC264B(int arg1) {
+ switch (arg1) {
+ case 10:
+ // No break on purpose
+ case 12:
+ // No break on purpose
+ case 15:
+ // No break on purpose
+ case 17:
+ // No break on purpose
+ case 18:
+ // No break on purpose
+ case 19:
+ // No break on purpose
+ case 20:
+ // No break on purpose
+ case 21:
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool Scene1337::subC2687(int arg1) {
+ switch (arg1) {
+ case 11:
+ // No break on purpose
+ case 14:
+ // No break on purpose
+ case 16:
+ // No break on purpose
+ case 24:
+ return true;
+ default:
+ return false;
+ }
+}
+
+int Scene1337::subC26CB(int arg1, int arg2) {
+ if ((_arrunkObj1337[arg1]._arr1[arg2]._field34 > 1) && (_arrunkObj1337[arg1]._arr1[arg2]._field34 <= 9)) {
+ return arg2;
+ }
+
+ return -1;
+}
+
+int Scene1337::subC2719(int arg1) {
+ for (int i = 0; i <= 3; i++) {
+ if (_arrunkObj1337[arg1]._arr1[i]._field34 == 1)
+ return i;
+ }
+
+ return -1;
+}
+
+int Scene1337::subC274D(int arg1) {
+ for (int i = 0; i <= 3; i++) {
+ if (_arrunkObj1337[arg1]._arr1[i]._field34 == 13)
+ return i;
+ }
+
+ return -1;
+}
+
+int Scene1337::subC2781(int arg1) {
+ for (int i = 0; i <= 3; i++) {
+ if (_arrunkObj1337[arg1]._arr1[i]._field34 == 25)
+ return i;
+ }
+
+ return -1;
+}
+
+int Scene1337::subC27B5(int arg1) {
+ switch (arg1) {
+ case 11:
+ // No break on purpose
+ case 14:
+ // No break on purpose
+ case 16:
+ // No break on purpose
+ case 24:
+ return arg1;
+ break;
+ default:
+ return -1;
+ break;
+ }
+}
+
+int Scene1337::subC27F9(int arg1) {
+ switch (arg1) {
+ case 10:
+ // No break on purpose
+ case 12:
+ // No break on purpose
+ case 15:
+ // No break on purpose
+ case 17:
+ // No break on purpose
+ case 18:
+ // No break on purpose
+ case 19:
+ // No break on purpose
+ case 20:
+ // No break on purpose
+ case 21:
+ return arg1;
+ default:
+ return -1;
+ }
+}
+
+void Scene1337::subC2835(int arg1) {
+ int i;
+ bool found = false;
+ switch (arg1) {
+ case 0:
+ for (i = 0; i <= 3; i++) {
+ if (subC27F9(_arrunkObj1337[arg1]._arr1[i]._field34) != -1) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found)
+ break;
+
+ for (i = 0; i <= 3; i++) {
+ if (subC27B5(_arrunkObj1337[arg1]._arr1[i]._field34) != -1) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found)
+ break;
+
+ for (i = 0; i <= 3; i++) {
+ if ((_arrunkObj1337[arg1]._arr1[i]._field34 > 1) && (_arrunkObj1337[arg1]._arr1[i]._field34 <= 9)) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found)
+ break;
+
+ for (i = 0; i <= 3; i++) {
+ if ((_arrunkObj1337[arg1]._arr1[i]._field34 >= 26) && (_arrunkObj1337[arg1]._arr1[i]._field34 <= 33)) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found)
+ break;
+
+ for (i = 0; i <= 3; i++) {
+ if (_arrunkObj1337[arg1]._arr1[i]._field34 == 1) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found)
+ break;
+
+ for (i = 0; i <= 3; i++) {
+ if (_arrunkObj1337[arg1]._arr1[i]._field34 == 25) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found)
+ break;
+
+ for (i = 0; i <= 3; i++) {
+ if (_arrunkObj1337[arg1]._arr1[i]._field34 == 13) {
+ found = true;
+ break;
+ }
+ }
+ break;
+ case 1:
+ for (i = 0; i <= 3; i++) {
+ if ((_arrunkObj1337[arg1]._arr1[i]._field34 >= 26) && (_arrunkObj1337[arg1]._arr1[i]._field34 <= 33)) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found)
+ break;
+
+ for (i = 0; i <= 3; i++) {
+ if (_arrunkObj1337[arg1]._arr1[i]._field34 == 1) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found)
+ break;
+
+ for (i = 0; i <= 3; i++) {
+ if ((_arrunkObj1337[arg1]._arr1[i]._field34 > 1) && (_arrunkObj1337[arg1]._arr1[i]._field34 <= 9)) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found)
+ break;
+
+ for (i = 0; i <= 3; i++) {
+ if (subC27F9(_arrunkObj1337[arg1]._arr1[i]._field34) != -1) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found)
+ break;
+
+ for (i = 0; i <= 3; i++) {
+ if (subC27B5(_arrunkObj1337[arg1]._arr1[i]._field34) != -1) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found)
+ break;
+
+ for (i = 0; i <= 3; i++) {
+ if (_arrunkObj1337[arg1]._arr1[i]._field34 == 25) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found)
+ break;
+
+ for (i = 0; i <= 3; i++) {
+ if (_arrunkObj1337[arg1]._arr1[i]._field34 == 13) {
+ found = true;
+ break;
+ }
+ }
+
+ break;
+ default:
+ return;
+ }
+
+ subC4A39(&_arrunkObj1337[arg1]._arr1[i]);
+}
+
+bool Scene1337::subC2BF8(unkObj1337sub1 *subObj1, Common::Point pt) {
+ if ((subObj1->_field36.x > pt.x) || (subObj1->_field36.x + 24 < pt.x))
+ return false;
+
+ if ((subObj1->_field36.y > pt.y) || (subObj1->_field36.y + 24 < pt.y))
+ return false;
+
+ return true;
+}
+
+void Scene1337::subC2C2F() {
+ bool found = true;
+
+ if (_arrunkObj1337[3]._arr3[0]._field34 != 0) {
+ switch (_arrunkObj1337[3]._arr3[0]._field34) {
+ case 10:
+ // No break on purpose
+ case 12:
+ // No break on purpose
+ case 15:
+ // No break on purpose
+ case 17:
+ // No break on purpose
+ case 18:
+ // No break on purpose
+ case 19:
+ // No break on purpose
+ case 20:
+ // No break on purpose
+ case 21:
+ subC4A39(&_arrunkObj1337[3]._arr3[0]);
+ found = false;
+ break;
+ default:
+ found = false;
+ int i;
+ for (i = 0; i <= 3; i++) {
+ if (subC3386(_arrunkObj1337[3]._arr3[0]._field34, _arrunkObj1337[3]._arr1[i]._field34)) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found) {
+ found = false;
+ subC34A1(&_arrunkObj1337[3]._arr1[i], &_arrunkObj1337[3]._arr3[0]);
+ }
+ break;
+ }
+ }
+
+ if (!found)
+ return;
+
+ int randIndx = R2_GLOBALS._randomSource.getRandomNumber(3);
+
+ if (_arrunkObj1337[3]._arr1[randIndx]._field34 == 1) {
+ found = false;
+
+ for (int i = 0; i <= 7; i++) {
+ if ((_arrunkObj1337[3]._arr2[i]._field34 == 0) && (!subC2687(_arrunkObj1337[3]._arr3[0]._field34))) {
+ subC340B(&_arrunkObj1337[3]._arr1[randIndx], &_arrunkObj1337[3]._arr2[i]);
+ found = true;
+ break;
+ }
+ }
+
+ if (found) {
+ return;
+ }
+ } else if (_arrunkObj1337[3]._arr1[randIndx]._field34 <= 9) {
+ found = false;
+
+ for (int i = 0; i <= 7; i++) {
+ if (_arrunkObj1337[3]._arr2[i]._field34 == _arrunkObj1337[3]._arr1[randIndx]._field34) {
+ found = true;
+ break;
+ }
+ }
+
+ if (!found) {
+ for (int i = 0; i <= 7; i++) {
+ if ((_arrunkObj1337[3]._arr2[i]._field34 == 1) && (!subC2687(_arrunkObj1337[3]._arr3[i]._field34))) {
+ int tmpVal = 0;
+
+ for (int j = 0; j <= 7; j++) {
+ if ((_arrunkObj1337[3]._arr2[j]._field34 > 1) && (_arrunkObj1337[3]._arr2[j]._field34 <= 9))
+ ++tmpVal;
+ }
+
+ if (tmpVal == 7)
+ _field424A = 3;
+
+ subC33C0(&_arrunkObj1337[3]._arr1[randIndx], &_arrunkObj1337[3]._arr2[i]);
+ found = true;
+ break;
+ }
+ }
+ if (found)
+ return;
+ }
+ } else if (_arrunkObj1337[3]._arr1[randIndx]._field34 == 13) {
+ int tmpVal = subC331B(3);
+
+ if (tmpVal != -1) {
+ subC358E(&_arrunkObj1337[3]._arr1[randIndx], tmpVal);
+ return;
+ }
+ } else if (_arrunkObj1337[3]._arr1[randIndx]._field34 == 25) {
+ int tmpVal = -1;
+ found = false;
+ int tmpRandIndx = R2_GLOBALS._randomSource.getRandomNumber(3);
+
+ for (int i = 0; i <= 3; i++) {
+ if ( (tmpRandIndx != 3)
+ && ( (_arrunkObj1337[tmpRandIndx]._arr1[0]._field34 != 0)
+ || (_arrunkObj1337[tmpRandIndx]._arr1[1]._field34 != 0)
+ || (_arrunkObj1337[tmpRandIndx]._arr1[2]._field34 != 0)
+ || (_arrunkObj1337[tmpRandIndx]._arr1[3]._field34 != 0) )) {
+ tmpVal = tmpRandIndx;
+ break;
+ }
+
+ ++tmpRandIndx;
+ if (tmpRandIndx > 3)
+ tmpRandIndx = 0;
+ }
+
+ if (tmpVal != -1) {
+ subC318B(3, &_arrunkObj1337[3]._arr1[randIndx], tmpVal);
+ return;
+ }
+ } else {
+ switch (_arrunkObj1337[3]._arr1[randIndx]._field34) {
+ case 10:
+ // No break on purpose
+ case 11:
+ // No break on purpose
+ case 12:
+ // No break on purpose
+ case 14:
+ // No break on purpose
+ case 15:
+ // No break on purpose
+ case 16:
+ // No break on purpose
+ case 17:
+ // No break on purpose
+ case 18:
+ // No break on purpose
+ case 19:
+ // No break on purpose
+ case 20:
+ // No break on purpose
+ case 21:
+ // No break on purpose
+ case 24: {
+ int tmpVal = -1;
+ int tmpRandIndx = R2_GLOBALS._randomSource.getRandomNumber(3);
+
+ for (int i = 0; i <= 3; i++) {
+ if (tmpRandIndx != 3) {
+ // The variables 'i' and 'j' are not used in the inner code of the loop.
+ // It's understandable for 'i', which helps making sure that tmpVal is used properly,
+ // but it's suspect for j
+ for (int j = 0; j <= 7; j++) {
+ if ((_arrunkObj1337[tmpRandIndx]._arr3[0]._field34 == 0) && (subC32B1(tmpRandIndx, _arrunkObj1337[3]._arr1[randIndx]._field34))) {
+ tmpVal = j;
+ }
+ }
+ }
+
+ ++tmpRandIndx;
+ if (tmpRandIndx > 3)
+ tmpRandIndx = 0;
+
+ if (tmpVal != -1)
+ break;
+ }
+
+ if (tmpVal != -1) {
+ // Useless second identical check skipped
+ subC3456(&_arrunkObj1337[3]._arr1[randIndx], &_arrunkObj1337[tmpVal]._arr3[0]);
+ return;
+ }
+ }
+ default:
+ break;
+ }
+ }
+
+ subC4A39(&_arrunkObj1337[3]._arr1[randIndx]);
+}
+
+void Scene1337::subC318B(int arg1, unkObj1337sub1 *subObj1, int arg3) {
+ _field4240 = arg1;
+ _field4242 = arg3;
+
+ int randIndx;
+
+ for (;;) {
+ randIndx = R2_GLOBALS._randomSource.getRandomNumber(3);
+ if (_arrunkObj1337[arg3]._arr1[randIndx]._field34 != 0)
+ break;
+ }
+
+ _field3EF0 = subObj1;
+ _field3EF4 = &_arrunkObj1337[arg3]._arr4[0];
+ _field3EF8 = &_arrunkObj1337[arg3]._arr1[randIndx];
+
+ _item1.setAction(&_action11);
+}
+
+int Scene1337::subC3257(int arg1) {
+ int retVal;
+
+ switch (arg1) {
+ case 10:
+ retVal = 2;
+ break;
+ case 12:
+ retVal = 3;
+ break;
+ case 15:
+ retVal = 5;
+ break;
+ case 17:
+ retVal = 9;
+ break;
+ case 18:
+ retVal = 6;
+ break;
+ case 19:
+ retVal = 4;
+ break;
+ case 20:
+ retVal = 8;
+ break;
+ case 21:
+ retVal = 7;
+ break;
+ default:
+ retVal = -1;
+ }
+
+ return retVal;
+}
+
+bool Scene1337::subC32B1(int arg1, int arg2) {
+ for (int i = 0; i <= 7; i++) {
+ if (_arrunkObj1337[arg1]._arr2[i]._field34 != 0) {
+ int tmpVal = subC3257(arg2);
+ if (tmpVal == _arrunkObj1337[arg1]._arr2[i]._field34)
+ return false;
+ }
+ }
+ return true;
+}
+
+int Scene1337::subC331B(int arg1) {
+ int randIndx = R2_GLOBALS._randomSource.getRandomNumber(3);
+
+ for (int i = 0; i <= 3; i++) {
+ if (randIndx != arg1) {
+ for (int j = 0; j <= 7; j++) {
+ if (_arrunkObj1337[randIndx]._arr2[j]._field34 != 0)
+ return randIndx;
+ }
+ }
+
+ if (arg1 == 1) {
+ randIndx--;
+ if (randIndx < 0)
+ randIndx = 3;
+ } else {
+ ++randIndx;
+ if (randIndx > 3)
+ randIndx = 0;
+ }
+ }
+
+ return -1;
+}
+
+bool Scene1337::subC3386(int arg1, int arg2) {
+ if ((arg1 == 11) && (arg2 == 26))
+ return true;
+
+ if ((arg1 == 14) && (arg2 == 30))
+ return true;
+
+ if ((arg1 == 16) && (arg2 == 32))
+ return true;
+
+ if ((arg1 == 24) && (arg2 == 28))
+ return true;
+
+ return false;
+}
+
+void Scene1337::subC33C0(unkObj1337sub1 *subObj1, unkObj1337sub1 *subObj2) {
+ _field3EF4 = subObj2;
+ _field3EF0 = subObj1;
+ _item1.setAction(&_action7);
+}
+
+int Scene1337::subC3E92(int arg1) {
+ if ( (_arrunkObj1337[arg1]._arr1[0]._field34 == 0)
+ && (_arrunkObj1337[arg1]._arr1[1]._field34 == 0)
+ && (_arrunkObj1337[arg1]._arr1[2]._field34 == 0)
+ && (_arrunkObj1337[arg1]._arr1[3]._field34 == 0))
+ return -1;
+
+ int randIndx;
+ for (;;) {
+ randIndx = R2_GLOBALS._randomSource.getRandomNumber(3);
+ if (_arrunkObj1337[arg1]._arr1[randIndx]._field34 == 0)
+ break;
+ }
+
+ return randIndx;
+}
+
+void Scene1337::subC340B(unkObj1337sub1 *subObj1, unkObj1337sub1 *subObj2) {
+ _field3EF0 = subObj1;
+ _field3EF4 = subObj2;
+
+ _item1.setAction(&_action6);
+}
+
+void Scene1337::subC3456(unkObj1337sub1 *subObj1, unkObj1337sub1 *subObj2) {
+ _field3EF0 = subObj1;
+ _field3EF4 = subObj2;
+
+ _item1.setAction(&_action9);
+}
+
+void Scene1337::subC34A1(unkObj1337sub1 *subObj1, unkObj1337sub1 *subObj2) {
+ _field3EF0 = subObj1;
+ _field3EF4 = subObj2;
+
+ _item1.setAction(&_action8);
+}
+
+Scene1337::unkObj1337sub1 *Scene1337::subC34EC(int arg1) {
+ for (int i = 0; i <= 7; i++) {
+ if (_arrunkObj1337[arg1]._arr2[i]._field34 == 1) {
+ return &_arrunkObj1337[arg1]._arr2[i];
+ }
+ }
+
+ for (int i = 0; i <= 7; i++) {
+ if ((_arrunkObj1337[arg1]._arr2[i]._field34 != 0) && (_arrunkObj1337[arg1]._arr2[i]._field34 < 10)) {
+ return &_arrunkObj1337[arg1]._arr2[i];
+ }
+ }
+
+ return NULL;
+}
+
+void Scene1337::subC358E(unkObj1337sub1 *subObj1, int arg2) {
+ _field3EF0 = subObj1;
+ _field3EF4 = subC34EC(arg2);
+ _field3EF8 = &_arrunkObj1337[arg2]._arr4[0];
+ _field4240 = arg2;
+ _item1.setAction(&_action10);
+}
+
+void Scene1337::subC4A39(unkObj1337sub1 *subObj) {
+ _field3EF0 = subObj;
+
+ _item1.setAction(&_action5);
+}
+
+void Scene1337::subC4CD2() {
+ if (R2_GLOBALS._v57709 > 0) {
+ subD1917();
+ subD1940(false);
+ }
+}
+
+void Scene1337::subC4CEC() {
+ if (R2_GLOBALS._v57709 != 0)
+ return;
+
+ subD18F5();
+ subD1940(1);
+}
+
+void Scene1337::subC51A0(unkObj1337sub1 *subObj1, unkObj1337sub1 *subObj2) {
+ _field3EF0 = subObj1;
+ _field3EF4 = subObj2;
+
+ _item1.setAction(&_action13);
+}
+
+void Scene1337::displayDialog(int dialogNumb) {
+ switch (dialogNumb - 1) {
+ case 0:
+ actionDisplay(1330, 53, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 1:
+ actionDisplay(1330, 57, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 2:
+ actionDisplay(1330, 58, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 3:
+ actionDisplay(1330, 59, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 4:
+ actionDisplay(1330, 60, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 5:
+ actionDisplay(1330, 61, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 6:
+ actionDisplay(1330, 62, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 7:
+ actionDisplay(1330, 63, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 8:
+ actionDisplay(1330, 64, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 9:
+ actionDisplay(1330, 65, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 10:
+ actionDisplay(1330, 67, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 11:
+ actionDisplay(1330, 69, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 12:
+ actionDisplay(1330, 71, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ actionDisplay(1330, 72, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ actionDisplay(1330, 73, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 13:
+ actionDisplay(1330, 79, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 14:
+ actionDisplay(1330, 81, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 15:
+ actionDisplay(1330, 83, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 16:
+ actionDisplay(1330, 85, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 17:
+ actionDisplay(1330, 87, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 18:
+ actionDisplay(1330, 89, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 19:
+ actionDisplay(1330, 91, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 20:
+ actionDisplay(1330, 93, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 23:
+ actionDisplay(1330, 95, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 24:
+ actionDisplay(1330, 97, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 25:
+ actionDisplay(1330, 104, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 26:
+ actionDisplay(1330, 105, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ actionDisplay(1330, 106, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 27:
+ actionDisplay(1330, 110, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 28:
+ actionDisplay(1330, 108, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ actionDisplay(1330, 109, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 29:
+ actionDisplay(1330, 111, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 31:
+ actionDisplay(1330, 112, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene1337::subPostInit() {
+ R2_GLOBALS._v57709 = 0;
+ R2_GLOBALS._v5780C = 0;
+ subD183F(1, 0);
+ subD1940(true);
+ subD18F5();
+
+// loadScene(1330);
+// SceneExt::postInit();
+
+ R2_GLOBALS._scenePalette.addRotation(224, 235, 1);
+
+ _field3E28[0] = 1;
+ _field3E28[1] = 1;
+ _field3E28[2] = 1;
+ _field3E28[3] = 1;
+ _field3E28[4] = 1;
+ _field3E28[5] = 1;
+ _field3E28[6] = 1;
+ _field3E28[7] = 1;
+ _field3E28[8] = 26;
+ _field3E28[9] = 2;
+ _field3E28[10] = 2;
+ _field3E28[11] = 2;
+ _field3E28[12] = 2;
+ _field3E28[13] = 2;
+ _field3E28[14] = 26;
+ _field3E28[15] = 3;
+ _field3E28[16] = 3;
+ _field3E28[17] = 3;
+ _field3E28[18] = 3;
+ _field3E28[19] = 3;
+ _field3E28[20] = 28;
+ _field3E28[21] = 4;
+ _field3E28[22] = 4;
+ _field3E28[23] = 4;
+ _field3E28[24] = 4;
+ _field3E28[25] = 4;
+ _field3E28[26] = 28;
+ _field3E28[27] = 5;
+ _field3E28[28] = 5;
+ _field3E28[29] = 5;
+ _field3E28[30] = 5;
+ _field3E28[31] = 5;
+ _field3E28[32] = 30;
+ _field3E28[33] = 6;
+ _field3E28[34] = 6;
+ _field3E28[35] = 6;
+ _field3E28[36] = 6;
+ _field3E28[37] = 6;
+ _field3E28[38] = 30;
+ _field3E28[39] = 7;
+ _field3E28[40] = 7;
+ _field3E28[41] = 7;
+ _field3E28[42] = 7;
+ _field3E28[43] = 7;
+ _field3E28[44] = 32;
+ _field3E28[45] = 8;
+ _field3E28[46] = 8;
+ _field3E28[47] = 8;
+ _field3E28[48] = 8;
+ _field3E28[49] = 8;
+ _field3E28[50] = 32;
+ _field3E28[51] = 9;
+ _field3E28[52] = 9;
+ _field3E28[53] = 9;
+ _field3E28[54] = 9;
+ _field3E28[55] = 9;
+ _field3E28[56] = 10;
+ _field3E28[57] = 11;
+ _field3E28[58] = 12;
+ _field3E28[59] = 13;
+ _field3E28[60] = 13;
+ _field3E28[61] = 14;
+ _field3E28[62] = 15;
+ _field3E28[63] = 16;
+ _field3E28[64] = 17;
+ _field3E28[65] = 18;
+ _field3E28[66] = 19;
+ _field3E28[67] = 20;
+ _field3E28[68] = 21;
+ _field3E28[69] = 26;
+ _field3E28[70] = 28;
+ _field3E28[71] = 24;
+ _field3E28[72] = 25;
+ _field3E28[73] = 25;
+ _field3E28[74] = 25;
+ _field3E28[75] = 25;
+ _field3E28[76] = 26;
+ _field3E28[77] = 26;
+ _field3E28[78] = 26;
+ _field3E28[79] = 27;
+ _field3E28[80] = 27;
+ _field3E28[81] = 28;
+ _field3E28[82] = 28;
+ _field3E28[83] = 28;
+ _field3E28[84] = 29;
+ _field3E28[85] = 29;
+ _field3E28[86] = 29;
+ _field3E28[87] = 30;
+ _field3E28[88] = 30;
+ _field3E28[89] = 30;
+ _field3E28[90] = 30;
+ _field3E28[91] = 32;
+ _field3E28[92] = 1;
+ _field3E28[93] = 32;
+ _field3E28[94] = 32;
+ _field3E28[95] = 32;
+ _field3E28[96] = 1;
+ _field3E28[97] = 1;
+ _field3E28[98] = 1;
+ _field3E28[99] = 0;
+
+ _field3E24 = 98;
+ _field3E26 = 98;
+
+ _item7._field34 = 0;
+ _item7._field36 = Common::Point(128, 95);
+
+ _item8._field34 = 0;
+ _item8._field36 = Common::Point(162, 95);
+
+ _item6._field34 = 0;
+
+ _item2._object1.postInit();
+ _item2._object1.setVisage(1332);
+ _item2._object1.setStrip(5);
+ _item2._object1.setFrame(1);
+ _item2._object1._moveDiff = Common::Point(10, 10);
+ _item2._object1.fixPriority(400);
+ _item2._object1.setPosition(Common::Point(128, 95), 0);
+ _item2._object1.animate(ANIM_MODE_2, NULL);
+ _item2._object1.hide();
+
+ _object1.postInit();
+ _object1.setVisage(1334);
+ _object1.setStrip(1);
+ _object1.setFrame(1);
+ _object1._numFrames = 12;
+ _object1.fixPriority(500);
+ _object1.setPosition(Common::Point(174, 107), 0);
+ _object1.animate(ANIM_MODE_2, NULL);
+ _object1.hide();
+
+ _field4244 = 1;
+ _field4246 = 0;
+ _field4248 = 0;
+ _field424A = -1;
+
+ _background1.setup2(9531, 1, 1, 249, 168, 155, 0);
+
+ _autoplay = false;
+ _field424C = 0;
+ _field424E = 0;
+}
+
+void Scene1337::suggestInstructions() {
+ if (R2_GLOBALS._v57709 > 0)
+ subD1917();
+ if (MessageDialog::show(NEED_INSTRUCTIONS, NO_MSG, YES_MSG) == 0) {
+ if (R2_GLOBALS._v57709 == 0)
+ subD18F5();
+ subCCF26();
+ } else {
+ if (R2_GLOBALS._v57709 == 0)
+ subD18F5();
+ subCB59B();
+ }
+}
+
+void Scene1337::subCB59B() {
+ _item1.setAction(&_action1);
+}
+
+void Scene1337::shuffleCards() {
+ R2_GLOBALS._sceneObjects->draw();
+
+ for (int i = 0; i <= 98; i++) {
+ if (_field3E28[i] == 0) {
+ for (int j = i + 1; j <= 98; j ++) {
+ if (_field3E28[j] != 0) {
+ _field3E28[i] = _field3E28[j];
+ _field3E28[j] = 0;
+ break;
+ }
+ }
+ }
+ }
+
+ for (int i = 0; i <= 99; i ++) {
+ if (_field3E28[i] == 0) {
+ _field3E24 = i - 1;
+ _field3E26 = 98;
+ break;
+ }
+ }
+
+ // tmpVal is never modified in the original. It looks weird but it works: at the end, the cards are suffled!
+ int tmpVal = 0;
+ int randIndx;
+ int swap;
+ for (int i = 0; i < 2000; i ++) {
+ randIndx = R2_GLOBALS._randomSource.getRandomNumber(_field3E24);
+ swap = _field3E28[tmpVal];
+ _field3E28[tmpVal] = _field3E28[randIndx];
+ _field3E28[randIndx] = swap;
+ }
+
+ _field423C = 0;
+ _item2._object1.setAction(&_action2);
+
+ while(_field423C == 0) {
+ g_globals->_scenePalette.signalListeners();
+ R2_GLOBALS._sceneObjects->draw();
+ warning("TODO: recurse on draw() and on signalListeners()?");
+ g_globals->_events.delay(g_globals->_sceneHandler->_delayTicks);
+
+ // Hack to avoid eternal loop
+ // To be removed when the recurse is working properly
+ _field423C = 1;
+ }
+}
+
+void Scene1337::subCCF26() {
+ _item2._object1._moveDiff = Common::Point(30, 30);
+ shuffleCards();
+ _item1.setAction(&_action3);
+}
+void Scene1337::subCD193() {
+ warning("STUBBED: subCD193()");
+}
+
+void Scene1337::subCDB90(int arg1, Common::Point pt) {
+ bool found = false;
+ int curReg = R2_GLOBALS._sceneRegions.indexOf(g_globals->_events._mousePos);
+
+ if (arg1 == 3) {
+ int i;
+ for (i = 0; i <= 7; i++) {
+ if ( (subC2BF8(&_arrunkObj1337[2]._arr2[i], pt))
+ || (subC2BF8(&_arrunkObj1337[0]._arr2[i], pt))
+ || (subC2BF8(&_arrunkObj1337[1]._arr2[i], pt))
+ || (subC2BF8(&_arrunkObj1337[3]._arr2[i], pt)) ) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found) {
+ switch (curReg) {
+ case 5:
+ if (_arrunkObj1337[2]._arr2[i]._field34 != 0)
+ displayDialog(_arrunkObj1337[2]._arr2[i]._field34);
+ else
+ actionDisplay(1330, 20, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 10:
+ if (_arrunkObj1337[3]._arr2[i]._field34 != 0)
+ displayDialog(_arrunkObj1337[3]._arr2[i]._field34);
+ else
+ actionDisplay(1330, 22, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 15:
+ if (_arrunkObj1337[0]._arr2[i]._field34 != 0)
+ displayDialog(_arrunkObj1337[0]._arr2[i]._field34);
+ else
+ actionDisplay(1330, 21, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 20:
+ if (_arrunkObj1337[1]._arr2[i]._field34 != 0)
+ displayDialog(_arrunkObj1337[1]._arr2[i]._field34);
+ else
+ actionDisplay(1330, 23, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ default:
+ break;
+ }
+ } else {
+ if ( (subC2BF8(&_arrunkObj1337[2]._arr3[0], pt))
+ || (subC2BF8(&_arrunkObj1337[0]._arr3[0], pt))
+ || (subC2BF8(&_arrunkObj1337[1]._arr3[0], pt))
+ || (subC2BF8(&_arrunkObj1337[3]._arr3[0], pt)) ) {
+ found = true;
+ }
+
+ if (found) {
+ switch (curReg) {
+ case 5:
+ if (_arrunkObj1337[2]._arr3[0]._field34 != 0)
+ displayDialog(_arrunkObj1337[2]._arr3[0]._field34);
+ else
+ actionDisplay(1330, 10, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 10:
+ if (_arrunkObj1337[3]._arr3[0]._field34 != 0)
+ displayDialog(_arrunkObj1337[3]._arr3[0]._field34);
+ else
+ actionDisplay(1330, 16, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 15:
+ if (_arrunkObj1337[0]._arr3[0]._field34 != 0)
+ displayDialog(_arrunkObj1337[3]._arr3[0]._field34);
+ else
+ actionDisplay(1330, 13, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 20:
+ if (_arrunkObj1337[1]._arr3[0]._field34 != 0)
+ displayDialog(_arrunkObj1337[1]._arr3[0]._field34);
+ else
+ actionDisplay(1330, 18, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ default:
+ break;
+ }
+ } else {
+ if (subC2BF8(&_item7, pt)) {
+ if (_item7._field34 != 0)
+ displayDialog(_item7._field34);
+ else
+ actionDisplay(1330, 7, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else if (_background1._bounds.contains(pt)) {
+ actionDisplay(1330, 43, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else if (subC2BF8(&_item8, pt)) {
+ actionDisplay(1330, 4, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else if ( (subC2BF8(&_arrunkObj1337[2]._arr4[0], pt))
+ || (subC2BF8(&_arrunkObj1337[3]._arr4[0], pt))
+ || (subC2BF8(&_arrunkObj1337[0]._arr4[0], pt))
+ || (subC2BF8(&_arrunkObj1337[1]._arr4[0], pt)) ) {
+ actionDisplay(1330, 32, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else {
+ if (subC2BF8(&_arrunkObj1337[2]._arr1[0], pt))
+ displayDialog(_arrunkObj1337[2]._arr1[0]._field34);
+ else if (subC2BF8(&_arrunkObj1337[2]._arr1[1], pt))
+ displayDialog(_arrunkObj1337[2]._arr1[1]._field34);
+ else if (subC2BF8(&_arrunkObj1337[2]._arr1[2], pt))
+ displayDialog(_arrunkObj1337[2]._arr1[2]._field34);
+ else if (subC2BF8(&_arrunkObj1337[2]._arr1[3], pt))
+ displayDialog(_arrunkObj1337[2]._arr1[3]._field34);
+ else if ((curReg >= 6) || (curReg <= 9))
+ actionDisplay(1330, 29, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ else if ((curReg >= 11) || (curReg <= 14))
+ actionDisplay(1330, 31, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ else if ((curReg >= 16) || (curReg <= 19))
+ actionDisplay(1330, 30, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ else {
+ switch (curReg) {
+ case 0:
+ actionDisplay(1330, 2, 159, 134, 1, 200, 0, 7, 0, 105, 105);
+ break;
+ case 5:
+ actionDisplay(1330, 25, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 10:
+ actionDisplay(1330, 27, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 15:
+ actionDisplay(1330, 26, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 20:
+ actionDisplay(1330, 28, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 21:
+ actionDisplay(1330, 24, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (arg1 != 1)
+ return;
+
+ for (int i = 0; i <= 7; i++) {
+ if (subC2BF8(&_arrunkObj1337[2]._arr2[i], pt)) {
+ switch (_arrunkObj1337[2]._arr2[i]._field34) {
+ case 0:
+ actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 1:
+ actionDisplay(1330, 54, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ default:
+ actionDisplay(1330, 34, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ }
+ found = true;
+ break;
+ } else if (subC2BF8(&_arrunkObj1337[0]._arr2[i], pt)) {
+ switch (_arrunkObj1337[0]._arr2[i]._field34) {
+ case 0:
+ actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ default:
+ actionDisplay(1330, 1, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ }
+ found = true;
+ break;
+ } else if (subC2BF8(&_arrunkObj1337[1]._arr2[i], pt)) {
+ switch (_arrunkObj1337[1]._arr2[i]._field34) {
+ case 0:
+ actionDisplay(1330, 146, 300, 99, 1, 136, 0, 7, 0, 117, 117);
+ break;
+ default:
+ actionDisplay(1330, 144, 300, 99, 1, 136, 0, 7, 0, 117, 117);
+ break;
+ }
+ found = true;
+ break;
+ } else if (subC2BF8(&_arrunkObj1337[3]._arr2[i], pt)) {
+ switch (_arrunkObj1337[3]._arr2[i]._field34) {
+ case 0:
+ actionDisplay(1330, 147, 20, 99, 1, 136, 0, 7, 0, 172, 172);
+ break;
+ default:
+ actionDisplay(1330, 145, 20, 99, 1, 136, 0, 7, 0, 172, 172);
+ break;
+ }
+ found = true;
+ break;
+ }
+ }
+
+ if (subC2BF8(&_arrunkObj1337[2]._arr3[0], pt)) {
+ if (_arrunkObj1337[0]._arr3[0]._field34 != 0) {
+ actionDisplay(1330, 39, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else {
+ actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ }
+ found = true;
+ }
+
+ if (subC2BF8(&_arrunkObj1337[3]._arr3[0], pt)) {
+ if (_arrunkObj1337[3]._arr3[0]._field34 != 0) {
+ actionDisplay(1330, 145, 20, 99, 1, 136, 0, 7, 0, 172, 172);
+ } else {
+ actionDisplay(1330, 147, 20, 99, 1, 136, 0, 7, 0, 172, 172);
+ }
+ found = true;
+ }
+
+ if (subC2BF8(&_arrunkObj1337[1]._arr3[0], pt)) {
+ if (_arrunkObj1337[1]._arr3[0]._field34 != 0) {
+ actionDisplay(1330, 144, 300, 99, 1, 136, 0, 7, 0, 117, 117);
+ } else {
+ actionDisplay(1330, 146, 300, 99, 1, 136, 0, 7, 0, 117, 117);
+ }
+ found = true;
+ }
+
+ if (subC2BF8(&_arrunkObj1337[0]._arr3[0], pt)) {
+ if (_arrunkObj1337[0]._arr3[0]._field34 != 0) {
+ actionDisplay(1330, 1, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else {
+ actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ }
+ found = true;
+ }
+
+ if (subC2BF8(&_arrunkObj1337[3]._arr4[0], pt)) {
+ actionDisplay(1330, 147, 20, 99, 1, 136, 0, 7, 0, 172, 172);
+ found = true;
+ }
+
+ if (subC2BF8(&_arrunkObj1337[1]._arr4[0], pt)) {
+ actionDisplay(1330, 146, 300, 99, 1, 136, 0, 7, 0, 117, 117);
+ found = true;
+ }
+
+ if (subC2BF8(&_arrunkObj1337[0]._arr4[0], pt)) {
+ actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ found = true;
+ }
+
+ if (found)
+ return;
+
+ if (_background1._bounds.contains(pt)) {
+ subCD193();
+ return;
+ }
+
+ if (subC2BF8(&_item7, pt))
+ actionDisplay(1330, 9, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ else if (subC2BF8(&_item8, pt))
+ actionDisplay(1330, 5, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ else {
+ switch (curReg) {
+ case 0:
+ actionDisplay(1330, 3, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 6:
+ // no break on purpose
+ case 7:
+ // no break on purpose
+ case 8:
+ // no break on purpose
+ case 9:
+ actionDisplay(1330, 145, 20, 99, 1, 136, 0, 7, 0, 172, 172);
+ break;
+ case 10:
+ actionDisplay(1330, 147, 20, 99, 1, 136, 0, 7, 0, 172, 172);
+ break;
+ case 11:
+ // no break on purpose
+ case 12:
+ // no break on purpose
+ case 13:
+ // no break on purpose
+ case 14:
+ actionDisplay(1330, 1, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 16:
+ // no break on purpose
+ case 17:
+ // no break on purpose
+ case 18:
+ // no break on purpose
+ case 19:
+ actionDisplay(1330, 144, 300, 99, 1, 136, 0, 7, 0, 117, 117);
+ break;
+ case 20:
+ actionDisplay(1330, 146, 300, 99, 1, 136, 0, 7, 0, 117, 117);
+ break;
+ default:
+ actionDisplay(1330, 11, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ }
+ }
+}
+
+void Scene1337::subCF31D() {
+ int tmpVal = 1;
+ bool found;
+ int count;
+
+ if (this->_arrunkObj1337[1]._arr3[0]._field34 != 0) {
+ switch (_arrunkObj1337[1]._arr3[0]._field34) {
+ case 10:
+ // No break on purpose
+ case 12:
+ // No break on purpose
+ case 15:
+ // No break on purpose
+ case 17:
+ // No break on purpose
+ case 18:
+ // No break on purpose
+ case 19:
+ // No break on purpose
+ case 20:
+ // No break on purpose
+ case 21:
+ tmpVal = 0;
+ subC4A39(&_arrunkObj1337[1]._arr3[0]);
+ break;
+ default:
+ found = false;
+ int i;
+ for (i = 0; i <= 3; i++) {
+ if (subC3386(_arrunkObj1337[1]._arr3[0]._field34, _arrunkObj1337[1]._arr1[i]._field34)) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found) {
+ tmpVal = 0;
+ subC34A1(&_arrunkObj1337[1]._arr1[i], &_arrunkObj1337[1]._arr3[0]);
+ }
+ }
+ }
+
+ if (tmpVal != 1)
+ return;
+
+ found = false;
+ for (int i = 0; i <= 3; i++) {
+ int tmpIndx = subC26CB(1, i);
+ if (tmpIndx == -1)
+ break;
+
+ tmpVal = 0;
+ for (int j = 0; j <= 7; j++) {
+ if (_arrunkObj1337[1]._arr2[j]._field34 == _arrunkObj1337[1]._arr1[tmpIndx]._field34) {
+ tmpVal = 1;
+ break;
+ }
+ }
+
+ if (tmpVal == 0)
+ break;
+
+ for (int j = 0; j <= 7; j++) {
+ if (_arrunkObj1337[1]._arr2[j]._field34 == 1) {
+ if (!subC2687(_arrunkObj1337[1]._arr3[0]._field34)) {
+ count = 0;
+ for (int k = 0; k <= 7; k++) {
+ if ((_arrunkObj1337[1]._arr2[k]._field34 > 1) && (_arrunkObj1337[1]._arr2[k]._field34 <= 9))
+ ++count;
+ }
+
+ if (count == 7)
+ _field424A = 1;
+
+ subC33C0(&_arrunkObj1337[1]._arr1[tmpIndx], &_arrunkObj1337[1]._arr2[j]);
+ found = true;
+ break;
+ }
+ }
+ }
+ }
+
+ if (found)
+ return;
+
+ tmpVal = subC2719(1);
+ if (tmpVal != -1) {
+ for (int i = 0; i <= 7; i++) {
+ if ((_arrunkObj1337[1]._arr2[i]._field34 == 0) && (!subC2687(_arrunkObj1337[1]._arr3[0]._field34))) {
+ subC340B(&_arrunkObj1337[1]._arr1[tmpVal], &_arrunkObj1337[1]._arr2[i]);
+ found = true;
+ }
+ }
+ }
+
+ if (found)
+ return;
+
+ tmpVal = subC274D(1);
+ int tmpVal2 = subC331B(1);
+
+ if ((tmpVal != -1) && ( tmpVal2 != -1))
+ subC358E(&_arrunkObj1337[1]._arr1[tmpVal], tmpVal2);
+
+ if (found)
+ return;
+
+ tmpVal = subC2781(1);
+ if (tmpVal != -1) {
+ count = -1;
+ int rndVal = R2_GLOBALS._randomSource.getRandomNumber(3);
+ for (int i = 0; i <= 3; i++) {
+ if (rndVal != 1) {
+ if ( (_arrunkObj1337[rndVal]._arr1[0]._field34 != 0)
+ || (_arrunkObj1337[rndVal]._arr1[1]._field34 != 0)
+ || (_arrunkObj1337[rndVal]._arr1[2]._field34 != 0)
+ || (_arrunkObj1337[rndVal]._arr1[3]._field34 == 0)) {
+ count = rndVal;
+ break;
+ }
+
+ rndVal--;
+ if (rndVal < 0)
+ rndVal = 3;
+ }
+ }
+
+ if (count != -1) {
+ subC318B(1, &_arrunkObj1337[1]._arr1[tmpVal], count);
+ found = true;
+ }
+ }
+
+ if (found)
+ return;
+
+ count = -1;
+ int i;
+ for (i = 0; i <= 3; i++) {
+ tmpVal = subC27B5(_arrunkObj1337[1]._arr1[i]._field34);
+ if (tmpVal != -1) {
+ int rndVal = R2_GLOBALS._randomSource.getRandomNumber(3);
+
+ for (int j = 0; j <= 3; j++) {
+ if (tmpVal != 1) {
+ for (int k = 0; k <= 7; k++) {
+ // 'k' is not used in that loop.
+ // It looks suspicious.
+ if ((_arrunkObj1337[tmpVal]._arr3[0]._field34 == 0) && (subC32B1(tmpVal, _arrunkObj1337[1]._arr1[i]._field34))) {
+ count = tmpVal;
+ break;
+ }
+ }
+ }
+
+ if (count != -1) {
+ found = true;
+ break;
+ } else {
+ rndVal--;
+ if (rndVal < 0)
+ rndVal = 3;
+ }
+ }
+
+ if (found)
+ break;
+ }
+ }
+
+ if (found) {
+ if (count == -1)
+ return;
+
+ subC3456(&_arrunkObj1337[1]._arr1[i], &_arrunkObj1337[count]._arr3[0]);
+ } else {
+ int j;
+ for (j = 0; j <= 3; j++) {
+ if (subC27F9(_arrunkObj1337[1]._arr1[j]._field34) != -1) {
+ count = -1;
+ int rndVal = R2_GLOBALS._randomSource.getRandomNumber(3);
+ for (int l = 0; l <= 3; l++) {
+ if (rndVal != 1) {
+ for (int m = 0; m <= 7; m++) {
+ // 'm' is not used in that loop. It looks suspicious.
+ if ((_arrunkObj1337[rndVal]._arr3[0]._field34 == 0) && (_arrunkObj1337[1]._arr1[j]._field34 == 1)) {
+ count = rndVal;
+ break;
+ }
+ }
+ }
+ if (count != -1) {
+ found = true;
+ break;
+ } else {
+ rndVal--;
+ if (rndVal < 0)
+ rndVal = 3;
+ }
+ }
+ if (found)
+ break;
+ }
+ }
+
+ if (found) {
+ if (count == -1)
+ return;
+
+ subC3456(&_arrunkObj1337[1]._arr1[j], &_arrunkObj1337[count]._arr3[0]);
+ } else {
+ subC2835(1);
+ }
+ }
+
+}
+
+void Scene1337::subCF979() {
+ bool found = true;
+
+ if (_arrunkObj1337[0]._arr3[0]._field34 != 0) {
+ switch (_arrunkObj1337[0]._arr3[0]._field34) {
+ case 10:
+ //No break on purpose
+ case 12:
+ //No break on purpose
+ case 15:
+ //No break on purpose
+ case 17:
+ //No break on purpose
+ case 18:
+ //No break on purpose
+ case 19:
+ //No break on purpose
+ case 20:
+ //No break on purpose
+ case 21:
+ subC4A39(&_arrunkObj1337[0]._arr3[0]);
+ found = false;
+ break;
+ default:
+ int i;
+ found = false;
+
+ for (i = 0; i <= 3; i++) {
+ if (subC3386(_arrunkObj1337[0]._arr3[0]._field34, _arrunkObj1337[0]._arr1[i]._field34)) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found) {
+ found = false;
+ subC34A1(&_arrunkObj1337[0]._arr1[i], &_arrunkObj1337[0]._arr3[0]);
+ }
+ break;
+ }
+ }
+
+ if (found)
+ return;
+
+ int tmpVal;
+ found = false;
+ for (int i = 0; i <= 3; i++) {
+ tmpVal = subC26CB(0, i);
+
+ if (tmpVal != -1) {
+ bool flag = false;;
+ for (int j = 0; j <= 7; j++) {
+ if (_arrunkObj1337[0]._arr2[j]._field34 == _arrunkObj1337[0]._arr1[tmpVal]._field34) {
+ flag = true;
+ break;
+ }
+ }
+
+ if (!flag) {
+ for (int j = 0; j <= 7; j++) {
+ if ((_arrunkObj1337[0]._arr2[j]._field34 == 1) && (!subC2687(_arrunkObj1337[0]._arr3[0]._field34))) {
+ int count = 0;
+ for (int k = 0; k <= 7; k++) {
+ if ((_arrunkObj1337[0]._arr2[k]._field34 > 1) && (_arrunkObj1337[0]._arr2[k]._field34 <= 9)) {
+ ++count;
+ }
+ }
+
+ if (count == 7)
+ _field424A = 0;
+
+ subC33C0(&_arrunkObj1337[0]._arr1[tmpVal], &_arrunkObj1337[0]._arr2[j]);
+ found = true;
+ }
+ }
+ }
+ }
+
+ if (found)
+ break;
+ }
+
+ if (found)
+ return;
+
+ found = false;
+ tmpVal = subC2719(0);
+
+ if (tmpVal != -1) {
+ for (int i = 0; i <= 7; i++) {
+ if ((_arrunkObj1337[0]._arr2[i]._field34 == 0) && (!subC2687(_arrunkObj1337[0]._arr3[0]._field34))) {
+ subC340B(&_arrunkObj1337[0]._arr1[tmpVal], &_arrunkObj1337[0]._arr2[i]);
+ found = true;
+ break;
+ }
+ }
+ }
+
+ if (found)
+ return;
+
+ tmpVal = subC274D(0);
+ if (tmpVal != -1) {
+ for (int i = 0; i <= 7; i++) {
+ if (_arrunkObj1337[2]._arr2[i]._field34 != 0) {
+ subC358E(&_arrunkObj1337[0]._arr1[tmpVal], 2);
+ found = true;
+ break;
+ }
+ }
+ }
+
+ if (found)
+ return;
+
+ tmpVal = subC2781(0);
+ if (tmpVal != -1) {
+ if ( (_arrunkObj1337[2]._arr1[0]._field34 != 0)
+ || (_arrunkObj1337[2]._arr1[1]._field34 != 0)
+ || (_arrunkObj1337[2]._arr1[2]._field34 != 0)
+ || (_arrunkObj1337[2]._arr1[3]._field34 != 0) ) {
+ subC318B(0, &_arrunkObj1337[0]._arr1[tmpVal], 2);
+ found = true;
+ }
+ }
+
+ if (found)
+ return;
+
+ for (int i = 0; i <= 3; i++) {
+ if (subC27B5(_arrunkObj1337[0]._arr1[i]._field34) != -1) {
+ // The variable 'j' is not used in the inner code of the loop. It's suspect
+ for (int j = 0; j <= 7; j++) {
+ if ((_arrunkObj1337[2]._arr3[0]._field34 == 0) && (subC32B1(2, _arrunkObj1337[0]._arr1[i]._field34))) {
+ subC3456(&_arrunkObj1337[0]._arr1[i], &_arrunkObj1337[2]._arr3[0]);
+ found = true;
+ break;
+ }
+ }
+
+ if (found)
+ break;
+ }
+ }
+
+ if (found)
+ return;
+
+ for (int i = 0; i <= 3; i++) {
+ if (subC27F9(_arrunkObj1337[0]._arr1[i]._field34) != -1) {
+ // The variable 'j' is not used in the inner code of the loop. It's suspect
+ for (int j = 0; j <= 7; j++) {
+ if ((_arrunkObj1337[2]._arr3[0]._field34 == 0) && (subC32B1(2, _arrunkObj1337[0]._arr1[i]._field34))) {
+ subC3456(&_arrunkObj1337[0]._arr1[i], &_arrunkObj1337[2]._arr3[0]);
+ found = true;
+ }
+ }
+
+ if (found)
+ break;
+ }
+ }
+
+ if (found)
+ return;
+
+ tmpVal = subC274D(0);
+ int tmpVal2 = subC331B(0);
+
+ if ((tmpVal != -1) && (tmpVal2 != -1)) {
+ subC358E(&_arrunkObj1337[0]._arr1[tmpVal], tmpVal2);
+ found = true;
+ }
+
+ if (found)
+ return;
+
+ tmpVal = subC2781(0);
+ if (tmpVal != -1) {
+ if ( (_arrunkObj1337[1]._arr1[0]._field34 != 0)
+ || (_arrunkObj1337[1]._arr1[1]._field34 != 0)
+ || (_arrunkObj1337[1]._arr1[2]._field34 != 0)
+ || (_arrunkObj1337[1]._arr1[3]._field34 != 0) ) {
+ subC318B(0, &_arrunkObj1337[0]._arr1[tmpVal], 1);
+ found = true;
+ }
+ }
+
+ if (found)
+ return;
+
+ for (int i = 0; i <= 3; i++) {
+ tmpVal = subC27F9(_arrunkObj1337[0]._arr1[i]._field34);
+ if (tmpVal != -1) {
+ // The variable 'j' is not used in the inner code of the loop. It's suspect.
+ for (int j = 0; j <= 7; j++) {
+ if ((_arrunkObj1337[1]._arr3[0]._field34 == 0) && (subC32B1(1, _arrunkObj1337[0]._arr1[i]._field34))) {
+ subC3456(&_arrunkObj1337[0]._arr1[i], &_arrunkObj1337[1]._arr3[0]);
+ found = true;
+ }
+ }
+
+ if (!found) {
+ // The variable 'j' is not used in the inner code of the loop. It's suspect.
+ for (int j = 0; j <= 7; j++) {
+ if ((_arrunkObj1337[3]._arr3[0]._field34 == 0) && (subC32B1(3, _arrunkObj1337[0]._arr1[i]._field34))) {
+ subC3456(&_arrunkObj1337[0]._arr1[i], &_arrunkObj1337[3]._arr3[0]);
+ found = true;
+ }
+ }
+ }
+
+ if (found)
+ break;
+ }
+ }
+
+ if (found)
+ return;
+
+ for (int i = 0; i <= 3; i++) {
+ tmpVal = subC27B5(_arrunkObj1337[0]._arr1[i]._field34);
+ if (tmpVal != -1) {
+ // The variable 'j' is not used in the inner code of the loop. It's suspect.
+ for (int j = 0; j <= 7; j++) {
+ if ((_arrunkObj1337[1]._arr3[0]._field34 == 0) && (subC32B1(1, _arrunkObj1337[0]._arr1[i]._field34))) {
+ subC3456(&_arrunkObj1337[0]._arr1[i], &_arrunkObj1337[1]._arr3[0]);
+ found = true;
+ }
+ }
+
+ if (!found) {
+ // The variable 'j' is not used in the inner code of the loop. It's suspect.
+ for (int j = 0; j <= 7; j++) {
+ if ((_arrunkObj1337[3]._arr3[0]._field34 == 0) && (subC32B1(3, _arrunkObj1337[0]._arr1[i]._field34))) {
+ subC3456(&_arrunkObj1337[0]._arr1[i], &_arrunkObj1337[3]._arr3[0]);
+ found = true;
+ }
+ }
+ }
+
+ if (found)
+ break;
+ }
+ }
+
+ if (found)
+ return;
+
+ subC2835(0);
+}
+
+void Scene1337::subD026D() {
+ subD02CA();
+}
+
+void Scene1337::subD0281() {
+ if (subC27F9(this->_arrunkObj1337[2]._arr3[0]._field34) == -1)
+ _unkFctPtr412 = &Scene1337::subD026D;
+ else
+ subC4A39(&_arrunkObj1337[2]._arr3[0]);
+}
+
+void Scene1337::subD02CA() {
+ _item6._field36 = g_globals->_events._mousePos;
+
+ if (R2_GLOBALS._v57810 == 200) {
+ int di;
+ for (di = 0; di < 4; di++) {
+ if ((subC2BF8(&_arrunkObj1337[2]._arr1[di], _item6._field36) != 0) && (_arrunkObj1337[2]._arr1[di]._field34 != 0)) {
+ _item6._field34 = _arrunkObj1337[2]._arr1[di]._field34;
+ _item6._field36 = _arrunkObj1337[2]._arr1[di]._field36;
+ // _item6._actorName = _arrunkObj1337[2]._arr1[di]._actorName;
+ _item6._fieldE = _arrunkObj1337[2]._arr1[di]._fieldE;
+ _item6._field10 = _arrunkObj1337[2]._arr1[di]._field10;
+ warning("_item6._field12 = _arrunkObj1337[2]._arr1[di]._field12;");
+ warning("_item6._field14 = _arrunkObj1337[2]._arr1[di]._field14;");
+ warning("_item6._field16 = _arrunkObj1337[2]._arr1[di]._field16;");
+ _item6._sceneRegionId = _arrunkObj1337[2]._arr1[di]._sceneRegionId;
+ _item6._position = _arrunkObj1337[2]._arr1[di]._position;
+ _item6._yDiff = _arrunkObj1337[2]._arr1[di]._yDiff;
+ _item6._bounds = _arrunkObj1337[2]._arr1[di]._bounds;
+ _item6._resNum = _arrunkObj1337[2]._arr1[di]._resNum;
+ _item6._lookLineNum = _arrunkObj1337[2]._arr1[di]._lookLineNum;
+ _item6._talkLineNum = _arrunkObj1337[2]._arr1[di]._talkLineNum;
+ _item6._useLineNum = _arrunkObj1337[2]._arr1[di]._useLineNum;
+ _item6._action = _arrunkObj1337[2]._arr1[di]._action;
+ warning("_item6._field0 = _arrunkObj1337[2]._arr1[di]._field0;");
+ _item6._object1._updateStartFrame = _arrunkObj1337[2]._arr1[di]._object1._updateStartFrame;
+ _item6._object1._walkStartFrame = _arrunkObj1337[2]._arr1[di]._object1._walkStartFrame;
+ // _field2E is named _field3C in R2R
+ _item6._object1._field2E = _arrunkObj1337[2]._arr1[di]._object1._field2E;
+ _item6._object1._percent = _arrunkObj1337[2]._arr1[di]._object1._percent;
+ _item6._object1._priority = _arrunkObj1337[2]._arr1[di]._object1._priority;
+ _item6._object1._angle = _arrunkObj1337[2]._arr1[di]._object1._angle;
+ _item6._object1._flags = _arrunkObj1337[2]._arr1[di]._object1._flags;
+ _item6._object1._xe = _arrunkObj1337[2]._arr1[di]._object1._xe;
+ _item6._object1._xs = _arrunkObj1337[2]._arr1[di]._object1._xs;
+ _item6._object1._paneRects[0] = _arrunkObj1337[2]._arr1[di]._object1._paneRects[0];
+ _item6._object1._paneRects[1] = _arrunkObj1337[2]._arr1[di]._object1._paneRects[1];
+ _item6._object1._visage = _arrunkObj1337[2]._arr1[di]._object1._visage;
+ _item6._object1._objectWrapper = _arrunkObj1337[2]._arr1[di]._object1._objectWrapper;
+ _item6._object1._strip = _arrunkObj1337[2]._arr1[di]._object1._strip;
+ _item6._object1._animateMode = _arrunkObj1337[2]._arr1[di]._object1._animateMode;
+ _item6._object1._frame = _arrunkObj1337[2]._arr1[di]._object1._frame;
+ _item6._object1._endFrame = _arrunkObj1337[2]._arr1[di]._object1._endFrame;
+ // _field68 is named _field76 in R2R
+ _item6._object1._field68 = _arrunkObj1337[2]._arr1[di]._object1._field68;
+ _item6._object1._frameChange = _arrunkObj1337[2]._arr1[di]._object1._frameChange;
+ _item6._object1._numFrames = _arrunkObj1337[2]._arr1[di]._object1._numFrames;
+ _item6._object1._regionIndex = _arrunkObj1337[2]._arr1[di]._object1._regionIndex;
+ _item6._object1._mover = _arrunkObj1337[2]._arr1[di]._object1._mover;
+ _item6._object1._moveDiff = _arrunkObj1337[2]._arr1[di]._object1._moveDiff;
+ _item6._object1._moveRate = _arrunkObj1337[2]._arr1[di]._object1._moveRate;
+ _item6._object1._field8A = _arrunkObj1337[2]._arr1[di]._object1._field8A;
+ _item6._object1._endAction = _arrunkObj1337[2]._arr1[di]._object1._endAction;
+ _item6._object1._regionBitList = _arrunkObj1337[2]._arr1[di]._object1._regionBitList;
+ // _item6._object1._actorName = _arrunkObj1337[2]._arr1[di]._object1._actorName;
+ _item6._object1._fieldE = _arrunkObj1337[2]._arr1[di]._object1._fieldE;
+ _item6._object1._field10 = _arrunkObj1337[2]._arr1[di]._object1._field10;
+ warning("_item6._object1._field12 = _arrunkObj1337[2]._arr1[di]._object1._field12;");
+ warning("_item6._object1._field14 = _arrunkObj1337[2]._arr1[di]._object1._field14;");
+ warning("_item6._object1._field16 = _arrunkObj1337[2]._arr1[di]._object1._field16;");
+ _item6._object1 = _arrunkObj1337[2]._arr1[di]._object1;
+ }
+ }
+
+ if (di == 4) {
+ subCDB90(1, _item6._field36);
+ subD0281();
+ return;
+ }
+ } else if (R2_GLOBALS._v57810 == 300) {
+ subCDB90(3, _item6._field36);
+ subD0281();
+ return;
+ } else {
+ subD1A48(R2_GLOBALS._v57810);
+ subD0281();
+ return;
+ }
+
+ // That continues the block when R2_GLOBALS._v57810 == 200 and di != 4
+ subD18B5(1332, _item6._object1._strip, _item6._object1._frame);
+ R2_GLOBALS._sceneObjects->draw();
+ Event event;
+ bool found = false;
+ bool found_di;
+ for (;;) {
+ if ( ((g_globals->_events.getEvent(event, EVENT_BUTTON_DOWN)) && (event.btnState == BTNSHIFT_RIGHT))
+ || (g_globals->_events.getEvent(event, EVENT_KEYPRESS)) ){
+ _item6._field36 = g_globals->_events._mousePos;
+ found_di = false;
+
+ for (int i = 0; i <= 3; i ++) {
+ if (subC2BF8(&_arrunkObj1337[2]._arr1[i], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
+ if (_arrunkObj1337[2]._arr1[i]._field34 == 0) {
+ _arrunkObj1337[2]._arr1[i]._field34 = _item6._field34;
+ _arrunkObj1337[2]._arr1[i]._object1.postInit();
+ _arrunkObj1337[2]._arr1[i]._object1.hide();
+ _arrunkObj1337[2]._arr1[i]._object1.setVisage(1332);
+ _arrunkObj1337[2]._arr1[i]._object1.setPosition(_arrunkObj1337[2]._arr1[i]._field36, 0);
+ _arrunkObj1337[2]._arr1[i]._object1.fixPriority(170);
+ setAnimationInfo(&_arrunkObj1337[2]._arr1[i]);
+ subD18B5(5, 1, 4);
+ found = true;
+ _field423E--;
+ _field4244 = 0;
+ subC20F9();
+ } else {
+ actionDisplay(1330, 127, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ found_di = true;
+ }
+ break;
+ }
+ }
+
+ if ((!found) && (!found_di)) {
+ if (subC2BF8(&_item7, Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
+ subC4A39(&_item6);
+ } else if (!found) {
+ bool foundVar4;
+ int i;
+ if (_item6._field34 == 1) {
+ foundVar4 = false;
+ for (i = 0; i <= 7; i++) {
+ if (subC2BF8(&_arrunkObj1337[2]._arr2[i], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
+ foundVar4 = true;
+ break;
+ }
+ }
+
+ if ((foundVar4) && (_arrunkObj1337[2]._arr2[i]._field34 == 0)) {
+ if (subC27B5(_arrunkObj1337[2]._arr3[0]._field34) != -1) {
+ actionDisplay(1330, 55, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else {
+ subC340B(&_item6, &_arrunkObj1337[2]._arr2[i]);
+ return;
+ }
+ } else {
+ actionDisplay(1330, 56, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ }
+ } else if (_item6._field34 <= 9) {
+ foundVar4 = false;
+ for (i = 0; i <= 7; i++) {
+ if (subC2BF8(&_arrunkObj1337[2]._arr2[i], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
+ foundVar4 = true;
+ break;
+ }
+ }
+ if ((foundVar4) && (_arrunkObj1337[2]._arr2[i]._field34 == 1)) {
+ foundVar4 = false;
+ int j;
+ for (j = 0; j <= 7; j++) {
+ if (_item6._field34 == _arrunkObj1337[2]._arr2[j]._field34) {
+ foundVar4 = true;
+ break;
+ }
+ }
+ if (foundVar4) {
+ actionDisplay(1330, 34, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else if (subC27B5(_arrunkObj1337[2]._arr3[0]._field34) != -1) {
+ actionDisplay(1330, 35, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else {
+ if (j == 7)
+ _field424A = 2;
+
+ subC33C0(&_item6, &_arrunkObj1337[2]._arr2[i]);
+ return;
+ }
+ } else {
+ actionDisplay(1330, 37, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ }
+ } else {
+ if ((_item6._field34 == 26) || (_item6._field34 == 30) ||(_item6._field34 == 32) || (_item6._field34 == 28)) {
+ if (subC2BF8(&_arrunkObj1337[2]._arr3[0], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
+ actionDisplay(1330, 42, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else if (!subC3386(_arrunkObj1337[2]._arr3[0]._field34, _item6._field34)) {
+ if (_arrunkObj1337[2]._arr3[0]._field34 != 0) {
+ switch (_arrunkObj1337[2]._arr3[0]._field34) {
+ case 11:
+ actionDisplay(1330, 68, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 14:
+ actionDisplay(1330, 80, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 16:
+ actionDisplay(1330, 84, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 24:
+ actionDisplay(1330, 96, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ default:
+ break;
+ }
+ } else {
+ actionDisplay(1330, 41, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ }
+ } else {
+ subC34A1(&_item6, &_arrunkObj1337[2]._arr3[0]);
+ return;
+ }
+ } else {
+ if ((subC27F9(_item6._field34) == -1) && (subC27B5(_item6._field34) == -1)) {
+ if (_item6._field34 == 13) {
+ if (subC2BF8(&_arrunkObj1337[0]._arr4[0], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
+ for (int k = 0; k <= 7; k++) {
+ if (_arrunkObj1337[0]._arr2[k]._field34 != 0) {
+ found = true;
+ subC358E(&_item6, 0);
+ }
+ }
+
+ if (!found)
+ actionDisplay(1330, 74, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else if (subC2BF8(&_arrunkObj1337[3]._arr4[0], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
+ for (int k = 0; k <= 7; k++) {
+ if (_arrunkObj1337[3]._arr2[k]._field34 != 0) {
+ found = true;
+ subC358E(&_item6, 3);
+ }
+ }
+ if (!found)
+ actionDisplay(1330, 74, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else if (subC2BF8(&_arrunkObj1337[1]._arr4[0], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
+ for (int k = 0; k <= 7; k++) {
+ if (_arrunkObj1337[1]._arr2[k]._field34 == 0) {
+ found = true;
+ subC358E(&_item6, 1);
+ }
+ }
+ if (!found)
+ actionDisplay(1330, 74, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else {
+ actionDisplay(1330, 128, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ }
+ } else if (_item6._field34 == 25) {
+ int k;
+ if (subC2BF8(&_arrunkObj1337[0]._arr4[0], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
+ if ( (_arrunkObj1337[0]._arr1[0]._field34 != 0)
+ || (_arrunkObj1337[0]._arr1[1]._field34 != 0)
+ || (_arrunkObj1337[0]._arr1[2]._field34 != 0)
+ || (_arrunkObj1337[0]._arr1[3]._field34 != 0) ) {
+ for (k = 0; k <= 3; k++){
+ if (_arrunkObj1337[2]._arr1[k]._field34 == 0)
+ break;
+ }
+ subC318B(2, &_arrunkObj1337[2]._arr1[k], 0);
+ return;
+ } else {
+ actionDisplay(1330, 99, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ }
+ } else if (subC2BF8(&_arrunkObj1337[1]._arr4[0], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
+ if ( (_arrunkObj1337[1]._arr1[0]._field34 != 0)
+ || (_arrunkObj1337[1]._arr1[1]._field34 != 0)
+ || (_arrunkObj1337[1]._arr1[2]._field34 != 0)
+ || (_arrunkObj1337[1]._arr1[3]._field34 != 0) ) {
+ for (k = 0; k <= 3; k++){
+ if (_arrunkObj1337[2]._arr1[k]._field34 == 0)
+ break;
+ }
+ subC318B(2, &_arrunkObj1337[2]._arr1[k], 1);
+ return;
+ } else {
+ actionDisplay(1330, 99, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ }
+ }
+
+ if (subC2BF8(&_arrunkObj1337[3]._arr4[0], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
+ if ( (_arrunkObj1337[3]._arr1[0]._field34 != 0)
+ || (_arrunkObj1337[3]._arr1[1]._field34 != 0)
+ || (_arrunkObj1337[3]._arr1[2]._field34 != 0)
+ || (_arrunkObj1337[3]._arr1[3]._field34 != 0) ) {
+ for (k = 0; k <= 3; k++){
+ if (_arrunkObj1337[2]._arr1[k]._field34 == 0)
+ break;
+ }
+ subC318B(2, &_arrunkObj1337[2]._arr1[k], 3);
+ return;
+ } else {
+ actionDisplay(1330, 99, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ }
+ } else {
+ actionDisplay(1330, 129, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ }
+ } else if (_item6._field34 == 29) {
+ actionDisplay(1330, 136, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else if (_item6._field34 == 27) {
+ actionDisplay(1330, 137, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ }
+ } else {
+ if (subC2BF8(&_arrunkObj1337[0]._arr3[0], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
+ if (_arrunkObj1337[0]._arr3[0]._field34 != 0) {
+ actionDisplay(1330, 15, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else if (!subC32B1(0, _item6._field34)) {
+ switch (_item6._field34) {
+ case 10:
+ actionDisplay(1330, 66, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 12:
+ actionDisplay(1330, 70, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 15:
+ actionDisplay(1330, 82, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 17:
+ actionDisplay(1330, 86, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 18:
+ actionDisplay(1330, 88, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 19:
+ actionDisplay(1330, 90, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 20:
+ actionDisplay(1330, 92, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 21:
+ actionDisplay(1330, 94, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ default:
+ break;
+ }
+ } else {
+ subC3456(&_item6, &_arrunkObj1337[0]._arr3[0]);
+ found = true;
+ }
+ } else if (subC2BF8(&_arrunkObj1337[3]._arr3[0], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
+ if (_arrunkObj1337[3]._arr3[0]._field34 != 0) {
+ actionDisplay(1330, 17, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else if (!subC32B1(3, _item6._field34)) {
+ switch (_item6._field34) {
+ case 10:
+ actionDisplay(1330, 66, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 12:
+ actionDisplay(1330, 70, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 15:
+ actionDisplay(1330, 82, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 17:
+ actionDisplay(1330, 86, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 18:
+ actionDisplay(1330, 88, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 19:
+ actionDisplay(1330, 90, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 20:
+ actionDisplay(1330, 92, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 21:
+ actionDisplay(1330, 94, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ default:
+ break;
+ }
+ } else {
+ subC3456(&_item6, &_arrunkObj1337[3]._arr3[0]);
+ found = true;
+ }
+ } else if (subC2BF8(&_arrunkObj1337[1]._arr3[0], Common::Point(_item6._field36.x + 12, _item6._field36.y + 12)) != 0) {
+ if (_arrunkObj1337[1]._arr3[0]._field34 != 0) {
+ actionDisplay(1330, 19, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ } else if (!subC32B1(1, _item6._field34)) {
+ switch (_item6._field34) {
+ case 10:
+ actionDisplay(1330, 66, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 12:
+ actionDisplay(1330, 70, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 15:
+ actionDisplay(1330, 82, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 17:
+ actionDisplay(1330, 86, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 18:
+ actionDisplay(1330, 88, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 19:
+ actionDisplay(1330, 90, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 20:
+ actionDisplay(1330, 92, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ case 21:
+ actionDisplay(1330, 94, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ break;
+ default:
+ break;
+ }
+ } else {
+ subC3456(&_item6, &_arrunkObj1337[1]._arr3[0]);
+ found = true;
+ }
+ } else {
+ actionDisplay(1330, 38, 159, 10, 1, 200, 0, 7, 0, 154, 154);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (found)
+ return;
+ } else {
+ g_globals->_scenePalette.signalListeners();
+ R2_GLOBALS._sceneObjects->draw();
+ g_globals->_events.delay(g_globals->_sceneHandler->_delayTicks);
+ }
+ }
+}
+
+void Scene1337::subD183F(int arg1, int arg2) {
+ if ((R2_GLOBALS._v57709 != 0) || (R2_GLOBALS._v5780C != 0))
+ return;
+
+ R2_GLOBALS._v5780E = arg1 + arg2;
+
+ if (arg2 != 0) {
+ if (R2_GLOBALS._v5780E < 1)
+ R2_GLOBALS._v5780E = 2;
+
+ if (R2_GLOBALS._v5780E > 2)
+ R2_GLOBALS._v5780E = 1;
+ }
+
+ if (R2_GLOBALS._v5780E == 1) {
+ R2_GLOBALS._v57810 = 200;
+ subD195F(1, 4);
+ } else if (R2_GLOBALS._v5780E == 2) {
+ R2_GLOBALS._v57810 = 300;
+ subD195F(1, 5);
+ } else {
+ R2_GLOBALS._v57810 = 0;
+ subD195F(0, 0);
+ }
+}
+
+void Scene1337::subD18B5(int resNum, int rlbNum, int arg3) {
+ warning("STUBBED lvl3 Scene1337::subD18B5()");
+}
+
+int Scene1337::subD18F5() {
+ if (R2_GLOBALS._v57709 == 0)
+ // The cursor looks... very dummy
+ // To be checked
+ warning("TODO: CursorManager.setData(R2_GLOBALS.off_57705)");
+
+ ++R2_GLOBALS._v57709;
+
+ return R2_GLOBALS._v57709;
+}
+
+int Scene1337::subD1917() {
+ if (R2_GLOBALS._v57709 != 0) {
+ R2_GLOBALS._v57709--;
+ if (R2_GLOBALS._v57709 != 0)
+ warning("FIXME: subD195F(_width, _data);");
+ }
+
+ return R2_GLOBALS._v57709;
+}
+
+int Scene1337::subD1940(bool flag) {
+ if (flag)
+ ++R2_GLOBALS._v5780C;
+ else if (R2_GLOBALS._v5780C != 0)
+ --R2_GLOBALS._v5780C;
+
+ return R2_GLOBALS._v5780C;
+}
+
+void Scene1337::subD195F(int arg1, int arg2) {
+ subD18B5(5, arg1, arg2);
+}
+
+void Scene1337::subD1975(int arg1, int arg2) {
+ warning("STUBBED lvl2 Scene1337::subD1975()");
+}
+
+void Scene1337::subD1A48(int arg1) {
+ int tmpVal = -1;
+
+ switch (arg1) {
+ case 200:
+ tmpVal = 141;
+ break;
+ case 300:
+ tmpVal = 142;
+ break;
+ default:
+ MessageDialog::show(WRONG_ANSWER_MSG, OK_BTN_STRING);
+ break;
+ }
+
+ if (tmpVal == -1)
+ return;
+
+ actionDisplay(1330, tmpVal, -1, -1, 1, 220, 1, 5, 0, 105, 0);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 1500 - Cutscene: Ship landing
+ *
+ *--------------------------------------------------------------------------*/
+void Scene1500::postInit(SceneObjectList *OwnerList) {
+ loadScene(1500);
+ R2_GLOBALS._uiElements._active = false;
+ R2_GLOBALS._v5589E.top = 0;
+ R2_GLOBALS._v5589E.bottom = 200;
+ setZoomPercents(170, 13, 240, 100);
+ SceneExt::postInit();
+ scalePalette(65, 65, 65);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.hide();
+ R2_GLOBALS._player.disableControl();
+
+ _actor2.postInit();
+ _actor2.setup(1401, 1, 1);
+ _actor2._effect = 5;
+ _actor2.fixPriority(10);
+ _actor2._field9C = _field312;
+
+ _actor1.postInit();
+ _actor1.setup(1400, 1, 1);
+ _actor1._moveDiff = Common::Point(1, 1);
+ _actor1._linkedActor = &_actor2;
+
+ if (R2_GLOBALS._sceneManager._previousScene != 1010) {
+ _actor4.postInit();
+ _actor4.setup(1401, 2, 1);
+ _actor4._effect = 5;
+ _actor4.fixPriority(10);
+ _actor4._field9C = _field312;
+
+ _actor3.postInit();
+ _actor3._moveRate = 30;
+ _actor3._moveDiff = Common::Point(1, 1);
+ _actor3._linkedActor = &_actor4;
+ }
+
+ if (R2_GLOBALS._sceneManager._previousScene == 300) {
+ _actor1.setPosition(Common::Point(189, 139), 5);
+
+ _actor3.setup(1400, 1, 2);
+ _actor3.setPosition(Common::Point(148, 108), 0);
+
+ _sceneMode = 20;
+ R2_GLOBALS._sound1.play(110);
+ } else if (R2_GLOBALS._sceneManager._previousScene == 1550) {
+ _actor1.setPosition(Common::Point(189, 139), 5);
+
+ _actor3.setup(1400, 2, 1);
+ _actor3.changeZoom(-1);
+ _actor3.setPosition(Common::Point(298, 258), 5);
+
+ _sceneMode = 10;
+ R2_GLOBALS._sound1.play(106);
+ } else {
+ _actor1.setPosition(Common::Point(289, 239), -30);
+ _sceneMode = 0;
+ R2_GLOBALS._sound1.play(102);
+ }
+ signal();
+}
+
+void Scene1500::remove() {
+ R2_GLOBALS._v5589E.top = 3;
+ R2_GLOBALS._v5589E.bottom = 168;
+ R2_GLOBALS._uiElements._active = true;
+
+ SceneExt::remove();
+}
+
+void Scene1500::signal() {
+ switch(_sceneMode++) {
+ case 0:
+ R2_GLOBALS.setFlag(25);
+ setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+ // No break on purpose
+ case 1:
+ if (_actor1._yDiff < 50) {
+ _actor1.setPosition(Common::Point(289, 239), _actor1._yDiff + 1);
+ _sceneMode = 1;
+ }
+ setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+ break;
+ case 2: {
+ Common::Point pt(189, 139);
+ NpcMover *mover = new NpcMover();
+ _actor1.addMover(mover, &pt, this);
+ }
+ break;
+ case 3:
+ if (_actor1._yDiff > 5) {
+ _actor1.setPosition(Common::Point(189, 139), _actor1._yDiff - 1);
+ _sceneMode = 3;
+ }
+ setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+ break;
+ case 13:
+ R2_GLOBALS._player._characterIndex = R2_MIRANDA;
+ // No break on purpose
+ case 4:
+ R2_GLOBALS._sceneManager.changeScene(300);
+ break;
+ case 10:
+ // No break on purpose
+ case 20:
+ setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+ break;
+ case 11: {
+ Common::Point pt(148, 108);
+ NpcMover *mover = new NpcMover();
+ _actor3.addMover(mover, &pt, this);
+ }
+ break;
+ case 12:
+ setAction(&_sequenceManager, this, 2, &R2_GLOBALS._player, NULL);
+ break;
+ case 21: {
+ Common::Point pt(-2, -42);
+ NpcMover *mover = new NpcMover();
+ _actor3.addMover(mover, &pt, NULL);
+ signal();
+ }
+ break;
+ case 22:
+ if (_actor1._yDiff < 50) {
+ _actor1.setPosition(Common::Point(189, 139), _actor1._yDiff + 1);
+ _sceneMode = 22;
+ }
+ setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+ break;
+ case 23: {
+ Common::Point pt(-13, -61);
+ NpcMover *mover = new NpcMover();
+ _actor1.addMover(mover, &pt, this);
+ }
+ break;
+ case 24:
+ R2_GLOBALS._sceneManager.changeScene(300);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene1500::dispatch() {
+ if (_sceneMode > 10) {
+ float yDiff = sqrt((float) (_actor3._position.x * _actor3._position.x) + (_actor3._position.y * _actor3._position.y));
+ if (yDiff > 6)
+ _actor3.setPosition(_actor3._position, (int) yDiff);
+ }
+
+ Scene::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 1525 - Cutscene - Ship
+ *
+ *--------------------------------------------------------------------------*/
+void Scene1525::postInit(SceneObjectList *OwnerList) {
+ loadScene(1525);
+ R2_GLOBALS._uiElements._active = false;
+ SceneExt::postInit();
+
+ R2_GLOBALS._player.postInit();
+ if (R2_GLOBALS._sceneManager._previousScene == 525)
+ R2_GLOBALS._player.setup(1525, 1, 1);
+ else
+ R2_GLOBALS._player.setup(1525, 1, 16);
+ R2_GLOBALS._player.setPosition(Common::Point(244, 148));
+ R2_GLOBALS._player.disableControl();
+
+ _sceneMode = 0;
+ setAction(&_sequenceManager, this, 2, &R2_GLOBALS._player, NULL);
+}
+
+void Scene1525::signal() {
+ switch (_sceneMode++) {
+ case 0:
+ if (R2_GLOBALS._sceneManager._previousScene == 525)
+ setAction(&_sequenceManager, this, 1525, &R2_GLOBALS._player, NULL);
+ else
+ setAction(&_sequenceManager, this, 1526, &R2_GLOBALS._player, NULL);
+ break;
+ case 1:
+ setAction(&_sequenceManager, this, 2, &R2_GLOBALS._player, NULL);
+ break;
+ case 2:
+ if (R2_GLOBALS._sceneManager._previousScene == 1530)
+ R2_GLOBALS._sceneManager.changeScene(1550);
+ else
+ R2_GLOBALS._sceneManager.changeScene(1530);
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 1530 - Cutscene - Elevator
+ *
+ *--------------------------------------------------------------------------*/
+void Scene1530::postInit(SceneObjectList *OwnerList) {
+ if (R2_GLOBALS._sceneManager._previousScene == 1000)
+ loadScene(1650);
+ else if (R2_GLOBALS._sceneManager._previousScene == 1580)
+ loadScene(1550);
+ else
+ loadScene(1530);
+
+ R2_GLOBALS._uiElements._active = false;
+ SceneExt::postInit();
+
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_seekerSpeaker);
+
+ if (R2_GLOBALS._sceneManager._previousScene == 1000) {
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.hide();
+ R2_GLOBALS._player.disableControl();
+
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(538, this);
+ R2_GLOBALS._sound1.play(114);
+
+ _sceneMode = 3;
+ } else if (R2_GLOBALS._sceneManager._previousScene == 1580) {
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player._characterIndex = R2_QUINN;
+ R2_GLOBALS._player.setObjectWrapper(NULL);
+ R2_GLOBALS._player.setup(1516, 6, 1);
+ R2_GLOBALS._player.setPosition(Common::Point(160, 125));
+ R2_GLOBALS._player._moveRate = 30;
+ R2_GLOBALS._player._moveDiff = Common::Point(4, 1);
+
+ _actor2.postInit();
+ _actor2.setup(1516, 7, 1);
+ _actor2.setPosition(Common::Point(121, 41));
+ _actor2.animate(ANIM_MODE_2, NULL);
+
+ _actor3.postInit();
+ _actor3.setup(1516, 8, 1);
+ _actor3.setPosition(Common::Point(107, 116));
+ _actor3.animate(ANIM_MODE_2, NULL);
+
+ R2_GLOBALS._player.disableControl();
+ Common::Point pt(480, 75);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ R2_GLOBALS._sound1.play(111);
+
+ _sceneMode = 1;
+ } else {
+ _actor1.postInit();
+ _actor1._effect = 1;
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.disableControl();
+
+ setAction(&_sequenceManager, this, 1530, &R2_GLOBALS._player, &_actor1, NULL);
+
+ _sceneMode = 2;
+ }
+
+}
+
+void Scene1530::signal() {
+ switch (_sceneMode - 1) {
+ case 0:
+ R2_GLOBALS._sceneManager.changeScene(1000);
+ break;
+ case 1:
+ R2_GLOBALS._sceneManager.changeScene(1525);
+ break;
+ case 2:
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 4;
+ R2_GLOBALS._player.show();
+ setAction(&_sequenceManager, this, 1650, &R2_GLOBALS._player, NULL);
+ break;
+ case 3:
+ R2_GLOBALS._sceneManager.changeScene(1700);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene1530::dispatch() {
+ int16 x = R2_GLOBALS._player._position.x;
+ int16 y = R2_GLOBALS._player._position.y;
+
+ _actor2.setPosition(Common::Point(x - 39, y - 85));
+ _actor3.setPosition(Common::Point(x - 53, y - 9));
+
+ Scene::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 1550 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene1550::UnkObj15501::UnkObj15501() {
+ _fieldA4 = _fieldA6 = 0;
+}
+
+void Scene1550::UnkObj15501::synchronize(Serializer &s) {
+ SceneActor::synchronize(s);
+
+ s.syncAsSint16LE(_fieldA4);
+ s.syncAsSint16LE(_fieldA6);
+}
+
+bool Scene1550::UnkObj15501::startAction(CursorType action, Event &event) {
+ Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (_visage == 1561) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 40;
+ Common::Point pt(_position.x + 5, _position.y + 20);
+ PlayerMover *mover = new PlayerMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ return true;
+ }
+ return SceneActor::startAction(action, event);
+ break;
+ case CURSOR_LOOK:
+ if (_visage == 1561) {
+ switch (_frame) {
+ case 2:
+ SceneItem::display(1550, 23, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ break;
+ case 3:
+ SceneItem::display(1550, 26, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ break;
+ case 4:
+ SceneItem::display(1550, 35, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ break;
+ default:
+ break;
+ }
+ } else {
+ switch ((((_strip - 1) * 5) + _frame) % 3) {
+ case 0:
+ SceneItem::display(1550, 62, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ break;
+ case 1:
+ SceneItem::display(1550, 53, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ break;
+ case 2:
+ SceneItem::display(1550, 76, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ break;
+ default:
+ break;
+ }
+ }
+ return true;
+ break;
+ default:
+ return SceneActor::startAction(action, event);
+ break;
+ }
+}
+
+Scene1550::UnkObj15502::UnkObj15502() {
+ _fieldA4 = 0;
+}
+
+void Scene1550::UnkObj15502::synchronize(Serializer &s) {
+ SceneActor::synchronize(s);
+
+ s.syncAsSint16LE(_fieldA4);
+}
+
+bool Scene1550::UnkObj15502::startAction(CursorType action, Event &event) {
+ Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (_fieldA4 == 8) {
+ scene->_field412 = 1;
+ R2_GLOBALS._player.disableControl();
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->_sceneMode = 1576;
+ else
+ scene->_sceneMode = 1584;
+ // strcpy(scene->_arrUnkObj15502[7]._actorName, 'hatch');
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_arrUnkObj15502[7], NULL);
+ return true;
+ }
+ return SceneActor::startAction(action, event);
+ break;
+ case CURSOR_LOOK:
+ if (_fieldA4 == 8)
+ SceneItem::display(1550, 75, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ else if (_frame == 1)
+ SceneItem::display(1550, 70, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ else
+ SceneItem::display(1550, 71, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ return true;
+ break;
+ case R2_FUEL_CELL:
+ scene->_field412 = 1;
+ if (_fieldA4 == 6) {
+ R2_GLOBALS._player.disableControl();
+ scene->_actor1.postInit();
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->_sceneMode = 1574;
+ else
+ scene->_sceneMode = 1582;
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_arrUnkObj15502[5], &scene->_actor1, NULL);
+ return true;
+ }
+ return SceneActor::startAction(action, event);
+ break;
+ case R2_GYROSCOPE:
+ scene->_field412 = 1;
+ if (_fieldA4 == 3) {
+ R2_GLOBALS._player.disableControl();
+ scene->_actor1.postInit();
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->_sceneMode = 1571;
+ else
+ scene->_sceneMode = 1581;
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_arrUnkObj15502[2], &scene->_actor1, NULL);
+ return true;
+ }
+ return SceneActor::startAction(action, event);
+ break;
+ case R2_GUIDANCE_MODULE:
+ scene->_field412 = 1;
+ if (_fieldA4 == 1) {
+ R2_GLOBALS._player.disableControl();
+ scene->_actor1.postInit();
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->_sceneMode = 1569;
+ else
+ scene->_sceneMode = 1579;
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_arrUnkObj15502[0], &scene->_actor1, NULL);
+ return true;
+ }
+ return SceneActor::startAction(action, event);
+ break;
+ case R2_THRUSTER_VALVE:
+ scene->_field412 = 1;
+ if (_fieldA4 == 4) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1572;
+ scene->_actor1.postInit();
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_arrUnkObj15502[3], &scene->_actor1, NULL);
+ return true;
+ }
+ return SceneActor::startAction(action, event);
+ break;
+ case R2_RADAR_MECHANISM:
+ scene->_field412 = 1;
+ if (_fieldA4 == 2) {
+ R2_GLOBALS._player.disableControl();
+ scene->_actor1.postInit();
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->_sceneMode = 1570;
+ else
+ scene->_sceneMode = 1580;
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_arrUnkObj15502[1], &scene->_actor1, NULL);
+ return true;
+ }
+ return SceneActor::startAction(action, event);
+ break;
+ case R2_IGNITOR:
+ scene->_field412 = 1;
+ if (_fieldA4 == 5) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1573;
+ scene->_actor1.postInit();
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_arrUnkObj15502[4], &scene->_actor1, NULL);
+ return true;
+ }
+ return SceneActor::startAction(action, event);
+ break;
+ case R2_BATTERY:
+ scene->_field412 = 1;
+ if (_fieldA4 == 7) {
+ R2_GLOBALS._player.disableControl();
+ scene->_actor1.postInit();
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->_sceneMode = 1575;
+ else
+ scene->_sceneMode = 1583;
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_arrUnkObj15502[6], &scene->_actor1, NULL);
+ return true;
+ }
+ return SceneActor::startAction(action, event);
+ break;
+ default:
+ return SceneActor::startAction(action, event);
+ break;
+ }
+}
+
+void Scene1550::UnkObj15502::subA5CDF(int strip) {
+ _fieldA4 = strip;
+ postInit();
+ setup(1517, _fieldA4, 1);
+ switch (_fieldA4 - 1) {
+ case 0:
+ if (R2_INVENTORY.getObjectScene(R2_GUIDANCE_MODULE) == 0)
+ setFrame(5);
+ setPosition(Common::Point(287, 85));
+ break;
+ case 1:
+ if (R2_INVENTORY.getObjectScene(R2_RADAR_MECHANISM) == 0)
+ setFrame(5);
+ setPosition(Common::Point(248, 100));
+ break;
+ case 2:
+ if (R2_INVENTORY.getObjectScene(R2_DIAGNOSTICS_DISPLAY) == 0)
+ setFrame(5);
+ setPosition(Common::Point(217, 85));
+ break;
+ case 3:
+ if (R2_INVENTORY.getObjectScene(R2_THRUSTER_VALVE))
+ setFrame(5);
+ setPosition(Common::Point(161, 121));
+ break;
+ case 4:
+ if (R2_INVENTORY.getObjectScene(R2_IGNITOR))
+ setFrame(5);
+ setPosition(Common::Point(117, 121));
+ break;
+ case 5:
+ if (R2_INVENTORY.getObjectScene(R2_FUEL_CELL))
+ setFrame(5);
+ setPosition(Common::Point(111, 85));
+ break;
+ case 6:
+ if (R2_INVENTORY.getObjectScene(R2_BATTERY))
+ setFrame(5);
+ setPosition(Common::Point(95, 84));
+ break;
+ case 7: {
+ setup(1516, 1, 1);
+ setPosition(Common::Point(201, 45));
+ Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+ if ((scene->_sceneMode == 1577) || (scene->_sceneMode == 1578))
+ hide();
+ fixPriority(92);
+ setDetails(1550, 70, -1, -1, 2, (SceneItem *) NULL);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+Scene1550::UnkObj15503::UnkObj15503() {
+ _fieldA4 = 0;
+}
+
+void Scene1550::UnkObj15503::synchronize(Serializer &s) {
+ SceneActor::synchronize(s);
+
+ s.syncAsSint16LE(_fieldA4);
+}
+
+bool Scene1550::UnkObj15503::startAction(CursorType action, Event &event) {
+ Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+ switch (_fieldA4) {
+ case 1:
+ if (scene->_actor13._frame == 5) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 25;
+ if (scene->_actor4._frame == 1) {
+ scene->setAction(&scene->_sequenceManager1, scene, 1560, &scene->_actor4, NULL);
+ R2_GLOBALS.setFlag(20);
+ setFrame(2);
+ } else {
+ scene->setAction(&scene->_sequenceManager1, scene, 1561, &scene->_actor4, NULL);
+ R2_GLOBALS.clearFlag(20);
+ setFrame(1);
+ }
+ scene->_unkArea1.remove();
+ }
+ break;
+ case 2:
+ R2_GLOBALS._player.disableControl();
+ if (scene->_actor13._frame == 1) {
+ scene->_sceneMode = 23;
+ scene->setAction(&scene->_sequenceManager1, scene, 1560, this, NULL);
+ } else {
+ if (scene->_actor4._frame == 1)
+ scene->_sceneMode = 24;
+ else
+ scene->_sceneMode = 22;
+ scene->setAction(&scene->_sequenceManager1, scene, 1561, this, NULL);
+ }
+ break;
+ default:
+ break;
+ }
+ return true;
+}
+
+void Scene1550::UnkArea1550::remove() {
+ Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+
+ _unkObj155031.remove();
+ _unkObj155032.remove();
+ // sub201EA is a common part with UnkArea1200
+ R2_GLOBALS._sceneItems.remove((SceneItem *)this);
+ _areaActor.remove();
+ SceneArea::remove();
+ R2_GLOBALS._insetUp--;
+ //
+ if ((scene->_sceneMode >= 20) && (scene->_sceneMode <= 29))
+ return;
+
+ R2_GLOBALS._player.disableControl();
+ if (scene->_actor4._frame == 1) {
+ scene->_sceneMode = 1559;
+ scene->setAction(&scene->_sequenceManager1, scene, 1559, &R2_GLOBALS._player, NULL);
+ } else {
+ scene->_sceneMode = 1562;
+ scene->setAction(&scene->_sequenceManager1, scene, 1562, &R2_GLOBALS._player, NULL);
+ }
+}
+
+void Scene1550::UnkArea1550::process(Event &event) {
+// This is a copy of Scene1200::Area1::process
+ if (_field20 != R2_GLOBALS._insetUp)
+ return;
+
+ CursorType cursor = R2_GLOBALS._events.getCursor();
+
+ if (_areaActor._bounds.contains(event.mousePos.x + g_globals->gfxManager()._bounds.left , event.mousePos.y)) {
+ if (cursor == _cursorNum)
+ warning("TODO: _cursorState = ???");
+ R2_GLOBALS._events.setCursor(_savedCursorNum); //, _cursorState);
+ } else if (event.mousePos.y < 168) {
+ if (cursor != _cursorNum) {
+ _savedCursorNum = cursor;
+ warning("TODO: _cursorState = ???");
+ R2_GLOBALS._events.setCursor(CURSOR_INVALID);
+ }
+ if (event.eventType == EVENT_BUTTON_DOWN) {
+ event.handled = true;
+ warning("TODO: _cursorState = ???");
+ R2_GLOBALS._events.setCursor(_savedCursorNum); //, _cursorState);
+ remove();
+ }
+ }
+}
+
+void Scene1550::UnkArea1550::proc12(int visage, int stripFrameNum, int frameNum, int posX, int posY) {
+ // UnkArea1200::proc12();
+ Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+
+ _areaActor.postInit();
+ _areaActor.setup(visage, stripFrameNum, frameNum);
+ _areaActor.setPosition(Common::Point(posX, posY));
+ _areaActor.fixPriority(250);
+ _cursorNum = CURSOR_INVALID;
+ scene->_sceneAreas.push_front(this);
+ ++R2_GLOBALS._insetUp;
+ _field20 = R2_GLOBALS._insetUp;
+ //
+
+ proc13(1550, 67, -1, -1);
+ _unkObj155031.postInit();
+ _unkObj155031._fieldA4 = 1;
+ if (scene->_actor4._frame == 1)
+ _unkObj155031.setup(1559, 3, 1);
+ else
+ _unkObj155031.setup(1559, 3, 2);
+ _unkObj155031.setPosition(Common::Point(142, 79));
+ _unkObj155031.fixPriority(251);
+ _unkObj155031.setDetails(1550, 68, -1, -1, 2, (SceneItem *) NULL);
+
+ _unkObj155032.postInit();
+ _unkObj155032._numFrames = 5;
+ _unkObj155032._fieldA4 = 2;
+ if (scene->_actor13._frame == 1)
+ _unkObj155032.setup(1559, 2, 1);
+ else
+ _unkObj155032.setup(1559, 2, 2);
+ _unkObj155032.setPosition(Common::Point(156, 103));
+ _unkObj155032.fixPriority(251);
+ _unkObj155032.setDetails(1550, 69, -1, -1, 2, (SceneItem *) NULL);
+}
+
+void Scene1550::UnkArea1550::proc13(int resNum, int lookLineNum, int talkLineNum, int useLineNum) {
+ // Copy of Scene1200::Area1::proc13
+ _areaActor.setDetails(resNum, lookLineNum, talkLineNum, useLineNum, 2, (SceneItem *) NULL);
+}
+
+bool Scene1550::Hotspot1::startAction(CursorType action, Event &event) {
+ return SceneHotspot::startAction(action, event);
+}
+
+bool Scene1550::Hotspot3::startAction(CursorType action, Event &event) {
+ // Arrays related to this scene are all hacky in the origina: they are based on the impossibility to use Miranda
+ assert ((R2_GLOBALS._player._characterIndex == 1) || (R2_GLOBALS._player._characterIndex == 2));
+ // The original contains a debug message when CURSOR_TALK is used.
+ // This part is totally useless, we could remove it (and the entire function as well)
+ if (action == CURSOR_TALK)
+ warning("Location: %d/%d - %d", R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex], R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex + 2], k5A4D6[(R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex + 2] * 30)] + R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex]);
+
+ return SceneHotspot::startAction(action, event);
+}
+
+bool Scene1550::Actor6::startAction(CursorType action, Event &event) {
+ return SceneActor::startAction(action, event);
+}
+
+bool Scene1550::Actor7::startAction(CursorType action, Event &event) {
+ if (action != CURSOR_TALK)
+ return SceneActor::startAction(action, event);
+
+ Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+ scene->_sceneMode = 80;
+ scene->signal();
+
+ return true;
+}
+
+bool Scene1550::Actor8::startAction(CursorType action, Event &event) {
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ R2_GLOBALS._player.disableControl();
+ Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+ scene->_field412 = 1;
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->_sceneMode = 1552;
+ else
+ scene->_sceneMode = 1588;
+
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_actor8, NULL);
+ return true;
+}
+
+bool Scene1550::Actor9::startAction(CursorType action, Event &event) {
+ Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ scene->_sceneMode = 50;
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->_stripManager.start(518, scene);
+ else
+ scene->_stripManager.start(520, scene);
+ return true;
+ break;
+ case CURSOR_LOOK:
+ SceneItem::display(1550, 41, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ return true;
+ break;
+ default:
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene1550::Actor10::startAction(CursorType action, Event &event) {
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+ R2_GLOBALS._player.disableControl();
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->_sceneMode = 1555;
+ else
+ scene->_sceneMode = 1589;
+
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_actor10, NULL);
+ return true;
+}
+
+bool Scene1550::Actor11::startAction(CursorType action, Event &event) {
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+ R2_GLOBALS._player.disableControl();
+ scene->_field412 = 1;
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->_sceneMode = 1586;
+ else
+ scene->_sceneMode = 1587;
+
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_actor11, NULL);
+ return true;
+}
+
+bool Scene1550::Actor12::startAction(CursorType action, Event &event) {
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+
+ if (R2_GLOBALS._player._characterIndex == 2) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1585;
+ scene->setAction(&scene->_sequenceManager1, scene, 1585, &R2_GLOBALS._player, NULL);
+ } else {
+ R2_GLOBALS._player.disableControl();
+ switch(scene->_field415) {
+ case 0:
+ scene->_actor13.fixPriority(168);
+ scene->_actor4.fixPriority(125);
+ scene->_sceneMode = 1558;
+ scene->setAction(&scene->_sequenceManager1, scene, 1558, &R2_GLOBALS._player, NULL);
+ break;
+ case 1:
+ return SceneActor::startAction(action, event);
+ break;
+ case 2:
+ scene->_field415 = 1;
+ scene->_sceneMode = 1563;
+ scene->setAction(&scene->_sequenceManager1, scene, 1563, &R2_GLOBALS._player, &scene->_actor4, NULL);
+ break;
+ default:
+ break;
+ }
+ }
+ return true;
+
+}
+
+bool Scene1550::Actor13::startAction(CursorType action, Event &event) {
+ Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (scene->_field415 != 2)
+ return SceneActor::startAction(action, event);
+
+ if (R2_INVENTORY.getObjectScene(R2_BATTERY) == 1550) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1564;
+ scene->setAction(&scene->_sequenceManager1, scene, 1564, &R2_GLOBALS._player, NULL);
+ } else
+ SceneItem::display(1550, 64, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ return true;
+ break;
+ case CURSOR_LOOK:
+ if (scene->_field415 != 2)
+ return SceneActor::startAction(action, event);
+
+ if (R2_INVENTORY.getObjectScene(R2_BATTERY) == 1550) {
+ SceneItem::display(1550, 74, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ } else
+ SceneItem::display(1550, 64, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ return true;
+ break;
+ default:
+ return SceneActor::startAction(action, event);
+ break;
+ }
+}
+
+Scene1550::Scene1550() {
+ _field412 = 0;
+ _field414 = 0;
+ _field415 = 0;
+ _field417 = 0;
+ _field419 = 0;
+}
+
+void Scene1550::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field412);
+ s.syncAsByte(_field414);
+ s.syncAsSint16LE(_field415);
+ s.syncAsSint16LE(_field417);
+ s.syncAsSint16LE(_field419);
+}
+
+void Scene1550::postInit(SceneObjectList *OwnerList) {
+ if ((R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex] == 9) && (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex + 2] == 11))
+ loadScene(1234);
+ else
+ loadScene(1550);
+
+ scalePalette(65, 65, 65);
+ setZoomPercents(30, 75, 170, 100);
+ _field417 = 1550;
+ _field419 = 0;
+ SceneExt::postInit();
+
+ if (R2_GLOBALS._sceneManager._previousScene == -1)
+ R2_GLOBALS.setFlag(R2_ATTRACTOR_CABLE_HARNESS);
+
+ if ((R2_GLOBALS._player._characterScene[1] != 1550) && (R2_GLOBALS._player._characterScene[1] != 1580)) {
+ R2_GLOBALS._player._characterScene[1] = 1550;
+ R2_GLOBALS._player._characterScene[2] = 1550;
+ }
+
+ _stripManager.setColors(60, 255);
+ _stripManager.setFontNumber(3);
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_seekerSpeaker);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player._effect = 6;
+
+ if (R2_GLOBALS._player._characterIndex == 1)
+ R2_GLOBALS._player.setup(1500, 3, 1);
+ else
+ R2_GLOBALS._player.setup(1505, 3, 1);
+
+ R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
+
+ if ((R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex] == 9) && (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex + 2] == 11))
+ R2_GLOBALS._player.setPosition(Common::Point(157, 135));
+ else
+ R2_GLOBALS._player.setPosition(Common::Point(160, 100));
+
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.disableControl();
+
+ _field414 = 0;
+ _actor7.changeZoom(-1);
+ R2_GLOBALS._player.changeZoom(-1);
+
+ switch (R2_GLOBALS._sceneManager._previousScene) {
+ case 1530:
+ R2_GLOBALS._v565AE = 0;
+ // No break on purpose
+ case 300:
+ // No break on purpose
+ case 1500:
+ // No break on purpose
+ case 3150:
+ R2_GLOBALS._sound1.play(105);
+ break;
+ case 1580:
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1580) {
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL);
+
+ _field412 = 1;
+
+ _actor1.postInit();
+ _arrUnkObj15502[7].subA5CDF(8);
+ _arrUnkObj15502[7].hide();
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _sceneMode = 1577;
+ else
+ _sceneMode = 1578;
+
+ setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_actor1, &_arrUnkObj15502[7], NULL);
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 1550;
+ } else {
+ R2_GLOBALS._player.enableControl();
+ }
+ break;
+ default:
+ break;
+ }
+
+ subA2B2F();
+
+ _item1.setDetails(16, 1550, 10, -1, -1);
+ _item2.setDetails(24, 1550, 10, -1, -1);
+ _item3.setDetails(Rect(0, 0, 320, 200), 1550, 0, 1, -1, 1, NULL);
+
+ if ((R2_GLOBALS._sceneManager._previousScene == 1500) && (R2_GLOBALS.getFlag(16))) {
+ _sceneMode = 70;
+ if (!R2_GLOBALS._sceneObjects->contains(&_actor7))
+ _actor7.postInit();
+
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _actor7.setVisage(1505);
+ else
+ _actor7.setVisage(1500);
+
+ _actor7.changeZoom(77);
+ _actor7.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL);
+
+ assert(_field419 >= 1550);
+ R2_GLOBALS._walkRegions.enableRegion(k5A750[_field419 - 1550]);
+
+ setAction(&_sequenceManager1, this, 1590, &_actor7, NULL);
+ } else if ((_sceneMode != 1577) && (_sceneMode != 1578))
+ R2_GLOBALS._player.enableControl();
+}
+
+void Scene1550::signal() {
+ switch (_sceneMode) {
+ case 1:
+ // No break on purpose
+ case 3:
+ // No break on purpose
+ case 5:
+ // No break on purpose
+ case 7:
+ _field412 = 0;
+ R2_GLOBALS._v56AAB = 0;
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ break;
+ case 20:
+ // No break on purpose
+ case 21:
+ // No break on purpose
+ case 25:
+ // No break on purpose
+ case 1563:
+ R2_GLOBALS.clearFlag(20);
+ _unkArea1.proc12(1559, 1, 1, 160, 125);
+ R2_GLOBALS._player.enableControl();
+ _sceneMode = 0;
+ break;
+ case 22:
+ _unkArea1.remove();
+ _sceneMode = 24;
+ setAction(&_sequenceManager1, this, 1561, &_actor4, NULL);
+ R2_GLOBALS.clearFlag(20);
+ break;
+ case 23:
+ _unkArea1.remove();
+ _sceneMode = 20;
+ setAction(&_sequenceManager1, this, 1566, &_actor13, &_actor5, NULL);
+ R2_GLOBALS.setFlag(21);
+ break;
+ case 24:
+ _unkArea1.remove();
+ _sceneMode = 21;
+ setAction(&_sequenceManager1, this, 1567, &_actor13, &_actor5, NULL);
+ R2_GLOBALS.clearFlag(19);
+ break;
+ case 30:
+ // No break on purpose
+ case 1556:
+ // No break on purpose
+ case 1557:
+ // Nothing on purpose
+ break;
+ case 40: {
+ _sceneMode = 41;
+ Common::Point pt(_arrUnkObj15501[0]._position.x, _arrUnkObj15501[0]._position.y + 20);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 41:
+ _sceneMode = 42;
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ R2_GLOBALS._player.setup(1502, 8, 1);
+ } else {
+ R2_GLOBALS._player.changeZoom(R2_GLOBALS._player._percent + 14);
+ R2_GLOBALS._player.setup(1516, 4, 1);
+ }
+ R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 42:
+ _sceneMode = 43;
+ warning("TODO: unknown use of arrUnkObj15501[0]._fieldA6");
+ switch (_arrUnkObj15501[0]._frame - 1) {
+ case 0:
+ R2_INVENTORY.setObjectScene(26, R2_GLOBALS._player._characterIndex);
+ break;
+ case 1:
+ R2_INVENTORY.setObjectScene(17, R2_GLOBALS._player._characterIndex);
+ break;
+ case 2:
+ R2_INVENTORY.setObjectScene(22, R2_GLOBALS._player._characterIndex);
+ break;
+ case 3:
+ R2_INVENTORY.setObjectScene(25, R2_GLOBALS._player._characterIndex);
+ break;
+ case 4:
+ R2_INVENTORY.setObjectScene(45, R2_GLOBALS._player._characterIndex);
+ break;
+ case 5:
+ R2_INVENTORY.setObjectScene(28, R2_GLOBALS._player._characterIndex);
+ break;
+ default:
+ break;
+ }
+ _arrUnkObj15501[0].remove();
+ R2_GLOBALS._player.animate(ANIM_MODE_6, this);
+ break;
+ case 43:
+ warning("TODO: unknown use of arrUnkObj15501[0]._fieldA6");
+ if (R2_GLOBALS._player._characterIndex == 1)
+ R2_GLOBALS._player.setVisage(1500);
+ else {
+ R2_GLOBALS._player.changeZoom(-1);
+ R2_GLOBALS._player.setVisage(1505);
+ }
+ R2_GLOBALS._player.animate(ANIM_MODE_1, this);
+ R2_GLOBALS._player.setStrip(8);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 50:
+ warning("STUB: sub_1D227()");
+ ++_sceneMode;
+ setAction(&_sequenceManager1, this, 1591, &R2_GLOBALS._player, NULL);
+ if (g_globals->_sceneObjects->contains(&_actor7))
+ signal();
+ else {
+ _actor7.postInit();
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _actor7.setVisage(1505);
+ else
+ _actor7.setVisage(1500);
+ _actor7.changeZoom(77);
+ _actor7.setAction(&_sequenceManager2, this, 1590, &_actor7, NULL);
+ _actor7.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL);
+ }
+ break;
+ case 51:
+ ++_sceneMode;
+ break;
+ case 52:
+ _actor7.changeZoom(-1);
+ _sceneMode = 1592;
+ if (R2_GLOBALS._player._characterIndex == 1)
+ setAction(&_sequenceManager1, this, 1592, &R2_GLOBALS._player, &_actor7, &_arrUnkObj15501[0], &_actor9, NULL);
+ else
+ setAction(&_sequenceManager1, this, 1593, &R2_GLOBALS._player, &_actor7, &_arrUnkObj15501[0], &_actor9, NULL);
+ break;
+ case 61:
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+ _field415 = 2;
+ break;
+ case 62:
+ R2_GLOBALS._player.enableControl(CURSOR_TALK);
+ if (_field415 == 2) {
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+ }
+ break;
+ case 70:
+ R2_GLOBALS._v565EC[2] = R2_GLOBALS._v565EC[1];
+ R2_GLOBALS._v565EC[4] = R2_GLOBALS._v565EC[3];
+ R2_GLOBALS._v565EC[0] = 1;
+ _sceneMode = 60;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(500, this);
+ break;
+ case 80:
+ if (R2_GLOBALS.getFlag(16)) {
+ _sceneMode = 60;
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ if (R2_GLOBALS._v565AE >= 3) {
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _stripManager.start(572, this);
+ else
+ _stripManager.start(573, this);
+ } else {
+ ++R2_GLOBALS._v565AE;
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _stripManager.start(499 + R2_GLOBALS._v565AE, this);
+ else
+ _stripManager.start(502 + R2_GLOBALS._v565AE, this);
+ }
+ } else {
+ _sceneMode = 60;
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ if (R2_GLOBALS._v565AE >= 4) {
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _stripManager.start(572, this);
+ else
+ _stripManager.start(573, this);
+ } else {
+ ++R2_GLOBALS._v565AE;
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _stripManager.start(563 + R2_GLOBALS._v565AE, this);
+ else
+ _stripManager.start(567 + R2_GLOBALS._v565AE, this);
+ }
+ }
+ break;
+ case 1550:
+ R2_GLOBALS._sceneManager.changeScene(1525);
+ break;
+ case 1552:
+ // No break on purpose
+ case 1588:
+ R2_INVENTORY.setObjectScene(R2_AIRBAG, R2_GLOBALS._player._characterIndex);
+ _actor8.remove();
+ _field412 = 0;
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 1553:
+ R2_GLOBALS._sceneManager.changeScene(1575);
+ break;
+ case 1554:
+ R2_GLOBALS._player.enableControl();
+ _field412 = 0;
+ break;
+ case 1555:
+ // No break on purpose
+ case 1589:
+ R2_INVENTORY.setObjectScene(R2_GYROSCOPE, R2_GLOBALS._player._characterIndex);
+ _actor10.remove();
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 1558:
+ _actor13.fixPriority(124);
+ _field415 = 1;
+ _unkArea1.proc12(1559, 1, 1, 160, 125);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 1559:
+ _actor13.fixPriority(168);
+ _actor4.fixPriority(169);
+ R2_GLOBALS._player.fixPriority(-1);
+ R2_GLOBALS._player.changeZoom(-1);
+ _field415 = 0;
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 1562:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ _field415 = 2;
+ break;
+ case 1564:
+ R2_INVENTORY.setObjectScene(R2_BATTERY, 1);
+ _sceneMode = 1565;
+ setAction(&_sequenceManager1, this, 1565, &R2_GLOBALS._player, NULL);
+ break;
+ case 1565:
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ case 1569:
+ // No break on purpose
+ case 1579:
+ _field412 = 0;
+ _actor1.remove();
+ R2_INVENTORY.setObjectScene(R2_GUIDANCE_MODULE, 0);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 1570:
+ // No break on purpose
+ case 1580:
+ _field412 = 0;
+ _actor1.remove();
+ R2_INVENTORY.setObjectScene(R2_RADAR_MECHANISM, 0);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 1571:
+ // No break on purpose
+ case 1581:
+ _field412 = 0;
+ _actor1.remove();
+ R2_INVENTORY.setObjectScene(R2_GYROSCOPE, 0);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 1572:
+ _field412 = 0;
+ _actor1.remove();
+ R2_INVENTORY.setObjectScene(R2_THRUSTER_VALVE, 0);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 1573:
+ _field412 = 0;
+ _actor1.remove();
+ R2_INVENTORY.setObjectScene(R2_IGNITOR, 0);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 1574:
+ // No break on purpose
+ case 1582:
+ _field412 = 0;
+ _actor1.remove();
+ R2_INVENTORY.setObjectScene(R2_FUEL_CELL, 0);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 1575:
+ // No break on purpose
+ case 1583:
+ _field412 = 0;
+ _actor1.remove();
+ R2_INVENTORY.setObjectScene(R2_BATTERY, 0);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 1576:
+ // No break on purpose
+ case 1584:
+ R2_GLOBALS._sceneManager.changeScene(1580);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 1577:
+ // No break on purpose
+ case 1578:
+ _sceneMode = 0;
+ _actor1.remove();
+ _field412 = 0;
+ R2_GLOBALS._player.fixPriority(-1);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 1585:
+ SceneItem::display(1550, 66, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 1586:
+ // No break on purpose
+ case 1587:
+ R2_INVENTORY.setObjectScene(R2_DIAGNOSTICS_DISPLAY, R2_GLOBALS._player._characterIndex);
+ _actor1.remove();
+ _field412 = 0;
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 1592:
+ _actor9.remove();
+ R2_INVENTORY.setObjectScene(R2_JOYSTICK, 1);
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ R2_GLOBALS._v565EC[2] = R2_GLOBALS._v565EC[1];
+ R2_GLOBALS._v565EC[4] = R2_GLOBALS._v565EC[3];
+ } else {
+ R2_GLOBALS._v565EC[1] = R2_GLOBALS._v565EC[2];
+ R2_GLOBALS._v565EC[3] = R2_GLOBALS._v565EC[4];
+ }
+ R2_GLOBALS._player.enableControl();
+ break;
+ default:
+ _sceneMode = 62;
+ setAction(&_sequenceManager1, this, 1, &R2_GLOBALS._player, NULL);
+ break;
+ }
+}
+
+void Scene1550::process(Event &event) {
+ if ((!R2_GLOBALS._player._canWalk) && (R2_GLOBALS._events.getCursor() == R2_NEGATOR_GUN) && (event.eventType == EVENT_BUTTON_DOWN) && (this->_screenNumber == 1234)) {
+ int curReg = R2_GLOBALS._sceneRegions.indexOf(event.mousePos);
+ if (curReg == 0)
+ _field412 = 1;
+ else if (((R2_GLOBALS._player._position.y < 90) && (event.mousePos.y > 90)) || ((R2_GLOBALS._player._position.y > 90) && (event.mousePos.y < 90)))
+ _field412 = 1;
+ else
+ _field412 = 0;
+
+ if ((curReg == 13) || (curReg == 14))
+ _field412 = 0;
+ }
+
+ Scene::process(event);
+}
+
+void Scene1550::dispatch() {
+ Scene::dispatch();
+
+ // Arrays related to this scene are all hacky in the origina: they are based on the impossibility to use Miranda
+ assert ((R2_GLOBALS._player._characterIndex == 1) || (R2_GLOBALS._player._characterIndex == 2));
+
+ if ((R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex] == 15) && (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex + 2] == 16)) {
+ R2_GLOBALS._player._shade = 0;
+ // Original game contains a switch based on an uninitialised variable.
+ // Until we understand what should really happen there, this code is unused on purpose
+ int missingVariable = 0;
+ switch (missingVariable) {
+ case 144:
+ // No break on purpose
+ case 146:
+ _actor13._frame = 5;
+ R2_GLOBALS._player._shade = 3;
+ break;
+ case 148:
+ // No break on purpose
+ case 149:
+ _actor13._frame = 1;
+ // No break on purpose
+ case 147:
+ // No break on purpose
+ case 150:
+ R2_GLOBALS._player._shade = 3;
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (_field412 != 0)
+ return;
+
+ switch (R2_GLOBALS._player.getRegionIndex() - 11) {
+ case 0:
+ // No break on purpose
+ case 5:
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 1;
+ _field412 = 1;
+ --R2_GLOBALS._v565EC[2 + R2_GLOBALS._player._characterIndex];
+
+ subA2B2F();
+
+ R2_GLOBALS._player.setPosition(Common::Point( 160 - (((((160 - R2_GLOBALS._player._position.x) * 100) / 108) * 172) / 100), 145));
+ if (R2_GLOBALS._player._position.x < 160) {
+ Common::Point pt(R2_GLOBALS._player._position.x + 5, 135);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else if (R2_GLOBALS._player._position.x <= 160) { // the check is really in the original...
+ Common::Point pt(R2_GLOBALS._player._position.x, 135);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else {
+ Common::Point pt(R2_GLOBALS._player._position.x - 5, 135);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 1:
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 3;
+ _field412 = 1;
+ ++R2_GLOBALS._v565EC[2 + R2_GLOBALS._player._characterIndex];
+
+ subA2B2F();
+
+ R2_GLOBALS._player.setPosition(Common::Point( 160 - (((((160 - R2_GLOBALS._player._position.x) * 100) / 172) * 108) / 100), 19));
+ if (R2_GLOBALS._player._position.x < 160) {
+ Common::Point pt(R2_GLOBALS._player._position.x + 5, 29);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else if (R2_GLOBALS._player._position.x <= 160) { // the check is really in the original...
+ Common::Point pt(R2_GLOBALS._player._position.x, 29);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else {
+ Common::Point pt(R2_GLOBALS._player._position.x - 5, 29);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 2:
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 5;
+ _field412 = 1;
+ ++R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex];
+
+ subA2B2F();
+
+ if ((R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex] == 9) && (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex + 2] == 11) && (R2_GLOBALS._player._position.y > 50) && (R2_GLOBALS._player._position.y < 135)) {
+ if (R2_GLOBALS._player._position.y >= 85) {
+ R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y + 10));
+ Common::Point pt(R2_GLOBALS._player._position.x + 30, R2_GLOBALS._player._position.y + 20);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else {
+ R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y - 10));
+ Common::Point pt(R2_GLOBALS._player._position.x + 30, R2_GLOBALS._player._position.y - 20);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ } else {
+ R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y));
+ Common::Point pt(R2_GLOBALS._player._position.x + 10, R2_GLOBALS._player._position.y);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 3:
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 7;
+ _field412 = 1;
+ --R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex];
+ if ((R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex] == 24) && (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex + 2] == 11)) {
+ R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y / 2));
+ Common::Point pt(265, 29);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else if ((R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex] == 9) && (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex + 2] == 11) && (R2_GLOBALS._player._position.y > 50) && (R2_GLOBALS._player._position.y < 135)) {
+ if (R2_GLOBALS._player._position.y >= 85) {
+ R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y + 10));
+ Common::Point pt(R2_GLOBALS._player._position.x - 30, R2_GLOBALS._player._position.y + 20);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else {
+ R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y - 10));
+ Common::Point pt(R2_GLOBALS._player._position.x - 30, R2_GLOBALS._player._position.y - 20);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ } else {
+ R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y));
+ Common::Point pt(R2_GLOBALS._player._position.x - 10, R2_GLOBALS._player._position.y);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene1550::saveCharacter(int characterIndex) {
+ if (R2_GLOBALS._player._characterIndex == 3)
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+
+ SceneExt::saveCharacter(characterIndex);
+}
+
+void Scene1550::SceneActor1550::subA4D14(int frameNumber, int strip) {
+ Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+
+ postInit();
+ if (scene->_field414 == 2)
+ setup(1551, strip, frameNumber);
+ else
+ setup(1554, strip, frameNumber);
+
+ switch (strip) {
+ case 0:
+ switch (frameNumber - 1) {
+ case 0:
+ setup(1551, 1, 1);
+ setPosition(Common::Point(30, 67));
+ break;
+ case 1:
+ setup(1560, 1, 5);
+ setPosition(Common::Point(141, 54));
+ break;
+ case 2:
+ setup(1560, 2, 5);
+ setPosition(Common::Point(178, 54));
+ break;
+ case 3:
+ setup(1560, 2, 1);
+ setPosition(Common::Point(289, 67));
+ break;
+ case 4:
+ setup(1560, 2, 2);
+ setPosition(Common::Point(298, 132));
+ break;
+ case 5:
+ setup(1560, 1, 2);
+ setPosition(Common::Point(21, 132));
+ break;
+ case 6:
+ setup(1560, 2, 4);
+ setPosition(Common::Point(285, 123));
+ break;
+ case 7:
+ setup(1560, 1, 3);
+ setPosition(Common::Point(30, 111));
+ break;
+ case 8:
+ setup(1560, 2, 3);
+ setPosition(Common::Point(289, 111));
+ break;
+ case 9:
+ setup(1560, 1, 4);
+ setPosition(Common::Point(34, 123));
+ break;
+ default:
+ break;
+ }
+ fixPriority(1);
+ break;
+ case 1:
+ if (frameNumber == 3) {
+ setup(1553, 3, 1);
+ setPosition(Common::Point(48, 44));
+ fixPriority(2);
+ } else {
+ fixPriority(1);
+ setPosition(Common::Point(32, 17));
+ }
+
+ switch (frameNumber) {
+ case 2:
+ setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL);
+ break;
+ case 3:
+ setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
+ break;
+ default:
+ setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL);
+ break;
+ }
+ break;
+ case 2:
+ fixPriority(1);
+ switch (frameNumber) {
+ case 4:
+ setup(1553, 4, 1);
+ setPosition(Common::Point(48, 168));
+ break;
+ case 5:
+ setup(1553, 3, 2);
+ setPosition(Common::Point(20, 168));
+ fixPriority(250);
+ break;
+ default:
+ setPosition(Common::Point(28, 116));
+ break;
+ }
+
+ switch (frameNumber) {
+ case 2:
+ setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL);
+ break;
+ case 4:
+ setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
+ break;
+ case 5:
+ setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
+ break;
+ default:
+ setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL);
+ break;
+ }
+ break;
+ case 3:
+ switch (frameNumber) {
+ case 2:
+ fixPriority(2);
+ if (scene->_field414 == 2)
+ setup(1553, 2, 1);
+ else
+ setup(1556, 2, 1);
+ setPosition(Common::Point(160, 44));
+ break;
+ case 3:
+ fixPriority(2);
+ setup(1553, 5, 1);
+ setPosition(Common::Point(178, 44));
+ break;
+ default:
+ fixPriority(1);
+ setPosition(Common::Point(160, 17));
+ break;
+ }
+
+ if (frameNumber == 1)
+ setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL);
+ else
+ setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
+ break;
+ case 4:
+ if (frameNumber == 2) {
+ fixPriority(250);
+ if (scene->_field414 == 2)
+ setup(1553, 1, 1);
+ else
+ setup(1556, 1, 1);
+ } else {
+ fixPriority(2);
+ }
+
+ if (frameNumber != 1)
+ setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
+
+ setPosition(Common::Point(160, 168));
+ break;
+ case 5:
+ fixPriority(1);
+ setPosition(Common::Point(287, 17));
+
+ switch (frameNumber) {
+ case 2:
+ setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL);
+ break;
+ case 3:
+ setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
+ break;
+ default:
+ setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL);
+ break;
+ }
+ break;
+ case 6:
+ fixPriority(1);
+ setPosition(Common::Point(291, 116));
+
+ if (frameNumber == 2)
+ setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL);
+ else
+ setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL);
+ break;
+ default:
+ break;
+ }
+
+}
+
+void Scene1550::subA2B2F() {
+ Rect tmpRect;
+ _field419 = 0;
+ _field415 = 0;
+
+ tmpRect = R2_GLOBALS._v5589E;
+
+ _actor14.remove();
+ _actor17.remove();
+ _actor15.remove();
+ _actor19.remove();
+ _actor16.remove();
+ _actor18.remove();
+
+ for (int i = 0; i < 8; ++i)
+ _arrUnkObj15501[i].remove();
+
+ _actor6.remove();
+
+ for (int i = 0; i < 8; ++i)
+ _arrUnkObj15502[i].remove();
+
+ _actor8.remove();
+ _actor9.remove();
+ _actor10.remove();
+ _actor3.remove();
+ _actor11.remove();
+
+ if ((_sceneMode != 1577) && (_sceneMode != 1578))
+ _actor1.remove();
+
+ _actor2.remove();
+ _actor7.remove();
+ _actor13.remove();
+ _actor5.remove();
+ _actor12.remove();
+ _actor4.remove();
+
+ switch (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex + 2]) {
+ case 0:
+ switch (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex]) {
+ case 3:
+ R2_GLOBALS._walkRegions.load(1554);
+ _field419 = 1554;
+ break;
+ case 4:
+ R2_GLOBALS._walkRegions.load(1553);
+ _field419 = 1553;
+ break;
+ default:
+ break;
+ }
+ break;
+ case 3:
+ // No break on purpose
+ case 4:
+ if ((R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex] == 23) || (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex])) {
+ if (!R2_GLOBALS.getFlag(16)) {
+ R2_GLOBALS._walkRegions.load(1559);
+ _field419 = 1559;
+ }
+ }
+ break;
+ case 7:
+ switch (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex]) {
+ case 10:
+ R2_GLOBALS._walkRegions.load(1555);
+ _field419 = 1555;
+ break;
+ case 11:
+ R2_GLOBALS._walkRegions.load(1556);
+ _field419 = 1556;
+ break;
+ default:
+ break;
+ }
+ break;
+ case 11:
+ switch (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex]) {
+ case 24:
+ R2_GLOBALS._walkRegions.load(1558);
+ _field419 = 1558;
+ break;
+ case 25:
+ R2_GLOBALS._walkRegions.load(1557);
+ _field419 = 1557;
+ break;
+ default:
+ break;
+ }
+ break;
+ case 16:
+ switch (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex]) {
+ case 2:
+ R2_GLOBALS._walkRegions.load(1552);
+ _field419 = 1552;
+ break;
+ case 3:
+ R2_GLOBALS._walkRegions.load(1551);
+ _field419 = 1551;
+ break;
+ case 15:
+ R2_GLOBALS._walkRegions.load(1575);
+ _field419 = 1575;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+
+ int varA = 0;
+
+ if (!R2_GLOBALS.getFlag(16)) {
+ switch (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex + 2] - 2) {
+ case 0:
+ switch (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex] - 22) {
+ case 0:
+ varA = 1553;
+ _actor15.subA4D14(6, 0);
+ break;
+ case 1:
+ // No break on purpose
+ case 2:
+ // No break on purpose
+ case 3:
+ // No break on purpose
+ case 4:
+ varA = 1553;
+ break;
+ case 5:
+ varA = 1553;
+ _actor15.subA4D14(6, 0);
+ break;
+ default:
+ break;
+ }
+ break;
+ case 1:
+ // No break on purpose
+ case 2:
+ switch (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex] - 21) {
+ case 0:
+ varA = 1550;
+ _actor15.subA4D14(9, 0);
+ break;
+ case 1:
+ varA = 1552;
+ _actor15.subA4D14(10, 0);
+ break;
+ case 2:
+ // No break on purpose
+ case 3:
+ // No break on purpose
+ case 4:
+ // No break on purpose
+ case 5:
+ varA = 1552;
+ break;
+ case 6:
+ varA = 1552;
+ _actor15.subA4D14(7, 0);
+ break;
+ case 7:
+ varA = 1550;
+ _actor15.subA4D14(8, 0);
+ break;
+ default:
+ break;
+ }
+ break;
+ case 3:
+ switch (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex] - 21) {
+ case 0:
+ varA = 1550;
+ _actor15.subA4D14(4, 0);
+ break;
+ case 1:
+ varA = 1550;
+ _actor15.subA4D14(3, 0);
+ break;
+ case 2:
+ // No break on purpose
+ case 3:
+ // No break on purpose
+ case 4:
+ // No break on purpose
+ case 5:
+ varA = 1551;
+ break;
+ case 6:
+ varA = 1550;
+ _actor15.subA4D14(2, 0);
+ break;
+ case 7:
+ varA = 1550;
+ _actor15.subA4D14(1, 0);
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ if ((R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex + 2] > 0) && (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex] <= 29) && (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex] >= 20) && (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex + 2] > 7)) {
+ R2_GLOBALS.setFlag(16);
+ R2_GLOBALS._sceneManager.changeScene(1500);
+ }
+ }
+
+ if ((R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex] == 9) && (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex + 2] == 11)) {
+ if (R2_GLOBALS._sceneManager._sceneNumber != 1234) {
+ R2_GLOBALS._sceneManager._fadeMode = FADEMODE_IMMEDIATE;
+ loadScene(1234);
+ R2_GLOBALS._sceneManager._hasPalette = false;
+ _field414 = 0;
+ }
+ } else {
+ if (R2_GLOBALS._sceneManager._sceneNumber == 1234) {
+ R2_GLOBALS._sceneManager._fadeMode = FADEMODE_IMMEDIATE;
+ loadScene(1550);
+ R2_GLOBALS._sceneManager._hasPalette = false;
+ }
+ }
+
+ if (R2_GLOBALS._sceneManager._sceneNumber == 1234)
+ _field419 = 1576;
+
+ if (_field414 == 0) {
+ _field414 = 1;
+ } else {
+ if (_field414 == 2) {
+ _field414 = 3;
+ } else {
+ _field414 = 2;
+ }
+
+ if (R2_GLOBALS._sceneManager._sceneNumber == 1550){
+ warning("Mouse_hideIfNeeded()");
+ warning("gfx_set_pane_p");
+ for (int i = 3; i != 168; ++i) {
+ warning("sub294D2(4, i, 312, var14C)");
+ warning("missing for loop, to be implemented");
+ warning("gfx_draw_slice");
+ }
+ warning("Missing sub2957D()");
+ warning("gfx_set_pane_p()");
+ R2_GLOBALS._sceneManager._fadeMode = FADEMODE_IMMEDIATE;
+
+ if (varA == 0) {
+ if (_field417 != 1550)
+ g_globals->_scenePalette.loadPalette(1550);
+ R2_GLOBALS._sceneManager._hasPalette = true;
+ } else {
+ g_globals->_scenePalette.loadPalette(varA);
+ R2_GLOBALS._sceneManager._hasPalette = true;
+ }
+
+ if (R2_GLOBALS._sceneManager._hasPalette)
+ _field417 = varA;
+
+ warning("sub_2C429()");
+ }
+ }
+
+ switch (k5A4D6[(R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex + 2] * 30)] + R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex]) {
+ case 0:
+ if (_field419 == 0) {
+ R2_GLOBALS._walkRegions.load(1550);
+ _field419 = 1550;
+ }
+ break;
+ case 1:
+ if (_field419 == 0) {
+ R2_GLOBALS._walkRegions.load(1560);
+ _field419 = 1560;
+ }
+ _actor14.subA4D14(2, 1);
+ _actor15.subA4D14(1, 3);
+ _actor16.subA4D14(2, 5);
+ break;
+ case 2:
+ R2_GLOBALS._walkRegions.load(1561);
+ _field419 = 1561;
+ _actor14.subA4D14(2, 1);
+ _actor17.subA4D14(2, 2);
+ _actor15.subA4D14(1, 3);
+ _actor16.subA4D14(2, 5);
+ break;
+ case 3:
+ R2_GLOBALS._walkRegions.load(1562);
+ _field419 = 1562;
+ _actor14.subA4D14(2, 1);
+ _actor15.subA4D14(1, 3);
+ _actor16.subA4D14(2, 5);
+ _actor18.subA4D14(2, 6);
+ break;
+ case 4:
+ R2_GLOBALS._walkRegions.load(1563);
+ _field419 = 1563;
+ _actor15.subA4D14(2, 3);
+ break;
+ case 5:
+ R2_GLOBALS._walkRegions.load(1564);
+ _field419 = 1564;
+ _actor19.subA4D14(2, 4);
+ break;
+ case 6:
+ R2_GLOBALS._walkRegions.load(1565);
+ _field419 = 1565;
+ _actor14.subA4D14(1, 1);
+ _actor17.subA4D14(1, 2);
+ _actor15.subA4D14(3, 3);
+ break;
+ case 7:
+ R2_GLOBALS._walkRegions.load(1566);
+ _field419 = 1566;
+ _actor14.subA4D14(1, 1);
+ _actor17.subA4D14(1, 2);
+ _actor15.subA4D14(2, 4);
+ break;
+ case 8:
+ R2_GLOBALS._walkRegions.load(1567);
+ _field419 = 1567;
+ _actor17.subA4D14(5, 2);
+ break;
+ case 9:
+ R2_GLOBALS._walkRegions.load(1568);
+ _field419 = 1568;
+ _actor17.subA4D14(4, 2);
+ break;
+ case 10:
+ R2_GLOBALS._walkRegions.load(1569);
+ _field419 = 1569;
+ _actor14.subA4D14(3, 1);
+ break;
+ case 11:
+ R2_GLOBALS._walkRegions.load(1570);
+ _field419 = 1570;
+ _actor14.subA4D14(1, 1);
+ _actor17.subA4D14(1, 2);
+ break;
+ case 12:
+ R2_GLOBALS._walkRegions.load(1571);
+ _field419 = 1571;
+ _actor16.subA4D14(1, 5);
+ _actor18.subA4D14(1, 6);
+ break;
+ case 13:
+ R2_GLOBALS._walkRegions.load(1572);
+ _field419 = 1572;
+ _actor14.subA4D14(1, 1);
+ _actor17.subA4D14(1, 2);
+ _actor19.subA4D14(1, 4);
+ break;
+ case 14:
+ R2_GLOBALS._walkRegions.load(1573);
+ _field419 = 1573;
+ _actor19.subA4D14(1, 4);
+ _actor16.subA4D14(1, 5);
+ _actor18.subA4D14(1, 6);
+ break;
+ case 15:
+ R2_GLOBALS._walkRegions.load(1574);
+ _field419 = 1574;
+ _actor19.subA4D14(1, 4);
+ break;
+ case 16:
+ R2_GLOBALS._walkRegions.load(1570);
+ _field419 = 1570;
+ _actor14.subA4D14(2, 1);
+ _actor17.subA4D14(2, 2);
+ break;
+ case 17:
+ R2_GLOBALS._walkRegions.load(1570);
+ _field419 = 1570;
+ _actor14.subA4D14(2, 1);
+ _actor17.subA4D14(3, 2);
+ break;
+ case 18:
+ R2_GLOBALS._walkRegions.load(1571);
+ _field419 = 1571;
+ _actor16.subA4D14(2, 5);
+ _actor18.subA4D14(2, 6);
+ break;
+ case 19:
+ R2_GLOBALS._walkRegions.load(1571);
+ _field419 = 1571;
+ _actor16.subA4D14(2, 5);
+ _actor18.subA4D14(3, 6);
+ break;
+ default:
+ break;
+ }
+
+ int di = 0;
+ int tmpIdx = 0;
+ // Original game was checking "i < 129" but it was clearly a bug as it's out of bounds
+ for (int i = 0; i < 129 * 4; i += 4) {
+ if ((R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex] == k562CC[i]) && (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex + 2] == k562CC[i + 1]) && (k562CC[i + 2] != 0)) {
+ tmpIdx = k562CC[i + 3];
+ _arrUnkObj15501[di].postInit();
+ _arrUnkObj15501[di]._effect = 6;
+ _arrUnkObj15501[di]._shade = 0;
+ _arrUnkObj15501[di]._fieldA4 = tmpIdx;
+ _arrUnkObj15501[di]._fieldA6 = i;
+ _arrUnkObj15501[di].setDetails(1550, 62, -1, 63, 2, (SceneItem *) NULL);
+ if (k562CC[i + 2] == 41) {
+ _arrUnkObj15501[di].changeZoom(-1);
+ _arrUnkObj15501[di].setPosition(Common::Point(150, 70));
+ _arrUnkObj15501[di].setup(1562, 1, 1);
+ R2_GLOBALS._walkRegions.enableRegion(k5A78C);
+ R2_GLOBALS._walkRegions.enableRegion(k5A78D);
+ R2_GLOBALS._walkRegions.enableRegion(k5A790);
+ R2_GLOBALS._walkRegions.enableRegion(k5A791);
+ if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) == 1550) {
+ _actor9.postInit();
+ _actor9.setup(1562, 3, 1);
+ _actor9.setPosition(Common::Point(150, 70));
+ _actor9.fixPriority(10);
+ _actor9.setDetails(1550, 41, -1, 42, 2, (SceneItem *) NULL);
+ }
+ } else {
+ if (k562CC[i + 2] > 40) {
+ _arrUnkObj15501[di].changeZoom(100);
+ _arrUnkObj15501[di].setup(1561, 1, k562CC[i + 2] - 40);
+ } else {
+ _arrUnkObj15501[di].changeZoom(-1);
+ _arrUnkObj15501[di].setup(1552, ((k562CC[i + 2] - 1) / 5) + 1, ((k562CC[i + 2] - 1) % 5) + 1);
+ }
+ _arrUnkObj15501[di].setPosition(Common::Point(k5A72E[tmpIdx], k5A73F[tmpIdx]));
+ if (k5A78A[tmpIdx] != 0)
+ R2_GLOBALS._walkRegions.enableRegion(k5A78A[tmpIdx]);
+ di++;
+ }
+ }
+ }
+
+ for (int i = 0; i < 15 * 3; i++) {
+ if ((R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex] == k5A79B[i]) && (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex + 2] == k5A79B[i + 1])) {
+ tmpIdx = k5A79B[i + 2];
+ switch (tmpIdx - 1) {
+ case 0:
+ if (!R2_GLOBALS.getFlag(16)) {
+ _actor1.postInit();
+ if (R2_GLOBALS._v565EC[R2_GLOBALS._player._characterIndex + 2] == 3)
+ _actor1.setup(1555, 2, 1);
+ else
+ _actor1.setup(1555, 1, 1);
+ _actor1.setPosition(Common::Point(150, 100));
+ _actor1.fixPriority(92);
+ _actor1.setDetails(1550, 73, -1, -1, 2, (SceneItem *) NULL);
+ }
+ break;
+ case 1:
+ _actor13.postInit();
+ warning("_actor13._actorName = \"dish\";");
+ if (R2_GLOBALS.getFlag(19))
+ _actor13.setup(1556, 3, 5);
+ else
+ _actor13.setup(1556, 3, 1);
+ _actor13.changeZoom(95);
+ _actor13.setPosition(Common::Point(165, 83));
+ _actor13.fixPriority(168);
+ _actor13.setDetails(1550, 17, -1, 19, 2, (SceneItem *) NULL);
+
+ _actor12.postInit();
+ _actor12.setup(1556, 4, 1);
+ _actor12.setPosition(Common::Point(191, 123));
+ _actor12.changeZoom(95);
+ _actor12.setDetails(1550, 65, -1, 66, 2, (SceneItem *) NULL);
+
+ _actor5.postInit();
+ _actor5._numFrames = 5;
+ if (R2_GLOBALS.getFlag(19))
+ _actor5.setup(1556, 8, 5);
+ else
+ _actor5.setup(1556, 8, 1);
+
+ _actor5.setPosition(Common::Point(156, 151));
+ _actor5.fixPriority(10);
+
+ _actor4.postInit();
+ if (R2_GLOBALS.getFlag(20))
+ _actor4.setup(1558, 3, 10);
+ else
+ _actor4.setup(1558, 3, 1);
+
+ _actor4.setPosition(Common::Point(172, 48));
+ _actor4.fixPriority(169);
+ R2_GLOBALS._walkRegions.enableRegion(k5A78A[15]);
+ break;
+ case 2:
+ _actor6.postInit();
+ _actor6.setup(1550, 1, 1);
+ _actor6.setPosition(Common::Point(259, 55));
+ _actor6.fixPriority(133);
+ _actor6.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
+
+ _actor1.postInit();
+ _actor1.setup(1550, 1, 2);
+ _actor1.setPosition(Common::Point(259, 133));
+ _actor1.fixPriority(105);
+ _actor1.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
+ if (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) == 1550) {
+ _actor10.postInit();
+ _actor10.setup(1550, 7, 2);
+ _actor10.setPosition(Common::Point(227, 30));
+ _actor10.fixPriority(130);
+ _actor10.setDetails(1550, 29, -1, 63, 2, (SceneItem *) NULL);
+ }
+ break;
+ case 3:
+ _actor6.postInit();
+ _actor6.setup(1550, 1, 4);
+ _actor6.setPosition(Common::Point(76, 131));
+ _actor6.fixPriority(10);
+ _actor6.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
+
+ _actor1.postInit();
+ _actor1.setup(1550, 1, 3);
+ _actor1.setPosition(Common::Point(76, 64));
+ _actor1.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
+ if (R2_INVENTORY.getObjectScene(R2_DIAGNOSTICS_DISPLAY) == 1550) {
+ _actor11.postInit();
+ _actor11.setup(1504, 4, 1);
+ _actor11.setPosition(Common::Point(49, 35));
+ _actor11.animate(ANIM_MODE_2, NULL);
+ _actor11._numFrames = 4;
+ _actor11.fixPriority(65);
+ _actor11.setDetails(1550, 14, 15, 63, 2, (SceneItem *) NULL);
+ }
+ if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1550) {
+ _actor8.postInit();
+ _actor8.setup(1550, 7, 1);
+ _actor8.setPosition(Common::Point(45, 44));
+ _actor8.fixPriority(150);
+ _actor8.setDetails(1550, 44, -1, 63, 2, (SceneItem *) NULL);
+ }
+ break;
+ case 4:
+ _actor6.postInit();
+ _actor6.setup(1550, 2, 4);
+ _actor6.setPosition(Common::Point(243, 131));
+ _actor6.fixPriority(10);
+ _actor6.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
+
+ _actor1.postInit();
+ _actor1.setup(1550, 2, 3);
+ _actor1.setPosition(Common::Point(243, 64));
+ _actor1.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
+ break;
+ case 5:
+ _actor6.postInit();
+ _actor6.setup(1550, 2, 1);
+ _actor6.setPosition(Common::Point(60, 55));
+ _actor6.fixPriority(133);
+ _actor6.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
+
+ _actor1.postInit();
+ _actor1.setup(1550, 2, 2);
+ _actor1.setPosition(Common::Point(60, 133));
+ _actor1.fixPriority(106);
+ _actor1.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
+ break;
+ case 6:
+ _actor6.postInit();
+ _actor6.setup(1550, 3, 1);
+ _actor6.setPosition(Common::Point(281, 132));
+ _actor6.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
+ break;
+ case 7:
+ _actor6.postInit();
+ _actor6.setup(1550, 3, 2);
+ _actor6.setPosition(Common::Point(57, 96));
+ _actor6.fixPriority(70);
+ _actor6.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
+
+ _actor1.postInit();
+ _actor1.setup(1550, 3, 3);
+ _actor1.setPosition(Common::Point(145, 88));
+ _actor1.fixPriority(55);
+ _actor1.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
+
+ _actor2.postInit();
+ _actor2.setup(1550, 3, 4);
+ _actor2.setPosition(Common::Point(64, 137));
+ _actor2.fixPriority(115);
+ _actor2.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
+
+ _actor3.postInit();
+ _actor3.setup(1550, 5, 1);
+ _actor3.setPosition(Common::Point(60, 90));
+ _actor3.fixPriority(45);
+ break;
+ case 8:
+ _actor6.postInit();
+ _actor6.setup(1550, 4, 2);
+ _actor6.setPosition(Common::Point(262, 96));
+ _actor6.fixPriority(70);
+ _actor6.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
+
+ _actor1.postInit();
+ _actor1.setup(1550, 4, 3);
+ _actor1.setPosition(Common::Point(174, 88));
+ _actor1.fixPriority(55);
+ _actor1.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
+
+ _actor2.postInit();
+ _actor2.setup(1550, 4, 4);
+ _actor2.setPosition(Common::Point(255, 137));
+ _actor2.fixPriority(115);
+ _actor2.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
+
+ _actor3.postInit();
+ _actor3.setup(1550, 6, 1);
+ _actor3.setPosition(Common::Point(259, 90));
+ _actor3.fixPriority(45);
+ break;
+ case 9:
+ _actor6.postInit();
+ _actor6.setup(1550, 4, 1);
+ _actor6.setPosition(Common::Point(38, 132));
+ _actor6.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
+ break;
+ case 11:
+ _arrUnkObj15502[7].subA5CDF(8);
+ _arrUnkObj15502[0].subA5CDF(1);
+ _arrUnkObj15502[1].subA5CDF(2);
+ _arrUnkObj15502[2].subA5CDF(3);
+ _arrUnkObj15502[3].subA5CDF(4);
+ _arrUnkObj15502[4].subA5CDF(5);
+ _arrUnkObj15502[5].subA5CDF(6);
+ _arrUnkObj15502[6].subA5CDF(7);
+ default:
+ break;
+ }
+ }
+ }
+
+ if ((R2_GLOBALS._v565EC[1] == R2_GLOBALS._v565EC[2]) && (R2_GLOBALS._v565EC[3] == R2_GLOBALS._v565EC[4])) {
+ _actor7.postInit();
+ _actor7._effect = 7;
+ _actor7.changeZoom(-1);
+
+ assert((_field419 >= 1550) && (_field419 <= 2008));
+ R2_GLOBALS._walkRegions.enableRegion(k5A750[_field419 - 1550]);
+ _actor7.setPosition(Common::Point(k5A72E[k5A76D[_field419 - 1550]], k5A73F[k5A76D[_field419 - 1550]] + 8));
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ if (R2_GLOBALS._player._characterScene[2] == 1580) {
+ _actor7.setup(1516, 3, 17);
+ _actor7.setPosition(Common::Point(272, 94));
+ _actor7.fixPriority(91);
+ _actor7.changeZoom(100);
+ _actor7.setDetails(1550, -1, -1, -1, 5, &_arrUnkObj15502[7]);
+ } else {
+ _actor7.setup(1505, 6, 1);
+ _actor7.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL);
+ }
+ } else {
+ if (R2_GLOBALS._player._characterScene[1] == 1580) {
+ _actor7.setup(1516, 2, 14);
+ _actor7.setPosition(Common::Point(276, 97));
+ _actor7.fixPriority(91);
+ _actor7.changeZoom(100);
+ _actor7.setDetails(1550, -1, -1, -1, 5, &_arrUnkObj15502[7]);
+ } else {
+ _actor7.setup(1500, 6, 1);
+ _actor7.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL);
+ }
+ }
+ }
+ R2_GLOBALS._uiElements.updateInventory();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 1575 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene1575::Scene1575() {
+ _field412 = 0;
+ _field414 = 0;
+ _field416 = 0;
+ _field418 = 0;
+ _field41A = 0;
+}
+
+void Scene1575::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field412);
+ s.syncAsSint16LE(_field414);
+ s.syncAsSint16LE(_field416);
+ s.syncAsSint16LE(_field418);
+ s.syncAsSint16LE(_field41A);
+}
+
+Scene1575::Hotspot1::Hotspot1() {
+ _field34 = 0;
+ _field36 = 0;
+}
+
+void Scene1575::Hotspot1::synchronize(Serializer &s) {
+ NamedHotspot::synchronize(s);
+
+ s.syncAsSint16LE(_field34);
+ s.syncAsSint16LE(_field36);
+}
+
+void Scene1575::Hotspot1::process(Event &event) {
+ if ((event.eventType != EVENT_BUTTON_DOWN) || (R2_GLOBALS._events.getCursor() != R2_STEPPING_DISKS) || (!_bounds.contains(event.mousePos))) {
+ if (_field36 == 0)
+ return;
+ if ((_field34 == 1) || (event.eventType == EVENT_BUTTON_UP) || (!_bounds.contains(event.mousePos))) {
+ _field36 = 0;
+ return;
+ }
+ }
+ _field36 = 1;
+ Scene1575 *scene = (Scene1575 *)R2_GLOBALS._sceneManager._scene;
+
+ event.handled = true;
+ if (R2_GLOBALS.getFlag(18) && (_field34 > 1) && (_field34 < 6)) {
+ warning("sub1A03B(\"Better not move the laser while it\'s firing!\", 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);");
+ return;
+ }
+ int di = scene->_actor1._position.x;
+
+ switch (_field34 - 1) {
+ case 0:
+ if (R2_GLOBALS.getFlag(18)) {
+ scene->_actor14.hide();
+ scene->_actor15.hide();
+ R2_GLOBALS.clearFlag(18);
+ } else if ((scene->_actor12._position.x == 85) && (scene->_actor12._position.y == 123)) {
+ scene->_actor14.show();
+ scene->_actor15.show();
+ R2_GLOBALS.setFlag(18);
+ } else {
+ warning("sub1A03B(\"That\'s probably not a good thing, ya know!\", 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);");
+ }
+ break;
+ case 1:
+ if (scene->_field41A < 780) {
+ if (di > 54)
+ di -= 65;
+ di += 2;
+ scene->_field41A += 2;
+
+ for (int i = 0; i < 17; i++)
+ scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x + 2, scene->_arrActor[i]._position.y));
+
+ scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x + 2, scene->_actor13._position.y));
+ scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x + 2, scene->_actor12._position.y));
+ scene->_actor1.setPosition(Common::Point(di, scene->_actor1._position.y));
+ scene->_actor2.setPosition(Common::Point(di + 65, scene->_actor1._position.y));
+ scene->_actor3.setPosition(Common::Point(di + 130, scene->_actor1._position.y));
+ }
+ break;
+ case 2:
+ if (scene->_field41A > 0) {
+ if (di < -8)
+ di += 65;
+
+ di -= 2;
+ scene->_field41A -= 2;
+ for (int i = 0; i < 178; i++)
+ scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x - 2, scene->_arrActor[i]._position.y));
+
+ scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x - 2, scene->_actor13._position.y));
+ scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x - 2, scene->_actor12._position.y));
+ scene->_actor1.setPosition(Common::Point(di, scene->_actor1._position.y));
+ scene->_actor2.setPosition(Common::Point(di + 65, scene->_actor1._position.y));
+ scene->_actor3.setPosition(Common::Point(di + 130, scene->_actor1._position.y));
+ }
+ break;
+ case 3: {
+ int tmpPosY = scene->_actor1._position.y;
+ if (tmpPosY < 176) {
+ ++tmpPosY;
+ for (int i = 0; i < 17; ++i)
+ scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x, scene->_arrActor[i]._position.y + 1));
+
+ scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x, scene->_actor13._position.y + 1));
+ scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x, scene->_actor12._position.y + 1));
+ scene->_actor1.setPosition(Common::Point(di, scene->_actor1._position.y));
+ scene->_actor2.setPosition(Common::Point(di + 65, scene->_actor1._position.y));
+ scene->_actor3.setPosition(Common::Point(di + 130, scene->_actor1._position.y));
+ }
+ }
+ break;
+ case 4: {
+ int tmpPosY = scene->_actor1._position.y;
+ if (tmpPosY > 145) {
+ tmpPosY--;
+ for (int i = 0; i < 17; ++i)
+ scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x, scene->_arrActor[i]._position.y - 1));
+
+ scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x, scene->_actor13._position.y - 1));
+ scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x, scene->_actor12._position.y - 1));
+ scene->_actor1.setPosition(Common::Point(di, scene->_actor1._position.y));
+ scene->_actor2.setPosition(Common::Point(di + 65, scene->_actor1._position.y));
+ scene->_actor3.setPosition(Common::Point(di + 130, scene->_actor1._position.y));
+ }
+ }
+ break;
+ case 5:
+ R2_GLOBALS._sceneManager.changeScene(1550);
+ break;
+ default:
+ break;
+ }
+
+ int j = 0;
+ for (int i = 0; i < 17; i++) {
+ if (scene->_arrActor[i]._bounds.contains(85, 116))
+ j = i;
+ }
+
+ if (scene->_actor13._bounds.contains(85, 116))
+ j = 18;
+
+ if (scene->_actor12._bounds.contains(85, 116))
+ j = 19;
+
+ if (j)
+ scene->_actor11.show();
+ else
+ scene->_actor11.hide();
+}
+
+bool Scene1575::Hotspot1::startAction(CursorType action, Event &event) {
+ if (action == CURSOR_USE)
+ return false;
+ return SceneHotspot::startAction(action, event);
+}
+
+void Scene1575::Hotspot1::subA910D(int indx) {
+ warning("STUB: Scene1575:Hotspot1::subA910D(%d)", indx);
+}
+
+void Scene1575::postInit(SceneObjectList *OwnerList) {
+ loadScene(1575);
+ R2_GLOBALS._uiElements._active = false;
+ R2_GLOBALS._v5589E = Rect(0, 0, 320, 200);
+ SceneExt::postInit();
+ _field414 = 390;
+
+ _actor1.postInit();
+ _actor1.setup(1575, 1, 1);
+ _actor1.setPosition(Common::Point(54, 161));
+ _actor1.fixPriority(5);
+
+ _actor2.postInit();
+ _actor2.setup(1575, 1, 1);
+ _actor2.setPosition(Common::Point(119, 161));
+ _actor2.fixPriority(5);
+
+ _actor3.postInit();
+ _actor3.setup(1575, 1, 1);
+ _actor3.setPosition(Common::Point(184, 161));
+ _actor3.fixPriority(5);
+
+ for (int i = 0; i < 17; i++) {
+ _arrActor[i].postInit();
+ _arrActor[i].setup(1575, 2, k5A7F6[(3 * i) + 2]);
+ warning("TODO: immense pile of floating operations");
+ _arrActor[i].fixPriority(6);
+ }
+
+ _actor4.postInit();
+ _actor4.setup(1575, 3, 1);
+ _actor4.setPosition(Common::Point(48, 81));
+
+ _actor5.postInit();
+ _actor5.setup(1575, 3,1);
+ _actor5.setPosition(Common::Point(121, 81));
+
+ _actor6.postInit();
+ _actor6.setup(1575, 3, 2);
+ _actor6.setPosition(Common::Point(203, 80));
+
+ _actor7.postInit();
+ _actor7.setup(1575, 3, 2);
+ _actor7.setPosition(Common::Point(217, 80));
+
+ _actor8.postInit();
+ _actor8.setup(1575, 3, 2);
+ _actor8.setPosition(Common::Point(231, 80));
+
+ _actor9.postInit();
+ _actor9.setup(1575, 3, 2);
+ _actor9.setPosition(Common::Point(273, 91));
+
+ _actor10.postInit();
+ _actor10.setup(1575, 3, 2);
+ _actor10.setPosition(Common::Point(287, 91));
+
+ _item1.subA910D(1);
+ _item1.subA910D(2);
+ _item1.subA910D(3);
+ _item1.subA910D(4);
+ _item1.subA910D(5);
+ _item1.subA910D(6);
+
+ _actor11.postInit();
+ _actor11.setup(1575, 4, 2);
+ _actor11.setPosition(Common::Point(84, 116));
+ _actor11.hide();
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.hide();
+ R2_GLOBALS._player.enableControl();
+
+ do {
+ _field412 = R2_GLOBALS._randomSource.getRandomNumber(20) - 10;
+ _field414 = R2_GLOBALS._randomSource.getRandomNumber(20) - 10;
+ } while ((_field412) && (_field414));
+
+ if (_field412 < 0)
+ _actor4.hide();
+
+ if (_field414 < 0)
+ _actor5.hide();
+
+ _field416 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1;
+ _field418 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1;
+
+ _actor13.postInit();
+ _actor13.setup(1575, 2, 4);
+
+ warning("TODO: another immense pile of floating operations");
+
+ _actor12.postInit();
+ _actor12.fixPriority(12);
+
+ if (R2_GLOBALS.getFlag(17)) {
+ _actor13.setPosition(Common::Point(_actor13._position.x + 5, _actor13._position.y));
+ _actor12.setPosition(Common::Point(_actor12._position.x + 5, _actor12._position.y));
+ }
+
+ _actor14.postInit();
+ _actor14.setup(1575, 5, 1);
+ _actor14.setPosition(Common::Point(85, 176));
+ _actor14.fixPriority(7);
+ _actor14.hide();
+
+ _actor15.postInit();
+ _actor15.setup(1575, 5, 2);
+ _actor15.setPosition(Common::Point(85, 147));
+ _actor15.fixPriority(7);
+ _actor15.hide();
+}
+
+void Scene1575::remove() {
+ SceneExt::remove();
+ R2_GLOBALS._v5589E.top = 3;
+ R2_GLOBALS._v5589E.bottom = 168;
+ R2_GLOBALS._uiElements._active = true;
+}
+
+void Scene1575::signal() {
+ R2_GLOBALS._player.enableControl();
+}
+
+void Scene1575::process(Event &event) {
+ Scene::process(event);
+
+ g_globals->_sceneObjects->recurse(SceneHandler::dispatchObject);
+ warning("TODO: check Scene1575::process");
+}
+
+void Scene1575::dispatch() {
+ if (_field412 <= 0) {
+ ++_field412;
+ if (_field412 == 0) {
+ _actor4.show();
+ _field412 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1;
+ }
+ } else {
+ _field412--;
+ if (_field412 ==0) {
+ _actor4.hide();
+ _field412 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1;
+ }
+ }
+
+ if (_field414 <= 0) {
+ ++_field414;
+ if (_field414 == 0) {
+ _actor5.show();
+ _field414 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1;
+ }
+ } else {
+ _field414--;
+ if (_field414 == 0) {
+ _actor5.hide();
+ _field414 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1;
+ }
+ }
+
+ if (_field416 == 0) {
+ switch(R2_GLOBALS._randomSource.getRandomNumber(3)) {
+ case 0:
+ _actor6.hide();
+ _actor7.hide();
+ _actor8.hide();
+ break;
+ case 1:
+ _actor6.show();
+ _actor7.hide();
+ _actor8.hide();
+ break;
+ case 2:
+ _actor6.show();
+ _actor7.show();
+ _actor8.hide();
+ break;
+ case 3:
+ _actor6.show();
+ _actor7.show();
+ _actor8.show();
+ break;
+ default:
+ break;
+ }
+ _field416 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1;
+ } else {
+ --_field416;
+ }
+
+ if (_field418 == 0) {
+ switch(R2_GLOBALS._randomSource.getRandomNumber(2)) {
+ case 0:
+ _actor9.hide();
+ _actor10.hide();
+ break;
+ case 1:
+ _actor9.show();
+ _actor10.hide();
+ break;
+ case 2:
+ _actor9.show();
+ _actor10.show();
+ break;
+ default:
+ break;
+ }
+ _field418 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1;
+ } else {
+ _field418--;
+ }
+ Scene::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 1580 - Inside wreck
+ *
+ *--------------------------------------------------------------------------*/
+Scene1580::Scene1580() {
+ _field412 = 0;
+}
+
+void Scene1580::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field412);
+}
+
+bool Scene1580::Hotspot1::startAction(CursorType action, Event &event) {
+ Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action == R2_JOYSTICK) {
+ R2_INVENTORY.setObjectScene(26, 1580);
+ R2_GLOBALS._sceneItems.remove(&scene->_item1);
+ scene->_actor2.postInit();
+ scene->_actor2.setup(1580, 1, 4);
+ scene->_actor2.setPosition(Common::Point(159, 163));
+ scene->_actor2.setDetails(1550, 78, -1, -1, 2, (SceneItem *) NULL);
+
+ scene->_arrActor[5].remove();
+
+ return true;
+ }
+
+ return SceneHotspot::startAction(action, event);
+}
+
+bool Scene1580::Hotspot2::startAction(CursorType action, Event &event) {
+ Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action == R2_DIAGNOSTICS_DISPLAY) {
+ R2_INVENTORY.setObjectScene(28, 1580);
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._sceneItems.remove(&scene->_item2);
+
+ scene->_actor3.postInit();
+ scene->_actor3.setup(1580, 1, 1);
+ scene->_actor3.setPosition(Common::Point(124, 108));
+ scene->_actor3.fixPriority(10);
+
+ if (R2_INVENTORY.getObjectScene(26) == 1580)
+ scene->_actor3.setDetails(1550, 14, -1, -1, 5, &scene->_actor2);
+ else
+ scene->_actor3.setDetails(1550, 14, -1, -1, 2, (SceneItem *)NULL);
+
+ scene->_actor1.postInit();
+ scene->_actor1.setup(1580, 3, 1);
+ scene->_actor1.setPosition(Common::Point(124, 109));
+ scene->_actor1.fixPriority(20);
+ scene->_field412 = 1;
+ scene->_sceneMode = 10;
+ scene->setAction(&scene->_sequenceManager, scene, 1, &R2_GLOBALS._player, NULL);
+
+ return true;
+ }
+
+ return SceneHotspot::startAction(action, event);
+}
+
+bool Scene1580::Actor2::startAction(CursorType action, Event &event) {
+ if ( (action == CURSOR_USE) && (R2_INVENTORY.getObjectScene(28) == 1580)
+ && (R2_INVENTORY.getObjectScene(17) == 0) && (R2_INVENTORY.getObjectScene(22) == 0)
+ && (R2_INVENTORY.getObjectScene(25) == 0) && (R2_INVENTORY.getObjectScene(18) == 0)
+ && (R2_INVENTORY.getObjectScene(23) == 0) && (R2_INVENTORY.getObjectScene(27) == 0)) {
+ Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
+ scene->_sceneMode = 31;
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->_stripManager.start(536, scene);
+ else
+ scene->_stripManager.start(537, scene);
+
+ return true;
+ }
+
+ return SceneActor::startAction(action, event);
+}
+
+bool Scene1580::Actor3::startAction(CursorType action, Event &event) {
+ if ((action == CURSOR_USE) && (R2_INVENTORY.getObjectScene(51) == 1580)) {
+ Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_INVENTORY.setObjectScene(51, R2_GLOBALS._player._characterIndex);
+ scene->_item2.setDetails(Rect(69, 29, 177, 108), 1550, 82, -1, -1, 2, NULL);
+ scene->_actor1.remove();
+ remove();
+ return true;
+ }
+
+ return SceneActor::startAction(action, event);
+}
+
+bool Scene1580::Actor4::startAction(CursorType action, Event &event) {
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._sceneItems.remove(&scene->_actor4);
+ scene->_sceneMode = 0;
+ animate(ANIM_MODE_5, scene);
+
+ return true;
+}
+
+bool Scene1580::Actor5::startAction(CursorType action, Event &event) {
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._player.disableControl();
+ setFrame(2);
+ scene->_sceneMode = 20;
+ scene->setAction(&scene->_sequenceManager, scene, 2, &R2_GLOBALS._player, NULL);
+
+ return true;
+}
+
+bool Scene1580::Actor6::startAction(CursorType action, Event &event) {
+ Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ R2_INVENTORY.setObjectScene(23, 1);
+ remove();
+ return true;
+ }
+ break;
+ case R2_COM_SCANNER:
+ scene->_sceneMode = 30;
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ scene->_stripManager.start(529, scene);
+ return true;
+ break;
+ case R2_COM_SCANNER_2:
+ scene->_sceneMode = 30;
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ scene->_stripManager.start(527, scene);
+ return true;
+ break;
+ default:
+ break;
+ }
+
+ return SceneActor::startAction(action, event);
+}
+
+bool Scene1580::Actor7::startAction(CursorType action, Event &event) {
+ Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ R2_INVENTORY.setObjectScene(27, 1);
+ remove();
+ return true;
+ }
+ break;
+ case R2_COM_SCANNER:
+ scene->_sceneMode = 30;
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ scene->_stripManager.start(529, scene);
+ return true;
+ break;
+ case R2_COM_SCANNER_2:
+ scene->_sceneMode = 30;
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ scene->_stripManager.start(527, scene);
+ return true;
+ break;
+ default:
+ break;
+ }
+
+ return SceneActor::startAction(action, event);
+}
+
+void Scene1580::postInit(SceneObjectList *OwnerList) {
+ loadScene(1580);
+ R2_GLOBALS._sceneManager._fadeMode = FADEMODE_GRADUAL;
+ SceneExt::postInit();
+ _field412 = 0;
+
+ _stripManager.setColors(60, 255);
+ _stripManager.setFontNumber(3);
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_seekerSpeaker);
+
+ _sceneMode = 0;
+
+ R2_GLOBALS._player.disableControl();
+ if (R2_INVENTORY.getObjectScene(26) == 1580) {
+ _actor2.postInit();
+ _actor2.setup(1580, 1, 4);
+ _actor2.setPosition(Common::Point(159, 163));
+ _actor2.setDetails(1550, 78, -1, -1, 1, (SceneItem *) NULL);
+ } else {
+ _item1.setDetails(Rect(141, 148, 179, 167), 1550, 79, -1, -1, 1, NULL);
+ }
+
+ if (R2_INVENTORY.getObjectScene(51) == 1580) {
+ _actor3.postInit();
+ _actor3.setup(1580, 1, 1);
+ _actor3.setPosition(Common::Point(124, 108));
+ _actor3.fixPriority(10);
+ _actor3.setDetails(1550, 13, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor1.postInit();
+ _actor1.setup(1580, 1, 3);
+ _actor1.setPosition(Common::Point(124, 96));
+ _actor1.fixPriority(20);
+ } else if (R2_INVENTORY.getObjectScene(28) == 1580) {
+ _actor3.postInit();
+ _actor3.setup(1580, 1, 1);
+ _actor3.setPosition(Common::Point(124, 108));
+ _actor3.fixPriority(10);
+ _actor3.setDetails(1550, 14, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor1.postInit();
+ _actor1.setup(1580, 3, 1);
+ _actor1.setPosition(Common::Point(124, 109));
+ _actor1.fixPriority(20);
+
+ _sceneMode = 10;
+ } else {
+ _item2.setDetails(Rect(69, 29, 177, 108), 1550, 82, -1, -1, 1, NULL);
+ }
+
+ _actor4.postInit();
+ if (R2_INVENTORY.getObjectScene(58) == 0) {
+ _actor4.setup(1580, 5, 1);
+ _actor4.setDetails(1550, 80, -1, -1, 1, (SceneItem *) NULL);
+ } else {
+ _actor4.setup(1580, 5, 6);
+ }
+
+ _actor4.setPosition(Common::Point(216, 108));
+ _actor4.fixPriority(100);
+
+ _actor5.postInit();
+ _actor5.setup(1580, 4, 1);
+ _actor5.setPosition(Common::Point(291, 147));
+ _actor5.fixPriority(100);
+ _actor5.setDetails(1550, 81, -1, -1, 1, (SceneItem *) NULL);
+
+ if (R2_INVENTORY.getObjectScene(23) == 1580) {
+ _actor6.postInit();
+ _actor6.setup(1580, 6, 2);
+ _actor6.setPosition(Common::Point(222, 108));
+ _actor6.fixPriority(50);
+ _actor6.setDetails(1550, 32, -1, 34, 1, (SceneItem *) NULL);
+ }
+
+ if (R2_INVENTORY.getObjectScene(27) == 1580) {
+ _actor7.postInit();
+ _actor7.setup(1580, 6, 1);
+ _actor7.setPosition(Common::Point(195, 108));
+ _actor7.fixPriority(50);
+ _actor7.setDetails(1550, 38, -1, 34, 1, (SceneItem *) NULL);
+ }
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 1580;
+ R2_GLOBALS._player.hide();
+ setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+ _item3.setDetails(Rect(0, 0, 320, 200), 1550, 50, -1, -1, 1, NULL);
+
+}
+
+void Scene1580::signal() {
+ switch (_sceneMode++) {
+ case 10:
+ _actor1.animate(ANIM_MODE_5, this);
+ break;
+ case 11:
+ _actor1.setup(1580, 1, 2);
+ _actor1.setPosition(Common::Point(124, 94));
+
+ if (R2_INVENTORY.getObjectScene(18) != 0) {
+ _arrActor[0].postInit();
+ _arrActor[0].setup(1580, 2, 1);
+ _arrActor[0].setPosition(Common::Point(138, 56));
+ }
+
+ if (R2_INVENTORY.getObjectScene(25) != 0) {
+ _arrActor[1].postInit();
+ _arrActor[1].setup(1580, 2, 2);
+ _arrActor[1].setPosition(Common::Point(140, 66));
+ }
+
+ if (R2_INVENTORY.getObjectScene(27) != 0) {
+ _arrActor[2].postInit();
+ _arrActor[2].setup(1580, 2, 3);
+ _arrActor[2].setPosition(Common::Point(142, 85));
+ }
+
+ if (R2_INVENTORY.getObjectScene(23) != 0) {
+ _arrActor[3].postInit();
+ _arrActor[3].setup(1580, 2, 4);
+ _arrActor[3].setPosition(Common::Point(142, 92));
+ }
+
+ if (R2_INVENTORY.getObjectScene(22) != 0) {
+ _arrActor[4].postInit();
+ _arrActor[4].setup(1580, 2, 5);
+ _arrActor[4].setPosition(Common::Point(108, 54));
+ }
+
+ if (R2_INVENTORY.getObjectScene(26) != 0) {
+ _arrActor[5].postInit();
+ _arrActor[5].setup(1580, 2, 6);
+ _arrActor[5].setPosition(Common::Point(110, 64));
+ }
+
+ if (R2_INVENTORY.getObjectScene(45) != 0) {
+ _arrActor[6].postInit();
+ _arrActor[6].setup(1580, 2, 7);
+ _arrActor[6].setPosition(Common::Point(108, 80));
+ }
+
+ if (R2_INVENTORY.getObjectScene(17) != 0) {
+ _arrActor[7].postInit();
+ _arrActor[7].setup(1580, 2, 8);
+ _arrActor[7].setPosition(Common::Point(111, 92));
+ }
+
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ case 20:
+ R2_GLOBALS._sceneManager.changeScene(1550);
+ break;
+ case 31:
+ R2_GLOBALS._sceneManager.changeScene(1530);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 1625 - Miranda being questioned
+ *
+ *--------------------------------------------------------------------------*/
+Scene1625::Scene1625() {
+ _field412 = 0;
+}
+
+void Scene1625::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field412);
+}
+
+bool Scene1625::Actor7::startAction(CursorType action, Event &event) {
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ Scene1625 *scene = (Scene1625 *)R2_GLOBALS._sceneManager._scene;
+ R2_GLOBALS._player.disableControl();
+
+ scene->_sceneMode = 1631;
+ scene->_actor3.postInit();
+ scene->setAction(&scene->_sequenceManager, scene, 1631, &scene->_actor3, &scene->_actor7, NULL);
+ return true;
+}
+
+void Scene1625::postInit(SceneObjectList *OwnerList) {
+ loadScene(1625);
+ R2_GLOBALS._player._characterIndex = R2_MIRANDA;
+ SceneExt::postInit();
+
+ _stripManager.addSpeaker(&_mirandaSpeaker);
+ _stripManager.addSpeaker(&_tealSpeaker);
+ _stripManager.addSpeaker(&_soldierSpeaker);
+
+ R2_GLOBALS._player.postInit();
+
+ _actor7.postInit();
+ _actor7.setup(1626, 2, 1);
+ _actor7.setPosition(Common::Point(206, 133));
+ _actor7.setDetails(1625, 0, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor5.postInit();
+ _actor5.setup(1625, 8, 1);
+ _actor5.setPosition(Common::Point(190, 131));
+ _actor5.setDetails(1625, 6, -1, 2, 1, (SceneItem *) NULL);
+
+ if (R2_GLOBALS._player._oldCharacterScene[3] == 1625) {
+ if (!R2_GLOBALS.getFlag(83)) {
+ _actor4.postInit();
+ _actor4.setup(1626, 4, 1);
+ _actor4.setPosition(Common::Point(96, 166));
+ _actor4.setDetails(1625, -1, -1, -1, 1, (SceneItem *) NULL);
+ }
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ } else {
+ _actor1.postInit();
+ _actor1.fixPriority(10);
+
+ _actor6.postInit();
+
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 1625;
+ setAction(&_sequenceManager, this, 1625, &_actor1, &_actor6, NULL);
+ }
+
+ R2_GLOBALS._sound1.play(245);
+ _item1.setDetails(Rect(0, 0, 320, 200), 1625, 12, -1, -1, 1, NULL);
+ R2_GLOBALS._player._oldCharacterScene[3] = 1625;
+ R2_GLOBALS._player._characterScene[3] = 1625;
+}
+
+void Scene1625::remove() {
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene1625::signal() {
+ switch (_sceneMode) {
+ case 10:
+ R2_GLOBALS._player.disableControl();
+ _actor4.postInit();
+ _actor4.setDetails(1625, -1, -1, -1, 2, (SceneItem *) NULL);
+ _sceneMode = 1626;
+ setAction(&_sequenceManager, this, 1626, &_actor2, &_actor4, NULL);
+ break;
+ case 12:
+ // TODO: check if OK_BTN_STRING is required
+ MessageDialog::show(DONE_MSG, OK_BTN_STRING);
+ break;
+ case 14:
+ _actor2.postInit();
+ _actor2.setup(1627, 1, 1);
+ _actor2.setPosition(Common::Point(68, 68));
+ _sceneMode = 99;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(831, this);
+ break;
+ case 99:
+ R2_GLOBALS._player.disableControl();
+ switch (_stripManager._field2E8) {
+ case 0:
+ _sceneMode = 1627;
+ setAction(&_sequenceManager, this, 1627, &_actor3, &_actor4, NULL);
+ break;
+ case 1:
+ _sceneMode = 1629;
+ setAction(&_sequenceManager, this, 1629, &_actor2, &_actor5, NULL);
+ break;
+ case 3:
+ R2_GLOBALS._player._oldCharacterScene[3] = 3150;
+ R2_GLOBALS._player._characterScene[3] = 3150;
+ R2_GLOBALS._player._characterIndex = R2_QUINN;
+ R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._player._characterScene[1]);
+ break;
+ case 4:
+ _sceneMode = 1628;
+ _actor2.remove();
+ setAction(&_sequenceManager, this, 1628, &_actor3, &_actor4, NULL);
+ break;
+ case 5:
+ _actor4.postInit();
+ _actor4.setDetails(1625, -1, -1, -1, 2, (SceneItem *) NULL);
+ _sceneMode = 1632;
+ setAction(&_sequenceManager, this, 1632, &_actor4, NULL);
+ break;
+ case 6:
+ _sceneMode = 1633;
+ setAction(&_sequenceManager, this, 1633, &_actor4, NULL);
+ break;
+ case 7:
+ _sceneMode = 1635;
+ setAction(&_sequenceManager, this, 1635, &_actor3, &_actor5, NULL);
+ break;
+ case 8:
+ _actor4.postInit();
+ _actor4.setDetails(1625, -1, -1, -1, 2, (SceneItem *) NULL);
+ _sceneMode = 1634;
+ setAction(&_sequenceManager, this, 1634, &_actor3, &_actor5, NULL);
+ break;
+ case 2:
+ // No break on purpose
+ default:
+ _sceneMode = 1630;
+ _actor2.postInit();
+ setAction(&_sequenceManager, this, 1630, &_actor1, &_actor6, NULL);
+ break;
+ }
+ _field412 = _stripManager._field2E8;
+ _stripManager._field2E8 = 0;
+ break;
+ case 1625:
+ _actor2.postInit();
+ _actor2.setup(1627, 1, 1);
+ _actor2.setPosition(Common::Point(68, 68));
+ _sceneMode = 10;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(800, this);
+ break;
+ case 1626:
+ _actor2.setup(1627, 1, 1);
+ _actor2.setPosition(Common::Point(68, 68));
+ _actor2.show();
+
+ _actor3.postInit();
+ _actor3.setup(1627, 3, 1);
+ _actor3.setPosition(Common::Point(196, 65));
+
+ _sceneMode = 99;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(832, this);
+ break;
+ case 1627:
+ _actor3.setup(1627, 3, 1);
+ _actor3.setPosition(Common::Point(196, 65));
+ _actor3.show();
+
+ _sceneMode = 99;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(833, this);
+ break;
+ case 1628:
+ R2_GLOBALS.setFlag(83);
+ _actor2.postInit();
+ _actor2.setup(1627, 1, 1);
+ _actor2.setPosition(Common::Point(68, 68));
+
+ _actor3.setup(1627, 3, 1);
+ _actor3.setPosition(Common::Point(196, 65));
+ _actor3.show();
+
+ _sceneMode = 99;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(834, this);
+ break;
+ case 1629:
+ _actor2.setup(1627, 1, 1);
+ _actor2.setPosition(Common::Point(68, 68));
+ _actor2.show();
+
+ _sceneMode = 99;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(805, this);
+ break;
+ case 1630:
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = true;
+ break;
+ case 1631:
+ _actor3.setup(1627, 3, 1);
+ _actor3.setPosition(Common::Point(196, 65));
+ _actor3.show();
+
+ _actor7.remove();
+
+ _actor1.postInit();
+ _actor1.fixPriority(10);
+
+ _actor6.postInit();
+ warning("_actor6._actorName = \"arm\";");
+
+ R2_INVENTORY.setObjectScene(40, 3);
+ _sceneMode = 14;
+
+ setAction(&_sequenceManager, this, 1625, &_actor1, &_actor6, NULL);
+ break;
+ case 1632:
+ _actor2.setup(1627, 1, 1);
+ _actor2.setPosition(Common::Point(68, 68));
+ _actor2.show();
+
+ _sceneMode = 99;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(835, this);
+ break;
+ case 1633:
+ _actor4.remove();
+ _sceneMode = 99;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(818, this);
+ break;
+ case 1634:
+ _sceneMode = 99;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(836, this);
+ break;
+ case 1635:
+ _actor3.setup(1627, 3, 1);
+ _actor3.setPosition(Common::Point(196, 65));
+ _actor3.show();
+
+ _sceneMode = 99;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(818, this);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene1625::process(Event &event) {
+ if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE))
+ event.handled = true;
+ else
+ Scene::process(event);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 1700 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene1700::Scene1700() {
+ _field77A = 0;
+ _field77C = 0;
+}
+
+void Scene1700::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field77A);
+ s.syncAsSint16LE(_field77C);
+}
+
+bool Scene1700::Item2::startAction(CursorType action, Event &event) {
+ // The original contains a debug trace. It's currently skipped.
+ // TODO: either add the debug trace, or remove this function and associated class
+ return SceneHotspot::startAction(action, event);
+}
+
+bool Scene1700::Actor11::startAction(CursorType action, Event &event) {
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._v558B6.set(80, 0, 240, 200);
+ scene->_sceneMode = 4;
+
+ Common::Point pt(271, 90);
+ PlayerMover *mover = new PlayerMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+
+ return true;
+}
+
+bool Scene1700::Actor12::startAction(CursorType action, Event &event) {
+ if (action != CURSOR_TALK)
+ return SceneActor::startAction(action, event);
+
+ Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene;
+ scene->_sceneMode = 30;
+ scene->signal();
+
+ return true;
+}
+
+void Scene1700::Exit1::changeScene() {
+ Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._player.disableControl();
+ _moving = false;
+ scene->_sceneMode = 1;
+
+ Common::Point pt(R2_GLOBALS._player._position.x, 0);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene1700::Exit2::changeScene() {
+ Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._player.disableControl();
+ _moving = false;
+ scene->_sceneMode = 2;
+
+ Common::Point pt(R2_GLOBALS._player._position.x, 170);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene1700::Exit3::changeScene() {
+ Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._player.disableControl();
+ _moving = false;
+ scene->_sceneMode = 6;
+
+ Common::Point pt(0, R2_GLOBALS._player._position.y);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene1700::subAF3F8() {
+ Rect tmpRect;
+ R2_GLOBALS._walkRegions.load(1700);
+
+ _actor3.remove();
+ _actor4.remove();
+ _actor5.remove();
+ _actor6.remove();
+ _actor7.remove();
+ _actor8.remove();
+ _actor11.remove();
+
+ if (_sceneMode != 40) {
+ _actor9.remove();
+ _actor10.remove();
+ }
+
+ warning("tmpRect = _v5589E;");
+ warning("Mouse_hideIfNeeded");
+ warning("set_pane_p(_paneNumber);");
+ warning("Big loop calling gfx_draw_slice_p");
+
+ if (_field77A == 0)
+ _field77A = 1;
+ else
+ _field77A = 0;
+
+ warning("set_pane_p(_paneNumber);");
+
+ if ((_sceneMode != 40) && (R2_GLOBALS._v565F6 != 0)){
+ _actor9.postInit();
+ _actor9.setup(1701, 1, 1);
+ _actor9.setPosition(Common::Point(220, 137));
+ _actor9.setDetails(1700, 6, -1, -1, 2, (SceneItem *) NULL);
+ R2_GLOBALS._walkRegions.enableRegion(2);
+ R2_GLOBALS._walkRegions.enableRegion(12);
+ }
+
+ if ((R2_GLOBALS._v565F6 + 2) % 4 == 0) {
+ _actor3.postInit();
+ _actor3.setup(1700, 1, 1);
+ _actor3.setPosition(Common::Point(222, 82));
+ _actor3.setDetails(100, -1, -1, -1, 2, (SceneItem *) NULL);
+
+ _actor5.postInit();
+ _actor5.setup(1700, 2, 1);
+ _actor5.setPosition(Common::Point(177, 82));
+ _actor5.fixPriority(0);
+
+ _actor6.postInit();
+ _actor6.setup(1700, 2, 2);
+ _actor6.setPosition(Common::Point(332, 96));
+ _actor6.fixPriority(0);
+
+ _actor4.postInit();
+ _actor4.setup(1700, 1, 2);
+ _actor4.setPosition(Common::Point(424, 84));
+
+ R2_GLOBALS._walkRegions.enableRegion(11);
+ }
+
+ if ((R2_GLOBALS._v565F6 + 399) % 800 == 0) {
+ _actor7.postInit();
+ _actor7.setup(1700, 3, 2);
+ _actor7.setPosition(Common::Point(51, 141));
+ _actor7.fixPriority(0);
+ _actor7.setDetails(100, -1, -1, -1, 2, (SceneItem *) NULL);
+
+ _exit3._enabled = true;
+ } else {
+ R2_GLOBALS._walkRegions.enableRegion(1);
+ _exit3._enabled = false;
+ }
+
+ if ( ((!R2_GLOBALS.getFlag(15)) && ((R2_GLOBALS._v565F6 == 25) || (R2_GLOBALS._v565F6 == -3)))
+ || ((R2_GLOBALS.getFlag(15)) && (R2_GLOBALS._v565F6 == R2_GLOBALS._v565FA))
+ ) {
+ R2_GLOBALS._v565FA = R2_GLOBALS._v565F6;
+ if (!R2_GLOBALS.getFlag(15))
+ _field77C = 1;
+
+ _actor11.postInit();
+ _actor11.setup(1700, 3, 1);
+ _actor11.setPosition(Common::Point(338, 150));
+ _actor11.setDetails(1700, 9, -1, -1, 2, (SceneItem *) NULL);
+ _actor11.fixPriority(15);
+
+ _actor8.postInit();
+ _actor8.setup(1700, 4, 1);
+ _actor8.setPosition(Common::Point(312, 106));
+ _actor8.fixPriority(130);
+ }
+}
+
+void Scene1700::postInit(SceneObjectList *OwnerList) {
+ loadScene(1700);
+ SceneExt::postInit();
+ if (R2_GLOBALS._sceneManager._previousScene == -1)
+ R2_GLOBALS._sceneManager._previousScene = 1530;
+
+ scalePalette(65, 65, 65);
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_seekerSpeaker);
+
+ _field77A = 0;
+ _field77C = 0;
+
+ _exit1.setDetails(Rect(94, 0, 319, 12), EXITCURSOR_N, 1700);
+ _exit2.setDetails(Rect(0, 161, 319, 168), EXITCURSOR_S, 1700);
+ _exit3.setDetails(Rect(0, 0, 2, 138), EXITCURSOR_W, 1800);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.setPosition(Common::Point(0, 0));
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ R2_GLOBALS._player.setVisage(1501);
+ R2_GLOBALS._player._moveDiff = Common::Point(2, 1);
+ } else {
+ R2_GLOBALS._player.setVisage(1506);
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 1);
+ }
+
+ _actor12.postInit();
+ _actor12.animate(ANIM_MODE_1, NULL);
+ _actor12.setObjectWrapper(new SceneObjectWrapper());
+
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ _actor12.setVisage(1506);
+ _actor12._moveDiff = Common::Point(3, 1);
+ _actor12.setDetails(9002, 1, -1, -1, 1, (SceneItem *) NULL);
+ } else {
+ _actor12.setVisage(1501);
+ _actor12._moveDiff = Common::Point(2, 1);
+ _actor12.setDetails(9001, 1, -1, -1, 1, (SceneItem *) NULL);
+ }
+
+ R2_GLOBALS._sound1.play(134);
+
+ _actor1.postInit();
+ _actor1.fixPriority(10);
+
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+ _actor1.setVisage(1112);
+ else
+ _actor1.setVisage(1111);
+
+ _actor1._effect = 5;
+ _actor1._field9C = _field312;
+ R2_GLOBALS._player._linkedActor = &_actor1;
+
+ _actor2.postInit();
+ _actor2.fixPriority(10);
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+ _actor2.setVisage(1111);
+ else
+ _actor2.setVisage(1112);
+
+ _actor2._effect = 5;
+ _actor2._field9C = _field312;
+ _actor12._linkedActor = &_actor2;
+
+ R2_GLOBALS._sound1.play(134);
+
+ switch (R2_GLOBALS._sceneManager._previousScene) {
+ case 1530:
+ R2_GLOBALS._player._characterIndex = R2_QUINN;
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._player.hide();
+ _actor12.hide();
+
+ _actor10.postInit();
+ warning("_actor10._actorName = \"hatch\";");
+ _actor10.hide();
+
+ _actor9.postInit();
+ _actor9.setup(1701, 1, 1);
+ _actor9.setPosition(Common::Point(220, 137));
+ _actor9.setDetails(1700, 6, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor1.hide();
+ _actor2.hide();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(539, this);
+ _sceneMode = 40;
+ break;
+ case 1750: {
+ R2_GLOBALS._player.setPosition(Common::Point(282, 121));
+ _actor12.setPosition(Common::Point(282, 139));
+ _sceneMode = 8;
+ Common::Point pt(262, 101);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ Common::Point pt2(262, 119);
+ NpcMover *mover2 = new NpcMover();
+ _actor12.addMover(mover2, &pt2, this);
+ }
+ break;
+ case 1800: {
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._player.setPosition(Common::Point(0, 86));
+ _actor12.setPosition(Common::Point(0, 64));
+ _sceneMode = 7;
+ R2_GLOBALS._player.setObjectWrapper(NULL);
+ R2_GLOBALS._player._strip = 1;
+ Common::Point pt(64, 86);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ _actor12.setObjectWrapper(NULL);
+ _actor12._strip = 1;
+ Common::Point pt2(77, 64);
+ NpcMover *mover2 = new NpcMover();
+ _actor12.addMover(mover2, &pt2, NULL);
+ }
+ break;
+ default:
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ R2_GLOBALS._player.setPosition(Common::Point(109, 160));
+ _actor12.setPosition(Common::Point(156, 160));
+ R2_GLOBALS._walkRegions.enableRegion(15);
+ } else {
+ R2_GLOBALS._player.setPosition(Common::Point(156, 160));
+ _actor12.setPosition(Common::Point(109, 160));
+ R2_GLOBALS._walkRegions.enableRegion(17);
+ }
+ _sceneMode = 50;
+ setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+ break;
+ }
+ R2_GLOBALS._player._characterScene[1] = 1700;
+ R2_GLOBALS._player._characterScene[2] = 1700;
+ R2_GLOBALS._player._oldCharacterScene[1] = 1700;
+ R2_GLOBALS._player._oldCharacterScene[2] = 1700;
+
+ R2_GLOBALS._v558B6.set(20, 0, 320, 200);
+ subAF3F8();
+ _item1.setDetails(1, 1700, 3, -1, -1);
+ _item2.setDetails(Rect(0, 0, 480, 200), 1700, 0, -1, -1, 1, NULL);
+}
+
+void Scene1700::remove() {
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene1700::signal() {
+ switch (_sceneMode) {
+ case 1: {
+ _sceneMode = 3;
+ if ((R2_GLOBALS._v565F6 < 2400) && (R2_GLOBALS._v565F6 >= 0))
+ ++R2_GLOBALS._v565F6;
+ subAF3F8();
+ R2_GLOBALS._player.setPosition(Common::Point(235 - (((((235 - R2_GLOBALS._player._position.x) * 100) / 103) * 167) / 100), 170));
+ Common::Point pt(R2_GLOBALS._player._position.x, 160);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+
+ if (R2_GLOBALS._player._position.x < 132) {
+ _actor12.setPosition(Common::Point(156, 170));
+ Common::Point pt2(156, 160);
+ NpcMover *mover2 = new NpcMover();
+ _actor12.addMover(mover2, &pt2, NULL);
+ R2_GLOBALS._walkRegions.enableRegion(15);
+ } else {
+ _actor12.setPosition(Common::Point(109, 170));
+ Common::Point pt3(109, 160);
+ NpcMover *mover3 = new NpcMover();
+ _actor12.addMover(mover3, &pt3, NULL);
+ R2_GLOBALS._walkRegions.enableRegion(17);
+ }
+ }
+ break;
+ case 2: {
+ _sceneMode = 3;
+ if ((R2_GLOBALS._v565F6 > -2400) && (R2_GLOBALS._v565F6 < 0))
+ R2_GLOBALS._v565F6--;
+ subAF3F8();
+ R2_GLOBALS._player.setPosition(Common::Point(235 - (((((235 - R2_GLOBALS._player._position.x) * 100) / 167) * 103) / 100), 0));
+ Common::Point pt(R2_GLOBALS._player._position.x, 10);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+
+ if (R2_GLOBALS._player._position.x >= 171) {
+ _actor12.setPosition(Common::Point(155, 0));
+ Common::Point pt2(155, 10);
+ NpcMover *mover2 = new NpcMover();
+ _actor12.addMover(mover2, &pt2, NULL);
+ R2_GLOBALS._walkRegions.enableRegion(15);
+ } else {
+ _actor12.setPosition(Common::Point(188, 0));
+ Common::Point pt3(188, 10);
+ NpcMover *mover3 = new NpcMover();
+ _actor12.addMover(mover3, &pt3, NULL);
+ R2_GLOBALS._walkRegions.enableRegion(17);
+ }
+ }
+ break;
+ case 3:
+ if (_field77C == 0) {
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ } else {
+ R2_GLOBALS.setFlag(15);
+ _field77C = 0;
+ _sceneMode = 31;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+ _stripManager.start(542, this);
+ else
+ _stripManager.start(543, this);
+ }
+ break;
+ case 4: {
+ _sceneMode = 5;
+ Common::Point pt(271, 90);
+ PlayerMover *mover = new PlayerMover();
+ _actor12.addMover(mover, &pt, NULL);
+ if (R2_GLOBALS._player._characterIndex == 1)
+ setAction(&_sequenceManager, this, 1700, &R2_GLOBALS._player, &_actor8, NULL);
+ else
+ setAction(&_sequenceManager, this, 1701, &R2_GLOBALS._player, &_actor8, NULL);
+ }
+ break;
+ case 5:
+ R2_GLOBALS._sceneManager.changeScene(1750);
+ break;
+ case 6:
+ R2_GLOBALS._sceneManager.changeScene(1800);
+ break;
+ case 7:
+ R2_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+ R2_GLOBALS._player._strip = 1;
+ _actor12.setObjectWrapper(new SceneObjectWrapper());
+ _actor12._strip = 1;
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ R2_GLOBALS._walkRegions.enableRegion(14);
+ break;
+ case 8:
+ R2_GLOBALS._player._strip = 2;
+ _actor12._strip = 1;
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ R2_GLOBALS._walkRegions.enableRegion(12);
+ break;
+ case 30:
+ _sceneMode = 31;
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+ _stripManager.start(540, this);
+ else
+ _stripManager.start(541, this);
+ break;
+ case 31:
+ R2_GLOBALS._v56AAB = 0;
+ R2_GLOBALS._player.enableControl(CURSOR_TALK);
+ break;
+ case 40:
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 1704;
+ setAction(&_sequenceManager, this, 1704, &R2_GLOBALS._player, &_actor12, &_actor10, &_actor9, &_actor1, &_actor2, NULL);
+ break;
+ case 50:
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+ R2_GLOBALS._walkRegions.enableRegion(15);
+ else
+ R2_GLOBALS._walkRegions.enableRegion(17);
+
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 1704:
+ R2_GLOBALS._sound1.play(134);
+ R2_GLOBALS._walkRegions.enableRegion(15);
+ R2_GLOBALS._walkRegions.enableRegion(2);
+ R2_GLOBALS._walkRegions.enableRegion(12);
+ R2_GLOBALS._player.fixPriority(-1);
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 1750 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene1750::Actor4::Actor4() {
+ _fieldA4 = 0;
+ _fieldA6 = 0;
+ _fieldA8 = 0;
+ _fieldAA = 0;
+ _fieldAC = 0;
+ _fieldAE = 0;
+}
+
+void Scene1750::Actor4::synchronize(Serializer &s) {
+ SceneActor::synchronize(s);
+
+ s.syncAsSint16LE(_fieldA4);
+ s.syncAsSint16LE(_fieldA6);
+ s.syncAsSint16LE(_fieldA8);
+ s.syncAsSint16LE(_fieldAA);
+ s.syncAsSint16LE(_fieldAC);
+ s.syncAsSint16LE(_fieldAE);
+}
+
+Scene1750::Actor5::Actor5() {
+ _fieldA4 = 0;
+}
+
+void Scene1750::Actor5::synchronize(Serializer &s) {
+ SceneActor::synchronize(s);
+
+ s.syncAsSint16LE(_fieldA4);
+}
+
+Scene1750::Scene1750() {
+ _field412 = 0;
+ _field413 = 0;
+ _field415 = 0;
+ _field417 = 0;
+ _field419 = 0;
+ _field41B = 0;
+ _field41D = 0;
+}
+
+void Scene1750::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ SYNC_POINTER(_rotation);
+
+ s.syncAsSint16LE(_field412);
+ s.syncAsSint16LE(_field413);
+ s.syncAsSint16LE(_field415);
+ s.syncAsSint16LE(_field417);
+ s.syncAsSint16LE(_field419);
+ s.syncAsSint16LE(_field41B);
+ s.syncAsSint16LE(_field41D);
+}
+
+void Scene1750::Actor4::subB1A76(int arg1, int arg2, int arg3, int arg4, int arg5) {
+ _fieldA4 = arg1;
+ _fieldAE = 0;
+ _fieldA6 = arg2;
+ _fieldA8 = arg3;
+ _fieldAA = arg4;
+ _fieldAC = arg5;
+
+ postInit();
+ setup(1750, 1, 1);
+ fixPriority(255);
+ setPosition(Common::Point(_fieldA6, _fieldA8 + ((_fieldAA * (arg1 - 1)) / (_fieldAC - 1))));
+}
+
+void Scene1750::Actor4::subB1B27() {
+ Scene1750 *scene = (Scene1750 *)R2_GLOBALS._sceneManager._scene;
+
+ int tmpVar = (_fieldAA / (_fieldAC - 1)) / 2;
+ int tmpVar2 = ((_position.y - _fieldA8 + tmpVar) * _fieldAC) / (_fieldAA + 2 * tmpVar);
+
+ setPosition(Common::Point(_fieldA6, _fieldA8 + ((_fieldAA * tmpVar2) / (_fieldAC - 1))));
+ scene->_field415 = scene->_field412 * tmpVar2;
+}
+
+void Scene1750::Actor4::remove() {
+ // Function kept to match IDA. Could be removed.
+ SceneActor::remove();
+}
+
+void Scene1750::Actor4::process(Event &event) {
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE) && (_bounds.contains(event.mousePos))) {
+ _fieldAE = 1;
+ event.eventType = EVENT_NONE;
+ }
+
+ if ((event.eventType == EVENT_BUTTON_UP) && (_fieldAE != 0)) {
+ _fieldAE = 0;
+ event.handled = true;
+ addMover(NULL);
+ subB1B27();
+ }
+
+ if (_fieldAE != 0) {
+ event.handled = true;
+ if (event.mousePos.y >= _fieldA8) {
+ if (_fieldA8 + _fieldAA >= event.mousePos.y)
+ setPosition(Common::Point(_fieldA6, event.mousePos.y));
+ else
+ setPosition(Common::Point(_fieldA6, _fieldA8 + _fieldAA));
+ } else {
+ setPosition(Common::Point(_fieldA6, _fieldA8));
+ }
+ }
+}
+
+bool Scene1750::Actor4::startAction(CursorType action, Event &event) {
+ if (action == CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ return false;
+}
+
+bool Scene1750::Actor5::startAction(CursorType action, Event &event) {
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ Scene1750 *scene = (Scene1750 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_fieldA4) {
+ case 1:
+ show();
+ scene->_actor6.hide();
+ if (scene->_field415 < 0)
+ scene->_field415 ^= 0xFFFE;
+ scene->_field412 = 1;
+ break;
+ case 2:
+ show();
+ scene->_actor5.hide();
+ if (scene->_field415 > 0)
+ scene->_field415 ^= 0xFFFE;
+ scene->_field412 = -1;
+ break;
+ case 3:
+ if (scene->_rotation->_idxChange == 0) {
+ show();
+ R2_GLOBALS._sceneManager.changeScene(1700);
+ } else {
+ scene->_field415 = 0;
+ scene->_actor4._moveRate = 20;
+ scene->_actor5._moveDiff.y = 1;
+ Common::Point pt(286, 143);
+ NpcMover *mover = new NpcMover();
+ scene->_actor4.addMover(mover, &pt, NULL);
+ }
+ default:
+ break;
+ }
+
+ return true;
+}
+
+void Scene1750::postInit(SceneObjectList *OwnerList) {
+ loadScene(1750);
+ R2_GLOBALS._sound1.play(115);
+ R2_GLOBALS._uiElements._active = false;
+ R2_GLOBALS._v5589E.set(0, 0, 320, 200);
+ SceneExt::postInit();
+
+ R2_GLOBALS._player._characterScene[1] = 1750;
+ R2_GLOBALS._player._characterScene[2] = 1750;
+ R2_GLOBALS._player._oldCharacterScene[1] = 1750;
+ R2_GLOBALS._player._oldCharacterScene[2] = 1750;
+
+ _rotation = R2_GLOBALS._scenePalette.addRotation(224, 254, 1);
+ _rotation->setDelay(0);
+ _rotation->_idxChange = 0;
+ _rotation->_countdown = 2;
+
+ switch ((R2_GLOBALS._v565F6 + 2) % 4) {
+ case 0:
+ _rotation->_currIndex = 247;
+ break;
+ case 1:
+ _rotation->_currIndex = 235;
+ break;
+ case 2:
+ _rotation->_currIndex = 239;
+ break;
+ case 3:
+ _rotation->_currIndex = 243;
+ break;
+ default:
+ break;
+ }
+
+ byte tmpPal[768];
+
+ for (int i = 224; i < 255; i++) {
+ int tmpIndex = _rotation->_currIndex - 224;
+ if (tmpIndex > 254)
+ tmpIndex -= 31;
+ tmpPal[3 * i] = R2_GLOBALS._scenePalette._palette[3 * tmpIndex];
+ tmpPal[(3 * i) + 1] = R2_GLOBALS._scenePalette._palette[(3 * tmpIndex) + 1];
+ tmpPal[(3 * i) + 2] = R2_GLOBALS._scenePalette._palette[(3 * tmpIndex) + 2];
+ }
+
+ for (int i = 224; i < 255; i++) {
+ R2_GLOBALS._scenePalette._palette[3 * i] = tmpPal[3 * i];
+ R2_GLOBALS._scenePalette._palette[(3 * i) + 1] = tmpPal[(3 * i) + 1];
+ R2_GLOBALS._scenePalette._palette[(3 * i) + 2] = tmpPal[(3 * i) + 2];
+ }
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.hide();
+ R2_GLOBALS._player.enableControl();
+
+ _actor3.postInit();
+ _actor3.setup(1750, 3, 1);
+ _actor3.setPosition(Common::Point(49, 185));
+ _actor3.fixPriority(7);
+ _actor3.setDetails(1750, 30, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor1.postInit();
+ _actor1.setup(1750, 2, 1);
+ _actor1.setPosition(Common::Point(35, ((_rotation->_currIndex - 218) % 4) + ((R2_GLOBALS._v565F6 % 800) * 4) - 1440));
+ _actor1.fixPriority(8);
+
+ _actor2.postInit();
+ _actor2.setup(1750, 1, 4);
+
+ int tmpVar = abs(_actor1._position.y - 158) / 100;
+
+ if (tmpVar >= 8)
+ _actor2.hide();
+ else if (_actor1._position.y <= 158)
+ _actor2.setPosition(Common::Point(137, (tmpVar * 7) + 122));
+ else
+ _actor2.setPosition(Common::Point(148, (tmpVar * 7) + 122));
+
+ _actor4.subB1A76(1, 286, 143, 41, 15);
+ _actor4.setDetails(1750, 24, 1, -1, 1, (SceneItem *) NULL);
+
+ _actor5.postInit();
+ _actor5._fieldA4 = 1;
+ _actor5.setup(1750, 1, 2);
+ _actor5.setPosition(Common::Point(192, 140));
+ _actor5.setDetails(1750, 18, 1, -1, 1, (SceneItem *) NULL);
+
+ _actor6.postInit();
+ _actor6._fieldA4 = 2;
+ _actor6.setup(1750, 1, 3);
+ _actor6.setPosition(Common::Point(192, 163));
+ _actor6.setDetails(1750, 18, 1, -1, 1, (SceneItem *) NULL);
+ _actor6.hide();
+
+ _actor7.postInit();
+ _actor7._fieldA4 = 3;
+ _actor7.setup(1750, 1, 5);
+ _actor7.setPosition(Common::Point(230, 183));
+ _actor7.setDetails(1750, 27, 1, -1, 1, (SceneItem *) NULL);
+
+ _field412 = 1;
+ _field417 = 0;
+ _field413 = 0;
+ _field415 = 0;
+ _field419 = ((_rotation->_currIndex - 218) / 4) % 4;
+
+ _item2.setDetails(Rect(129, 112, 155, 175), 1750, 21, -1, -1, 1, NULL);
+ _item3.setDetails(Rect(93, 122, 126, 172), 1750, 15, -1, -1, 1, NULL);
+ _item4.setDetails(Rect(3, 3, 157, 99), 1750, 9, -1, -1, 1, NULL);
+ _item5.setDetails(Rect(162, 3, 316, 99), 1750, 12, -1, -1, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 320, 200), 1750, 6, 1, -1, 1, NULL);
+}
+
+void Scene1750::remove() {
+ _rotation->remove();
+
+ if (R2_GLOBALS._v565F6 == 2400)
+ R2_GLOBALS._v565F6 = 2399;
+
+ if (R2_GLOBALS._v565F6 == -2400)
+ R2_GLOBALS._v565F6 = -2399;
+
+ R2_GLOBALS._v565FA = R2_GLOBALS._v565F6;
+
+ SceneExt::remove();
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ R2_GLOBALS._v5589E.top = 3;
+ R2_GLOBALS._v5589E.bottom = 168;
+ R2_GLOBALS._uiElements._active = true;
+}
+
+void Scene1750::signal() {
+ R2_GLOBALS._player.enableControl();
+}
+
+void Scene1750::process(Event &event) {
+ Scene::process(event);
+ if (!event.handled)
+ _actor4.process(event);
+}
+
+void Scene1750::dispatch() {}
+
+/*--------------------------------------------------------------------------
+ * Scene 1800 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene1800::Scene1800() {
+ _field412 = 0;
+}
+
+void Scene1800::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field412);
+}
+
+bool Scene1800::Hotspot5::startAction(CursorType action, Event &event) {
+ if ((action != R2_COM_SCANNER) && (action != R2_COM_SCANNER_2))
+ return false;
+
+ Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ if (R2_GLOBALS._v565F6 == 1201) {
+ scene->_stripManager.start(548, this);
+ } else if (R2_GLOBALS.getFlag(66)) {
+ return false;
+ } else {
+ scene->_stripManager.start(546, this);
+ }
+ } else {
+ if (R2_GLOBALS._v565F6 == 1201) {
+ scene->_stripManager.start(549, this);
+ } else if (R2_GLOBALS.getFlag(66)) {
+ return false;
+ } else {
+ scene->_stripManager.start(547, this);
+ }
+ }
+
+ R2_GLOBALS.setFlag(66);
+ return true;
+}
+
+bool Scene1800::Actor6::startAction(CursorType action, Event &event) {
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ if (!R2_GLOBALS.getFlag(14))
+ return false;
+
+ if (R2_GLOBALS._player._characterIndex != R2_QUINN)
+ return SceneActor::startAction(action, event);
+
+ Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene;
+ R2_GLOBALS._player.disableControl();
+
+ if (_frame == 1) {
+ R2_GLOBALS.setFlag(64);
+ scene->_sceneMode = 1810;
+ scene->setAction(&scene->_sequenceManager, scene, 1810, &R2_GLOBALS._player, &scene->_actor6, &scene->_actor4, &scene->_actor5, NULL);
+ } else {
+ R2_GLOBALS.clearFlag(64);
+ scene->_sceneMode = 1811;
+ scene->setAction(&scene->_sequenceManager, scene, 1811, &R2_GLOBALS._player, &scene->_actor6, &scene->_actor4, &scene->_actor5, NULL);
+ }
+ return true;
+}
+
+bool Scene1800::Actor7::startAction(CursorType action, Event &event) {
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene;
+
+ if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
+ R2_GLOBALS._player.disableControl();
+ if (scene->_field412 >= 2) {
+ if (R2_GLOBALS.getFlag(14)) {
+ scene->_sceneMode = 1809;
+ scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_actor7, NULL);
+ R2_GLOBALS.clearFlag(14);
+ } else {
+ scene->_sceneMode = 1808;
+ scene->setAction(&scene->_sequenceManager, scene, 1808, &R2_GLOBALS._player, &scene->_actor7, NULL);
+ R2_GLOBALS.setFlag(14);
+ }
+ } else {
+ scene->_sceneMode = 1813;
+ scene->setAction(&scene->_sequenceManager, scene, 1813, &R2_GLOBALS._player, NULL);
+ }
+ } else if (R2_GLOBALS.getFlag(14)) {
+ return SceneActor::startAction(action, event);
+ } else {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1812;
+ scene->setAction(&scene->_sequenceManager, scene, 1812, &R2_GLOBALS._player, NULL);
+ }
+
+ return true;
+}
+
+bool Scene1800::Actor8::startAction(CursorType action, Event &event) {
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene;
+
+ if (_position.x < 160) {
+ if (scene->_actor4._frame == 1) {
+ return SceneActor::startAction(action, event);
+ } else {
+ R2_GLOBALS.setFlag(29);
+ R2_GLOBALS._player.disableControl();
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ if (R2_GLOBALS.getFlag(14)) {
+ scene->_sceneMode = 1804;
+ scene->setAction(&scene->_sequenceManager, scene, 1804, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor8, NULL);
+ } else {
+ scene->_sceneMode = 1;
+ scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor7, NULL);
+ R2_GLOBALS.clearFlag(14);
+ }
+ } else {
+ if (R2_GLOBALS.getFlag(14)) {
+ scene->_sceneMode = 1;
+ scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_actor7, NULL);
+ R2_GLOBALS.clearFlag(14);
+ } else {
+ scene->_sceneMode = 1805;
+ scene->setAction(&scene->_sequenceManager, scene, 1805, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor8, NULL);
+ }
+ }
+ }
+ } else {
+ if (scene->_actor4._frame == 1) {
+ return SceneActor::startAction(action, event);
+ } else {
+ R2_GLOBALS.clearFlag(29);
+ R2_GLOBALS._player.disableControl();
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ if (R2_GLOBALS.getFlag(14)) {
+ scene->_sceneMode = 2;
+ scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor7, NULL);
+ R2_GLOBALS.clearFlag(14);
+ } else {
+ scene->_sceneMode = 1806;
+ scene->setAction(&scene->_sequenceManager, scene, 1806, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor9, NULL);
+ }
+ } else {
+ if (R2_GLOBALS.getFlag(14)) {
+ scene->_sceneMode = 2;
+ scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_actor7, NULL);
+ R2_GLOBALS.clearFlag(14);
+ } else {
+ scene->_sceneMode = 1807;
+ scene->setAction(&scene->_sequenceManager, scene, 1807, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor9, NULL);
+ }
+ }
+ }
+ }
+
+ return true;
+}
+
+void Scene1800::Exit1::changeScene() {
+ Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ R2_GLOBALS._player.disableControl();
+ if (R2_GLOBALS.getFlag(14)) {
+ scene->_sceneMode = 3;
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+ scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_actor7, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager, scene, 1809, &scene->_actor2, &scene->_actor7, NULL);
+ R2_GLOBALS.clearFlag(14);
+ } else {
+ scene->_sceneMode = 1802;
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+ scene->setAction(&scene->_sequenceManager, scene, 1802, &R2_GLOBALS._player, &scene->_actor2, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager, scene, 1802, &R2_GLOBALS._player, &scene->_actor2, NULL);
+ }
+}
+
+void Scene1800::postInit(SceneObjectList *OwnerList) {
+ loadScene(1800);
+ SceneExt::postInit();
+ R2_GLOBALS._sound1.play(116);
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_seekerSpeaker);
+
+ if (R2_GLOBALS._sceneManager._previousScene == -1)
+ R2_GLOBALS._v565F6 = 1201;
+
+ if (R2_GLOBALS._v565F6 == 1201)
+ _field412 = 2;
+ else
+ _field412 = 0;
+
+ scalePalette(65, 65, 65);
+ _exit1.setDetails(Rect(0, 160, 319, 168), EXITCURSOR_S, 1800);
+ _item5.setDetails(Rect(0, 0, 320, 200), -1, -1, -1, -1, 1, NULL);
+
+ _actor6.postInit();
+ _actor6.setup(1801, 4, 1);
+ _actor6.setPosition(Common::Point(170, 24));
+ _actor6.setDetails(1800, 13, 14, 15, 1, (SceneItem *) NULL);
+
+ _actor7.postInit();
+ _actor7.setup(1801, 3, 1);
+ _actor7.setPosition(Common::Point(160, 139));
+ _actor7.setDetails(1800, 6, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor8.postInit();
+ _actor8.setup(1800, 1, 1);
+ _actor8.setPosition(Common::Point(110, 78));
+ _actor8.fixPriority(135);
+ _actor8.setDetails(1800, 20, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor9.postInit();
+ _actor9.setup(1800, 2, 1);
+ _actor9.setPosition(Common::Point(209, 78));
+ _actor9.fixPriority(135);
+ _actor9.setDetails(1800, 20, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor4.postInit();
+ if ((_field412 != 1) && (_field412 != 3) && (!R2_GLOBALS.getFlag(64)))
+ _actor4.setup(1801, 2, 1);
+ else
+ _actor4.setup(1801, 2, 10);
+ _actor4.setPosition(Common::Point(76, 142));
+ _actor4.setDetails(1800, 3, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor5.postInit();
+ if ((_field412 != 1) && (_field412 != 3) && (!R2_GLOBALS.getFlag(64)))
+ _actor5.setup(1801, 1, 1);
+ else
+ _actor5.setup(1801, 1, 10);
+ _actor5.setPosition(Common::Point(243, 142));
+ _actor5.setDetails(1800, 3, -1, -1, 1, (SceneItem *) NULL);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ if (R2_GLOBALS.getFlag(14)) {
+ R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL);
+ R2_GLOBALS._player.setObjectWrapper(NULL);
+ R2_GLOBALS._player.setup(1801, 5, 12);
+ R2_GLOBALS._player.setPosition(Common::Point(160, 139));
+ R2_GLOBALS._walkRegions.enableRegion(9);
+ _actor7.hide();
+ } else {
+ R2_GLOBALS._player.setVisage(1507);
+ }
+ R2_GLOBALS._player._moveDiff = Common::Point(4, 2);
+ } else {
+ R2_GLOBALS._player.setVisage(1503);
+ R2_GLOBALS._player._moveDiff = Common::Point(2, 2);
+ }
+
+ _actor2.postInit();
+ _actor2.animate(ANIM_MODE_1, NULL);
+ _actor2.setObjectWrapper(new SceneObjectWrapper());
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ if (R2_GLOBALS.getFlag(14)) {
+ _actor2.animate(ANIM_MODE_NONE, NULL);
+ _actor2.setObjectWrapper(NULL);
+ _actor2.setup(1801, 5, 12);
+
+ R2_GLOBALS._walkRegions.enableRegion(9);
+ _actor7.hide();
+ } else {
+ _actor2.setup(1507, 1, 1);
+ _actor2.setPosition(Common::Point(180, 160));
+ }
+ _actor2.setDetails(9002, 0, 4, 3, 1, (SceneItem *) NULL);
+ _actor2._moveDiff = Common::Point(4, 2);
+ } else {
+ _actor2.setDetails(9001, 0, 5, 3, 1, (SceneItem *) NULL);
+ _actor2.setVisage(1503);
+ _actor2._moveDiff = Common::Point(2, 2);
+ }
+
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1800) {
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ R2_GLOBALS._player.setPosition(Common::Point(114, 150));
+ R2_GLOBALS._player.setStrip(5);
+ if (R2_GLOBALS.getFlag(14)) {
+ _actor2.setPosition(Common::Point(160, 139));
+ R2_GLOBALS._walkRegions.enableRegion(8);
+ } else {
+ _actor2.setPosition(Common::Point(209, 150));
+ _actor2.setStrip(6);
+ R2_GLOBALS._walkRegions.enableRegion(8);
+ }
+ } else {
+ if (R2_GLOBALS.getFlag(14)) {
+ R2_GLOBALS._player.setup(1801, 5, 12);
+ R2_GLOBALS._player.setPosition(Common::Point(160, 139));
+ } else {
+ R2_GLOBALS._player.setPosition(Common::Point(209, 150));
+ R2_GLOBALS._player.setStrip(6);
+ }
+ _actor2.setPosition(Common::Point(114, 150));
+ _actor2.setStrip(5);
+ R2_GLOBALS._walkRegions.enableRegion(10);
+ R2_GLOBALS._walkRegions.enableRegion(11);
+ }
+ } else {
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ R2_GLOBALS._player.setPosition(Common::Point(140, 160));
+ _actor2.setPosition(Common::Point(180, 160));
+ } else {
+ R2_GLOBALS._player.setPosition(Common::Point(180, 160));
+ _actor2.setPosition(Common::Point(140, 160));
+ }
+ }
+
+ _actor1.postInit();
+ _actor1.fixPriority(10);
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+ _actor1.setVisage(1111);
+ else
+ _actor1.setVisage(1110);
+
+ _actor1._effect = 5;
+ _actor1._field9C = _field312;
+
+ R2_GLOBALS._player._linkedActor = &_actor1;
+
+ _actor3.postInit();
+ _actor3.fixPriority(10);
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+ _actor3.setVisage(1110);
+ else
+ _actor3.setVisage(1111);
+
+ _actor3._effect = 5;
+ _actor3._field9C = _field312;
+
+ _actor2._linkedActor = &_actor3;
+
+ R2_GLOBALS._player._characterScene[1] = 1800;
+ R2_GLOBALS._player._characterScene[2] = 1800;
+
+ _item2.setDetails(Rect(128, 95, 190, 135), 1800, 10, -1, -1, 1, NULL);
+ _item1.setDetails(Rect(95, 3, 223, 135), 1800, 0, -1, -1, 1, NULL);
+
+ // Original was calling _item3.setDetails(Rect(1800, 11, 24, 23), 25, -1, -1, -1, 1, NULL);
+ // This is *wrong*. The following statement is a wild guess based on good common sense
+ _item3.setDetails(11, 1800, 23, 24, 25);
+ _item4.setDetails(Rect(0, 0, 320, 200), 1800, 17, -1, 19, 1, NULL);
+
+ R2_GLOBALS._player.disableControl();
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1800) {
+ if ((R2_GLOBALS.getFlag(14)) && (R2_GLOBALS._player._characterIndex == R2_SEEKER)) {
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+ } else {
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ }
+ } else if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1850) {
+ if (R2_GLOBALS.getFlag(29)) {
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ _sceneMode = 1814;
+ setAction(&_sequenceManager, this, 1814, &R2_GLOBALS._player, &_actor2, &_actor8, NULL);
+ } else {
+ _sceneMode = 1815;
+ setAction(&_sequenceManager, this, 1815, &R2_GLOBALS._player, &_actor2, &_actor8, NULL);
+ }
+ } else {
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ _sceneMode = 1816;
+ setAction(&_sequenceManager, this, 1816, &R2_GLOBALS._player, &_actor2, &_actor9, NULL);
+ } else {
+ _sceneMode = 1817;
+ setAction(&_sequenceManager, this, 1817, &R2_GLOBALS._player, &_actor2, &_actor9, NULL);
+ }
+ }
+ } else {
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ _sceneMode = 1800;
+ setAction(&_sequenceManager, this, 1800, &R2_GLOBALS._player, &_actor2, NULL);
+ } else {
+ _sceneMode = 1801;
+ setAction(&_sequenceManager, this, 1801, &R2_GLOBALS._player, &_actor2, NULL);
+ }
+ }
+
+ R2_GLOBALS._player._oldCharacterScene[1] = 1800;
+ R2_GLOBALS._player._oldCharacterScene[2] = 1800;
+}
+
+void Scene1800::signal() {
+ switch (_sceneMode) {
+ case 1:
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ _sceneMode = 1804;
+ setAction(&_sequenceManager, this, 1804, &R2_GLOBALS._player, &_actor2, &_actor8, NULL);
+ } else {
+ _sceneMode = 1805;
+ setAction(&_sequenceManager, this, 1805, &R2_GLOBALS._player, &_actor2, &_actor8, NULL);
+ }
+ break;
+ case 2:
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ _sceneMode = 1806;
+ setAction(&_sequenceManager, this, 1806, &R2_GLOBALS._player, &_actor2, &_actor9, NULL);
+ } else {
+ _sceneMode = 1807;
+ setAction(&_sequenceManager, this, 1807, &R2_GLOBALS._player, &_actor2, &_actor9, NULL);
+ }
+ break;
+ case 3:
+ _sceneMode = 1802;
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+ setAction(&_sequenceManager, this, 1802, &R2_GLOBALS._player, &_actor2, NULL);
+ else
+ setAction(&_sequenceManager, this, 1803, &R2_GLOBALS._player, &_actor2, NULL);
+ break;
+ case 10:
+ // No break on purpose
+ case 11:
+ R2_GLOBALS._player.enableControl(CURSOR_TALK);
+ break;
+ case 12:
+ R2_GLOBALS._player.enableControl(CURSOR_TALK);
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ case 13:
+ _sceneMode = 14;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ R2_GLOBALS._player.setup(1801, 7, 1);
+ R2_GLOBALS._player.animate(ANIM_MODE_8, NULL);
+ _stripManager.start(550, this);
+ break;
+ case 14:
+ _sceneMode = 15;
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._player.setup(1801, 6, 1);
+ R2_GLOBALS._player.animate(ANIM_MODE_6, this);
+ break;
+ case 15:
+ R2_GLOBALS._player.setup(1503, 4, 1);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ break;
+ case 1800:
+ R2_GLOBALS._walkRegions.enableRegion(8);
+ if (R2_GLOBALS.getFlag(63))
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ else {
+ _sceneMode = 10;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(544, this);
+ }
+ break;
+ case 1801:
+ R2_GLOBALS._walkRegions.enableRegion(10);
+ R2_GLOBALS._walkRegions.enableRegion(11);
+ R2_GLOBALS.setFlag(63);
+
+ // The following check is completely dumb.
+ // Either an original bug, or dead code.
+ if (R2_GLOBALS.getFlag(63)) {
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ } else {
+ _sceneMode = 10;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(545, this);
+ }
+ break;
+ case 1802:
+ R2_GLOBALS.clearFlag(14);
+ R2_GLOBALS._sceneManager.changeScene(1700);
+ break;
+ case 1804:
+ // No break on purpose
+ case 1805:
+ // No break on purpose
+ case 1806:
+ // No break on purpose
+ case 1807:
+ R2_GLOBALS.clearFlag(14);
+ R2_GLOBALS._sceneManager.changeScene(1850);
+ break;
+ case 1808:
+ _sceneMode = 12;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(553, this);
+ break;
+ case 1812:
+ _sceneMode = 13;
+ R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 1814:
+ // No break on purpose
+ case 1815:
+ R2_GLOBALS._walkRegions.enableRegion(10);
+ R2_GLOBALS._walkRegions.enableRegion(11);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 1816:
+ // No break on purpose
+ case 1817:
+ R2_GLOBALS._walkRegions.enableRegion(8);
+ R2_GLOBALS._player.enableControl();
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene1800::saveCharacter(int characterIndex) {
+ if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+
+ SceneExt::saveCharacter(characterIndex);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 1850 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene1850::Scene1850() {
+ warning("STUBBED: Scene1850()");
+}
+
+void Scene1850::synchronize(Serializer &s) {
+ warning("STUBBED: Scene1850::synchronize()");
+}
+
+bool Scene1850::Hotspot2::startAction(CursorType action, Event &event) {
+ if (action != CURSOR_USE)
+ return SceneHotspot::startAction(action, event);
+
+ Scene1850 *scene = (Scene1850 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._player.disableControl();
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ scene->_sceneMode = 1852;
+ if (R2_GLOBALS.getFlag(32))
+ scene->setAction(&scene->_sequenceManager1, scene, 1871, &R2_GLOBALS._player, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager1, scene, 1852, &R2_GLOBALS._player, NULL);
+ } else if (R2_GLOBALS.getFlag(30)) {
+ scene->_field41E = 1;
+ scene->_sceneMode = 1860;
+
+ if (R2_GLOBALS.getFlag(32))
+ scene->setAction(&scene->_sequenceManager1, scene, 1860, &R2_GLOBALS._player, &scene->_actor5, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager1, scene, 1859, &R2_GLOBALS._player, &scene->_actor5, NULL);
+
+ R2_GLOBALS.clearFlag(30);
+ } else {
+ scene->_sceneMode = 1853;
+
+ if (R2_GLOBALS.getFlag(32))
+ scene->setAction(&scene->_sequenceManager1, scene, 1872, &R2_GLOBALS._player, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager1, scene, 1853, &R2_GLOBALS._player, NULL);
+ }
+
+ return true;
+}
+
+bool Scene1850::Actor5::startAction(CursorType action, Event &event) {
+ Scene1850 *scene = (Scene1850 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if ((R2_GLOBALS._player._characterIndex != R2_SEEKER) || (R2_GLOBALS.getFlag(33)) || (R2_GLOBALS.getFlag(30)))
+ return SceneActor::startAction(action, event);
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1857;
+
+ if (R2_GLOBALS.getFlag(32))
+ scene->setAction(&scene->_sequenceManager1, scene, 1858, &R2_GLOBALS._player, &scene->_actor5, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager1, scene, 1857, &R2_GLOBALS._player, &scene->_actor5, NULL);
+
+ R2_GLOBALS.setFlag(30);
+ return true;
+ break;
+ case CURSOR_LOOK:
+ if (R2_GLOBALS.getFlag(34))
+ SceneItem::display(1850, 2, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ else
+ SceneItem::display(1850, 1, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+
+ return true;
+ break;
+ case R2_AIRBAG:
+ if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
+ if (R2_GLOBALS.getFlag(70)) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 30;
+
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ scene->_stripManager.start(558, scene);
+
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+ } else if (R2_GLOBALS.getFlag(30)) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1875;
+ scene->_actor2.postInit();
+
+ if (R2_GLOBALS.getFlag(32))
+ scene->setAction(&scene->_sequenceManager1, scene, 1876, &R2_GLOBALS._player, &scene->_actor2, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager1, scene, 1875, &R2_GLOBALS._player, &scene->_actor2, NULL);
+
+ return true;
+ } else if (R2_GLOBALS.getFlag(70)) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 30;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ scene->_stripManager.start(557, scene);
+ R2_GLOBALS.setFlag(69);
+
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+ break;
+ case R2_REBREATHER_TANK:
+ if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1850) {
+ if (R2_GLOBALS.getFlag(30))
+ return SceneActor::startAction(action, event);;
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1878;
+ scene->setAction(&scene->_sequenceManager1, scene, 1878, &R2_GLOBALS._player, &scene->_actor5, &scene->_actor2, NULL);
+ }
+
+ return true;
+ break;
+ default:
+ return SceneActor::startAction(action, event);
+ break;
+ }
+}
+
+bool Scene1850::Actor6::startAction(CursorType action, Event &event) {
+ if (action != CURSOR_USE)
+ return SceneHotspot::startAction(action, event);
+
+ Scene1850 *scene = (Scene1850 *)R2_GLOBALS._sceneManager._scene;
+
+ if (R2_GLOBALS.getFlag(32)) {
+ SceneItem::display(3240, 4, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ return true;
+ }
+
+ R2_GLOBALS._player.disableControl();
+ if (scene->_field412 == 1851)
+ R2_GLOBALS._player._effect = 1;
+
+ if (_position.x >= 160)
+ R2_GLOBALS.setFlag(29);
+ else
+ R2_GLOBALS.clearFlag(29);
+
+ if ((R2_GLOBALS._player._characterIndex == R2_SEEKER) && (R2_GLOBALS.getFlag(30))) {
+ if (_position.x >= 160)
+ scene->_field41E = 3;
+ else
+ scene->_field41E = 2;
+
+ scene->_sceneMode = 1860;
+
+ if (R2_GLOBALS.getFlag(32)) {
+ scene->setAction(&scene->_sequenceManager1, scene, 1860, &R2_GLOBALS._player, &scene->_actor5, NULL);
+ } else {
+ scene->setAction(&scene->_sequenceManager1, scene, 1859, &R2_GLOBALS._player, &scene->_actor5, NULL);
+ }
+ } else {
+ scene->_sceneMode = 11;
+ if (_position.x >= 160) {
+ scene->setAction(&scene->_sequenceManager1, scene, 1866, &R2_GLOBALS._player, &scene->_actor7, NULL);
+ } else {
+ scene->setAction(&scene->_sequenceManager1, scene, 1865, &R2_GLOBALS._player, &scene->_actor6, NULL);
+ }
+ }
+
+ return true;
+}
+
+bool Scene1850::Actor8::startAction(CursorType action, Event &event) {
+ if ((action != CURSOR_USE) || (_position.y != 120))
+ return SceneHotspot::startAction(action, event);
+
+ Scene1850 *scene = (Scene1850 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1881;
+
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ scene->setAction(&scene->_sequenceManager1, scene, 1881, &R2_GLOBALS._player, NULL);
+ } else {
+ scene->setAction(&scene->_sequenceManager1, scene, 1880, &R2_GLOBALS._player, NULL);
+ }
+
+ return true;
+}
+
+void Scene1850::postInit(SceneObjectList *OwnerList) {
+ loadScene(1850);
+
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] != 1850)
+ R2_GLOBALS.clearFlag(31);
+
+ _palette1.loadPalette(0);
+
+ if (R2_GLOBALS.getFlag(31)) {
+ _field412 = 1850;
+ g_globals->_scenePalette.loadPalette(1850);
+ } else {
+ _field412 = 1851;
+ g_globals->_scenePalette.loadPalette(1851);
+ }
+
+ SceneExt::postInit();
+
+ if (R2_GLOBALS._sceneManager._previousScene == 3150)
+ R2_GLOBALS._sound1.play(116);
+
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_seekerSpeaker);
+
+ _field418 = 0;
+ _field41E = 0;
+ _field41A = Common::Point(0, 0);
+
+ R2_GLOBALS._player._characterScene[1] = 1850;
+ R2_GLOBALS._player._characterScene[2] = 1850;
+
+ _item2.setDetails(Rect(101, 56, 111, 63), 1850, 19, -1, -1, 1, NULL);
+
+ _actor6.postInit();
+ _actor6.setup(1850, 3, 1);
+ _actor6.setPosition(Common::Point(66, 102));
+ _actor6.setDetails(1850, 22, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor7.postInit();
+ _actor7.setup(1850, 2, 1);
+ _actor7.setPosition(Common::Point(253, 102));
+ _actor7.setDetails(1850, 22, -1, -1, 1, (SceneItem *) NULL);
+
+ R2_GLOBALS._walkRegions.enableRegion(1);
+
+ _actor5.postInit();
+
+ if (R2_GLOBALS.getFlag(34)) {
+ R2_GLOBALS._walkRegions.enableRegion(2);
+ _actor5.setup(1851, 4, 3);
+ } else if (R2_GLOBALS.getFlag(30)) {
+ _actor5.setup(1851, 2, 2);
+ } else {
+ R2_GLOBALS._walkRegions.enableRegion(5);
+ if (R2_GLOBALS.getFlag(33)) {
+ R2_GLOBALS._walkRegions.enableRegion(2);
+ _actor5.setup(1851, 1, 3);
+ } else {
+ _actor5.setup(1851, 2, 1);
+ }
+ }
+
+ _actor5.setPosition(Common::Point(219, 130));
+ _actor5.fixPriority(114);
+ _actor5.setDetails(1850, -1, -1, -1, 1, (SceneItem *) NULL);
+
+ R2_GLOBALS._player.postInit();
+
+ _actor1.postInit();
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ _actor1.setDetails(9002, 0, 4, 3, 1, (SceneItem *) NULL);
+ } else {
+ _actor1.setDetails(9001, 0, 5, 3, 1, (SceneItem *) NULL);
+ }
+
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1850) {
+ R2_GLOBALS._player._effect = 6;
+ _actor1._effect = 6;
+ if (R2_GLOBALS.getFlag(31)) {
+ R2_GLOBALS._player._shade = 0;
+ _actor1._shade = 0;
+ } else {
+ R2_GLOBALS._player._shade = 6;
+ _actor1._shade = 6;
+ }
+
+ if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1850) {
+ _actor2.postInit();
+ if (R2_GLOBALS.getFlag(34)) {
+ _actor2.setup(1851, 4, 2);
+ _actor2.fixPriority(114);
+ } else {
+ _actor2.setup(1851, 4, 1);
+ }
+
+ _actor2.setPosition(Common::Point(179, 113));
+
+ if ((_actor5._strip == 1) && (_actor5._frame == 3)){
+ _actor2.hide();
+ }
+
+ _actor2.setDetails(1850, 6, -1, -1, 1, (SceneItem *) NULL);
+ }
+
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ if (R2_GLOBALS.getFlag(32)) {
+ R2_GLOBALS._player.setVisage(1511);
+ _actor1.setVisage(1508);
+
+ _actor3.postInit();
+ _actor3.setup(1853, 3, 1);
+ _actor3.setPosition(Common::Point(122, 113));
+ _actor3.fixPriority(114);
+ _actor3._effect = 6;
+
+ // Totally useless test
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ _actor3.setDetails(1850, 28, -1, -1, 2, (SceneItem *) NULL);
+ } else {
+ // And the associated dead code
+ _actor3.setDetails(1850, 30, -1, -1, 2, (SceneItem *) NULL);
+ }
+
+ _actor4.postInit();
+ _actor4.setup(1853, 3, 2);
+ _actor4.setPosition(Common::Point(139, 111));
+ _actor4.fixPriority(114);
+ _actor4._effect = 6;
+
+ // Still totally useless test
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ _actor4.setDetails(1850, 29, -1, -1, 2, (SceneItem *) NULL);
+ } else {
+ // Another piece of dead code
+ _actor4.setDetails(1850, 28, -1, -1, 2, (SceneItem *) NULL);
+ }
+
+ if (R2_GLOBALS.getFlag(31)) {
+ _actor3._shade = 0;
+ _actor4._shade = 0;
+ } else {
+ _actor3._shade = 6;
+ _actor4._shade = 6;
+ }
+ } else {
+ R2_GLOBALS._player.setVisage(1500);
+ _actor1.setVisage(1505);
+ }
+ } else { // Not Quinn
+ if (R2_GLOBALS.getFlag(32)) {
+ R2_GLOBALS._player.setVisage(1508);
+ _actor1.setVisage(1511);
+
+ _actor3.postInit();
+ _actor3.setup(1853, 3, 1);
+ _actor3.setPosition(Common::Point(122, 113));
+ _actor3.fixPriority(114);
+ _actor3._effect = 6;
+
+ // Totally useless test
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ // Dead code
+ _actor3.setDetails(1850, 28, -1, -1, 2, (SceneItem *) NULL);
+ } else {
+ _actor3.setDetails(1850, 30, -1, -1, 2, (SceneItem *) NULL);
+ }
+
+ _actor4.postInit();
+ _actor4.setup(1853, 3, 2);
+ _actor4.setPosition(Common::Point(139, 111));
+ _actor4.fixPriority(114);
+ _actor4._effect = 6;
+
+ // Again, useless test
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ // and dead code
+ _actor4.setDetails(1850, 29, -1, -1, 1, (SceneItem *) NULL);
+ } else {
+ _actor4.setDetails(1850, 28, -1, -1, 1, (SceneItem *) NULL);
+ }
+
+ if (R2_GLOBALS.getFlag(31)) {
+ _actor3._shade = 0;
+ _actor4._shade = 0;
+ } else {
+ _actor3._shade = 6;
+ _actor4._shade = 6;
+ }
+ } else {
+ R2_GLOBALS._player.setVisage(1505);
+ _actor1.setVisage(1500);
+ }
+ }
+
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.setPosition(Common::Point(80, 114));
+
+ _actor1.animate(ANIM_MODE_1, NULL);
+ _actor1.setObjectWrapper(new SceneObjectWrapper());
+ _actor1.setStrip(3);
+ _actor1.setPosition(Common::Point(180, 96));
+
+ if (R2_GLOBALS.getFlag(30)) {
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ _actor1.animate(ANIM_MODE_NONE, NULL);
+ _actor1.setObjectWrapper(NULL);
+ if (R2_GLOBALS.getFlag(32)) {
+ _actor1.setup(1854, 1, 3);
+ } else {
+ _actor1.setup(1854, 2, 3);
+ }
+
+ _actor1.setPosition(Common::Point(164, 106));
+ } else {
+ _actor1.animate(ANIM_MODE_NONE, NULL);
+ _actor1.setObjectWrapper(NULL);
+ if (R2_GLOBALS.getFlag(32)) {
+ R2_GLOBALS._player.setup(1854, 1, 3);
+ } else {
+ R2_GLOBALS._player.setup(1854, 2, 3);
+ }
+
+ R2_GLOBALS._player.setPosition(Common::Point(164, 106));
+ }
+ }
+
+ R2_GLOBALS._player.enableControl();
+ } else { // R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] != 1850
+ R2_GLOBALS._player._effect = 1;
+ _actor1._effect = 1;
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 10;
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ if (R2_GLOBALS.getFlag(29)) {
+ setAction(&_sequenceManager1, this, 1863, &R2_GLOBALS._player, &_actor1, &_actor7, NULL);
+ } else {
+ setAction(&_sequenceManager1, this, 1861, &R2_GLOBALS._player, &_actor1, &_actor6, NULL);
+ }
+ } else {
+ if (R2_GLOBALS.getFlag(29)) {
+ setAction(&_sequenceManager1, this, 1864, &R2_GLOBALS._player, &_actor1, &_actor7, NULL);
+ } else {
+ setAction(&_sequenceManager1, this, 1862, &R2_GLOBALS._player, &_actor1, &_actor6, NULL);
+ }
+ }
+ }
+
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ _actor1._moveDiff = Common::Point(5, 3);
+ } else {
+ R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
+ _actor1._moveDiff = Common::Point(3, 2);
+ }
+
+ _actor8.postInit();
+ _actor8.setup(1850, 1, 1);
+
+ if (R2_GLOBALS.getFlag(62)) {
+ _actor8.setPosition(Common::Point(159, 120));
+ } else {
+ _actor8.setPosition(Common::Point(159, 184));
+ }
+
+ _actor8.fixPriority(113);
+
+ if (R2_GLOBALS.getFlag(34)) {
+ _actor8.setDetails(1850, 25, -1, -1, 4, &_actor5);
+ } else {
+ _actor8.setDetails(1850, 25, -1, -1, 2, (SceneItem *) NULL);
+ }
+
+ if (!R2_GLOBALS.getFlag(62)) {
+ _actor8.hide();
+ }
+
+ _item1.setDetails(Rect(0, 0, 320, 200), 1850, 16, -1, -1, 1, NULL);
+
+ R2_GLOBALS._player._oldCharacterScene[1] = 1850;
+ R2_GLOBALS._player._oldCharacterScene[2] = 1850;
+}
+
+void Scene1850::remove() {
+ g_globals->_scenePalette.loadPalette(0);
+
+ R2_GLOBALS._scenePalette._palette[765] = 255;
+ R2_GLOBALS._scenePalette._palette[766] = 255;
+ R2_GLOBALS._scenePalette._palette[767] = 255;
+
+ SceneExt::remove();
+}
+
+void Scene1850::signal() {
+ switch (_sceneMode) {
+ case 10:
+ R2_GLOBALS._player._effect = 6;
+ R2_GLOBALS._player._shade = 6;
+
+ _actor1._effect = 6;
+ _actor1._shade = 6;
+
+ R2_GLOBALS._walkRegions.enableRegion(5);
+
+ if (R2_GLOBALS.getFlag(68)) {
+ R2_GLOBALS._player.enableControl();
+ } else {
+ R2_GLOBALS.setFlag(68);
+ _sceneMode = 20;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(554, this);
+ }
+ break;
+ case 11:
+ R2_GLOBALS.clearFlag(30);
+ R2_GLOBALS._sceneManager.changeScene(1800);
+ break;
+ case 15:
+ _sceneMode = 16;
+ break;
+ case 16:
+ _sceneMode = 1870;
+ setAction(&_sequenceManager1, this, 1870, &R2_GLOBALS._player, &_actor1, &_actor3, &_actor4, NULL);
+ break;
+ case 20:
+ R2_GLOBALS._player.enableControl(CURSOR_TALK);
+ break;
+ case 21:
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 1877;
+ setAction(&_sequenceManager1, this, 1877, &R2_GLOBALS._player, &_actor1, &_actor5, NULL);
+ break;
+ case 30:
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 1882;
+ setAction(&_sequenceManager1, this, 1882, &R2_GLOBALS._player, NULL);
+ break;
+ case 1852:
+ // No break on purpose:
+ case 1853:
+ if (_field412 == 1851) {
+ R2_GLOBALS.setFlag(31);
+ _palette1.loadPalette(1850);
+ _field412 = 1850;
+ } else {
+ R2_GLOBALS.clearFlag(31);
+ _palette1.loadPalette(1851);
+ _field412 = 1851;
+ }
+
+ _field418 = 1;
+ if (R2_GLOBALS.getFlag(30)) {
+ _actor8.setAction(&_sequenceManager2, NULL, 1867, &_actor8, NULL);
+ } else if (R2_GLOBALS.getFlag(34)) {
+ if (R2_GLOBALS.getFlag(62)) {
+ R2_GLOBALS.clearFlag(62);
+ _actor8.setAction(&_sequenceManager2, this, 1851, &_actor8, NULL);
+ } else {
+ R2_GLOBALS.setFlag(62);
+ _actor8.setAction(&_sequenceManager2, this, 1850, &_actor8, NULL);
+ }
+ } else if (R2_GLOBALS.getFlag(33)) {
+ R2_GLOBALS.setFlag(62);
+ R2_GLOBALS.setFlag(34);
+ R2_GLOBALS._walkRegions.enableRegion(2);
+
+ _actor2.postInit();
+ _actor2.setDetails(1850, 6, -1, -1, 5, &_actor5);
+
+ _sceneMode = 1879;
+
+ _actor8.setAction(&_sequenceManager2, this, 1879, &_actor5, &_actor8, &_actor2, NULL);
+ } else {
+ _actor8.setAction(&_sequenceManager2, NULL, 1867, &_actor8, NULL);
+ }
+
+ if (R2_GLOBALS.getFlag(34))
+ R2_GLOBALS._scenePalette.addFader(_palette1._palette, 256, 5, NULL);
+ else
+ R2_GLOBALS._scenePalette.addFader(_palette1._palette, 256, 5, this);
+
+ if (_field412 == 1851)
+ _field416 = -20;
+ else
+ _field416 = 20;
+
+ _field414 = 20;
+
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ if (_sceneMode == 1879)
+ _sceneMode = 1854;
+
+ if (R2_GLOBALS.getFlag(32)) {
+ setAction(&_sequenceManager1, NULL, 1873, &R2_GLOBALS._player, NULL);
+ } else {
+ setAction(&_sequenceManager1, NULL, 1854, &R2_GLOBALS._player, NULL);
+ }
+ } else {
+ if (_sceneMode == 1879)
+ _sceneMode = 1855;
+
+ if (R2_GLOBALS.getFlag(32)) {
+ setAction(&_sequenceManager1, NULL, 1874, &R2_GLOBALS._player, NULL);
+ } else {
+ setAction(&_sequenceManager1, NULL, 1855, &R2_GLOBALS._player, NULL);
+ }
+ }
+ break;
+ case 1857:
+ if (R2_GLOBALS.getFlag(69)) {
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ } else {
+ _sceneMode = 1858;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(555, this);
+ R2_GLOBALS.setFlag(69);
+ }
+ break;
+ case 1858:
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 1859;
+ setAction(&_sequenceManager1, this, 1859, &R2_GLOBALS._player, &_actor5, NULL);
+ R2_GLOBALS.clearFlag(30);
+ break;
+ case 1859:
+ R2_GLOBALS.setFlag(70);
+ _sceneMode = 20;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(575, this);
+ break;
+ case 1860:
+ if (_field41A.x != 0) {
+ R2_GLOBALS._player.enableControl();
+
+ PlayerMover *mover = new PlayerMover();
+ R2_GLOBALS._player.addMover(mover, &_field41A, this);
+
+ _field41A = Common::Point(0, 0);
+ }
+
+ switch (_field41E) {
+ case 1:
+ _sceneMode = 1853;
+ if (R2_GLOBALS.getFlag(32)) {
+ setAction(&_sequenceManager1, this, 1872, &R2_GLOBALS._player, NULL);
+ } else {
+ setAction(&_sequenceManager1, this, 1853, &R2_GLOBALS._player, NULL);
+ }
+ break;
+ case 2:
+ _sceneMode = 11;
+ setAction(&_sequenceManager1, this, 1865, &R2_GLOBALS._player, &_actor6, NULL);
+ break;
+ case 3:
+ warning("_field41E == 3");
+ _sceneMode = 11;
+ setAction(&_sequenceManager1, this, 1866, &R2_GLOBALS._player, &_actor7, NULL);
+ break;
+ default:
+ break;
+ }
+
+ _field41E = 0;
+ break;
+ case 1870:
+ R2_GLOBALS._walkRegions.enableRegion(5);
+ R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 1);
+ R2_GLOBALS.setFlag(32);
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ break;
+ case 1875:
+ R2_INVENTORY.setObjectScene(R2_AIRBAG, 1850);
+ _sceneMode = 21;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(561, this);
+ break;
+ case 1877:
+ _actor3.postInit();
+ _actor3._effect = 6;
+
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ _actor3.setDetails(1850, 28, -1, -1, 2, (SceneItem *)NULL);
+ } else {
+ _actor3.setDetails(1850, 30, -1, -1, 2, (SceneItem *)NULL);
+ }
+
+ _actor4.postInit();
+ _actor4._effect = 6;
+
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ _actor4.setDetails(1850, 29, -1, -1, 2, (SceneItem *)NULL);
+ } else {
+ _actor4.setDetails(1850, 28, -1, -1, 2, (SceneItem *)NULL);
+ }
+
+ if (R2_GLOBALS.getFlag(31)) {
+ _actor3._shade = 0;
+ _actor4._shade = 0;
+ } else {
+ _actor3._shade = 6;
+ _actor4._shade = 6;
+ }
+
+ R2_GLOBALS.clearFlag(30);
+ _sceneMode = 15;
+ setAction(&_sequenceManager1, this, 1869, &R2_GLOBALS._player, &_actor3, NULL);
+ setAction(&_sequenceManager2, this, 1868, &_actor1, &_actor4, NULL);
+ break;
+ case 1878:
+ R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 1850);
+ R2_GLOBALS.setFlag(33);
+ R2_GLOBALS._walkRegions.enableRegion(2);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 1879:
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 1881:
+ R2_GLOBALS._sceneManager.changeScene(1875);
+ break;
+ case 1882:
+ R2_INVENTORY.setObjectScene(R2_AIRBAG, 1);
+ R2_GLOBALS._player.enableControl();
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene1850::process(Event &event) {
+ if ( (event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_ARROW)
+ && (R2_GLOBALS._player._characterIndex == R2_SEEKER) && (R2_GLOBALS.getFlag(30))) {
+ _field41A = event.mousePos;
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 1860;
+ if (R2_GLOBALS.getFlag(32)) {
+ setAction(&_sequenceManager1, this, 1860, &R2_GLOBALS._player, &_actor5, NULL);
+ } else {
+ setAction(&_sequenceManager1, this, 1859, &R2_GLOBALS._player, &_actor5, NULL);
+ }
+ R2_GLOBALS.clearFlag(32);
+ event.handled = true;
+ }
+
+ Scene::process(event);
+}
+
+void Scene1850::dispatch() {
+ if (_field418 != 0) {
+ _field414--;
+ if (_field414 == 0)
+ _field418 = 0;
+
+ if (_field416 >= 0) {
+ R2_GLOBALS._player._shade = (_field414 * 6) / _field416;
+ } else {
+ R2_GLOBALS._player._shade = ((_field414 * 6) / _field416) + 6;
+ }
+ R2_GLOBALS._player._flags |= OBJFLAG_PANES;
+
+ _actor1._shade = R2_GLOBALS._player._shade;
+ _actor1._flags |= OBJFLAG_PANES;
+
+ _actor3._shade = R2_GLOBALS._player._shade;
+ _actor3._flags |= OBJFLAG_PANES;
+
+ _actor4._shade = R2_GLOBALS._player._shade;
+ _actor4._flags |= OBJFLAG_PANES;
+ }
+
+ if (R2_GLOBALS.getFlag(32)) {
+ _actor3.setPosition(Common::Point(_actor8._position.x - 37, _actor8._position.y - 71));
+ _actor4.setPosition(Common::Point(_actor8._position.x - 20, _actor8._position.y - 73));
+ }
+
+ if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1850) {
+ _actor2.setPosition(Common::Point(_actor8._position.x + 20, _actor8._position.y - 71));
+ }
+
+ Scene::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 1875 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene1875::Actor1875::Actor1875() {
+ _fieldA4 = 0;
+ _fieldA6 = 0;
+}
+
+void Scene1875::Actor1875::synchronize(Serializer &s) {
+ SceneActor::synchronize(s);
+
+ s.syncAsSint16LE(_fieldA4);
+ s.syncAsSint16LE(_fieldA6);
+}
+
+void Scene1875::Actor1875::subB84AB() {
+ Scene1875 *scene = (Scene1875 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._sound1.play(227);
+
+ int newFrameNumber;
+ switch (_fieldA4) {
+ case 3:
+ if ((scene->_actor1._frame == 1) && (scene->_actor4._strip == 2)) {
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ scene->_sceneMode = 10;
+ scene->_stripManager.start(576, this);
+ } else {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1890;
+ scene->_actor2.postInit();
+ scene->setAction(&scene->_sequenceManager, scene, 1890, &scene->_actor2, NULL);
+ }
+ break;
+ case 4:
+ newFrameNumber = scene->_actor1._frame + 1;
+ if (newFrameNumber > 6)
+ newFrameNumber = 1;
+ scene->_actor1.setFrame(newFrameNumber);
+ break;
+ case 5:
+ newFrameNumber = scene->_actor1._frame - 1;
+ if (newFrameNumber < 1)
+ newFrameNumber = 6;
+ scene->_actor1.setFrame(newFrameNumber);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene1875::Actor1875::subB8271(int indx) {
+ postInit();
+ _fieldA4 = indx;
+ _fieldA6 = 0;
+ setVisage(1855);
+
+ if (_fieldA4 == 1)
+ setStrip(2);
+ else
+ setStrip(1);
+
+ setFrame(_fieldA4);
+ switch (_fieldA4 - 1) {
+ case 0:
+ setPosition(Common::Point(20, 144));
+ break;
+ case 1:
+ setPosition(Common::Point(82, 144));
+ break;
+ case 2:
+ setPosition(Common::Point(136, 144));
+ break;
+ case 3:
+ setPosition(Common::Point(237, 144));
+ break;
+ case 4:
+ setPosition(Common::Point(299, 144));
+ break;
+ default:
+ break;
+ }
+
+ setDetails(1875, 6, 1, -1, 2, (SceneItem *) NULL);
+}
+
+void Scene1875::Actor1875::process(Event &event) {
+ if ((R2_GLOBALS._player._uiEnabled) || (event.handled))
+ return;
+
+ Scene1875 *scene = (Scene1875 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == R2_STEPPING_DISKS) && (_bounds.contains(event.mousePos)) && (_fieldA6 == 0)) {
+ setStrip(2);
+ switch (_fieldA4) {
+ case 1:
+ R2_GLOBALS._sound2.play(227);
+ scene->_actor5.setStrip(1);
+ break;
+ case 2:
+ R2_GLOBALS._sound2.play(227);
+ scene->_actor4.setStrip(1);
+ break;
+ default:
+ break;
+ }
+ _fieldA6 = 1;
+ event.handled = true;
+ }
+
+ if ((event.eventType == EVENT_BUTTON_UP) && (_fieldA6 != 0)) {
+ if ((_fieldA4 == 3) || (_fieldA4 == 4) || (_fieldA4 == 5)) {
+ setStrip(1);
+ subB84AB();
+ }
+ _fieldA6 = 0;
+ event.handled = true;
+ }
+}
+
+void Scene1875::postInit(SceneObjectList *OwnerList) {
+ loadScene(1875);
+ SceneExt::postInit();
+
+ R2_GLOBALS._player._characterScene[1] = 1875;
+ R2_GLOBALS._player._characterScene[2] = 1875;
+
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_seekerSpeaker);
+
+ _actor4.subB8271(1);
+ _actor5.subB8271(2);
+ _actor6.subB8271(3);
+ _actor7.subB8271(4);
+ _actor8.subB8271(5);
+
+ _actor1.postInit();
+ _actor1.setup(1855, 4, 1);
+ _actor1.setPosition(Common::Point(160, 116));
+
+ R2_GLOBALS._player.postInit();
+ if (R2_GLOBALS._sceneManager._previousScene == 1625) {
+ R2_GLOBALS._sound1.play(122);
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 11;
+ _actor2.postInit();
+ setAction(&_sequenceManager, this, 1892, &_actor2, NULL);
+ } else if (R2_GLOBALS._sceneManager._previousScene == 3150) {
+ R2_GLOBALS._sound1.play(116);
+ } else {
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ }
+
+ _item2.setDetails(Rect(43, 14, 275, 122), 1875, 9, 1, -1, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 320, 200), 1875, 3, -1, -1, 1, NULL);
+
+ R2_GLOBALS._player._characterScene[1] = 1875;
+ R2_GLOBALS._player._characterScene[2] = 1875;
+ R2_GLOBALS._player._oldCharacterScene[1] = 1875;
+ R2_GLOBALS._player._oldCharacterScene[2] = 1875;
+}
+
+void Scene1875::signal() {
+ switch (_sceneMode) {
+ case 10:
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 1891;
+ _actor2.postInit();
+ setAction(&_sequenceManager, this, 1891, &_actor2, NULL);
+ break;
+ case 11:
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _sceneMode = 1892;
+ _stripManager.start(577, this);
+ break;
+ case 1890:
+ _actor2.remove();
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ case 1891:
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._sceneManager.changeScene(1625);
+ break;
+ case 1892:
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._sceneManager.changeScene(1900);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ }
+}
+
+void Scene1875::process(Event &event) {
+ Scene::process(event);
+
+ _actor4.process(event);
+ _actor5.process(event);
+ _actor6.process(event);
+ _actor7.process(event);
+ _actor8.process(event);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 1900 -
+ *
+ *--------------------------------------------------------------------------*/
+bool Scene1900::Actor2::startAction(CursorType action, Event &event) {
+ Scene1900 *scene = (Scene1900 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ if ((_frame != 1) || (R2_GLOBALS._player._characterIndex != R2_SEEKER)) {
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+ return SceneActor::startAction(action, event);
+ else
+ return true;
+ }
+
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+
+ if (_position.x >= 160) {
+ scene->_sceneMode = 1905;
+ scene->setAction(&scene->_sequenceManager1, scene, 1905, &R2_GLOBALS._player, &scene->_actor3, NULL);
+ } else {
+ R2_GLOBALS.setFlag(29);
+ scene->_sceneMode = 1904;
+ scene->setAction(&scene->_sequenceManager1, scene, 1904, &R2_GLOBALS._player, &scene->_actor2, NULL);
+ }
+
+ return true;
+}
+
+void Scene1900::Exit1::changeScene() {
+ Scene1900 *scene = (Scene1900 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ scene->_sceneMode = 10;
+
+ Common::Point pt(-10, 135);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene1900::Exit2::changeScene() {
+ Scene1900 *scene = (Scene1900 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ scene->_sceneMode = 11;
+
+ Common::Point pt(330, 135);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene1900::postInit(SceneObjectList *OwnerList) {
+ loadScene(1900);
+ SceneExt::postInit();
+
+ // Debug message, skipped
+
+ if (R2_GLOBALS._sceneManager._previousScene == -1) {
+ R2_GLOBALS._sceneManager._previousScene = 1925;
+ R2_GLOBALS._player._characterIndex = R2_SEEKER;
+ R2_GLOBALS._player._oldCharacterScene[2] = 1925;
+ }
+
+ if (R2_GLOBALS._sceneManager._previousScene != 1875)
+ R2_GLOBALS._sound1.play(200);
+
+ _stripManager.setColors(60, 255);
+ _stripManager.setFontNumber(3);
+ _stripManager.addSpeaker(&_seekerSpeaker);
+
+ _exit1.setDetails(Rect(0, 105, 14, 145), R2_COM_SCANNER, 2000);
+ _exit1.setDest(Common::Point(14, 135));
+
+ _exit2.setDetails(Rect(305, 105, 320, 145), R2_SPENT_POWER_CAPSULE, 2000);
+ _exit2.setDest(Common::Point(315, 135));
+
+ R2_GLOBALS._player.postInit();
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+ R2_GLOBALS._player.setup(2008, 3, 1);
+ else
+ R2_GLOBALS._player.setup(20, 3, 1);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ else
+ R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_GLOBALS._sceneManager._previousScene != 1925)
+ R2_GLOBALS.clearFlag(29);
+
+ _actor2.postInit();
+ _actor2.setup(1901, 1, 1);
+ _actor2.setPosition(Common::Point(95, 109));
+ _actor2.fixPriority(100);
+
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+ _actor2.setDetails(1900, 0, 1, 2, 1, (SceneItem *) NULL);
+ else
+ _actor2.setDetails(1900, 0, 1, -1, 1, (SceneItem *) NULL);
+
+ _actor3.postInit();
+ _actor3.setup(1901, 2, 1);
+ _actor3.setPosition(Common::Point(225, 109));
+ _actor3.fixPriority(100);
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+ _actor3.setDetails(1900, 0, 1, 2, 1, (SceneItem *) NULL);
+ else
+ _actor3.setDetails(1900, 0, 1, -1, 1, (SceneItem *) NULL);
+
+ if (R2_GLOBALS._sceneManager._previousScene != 1875) {
+ _object1.postInit();
+ _object1.setup(1945, 6, 1);
+ _object1.setPosition(Common::Point(96, 109));
+ _object1.fixPriority(80);
+
+ _object2.postInit();
+ _object2.setup(1945, 6, 2);
+ _object2.setPosition(Common::Point(223, 109));
+ _object2.fixPriority(80);
+ }
+
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1875) {
+ R2_GLOBALS._player._characterIndex = R2_QUINN;
+ _actor1.postInit();
+ _sceneMode = 20;
+ R2_GLOBALS._player.setAction(&_sequenceManager1, NULL, 1901, &R2_GLOBALS._player, &_actor2, NULL);
+ _actor1.setAction(&_sequenceManager2, this, 1900, &_actor1, &_actor3, NULL);
+ } else if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1925) {
+ if (R2_GLOBALS.getFlag(29)) {
+ R2_GLOBALS.clearFlag(29);
+ _actor2.hide();
+
+ R2_GLOBALS._player.setStrip(6);
+ R2_GLOBALS._player.setPosition(Common::Point(90, 106));
+ _sceneMode = 1906;
+ setAction(&_sequenceManager1, this, 1906, &R2_GLOBALS._player, &_actor2, NULL);
+ } else {
+ _actor3.hide();
+ R2_GLOBALS._player.setStrip(5);
+ R2_GLOBALS._player.setPosition(Common::Point(230, 106));
+ _sceneMode = 1907;
+ setAction(&_sequenceManager1, this, 1907, &R2_GLOBALS._player, &_actor3, NULL);
+ }
+
+ if (R2_GLOBALS._player._characterScene[1] == R2_GLOBALS._player._characterScene[2]) {
+ _actor1.postInit();
+ _actor1.setPosition(Common::Point(30, 110));
+ R2_GLOBALS._walkRegions.enableRegion(1);
+ _actor1.setup(2008, 3, 1);
+ _actor1.setDetails(9001, 0, -1, -1, 1, (SceneItem *) NULL);
+ }
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 1900;
+ } else if (R2_GLOBALS._player._characterScene[1] == R2_GLOBALS._player._characterScene[2]) {
+ _actor1.postInit();
+ _actor1.setPosition(Common::Point(30, 110));
+ R2_GLOBALS._walkRegions.enableRegion(1);
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ _actor1.setup(20, 3, 1);
+ _actor1.setDetails(9002, 1, -1, -1, 1, (SceneItem *) NULL);
+ } else {
+ _actor1.setup(2008, 3, 1);
+ _actor1.setDetails(9001, 0, -1, -1, 1, (SceneItem *) NULL);
+ }
+
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
+ if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+ if (R2_GLOBALS._v56605[1] == 5) {
+ _sceneMode = 1902;
+ setAction(&_sequenceManager1, this, 1902, &R2_GLOBALS._player, NULL);
+ } else {
+ _sceneMode = 1903;
+ setAction(&_sequenceManager1, this, 1903, &R2_GLOBALS._player, NULL);
+ }
+ } else {
+ if (R2_GLOBALS._v56605[2] == 5) {
+ _sceneMode = 1908;
+ setAction(&_sequenceManager1, this, 1908, &R2_GLOBALS._player, NULL);
+ } else {
+ _sceneMode = 1909;
+ setAction(&_sequenceManager1, this, 1909, &R2_GLOBALS._player, NULL);
+ }
+ }
+ } else {
+ R2_GLOBALS._player.setPosition(Common::Point(160, 135));
+ R2_GLOBALS._player.enableControl();
+ }
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 1900;
+ }
+
+ _item2.setDetails(Rect(77, 2, 240, 103), 1900, 6, -1, -1, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 320, 200), 1900, 3, -1, -1, 1, NULL);
+}
+
+void Scene1900::remove() {
+ R2_GLOBALS._sound1.fadeOut(NULL);
+ SceneExt::remove();
+}
+
+void Scene1900::signal() {
+ switch (_sceneMode) {
+ case 10:
+ R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 5;
+ R2_GLOBALS._sceneManager.changeScene(2000);
+ break;
+ case 11:
+ R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 6;
+ R2_GLOBALS._sceneManager.changeScene(2000);
+ break;
+ case 20:
+ ++_sceneMode;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(1300, this);
+ break;
+ case 21:
+ ++_sceneMode;
+ R2_GLOBALS._player.disableControl();
+ if (R2_GLOBALS._player._action)
+ R2_GLOBALS._player._action->_endHandler = this;
+ else
+ signal();
+ break;
+ case 22:
+ _sceneMode = 1910;
+ _actor1.setAction(&_sequenceManager2, this, 1910, &_actor1, NULL);
+ break;
+ case 1904:
+ R2_GLOBALS._scene1925CurrLevel = -3;
+ // No break on purpose
+ case 1905:
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ R2_GLOBALS._sceneManager.changeScene(1925);
+ break;
+ case 1910:
+ R2_INVENTORY.setObjectScene(22, 2535);
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ R2_GLOBALS._player._oldCharacterScene[1] = 1900;
+ R2_GLOBALS._player._oldCharacterScene[2] = 1900;
+ R2_GLOBALS._sceneManager.changeScene(2450);
+ break;
+ case 1906:
+ R2_GLOBALS._scene1925CurrLevel = -3;
+ // No break on purpose
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 1925 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene1925::Scene1925() {
+ _field9B8 = 0;
+ for (int i = 0; i < 5; i++)
+ _levelResNum[i] = 0;
+}
+
+void Scene1925::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field9B8);
+ for (int i = 0; i < 5; i++)
+ s.syncAsSint16LE(_levelResNum[i]);
+}
+
+bool Scene1925::Hotspot2::startAction(CursorType action, Event &event) {
+ Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return SceneHotspot::startAction(action, event);
+
+ if ((R2_GLOBALS._player._position.x == 110) && (R2_GLOBALS._player._position.y == 100))
+ return SceneHotspot::startAction(action, event);
+
+ if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 20))
+ scene->_sceneMode = 1928;
+ else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 200))
+ scene->_sceneMode = 1929;
+ else
+ scene->_sceneMode = 1930;
+
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_actor1, NULL);
+ return true;
+}
+
+bool Scene1925::Hotspot3::startAction(CursorType action, Event &event) {
+ if ((!R2_GLOBALS.getFlag(29)) || (action != CURSOR_USE))
+ return SceneHotspot::startAction(action, event);
+
+ Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._player.disableControl(CURSOR_USE);
+ scene->_sceneMode = 0;
+
+ if ((R2_GLOBALS._player._position.x == 110) && (R2_GLOBALS._player._position.y == 100)) {
+ scene->_exit3._enabled = false;
+ scene->_sceneMode = 1925;
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_actor1, NULL);
+ return true;
+ }
+
+ if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 20) && (event.mousePos.y >= 30)) {
+ scene->_sceneMode = 1931;
+ } else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 200) && (event.mousePos.y < 140)) {
+ scene->_sceneMode = 1932;
+ } else if ( ( ((R2_GLOBALS._player._position.x == 112) && (R2_GLOBALS._player._position.y == 101))
+ || ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 110))
+ ) && (event.mousePos.y >= 100)) {
+ scene->_sceneMode = 1926;
+ } else if ( ( ((R2_GLOBALS._player._position.x == 112) && (R2_GLOBALS._player._position.y == 101))
+ || ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 110))
+ ) && (event.mousePos.y < 60)) {
+ scene->_sceneMode = 1927;
+ } else {
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+ }
+
+ if (scene->_sceneMode != 0)
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
+
+ return true;
+}
+
+void Scene1925::ExitUp::changeScene() {
+ Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene;
+
+ _moving = false;
+ R2_GLOBALS._player.disableControl(CURSOR_USE);
+ scene->_sceneMode = 0;
+
+ if ((R2_GLOBALS._player._position.x == 110) && (R2_GLOBALS._player._position.y == 100)) {
+ scene->_exit3._enabled = false;
+ scene->_field9B8 = 1927;
+ scene->_sceneMode = 1925;
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_actor1, NULL);
+ return;
+ }
+
+ if ( ((R2_GLOBALS._player._position.x == 112) && (R2_GLOBALS._player._position.y == 101))
+ || ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 110))) {
+ scene->_sceneMode = 1927;
+ } else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 200)) {
+ scene->_sceneMode = 1932;
+ }
+
+ if (scene->_sceneMode != 0)
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
+ else {
+ scene->_sceneMode = 1932;
+ scene->signal();
+ }
+}
+
+void Scene1925::Exit2::changeScene() {
+ Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene;
+
+ _moving = false;
+ R2_GLOBALS._player.disableControl(CURSOR_USE);
+ scene->_sceneMode = 0;
+
+ if ((R2_GLOBALS._player._position.x == 110) && (R2_GLOBALS._player._position.y == 100)) {
+ scene->_exit3._enabled = false;
+ scene->_field9B8 = 1926;
+ scene->_sceneMode = 1925;
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_actor1, NULL);
+ return;
+ }
+
+ if ( ((R2_GLOBALS._player._position.x == 112) && (R2_GLOBALS._player._position.y == 101))
+ || ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 110))) {
+ scene->_sceneMode = 1926;
+ } else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 20)) {
+ scene->_sceneMode = 1931;
+ }
+
+ if (scene->_sceneMode == 0) {
+ scene->_sceneMode = 1931;
+ scene->signal();
+ } else
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
+}
+
+void Scene1925::Exit3::changeScene() {
+ Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene;
+
+ _moving = false;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ scene->_sceneMode = 1921;
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
+}
+
+void Scene1925::Exit4::changeScene() {
+ Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene;
+
+ _moving = false;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ scene->_sceneMode = 1920;
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
+}
+
+void Scene1925::changeLevel(bool upFlag) {
+ if (R2_GLOBALS._scene1925CurrLevel < 0)
+ R2_GLOBALS._scene1925CurrLevel = 3;
+
+ if (upFlag) {
+ R2_GLOBALS._player.setup(1925, 1, 1);
+ R2_GLOBALS._player.setPosition(Common::Point(154, 200));
+ ++R2_GLOBALS._scene1925CurrLevel;
+ } else {
+ R2_GLOBALS._player.setup(1925, 1, 1);
+ R2_GLOBALS._player.setPosition(Common::Point(154, 20));
+ R2_GLOBALS._scene1925CurrLevel--;
+ }
+
+ switch (R2_GLOBALS._scene1925CurrLevel) {
+ case -1:
+ R2_GLOBALS._sceneManager.changeScene(1945);
+ return;
+ break;
+ case 3:
+ loadScene(_levelResNum[4]);
+ _item2.setDetails(Rect(133, 68, 140, 77), 1925, 3, -1, 5, 2, NULL);
+ _actor1.setDetails(1925, 0, 1, 2, 2, (SceneItem *) NULL);
+ _actor1.show();
+ break;
+ case 512:
+ R2_GLOBALS._scene1925CurrLevel = 508;
+ // No break on purpose
+ default:
+ loadScene(_levelResNum[(R2_GLOBALS._scene1925CurrLevel % 4)]);
+ R2_GLOBALS._sceneItems.remove(&_item2);
+ R2_GLOBALS._sceneItems.remove(&_actor1);
+ _actor1.hide();
+ break;
+ }
+
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+}
+
+void Scene1925::postInit(SceneObjectList *OwnerList) {
+ _levelResNum[0] = 1930;
+ _levelResNum[1] = 1935;
+ _levelResNum[2] = 1940;
+ _levelResNum[3] = 1935;
+ _levelResNum[4] = 1925;
+
+ if (R2_GLOBALS.getFlag(29)) {
+ if ((R2_GLOBALS._scene1925CurrLevel == -3) || (R2_GLOBALS._scene1925CurrLevel == 3))
+ loadScene(_levelResNum[4]);
+ else
+ loadScene(_levelResNum[R2_GLOBALS._scene1925CurrLevel % 4]);
+ } else {
+ R2_GLOBALS._scene1925CurrLevel = -2;
+ loadScene(1920);
+ }
+ SceneExt::postInit();
+ R2_GLOBALS._sound1.play(220);
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._player._characterScene[2] = 1925;
+ R2_GLOBALS._player._characterIndex = R2_SEEKER;
+ switch (R2_GLOBALS._scene1925CurrLevel) {
+ case -2:
+ _exit4.setDetails(Rect(203, 44, 247, 111), EXITCURSOR_E, 1925);
+ _item3.setDetails(Rect(31, 3, 45, 167), 1925, 6, -1, 8, 1, NULL);
+ break;
+ case 3:
+ _actor1.setDetails(1925, 0, 1, 2, 1, (SceneItem *) NULL);
+ _item2.setDetails(Rect(133, 68, 140, 77), 1925, 3, -1, 5, 1, NULL);
+ // No break on purpose
+ case -3:
+ _exit3.setDetails(Rect(83, 38, 128, 101), EXITCURSOR_W, 1925);
+ // No break on purpose
+ default:
+ _exitUp.setDetails(Rect(128, 0, 186, 10), EXITCURSOR_N, 1925);
+ _exit2.setDetails(Rect(128, 160, 190, 167), EXITCURSOR_S, 1925);
+ _item3.setDetails(Rect(141, 11, 167, 159), 1925, 6, -1, -1, 1, NULL);
+ break;
+ }
+
+ _actor1.postInit();
+ _actor1.setup(1925, 5, 1);
+ _actor1.setPosition(Common::Point(128, 35));
+ _actor1.hide();
+
+ if (R2_GLOBALS._scene1925CurrLevel == 3)
+ _actor1.show();
+
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ switch (R2_GLOBALS._scene1925CurrLevel) {
+ case -2:
+ R2_GLOBALS._player.setup(20, 6, 1);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.setPosition(Common::Point(224, 109));
+ break;
+ case -3:
+ _actor1.hide();
+ R2_GLOBALS._player.setup(20, 5, 1);
+ R2_GLOBALS._player.setPosition(Common::Point(110, 100));
+ break;
+ case 0:
+ R2_GLOBALS._player.setup(1925, 1, 1);
+ R2_GLOBALS._player.setPosition(Common::Point(154, 200));
+ break;
+ default:
+ R2_GLOBALS._player.setup(1925, 1, 3);
+ R2_GLOBALS._player.setPosition(Common::Point(154, 110));
+ break;
+ }
+
+ R2_GLOBALS._player._canWalk = false;
+ _field9B8 = 0;
+ R2_GLOBALS._sceneManager._previousScene = 1925;
+ _item1.setDetails(Rect(27, 0, 292, 200), 1925, 9, -1, -1, 1, NULL);
+}
+
+void Scene1925::remove() {
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ R2_GLOBALS._player._oldCharacterScene[2] = 1925;
+ SceneExt::remove();
+}
+
+void Scene1925::signal() {
+ switch (_sceneMode) {
+ case 1920:
+ // No break on purpose
+ case 1921:
+ // No break on purpose
+ case 1928:
+ // No break on purpose
+ case 1929:
+ // No break on purpose
+ case 1930:
+ R2_GLOBALS._scene1925CurrLevel = -3;
+ R2_GLOBALS._sceneManager.changeScene(1900);
+ break;
+ case 1926:
+ // No break on purpose
+ case 1931:
+ // Change level, down
+ changeLevel(false);
+ break;
+ case 1927:
+ // No break on purpose
+ case 1932:
+ // Change level, up
+ changeLevel(true);
+ break;
+ case 1925:
+ _exit3._enabled = false;
+ if (_field9B8 != 0) {
+ _sceneMode = _field9B8;
+ _field9B8 = 0;
+ setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
+ }
+ // No break on purpose
+ default:
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ break;
+ }
+
+ R2_GLOBALS._player._canWalk = false;
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 1945 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene1945::Scene1945() {
+ _fieldEAA = 0;
+ _fieldEAC = 0;
+ _fieldEAE = CURSOR_NONE;
+}
+
+void Scene1945::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_fieldEAA);
+ s.syncAsSint16LE(_fieldEAC);
+ s.syncAsSint16LE(_fieldEAE);
+}
+
+bool Scene1945::Hotspot3::startAction(CursorType action, Event &event) {
+ Scene1945 *scene = (Scene1945 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case R2_GUNPOWDER:
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 0;
+ if ((R2_GLOBALS._player._position.x == 191) && (R2_GLOBALS._player._position.y == 142))
+ scene->_sceneMode = 1942;
+ else {
+ scene->_sceneMode = 1940;
+ scene->_fieldEAA = 1942;
+ }
+ // At this point the original check if _sceneMode != 0. Skipped.
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
+ return true;
+ break;
+ case CURSOR_USE:
+ R2_GLOBALS._player.disableControl(CURSOR_USE);
+ scene->_sceneMode = 0;
+ if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 50) && (event.mousePos.x >= 130)) {
+ scene->_sceneMode = 1940;
+ // At this point the original check if _sceneMode != 0. Skipped.
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
+ return true;
+ } else {
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+ if (event.mousePos.x > 130)
+ scene->_item3.setDetails(1945, 3, -1, -1, 3, (SceneItem *) NULL);
+ else
+ scene->_item3.setDetails(1945, 3, -1, 5, 3, (SceneItem *) NULL);
+ }
+ // No break on purpose
+ default:
+ return SceneHotspot::startAction(action, event);
+ break;
+ }
+}
+
+bool Scene1945::Hotspot4::startAction(CursorType action, Event &event) {
+ Scene1945 *scene = (Scene1945 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return SceneHotspot::startAction(action, event);
+
+ R2_GLOBALS._player.disableControl(CURSOR_USE);
+ scene->_sceneMode = 0;
+
+ if ((R2_GLOBALS._player._position.x == 221) && (R2_GLOBALS._player._position.y == 142)) {
+ scene->_sceneMode = 1949;
+ scene->_fieldEAA = 1947;
+ } else if ( ((R2_GLOBALS._player._position.x == 197) && (R2_GLOBALS._player._position.y == 158))
+ || ((R2_GLOBALS._player._position.x == 191) && (R2_GLOBALS._player._position.y == 142)) ) {
+ scene->_sceneMode = 1947;
+ } else if ((R2_GLOBALS._player._position.x == 221) && (R2_GLOBALS._player._position.y == 142) && (event.mousePos.y >= 30)) {
+ scene->_sceneMode = 1940;
+ } else {
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+ }
+
+ if (scene->_sceneMode != 0)
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
+
+ return true;
+}
+
+bool Scene1945::Actor3::startAction(CursorType action, Event &event) {
+ if ((action == R2_ALCOHOL_LAMP_3) && (action == R2_ALCOHOL_LAMP_2)) {
+ Scene1945 *scene = (Scene1945 *)R2_GLOBALS._sceneManager._scene;
+
+ scene->_fieldEAE = action;
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 0;
+ if ((R2_GLOBALS._player._position.x == 191) && (R2_GLOBALS._player._position.y == 142)) {
+ scene->_sceneMode= 1947;
+ scene->_fieldEAA = 1943;
+ } else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 50)) {
+ scene->_sceneMode = 1940;
+ scene->_fieldEAA = 1943;
+ } else {
+ scene->_sceneMode = 1949;
+ scene->_fieldEAA = 1947;
+ scene->_fieldEAC = 1943;
+ }
+ // At this point the original check if _sceneMode != 0. Skipped.
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+}
+
+void Scene1945::ExitUp::changeScene() {
+ Scene1945 *scene = (Scene1945 *)R2_GLOBALS._sceneManager._scene;
+
+ _moving = false;
+ R2_GLOBALS._player.disableControl(CURSOR_USE);
+ scene->_sceneMode = 0;
+
+ if ((R2_GLOBALS._player._position.x == 221) && (R2_GLOBALS._player._position.y == 142)) {
+ scene->_sceneMode = 1949;
+ scene->_fieldEAA = 1947;
+ } else if ( ((R2_GLOBALS._player._position.x == 197) && (R2_GLOBALS._player._position.y == 158))
+ || ((R2_GLOBALS._player._position.x == 191) && (R2_GLOBALS._player._position.y == 142)) ) {
+ scene->_sceneMode = 1947;
+ }
+
+ if (scene->_sceneMode == 0) {
+ scene->_sceneMode = 1941;
+ signal();
+ } else {
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
+ }
+}
+
+void Scene1945::Exit2::changeScene() {
+ Scene1945 *scene = (Scene1945 *)R2_GLOBALS._sceneManager._scene;
+
+ _moving = false;
+ R2_GLOBALS._player.disableControl(CURSOR_USE);
+ scene->_sceneMode = 0;
+
+ if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 50)) {
+ scene->_sceneMode = 1940;
+ scene->_fieldEAA = 1945;
+ } else if ( ((R2_GLOBALS._player._position.x == 197) && (R2_GLOBALS._player._position.y == 158))
+ || ((R2_GLOBALS._player._position.x == 191) && (R2_GLOBALS._player._position.y == 142)) ) {
+ scene->_sceneMode = 1945;
+ }
+
+ if (scene->_sceneMode != 0)
+ scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
+}
+
+void Scene1945::postInit(SceneObjectList *OwnerList) {
+ loadScene(1945);
+ SceneExt::postInit();
+ R2_GLOBALS._sound1.play(220);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+ R2_GLOBALS._player._characterScene[2] = 1945;
+ R2_GLOBALS._player._characterIndex = R2_SEEKER;
+
+ _exitUp.setDetails(Rect(128, 0, 186, 10), EXITCURSOR_N, 1945);
+ _exit2.setDetails(Rect(238, 144, 274, 167), EXITCURSOR_E, 1945);
+
+ _item4.setDetails(Rect(141, 3, 167, 126), 1945, 9, -1, -1, 1, NULL);
+
+ if (!R2_GLOBALS.getFlag(43)) {
+ _exit2._enabled = false;
+ _actor3.postInit();
+ _actor3.setup(1945, 4, 1);
+ _actor3.setPosition(Common::Point(253, 169));
+ _actor3.fixPriority(150);
+
+ if (R2_GLOBALS.getFlag(42))
+ _actor3.setDetails(1945, 15, -1, -1, 1, (SceneItem *) NULL);
+ else
+ _actor3.hide();
+
+ _actor1.postInit();
+ _actor1.setup(1945, 8, 1);
+ _actor1.setPosition(Common::Point(253, 169));
+ _actor1.fixPriority(130);
+
+ _actor2.postInit();
+ _actor2.setup(1945, 3, 1);
+ _actor2.hide();
+ } else {
+ _exit2._enabled = true;
+ }
+
+ switch (R2_GLOBALS._sceneManager._previousScene) {
+ case 1925:
+ R2_GLOBALS._scene1925CurrLevel = 0;
+ R2_GLOBALS.clearFlag(29);
+ R2_GLOBALS._player.setup(1925, 1, 10);
+ R2_GLOBALS._player.setPosition(Common::Point(154, 50));
+ break;
+ case 1950:
+ _sceneMode = 1944;
+ setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL);
+ R2_GLOBALS._player.disableControl(CURSOR_USE);
+ break;
+ default:
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.setup(20, 5, 1);
+ R2_GLOBALS._player.setPosition(Common::Point(191, 142));
+ break;
+ }
+
+ R2_GLOBALS._player._canWalk = false;
+ _fieldEAA = 0;
+ _fieldEAC = 0;
+
+ _item3.setDetails(11, 1945, 3, -1, 5);
+ _item1.setDetails(Rect(238, 144, 274, 167), 1945, 0, -1, 2, 1, NULL);
+ _item2.setDetails(Rect(27, 3, 292, 167), 1945, 3, -1, -1, 1, NULL);
+}
+
+void Scene1945::remove() {
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene1945::signal() {
+ switch (_sceneMode) {
+ case 1940:
+ if (_fieldEAA == 1943) {
+ _sceneMode = _fieldEAA;
+ setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_actor2, NULL);
+ } else {
+ _sceneMode = 1946;
+ setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL);
+ }
+ return;
+ break;
+ case 1941:
+ if (_fieldEAA == 0) {
+ R2_GLOBALS._scene1925CurrLevel = 0;
+ R2_GLOBALS.setFlag(29);
+ R2_GLOBALS._sceneManager.changeScene(1925);
+ } else {
+ _sceneMode = _fieldEAA;
+ _fieldEAA = 0;
+ setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL);
+ }
+ return;
+ case 1942:
+ R2_INVENTORY.setObjectScene(R2_GUNPOWDER, 0);
+ _actor3.setDetails(1945, 15, -1, -1, 2, (SceneItem *) NULL);
+ R2_GLOBALS.setFlag(42);
+ break;
+ case 1943:
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ R2_INVENTORY.setObjectScene(_fieldEAE, 0);
+ _sceneMode = 1948;
+ setAction(&_sequenceManager1, this, _sceneMode, &_actor3, &_actor2, &_actor1, NULL);
+ setAction(&_sequenceManager2, NULL, 1941, &R2_GLOBALS._player, NULL);
+ return;
+ case 1944:
+ break;
+ case 1945:
+ R2_GLOBALS._sceneManager.changeScene(1950);
+ return;
+ case 1946:
+ if (_fieldEAA == 1942) {
+ _sceneMode = _fieldEAA;
+ _fieldEAA = 0;
+ setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_actor3, NULL);
+ return;
+ }
+ break;
+ case 1947:
+ if (_fieldEAA == 1943) {
+ _sceneMode = _fieldEAA;
+ _fieldEAA = 1948;
+ setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_actor2, NULL);
+ } else {
+ _sceneMode = 1941;
+ setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL);
+ }
+ return;
+ case 1948:
+ R2_GLOBALS._sound1.play(220);
+ _exit2._enabled = true;
+ R2_GLOBALS._sceneItems.remove(&_actor3);
+ R2_GLOBALS.clearFlag(42);
+ R2_GLOBALS.clearFlag(43);
+ _fieldEAA = 1940;
+ // No break on purpose
+ case 1949:
+ _sceneMode = _fieldEAA;
+ if (_fieldEAC == 1943) {
+ _fieldEAA = _fieldEAC;
+ _fieldEAC = 0;
+ setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_actor2, NULL);
+ } else {
+ _fieldEAA = 0;
+ setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL);
+ }
+ return;
+ default:
+ break;
+ }
+
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 1950 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene1950::Area1::Area1() {
+ _field20 = 0;
+ _fieldB65 = 0;
+}
+void Scene1950::Area1::synchronize(Serializer &s) {
+ SceneArea::synchronize(s);
+
+ s.syncAsByte(_field20);
+ s.syncAsSint16LE(_fieldB65);
+}
+
+Scene1950::Scene1950() {
+ _field412 = 0;
+ _field414 = 0;
+ _field416 = 0;
+ _field418 = Common::Point(0, 0);
+ _field41C = 0;
+}
+
+void Scene1950::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field412);
+ s.syncAsSint16LE(_field414);
+ s.syncAsSint16LE(_field416);
+ s.syncAsSint16LE(_field418.x);
+ s.syncAsSint16LE(_field418.y);
+ s.syncAsSint16LE(_field41C);
+}
+
+Scene1950::Area1::Actor10::Actor10() {
+ _fieldA4 = 0;
+ _fieldA6 = 0;
+ _fieldA8 = 0;
+}
+
+void Scene1950::Area1::Actor10::synchronize(Serializer &s) {
+ SceneActor::synchronize(s);
+
+ s.syncAsSint16LE(_fieldA4);
+ s.syncAsSint16LE(_fieldA6);
+ s.syncAsSint16LE(_fieldA8);
+}
+
+void Scene1950::Area1::Actor10::init(int indx) {
+// Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
+
+ _fieldA4 = indx;
+ _fieldA6 = 0;
+ _fieldA8 = 0;
+
+ postInit();
+ setup(1971, 2, 1);
+ fixPriority(249);
+ setPosition(Common::Point(((_fieldA4 / 4) * 22) + 127, ((_fieldA4 / 4) * 19) + 71));
+ warning("FIXME: invalid call to scene->_sceneAreas.push_front(this);");
+}
+
+void Scene1950::Area1::Actor10::process(Event &event) {
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE) && (_bounds.contains(event.mousePos)) && (_fieldA6 == 0)) {
+ R2_GLOBALS._sound2.play(227);
+ if (_fieldA8 == 0) {
+ setFrame(2);
+ _fieldA8 = 1;
+ } else {
+ setFrame(1);
+ _fieldA8 = 0;
+ }
+ _fieldA6 = 1;
+ event.handled = true;
+ }
+
+ if ((event.eventType == EVENT_BUTTON_UP) && (_fieldA6 != 0)) {
+ _fieldA6 = 0;
+ event.handled = true;
+ Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
+ scene->subBF4B4(_fieldA4);
+ }
+}
+
+bool Scene1950::Area1::Actor10::startAction(CursorType action, Event &event) {
+ if (action == CURSOR_USE)
+ return false;
+ return SceneActor::startAction(action, event);
+}
+
+void Scene1950::Area1::remove() {
+ Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
+ for (_fieldB65 = 0; _fieldB65 < 16; ++_fieldB65) {
+ warning("Unexpected _sceneAreas.remove() call");
+ // R2_GLOBALS._sceneAreas.remove(&_arrActor1[_fieldB65]);
+ _arrActor1[_fieldB65].remove();
+ }
+
+ // sub201EA
+ R2_GLOBALS._sceneItems.remove((SceneItem *)this);
+ _areaActor.remove();
+ SceneArea::remove();
+ R2_GLOBALS._insetUp--;
+ //
+
+ if (!R2_GLOBALS.getFlag(37))
+ R2_GLOBALS._sound2.play(278);
+
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ scene->_exit3._enabled = true;
+
+ if (!R2_GLOBALS.getFlag(37)) {
+ if (R2_GLOBALS.getFlag(36)) {
+ scene->_sceneMode = 1964;
+ scene->setAction(&scene->_sequenceManager, scene, 1964, &R2_GLOBALS._player, NULL);
+ } else {
+ scene->_sceneMode = 1965;
+ scene->setAction(&scene->_sequenceManager, scene, 1965, &R2_GLOBALS._player, NULL);
+ }
+ }
+}
+
+void Scene1950::Area1::process(Event &event) {
+// This is a copy of Scene1200::Area1::process
+ if (_field20 != R2_GLOBALS._insetUp)
+ return;
+
+ CursorType cursor = R2_GLOBALS._events.getCursor();
+
+ if (_areaActor._bounds.contains(event.mousePos.x + g_globals->gfxManager()._bounds.left , event.mousePos.y)) {
+ if (cursor == _cursorNum)
+ warning("TODO: _cursorState = ???");
+ R2_GLOBALS._events.setCursor(_savedCursorNum); //, _cursorState);
+ } else if (event.mousePos.y < 168) {
+ if (cursor != _cursorNum) {
+ _savedCursorNum = cursor;
+ warning("TODO: _cursorState = ???");
+ R2_GLOBALS._events.setCursor(CURSOR_INVALID);
+ }
+ if (event.eventType == EVENT_BUTTON_DOWN) {
+ event.handled = true;
+ warning("TODO: _cursorState = ???");
+ R2_GLOBALS._events.setCursor(_savedCursorNum); //, _cursorState);
+ remove();
+ }
+ }
+}
+
+void Scene1950::Area1::proc12(int visage, int stripFrameNum, int frameNum, int posX, int posY) {
+ Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
+
+ if (R2_GLOBALS._player._mover)
+ R2_GLOBALS._player.addMover(NULL);
+ R2_GLOBALS._player._canWalk = false;
+
+ // UnkArea1200::proc12();
+ _areaActor.postInit();
+ _areaActor.setup(visage, stripFrameNum, frameNum);
+ _areaActor.setPosition(Common::Point(posX, posY));
+ _areaActor.fixPriority(250);
+ _cursorNum = CURSOR_INVALID;
+ scene->_sceneAreas.push_front(this);
+ ++R2_GLOBALS._insetUp;
+ _field20 = R2_GLOBALS._insetUp;
+ //
+
+ _areaActor.fixPriority(248);
+ scene->_exit3._enabled = false;
+ proc13(1950, 27, 28, 27);
+
+ for (_fieldB65 = 0; _fieldB65 < 16; _fieldB65++)
+ _arrActor1[_fieldB65].init(_fieldB65);
+}
+
+void Scene1950::Area1::proc13(int resNum, int lookLineNum, int talkLineNum, int useLineNum) {
+ // Copy of Scene1200::Area1::proc13()
+ _areaActor.setDetails(resNum, lookLineNum, talkLineNum, useLineNum, 2, (SceneItem *) NULL);
+}
+
+bool Scene1950::Hotspot2::startAction(CursorType action, Event &event) {
+ if ((action != CURSOR_USE) || (R2_GLOBALS.getFlag(37)))
+ return SceneHotspot::startAction(action, event);
+
+ Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._player.disableControl();
+ if (R2_GLOBALS.getFlag(36)) {
+ scene->_sceneMode = 1962;
+ scene->setAction(&scene->_sequenceManager, scene, 1962, &R2_GLOBALS._player, NULL);
+ } else {
+ scene->_sceneMode = 1963;
+ scene->setAction(&scene->_sequenceManager, scene, 1963, &R2_GLOBALS._player, NULL);
+ }
+ return true;
+}
+
+bool Scene1950::Actor2::startAction(CursorType action, Event &event) {
+ if (action != R2_SCRITH_KEY)
+ return SceneActor::startAction(action, event);
+
+ Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._player.disableControl();
+ R2_INVENTORY.setObjectScene(31, 0);
+ scene->_sceneMode = 1958;
+ scene->setAction(&scene->_sequenceManager, scene, 1958, &R2_GLOBALS._player, &scene->_actor2, NULL);
+ return true;
+}
+
+bool Scene1950::Actor3::startAction(CursorType action, Event &event) {
+ if ((action != CURSOR_USE) || (R2_INVENTORY.getObjectScene(35) != 1950))
+ return SceneActor::startAction(action, event);
+
+ Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1968;
+ scene->setAction(&scene->_sequenceManager, scene, 1968, &R2_GLOBALS._player, NULL);
+
+ return true;
+}
+
+bool Scene1950::Actor5::startAction(CursorType action, Event &event) {
+ if ((action != CURSOR_USE) || (!R2_GLOBALS.getFlag(37)))
+ return SceneActor::startAction(action, event);
+
+ Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 1967;
+ scene->setAction(&scene->_sequenceManager, scene, 1967, &R2_GLOBALS._player, NULL);
+
+ return true;
+}
+
+Scene1950::Actor8::Actor8() {
+ _fieldA4 = 0;
+ _fieldA6 = 0;
+ _fieldA8 = 0;
+ _fieldAA = 0;
+ _fieldAC = 0;
+ _fieldAE = 0;
+ _fieldAF = 0;
+}
+
+void Scene1950::Actor8::synchronize(Serializer &s) {
+ SceneActor::synchronize(s);
+
+ s.syncAsSint16LE(_fieldA4);
+ s.syncAsSint16LE(_fieldA6);
+ s.syncAsSint16LE(_fieldA8);
+ s.syncAsSint16LE(_fieldAA);
+ s.syncAsSint16LE(_fieldAC);
+ s.syncAsByte(_fieldAE);
+ s.syncAsByte(_fieldAF);
+}
+
+void Scene1950::Actor8::signal() {
+ Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_fieldAC) {
+ case 19: {
+ _fieldAC = 0;
+ setVisage(1960);
+ if (R2_GLOBALS._v566A5 == 3)
+ setStrip(2);
+ else
+ setStrip(1);
+
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &scene->_field418, this);
+ }
+ break;
+ case 20: {
+ _fieldAC = 19;
+ R2_GLOBALS._player.setVisage(22);
+ if (R2_GLOBALS._v566A5 == 3)
+ R2_GLOBALS._player.setStrip(1);
+ else
+ R2_GLOBALS._player.setStrip(2);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._v56613[((scene->_field41C - 1) * 4) + 1]--;
+
+ if (R2_GLOBALS._v566A5 == 3)
+ _fieldA4 = _position.x + 10;
+ else
+ _fieldA4 = _position.x - 10;
+
+ _fieldA6 = _position.y -4;
+ setVisage(1961);
+
+ if (R2_GLOBALS._v566A5 == 3)
+ setStrip(2);
+ else
+ setStrip(1);
+
+ animate(ANIM_MODE_2, NULL);
+ Common::Point pt(_fieldA4, _fieldA6);
+ PlayerMover *mover = new PlayerMover();
+ addMover(mover, &pt, this);
+
+ R2_GLOBALS._player.enableControl();
+ }
+ break;
+ case 21:
+ R2_GLOBALS._player.setVisage(22);
+ if (R2_GLOBALS._v566A5 == 3)
+ R2_GLOBALS._player.setStrip(1);
+ else
+ R2_GLOBALS._player.setStrip(2);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+
+ setVisage(1961);
+ if (R2_GLOBALS._v566A5 == 3)
+ setStrip(4);
+ else
+ setStrip(3);
+ setDetails(1950, 15, -1, 17, 2, (SceneItem *) NULL);
+ addMover(NULL);
+ _numFrames = 8;
+ R2_GLOBALS._sound2.play(226);
+ animate(ANIM_MODE_5, NULL);
+ fixPriority(10);
+ R2_GLOBALS._v56613[((scene->_field41C - 1) * 4) ]--;
+ R2_GLOBALS._v56613[((scene->_field41C - 1) * 4) + 1]--;
+ R2_GLOBALS._v56613[((scene->_field41C - 1) * 4) + 2] = _position.x;
+ R2_GLOBALS._v56613[((scene->_field41C - 1) * 4) + 3] = _position.y;
+ _fieldA8 = (_position.x - R2_GLOBALS._player._position.x) / 2;
+ _fieldAA = (_position.y - R2_GLOBALS._player._position.y) / 2;
+
+ _fieldAE = 0;
+ for (_fieldAF = 0; _fieldAF < 18; ++_fieldAF)
+ if (R2_GLOBALS._v56613[4 * _fieldAF] == 0)
+ ++_fieldAE;
+
+ if (_fieldAE == 18) {
+ R2_GLOBALS.setFlag(36);
+ _fieldAC = 23;
+ Common::Point pt(R2_GLOBALS._player._position.x + _fieldA8, R2_GLOBALS._player._position.y + _fieldAA);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else if (_fieldAE == 1) {
+ _fieldAC = 22;
+ Common::Point pt(R2_GLOBALS._player._position.x + _fieldA8, R2_GLOBALS._player._position.y + _fieldAA);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else {
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ }
+
+ if (R2_GLOBALS._v566A5 == 3)
+ scene->_exit3._enabled = true;
+ else
+ scene->_exit6._enabled = true;
+
+ scene->_field416 = 0;
+ break;
+ case 22:
+ SceneItem::display(1950, 18, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ break;
+ case 23:
+ SceneItem::display(1950, 25, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ scene->_sceneMode = R2_GLOBALS._v566A5;
+ scene->setAction(&scene->_sequenceManager, scene, 1960, &R2_GLOBALS._player, NULL);
+ break;
+ default:
+ break;
+ }
+}
+
+bool Scene1950::Actor8::startAction(CursorType action, Event &event) {
+ Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((R2_GLOBALS._v56613[(scene->_field41C - 1) * 4] == 0) || (action != R2_PHOTON_STUNNER))
+ return SceneActor::startAction(action, event);
+
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_GLOBALS._v56613[((scene->_field41C - 1) * 4) + 1] <= 1)
+ _fieldAC = 21;
+ else
+ _fieldAC = 20;
+
+ R2_GLOBALS._player.setVisage(25);
+ if (R2_GLOBALS._v566A5 == 3)
+ R2_GLOBALS._player.setStrip(2);
+ else
+ R2_GLOBALS._player.setStrip(1);
+ R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+ R2_GLOBALS._sound3.play(99);
+
+ return true;
+}
+
+void Scene1950::Exit1::changeScene() {
+ Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ R2_GLOBALS._v566A5 = 1;
+ scene->_sceneMode = 11;
+
+ Common::Point pt(160, 127);
+ PlayerMover *mover = new PlayerMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene1950::Exit2::changeScene() {
+ Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ R2_GLOBALS._v566A5 = 2;
+ scene->_sceneMode = 12;
+
+ if (scene->_field412 == 0) {
+ if (R2_GLOBALS.getFlag(36))
+ scene->setAction(&scene->_sequenceManager, scene, 1953, &R2_GLOBALS._player, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager, scene, 1970, &R2_GLOBALS._player, NULL);
+ } else {
+ if (R2_GLOBALS.getFlag(36))
+ scene->setAction(&scene->_sequenceManager, scene, 1952, &R2_GLOBALS._player, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager, scene, 1969, &R2_GLOBALS._player, NULL);
+ }
+}
+
+void Scene1950::Exit3::changeScene() {
+ Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ R2_GLOBALS._v566A5 = 3;
+ scene->_sceneMode = 13;
+
+ if (scene->_field416 != 0)
+ R2_GLOBALS._player.animate(ANIM_MODE_9);
+
+ Common::Point pt(340, 160);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene1950::Exit4::changeScene() {
+ Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ R2_GLOBALS._v566A5 = 4;
+ scene->_sceneMode = 14;
+
+ if (R2_GLOBALS.getFlag(36))
+ scene->setAction(&scene->_sequenceManager, scene, 1956, &R2_GLOBALS._player, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager, scene, 1973, &R2_GLOBALS._player, NULL);
+}
+
+void Scene1950::Exit5::changeScene() {
+ Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ R2_GLOBALS._v566A5 = 5;
+ scene->_sceneMode = 15;
+
+ Common::Point pt(160, 213);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene1950::Exit6::changeScene() {
+ Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ R2_GLOBALS._v566A5 = 5;
+ if (R2_GLOBALS._v566A4 == 2) {
+ if ((R2_GLOBALS.getFlag(36)) && (R2_INVENTORY.getObjectScene(34) == 2) && (R2_INVENTORY.getObjectScene(35) == 2)) {
+ scene->_sceneMode = 1961;
+ Common::Point pt(-20, 160);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ } else {
+ if (!R2_GLOBALS.getFlag(36))
+ SceneItem::display(1950, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ if ((R2_INVENTORY.getObjectScene(34) == 1950) || (R2_INVENTORY.getObjectScene(35) == 1950))
+ SceneItem::display(1950, 34, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ scene->_sceneMode = 0;
+ Common::Point pt(30, 160);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ }
+ } else {
+ if (scene->_field416 != 0)
+ R2_GLOBALS._player.animate(ANIM_MODE_9);
+
+ scene->_sceneMode = 16;
+ Common::Point pt(-20, 160);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ }
+}
+
+void Scene1950::Exit7::changeScene() {
+ Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ R2_GLOBALS._v566A5 = 0;
+ scene->_sceneMode = 1951;
+ scene->setAction(&scene->_sequenceManager, scene, 1951, &R2_GLOBALS._player, NULL);
+}
+
+void Scene1950::Exit8::changeScene() {
+ Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ R2_GLOBALS._v566A5 = 3;
+ if (R2_GLOBALS._player._visage == 22) {
+ scene->_sceneMode = 1975;
+ scene->setAction(&scene->_sequenceManager, scene, 1975, &R2_GLOBALS._player, NULL);
+ } else {
+ SceneItem::display(1950, 22, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ R2_GLOBALS._v566A5 = 0;
+ scene->_sceneMode = 0;
+ Common::Point pt(250, 150);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ _enabled = true;
+ }
+}
+
+void Scene1950::subBDC1E() {
+ _exit1._enabled = false;
+ _exit2._enabled = false;
+ _exit3._enabled = false;
+ _exit4._enabled = false;
+ _exit5._enabled = false;
+ _exit6._enabled = false;
+ _exit7._enabled = false;
+ _exit8._enabled = false;
+ _exit1._insideArea = false;
+ _exit2._insideArea = false;
+ _exit3._insideArea = false;
+ _exit4._insideArea = false;
+ _exit5._insideArea = false;
+ _exit6._insideArea = false;
+ _exit7._insideArea = false;
+ _exit8._insideArea = false;
+ _exit1._moving = false;
+ _exit2._moving = false;
+ _exit3._moving = false;
+ _exit4._moving = false;
+ _exit5._moving = false;
+ _exit6._moving = false;
+ _exit7._moving = false;
+ _exit8._moving = false;
+ _field412 = 0;
+ switch (R2_GLOBALS._v566A4 - 1) {
+ case 0:
+ loadScene(1948);
+ break;
+ case 1:
+ // No break on purpose
+ case 8:
+ // No break on purpose
+ case 10:
+ // No break on purpose
+ case 12:
+ // No break on purpose
+ case 16:
+ // No break on purpose
+ case 19:
+ // No break on purpose
+ case 23:
+ // No break on purpose
+ case 30:
+ // No break on purpose
+ case 44:
+ // No break on purpose
+ case 72:
+ // No break on purpose
+ case 74:
+ // No break on purpose
+ case 86:
+ // No break on purpose
+ case 96:
+ // No break on purpose
+ case 103:
+ loadScene(1950);
+ break;
+ case 2:
+ // No break on purpose
+ case 29:
+ loadScene(1965);
+ break;
+ case 3:
+ // No break on purpose
+ case 9:
+ // No break on purpose
+ case 11:
+ // No break on purpose
+ case 15:
+ // No break on purpose
+ case 24:
+ // No break on purpose
+ case 39:
+ // No break on purpose
+ case 45:
+ // No break on purpose
+ case 71:
+ // No break on purpose
+ case 73:
+ // No break on purpose
+ case 75:
+ // No break on purpose
+ case 79:
+ // No break on purpose
+ case 85:
+ // No break on purpose
+ case 87:
+ // No break on purpose
+ case 95:
+ loadScene(1955);
+ break;
+ case 4:
+ // No break on purpose
+ case 6:
+ // No break on purpose
+ case 13:
+ // No break on purpose
+ case 27:
+ // No break on purpose
+ case 41:
+ // No break on purpose
+ case 48:
+ // No break on purpose
+ case 50:
+ // No break on purpose
+ case 54:
+ // No break on purpose
+ case 76:
+ // No break on purpose
+ case 80:
+ // No break on purpose
+ case 90:
+ // No break on purpose
+ case 104:
+ loadScene(1975);
+ break;
+ case 5:
+ // No break on purpose
+ case 7:
+ // No break on purpose
+ case 14:
+ // No break on purpose
+ case 28:
+ // No break on purpose
+ case 32:
+ // No break on purpose
+ case 47:
+ // No break on purpose
+ case 53:
+ loadScene(1997);
+ break;
+ case 17:
+ // No break on purpose
+ case 20:
+ // No break on purpose
+ case 25:
+ // No break on purpose
+ case 31:
+ // No break on purpose
+ case 33:
+ // No break on purpose
+ case 46:
+ loadScene(1995);
+ break;
+ case 18:
+ // No break on purpose
+ case 22:
+ // No break on purpose
+ case 26:
+ // No break on purpose
+ case 36:
+ // No break on purpose
+ case 38:
+ // No break on purpose
+ case 43:
+ // No break on purpose
+ case 51:
+ // No break on purpose
+ case 70:
+ // No break on purpose
+ case 78:
+ // No break on purpose
+ case 84:
+ // No break on purpose
+ case 89:
+ // No break on purpose
+ case 101:
+ loadScene(1970);
+ break;
+ case 21:
+ // No break on purpose
+ case 34:
+ // No break on purpose
+ case 57:
+ // No break on purpose
+ case 58:
+ // No break on purpose
+ case 59:
+ // No break on purpose
+ case 62:
+ // No break on purpose
+ case 65:
+ loadScene(1980);
+ break;
+ case 35:
+ // No break on purpose
+ case 61:
+ // No break on purpose
+ case 77:
+ // No break on purpose
+ case 83:
+ loadScene(1982);
+ break;
+ case 37:
+ // No break on purpose
+ case 52:
+ // No break on purpose
+ case 82:
+ // No break on purpose
+ case 88:
+ // No break on purpose
+ case 92:
+ // No break on purpose
+ case 97:
+ // No break on purpose
+ case 100:
+ loadScene(1962);
+ break;
+ case 40:
+ // No break on purpose
+ case 102:
+ loadScene(1960);
+ break;
+ case 42:
+ // No break on purpose
+ case 55:
+ // No break on purpose
+ case 60:
+ // No break on purpose
+ case 66:
+ // No break on purpose
+ case 68:
+ // No break on purpose
+ case 69:
+ // No break on purpose
+ case 93:
+ // No break on purpose
+ case 98:
+ loadScene(1990);
+ break;
+ case 49:
+ // No break on purpose
+ case 81:
+ // No break on purpose
+ case 91:
+ // No break on purpose
+ case 94:
+ // No break on purpose
+ case 99:
+ loadScene(1967);
+ break;
+ case 56:
+ // No break on purpose
+ case 63:
+ // No break on purpose
+ case 64:
+ // No break on purpose
+ case 67:
+ loadScene(1985);
+ _field412 = 1;
+ break;
+ default:
+ break;
+ }
+
+ if (R2_GLOBALS._v566A4 != 1)
+ R2_GLOBALS._walkRegions.load(1950);
+
+ switch (R2_GLOBALS._v566A4 - 1) {
+ case 0:
+ _exit7._enabled = true;
+ if ((R2_INVENTORY.getObjectScene(31) == 0) && (R2_INVENTORY.getObjectScene(34) == 1950))
+ _exit8._enabled = true;
+ R2_GLOBALS._walkRegions.enableRegion(2);
+ R2_GLOBALS._walkRegions.enableRegion(3);
+ R2_GLOBALS._walkRegions.enableRegion(4);
+ R2_GLOBALS._walkRegions.enableRegion(5);
+ R2_GLOBALS._walkRegions.enableRegion(6);
+ break;
+ case 1:
+ // No break on purpose
+ case 2:
+ // No break on purpose
+ case 3:
+ // No break on purpose
+ case 8:
+ // No break on purpose
+ case 9:
+ // No break on purpose
+ case 10:
+ // No break on purpose
+ case 11:
+ // No break on purpose
+ case 12:
+ // No break on purpose
+ case 15:
+ // No break on purpose
+ case 16:
+ // No break on purpose
+ case 19:
+ // No break on purpose
+ case 23:
+ // No break on purpose
+ case 24:
+ // No break on purpose
+ case 29:
+ // No break on purpose
+ case 30:
+ // No break on purpose
+ case 39:
+ // No break on purpose
+ case 40:
+ // No break on purpose
+ case 44:
+ // No break on purpose
+ case 45:
+ // No break on purpose
+ case 71:
+ // No break on purpose
+ case 72:
+ // No break on purpose
+ case 73:
+ // No break on purpose
+ case 74:
+ // No break on purpose
+ case 75:
+ // No break on purpose
+ case 79:
+ // No break on purpose
+ case 85:
+ // No break on purpose
+ case 86:
+ // No break on purpose
+ case 87:
+ // No break on purpose
+ case 95:
+ // No break on purpose
+ case 96:
+ // No break on purpose
+ case 102:
+ // No break on purpose
+ case 103:
+ _exit3._enabled = true;
+ _exit6._enabled = true;
+ break;
+ case 4:
+ // No break on purpose
+ case 6:
+ // No break on purpose
+ case 13:
+ // No break on purpose
+ case 17:
+ // No break on purpose
+ case 20:
+ // No break on purpose
+ case 25:
+ // No break on purpose
+ case 27:
+ // No break on purpose
+ case 31:
+ // No break on purpose
+ case 33:
+ // No break on purpose
+ case 37:
+ // No break on purpose
+ case 41:
+ // No break on purpose
+ case 46:
+ // No break on purpose
+ case 48:
+ // No break on purpose
+ case 50:
+ // No break on purpose
+ case 52:
+ // No break on purpose
+ case 54:
+ // No break on purpose
+ case 76:
+ // No break on purpose
+ case 80:
+ // No break on purpose
+ case 82:
+ // No break on purpose
+ case 88:
+ // No break on purpose
+ case 90:
+ // No break on purpose
+ case 92:
+ // No break on purpose
+ case 97:
+ // No break on purpose
+ case 100:
+ // No break on purpose
+ case 104:
+ _exit6._enabled = true;
+ R2_GLOBALS._walkRegions.enableRegion(6);
+ R2_GLOBALS._walkRegions.enableRegion(9);
+ break;
+ case 5:
+ // No break on purpose
+ case 7:
+ // No break on purpose
+ case 14:
+ // No break on purpose
+ case 18:
+ // No break on purpose
+ case 22:
+ // No break on purpose
+ case 26:
+ // No break on purpose
+ case 28:
+ // No break on purpose
+ case 32:
+ // No break on purpose
+ case 36:
+ // No break on purpose
+ case 38:
+ // No break on purpose
+ case 43:
+ // No break on purpose
+ case 47:
+ // No break on purpose
+ case 49:
+ // No break on purpose
+ case 51:
+ // No break on purpose
+ case 53:
+ // No break on purpose
+ case 70:
+ // No break on purpose
+ case 78:
+ // No break on purpose
+ case 81:
+ // No break on purpose
+ case 84:
+ // No break on purpose
+ case 89:
+ // No break on purpose
+ case 91:
+ // No break on purpose
+ case 94:
+ // No break on purpose
+ case 99:
+ // No break on purpose
+ case 101:
+ _exit3._enabled = true;
+ R2_GLOBALS._walkRegions.enableRegion(1);
+ R2_GLOBALS._walkRegions.enableRegion(7);
+ R2_GLOBALS._walkRegions.enableRegion(13);
+ break;
+ default:
+ R2_GLOBALS._walkRegions.enableRegion(1);
+ R2_GLOBALS._walkRegions.enableRegion(6);
+ R2_GLOBALS._walkRegions.enableRegion(7);
+ R2_GLOBALS._walkRegions.enableRegion(9);
+ R2_GLOBALS._walkRegions.enableRegion(13);
+ break;
+ }
+
+ _object1.remove();
+ _object1.removeObject();
+ _actor1.remove();
+
+ switch (R2_GLOBALS._v566A4 - 4) {
+ case 0:
+ // No break on purpose
+ case 3:
+ // No break on purpose
+ case 16:
+ // No break on purpose
+ case 22:
+ // No break on purpose
+ case 24:
+ // No break on purpose
+ case 32:
+ // No break on purpose
+ case 33:
+ // No break on purpose
+ case 45:
+ // No break on purpose
+ case 46:
+ // No break on purpose
+ case 48:
+ // No break on purpose
+ case 51:
+ // No break on purpose
+ case 56:
+ // No break on purpose
+ case 59:
+ // No break on purpose
+ case 67:
+ // No break on purpose
+ case 68:
+ // No break on purpose
+ case 70:
+ // No break on purpose
+ case 73:
+ // No break on purpose
+ case 82:
+ // No break on purpose
+ case 90:
+ _exit1._enabled = true;
+ _object1.setup2(1950, (R2_GLOBALS._v566A4 % 2) + 1, 1, 160, 237, 25, 0);
+
+ _actor1.postInit();
+ _actor1.setVisage(1950);
+ _actor1.setStrip((((R2_GLOBALS._v566A4 - 1) / 35) % 2) + 1);
+ _actor1.setFrame(2);
+ _actor1.setPosition(Common::Point(160, 167));
+ _actor1.fixPriority(220);
+ R2_GLOBALS._walkRegions.enableRegion(3);
+ R2_GLOBALS._walkRegions.enableRegion(4);
+ break;
+ case 7:
+ // No break on purpose
+ case 10:
+ // No break on purpose
+ case 23:
+ // No break on purpose
+ case 29:
+ // No break on purpose
+ case 31:
+ // No break on purpose
+ case 39:
+ // No break on purpose
+ case 40:
+ // No break on purpose
+ case 52:
+ // No break on purpose
+ case 53:
+ // No break on purpose
+ case 55:
+ // No break on purpose
+ case 63:
+ // No break on purpose
+ case 65:
+ // No break on purpose
+ case 66:
+ // No break on purpose
+ case 75:
+ // No break on purpose
+ case 77:
+ // No break on purpose
+ case 81:
+ // No break on purpose
+ case 87:
+ // No break on purpose
+ case 89:
+ // No break on purpose
+ case 97:
+ _exit5._enabled = true;
+ _actor1.postInit();
+ _actor1.setVisage(1950);
+ _actor1.setStrip((((R2_GLOBALS._v566A4 - 1) / 35) % 2) + 1);
+ _actor1.setFrame(3);
+ _actor1.setPosition(Common::Point(160, 167));
+ _actor1.fixPriority(220);
+ break;
+ case 58:
+ // No break on purpose
+ case 74:
+ // No break on purpose
+ case 80:
+ _exit1._enabled = true;
+ _exit5._enabled = true;
+
+ _object1.setup(1950, (R2_GLOBALS._v566A4 % 2) + 1, 1, 160, 137, 25);
+
+ _actor1.postInit();
+ _actor1.setVisage(1950);
+ _actor1.setStrip((((R2_GLOBALS._v566A4 - 1) / 35) % 2) + 1);
+ _actor1.setFrame(3);
+ _actor1.setPosition(Common::Point(160, 167));
+ _actor1.fixPriority(220);
+ R2_GLOBALS._walkRegions.enableRegion(3);
+ R2_GLOBALS._walkRegions.enableRegion(4);
+ break;
+ default:
+ _actor1.postInit();
+ _actor1.setVisage(1950);
+ _actor1.setStrip(((R2_GLOBALS._v566A4 - 1) % 35) + 1);
+ _actor1.setFrame(2);
+ _actor1.setPosition(Common::Point(160, 167));
+ _actor1.fixPriority(220);
+ break;
+ }
+
+ switch (R2_GLOBALS._v566A4 - 3) {
+ case 0:
+ // No break on purpose
+ case 3:
+ // No break on purpose
+ case 5:
+ // No break on purpose
+ case 12:
+ // No break on purpose
+ case 15:
+ // No break on purpose
+ case 18:
+ // No break on purpose
+ case 19:
+ // No break on purpose
+ case 23:
+ // No break on purpose
+ case 26:
+ // No break on purpose
+ case 27:
+ // No break on purpose
+ case 29:
+ // No break on purpose
+ case 30:
+ // No break on purpose
+ case 31:
+ // No break on purpose
+ case 32:
+ // No break on purpose
+ case 44:
+ // No break on purpose
+ case 45:
+ // No break on purpose
+ case 51:
+ // No break on purpose
+ case 55:
+ // No break on purpose
+ case 56:
+ // No break on purpose
+ case 57:
+ // No break on purpose
+ case 60:
+ // No break on purpose
+ case 63:
+ _exit2._enabled = true;
+ case 54:
+ // No break on purpose
+ case 61:
+ // No break on purpose
+ case 62:
+ // No break on purpose
+ case 65:
+ _exit2._enabled = true;
+ // No break on purpose
+ case 35:
+ // No break on purpose
+ case 38:
+ // No break on purpose
+ case 40:
+ // No break on purpose
+ case 47:
+ // No break on purpose
+ case 50:
+ // No break on purpose
+ case 53:
+ // No break on purpose
+ case 58:
+ // No break on purpose
+ case 64:
+ // No break on purpose
+ case 66:
+ // No break on purpose
+ case 67:
+ // No break on purpose
+ case 79:
+ // No break on purpose
+ case 80:
+ // No break on purpose
+ case 86:
+ // No break on purpose
+ case 89:
+ // No break on purpose
+ case 90:
+ // No break on purpose
+ case 91:
+ // No break on purpose
+ case 92:
+ // No break on purpose
+ case 95:
+ // No break on purpose
+ case 96:
+ // No break on purpose
+ case 97:
+ // No break on purpose
+ case 98:
+ // No break on purpose
+ case 100:
+ _exit4._enabled = true;
+ R2_GLOBALS._walkRegions.enableRegion(4);
+ R2_GLOBALS._walkRegions.enableRegion(5);
+ R2_GLOBALS._walkRegions.enableRegion(6);
+ R2_GLOBALS._walkRegions.enableRegion(10);
+ R2_GLOBALS._walkRegions.enableRegion(11);
+ default:
+ break;
+ }
+ R2_GLOBALS._uiElements.draw();
+}
+
+void Scene1950::subBE59B() {
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+
+ _actor8.remove();
+ _actor2.remove();
+ _actor3.remove();
+
+ _field416 = 0;
+ _field41C = 0;
+
+ switch (R2_GLOBALS._v566A4) {
+ case 10:
+ _field41C = 1;
+ break;
+ case 13:
+ _field41C = 2;
+ break;
+ case 16:
+ _field41C = 3;
+ break;
+ case 17:
+ _field41C = 4;
+ break;
+ case 24:
+ _field41C = 5;
+ break;
+ case 25:
+ _field41C = 6;
+ break;
+ case 31:
+ _field41C = 7;
+ break;
+ case 40:
+ _field41C = 8;
+ break;
+ case 45:
+ _field41C = 9;
+ break;
+ case 46:
+ _field41C = 10;
+ break;
+ case 73:
+ _field41C = 11;
+ break;
+ case 75:
+ _field41C = 12;
+ break;
+ case 80:
+ _field41C = 13;
+ break;
+ case 87:
+ _field41C = 14;
+ break;
+ case 88:
+ _field41C = 15;
+ break;
+ case 96:
+ _field41C = 16;
+ break;
+ case 97:
+ _field41C = 17;
+ break;
+ case 104:
+ _field41C = 18;
+ break;
+ default:
+ break;
+ }
+
+ if (_field41C != 0) {
+ _actor8.postInit();
+ _actor8._numFrames = 6;
+ _actor8._moveRate = 6;
+ _actor8._moveDiff = Common::Point(3, 2);
+ _actor8._effect = 1;
+ if (R2_GLOBALS._v56613[(_field41C - 1) * 4] == 0) {
+ _actor8.setPosition(Common::Point(R2_GLOBALS._v56613[((_field41C - 1) * 4) + 2], R2_GLOBALS._v56613[((_field41C - 1) * 4) + 3]));
+ _actor8.animate(ANIM_MODE_NONE, NULL);
+ _actor8.addMover(NULL);
+ _actor8.setVisage(1961);
+ _actor8.setStrip(4);
+ _actor8.setFrame(10);
+ _actor8.fixPriority(10);
+ _actor8.setDetails(1950, 15, -1, 17, 2, (SceneItem *) NULL);
+ } else {
+ _actor8.setVisage(1960);
+ _actor8.setPosition(Common::Point(160, 130));
+ _actor8.animate(ANIM_MODE_2, NULL);
+ _actor8.setDetails(1950, 12, -1, 14, 2, (SceneItem *) NULL);
+ _field416 = 1;
+ }
+ }
+ if ((R2_GLOBALS._v566A4 == 1) && (R2_INVENTORY.getObjectScene(31) != 0)) {
+ _actor2.postInit();
+ _actor2.setVisage(1948);
+ _actor2.setStrip(3);
+ _actor2.setPosition(Common::Point(278, 155));
+ _actor2.fixPriority(100);
+ _actor2.setDetails(1950, 19, 20, 23, 2, (SceneItem *) NULL);
+ }
+
+ if (R2_GLOBALS._v566A4 == 102) {
+ R2_GLOBALS._walkRegions.load(1951);
+ R2_GLOBALS._walkRegions.enableRegion(1);
+ R2_GLOBALS._walkRegions.enableRegion(5);
+ R2_GLOBALS._walkRegions.enableRegion(6);
+ R2_GLOBALS._walkRegions.enableRegion(7);
+
+ _actor6.postInit();
+ _actor6.setVisage(1970);
+ _actor6.setStrip(1);
+ if (R2_GLOBALS.getFlag(37))
+ _actor6.setFrame(3);
+ else
+ _actor6.setFrame(1);
+ _actor6.setPosition(Common::Point(193, 158));
+ _actor6.setDetails(1950, 3, 4, 5, 2, (SceneItem *) NULL);
+
+ _actor7.postInit();
+ _actor7.setVisage(1970);
+ _actor7.setStrip(3);
+ _actor7.animate(ANIM_MODE_2, NULL);
+ _actor7._numFrames = 6;
+ _actor7.setPosition(Common::Point(194, 158));
+ _actor7.fixPriority(159);
+
+ _item2.setDetails(Rect(188, 124, 199, 133), 1950, 27, 28, -1, 2, NULL);
+
+ if (R2_INVENTORY.getObjectScene(34) == 1950) {
+ _actor5.postInit();
+ _actor5.setVisage(1970);
+ _actor5.setStrip(1);
+ _actor5.setFrame(2);
+ _actor5.fixPriority(160);
+ }
+
+ if (R2_GLOBALS.getFlag(37)) {
+ _actor5.setPosition(Common::Point(192, 118));
+ _actor5.setDetails(1950, 9, 4, -1, 2, (SceneItem *) NULL);
+ } else {
+ _actor4.postInit();
+ _actor4.setVisage(1970);
+ _actor4.setStrip(4);
+ _actor4._numFrames = 4;
+ _actor4.animate(ANIM_MODE_8, NULL);
+ _actor4.setPosition(Common::Point(192, 121));
+ _actor4.fixPriority(159);
+ _actor4.setDetails(1950, 6, 7, 8, 2, (SceneItem *) NULL);
+
+ _actor5.setPosition(Common::Point(192, 109));
+ _actor5.setDetails(1950, 9, 7, 8, 2, (SceneItem *) NULL);
+ }
+
+ _actor3.postInit();
+ _actor3.setVisage(1972);
+ _actor3.setStrip(1);
+ _actor3.setPosition(Common::Point(76, 94));
+ _actor3.fixPriority(25);
+ _actor3.setDetails(1950, 30, -1, -1, 2, (SceneItem *) NULL);
+ if (R2_INVENTORY.getObjectScene(35) == 2)
+ _actor3.setFrame(2);
+ else
+ _actor3.setFrame(1);
+
+ _field414 = 1;
+ } else if (_field414 != 0) {
+ _actor6.remove();
+ _actor4.remove();
+ _actor5.remove();
+ _actor7.remove();
+ _actor3.remove();
+
+ _item1.setDetails(Rect(0, 0, 320, 200), 1950, 0, 1, 2, 2, NULL);
+ }
+
+ switch (R2_GLOBALS._v566A5) {
+ case 0:
+ _sceneMode = 1950;
+ if (R2_INVENTORY.getObjectScene(31) == 0) {
+ R2_GLOBALS._v56AAB = 0;
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ } else {
+ setAction(&_sequenceManager, this, 1950, &R2_GLOBALS._player, NULL);
+ }
+ break;
+ case 1: {
+ _sceneMode = R2_GLOBALS._v566A5;
+ R2_GLOBALS._player.setPosition(Common::Point(160, 213));
+ Common::Point pt(160, 160);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 2:
+ _sceneMode = R2_GLOBALS._v566A5;
+ if (R2_GLOBALS.getFlag(36))
+ setAction(&_sequenceManager, this, 1957, &R2_GLOBALS._player, NULL);
+ else
+ setAction(&_sequenceManager, this, 1974, &R2_GLOBALS._player, NULL);
+ break;
+ case 3:
+ if (_field416 == 0) {
+ _sceneMode = R2_GLOBALS._v566A5;
+ R2_GLOBALS._player.setPosition(Common::Point(-20, 160));
+ Common::Point pt(30, 160);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else {
+ _sceneMode = 18;
+ _exit3._enabled = false;
+ _field418 = Common::Point(60, 152);
+ R2_GLOBALS._v56AAB = 0;
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+
+ _actor8.setStrip(2);
+ NpcMover *mover = new NpcMover();
+ _actor8.addMover(mover, &_field418, this);
+
+ R2_GLOBALS._player.setPosition(Common::Point(-20, 160));
+ Common::Point pt2(30, 160);
+ NpcMover *mover2 = new NpcMover();
+ R2_GLOBALS._player.addMover(mover2, &pt2, NULL);
+ }
+ break;
+ case 4:
+ _sceneMode = R2_GLOBALS._v566A5;
+ if (_field412 == 0) {
+ if (R2_GLOBALS.getFlag(36))
+ setAction(&_sequenceManager, this, 1955, &R2_GLOBALS._player, NULL);
+ else
+ setAction(&_sequenceManager, this, 1972, &R2_GLOBALS._player, NULL);
+ } else {
+ if (R2_GLOBALS.getFlag(36))
+ setAction(&_sequenceManager, this, 1954, &R2_GLOBALS._player, NULL);
+ else
+ setAction(&_sequenceManager, this, 1971, &R2_GLOBALS._player, NULL);
+ }
+ break;
+ case 5: {
+ _sceneMode = R2_GLOBALS._v566A5;
+ R2_GLOBALS._player.setPosition(Common::Point(160, 127));
+ Common::Point pt(160, 160);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 6:
+ if (_field416 == 0) {
+ _sceneMode = R2_GLOBALS._v566A5;
+ if (R2_GLOBALS._v566A4 == 1) {
+ setAction(&_sequenceManager, this, 1961, &R2_GLOBALS._player, NULL);
+ } else {
+ R2_GLOBALS._player.setPosition(Common::Point(340, 160));
+ Common::Point pt(289, 160);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ } else {
+ _sceneMode = 17;
+ _exit6._enabled = false;
+ _field418 = Common::Point(259, 152);
+
+ R2_GLOBALS._v56AAB = 0;
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+
+ _actor8.setStrip(1);
+ NpcMover *mover = new NpcMover();
+ _actor8.addMover(mover, &_field418, this);
+
+ R2_GLOBALS._player.setPosition(Common::Point(340, 160));
+ Common::Point pt2(289, 160);
+ NpcMover *mover2 = new NpcMover();
+ R2_GLOBALS._player.addMover(mover2, &pt2, NULL);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene1950::subBF4B4(int indx) {
+ R2_GLOBALS._player.disableControl();
+ int si = indx - 1;
+ if ((indx / 4) == (si / 4)) {
+ if (si < 0)
+ si = 3;
+ } else
+ si = 4;
+
+ if (_area1._arrActor1[si]._fieldA8 == 0) {
+ _area1._arrActor1[si].setFrame(2);
+ _area1._arrActor1[si]._fieldA8 = 1;
+ } else {
+ _area1._arrActor1[si].setFrame(1);
+ _area1._arrActor1[si]._fieldA8 = 0;
+ }
+
+ si = indx + 1;
+ if ((indx / 4) == (si / 4)) {
+ if (si > 15)
+ si = 12;
+ } else
+ si -= 4;
+
+ if (_area1._arrActor1[si]._fieldA8 == 0) {
+ _area1._arrActor1[si].setFrame(2);
+ _area1._arrActor1[si]._fieldA8 = 1;
+ } else {
+ _area1._arrActor1[si].setFrame(1);
+ _area1._arrActor1[si]._fieldA8 = 0;
+ }
+
+ si = indx - 4;
+ if (si < 0)
+ si += 16;
+
+ if (_area1._arrActor1[si]._fieldA8 == 0) {
+ _area1._arrActor1[si].setFrame(2);
+ _area1._arrActor1[si]._fieldA8 = 1;
+ } else {
+ _area1._arrActor1[si].setFrame(1);
+ _area1._arrActor1[si]._fieldA8 = 0;
+ }
+
+ si = indx + 4;
+ if (si > 15)
+ si -= 16;
+
+ if (_area1._arrActor1[si]._fieldA8 == 0) {
+ _area1._arrActor1[si].setFrame(2);
+ _area1._arrActor1[si]._fieldA8 = 1;
+ } else {
+ _area1._arrActor1[si].setFrame(1);
+ _area1._arrActor1[si]._fieldA8 = 0;
+ }
+
+ int cpt = 0;
+ for (si = 0; si < 16; si++) {
+ if (_area1._arrActor1[si]._fieldA8 != 0)
+ ++cpt;
+ }
+
+ if (cpt != 16) {
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ } else {
+ R2_GLOBALS.setFlag(37);
+ _sceneMode = 24;
+ // TODO: check if correct. The original doesn't countain a sceneActor in
+ // this call, but it's extremely unusual
+ setAction(&_sequenceManager, this, 1976, NULL);
+ }
+}
+
+void Scene1950::postInit(SceneObjectList *OwnerList) {
+ _field412 = 0;
+ _field414 = 0;
+ _field416 = 0;
+ _field41C = 0;
+ if (R2_GLOBALS._sceneManager._previousScene == 300)
+ R2_GLOBALS._v566A4 = 103;
+
+ subBDC1E();
+ SceneExt::postInit();
+ R2_GLOBALS._sound1.play(105);
+
+ _exit1.setDetails(Rect(130, 46, 189, 135), SHADECURSOR_UP, 1950);
+ _exit1.setDest(Common::Point(160, 145));
+
+ _exit2.setDetails(Rect(208, 0, 255, 73), EXITCURSOR_N, 1950);
+ _exit2.setDest(Common::Point(200, 151));
+
+ _exit3.setDetails(Rect(305, 95, 320, 147), EXITCURSOR_E, 1950);
+ _exit3.setDest(Common::Point(312, 160));
+
+ _exit4.setDetails(Rect(208, 99, 255, 143), EXITCURSOR_S, 1950);
+ _exit4.setDest(Common::Point(200, 151));
+
+ _exit5.setDetails(Rect(113, 154, 206, 168), SHADECURSOR_DOWN, 1950);
+ _exit5.setDest(Common::Point(160, 165));
+
+ _exit6.setDetails(Rect(0, 95, 14, 147), EXITCURSOR_W, 1950);
+ _exit6.setDest(Common::Point(7, 160));
+
+ _exit7.setDetails(Rect(72, 54, 120, 128), EXITCURSOR_NW, 1950);
+ _exit7.setDest(Common::Point(120, 140));
+
+ _exit8.setDetails(Rect(258, 60, 300, 145), EXITCURSOR_NE, 1950);
+ _exit8.setDest(Common::Point(268, 149));
+
+ R2_GLOBALS._player.postInit();
+ if ( (R2_INVENTORY.getObjectScene(32) == 0) && (R2_INVENTORY.getObjectScene(33) == 0)
+ && (R2_INVENTORY.getObjectScene(46) == 0) && (!R2_GLOBALS.getFlag(36)) )
+ R2_GLOBALS._player.setVisage(22);
+ else
+ R2_GLOBALS._player.setVisage(20);
+
+ R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
+ _item1.setDetails(Rect(0, 0, 320, 200), 1950, 0, 1, 2, 1, NULL);
+
+ subBE59B();
+}
+
+void Scene1950::remove() {
+ R2_GLOBALS._sound1.stop();
+ R2_GLOBALS._sound2.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene1950::signal() {
+ switch (_sceneMode) {
+ case 11:
+ R2_GLOBALS._v566A4 += 7;
+ subBDC1E();
+ subBE59B();
+ break;
+ case 12:
+ R2_GLOBALS._v566A4 += 35;
+ subBDC1E();
+ subBE59B();
+ break;
+ case 1975:
+ SceneItem::display(1950, 21, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ // No break on purpose
+ case 13:
+ ++R2_GLOBALS._v566A4;
+ subBDC1E();
+ subBE59B();
+ break;
+ case 14:
+ R2_GLOBALS._v566A4 += 221;
+ subBDC1E();
+ subBE59B();
+ break;
+ case 15:
+ R2_GLOBALS._v566A4 += 249;
+ subBDC1E();
+ subBE59B();
+ break;
+ case 16:
+ // No break on purpose
+ case 1961:
+ --R2_GLOBALS._v566A4;
+ subBDC1E();
+ subBE59B();
+ break;
+ case 17: {
+ _sceneMode = 13;
+ R2_GLOBALS._v566A5 = 3;
+ _field416 = 0;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ R2_GLOBALS._player._canWalk = true;
+ R2_GLOBALS._player.setVisage(22);
+ R2_GLOBALS._player.animate(ANIM_MODE_9, NULL);
+ Common::Point pt(340, 160);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ Common::Point pt2(289, 160);
+ NpcMover *mover2 = new NpcMover();
+ _actor8.addMover(mover2, &pt2, NULL);
+ }
+ break;
+ case 18: {
+ _sceneMode = 16;
+ R2_GLOBALS._v566A5 = 6;
+ _field416 = 0;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ R2_GLOBALS._player._canWalk = true;
+ R2_GLOBALS._player.setVisage(22);
+ R2_GLOBALS._player.animate(ANIM_MODE_9, NULL);
+ Common::Point pt(-20, 160);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ Common::Point pt2(30, 160);
+ NpcMover *mover2 = new NpcMover();
+ _actor8.addMover(mover2, &pt2, NULL);
+ }
+ break;
+ case 24:
+ _area1.remove();
+ _sceneMode = 1966;
+ _actor6.setFrame(3);
+ setAction(&_sequenceManager, this, 1966, &_actor4, &_actor5, NULL);
+ break;
+ case 1951:
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ R2_GLOBALS._sceneManager.changeScene(1945);
+ break;
+ case 1958:
+ SceneItem::display(1950, 24, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ R2_GLOBALS._v56AAB = 0;
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ _exit8._enabled = true;
+ break;
+ case 1959:
+ R2_INVENTORY.setObjectScene(46, 0);
+ R2_GLOBALS._v56AAB = 0;
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ _exit8._enabled = true;
+ break;
+ case 1962:
+ // No break on purpose
+ case 1963:
+ R2_GLOBALS._player.enableControl();
+ _area1.proc12(1971, 1, 1, 160, 135);
+ break;
+ case 1964:
+ // No break on purpose
+ case 1965:
+ if (!R2_GLOBALS.getFlag(37))
+ SceneItem::display(1950, 26, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 1966:
+ _actor4.remove();
+ if (R2_GLOBALS.getFlag(36)) {
+ _sceneMode = 1964;
+ setAction(&_sequenceManager, this, 1964, &R2_GLOBALS._player, NULL);
+ } else {
+ _sceneMode = 1965;
+ setAction(&_sequenceManager, this, 1965, &R2_GLOBALS._player, NULL);
+ }
+ _actor5.setDetails(1950, 9, -1, -1, 2, (SceneItem *) NULL);
+ case 1967: {
+ _sceneMode = 0;
+ R2_INVENTORY.setObjectScene(34, 2);
+ _actor5.remove();
+ if (R2_GLOBALS.getFlag(36))
+ R2_GLOBALS._player.setVisage(20);
+ else
+ R2_GLOBALS._player.setVisage(22);
+
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ Common::Point pt(218, 165);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 1968:
+ R2_GLOBALS._player.disableControl();
+ R2_INVENTORY.setObjectScene(35, 2);
+ _actor3.setFrame(2);
+ if (R2_GLOBALS.getFlag(36))
+ R2_GLOBALS._player.setVisage(20);
+ else
+ R2_GLOBALS._player.setVisage(22);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ break;
+ default:
+ R2_GLOBALS._v56AAB = 0;
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ break;
+ }
+}
+
+void Scene1950::process(Event &event) {
+ if ( (event.eventType == EVENT_BUTTON_DOWN)
+ && (R2_GLOBALS._player._uiEnabled)
+ && (R2_GLOBALS._events.getCursor() == R2_LIGHT_BULB)
+ && (R2_GLOBALS._player._bounds.contains(event.mousePos))
+ && (R2_INVENTORY.getObjectScene(31) == 0)) {
+ event.handled = true;
+ R2_GLOBALS._player.disableControl();
+ _exit7._enabled = false;
+ _exit8._enabled = false;
+ _sceneMode = 1959;
+ setAction(&_sequenceManager, this, 1959, &R2_GLOBALS._player, NULL);
+ }
+ Scene::process(event);
+}
+
+} // End of namespace Ringworld2
+} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld2/ringworld2_scenes1.h b/engines/tsage/ringworld2/ringworld2_scenes1.h
new file mode 100644
index 0000000000..f65a89972d
--- /dev/null
+++ b/engines/tsage/ringworld2/ringworld2_scenes1.h
@@ -0,0 +1,1242 @@
+/* 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 TSAGE_RINGWORLD2_SCENES1_H
+#define TSAGE_RINGWORLD2_SCENES1_H
+
+#include "common/scummsys.h"
+#include "tsage/converse.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+#include "tsage/sound.h"
+#include "tsage/ringworld2/ringworld2_logic.h"
+#include "tsage/ringworld2/ringworld2_speakers.h"
+
+namespace TsAGE {
+
+namespace Ringworld2 {
+
+using namespace TsAGE;
+
+class Scene1010 : public SceneExt {
+public:
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene1020 : public SceneExt {
+public:
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene1100 : public SceneExt {
+ class Actor16 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor17 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor18 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+public:
+ int _field412, _field414;
+ SpeakerSeeker1100 _seekerSpeaker;
+ SpeakerQuinn1100 _quinnSpeaker;
+ SpeakerChief1100 _chiefSpeaker;
+ ScenePalette _palette1;
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ NamedHotspot _item3;
+ NamedHotspot _item4;
+ NamedHotspot _item5;
+ NamedHotspot _item6;
+ NamedHotspot _item7;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SceneActor _actor4;
+ SceneActor _actor5;
+ SceneActor _actor6;
+ SceneActor _actor7;
+ SceneActor _actor8;
+ SceneActor _actor9;
+ SceneActor _actor10;
+ SceneActor _actor11;
+ SceneActor _actor12;
+ SceneActor _actor13;
+ SceneActor _actor14;
+ SceneActor _actor15;
+ BackgroundSceneObject _object1;
+ BackgroundSceneObject _object2;
+ Actor16 _actor16;
+ Actor17 _actor17;
+ Actor18 _actor18;
+ SequenceManager _sequenceManager1;
+ SequenceManager _sequenceManager2;
+ SequenceManager _sequenceManager3;
+
+ Scene1100();
+ void synchronize(Serializer &s);
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void dispatch();
+ virtual void saveCharacter(int characterIndex);
+};
+
+class Scene1200 : public SceneExt {
+ class Area1: public SceneArea {
+ public:
+ class Actor3 : public SceneActorExt {
+ public:
+ void init(int state);
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ SceneActor _actor2;
+ Actor3 _actor3;
+ Actor3 _actor4;
+ Actor3 _actor5;
+
+ byte _field20;
+
+ Area1();
+ void synchronize(Serializer &s);
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void process(Event &event);
+ virtual void proc12(int visage, int stripFrameNum, int frameNum, int posX, int posY);
+ virtual void proc13(int resNum, int lookLineNum, int talkLineNum, int useLineNum);
+ };
+
+public:
+ NamedHotspot _item1;
+ SceneActor _actor1;
+ Area1 _area1;
+ UnkObject1200 _object1;
+ SequenceManager _sequenceManager;
+
+ int _field412;
+ int _field414;
+ int _field416;
+ int _field418;
+ int _field41A;
+ int _field41C;
+
+ Scene1200();
+ void synchronize(Serializer &s);
+
+ void sub9DAD6(int indx);
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+ virtual void saveCharacter(int characterIndex);
+};
+
+class Scene1337 : public SceneExt {
+ class unkObj1337sub1: public SceneHotspot {
+ public:
+ SceneObject _object1;
+
+ int _field34;
+ Common::Point _field36;
+
+ unkObj1337sub1();
+ void synchronize(Serializer &s);
+ };
+
+ class unkObj1337_1: public SceneHotspot {
+ public:
+ unkObj1337sub1 _arr1[4];
+ unkObj1337sub1 _arr2[8];
+ unkObj1337sub1 _arr3[1];
+ unkObj1337sub1 _arr4[1];
+
+ Common::Point _fieldB94;
+ Common::Point _fieldB98;
+ Common::Point _fieldB9C;
+ Common::Point _fieldBA0;
+ int _fieldBA4;
+
+ unkObj1337_1();
+ void synchronize(Serializer &s);
+ };
+
+ class Action1337: public Action {
+ public:
+ void subD18B5(int resNum, int stripNum, int frameNum);
+ void skipFrames(int32 skipCount);
+ };
+
+ class Action1: public Action1337 {
+ public:
+ void signal();
+ };
+ class Action2: public Action1337 {
+ public:
+ void signal();
+ };
+ class Action3: public Action1337 {
+ public:
+ void signal();
+ };
+ class Action4: public Action1337 {
+ public:
+ void signal();
+ };
+ class Action5: public Action1337 {
+ public:
+ void signal();
+ };
+ class Action6: public Action1337 {
+ public:
+ void signal();
+ };
+ class Action7: public Action1337 {
+ public:
+ void signal();
+ };
+ class Action8: public Action1337 {
+ public:
+ void signal();
+ };
+ class Action9: public Action1337 {
+ public:
+ void signal();
+ };
+ class Action10: public Action1337 {
+ public:
+ void signal();
+ };
+ class Action11: public Action1337 {
+ public:
+ void signal();
+ };
+ class Action12: public Action1337 {
+ public:
+ void signal();
+ };
+ class Action13: public Action1337 {
+ public:
+ void signal();
+ };
+public:
+ typedef void (Scene1337::*FunctionPtrType)();
+ FunctionPtrType _unkFctPtr412;
+
+ ASound _aSound1;
+ ASound _aSound2;
+ BackgroundSceneObject _background1;
+ bool _autoplay;
+ unkObj1337_1 _arrunkObj1337[4];
+ SceneItem _item1;
+ SceneObject _object1;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ Action5 _action5;
+ Action6 _action6;
+ Action7 _action7;
+ Action8 _action8;
+ Action9 _action9;
+ Action10 _action10;
+ Action11 _action11;
+ Action12 _action12;
+ Action13 _action13;
+ unkObj1337sub1 _item2;
+ unkObj1337sub1 _item3;
+ unkObj1337sub1 _item4;
+ BackgroundSceneObject _background2;
+ int _field3E24;
+ int _field3E26;
+ int _field3E28[100];
+ unkObj1337sub1 *_field3EF0;
+ unkObj1337sub1 *_field3EF4;
+ unkObj1337sub1 *_field3EF8;
+ unkObj1337sub1 _item5;
+ unkObj1337sub1 _item6;
+ unkObj1337sub1 _item7;
+ unkObj1337sub1 _item8;
+ int _field423C;
+ int _field423E;
+ int _field4240;
+ int _field4242;
+ int _field4244;
+ int _field4246;
+ int _field4248;
+ int _field424A;
+ int _field424C;
+ int _field424E;
+
+ SceneObject _arrObject1[8];
+ SceneObject _arrObject2[8];
+
+ Scene1337();
+ virtual void synchronize(Serializer &s);
+
+ void actionDisplay(int resNum, int lineNum, int x, int y, int arg5, int width, int textMode, int fontNum, int colFG, int colBGExt, int colFGExt);
+ void setAnimationInfo(unkObj1337sub1 *subObj);
+ void subC20E5();
+ void subC20F9();
+ void subC2586();
+ bool subC264B(int arg1);
+ bool subC2687(int arg1);
+ int subC26CB(int arg1, int arg2);
+ int subC2719(int arg1);
+ int subC274D(int arg1);
+ int subC2781(int arg1);
+ int subC27B5(int arg1);
+ int subC27F9(int arg1);
+ void subC2835(int arg1);
+ bool subC2BF8(unkObj1337sub1 *subObj1, Common::Point pt);
+ void subC2C2F();
+ void subC318B(int arg1, unkObj1337sub1 *subObj2, int arg3);
+ int subC3257(int arg1);
+ bool subC32B1(int arg1, int arg2);
+ int subC331B(int arg1);
+ bool subC3386(int arg1, int arg2);
+ void subC33C0(unkObj1337sub1 *subObj1, unkObj1337sub1 *subObj2);
+ void subC3456(unkObj1337sub1 *subObj1, unkObj1337sub1 *subObj2);
+ void subC340B(unkObj1337sub1 *subObj1, unkObj1337sub1 *subObj2);
+ void subC34A1(unkObj1337sub1 *subObj1, unkObj1337sub1 *subObj2);
+ unkObj1337sub1 *subC34EC(int arg1);
+ void subC358E(unkObj1337sub1 *subObj1, int arg2);
+ int subC3E92(int arg1);
+ void subC4A39(unkObj1337sub1 *subObj);
+ void subC4CD2();
+ void subC4CEC();
+ void subC51A0(unkObj1337sub1 *subObj1, unkObj1337sub1 *subObj2);
+ void displayDialog(int dialogNumb);
+ void subPostInit();
+ void subCB59B();
+ void suggestInstructions();
+ void shuffleCards();
+ void subCCF26();
+ void subCD193();
+ void subCDB90(int arg1, Common::Point pt);
+ void subCF31D();
+ void subCF979();
+ void subD026D();
+ void subD0281();
+ void subD02CA();
+ void subD183F(int arg1, int arg2);
+ void subD18B5(int resNum, int rlbNum, int arg3);
+ int subD18F5();
+ int subD1917();
+ int subD1940(bool flag);
+ void subD195F(int arg1, int arg2);
+ void subD1975(int arg1, int arg2);
+ void subD1A48(int arg1);
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene1500 : public SceneExt {
+public:
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SceneActor _actor4;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene1525 : public SceneExt {
+public:
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene1530 : public SceneExt {
+public:
+ SpeakerQuinn _quinnSpeaker;
+ SpeakerSeeker _seekerSpeaker;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene1550 : public SceneExt {
+ class SceneActor1550 : public SceneActor {
+ public:
+ void subA4D14(int frameNumber, int strip);
+ };
+
+ class UnkObj15501 : public SceneActor {
+ public:
+ int _fieldA4;
+ int _fieldA6;
+
+ UnkObj15501();
+ void synchronize(Serializer &s);
+
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class UnkObj15502 : public SceneActor {
+ public:
+ int _fieldA4;
+
+ UnkObj15502();
+ void synchronize(Serializer &s);
+
+ virtual bool startAction(CursorType action, Event &event);
+ void subA5CDF(int strip);
+ };
+
+ class UnkObj15503 : public SceneActor {
+ public:
+ int _fieldA4;
+
+ UnkObj15503();
+ void synchronize(Serializer &s);
+
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class UnkArea1550 : public SceneArea {
+ public:
+ byte _field20;
+ SceneActor _areaActor;
+ UnkObj15503 _unkObj155031;
+ UnkObj15503 _unkObj155032;
+
+ virtual void remove();
+ virtual void process(Event &event);
+ virtual void proc12(int visage, int stripFrameNum, int frameNum, int posX, int posY);
+ virtual void proc13(int resNum, int lookLineNum, int talkLineNum, int useLineNum);
+ };
+
+ class Hotspot1 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Hotspot3 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor6 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor7 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor8 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor9 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor10 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor11 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor12 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor13 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor14 : public SceneActor1550 {
+ // Nothing specific found in the original
+ // TODO: check if it's an useless class
+ };
+
+public:
+ SpeakerQuinn _quinnSpeaker;
+ SpeakerSeeker _seekerSpeaker;
+ Hotspot1 _item1;
+ Hotspot1 _item2;
+ Hotspot3 _item3;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SceneActor _actor4;
+ SceneActor _actor5;
+ Actor6 _actor6;
+ Actor7 _actor7;
+ Actor8 _actor8;
+ Actor9 _actor9;
+ Actor10 _actor10;
+ Actor11 _actor11;
+ Actor12 _actor12;
+ Actor13 _actor13;
+ UnkObj15501 _arrUnkObj15501[8];
+ Actor14 _actor14;
+ Actor14 _actor15;
+ Actor14 _actor16;
+ Actor14 _actor17;
+ Actor14 _actor18;
+ Actor14 _actor19;
+ UnkObj15502 _arrUnkObj15502[8];
+ UnkArea1550 _unkArea1;
+ SequenceManager _sequenceManager1;
+ SequenceManager _sequenceManager2;
+
+ int _field412;
+ byte _field414;
+ int _field415;
+ int _field417;
+ int _field419;
+
+ Scene1550();
+ void synchronize(Serializer &s);
+ void subA2B2F();
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+ virtual void saveCharacter(int characterIndex);
+};
+
+class Scene1575 : public SceneExt {
+ class Hotspot1 : public NamedHotspot {
+ public:
+ int _field34;
+ int _field36;
+
+ Hotspot1();
+ void synchronize(Serializer &s);
+ void subA910D(int indx);
+
+ virtual void process(Event &event);
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ int _field412;
+ int _field414;
+ int _field416;
+ int _field418;
+ int _field41A;
+ Hotspot1 _item1;
+ Hotspot1 _item2;
+ Hotspot1 _item3;
+ Hotspot1 _item4;
+ Hotspot1 _item5;
+ Hotspot1 _item6;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SceneActor _actor4;
+ SceneActor _actor5;
+ SceneActor _actor6;
+ SceneActor _actor7;
+ SceneActor _actor8;
+ SceneActor _actor9;
+ SceneActor _actor10;
+ SceneActor _actor11;
+ SceneActor _actor12;
+ SceneActor _actor13;
+ SceneActor _actor14;
+ SceneActor _actor15;
+ SceneActor _arrActor[17];
+ SequenceManager _sequenceManager1;
+
+ Scene1575();
+ void synchronize(Serializer &s);
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene1580 : public SceneExt {
+ class Hotspot1 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Hotspot2 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor2 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor3 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor4 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor5 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor6 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor7 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ int _field412;
+ SpeakerQuinn _quinnSpeaker;
+ SpeakerSeeker _seekerSpeaker;
+ Hotspot1 _item1;
+ Hotspot2 _item2;
+ NamedHotspot _item3;
+ SceneActor _actor1;
+ SceneActor _arrActor[8];
+ Actor2 _actor2;
+ Actor3 _actor3;
+ Actor4 _actor4;
+ Actor5 _actor5;
+ Actor6 _actor6;
+ Actor7 _actor7;
+ SequenceManager _sequenceManager;
+
+ Scene1580();
+ void synchronize(Serializer &s);
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene1625 : public SceneExt {
+ class Actor7 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ int _field412;
+ SpeakerMiranda1625 _mirandaSpeaker;
+ SpeakerTeal1625 _tealSpeaker;
+ SpeakerSoldier1625 _soldierSpeaker;
+ NamedHotspot _item1;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SceneActor _actor4;
+ SceneActor _actor5;
+ SceneActor _actor6;
+ Actor7 _actor7;
+ SequenceManager _sequenceManager;
+
+ Scene1625();
+ void synchronize(Serializer &s);
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+};
+
+class Scene1700 : public SceneExt {
+ class Item2 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor11 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor12 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Exit1 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class Exit2 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class Exit3 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+public:
+ SpeakerQuinn _quinnSpeaker;
+ SpeakerSeeker _seekerSpeaker;
+ NamedHotspot _item1;
+ Item2 _item2;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SceneActor _actor4;
+ SceneActor _actor5;
+ SceneActor _actor6;
+ SceneActor _actor7;
+ SceneActor _actor8;
+ SceneActor _actor9;
+ SceneActor _actor10;
+ Actor11 _actor11;
+ Actor12 _actor12;
+ Exit1 _exit1;
+ Exit2 _exit2;
+ Exit3 _exit3;
+ SequenceManager _sequenceManager;
+
+ int _field77A;
+ int _field77C;
+
+ Scene1700();
+ void synchronize(Serializer &s);
+ void subAF3F8();
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+};
+
+class Scene1750 : public SceneExt {
+ class Actor4 : public SceneActor {
+ public:
+ int _fieldA4;
+ int _fieldA6;
+ int _fieldA8;
+ int _fieldAA;
+ int _fieldAC;
+ int _fieldAE;
+
+ Actor4();
+ virtual void synchronize(Serializer &s);
+ void subB1A76(int arg1, int arg2, int arg3, int arg4, int arg5);
+ void subB1B27();
+
+ virtual void remove();
+ virtual void process(Event &event);
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor5 : public SceneActor {
+ public:
+ int _fieldA4;
+
+ Actor5();
+ virtual void synchronize(Serializer &s);
+
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+public:
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ NamedHotspot _item3;
+ NamedHotspot _item4;
+ NamedHotspot _item5;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ Actor4 _actor4;
+ Actor5 _actor5;
+ Actor5 _actor6;
+ Actor5 _actor7;
+ SequenceManager _sequenceManager;
+ PaletteRotation *_rotation;
+
+ int _field412;
+ int _field413;
+ int _field415;
+ int _field417;
+ int _field419;
+ int _field41B;
+ int _field41D;
+
+ Scene1750();
+ virtual void synchronize(Serializer &s);
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene1800 : public SceneExt {
+ class Hotspot5 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor6 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor7 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor8 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Exit1 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+public:
+ int _field412;
+ SpeakerQuinn _quinnSpeaker;
+ SpeakerSeeker _seekerSpeaker;
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ NamedHotspot _item3;
+ NamedHotspot _item4;
+ Hotspot5 _item5;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SceneActor _actor4;
+ SceneActor _actor5;
+ Actor6 _actor6;
+ Actor7 _actor7;
+ Actor8 _actor8;
+ Actor8 _actor9;
+ Exit1 _exit1;
+ SequenceManager _sequenceManager;
+
+ Scene1800();
+ void synchronize(Serializer &s);
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void saveCharacter(int characterIndex);
+};
+
+class Scene1850 : public SceneExt {
+ class Hotspot2 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor5 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor6 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor8 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+public:
+ int _field412;
+ int _field414;
+ int _field416;
+ int _field418;
+ Common::Point _field41A;
+ int _field41E;
+ ScenePalette _palette1;
+ SpeakerQuinn _quinnSpeaker;
+ SpeakerSeeker _seekerSpeaker;
+ NamedHotspot _item1;
+ Hotspot2 _item2;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SceneActor _actor4;
+ Actor5 _actor5;
+ Actor6 _actor6;
+ Actor6 _actor7;
+ Actor8 _actor8;
+ SequenceManager _sequenceManager1;
+ SequenceManager _sequenceManager2;
+
+ Scene1850();
+ void synchronize(Serializer &s);
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene1875 : public SceneExt {
+ class Actor1875 : public SceneActor {
+ public:
+ int _fieldA4;
+ int _fieldA6;
+
+ Actor1875();
+ void subB84AB();
+ void subB8271(int indx);
+
+ void synchronize(Serializer &s);
+ virtual void process(Event &event);
+ };
+public:
+ SpeakerQuinn _quinnSpeaker;
+ SpeakerSeeker _seekerSpeaker;
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ Actor1875 _actor4;
+ Actor1875 _actor5;
+ Actor1875 _actor6;
+ Actor1875 _actor7;
+ Actor1875 _actor8;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+};
+
+class Scene1900 : public SceneExt {
+ class Actor2 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Exit1 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class Exit2 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+public:
+ SpeakerSeeker1900 _seekerSpeaker;
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ SceneActor _actor1;
+ BackgroundSceneObject _object1;
+ BackgroundSceneObject _object2;
+ Actor2 _actor2;
+ Actor2 _actor3;
+ Exit1 _exit1;
+ Exit2 _exit2;
+ SequenceManager _sequenceManager1;
+ SequenceManager _sequenceManager2;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+};
+
+class Scene1925 : public SceneExt {
+ class Hotspot2 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Hotspot3 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class ExitUp : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class Exit2 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class Exit3 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class Exit4 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+public:
+ NamedHotspot _item1;
+ Hotspot2 _item2;
+ Hotspot3 _item3;
+ SceneActor _actor1;
+ ExitUp _exitUp;
+ Exit2 _exit2;
+ Exit3 _exit3;
+ Exit4 _exit4;
+ SequenceManager _sequenceManager;
+
+ int _field9B8;
+ int _levelResNum[5];
+
+ Scene1925();
+ void synchronize(Serializer &s);
+
+ void changeLevel(bool upFlag);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+};
+
+class Scene1945 : public SceneExt {
+ class Hotspot3 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Hotspot4 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor3 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class ExitUp : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class Exit2 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+public:
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ Hotspot3 _item3;
+ Hotspot4 _item4;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ Actor3 _actor3;
+ ExitUp _exitUp;
+ Exit2 _exit2;
+ SequenceManager _sequenceManager1;
+ SequenceManager _sequenceManager2;
+
+ int _fieldEAA;
+ int _fieldEAC;
+ CursorType _fieldEAE;
+
+ Scene1945();
+ void synchronize(Serializer &s);
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+};
+
+class Scene1950 : public SceneExt {
+ class Area1: public SceneArea {
+ public:
+ class Actor10 : public SceneActor {
+ public:
+ int _fieldA4;
+ int _fieldA6;
+ int _fieldA8;
+
+ Actor10();
+ void synchronize(Serializer &s);
+
+ void init(int indx);
+ virtual void process(Event &event);
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ SceneActor _areaActor;
+ Actor10 _arrActor1[16];
+
+ byte _field20;
+ int _fieldB65;
+
+ Area1();
+ void synchronize(Serializer &s);
+
+ virtual void remove();
+ virtual void process(Event &event);
+ virtual void proc12(int visage, int stripFrameNum, int frameNum, int posX, int posY);
+ virtual void proc13(int resNum, int lookLineNum, int talkLineNum, int useLineNum);
+ };
+
+ class Hotspot2 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor2 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor3 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor4 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor5 : public SceneActor {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor8 : public SceneActor {
+ public:
+ int _fieldA4;
+ int _fieldA6;
+ int _fieldA8;
+ int _fieldAA;
+ int _fieldAC;
+ byte _fieldAE;
+ byte _fieldAF;
+
+ Actor8();
+ void synchronize(Serializer &s);
+
+ virtual void signal();
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Exit1 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class Exit2 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class Exit3 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class Exit4 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class Exit5 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class Exit6 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class Exit7 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class Exit8 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+public:
+ NamedHotspot _item1;
+ Hotspot2 _item2;
+ SceneActor _actor1;
+ BackgroundSceneObject _object1;
+ Actor2 _actor2;
+ Actor3 _actor3;
+ SceneActor _actor4;
+ Actor5 _actor5;
+ SceneActor _actor6;
+ SceneActor _actor7;
+ Actor8 _actor8;
+ Area1 _area1;
+ Exit1 _exit1;
+ Exit2 _exit2;
+ Exit3 _exit3;
+ Exit4 _exit4;
+ Exit5 _exit5;
+ Exit6 _exit6;
+ Exit7 _exit7;
+ Exit8 _exit8;
+ SequenceManager _sequenceManager;
+
+ int _field412;
+ int _field414;
+ int _field416;
+ Common::Point _field418;
+ int _field41C;
+
+ Scene1950();
+ void synchronize(Serializer &s);
+
+ void subBDC1E();
+ void subBE59B();
+ void subBF4B4(int indx);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+};
+} // End of namespace Ringworld2
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/ringworld2/ringworld2_scenes2.cpp b/engines/tsage/ringworld2/ringworld2_scenes2.cpp
new file mode 100644
index 0000000000..6a030e5b44
--- /dev/null
+++ b/engines/tsage/ringworld2/ringworld2_scenes2.cpp
@@ -0,0 +1,4527 @@
+/* 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 "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+#include "tsage/ringworld2/ringworld2_scenes2.h"
+
+namespace TsAGE {
+
+namespace Ringworld2 {
+
+/*--------------------------------------------------------------------------
+ * Scene 2000 - Ice Maze
+ *
+ *--------------------------------------------------------------------------*/
+void Scene2000::initPlayer() {
+ R2_GLOBALS._player.disableControl();
+
+ switch (_mazePlayerMode) {
+ case 0:
+ R2_GLOBALS._player.setStrip(5);
+ if (_exit1._enabled) {
+ if (_exit2._enabled)
+ R2_GLOBALS._player.setPosition(Common::Point(140, 129));
+ else
+ R2_GLOBALS._player.setPosition(Common::Point(20, 129));
+ } else
+ R2_GLOBALS._player.setPosition(Common::Point(245, 129));
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 1:
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _sceneMode = 2001;
+ else
+ _sceneMode = 2021;
+ setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
+ break;
+ case 2:
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _sceneMode = 2002;
+ else
+ _sceneMode = 2022;
+ setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
+ break;
+ case 3:
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _sceneMode = 2000;
+ else
+ _sceneMode = 2020;
+ setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
+ break;
+ case 4:
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _sceneMode = 2005;
+ else
+ _sceneMode = 2025;
+ setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
+ break;
+ case 5:
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _sceneMode = 2004;
+ else
+ _sceneMode = 2024;
+ setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
+ break;
+ case 6:
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _sceneMode = 2009;
+ else
+ _sceneMode = 2029;
+ setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
+ break;
+ case 7:
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _sceneMode = 2008;
+ else
+ _sceneMode = 2028;
+ setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
+ break;
+ case 8:
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _sceneMode = 2013;
+ else
+ _sceneMode = 2033;
+ setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
+ break;
+ case 9:
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _sceneMode = 2012;
+ else
+ _sceneMode = 2032;
+ setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
+ break;
+ case 10:
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _sceneMode = 2016;
+ else
+ _sceneMode = 2036;
+ setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
+ break;
+ case 11:
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _sceneMode = 2038;
+ else
+ _sceneMode = 2040;
+ setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
+ break;
+ default:
+ break;
+ }
+ for (int i = 0; i < 11; i++) {
+ if (R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] == R2_GLOBALS._v56605[3 + i])
+ _objList1[i].show();
+ }
+
+ if ((R2_GLOBALS._player._characterScene[1] == R2_GLOBALS._player._characterScene[2]) && (R2_GLOBALS._v56605[1] == R2_GLOBALS._v56605[2])) {
+ _object1.postInit();
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ _object1.setup(20, 5, 1);
+ _object1.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
+ } else {
+ _object1.setup(2008, 5, 1);
+ _object1.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
+ }
+ if (_exit1._enabled) {
+ if (_exit2._enabled)
+ _object1.setPosition(Common::Point(180, 128));
+ else
+ _object1.setPosition(Common::Point(75, 128));
+ } else
+ _object1.setPosition(Common::Point(300, 128));
+ }
+}
+
+void Scene2000::initExits() {
+ _exit1._enabled = true;
+ _exit2._enabled = true;
+ _exit3._enabled = false;
+ _exit4._enabled = false;
+ _exit5._enabled = false;
+
+ _exit1._insideArea = false;
+ _exit2._insideArea = false;
+ _exit3._insideArea = false;
+ _exit4._insideArea = false;
+ _exit5._insideArea = false;
+
+ _exit1._moving = false;
+ _exit2._moving = false;
+ _exit3._moving = false;
+ _exit4._moving = false;
+ _exit5._moving = false;
+
+ for (int i = 0; i < 11; i++)
+ _objList1[i].hide();
+
+ _object1.remove();
+
+ switch (R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex]) {
+ case 3:
+ case 10:
+ case 16:
+ case 21:
+ _exit5._enabled = true;
+ _exit5._bounds.set(61, 68, 90, 125);
+ _exit5.setDest(Common::Point(92, 129));
+ _exit5._cursorNum = EXITCURSOR_W;
+ break;
+ case 4:
+ case 12:
+ case 25:
+ case 34:
+ _exit5._enabled = true;
+ _exit5._bounds.set(230, 68, 259, 125);
+ _exit5.setDest(Common::Point(244, 129));
+ _exit5._cursorNum = EXITCURSOR_E;
+ break;
+ default:
+ break;
+ }
+
+ switch (R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] - 1) {
+ case 0:
+ case 6:
+ case 13:
+ case 18:
+ case 22:
+ case 27:
+ case 30:
+ _exit1._enabled = false;
+ loadScene(2225);
+ R2_GLOBALS._walkRegions.load(2225);
+ if (!_exitingFlag)
+ _mazePlayerMode = 0;
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
+ break;
+ case 1:
+ case 19:
+ _exit3._enabled = true;
+ _exit3._bounds.set(71, 130, 154, 168);
+ _exit3.setDest(Common::Point(94, 129));
+ _exit3._cursorNum = EXITCURSOR_SE;
+ loadScene(2300);
+ if (!_exitingFlag)
+ _mazePlayerMode = 0;
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
+ R2_GLOBALS._walkRegions.load(2000);
+ break;
+ case 2:
+ case 9:
+ case 15:
+ case 20:
+ loadScene(2150);
+ R2_GLOBALS._walkRegions.load(2000);
+ switch(R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex]) {
+ case 2400:
+ _mazePlayerMode = 1;
+ break;
+ case 2425:
+ case 2430:
+ case 2435:
+ case 2450:
+ _mazePlayerMode = 3;
+ break;
+ default:
+ if (!_exitingFlag)
+ _mazePlayerMode = 0;
+ break;
+ }
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
+ R2_GLOBALS._sceneManager._previousScene = 2000;
+ break;
+ case 3:
+ case 11:
+ case 24:
+ case 33:
+ loadScene(2175);
+ R2_GLOBALS._walkRegions.load(2000);
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
+ if (!_exitingFlag)
+ _mazePlayerMode = 0;
+ } else if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2350)
+ _mazePlayerMode = 1;
+ else
+ _mazePlayerMode = 10;
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
+ R2_GLOBALS._sceneManager._previousScene = 2000;
+ break;
+ case 4:
+ case 8:
+ loadScene(2000);
+ R2_GLOBALS._walkRegions.load(2000);
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1900)
+ _mazePlayerMode = 1;
+ else if (!_exitingFlag)
+ _mazePlayerMode = 0;
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
+ R2_GLOBALS._sceneManager._previousScene = 2000;
+ break;
+ case 5:
+ case 12:
+ case 17:
+ case 21:
+ case 26:
+ loadScene(2200);
+ R2_GLOBALS._walkRegions.load(2000);
+ _exit2._enabled = false;
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1900)
+ _mazePlayerMode = 2;
+ else if (!_exitingFlag)
+ _mazePlayerMode = 0;
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
+ R2_GLOBALS._sceneManager._previousScene = 2000;
+ break;
+ case 7:
+ case 29:
+ _exit4._enabled = true;
+ _exit4._bounds.set(138, 83, 211, 125);
+ _exit4.setDest(Common::Point(129, 188));
+ _exit4._cursorNum = EXITCURSOR_NW;
+ loadScene(2250);
+ R2_GLOBALS._walkRegions.load(2000);
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2500)
+ _mazePlayerMode = 1;
+ else if (!_exitingFlag)
+ _mazePlayerMode = 0;
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
+ R2_GLOBALS._sceneManager._previousScene = 2000;
+ break;
+ case 10:
+ case 25:
+ _exit3._enabled = true;
+ _exit3._bounds.set(78, 130, 148, 168);
+ _exit3.setDest(Common::Point(100, 129));
+ _exit3._cursorNum = EXITCURSOR_SE;
+ loadScene(2075);
+ R2_GLOBALS._walkRegions.load(2000);
+ if (!_exitingFlag)
+ _mazePlayerMode = 0;
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
+ break;
+ case 14:
+ _exit3._enabled = true;
+ _exit3._bounds.set(160, 130, 248, 168);
+ _exit3.setDest(Common::Point(225, 129));
+ _exit3._cursorNum = EXITCURSOR_SW;
+ loadScene(2325);
+ R2_GLOBALS._walkRegions.load(2000);
+ if (!_exitingFlag)
+ _mazePlayerMode = 0;
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
+ break;
+ case 16:
+ case 31:
+ _exit4._enabled = true;
+ _exit4._bounds.set(122, 83, 207, 125);
+ _exit4.setDest(Common::Point(210, 129));
+ _exit4._cursorNum = EXITCURSOR_NW;
+ loadScene(2125);
+ R2_GLOBALS._walkRegions.load(2000);
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2400)
+ _mazePlayerMode = 2;
+ else if (!_exitingFlag)
+ _mazePlayerMode = 0;
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
+ R2_GLOBALS._sceneManager._previousScene = 2000;
+ break;
+ case 23:
+ _exit4._enabled = true;
+ _exit4._bounds.set(108, 83, 128, 184);
+ _exit4.setDest(Common::Point(135, 129));
+ _exit4._cursorNum = CURSOR_INVALID;
+ loadScene(2275);
+ R2_GLOBALS._walkRegions.load(2000);
+ if (!_exitingFlag)
+ _mazePlayerMode = 0;
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
+ break;
+ case 28:
+ _exit3._enabled = true;
+ _exit3._bounds.set(171, 130, 241, 168);
+ _exit3.setDest(Common::Point(218, 129));
+ _exit3._cursorNum = EXITCURSOR_SW;
+ loadScene(2050);
+ R2_GLOBALS._walkRegions.load(2000);
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2350)
+ _mazePlayerMode = 11;
+ else if (!_exitingFlag)
+ _mazePlayerMode = 0;
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
+ break;
+ case 32:
+ loadScene(2025);
+ R2_GLOBALS._walkRegions.load(2000);
+ if (!_exitingFlag)
+ _mazePlayerMode = 0;
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
+ break;
+ default:
+ break;
+ }
+ _exitingFlag = false;
+ R2_GLOBALS._uiElements.show();
+}
+
+void Scene2000::Action1::signal() {
+ Scene2000 *scene = (Scene2000 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex) {
+ case 0: {
+ _actionIndex = 1;
+ Common::Point pt(-20, 127);
+ NpcMover *mover = new NpcMover();
+ scene->_objList1[_state].addMover(mover, &pt, scene);
+ break;
+ }
+ case 1:
+ scene->_objList1[_state].setPosition(Common::Point(340, 127));
+ --R2_GLOBALS._v56605[4 + _state];
+ _actionIndex = 0;
+ switch (_state - 1) {
+ case 0:
+ if (R2_GLOBALS._v56605[4] == 1)
+ _actionIndex = 10;
+ break;
+ case 2:
+ if (R2_GLOBALS._v56605[6] == 7)
+ _actionIndex = 10;
+ break;
+ case 4:
+ if (R2_GLOBALS._v56605[8] == 14)
+ _actionIndex = 10;
+ break;
+ case 6:
+ if (R2_GLOBALS._v56605[10] == 19)
+ _actionIndex = 10;
+ break;
+ case 7:
+ if (R2_GLOBALS._v56605[11] == 23)
+ _actionIndex = 10;
+ break;
+ default:
+ break;
+ }
+
+ if (R2_GLOBALS._v56605[3 + _state] == R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex])
+ scene->_objList1[_state].show();
+ else
+ scene->_objList1[_state].hide();
+
+ signal();
+ break;
+ case 5: {
+ _actionIndex = 6;
+ Common::Point pt(340, 127);
+ NpcMover *mover = new NpcMover();
+ scene->_objList1[_state].addMover(mover, &pt, this);
+ break;
+ }
+ case 6:
+ scene->_objList1[_state].setPosition(Common::Point(-20, 127));
+ ++R2_GLOBALS._v56605[3 + _state];
+ _actionIndex = 5;
+ switch (_state - 1) {
+ case 0:
+ if (R2_GLOBALS._v56605[4] == 5)
+ _actionIndex = 15;
+ break;
+ case 2:
+ if (R2_GLOBALS._v56605[6] == 13)
+ _actionIndex = 15;
+ break;
+ case 4:
+ if (R2_GLOBALS._v56605[8] == 16)
+ _actionIndex = 15;
+ break;
+ case 6:
+ if (R2_GLOBALS._v56605[10] == 22)
+ _actionIndex = 15;
+ break;
+ case 7:
+ if (R2_GLOBALS._v56605[11] == 27)
+ _actionIndex = 15;
+ break;
+ default:
+ break;
+ }
+
+ if (R2_GLOBALS._v56605[3 + _state] == R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex])
+ scene->_objList1[_state].show();
+ else
+ scene->_objList1[_state].hide();
+
+ signal();
+ break;
+ case 10: {
+ Common::Point pt(290, 127);
+ NpcMover *mover = new NpcMover();
+ scene->_objList1[_state].addMover(mover, &pt, this);
+ _actionIndex = 11;
+ break;
+ }
+ case 11:
+ if (_state == 1)
+ scene->_objList1[0].setStrip(1);
+ else if (_state == 5)
+ scene->_objList1[4].setStrip(1);
+ setDelay(600);
+ _actionIndex = 12;
+ break;
+ case 12:
+ if (_state == 1)
+ scene->_objList1[0].setStrip(2);
+ else if (_state == 5)
+ scene->_objList1[4].setStrip(2);
+ scene->_objList1[_state].setStrip(1);
+ _actionIndex = 5;
+ signal();
+ break;
+ case 15:
+ if ((R2_GLOBALS._v56605[3 + _state] == 13) || (R2_GLOBALS._v56605[3 + _state] == 22) || (R2_GLOBALS._v56605[3 + _state] == 27)) {
+ Common::Point pt(30, 127);
+ NpcMover *mover = new NpcMover();
+ scene->_objList1[_state].addMover(mover, &pt, this);
+ _actionIndex = 16;
+ } else {
+ Common::Point pt(120, 127);
+ NpcMover *mover = new NpcMover();
+ scene->_objList1[_state].addMover(mover, &pt, this);
+ _actionIndex = 16;
+ }
+ break;
+ case 16:
+ if (_state == 1)
+ scene->_objList1[2].setStrip(2);
+ else if (_state == 8)
+ scene->_objList1[9].setStrip(2);
+ setDelay(600);
+ _actionIndex = 17;
+ break;
+ case 17:
+ if (_state == 1)
+ scene->_objList1[2].setStrip(1);
+ else if (_state == 8)
+ scene->_objList1[9].setStrip(1);
+ scene->_objList1[_state].setStrip(2);
+ _actionIndex = 0;
+ break;
+ case 99:
+ error("99");
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene2000::Exit1::changeScene() {
+ Scene2000 *scene = (Scene2000 *)R2_GLOBALS._sceneManager._scene;
+
+ scene->_exitingFlag = true;
+ scene->_sceneMode = 0;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ scene->_sceneMode = 10;
+
+ Common::Point pt(-10, 129);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+
+ scene->setAction(&scene->_sequenceManager, scene, 206, &R2_GLOBALS._player, NULL);
+}
+
+void Scene2000::Exit2::changeScene() {
+ Scene2000 *scene = (Scene2000 *)R2_GLOBALS._sceneManager._scene;
+
+ scene->_exitingFlag = true;
+ scene->_sceneMode = 0;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ scene->_sceneMode = 11;
+
+ Common::Point pt(330, 129);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene2000::Exit3::changeScene() {
+ Scene2000 *scene = (Scene2000 *)R2_GLOBALS._sceneManager._scene;
+
+ scene->_exitingFlag = true;
+ scene->_sceneMode = 0;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ scene->_sceneMode = 12;
+
+ switch (R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex]) {
+ case 2:
+ scene->_mazePlayerMode = 4;
+ R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 8;
+ break;
+ case 11:
+ scene->_mazePlayerMode = 6;
+ R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 17;
+ break;
+ case 15:
+ scene->_mazePlayerMode = 8;
+ R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 24;
+ break;
+ case 20:
+ scene->_mazePlayerMode = 4;
+ R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 30;
+ break;
+ case 26:
+ scene->_mazePlayerMode = 6;
+ R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 32;
+ break;
+ case 29:
+ scene->_mazePlayerMode = 11;
+ R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 29;
+ break;
+ default:
+ break;
+ }
+
+ switch (scene->_mazePlayerMode) {
+ case 4:
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->setAction(&scene->_sequenceManager, scene, 2003, &R2_GLOBALS._player, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager, scene, 2023, &R2_GLOBALS._player, NULL);
+ break;
+ case 6:
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->setAction(&scene->_sequenceManager, scene, 2007, &R2_GLOBALS._player, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager, scene, 2027, &R2_GLOBALS._player, NULL);
+ break;
+ case 8:
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->setAction(&scene->_sequenceManager, scene, 2011, &R2_GLOBALS._player, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager, scene, 2031, &R2_GLOBALS._player, NULL);
+ break;
+ case 11:
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->_sceneMode = 2039;
+ else
+ scene->_sceneMode = 2041;
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
+ break;
+
+ default:
+ break;
+ }
+}
+void Scene2000::Exit4::changeScene() {
+ Scene2000 *scene = (Scene2000 *)R2_GLOBALS._sceneManager._scene;
+
+ scene->_exitingFlag = true;
+ scene->_sceneMode = 0;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ scene->_sceneMode = 13;
+
+ switch (R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex]) {
+ case 8:
+ scene->_mazePlayerMode = 5;
+ R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 2;
+ break;
+ case 17:
+ scene->_mazePlayerMode = 7;
+ R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 11;
+ break;
+ case 24:
+ scene->_mazePlayerMode = 9;
+ R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 15;
+ break;
+ case 30:
+ scene->_mazePlayerMode = 5;
+ R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 20;
+ break;
+ case 32:
+ scene->_mazePlayerMode = 7;
+ R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 26;
+ break;
+ default:
+ break;
+ }
+
+ switch (scene->_mazePlayerMode) {
+ case 5:
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->setAction(&scene->_sequenceManager, scene, 2006, &R2_GLOBALS._player, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager, scene, 2026, &R2_GLOBALS._player, NULL);
+ break;
+ case 7:
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->setAction(&scene->_sequenceManager, scene, 2010, &R2_GLOBALS._player, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager, scene, 2030, &R2_GLOBALS._player, NULL);
+ break;
+ case 9:
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->setAction(&scene->_sequenceManager, scene, 2014, &R2_GLOBALS._player, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager, scene, 2034, &R2_GLOBALS._player, NULL);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene2000::Exit5::changeScene() {
+ Scene2000 *scene = (Scene2000 *)R2_GLOBALS._sceneManager._scene;
+
+ scene->_sceneMode = 0;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ scene->_sceneMode = 14;
+
+ switch (R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex]) {
+ case 3:
+ scene->_mazePlayerMode = 1;
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->setAction(&scene->_sequenceManager, scene, 2015, &R2_GLOBALS._player, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager, scene, 2035, &R2_GLOBALS._player, NULL);
+ break;
+ case 4:
+ scene->_mazePlayerMode = 7;
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->setAction(&scene->_sequenceManager, scene, 2017, &R2_GLOBALS._player, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager, scene, 2037, &R2_GLOBALS._player, NULL);
+ break;
+ case 10:
+ scene->_mazePlayerMode = 8;
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->setAction(&scene->_sequenceManager, scene, 2015, &R2_GLOBALS._player, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager, scene, 2035, &R2_GLOBALS._player, NULL);
+ break;
+ case 12:
+ scene->_mazePlayerMode = 3;
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->setAction(&scene->_sequenceManager, scene, 2017, &R2_GLOBALS._player, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager, scene, 2037, &R2_GLOBALS._player, NULL);
+ break;
+ case 16:
+ scene->_mazePlayerMode = 4;
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->setAction(&scene->_sequenceManager, scene, 2015, &R2_GLOBALS._player, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager, scene, 2035, &R2_GLOBALS._player, NULL);
+ break;
+ case 21:
+ scene->_mazePlayerMode = 5;
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->setAction(&scene->_sequenceManager, scene, 2015, &R2_GLOBALS._player, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager, scene, 2035, &R2_GLOBALS._player, NULL);
+ break;
+ case 25:
+ scene->_mazePlayerMode = 2;
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->setAction(&scene->_sequenceManager, scene, 2017, &R2_GLOBALS._player, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager, scene, 2037, &R2_GLOBALS._player, NULL);
+ break;
+ case 34:
+ scene->_mazePlayerMode = 6;
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->setAction(&scene->_sequenceManager, scene, 2017, &R2_GLOBALS._player, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager, scene, 2037, &R2_GLOBALS._player, NULL);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene2000::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+ loadScene(2000);
+
+ if (R2_GLOBALS._sceneManager._previousScene != -1) {
+ R2_GLOBALS._v56605[1] = 21;
+ R2_GLOBALS._v56605[2] = 21;
+ }
+ if ((R2_GLOBALS._player._characterScene[R2_GLOBALS._player._characterIndex] != R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex]) && (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] != 2350)) {
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 0;
+ }
+ _exitingFlag = false;
+
+ _exit1.setDetails(Rect(0, 100, 14, 140), EXITCURSOR_W, 2000);
+ _exit1.setDest(Common::Point(14, 129));
+ _exit2.setDetails(Rect(305, 100, 320, 140), EXITCURSOR_E, 2000);
+ _exit2.setDest(Common::Point(315, 129));
+ _exit3.setDetails(Rect(71, 130, 154, 168), EXITCURSOR_S, 2000);
+ _exit3.setDest(Common::Point(94, 129));
+ _exit4.setDetails(Rect(138, 83, 211, 125), EXITCURSOR_N, 2000);
+ _exit4.setDest(Common::Point(188, 128));
+ _exit5.setDetails(Rect(61, 68, 90, 125), EXITCURSOR_W, 2000);
+ _exit5.setDest(Common::Point(92, 129));
+
+ R2_GLOBALS._sound1.play(200);
+ initExits();
+ g_globals->_sceneManager._fadeMode = FADEMODE_IMMEDIATE;
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ R2_GLOBALS._player.setup(2008, 3, 1);
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ } else {
+ R2_GLOBALS._player.setup(20, 3, 1);
+ R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
+ }
+
+ _action1._state = 8;
+ _action2._state = 1;
+ _action3._state = 5;
+ _action4._state = 7;
+ _action5._state = 3;
+
+ for (int i = 0; i < 11; i++)
+ _objList1[i].postInit();
+
+ _objList1[0].setVisage(2000);
+ _objList1[0].setStrip(2);
+ _objList1[0].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
+
+ _objList1[1].setVisage(2001);
+ _objList1[1].setStrip(2);
+ _objList1[1].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
+
+ _objList1[2].setVisage(2003);
+ _objList1[2].setStrip(1);
+ _objList1[2].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
+
+ _objList1[3].setVisage(2007);
+ _objList1[3].setStrip(2);
+ _objList1[3].setDetails(2001, 12, -1, -1, 1, (SceneItem *)NULL);
+
+ _objList1[4].setVisage(2004);
+ _objList1[4].setStrip(2);
+ _objList1[4].setDetails(2001, 19, -1, -1, 1, (SceneItem *)NULL);
+
+ _objList1[5].setVisage(2003);
+ _objList1[5].setStrip(2);
+ _objList1[5].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
+
+ _objList1[6].setVisage(2000);
+ _objList1[6].setStrip(1);
+ _objList1[6].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
+
+ _objList1[7].setVisage(2000);
+ _objList1[7].setStrip(2);
+ _objList1[7].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
+
+ _objList1[8].setVisage(2000);
+ _objList1[8].setStrip(2);
+ _objList1[8].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
+
+ _objList1[9].setVisage(2006);
+ _objList1[9].setStrip(1);
+ _objList1[9].setDetails(2001, 6, -1, -1, 1, (SceneItem *)NULL);
+
+ _objList1[10].setVisage(2007);
+ _objList1[10].setStrip(1);
+ _objList1[10].setDetails(2001, 12, -1, -1, 1, (SceneItem *)NULL);
+
+ for (int i = 0; i < 11; i++) {
+ _objList1[i].animate(ANIM_MODE_1, NULL);
+ _objList1[i]._moveDiff.x = 3;
+ _objList1[i]._moveRate = 8;
+ _objList1[i].hide();
+ switch (i - 1) {
+ case 0:
+ if (R2_GLOBALS._v56605[3 + i] == 1)
+ ++R2_GLOBALS._v56605[3 + i];
+ else if (R2_GLOBALS._v56605[3 + i] == 5)
+ --R2_GLOBALS._v56605[3 + i];
+ break;
+ case 2:
+ if (R2_GLOBALS._v56605[3 + i] == 7)
+ ++R2_GLOBALS._v56605[3 + i];
+ else if (R2_GLOBALS._v56605[3 + i] == 13)
+ --R2_GLOBALS._v56605[3 + i];
+ break;
+ case 4:
+ if (R2_GLOBALS._v56605[3 + i] == 14)
+ ++R2_GLOBALS._v56605[3 + i];
+ else if (R2_GLOBALS._v56605[3 + i] == 16)
+ --R2_GLOBALS._v56605[3 + i];
+ break;
+ case 6:
+ if (R2_GLOBALS._v56605[3 + i] == 19)
+ ++R2_GLOBALS._v56605[3 + i];
+ else if (R2_GLOBALS._v56605[3 + i] == 22)
+ --R2_GLOBALS._v56605[3 + i];
+ break;
+ case 8:
+ if (R2_GLOBALS._v56605[3 + i] == 23)
+ ++R2_GLOBALS._v56605[3 + i];
+ else if (R2_GLOBALS._v56605[3 + i] == 27)
+ --R2_GLOBALS._v56605[3 + i];
+ break;
+ default:
+ break;
+ }
+ switch (R2_GLOBALS._v56605[3 + i] - 1) {
+ case 0:
+ case 6:
+ case 13:
+ case 18:
+ case 22:
+ case 27:
+ case 30:
+ _objList1[i].setPosition(Common::Point(265, 127));
+ break;
+ case 5:
+ case 12:
+ case 17:
+ case 21:
+ case 26:
+ _objList1[i].setPosition(Common::Point(55, 127));
+ break;
+ default:
+ _objList1[i].setPosition(Common::Point(160, 127));
+ break;
+ }
+ }
+ _objList1[1].setAction(&_action2);
+ _objList1[3].setAction(&_action5);
+ _objList1[5].setAction(&_action4);
+ _objList1[8].setAction(&_action1);
+
+ initPlayer();
+
+ _item1.setDetails(Rect(0, 0, 320, 200), 2000, 0, -1, 23, 1, NULL);
+}
+
+void Scene2000::remove() {
+ R2_GLOBALS._sound1.fadeOut(NULL);
+ SceneExt::remove();
+}
+
+void Scene2000::signal() {
+ switch (_sceneMode) {
+ case 10:
+ if (R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] == 6)
+ g_globals->_sceneManager.changeScene(1900);
+ else {
+ _mazePlayerMode = 1;
+ --R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex];
+ initExits();
+ initPlayer();
+ }
+ break;
+ case 11:
+ switch (R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex]) {
+ case 5:
+ g_globals->_sceneManager.changeScene(1900);
+ break;
+ case 30:
+ g_globals->_sceneManager.changeScene(2500);
+ break;
+ case 34:
+ g_globals->_sceneManager.changeScene(2350);
+ break;
+ default:
+ _mazePlayerMode = 2;
+ ++R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex];
+ initExits();
+ initPlayer();
+ break;
+ }
+ break;
+ case 12:
+ case 13:
+ initExits();
+ initPlayer();
+ break;
+ case 14:
+ switch (_mazePlayerMode - 1) {
+ case 0:
+ g_globals->_sceneManager.changeScene(2450);
+ break;
+ case 1:
+ g_globals->_sceneManager.changeScene(2440);
+ break;
+ case 2:
+ g_globals->_sceneManager.changeScene(2435);
+ break;
+ case 3:
+ g_globals->_sceneManager.changeScene(2430);
+ break;
+ case 4:
+ g_globals->_sceneManager.changeScene(2425);
+ break;
+ case 5:
+ g_globals->_sceneManager.changeScene(2525);
+ break;
+ case 6:
+ g_globals->_sceneManager.changeScene(2530);
+ break;
+ case 7:
+ g_globals->_sceneManager.changeScene(2535);
+ break;
+ default:
+ if (R2_GLOBALS._v56AAB != 0)
+ R2_GLOBALS._v56AAB = 0;
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ break;
+ }
+ break;
+ case 2039:
+ case 2041:
+ g_globals->_sceneManager.changeScene(2350);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene2000::process(Event &event) {
+ if ((R2_GLOBALS._player._canWalk) && (event.eventType == EVENT_BUTTON_DOWN) &&
+ (R2_GLOBALS._events.getCursor() == CURSOR_CROSSHAIRS)) {
+
+ Common::Point pt(event.mousePos.x, 129);
+ PlayerMover *mover = new PlayerMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+
+ event.handled = true;
+ }
+ Scene::process(event);
+}
+
+void Scene2000::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsByte(_exitingFlag);
+ s.syncAsSint16LE(_mazePlayerMode);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2350 - Balloon Launch Platform
+ *
+ *--------------------------------------------------------------------------*/
+bool Scene2350::Actor2::startAction(CursorType action, Event &event) {
+ if (action != R2_SENSOR_PROBE)
+ return(SceneActor::startAction(action, event));
+ return true;
+}
+
+bool Scene2350::Actor3::startAction(CursorType action, Event &event) {
+ Scene2350 *scene = (Scene2350 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action == R2_REBREATHER_TANK) && (R2_GLOBALS.getFlag(74))) {
+ R2_GLOBALS._player.disableControl();
+ scene->_actor1.postInit();
+ scene->_sceneMode = 2355;
+ scene->setAction(&scene->_sequenceManager, scene, 2355, &R2_GLOBALS._player, &scene->_actor1, NULL);
+ return true;
+ }
+
+ return(SceneActor::startAction(action, event));
+}
+
+void Scene2350::ExitUp::changeScene() {
+ Scene2350 *scene = (Scene2350 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._player.disableControl(CURSOR_CROSSHAIRS);
+ scene->_sceneMode = 12;
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->setAction(&scene->_sequenceManager, scene, 2350, &R2_GLOBALS._player, NULL);
+ else
+ scene->setAction(&scene->_sequenceManager, scene, 2352, &R2_GLOBALS._player, NULL);
+}
+
+void Scene2350::ExitWest::changeScene() {
+ Scene2350 *scene = (Scene2350 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._player.disableControl(CURSOR_CROSSHAIRS);
+ scene->_sceneMode = 11;
+
+ Common::Point pt(-10, 129);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+
+}
+
+void Scene2350::postInit(SceneObjectList *OwnerList) {
+ loadScene(2350);
+ SceneExt::postInit();
+ R2_GLOBALS._sound1.play(200);
+ _stripManager.addSpeaker(&_pharishaSpeaker);
+ _stripManager.addSpeaker(&_quinnSpeaker);
+
+ if (R2_GLOBALS._sceneManager._previousScene == -1)
+ R2_GLOBALS._player._characterScene[2] = 2350;
+
+ _exitUp.setDetails(Rect(25, 83, 93, 125), EXITCURSOR_NW, 2350);
+ _exitUp.setDest(Common::Point(80, 129));
+ _exitWest.setDetails(Rect(0, 100, 14, 140), EXITCURSOR_W, 2350);
+ _exitWest.setDest(Common::Point(14, 129));
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ R2_GLOBALS._player.setup(2008, 3, 1);
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ } else {
+ R2_GLOBALS._player.setup(20, 3, 1);
+ R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
+ }
+
+ if (R2_GLOBALS._player._characterScene[1] == R2_GLOBALS._player._characterScene[2]) {
+ _actor2.postInit();
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ _actor2.setup(20, 5, 1);
+ _actor2.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
+ } else {
+ _actor2.setup(2008, 5, 1);
+ _actor2.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
+ }
+ _actor2.setPosition(Common::Point(135, 128));
+ }
+ _actor3.postInit();
+ _actor4.postInit();
+
+ if (R2_INVENTORY.getObjectScene(20) == 2350) {
+ _actor3.hide();
+ _actor4.hide();
+ } else {
+ _actor3.setup(2350, 0, 1);
+ _actor3.setPosition(Common::Point(197, 101));
+ _actor3.setDetails(2000, 12, -1, -1, 1, (SceneItem *)NULL);
+ _actor3.fixPriority(10);
+ _actor4.setup(2350, 1, 2);
+ _actor4.setPosition(Common::Point(199, 129));
+ _actor4.setDetails(2000, 12, -1, -1, 1, (SceneItem *)NULL);
+ _actor4.fixPriority(10);
+ }
+ _item1.setDetails(Rect(0, 0, 320, 200), 2000, 9, -1, -1, 1, NULL);
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
+ if (R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] == 34) {
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _sceneMode = 2351;
+ else
+ _sceneMode = 2353;
+ setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
+ } else {
+ _sceneMode = 10;
+ R2_GLOBALS._player.setPosition(Common::Point(-20, 129));
+ Common::Point pt(20, 129);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+
+ }
+ } else {
+ R2_GLOBALS._player.setPosition(Common::Point(100, 129));
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.enableControl();
+ }
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2350;
+}
+
+void Scene2350::remove() {
+ R2_GLOBALS._sound1.fadeOut(NULL);
+ SceneExt::remove();
+}
+
+void Scene2350::signal() {
+ switch (_sceneMode) {
+ case 11:
+ R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 34;
+ g_globals->_sceneManager.changeScene(2000);
+ break;
+ case 12:
+ R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 29;
+ g_globals->_sceneManager.changeScene(2000);
+ break;
+ case 20:
+ _sceneMode = 21;
+ _stripManager.start(712, this);
+ break;
+ case 21:
+ R2_GLOBALS._player.disableControl();
+ R2_INVENTORY.setObjectScene(36, 1);
+ _sceneMode = 2354;
+ setAction(&_sequenceManager, this, 2354, &R2_GLOBALS._player, NULL);
+ break;
+ case 2354:
+ R2_INVENTORY.setObjectScene(20, 2350);
+ g_globals->_sceneManager.changeScene(2900);
+ break;
+ case 2355:
+ _sceneMode = 20;
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ _stripManager.start(711, this);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene2350::process(Event &event) {
+ if ((R2_GLOBALS._player._canWalk) && (event.eventType != EVENT_BUTTON_DOWN) &&
+ (R2_GLOBALS._events.getCursor() == CURSOR_CROSSHAIRS)){
+ Common::Point pt(event.mousePos.x, 129);
+ PlayerMover *mover = new PlayerMover();
+ R2_GLOBALS._player.addMover(mover, &pt);
+ event.handled = true;
+ }
+ Scene::process(event);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2400 - Ice Maze: Large empty room
+ *
+ *--------------------------------------------------------------------------*/
+void Scene2400::Exit1::changeScene() {
+ Scene2400 *scene = (Scene2400 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 10;
+
+ Common::Point pt(-10, 150);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+
+}
+
+void Scene2400::Exit2::changeScene() {
+ Scene2400 *scene = (Scene2400 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 11;
+
+ Common::Point pt(330, 150);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene2400::postInit(SceneObjectList *OwnerList) {
+ loadScene(2400);
+ SceneExt::postInit();
+ _exit1.setDetails(Rect(0, 125, 14, 165), EXITCURSOR_W, 2000);
+ _exit1.setDest(Common::Point(14, 150));
+ _exit2.setDetails(Rect(305, 125, 320, 165), EXITCURSOR_E, 2000);
+ _exit2.setDest(Common::Point(315, 150));
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_GLOBALS._v56605[1] == 16) {
+ _sceneMode = 2400;
+ setAction(&_sequenceManager, this, 2400, &R2_GLOBALS._player, NULL);
+ } else {
+ _sceneMode = 2401;
+ setAction(&_sequenceManager, this, 2401, &R2_GLOBALS._player, NULL);
+ }
+}
+
+void Scene2400::signal() {
+ switch (_sceneMode) {
+ case 10:
+ R2_GLOBALS._v56605[1] = 16;
+ g_globals->_sceneManager.changeScene(2000);
+ break;
+ case 11:
+ R2_GLOBALS._v56605[1] = 17;
+ g_globals->_sceneManager.changeScene(2000);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2425 - Ice Maze:
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene2425::Item1::startAction(CursorType action, Event &event) {
+ Scene2425 *scene = (Scene2425 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action == R2_GUNPOWDER) && (!R2_GLOBALS.getFlag(84))) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2426;
+ scene->setAction(&scene->_sequenceManager, scene, 2426, &R2_GLOBALS._player, &scene->_actor1, NULL);
+ R2_GLOBALS.setFlag(84);
+ return true;
+ } else if (action == R2_GUNPOWDER) {
+ R2_GLOBALS._events.setCursor(R2_STEPPING_DISKS);
+ R2_GLOBALS._player.enableControl(R2_STEPPING_DISKS);
+ return NamedHotspot::startAction(R2_STEPPING_DISKS, event);
+ } else
+ return NamedHotspot::startAction(action, event);
+}
+
+bool Scene2425::Item2::startAction(CursorType action, Event &event) {
+ Scene2425 *scene = (Scene2425 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action == R2_GUNPOWDER) && (R2_GLOBALS.getFlag(84))) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2427;
+ scene->setAction(&scene->_sequenceManager, scene, 2427, &R2_GLOBALS._player, &scene->_actor1, NULL);
+ R2_GLOBALS.clearFlag(84);
+ return true;
+ } else if (action == R2_GUNPOWDER) {
+ R2_GLOBALS._events.setCursor(R2_STEPPING_DISKS);
+ R2_GLOBALS._player.enableControl(R2_STEPPING_DISKS);
+ return NamedHotspot::startAction(R2_STEPPING_DISKS, event);
+ } else
+ return NamedHotspot::startAction(action, event);
+}
+
+bool Scene2425::Item3::startAction(CursorType action, Event &event) {
+ Scene2425 *scene = (Scene2425 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != R2_GUNPOWDER)
+ return NamedHotspot::startAction(action, event);
+ else {
+ R2_GLOBALS._player.disableControl();
+ if (R2_GLOBALS.getFlag(84)) {
+ scene->_sceneMode = 20;
+ scene->setAction(&scene->_sequenceManager, scene, 2427, &R2_GLOBALS._player, &scene->_actor1, NULL);
+ R2_GLOBALS.clearFlag(84);
+ } else {
+ scene->_sceneMode = 2425;
+ scene->setAction(&scene->_sequenceManager, scene, 2425, &R2_GLOBALS._player, &scene->_actor1, NULL);
+ }
+ return true;
+ }
+}
+
+bool Scene2425::Item4::startAction(CursorType action, Event &event) {
+ if (action != R2_GUNPOWDER)
+ return NamedHotspot::startAction(action, event);
+ else {
+ R2_GLOBALS._events.setCursor(R2_STEPPING_DISKS);
+ R2_GLOBALS._player.enableControl(R2_STEPPING_DISKS);
+ return NamedHotspot::startAction(R2_STEPPING_DISKS, event);
+ }
+}
+
+bool Scene2425::Actor1::startAction(CursorType action, Event &event) {
+ if (action == R2_STEPPING_DISKS) {
+ if (R2_GLOBALS._player._characterIndex == 2) {
+ R2_GLOBALS._events.setCursor(R2_GUNPOWDER);
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+ } else if (R2_GLOBALS._events.getCursor() == R2_GUNPOWDER)
+ return false;
+ else
+ return SceneActor::startAction(action, event);
+}
+
+bool Scene2425::Actor2::startAction(CursorType action, Event &event) {
+ if (action != R2_GUNPOWDER)
+ return SceneActor::startAction(action, event);
+ else {
+ R2_GLOBALS._events.setCursor(R2_STEPPING_DISKS);
+ R2_GLOBALS._player.enableControl(R2_STEPPING_DISKS);
+ return SceneActor::startAction(R2_STEPPING_DISKS, event);
+ }
+}
+
+void Scene2425::Exit1::changeScene() {
+ Scene2425 *scene = (Scene2425 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._events.setCursor(R2_NEGATOR_GUN);
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 11;
+
+ Common::Point pt(340, 200);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+
+void Scene2425::postInit(SceneObjectList *OwnerList) {
+ loadScene(2425);
+ SceneExt::postInit();
+ if (R2_GLOBALS._sceneManager._previousScene == -1) {
+ R2_GLOBALS._player._characterIndex = R2_SEEKER;
+ R2_GLOBALS._sceneManager._previousScene = 2000;
+ }
+
+ R2_GLOBALS._sound1.play(200);
+ _exit1.setDetails(Rect(270, 136, 319, 168), EXITCURSOR_SE, 2000);
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ R2_GLOBALS._player.setVisage(2008);
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ } else {
+ R2_GLOBALS._player.setVisage(20);
+ R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
+ }
+
+ if (R2_GLOBALS._player._characterScene[1] == R2_GLOBALS._player._characterScene[2]) {
+ _actor2.postInit();
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ _actor2.setup(20, 5, 1);
+ _actor2.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
+ } else {
+ _actor2.setup(2008, 5, 1);
+ _actor2.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
+ }
+ _actor2.setPosition(Common::Point(250, 185));
+ }
+
+ _actor1.postInit();
+ if (R2_GLOBALS._sceneManager._previousScene == 2455)
+ _actor1.setup(2426, 1, 1);
+ else
+ _actor1.setup(2426, 1, 2);
+
+ _actor1.setPosition(Common::Point(290, 9));
+ _actor1.fixPriority(20);
+ _actor1.setDetails(2455, 12, -1, -1, 1, (SceneItem *)NULL);
+ _item1.setDetails(Rect(225, 52, 248, 65), 2425, -1, -1, -1, 1, NULL);
+ _item2.setDetails(Rect(292, 81, 316, 94), 2425, -1, -1, -1, 1, NULL);
+
+// CHECKME: SceneActor using a SceneItem function??
+// _actor3.setDetails(11, 2425, 3, -1, 6);
+ _actor3._sceneRegionId = 11;
+ _actor3._resNum = 2425;
+ _actor3._lookLineNum = 3;
+ _actor3._talkLineNum = -1;
+ _actor3._useLineNum = 6;
+ g_globals->_sceneItems.push_back(&_actor3);
+
+ _item3.setDetails(12, 2425, 7, -1, 9);
+ _item4.setDetails(Rect(0, 0, 320, 200), 2425, 0, -1, -1, 1, NULL);
+
+ R2_GLOBALS._player.disableControl();
+ switch (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex]) {
+ case 2000: {
+ _sceneMode = 10;
+ R2_GLOBALS._player.setPosition(Common::Point(340, 200));
+
+ Common::Point pt(280, 150);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 2425:
+ _sceneMode = 10;
+ R2_GLOBALS._player.setPosition(Common::Point(280, 150));
+ _action->signal();
+ break;
+ case 2455:
+ _sceneMode = 2428;
+ setAction(&_sequenceManager, this, 2428, &R2_GLOBALS._player, &_actor1, NULL);
+ break;
+ default:
+ R2_GLOBALS._player.setPosition(Common::Point(280, 150));
+ R2_GLOBALS._player.setStrip(8);
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2425;
+}
+
+void Scene2425::remove() {
+ R2_GLOBALS._sound1.fadeOut(NULL);
+ SceneExt::remove();
+}
+
+void Scene2425::signal() {
+ switch (_sceneMode) {
+ case 11:
+ g_globals->_sceneManager.changeScene(2000);
+ break;
+ case 20:
+ _sceneMode = 2425;
+ setAction(&_sequenceManager, this, 2425, &R2_GLOBALS._player, &_actor1, NULL);
+ break;
+ case 2425:
+ g_globals->_sceneManager.changeScene(2455);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2430 - Ice Maze: Bedroom
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene2430::Actor1::startAction(CursorType action, Event &event) {
+ return SceneActor::startAction(action, event);
+}
+
+bool Scene2430::Actor2::startAction(CursorType action, Event &event) {
+ Scene2430 *scene = (Scene2430 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action != R2_STEPPING_DISKS) || (R2_GLOBALS._player._characterIndex != 2))
+ return SceneActor::startAction(action, event);
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2430;
+ scene->setAction(&scene->_sequenceManager, scene, 2430, &R2_GLOBALS._player, &scene->_actor2, NULL);
+ return true;
+}
+
+bool Scene2430::Actor3::startAction(CursorType action, Event &event) {
+ Scene2430 *scene = (Scene2430 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action != R2_STEPPING_DISKS) || (R2_GLOBALS._player._characterIndex != 2))
+ return SceneActor::startAction(action, event);
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2435;
+ scene->setAction(&scene->_sequenceManager, scene, 2435, &R2_GLOBALS._player, &scene->_actor3, NULL);
+ return true;
+}
+
+void Scene2430::Exit1::changeScene() {
+ Scene2430 *scene = (Scene2430 *)R2_GLOBALS._sceneManager._scene;
+
+ scene->_sceneMode = 0;
+ R2_GLOBALS._events.setCursor(R2_NEGATOR_GUN);
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 11;
+ Common::Point pt(108, 200);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene2430::postInit(SceneObjectList *OwnerList) {
+ loadScene(2430);
+ SceneExt::postInit();
+ _exit1.setDetails(Rect(68, 155, 147, 168), EXITCURSOR_S, 2000);
+ _exit1.setDest(Common::Point(108, 160));
+
+ if (R2_INVENTORY.getObjectScene(37) == 2430) {
+ _actor2.postInit();
+ _actor2.setup(2435, 1, 5);
+ _actor2.setPosition(Common::Point(205, 119));
+ _actor2.fixPriority(152);
+ _actor2.setDetails(2430, 51, -1, 53, 1, (SceneItem *)NULL);
+ }
+
+ if (R2_INVENTORY.getObjectScene(50) == 2435) {
+ _actor3.postInit();
+ _actor3.setup(2435, 1, 1);
+ _actor3.setPosition(Common::Point(31, 65));
+ _actor3.setDetails(2430, 48, -1, -1, 1, (SceneItem *)NULL);
+ }
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ R2_GLOBALS._player.setVisage(2008);
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ } else {
+ R2_GLOBALS._player.setVisage(20);
+ R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
+ }
+ R2_GLOBALS._player.setPosition(Common::Point(100, 200));
+
+ if (R2_GLOBALS._player._characterScene[1] == R2_GLOBALS._player._characterScene[2]) {
+ _actor1.postInit();
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ _actor1.setup(20, 5, 1);
+ _actor1.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
+ } else {
+ _actor1.setup(2008, 5, 1);
+ _actor1.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
+ }
+ _actor1.setPosition(Common::Point(189, 137));
+ R2_GLOBALS._walkRegions.enableRegion(4);
+ }
+
+ _item2.setDetails(Rect(11, 30, 37, 45), 2430, 3, -1, 5, 1, NULL);
+ _item3.setDetails(Rect(9, 58, 63, 92), 2430, 6, -1, -1, 1, NULL);
+ _item4.setDetails(Rect(20, 89, 127, 107), 2430, 9, -1, 11, 1, NULL);
+ _item5.setDetails(Rect(49, 7, 60, 27), 2430, 12, 13, 14, 1, NULL);
+ _item6.setDetails(Rect(69, 10, 95, 72), 2430, 15, -1, 14, 1, NULL);
+ _item10.setDetails(Rect(198, 4, 222, 146), 2430, 30, 31, 32, 1, NULL);
+ _item7.setDetails(Rect(155, 40, 304, 120), 2430, 21, -1, 23, 1, NULL);
+ _item8.setDetails(Rect(249, 3, 261, 39), 2430, 24, 25, -1, 1, NULL);
+ _item9.setDetails(Rect(279, 13, 305, 34), 2430, 33, -1, 18, 1, NULL);
+ // CHECKME: initialized for the 2nd time??
+ _item2.setDetails(Rect(11, 30, 37, 45), 2430, 33, -1, 18, 1, NULL);
+ _item11.setDetails(Rect(116, 104, 148, 111), 2430, 39, -1, -1, 1, NULL);
+ _item12.setDetails(Rect(66, 77, 84, 83), 2430, 39, -1, -1, 1, NULL);
+ _item13.setDetails(Rect(117, 118, 201, 141), 2430, 9, -1, 11, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 320, 200), 2430, 0, -1, -1, 1, NULL);
+
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2430;
+ Common::Point pt(108, 150);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else {
+ R2_GLOBALS._player.setPosition(Common::Point(105, 145));
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.enableControl();
+ }
+}
+
+void Scene2430::signal() {
+ switch (_sceneMode) {
+ case 11:
+ g_globals->_sceneManager.changeScene(2000);
+ break;
+ case 2430:
+ _actor2.remove();
+ R2_INVENTORY.setObjectScene(R2_GUNPOWDER, 2);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 2435:
+ _actor3.remove();
+ R2_INVENTORY.setObjectScene(R2_ALCOHOL_LAMP_3, 2);
+ R2_GLOBALS._player.enableControl();
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2435 - Ice Maze: Throne room
+ *
+ *--------------------------------------------------------------------------*/
+bool Scene2435::Actor1::startAction(CursorType action, Event &event) {
+ return SceneActor::startAction(action, event);
+}
+
+bool Scene2435::Actor2::startAction(CursorType action, Event &event) {
+ Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case R2_SAPPHIRE_BLUE:
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ R2_GLOBALS.setFlag(82);
+ scene->_stripManager.start(603, scene);
+ return true;
+ case R2_ANCIENT_SCROLLS:
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ R2_GLOBALS.setFlag(82);
+ scene->_stripManager.start(602, scene);
+ R2_INVENTORY.setObjectScene(R2_ANCIENT_SCROLLS, 2000);
+ return true;
+ case CURSOR_TALK:
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 20;
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ if ((R2_GLOBALS._player._characterIndex == 1) || (R2_GLOBALS.getFlag(82))) {
+ scene->_stripManager.start(605, scene);
+ return true;
+ } else if (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 2) {
+ scene->_stripManager.start(601, scene);
+ return true;
+ } else {
+ R2_GLOBALS.setFlag(82);
+ scene->_stripManager.start(600, scene);
+ return true;
+ }
+ default:
+ return SceneActor::startAction(action, event);
+ }
+}
+
+void Scene2435::Exit1::changeScene() {
+ Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._events.setCursor(R2_NEGATOR_GUN);
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 11;
+ Common::Point pt(175, 200);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+
+}
+
+void Scene2435::postInit(SceneObjectList *OwnerList) {
+ loadScene(2435);
+ SceneExt::postInit();
+ R2_GLOBALS._sound1.play(201);
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_seekerSpeaker);
+ _stripManager.addSpeaker(&_pharishaSpeaker);
+ _exit1.setDetails(Rect(142, 155, 207, 167), EXITCURSOR_S, 2000);
+ _exit1.setDest(Common::Point(175, 160));
+ _actor2.postInit();
+ _actor2.setup(2005, 3, 1);
+ _actor2.setPosition(Common::Point(219, 106));
+ _actor2.setDetails(2001, 25, 26, -1, 1, (SceneItem *)NULL);
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ R2_GLOBALS._player.setVisage(2008);
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ } else {
+ R2_GLOBALS._player.setVisage(20);
+ R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
+ }
+ R2_GLOBALS._player.setPosition(Common::Point(715, 200));
+ if (R2_GLOBALS._player._characterScene[1] == R2_GLOBALS._player._characterScene[2]) {
+ _actor1.postInit();
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ _actor1.setup(20, 5, 1);
+ _actor1.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
+ } else {
+ _actor1.setup(2008, 5, 1);
+ _actor1.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
+ }
+ _actor1.setPosition(Common::Point(107, 145));
+ R2_GLOBALS._walkRegions.enableRegion(2);
+ }
+
+ _item2.setDetails(Rect(52, 44, 96, 82), 2430, 3, -1, 5, 1, NULL);
+ _item3.setDetails(Rect(117, 36, 161, 74), 2430, 3, -1, 5, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 320, 200), 2430, 0, -1, -1, 1, NULL);
+ R2_GLOBALS._player.disableControl();
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
+ _sceneMode = 10;
+ Common::Point pt(175, 150);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2450) {
+ _sceneMode = 30;
+ Common::Point pt(175, 150);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else {
+ R2_GLOBALS._player.setPosition(Common::Point(210, 150));
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.enableControl();
+ }
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2435;
+ R2_GLOBALS._v56605[1 + R2_GLOBALS._player._characterIndex] = 12;
+}
+
+void Scene2435::remove() {
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene2435::signal() {
+ switch (_sceneMode) {
+ case 11:
+ g_globals->_sceneManager.changeScene(2000);
+ break;
+ case 20:
+ R2_GLOBALS._player.enableControl(CURSOR_TALK);
+ break;
+ case 30:
+ R2_GLOBALS._player._characterScene[1] = 2435;
+ R2_GLOBALS._player._characterScene[2] = 2435;
+ R2_GLOBALS._player._oldCharacterScene[1] = 2435;
+ R2_GLOBALS._player._oldCharacterScene[2] = 2435;
+ R2_GLOBALS._v56605[1] = 12;
+ R2_GLOBALS._v56605[2] = 12;
+ R2_GLOBALS.setFlag(81);
+ _sceneMode = 2436;
+ R2_GLOBALS._player.setStrip(7);
+ _actor1.postInit();
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _actor1.setVisage(20);
+ else
+ _actor1.setVisage(2008);
+ setAction(&_sequenceManager, this, 2436, &_actor1, NULL);
+ break;
+ case 2436:
+ R2_GLOBALS._walkRegions.enableRegion(2);
+ _sceneMode = 20;
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ _stripManager.start(709, this);
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2440 - Ice Maze: Another bedroom
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene2440::Actor1::startAction(CursorType action, Event &event) {
+ return SceneActor::startAction(action, event);
+}
+
+bool Scene2440::Actor2::startAction(CursorType action, Event &event) {
+ Scene2440 *scene = (Scene2440 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == 2)){
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2440;
+ scene->setAction(&scene->_sequenceManager, scene, 2440, &R2_GLOBALS._player, &scene->_actor2, NULL);
+ return true;
+ }
+
+ return SceneActor::startAction(action, event);
+}
+
+void Scene2440::Exit1::changeScene() {
+ Scene2440 *scene = (Scene2440 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 11;
+ Common::Point pt(210, 200);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene2440::postInit(SceneObjectList *OwnerList) {
+ loadScene(2440);
+ SceneExt::postInit();
+ R2_GLOBALS._sound1.play(200);
+ // Fix exit cursor, the original was using NW
+ _exit1.setDetails(Rect(172, 155, 250, 167), EXITCURSOR_SE, 2000);
+ _exit1.setDest(Common::Point(210, 160));
+ if (R2_INVENTORY.getObjectScene(49) == 2440) {
+ _actor2.postInit();
+ _actor2.setup(2435, 1, 1);
+ _actor2.setPosition(Common::Point(94, 80));
+ _actor2.fixPriority(106);
+ _actor2.setDetails(2430, 48, -1, -1, 1, (SceneItem *)NULL);
+ }
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ R2_GLOBALS._player.setVisage(2008);
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ } else {
+ R2_GLOBALS._player.setVisage(20);
+ R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
+ }
+ R2_GLOBALS._player.setPosition(Common::Point(210, 200));
+ if (R2_GLOBALS._player._characterScene[1] == R2_GLOBALS._player._characterScene[2]) {
+ _actor1.postInit();
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ _actor1.setup(20, 5, 1);
+ _actor1.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
+ } else {
+ _actor1.setup(2008, 5, 1);
+ _actor1.setDetails(9002, 0, 5, 3, 1, (SceneItem *)NULL);
+ }
+ _actor1.setPosition(Common::Point(38, 119));
+ }
+
+ _item2.setDetails(Rect(125, 25, 142, 73), 2430, 15, -1, 14, 1, NULL);
+ _item3.setDetails(Rect(124, 78, 237, 120), 2430, 36, -1, 38, 1, NULL);
+ _item4.setDetails(Rect(250, 3, 265, 133), 2430, 30, 31, 32, 1, NULL);
+ _item5.setDetails(Rect(91, 117, 203, 140), 2430, 9, -1, 11, 1, NULL);
+ _item6.setDetails(Rect(48, 78, 103, 112), 2430, 6, -1, -1, 1, NULL);
+ _item7.setDetails(Rect(48, 31, 73, 52), 2430, 33, -1, 18, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 320, 200), 2430, 0, -1, -1, 1, NULL);
+
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2440;
+ Common::Point pt(210, 150);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else {
+ R2_GLOBALS._player.setPosition(Common::Point(210, 150));
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.enableControl();
+ }
+}
+
+void Scene2440::remove() {
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene2440::signal() {
+ switch (_sceneMode) {
+ case 11:
+ g_globals->_sceneManager.changeScene(2000);
+ break;
+ case 2440:
+ _actor2.remove();
+ R2_INVENTORY.setObjectScene(49, 2);
+ // No break on purpose
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2445 - Ice Maze:
+ *
+ *--------------------------------------------------------------------------*/
+void Scene2445::postInit(SceneObjectList *OwnerList) {
+ loadScene(2445);
+ SceneExt::postInit();
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.setVisage(10);
+ R2_GLOBALS._player.setPosition(Common::Point(160, 140));
+ R2_GLOBALS._player.disableControl();
+}
+
+void Scene2445::signal() {
+ R2_GLOBALS._player.enableControl();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2450 - Ice Maze: Another bedroom
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene2450::Actor2::startAction(CursorType action, Event &event) {
+ Scene2450 *scene = (Scene2450 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == 1)) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2452;
+ scene->setAction(&scene->_sequenceManager, scene, 2452, &R2_GLOBALS._player, &scene->_actor2, NULL);
+ return true;
+ }
+ return SceneActor::startAction(action, event);
+}
+
+bool Scene2450::Actor3::startAction(CursorType action, Event &event) {
+ Scene2450 *scene = (Scene2450 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_TALK) {
+ R2_GLOBALS._player.disableControl();
+ if (R2_GLOBALS._v565AE < 3) {
+ ++R2_GLOBALS._v565AE;
+ scene->_sceneMode = 20;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ if (R2_GLOBALS._player._characterIndex == 1)
+ scene->_stripManager.start(699 + (R2_GLOBALS._v565AE * 2), scene);
+ else
+ scene->_stripManager.start(700 + (R2_GLOBALS._v565AE * 2), scene);
+ }
+ return true;} else {
+ return SceneActor::startAction(action, event);
+ }
+}
+
+void Scene2450::Exit1::changeScene() {
+ Scene2450 *scene = (Scene2450 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((R2_GLOBALS._player._characterIndex == 2) || (R2_GLOBALS.getFlag(61))) {
+ _enabled = false;
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 10;
+ Common::Point pt(-10, 180);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ } else {
+ _moving = false;
+ SceneItem::display(2450, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ Common::Point pt(60, 140);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, NULL);
+ }
+}
+
+void Scene2450::postInit(SceneObjectList *OwnerList) {
+ loadScene(2450);
+ SceneExt::postInit();
+ R2_GLOBALS._sound1.play(200);
+ if (R2_GLOBALS._sceneManager._previousScene == -1) {
+ R2_GLOBALS._sceneManager._previousScene = 1900;
+ R2_GLOBALS._player._oldCharacterScene[1] = 1900;
+ R2_GLOBALS._player._oldCharacterScene[2] = 1900;
+ }
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_seekerSpeaker);
+ _stripManager.addSpeaker(&_caretakerSpeaker);
+
+ if (R2_GLOBALS.getFlag(72)) {
+ _exit1.setDetails(Rect(0, 143, 47, 168), EXITCURSOR_SW, 2000);
+ _exit1.setDest(Common::Point(10, 160));
+ }
+
+ if (!R2_GLOBALS.getFlag(61)) {
+ _actor2.postInit();
+ _actor2.setVisage(2009);
+ _actor2.setPosition(Common::Point(190, 119));
+ _actor2.fixPriority(50);
+ _actor2.setDetails(2450, 0, -1, -1, 1, (SceneItem *)NULL);
+ }
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.disableControl();
+ switch (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex]) {
+ case 1900:
+ R2_GLOBALS._v565AE = 0;
+ R2_GLOBALS._player._characterScene[1] = 2450;
+ R2_GLOBALS._player._characterScene[2] = 2450;
+ R2_GLOBALS._player._oldCharacterScene[1] = 2450;
+ R2_GLOBALS._player._oldCharacterScene[2] = 2450;
+ R2_GLOBALS._player.setup(2450, 1, 1);
+ R2_GLOBALS._player.setPosition(Common::Point(126, 101));
+ setAction(&_sequenceManager, this, 2450, &R2_GLOBALS._player, NULL);
+ break;
+ case 2000:
+ _sceneMode = 2451;
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ if (R2_GLOBALS._player._characterScene[2] == 2450) {
+ _actor1.postInit();
+ _actor1.setup(20, 6, 1);
+ _actor1.setPosition(Common::Point(240, 120));
+ _actor1.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
+ }
+ setAction(&_sequenceManager, this, 2451, &R2_GLOBALS._player, NULL);
+ } else {
+ R2_GLOBALS._player._oldCharacterScene[2] = 2450;
+ R2_GLOBALS._player._characterScene[2] = 2450;
+ if (R2_GLOBALS._player._characterScene[1] == 2450) {
+ _actor1.postInit();
+ if (R2_GLOBALS.getFlag(61))
+ _actor1.setup(2008, 6, 1);
+ else
+ _actor1.setup(10, 6, 1);
+ _actor1.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
+ _actor1.setPosition(Common::Point(106, 111));
+ }
+ setAction(&_sequenceManager, this, 2456, &R2_GLOBALS._player, NULL);
+ }
+ break;
+ case 2450:
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ R2_GLOBALS._player.postInit();
+ if (R2_GLOBALS.getFlag(61)) {
+ R2_GLOBALS._player.setup(2008, 6, 1);
+ } else {
+ R2_GLOBALS._player.setup(10, 6, 1);
+ }
+ R2_GLOBALS._player.setPosition(Common::Point(106, 111));
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ if (R2_GLOBALS.getFlag(72)) {
+ if (R2_GLOBALS._player._characterScene[2] == 2450) {
+ _actor1.postInit();
+ _actor1.setup(20, 6, 1);
+ _actor1.setPosition(Common::Point(240, 120));
+ _actor1.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
+ }
+ } else {
+ _actor1.postInit();
+ _actor1.setup(20, 8, 1);
+ _actor1.setPosition(Common::Point(93, 158));
+ _actor1.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
+
+ _actor3.postInit();
+ _actor3.setup(2001, 7, 1);
+ _actor3.setPosition(Common::Point(34, 153));
+ _actor3.setDetails(2001, 40, -1, -1, 1, (SceneItem *)NULL);
+
+ _exit1._enabled = false;
+ }
+ } else {
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.setup(20, 8, 1);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.setPosition(Common::Point(93, 158));
+ if (R2_GLOBALS.getFlag(72)) {
+ if (R2_GLOBALS._player._characterScene[1] == 2450) {
+ _actor1.postInit();
+ if (R2_GLOBALS.getFlag(61)) {
+ _actor1.setup(2008, 6, 1);
+ } else {
+ _actor1.setup(10, 6, 1);
+ }
+ _actor1.setPosition(Common::Point(106, 111));
+ _actor1.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
+ }
+ } else {
+ _actor1.postInit();
+ if (R2_GLOBALS.getFlag(61)) {
+ _actor1.setup(2008, 6, 1);
+ } else {
+ _actor1.setup(10, 6, 1);
+ }
+ _actor1.setPosition(Common::Point(106, 111));
+ _actor1.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
+
+ _actor3.postInit();
+ _actor3.setup(2001, 7, 1);
+ _actor3.setPosition(Common::Point(34, 153));
+ _actor3.setDetails(2001, 40, -1, -1, 1, (SceneItem *)NULL);
+
+ _exit1._enabled = false;
+ }
+ }
+ R2_GLOBALS._player.enableControl();
+ if (!R2_GLOBALS.getFlag(72)) {
+ R2_GLOBALS._player._canWalk = false;
+ }
+ break;
+ default:
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ if (R2_GLOBALS.getFlag(61)) {
+ R2_GLOBALS._player.setup(2008, 3, 1);
+ } else {
+ R2_GLOBALS._player.setup(10, 3, 1);
+ }
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ } else {
+ R2_GLOBALS._player.setVisage(20);
+ R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
+ }
+ R2_GLOBALS._player.setPosition(Common::Point(100, 130));
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+ _item2.setDetails(Rect(174, 4, 199, 123), 2430, 30, 31, 32, 1, NULL);
+ _item3.setDetails(Rect(67, 73, 207, 121), 2430, 36, -1, 38, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 320, 200), 2430, 0, -1, -1, 1, NULL);
+}
+
+void Scene2450::remove() {
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene2450::signal() {
+ switch (_sceneMode) {
+ case 10:
+ g_globals->_sceneManager.changeScene(2000);
+ break;
+ case 20:
+ if (R2_GLOBALS._v565AE == 3) {
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._v565AE = 4;
+ _sceneMode = 2454;
+ setAction(&_sequenceManager, this, 2454, &_actor3, NULL);
+ } else {
+ R2_GLOBALS._player.enableControl(CURSOR_TALK);
+ if (R2_GLOBALS._v565AE < 4)
+ R2_GLOBALS._player._canWalk = false;
+ }
+ break;
+ case 30:
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 2455;
+ setAction(&_sequenceManager, this, 2455, &_actor1, NULL);
+ break;
+ case 31:
+ R2_GLOBALS.setFlag(61);
+ g_globals->_sceneManager.changeScene(2435);
+ break;
+ case 2451:
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 2452:
+ R2_GLOBALS.setFlag(61);
+ _actor2.remove();
+ R2_GLOBALS._player.enableControl();
+ if (!R2_GLOBALS.getFlag(72)) {
+ R2_GLOBALS._player.setStrip(6);
+ R2_GLOBALS._player._canWalk = false;
+ }
+ break;
+ case 2453:
+ _sceneMode = 20;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(700, this);
+ break;
+ case 2454:
+ _exit1._enabled = true;
+ R2_GLOBALS.setFlag(72);
+ _actor3.remove();
+ if (R2_GLOBALS.getFlag(61)) {
+ g_globals->_sceneManager.changeScene(2435);
+ } else {
+ _sceneMode = 31;
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ setAction(&_sequenceManager, this, 2452, &R2_GLOBALS._player, NULL);
+ } else {
+ setAction(&_sequenceManager, this, 2452, &_actor1, &_actor2, NULL);
+ }
+ }
+ break;
+ case 2455:
+ R2_GLOBALS._player._oldCharacterScene[2] = 2450;
+ R2_GLOBALS._player._characterScene[2] = 2000;
+ R2_GLOBALS._v56605[2] = 3;
+ _actor1.remove();
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ break;
+ default:
+ _actor1.postInit();
+ _actor1.setDetails(9002, 0, 4, 3, 2, (SceneItem *)NULL);
+ _actor3.postInit();
+ _actor3.setDetails(2001, 40, -1, -1, 2, (SceneItem *)NULL);
+ _sceneMode = 2453;
+ setAction(&_sequenceManager, this, 2453, &_actor3, &_actor1, NULL);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2455 - Ice Maze: Inside crevasse
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene2455::Actor1::startAction(CursorType action, Event &event) {
+ Scene2455 *scene = (Scene2455 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action == R2_GLASS_DOME) {
+ if ((R2_INVENTORY.getObjectScene(49) == 2455) || (R2_INVENTORY.getObjectScene(50) == 2455)) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2458;
+ scene->_actor2._lookLineNum = 9;
+ scene->_actor1.remove();
+ scene->_actor3.postInit();
+ scene->_actor3.setDetails(2455, 16, 1, -1, 2, (SceneItem *)NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 2458, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor3, NULL);
+ return true;
+ }
+ }
+
+ return SceneActor::startAction(action, event);
+}
+
+bool Scene2455::Actor2::startAction(CursorType action, Event &event) {
+ Scene2455 *scene = (Scene2455 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case R2_ALCOHOL_LAMP_2:
+ if (R2_INVENTORY.getObjectScene(50) != 2455) {
+ R2_GLOBALS._player.disableControl();
+ scene->_actor1.postInit();
+ scene->_actor1.setup(2456, 3, 3);
+ scene->_actor1.setPosition(Common::Point(162, 165));
+ scene->_actor1.setDetails(2455, 15, 1, -1, 2, (SceneItem *)NULL);
+ scene->_sceneMode = 11;
+ scene->setAction(&scene->_sequenceManager, scene, 2457, &R2_GLOBALS._player, &scene->_actor2, NULL);
+ return true;
+ }
+ break;
+ case R2_ALCOHOL_LAMP_3:
+ if (R2_INVENTORY.getObjectScene(49) != 2455) {
+ R2_GLOBALS._player.disableControl();
+ scene->_actor1.postInit();
+ scene->_actor1.setup(2456, 3, 3);
+ scene->_actor1.setPosition(Common::Point(162, 165));
+ scene->_actor1.setDetails(2455, 15, 1, -1, 2, (SceneItem *)NULL);
+ scene->_sceneMode = 12;
+ scene->setAction(&scene->_sequenceManager, scene, 2457, &R2_GLOBALS._player, &scene->_actor2, NULL);
+ return true;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return SceneActor::startAction(action, event);
+}
+
+bool Scene2455::Actor3::startAction(CursorType action, Event &event) {
+ Scene2455 *scene = (Scene2455 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2459;
+ scene->setAction(&scene->_sequenceManager, scene, 2459, &R2_GLOBALS._player, &scene->_actor3, NULL);
+ return true;
+ }
+
+ return SceneActor::startAction(action, event);
+}
+
+void Scene2455::Exit1::changeScene() {
+ Scene2455 *scene = (Scene2455 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2461;
+ scene->setAction(&scene->_sequenceManager, scene, 2461, &R2_GLOBALS._player, NULL);
+}
+
+void Scene2455::postInit(SceneObjectList *OwnerList) {
+ loadScene(2455);
+ SceneExt::postInit();
+
+ if (R2_GLOBALS._sceneManager._previousScene == -1) {
+ R2_INVENTORY.setObjectScene(29, 2);
+ R2_INVENTORY.setObjectScene(50, 2);
+ }
+
+ R2_GLOBALS._sound1.play(200);
+ _exit1.setDetails(Rect(0, 0, 320, 15), EXITCURSOR_N, 2425);
+
+ if (R2_INVENTORY.getObjectScene(29) == 2455) {
+ if ((R2_INVENTORY.getObjectScene(50) == 2455) || (R2_INVENTORY.getObjectScene(49) == 2455)) {
+ _actor1.postInit();
+ _actor1.setup(2456, 3, 3);
+ _actor1.setPosition(Common::Point(162, 165));
+ _actor1.setDetails(2455, 15, 1, -1, 1, (SceneItem *)NULL);
+ }
+ } else {
+ _actor3.postInit();
+ _actor3.setup(2456, 3, 1);
+ _actor3.setPosition(Common::Point(176, 165));
+ _actor3.setDetails(2455, 16, 1, -1, 1, (SceneItem *)NULL);
+ }
+
+ _actor2.postInit();
+ if (R2_INVENTORY.getObjectScene(29) == 2455) {
+ _actor2.setup(2456, 3, 2);
+ _actor2.setDetails(2455, 9, 1, -1, 1, (SceneItem *)NULL);
+ } else {
+ if ((R2_INVENTORY.getObjectScene(50) != 2455) && (R2_INVENTORY.getObjectScene(49) != 2455))
+ _actor2.setup(2455, 1, 1);
+ else
+ _actor2.setup(2456, 1, 1);
+ _actor2.setDetails(2455, 3, 1, -1, 1, (SceneItem *)NULL);
+ }
+ _actor2.setPosition(Common::Point(162, 165));
+ _actor2.fixPriority(20);
+ if (R2_INVENTORY.getObjectScene(29) != 2455)
+ _actor2.animate(ANIM_MODE_2, NULL);
+
+ R2_GLOBALS._player.postInit();
+ _item1.setDetails(Rect(0, 0, 320, 200), 2455, 0, 1, -1, 1, NULL);
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2425) {
+ _sceneMode = 2460;
+ setAction(&_sequenceManager, this, 2460, &R2_GLOBALS._player, NULL);
+ } else {
+ R2_GLOBALS._player.setup(2455, 2, 9);
+ R2_GLOBALS._player.setPosition(Common::Point(118, 165));
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+ }
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2455;
+}
+
+void Scene2455::remove() {
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene2455::signal() {
+ switch (_sceneMode) {
+ case 10:
+ // No break on purpose
+ case 2461:
+ g_globals->_sceneManager.changeScene(2425);
+ break;
+ case 11:
+ R2_INVENTORY.setObjectScene(49, 2455);
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ case 12:
+ R2_INVENTORY.setObjectScene(50, 2455);
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ case 2458:
+ R2_INVENTORY.setObjectScene(29, 2455);
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ case 2459:
+ _actor3.remove();
+ R2_INVENTORY.setObjectScene(31, 2);
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ default:
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2500 - Ice Maze: Large Cave
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene2500::Exit1::changeScene() {
+ Scene2500 *scene = (Scene2500 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 11;
+
+ Common::Point pt(20, 105);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene2500::postInit(SceneObjectList *OwnerList) {
+ loadScene(2500);
+ SceneExt::postInit();
+
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 3100)
+ R2_GLOBALS._uiElements._active = false;
+
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_seekerSpeaker);
+ _stripManager.addSpeaker(&_mirandaSpeaker);
+ _stripManager.addSpeaker(&_webbsterSpeaker);
+
+ if (R2_GLOBALS._sceneManager._previousScene == -1)
+ R2_GLOBALS._sceneManager._previousScene = 2000;
+
+ _exit1.setDetails(Rect(30, 50, 85, 105), EXITCURSOR_W, 2000);
+ _exit1.setDest(Common::Point(84, 104));
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ R2_GLOBALS._player.setVisage(11);
+ R2_GLOBALS._player._moveDiff = Common::Point(2, 1);
+ } else {
+ R2_GLOBALS._player.setVisage(21);
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ }
+
+ if (R2_GLOBALS._player._characterScene[1] == R2_GLOBALS._player._characterScene[2]) {
+ _actor1.postInit();
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ _actor1.setup(21, 3, 1);
+ _actor1.setDetails(9002, 1, -1, -1, 1, (SceneItem *)NULL);
+ } else {
+ _actor1.setup(2008, 3, 1);
+ _actor1.changeZoom(50);
+ _actor1.setDetails(9001, 0, -1, -1, 1, (SceneItem *)NULL);
+ }
+ _actor1.setPosition(Common::Point(141, 94));
+ }
+
+ _item1.setDetails(Rect(0, 0, 320, 200), 2430, 0, -1, -1, 1, NULL);
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
+ _sceneMode = 10;
+ R2_GLOBALS._player.setPosition(Common::Point(20, 105));
+ Common::Point pt(95, 105);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 3100) {
+ _sceneMode = 2500;
+ _actor2.postInit();
+ _actor3.postInit();
+ setAction(&_sequenceManager, this, 2500, &R2_GLOBALS._player, &_actor2, &_actor3, NULL);
+ } else {
+ R2_GLOBALS._player.setPosition(Common::Point(160, 150));
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.enableControl();
+ }
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2500;
+}
+
+void Scene2500::signal() {
+ switch (_sceneMode) {
+ case 11:
+ g_globals->_sceneManager.changeScene(2000);
+ break;
+ case 20:
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 2501;
+ setAction(&_sequenceManager, this, 2501, &R2_GLOBALS._player, &_actor2, &_actor3, NULL);
+ break;
+ case 2500:
+ _sceneMode = 20;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(900, this);
+ break;
+ case 2501:
+ g_globals->_sceneManager.changeScene(1000);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2525 - Furnace room
+ *
+ *--------------------------------------------------------------------------*/
+bool Scene2525::Item5::startAction(CursorType action, Event &event) {
+ Scene2525 *scene = (Scene2525 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action == R2_REBREATHER_TANK) && (!R2_GLOBALS.getFlag(74))) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2526;
+ scene->setAction(&scene->_sequenceManager, scene, 2526, &R2_GLOBALS._player, NULL);
+ return true;
+ }
+
+ return SceneItem::startAction(action, event);
+}
+
+bool Scene2525::Actor3::startAction(CursorType action, Event &event) {
+ Scene2525 *scene = (Scene2525 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ if (R2_GLOBALS._player._characterIndex == 2) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2525;
+ scene->setAction(&scene->_sequenceManager, scene, 2525, &R2_GLOBALS._player, &scene->_actor3, NULL);
+ } else {
+ SceneItem::display(2530, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ }
+ return true;
+}
+
+void Scene2525::Exit1::changeScene() {
+ Scene2525 *scene = (Scene2525 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 11;
+
+ Common::Point pt(R2_GLOBALS._player._position.x, 200);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene2525::postInit(SceneObjectList *OwnerList) {
+ loadScene(2525);
+ SceneExt::postInit();
+ R2_GLOBALS._sound1.play(200);
+ R2_GLOBALS._sound2.play(207);
+
+ _exit1.setDetails(Rect(86, 155, 228, 168), EXITCURSOR_S, 2000);
+
+ if (R2_INVENTORY.getObjectScene(29) == 2525) {
+ _actor3.postInit();
+ _actor3.setup(2435, 1, 2);
+ _actor3.setPosition(Common::Point(78, 155));
+ _actor3.fixPriority(155);
+ _actor3.setDetails(2525, 27, -1, -1, 1, (SceneItem *)NULL);
+ }
+
+ _actor2.postInit();
+ _actor2.setup(2525, 1, 1);
+ _actor2.setPosition(Common::Point(183, 114));
+ _actor2.setDetails(2525, 15, -1, -1, 1, (SceneItem *)NULL);
+ _actor2.animate(ANIM_MODE_2, NULL);
+ _actor2._numFrames = 3;
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ R2_GLOBALS._player.setup(2008, 3, 1);
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ } else {
+ R2_GLOBALS._player.setup(20, 3, 1);
+ R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
+ }
+
+ if (R2_GLOBALS._player._characterScene[1] == R2_GLOBALS._player._characterScene[2]) {
+ _actor1.postInit();
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ _actor1.setup(20, 5, 1);
+ _actor1.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
+ } else {
+ _actor1.setup(2008, 5, 1);
+ _actor1.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
+ }
+ _actor1.setPosition(Common::Point(209, 162));
+
+ R2_GLOBALS._walkRegions.enableRegion(4);
+ }
+
+ _item5.setDetails(Rect(125, 73, 140, 86), 2525, 6, -1, -1, 1, NULL);
+ _item3.setDetails(Rect(137, 11, 163, 72), 2525, 12, -1, -1, 1, NULL);
+ _item4.setDetails(Rect(204, 20, 234, 78), 2525, 12, -1, -1, 1, NULL);
+ _item2.setDetails(Rect(102, 62, 230, 134), 2525, 0, -1, -1, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 320, 200), 2525, 24, -1, -1, 1, NULL);
+
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2525;
+ R2_GLOBALS._player.setPosition(Common::Point(160, 200));
+ Common::Point pt(160, 150);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else {
+ R2_GLOBALS._player.setPosition(Common::Point(160, 150));
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.enableControl();
+ }
+}
+
+void Scene2525::remove() {
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ R2_GLOBALS._sound2.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene2525::signal() {
+ switch (_sceneMode) {
+ case 11:
+ g_globals->_sceneManager.changeScene(2000);
+ break;
+ case 2525:
+ _actor3.remove();
+ R2_INVENTORY.setObjectScene(29, 2);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 2526:
+ R2_GLOBALS.setFlag(74);
+ R2_GLOBALS._player.enableControl();
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2530 - Ice Maze: Well
+ *
+ *--------------------------------------------------------------------------*/
+bool Scene2530::Actor2::startAction(CursorType action, Event &event) {
+ Scene2530 *scene = (Scene2530 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ if (R2_GLOBALS._player._characterIndex == 2) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2530;
+ scene->setAction(&scene->_sequenceManager, scene, 2530, &R2_GLOBALS._player, &scene->_actor2, NULL);
+ } else {
+ SceneItem::display(2530, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ }
+
+ return true;
+}
+
+bool Scene2530::Actor3::startAction(CursorType action, Event &event) {
+ Scene2530 *scene = (Scene2530 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ if (R2_GLOBALS.getFlag(73))
+ SceneItem::display(2530, 35, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ else {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2532;
+ scene->setAction(&scene->_sequenceManager, scene, 2532, &R2_GLOBALS._player, &scene->_actor3, NULL);
+ }
+ } else {
+ if (R2_GLOBALS.getFlag(73)) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2533;
+ scene->setAction(&scene->_sequenceManager, scene, 2533, &R2_GLOBALS._player, &scene->_actor3, NULL);
+ } else {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2531;
+ scene->setAction(&scene->_sequenceManager, scene, 2531, &R2_GLOBALS._player, &scene->_actor3, NULL);
+ }
+ }
+
+ return true;
+}
+
+void Scene2530::Exit1::changeScene() {
+ Scene2530 *scene = (Scene2530 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 11;
+
+ Common::Point pt(108, 200);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene2530::postInit(SceneObjectList *OwnerList) {
+ loadScene(2530);
+ SceneExt::postInit();
+
+ _exit1.setDetails(Rect(68, 155, 147, 168), EXITCURSOR_S, 2000);
+ _exit1.setDest(Common::Point(108, 160));
+
+ if (R2_INVENTORY.getObjectScene(33) == 2530) {
+ _actor2.postInit();
+ _actor2.setup(2435, 1, 3);
+ _actor2.setPosition(Common::Point(299, 80));
+ _actor2.fixPriority(80);
+ _actor2.setDetails(2530, 28, -1, -1, 1, (SceneItem *)NULL);
+ }
+
+ _actor3.postInit();
+ if (R2_GLOBALS.getFlag(73)) {
+ _actor3.setup(2531, 4, 2);
+ _actor3.setPosition(Common::Point(154, 130));
+ } else {
+ _actor3.setup(2531, 4, 1);
+ _actor3.setPosition(Common::Point(173, 131));
+ }
+ _actor3.setDetails(2530, 22, -1, -1, 1, (SceneItem *)NULL);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ R2_GLOBALS._player.setVisage(2008);
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ } else {
+ R2_GLOBALS._player.setVisage(20);
+ R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
+ }
+ R2_GLOBALS._player.setPosition(Common::Point(100, 200));
+
+ if (R2_GLOBALS._player._characterScene[1] == R2_GLOBALS._player._characterScene[2]) {
+ _actor1.postInit();
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ _actor1.setup(20, 5, 1);
+ _actor1.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
+ } else {
+ _actor1.setup(2008, 5, 1);
+ _actor1.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
+ }
+ _actor1.setPosition(Common::Point(20, 130));
+ R2_GLOBALS._walkRegions.enableRegion(1);
+ }
+
+ _item2.setDetails(Rect(108, 90, 135, 205), 2530, 22, -1, -1, 1, NULL);
+ _item5.setDetails(Rect(115, 112, 206, 130), 2530, 25, -1, 27, 1, NULL);
+ _item3.setDetails(Rect(256, 64, 311, 85), 2530, 31, -1, 33, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 320, 200), 2530, 0, 1, -1, 1, NULL);
+
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2530;
+ Common::Point pt(108, 150);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else {
+ R2_GLOBALS._player.setPosition(Common::Point(105, 145));
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.enableControl();
+ }
+}
+
+void Scene2530::signal() {
+ switch (_sceneMode) {
+ case 11:
+ g_globals->_sceneManager.changeScene(2000);
+ break;
+ case 2530:
+ R2_INVENTORY.setObjectScene(33, 2);
+ _actor2.remove();
+ break;
+ case 2531:
+ // No break on purpose
+ case 2532:
+ R2_GLOBALS.setFlag(73);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 2533:
+ R2_GLOBALS.clearFlag(73);
+ R2_GLOBALS._player.enableControl();
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2535 - Ice Maze: Tannery
+ *
+ *--------------------------------------------------------------------------*/
+
+bool Scene2535::Actor3::startAction(CursorType action, Event &event) {
+ Scene2535 *scene = (Scene2535 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ R2_GLOBALS._player.disableControl();
+ if (R2_INVENTORY.getObjectScene(20) == 2535) {
+ scene->_sceneMode = 2536;
+ scene->setAction(&scene->_sequenceManager, scene, 2536, &R2_GLOBALS._player, &scene->_actor3, NULL);
+ } else {
+ scene->_sceneMode = 2537;
+ scene->setAction(&scene->_sequenceManager, scene, 2537, &R2_GLOBALS._player, &scene->_actor3, NULL);
+ }
+ } else {
+ SceneItem::display(2530, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ }
+
+ return true;
+}
+
+bool Scene2535::Actor4::startAction(CursorType action, Event &event) {
+ Scene2535 *scene = (Scene2535 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ if (R2_GLOBALS._player._characterIndex == 2) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2535;
+ scene->setAction(&scene->_sequenceManager, scene, 2535, &R2_GLOBALS._player, &scene->_actor4, NULL);
+ } else {
+ SceneItem::display(2530, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ }
+
+ return true;
+}
+
+void Scene2535::Exit1::changeScene() {
+ Scene2535 *scene = (Scene2535 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 11;
+ Common::Point pt(210, 200);
+ PlayerMover *mover = new PlayerMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene2535::postInit(SceneObjectList *OwnerList) {
+ loadScene(2535);
+ SceneExt::postInit();
+ if (R2_GLOBALS._sceneManager._previousScene == -1) {
+ R2_GLOBALS.setFlag(73);
+ R2_INVENTORY.setObjectScene(20, 2535);
+ }
+ _exit1.setDetails(Rect(172, 155, 250, 167), EXITCURSOR_S, 2000);
+ _exit1.setDest(Common::Point(210, 160));
+
+ if (R2_INVENTORY.getObjectScene(32) == 2535) {
+ _actor4.postInit();
+ _actor4.setup(2435, 1, 4);
+ _actor4.setPosition(Common::Point(47, 74));
+ _actor4.fixPriority(74);
+ _actor4.setDetails(2535, 21, -1, -1, 1, (SceneItem *)NULL);
+ }
+
+ if (R2_INVENTORY.getObjectScene(20) == 2535) {
+ _actor3.postInit();
+ _actor3.setup(2535, 3, 1);
+ _actor3.setPosition(Common::Point(203, 131));
+ _actor3.setDetails(3, 20, -1, -1, 1, (SceneItem *)NULL);
+ R2_GLOBALS._walkRegions.enableRegion(6);
+ }
+
+ if ((R2_INVENTORY.getObjectScene(20) == 0) && (R2_GLOBALS.getFlag(73))) {
+ _actor3.postInit();
+ _actor3.setup(2536, 1, 2);
+ _actor3.setPosition(Common::Point(164, 133));
+ _actor3.setDetails(3, 20, -1, -1, 1, (SceneItem *)NULL);
+ }
+
+ if (R2_GLOBALS.getFlag(73)) {
+ _actor2.postInit();
+ _actor2.setup(2536, 1, 1);
+ _actor2.setPosition(Common::Point(160, 130));
+ _actor2.fixPriority(122);
+ _actor2.setDetails(2535, 37, -1, -1, 1, (SceneItem *)NULL);
+ }
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ R2_GLOBALS._player.setVisage(2008);
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ } else {
+ R2_GLOBALS._player.setVisage(20);
+ R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
+ }
+ R2_GLOBALS._player.setPosition(Common::Point(210, 200));
+
+ if (R2_GLOBALS._player._characterScene[1] == R2_GLOBALS._player._characterScene[2]) {
+ _actor1.postInit();
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ _actor1.setup(20, 5, 1);
+ _actor1.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
+ } else {
+ _actor1.setup(2008, 5, 1);
+ _actor1.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
+ }
+ _actor1.setPosition(Common::Point(245, 115));
+ R2_GLOBALS._walkRegions.enableRegion(2);
+ }
+
+ _item2.setDetails(Rect(96, 3, 215, 33), 2535, 3, 6, 5, 1, NULL);
+ _item3.setDetails(Rect(4, 43, 40, 101), 2535, 6, 7, 8, 1, NULL);
+ _item4.setDetails(Rect(55, 13, 140, 89), 2535, 6, 7, 8, 1, NULL);
+ _item5.setDetails(Rect(144, 23, 216, 76), 2535, 6, 7, 8, 1, NULL);
+ _item6.setDetails(Rect(227, 8, 307, 99), 2535, 6, 7, 8, 1, NULL);
+ _item7.setDetails(Rect(116, 111, 201, 132), 2535, 18, 19, 20, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 320, 200), 2535, 0, 1, -1, 1, NULL);
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
+ R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2535;
+ Common::Point pt(210, 150);
+ PlayerMover *mover = new PlayerMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else {
+ R2_GLOBALS._player.setPosition(Common::Point(210, 150));
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.enableControl();
+ }
+}
+
+void Scene2535::signal() {
+ switch (_sceneMode) {
+ case 11:
+ g_globals->_sceneManager.changeScene(2000);
+ break;
+ case 2535:
+ R2_INVENTORY.setObjectScene(32, 2);
+ _actor4.remove();
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 2536:
+ R2_INVENTORY.setObjectScene(20, 0);
+ R2_GLOBALS._walkRegions.disableRegion(6);
+ if (!R2_GLOBALS.getFlag(73)) {
+ _actor3.remove();
+ R2_GLOBALS._player.enableControl();
+ } else {
+ _sceneMode = 20;
+ _actor3.show();
+ _actor3.setup(2536, 1, 2);
+ _actor3.setDetails(3, 20, -1, -1, 3, (SceneItem *)NULL);
+ _actor3.setPosition(Common::Point(164, 150));
+ _actor3.fixPriority(130);
+ _actor3._moveDiff.y = 1;
+ Common::Point pt(164, 133);
+ PlayerMover *mover = new PlayerMover();
+ _actor3.addMover(mover, &pt, this);
+ }
+ break;
+ case 2537:
+ _actor3.remove();
+ R2_INVENTORY.setObjectScene(20, 1);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 20:
+ // No break on purpose
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2600 - Ice Maze: Exit
+ *
+ *--------------------------------------------------------------------------*/
+Scene2600::Scene2600(): SceneExt() {
+ _rotation = NULL;
+}
+
+void Scene2600::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ SYNC_POINTER(_rotation);
+}
+
+void Scene2600::postInit(SceneObjectList *OwnerList) {
+ loadScene(2600);
+ R2_GLOBALS._uiElements._active = false;
+ SceneExt::postInit();
+ R2_GLOBALS._sound1.fadeSound(214);
+ R2_GLOBALS._sound2.play(215);
+ _rotation = R2_GLOBALS._scenePalette.addRotation(176, 191, 1);
+ _rotation->setDelay(3);
+ _rotation->_countdown = 1;
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 2600;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2600, &R2_GLOBALS._player, NULL);
+}
+
+void Scene2600::remove() {
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ R2_GLOBALS._sound2.fadeOut2(NULL);
+// _rotation->remove();
+ SceneExt::remove();
+}
+
+void Scene2600::signal() {
+ if (_sceneMode == 2600)
+ g_globals->_sceneManager.changeScene(3800);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2700 - Forest Maze
+ *
+ *--------------------------------------------------------------------------*/
+Scene2700::Scene2700(): SceneExt() {
+ _field412 = _field414 = _field416 = 0;
+}
+
+void Scene2700::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field412);
+ s.syncAsSint16LE(_field414);
+ s.syncAsSint16LE(_field416);
+}
+
+void Scene2700::Action1::signal() {
+ Scene2700 *scene = (Scene2700 *)R2_GLOBALS._sceneManager._scene;
+
+ setDelay(600 + R2_GLOBALS._randomSource.getRandomNumber(300));
+ scene->_actor2.animate(ANIM_MODE_5, NULL);
+}
+
+void Scene2700::Action2::signal() {
+ Scene2700 *scene = (Scene2700 *)R2_GLOBALS._sceneManager._scene;
+
+ setDelay(300 + R2_GLOBALS._randomSource.getRandomNumber(300));
+ scene->_actor3.animate(ANIM_MODE_5, NULL);
+}
+
+void Scene2700::Action3::signal() {
+ Scene2700 *scene = (Scene2700 *)R2_GLOBALS._sceneManager._scene;
+
+ setDelay(450 + R2_GLOBALS._randomSource.getRandomNumber(450));
+ scene->_actor4.animate(ANIM_MODE_8, 1, NULL);
+}
+
+void Scene2700::Action4::signal() {
+ Scene2700 *scene = (Scene2700 *)R2_GLOBALS._sceneManager._scene;
+
+ setDelay(300 + R2_GLOBALS._randomSource.getRandomNumber(300));
+ scene->_actor5.animate(ANIM_MODE_8, 1, NULL);
+}
+
+void Scene2700::Area1::process(Event &event) {
+ SceneArea::process(event);
+ if ((event.eventType == 1) && (R2_GLOBALS._player._canWalk) && (_bounds.contains(event.mousePos))) {
+ Scene2700 *scene = (Scene2700 *)R2_GLOBALS._sceneManager._scene;
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 10;
+ scene->_field414 = 2703;
+ switch (scene->_field412) {
+ case 0:
+ // No break on purpose
+ case 6:
+ scene->_sceneMode = 2703;
+ scene->setAction(&scene->_sequenceManager, scene, 2703, &R2_GLOBALS._player, NULL);
+ break;
+ case 1: {
+ Common::Point pt(80, 137);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ break;
+ }
+ case 2: {
+ Common::Point pt(155, 137);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ break;
+ }
+ case 3: {
+ Common::Point pt(140, 162);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ break;
+ }
+ case 4: {
+ Common::Point pt(155, 137);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ break;
+ }
+ case 5: {
+ Common::Point pt(235, 132);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+}
+
+void Scene2700::Area2::process(Event &event) {
+ SceneArea::process(event);
+ if ((event.eventType == 1) && (R2_GLOBALS._player._canWalk) && (_bounds.contains(event.mousePos))) {
+ Scene2700 *scene = (Scene2700 *)R2_GLOBALS._sceneManager._scene;
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 10;
+ scene->_field414 = 2704;
+ switch (scene->_field412) {
+ case 0: {
+ Common::Point pt(140, 162);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ break;
+ }
+ case 1: {
+ Common::Point pt(80, 137);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ break;
+ }
+ case 2: {
+ Common::Point pt(155, 137);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ break;
+ }
+ case 3: {
+ Common::Point pt(155, 137);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ break;
+ }
+ case 4: {
+ Common::Point pt(235, 132);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ break;
+ }
+ case 5:
+ scene->_sceneMode = 2704;
+ scene->setAction(&scene->_sequenceManager, scene, 2704, &R2_GLOBALS._player, NULL);
+ break;
+ case 6: {
+ Common::Point pt(140, 162);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+}
+
+void Scene2700::postInit(SceneObjectList *OwnerList) {
+ loadScene(2700);
+ SceneExt::postInit();
+ R2_GLOBALS._sound1.stop();
+ R2_GLOBALS._sound2.stop();
+
+ _area1.setDetails(Rect(135, 160, 185, 168), SHADECURSOR_DOWN);
+ _area2.setDetails(Rect(300, 90, 320, 135), EXITCURSOR_E);
+ _rect1.set(70, 122, 90, 132);
+ _rect2.set(150, 122, 160, 132);
+ _rect3.set(90, 142, 130, 157);
+ _rect4.set(175, 137, 200, 147);
+ _rect5.set(280, 127, 300, 137);
+ _rect6.set(240, 157, 265, 167);
+
+ _actor2.postInit();
+ _actor2.setup(2700, 1, 1);
+ _actor2.setPosition(Common::Point(140, 29));
+ _actor2.setAction(&_action1);
+
+ _actor3.postInit();
+ _actor3.setup(2700, 2, 1);
+ _actor3.setPosition(Common::Point(213, 32));
+ _actor3.setAction(&_action2);
+
+ _actor4.postInit();
+ _actor4.setup(2700, 3, 1);
+ _actor4.setPosition(Common::Point(17, 39));
+ _actor4.setAction(&_action3);
+
+ _actor5.postInit();
+ _actor5.setup(2700, 5, 1);
+ _actor5.setPosition(Common::Point(17, 71));
+ _actor5.setAction(&_action4);
+
+ _item2.setDetails(Rect(52, 38, 68, 60), 2700, 4, -1, 6, 1, NULL);
+ _item3.setDetails(Rect(113, 22, 127, 33), 2700, 4, -1, 6, 1, NULL);
+ _item4.setDetails(Rect(161, 44, 170, 52), 2700, 4, -1, 6, 1, NULL);
+ _item5.setDetails(Rect(221, 19, 233, 31), 2700, 4, -1, 6, 1, NULL);
+ _item6.setDetails(Rect(235, 59, 250, 75), 2700, 4, -1, 6, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 320, 200), 2700, 4, -1, 6, 1, NULL);
+
+ _stripManager.setColors(60, 255);
+ _stripManager.setFontNumber(3);
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_nejSpeaker);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.setVisage(19);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player._moveDiff = Common::Point(2, 2);
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_INVENTORY.getObjectScene(36) == 0)
+ R2_GLOBALS._sound1.changeSound(234);
+
+ if (R2_GLOBALS._sceneManager._previousScene == 2750) {
+ _sceneMode = 2702;
+ _field412 = 5;
+ setAction(&_sequenceManager, this, 2702, &R2_GLOBALS._player, NULL);
+ } else {
+ _field412 = 0;
+ if (R2_GLOBALS._sceneManager._previousScene == 3900) {
+ _sceneMode = 2701;
+ setAction(&_sequenceManager, this, 2701, &R2_GLOBALS._player, NULL);
+ } else {
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.setPosition(Common::Point(164, 160));
+ R2_GLOBALS._player.enableControl();
+ }
+ }
+}
+
+void Scene2700::signal() {
+ switch (_sceneMode) {
+ case 10:
+ switch (_field414) {
+ case 1:
+ switch (_field412) {
+ case 0:
+ case 2:
+ case 4:
+ case 6:
+ _field412 = 3;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2705, &R2_GLOBALS._player, NULL);
+ break;
+ case 3: {
+ _sceneMode = _field414;
+ _field412 = 1;
+ Common::Point pt(80, 127);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 5:
+ _field412 = 4;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2708, &R2_GLOBALS._player, NULL);
+ break;
+ default: // includes case 1
+ break;
+ }
+ break;
+ case 2:
+ switch (_field412) {
+ case 0:
+ case 1:
+ case 6:
+ _field412 = 3;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2706, &R2_GLOBALS._player, NULL);
+ break;
+ case 3:
+ case 4: {
+ _sceneMode = _field414;
+ _field412 = 2;
+ Common::Point pt(155, 127);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 5:
+ _field412 = 4;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2708, &R2_GLOBALS._player, NULL);
+ break;
+ default: // includes case 2
+ break;
+ }
+ break;
+ case 3:
+ switch (_field412) {
+ case 0:
+ case 1:
+ case 2:
+ case 4:
+ case 6: {
+ _sceneMode = _field414;
+ _field412 = 3;
+ Common::Point pt(115, 152);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 5:
+ _field412 = 4;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2708, &R2_GLOBALS._player, NULL);
+ break;
+ default: // includes case 3
+ break;
+ }
+ break;
+ case 4:
+ switch (_field412) {
+ case 0:
+ case 1:
+ case 6:
+ _field412 = 3;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2706, &R2_GLOBALS._player, NULL);
+ break;
+ case 2:
+ case 3:
+ _field412 = 4;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2709, &R2_GLOBALS._player, NULL);
+ break;
+ case 4:
+ case 5:
+ _sceneMode = _field414;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2704, &R2_GLOBALS._player, NULL);
+ break;
+ default:
+ break;
+ }
+ break;
+ case 5:
+ switch (_field412) {
+ case 0:
+ case 1:
+ case 6:
+ _field412 = 3;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2706, &R2_GLOBALS._player, NULL);
+ break;
+ case 2:
+ case 3:
+ _field412 = 4;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2709, &R2_GLOBALS._player, NULL);
+ break;
+ case 4: {
+ _sceneMode = _field414;
+ _field412 = 5;
+ Common::Point pt(285, 132);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ default: // includes case 5
+ break;
+ }
+ break;
+ case 6:
+ switch (_field412) {
+ case 0:
+ case 3: {
+ _sceneMode = _field414;
+ _field412 = 6;
+ Common::Point pt(250, 162);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 1:
+ case 2:
+ case 4:
+ _field412 = 3;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2707, &R2_GLOBALS._player, NULL);
+ break;
+ case 5:
+ _field412 = 4;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2708, &R2_GLOBALS._player, NULL);
+ break;
+ default:
+ break;
+ }
+ break;
+ case 2703:
+ switch (_field412) {
+ case 0:
+ case 3:
+ case 6:
+ _sceneMode = _field414;
+ setAction(&_sequenceManager, this, 2703, &R2_GLOBALS._player, NULL);
+ break;
+ case 1:
+ case 2:
+ case 4:
+ _field412 = 3;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2707, &R2_GLOBALS._player, NULL);
+ break;
+ case 5:
+ _field412 = 4;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2708, &R2_GLOBALS._player, NULL);
+ break;
+ default:
+ break;
+ }
+ break;
+ case 2704:
+ switch (_field412) {
+ case 0:
+ case 1:
+ case 6:
+ _field412 = 3;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2706, &R2_GLOBALS._player, NULL);
+ break;
+ case 2:
+ case 3:
+ _field412 = 4;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2709, &R2_GLOBALS._player, NULL);
+ break;
+ case 4:
+ case 5:
+ _sceneMode = _field414;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2704, &R2_GLOBALS._player, NULL);
+ break;
+ default:
+ break;
+ }
+ break;
+ case 2710:
+ switch (_field412) {
+ case 0:
+ case 1:
+ case 3:
+ _field412 = 3;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2707, &R2_GLOBALS._player, NULL);
+ break;
+ case 2:
+ case 5: {
+ _sceneMode = _field414;
+ Common::Point pt(164, 160);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 4:
+ _field412 = 4;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2708, &R2_GLOBALS._player, NULL);
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ case 11:
+ R2_INVENTORY.setObjectScene(36, 0);
+ R2_GLOBALS._player.disableControl();
+ _field412 = 0;
+ _sceneMode = 2700;
+ setAction(&_sequenceManager, this, 2700, &_actor1, NULL);
+ break;
+ case 12:
+ R2_GLOBALS._sound1.play(234);
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _sceneMode = 2711;
+ _stripManager.start(_field416, this);
+ break;
+ case 13:
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _sceneMode = 2712;
+ _stripManager.start(_field416, this);
+ break;
+ case 14:
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _sceneMode = 2713;
+ _stripManager.start(_field416, this);
+ break;
+ case 15:
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _sceneMode = 11;
+ _stripManager.start(_field416, this);
+ break;
+ case 2700:
+ _actor1.remove();
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ break;
+ case 2703:
+ g_globals->_sceneManager.changeScene(3900);
+ break;
+ case 2704:
+ g_globals->_sceneManager.changeScene(2750);
+ break;
+ case 2710:
+ _field416 = 1200;
+ _sceneMode = 12;
+ _actor1.postInit();
+ setAction(&_sequenceManager, this, 2710, &R2_GLOBALS._player, &_actor1, NULL);
+ break;
+ case 2711:
+ R2_GLOBALS._player.disableControl();
+ _field416 = 1201;
+ _sceneMode = 13;
+ setAction(&_sequenceManager, this, 2711, &R2_GLOBALS._player, &_actor1, NULL);
+ break;
+ case 2712:
+ R2_GLOBALS._player.disableControl();
+ _field416 = 1202;
+ _sceneMode = 14;
+ setAction(&_sequenceManager, this, 2712, &R2_GLOBALS._player, &_actor1, NULL);
+ break;
+ case 2713:
+ R2_GLOBALS._player.disableControl();
+ _field416 = 1203;
+ _sceneMode = 14;
+ setAction(&_sequenceManager, this, 2713, &R2_GLOBALS._player, &_actor1, NULL);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ break;
+ }
+}
+void Scene2700::process(Event &event) {
+ if ((R2_GLOBALS._player._canWalk) && (event.eventType == EVENT_BUTTON_DOWN)) {
+ if (R2_GLOBALS._events.getCursor() == R2_FLUTE) {
+ if (R2_GLOBALS._player._bounds.contains(event.mousePos)) {
+ _sceneMode = 10;
+ _field414 = 2710;
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ switch (_field412) {
+ case 0: {
+ _sceneMode = 2710;
+ Common::Point pt(164, 160);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 1: {
+ Common::Point pt(80, 137);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 2: {
+ Common::Point pt(155, 137);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 3: {
+ Common::Point pt(140, 162);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 4: {
+ Common::Point pt(155, 137);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 5: {
+ Common::Point pt(235, 132);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 6: {
+ Common::Point pt(205, 162);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ default:
+ break;
+ }
+ event.handled = true;
+ } else {
+ SceneItem::display(2700, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ }
+ } else if (R2_GLOBALS._events.getCursor() == R2_NEGATOR_GUN) {
+ if (_rect1.contains(event.mousePos)) {
+ if (!_rect1.contains(R2_GLOBALS._player._position)) {
+ event.handled = true;
+ _sceneMode = 10;
+ _field414 = 1;
+ }
+ } else if (_rect2.contains(event.mousePos)) {
+ if (!_rect2.contains(R2_GLOBALS._player._position)) {
+ event.handled = true;
+ _sceneMode = 10;
+ _field414 = 2;
+ }
+ } else if (_rect3.contains(event.mousePos)) {
+ if (!_rect3.contains(R2_GLOBALS._player._position)) {
+ event.handled = true;
+ _sceneMode = 10;
+ _field414 = 3;
+ }
+ } else if (_rect4.contains(event.mousePos)) {
+ if (!_rect4.contains(R2_GLOBALS._player._position)) {
+ event.handled = true;
+ _sceneMode = 10;
+ _field414 = 4;
+ }
+ } else if (_rect5.contains(event.mousePos)) {
+ if (!_rect5.contains(R2_GLOBALS._player._position)) {
+ event.handled = true;
+ _sceneMode = 10;
+ _field414 = 5;
+ }
+ } else if (_rect6.contains(event.mousePos)) {
+ if (!_rect6.contains(R2_GLOBALS._player._position)) {
+ event.handled = true;
+ _sceneMode = 10;
+ _field414 = 6;
+ }
+ } else {
+ event.handled = true;
+ R2_GLOBALS._player.updateAngle(Common::Point(event.mousePos.x, event.mousePos.y));
+ }
+ if (_sceneMode == 10) {
+ R2_GLOBALS._player.disableControl();
+ switch (_field412) {
+ case 0:
+ if (_field414 >= 6) {
+ Common::Point pt(205, 162);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else {
+ Common::Point pt(140, 162);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 1: {
+ Common::Point pt(80, 137);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 2: {
+ Common::Point pt(155, 137);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 3:
+ if (_field414 == 1) {
+ Common::Point pt(80, 137);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else if (_field414 == 6) {
+ Common::Point pt(140, 162);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else {
+ Common::Point pt(155, 137);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 4:
+ if (_field414 == 5) {
+ Common::Point pt(235, 132);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else {
+ Common::Point pt(155, 137);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 5: {
+ Common::Point pt(235, 132);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 6: {
+ Common::Point pt(140, 162);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ }
+ }
+ Scene::process(event);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2750 - Forest Maze
+ *
+ *--------------------------------------------------------------------------*/
+Scene2750::Scene2750(): SceneExt() {
+ _field412 = _field414 = _field416 = 0;
+}
+
+void Scene2750::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field412);
+ s.syncAsSint16LE(_field414);
+ s.syncAsSint16LE(_field416);
+}
+
+void Scene2750::Action1::signal() {
+ Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex) {
+ case 1:
+ setDelay(60 + R2_GLOBALS._randomSource.getRandomNumber(240));
+ _actionIndex = 2;
+ scene->_actor5.show();
+ scene->_actor5.animate(ANIM_MODE_8, 1, NULL);
+ break;
+ case 2:
+ setDelay(600 + R2_GLOBALS._randomSource.getRandomNumber(600));
+ _actionIndex = 0;
+ scene->_actor5.show();
+ scene->_actor3.animate(ANIM_MODE_2, NULL);
+ break;
+ default:
+ setDelay(30);
+ _actionIndex = 1;
+ scene->_actor3.animate(ANIM_MODE_6, NULL);
+ scene->_actor4.animate(ANIM_MODE_8, 1, NULL);
+ break;
+ }
+}
+
+void Scene2750::Action2::signal() {
+ Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
+
+ setDelay(600 + R2_GLOBALS._randomSource.getRandomNumber(300));
+ scene->_actor6.animate(ANIM_MODE_8, 1, NULL);
+}
+
+void Scene2750::Action3::signal() {
+ Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
+
+ if (scene->_actor7._position.x <= 320) {
+ setDelay(1800 + R2_GLOBALS._randomSource.getRandomNumber(600));
+ } else {
+ setDelay(60);
+ scene->_actor7.setPosition(Common::Point(-10, 25));
+ Common::Point pt(330, 45);
+ NpcMover *mover = new NpcMover();
+ scene->_actor7.addMover(mover, &pt, NULL);
+ }
+}
+
+void Scene2750::Action4::signal() {
+ Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
+
+ setDelay(600 + R2_GLOBALS._randomSource.getRandomNumber(300));
+ scene->_actor8.animate(ANIM_MODE_8, 1, NULL);
+}
+
+void Scene2750::Action5::signal() {
+ Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
+
+ setDelay(600 + R2_GLOBALS._randomSource.getRandomNumber(300));
+ scene->_actor9.animate(ANIM_MODE_8, 1, NULL);
+}
+
+void Scene2750::Action6::signal() {
+ Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
+
+ setDelay(600 + R2_GLOBALS._randomSource.getRandomNumber(300));
+ scene->_actor10.animate(ANIM_MODE_8, 1, NULL);
+}
+
+void Scene2750::Action7::signal() {
+ Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
+
+ setDelay(600 + R2_GLOBALS._randomSource.getRandomNumber(300));
+ scene->_actor11.animate(ANIM_MODE_8, 1, NULL);
+}
+
+void Scene2750::Area1::process(Event &event) {
+ SceneArea::process(event);
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._player._canWalk) && (_bounds.contains(event.mousePos))) {
+ Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 10;
+ scene->_field414 = 2752;
+ switch (scene->_field412) {
+ case 1: {
+ scene->_sceneMode = 2752;
+ scene->setAction(&scene->_sequenceManager, scene, 2752, &R2_GLOBALS._player, NULL);
+ break;
+ }
+ case 2: {
+ Common::Point pt(140, 142);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ break;
+ }
+ case 3: {
+ Common::Point pt(210, 142);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+}
+
+void Scene2750::Area2::process(Event &event) {
+ SceneArea::process(event);
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._player._canWalk) && (_bounds.contains(event.mousePos))) {
+ Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 10;
+ scene->_field414 = 2753;
+ switch (scene->_field412) {
+ case 1: {
+ Common::Point pt(140, 142);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ break;
+ }
+ case 2: {
+ Common::Point pt(210, 142);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ break;
+ }
+ case 3: {
+ scene->_sceneMode = 2753;
+ scene->setAction(&scene->_sequenceManager, scene, 2753, &R2_GLOBALS._player, NULL);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+}
+
+void Scene2750::postInit(SceneObjectList *OwnerList) {
+ loadScene(2750);
+ R2_GLOBALS._sound2.stop();
+ SceneExt::postInit();
+ _area1.setDetails(Rect(0, 90, 20, 135), EXITCURSOR_W);
+ _area2.setDetails(Rect(300, 90, 320, 135), EXITCURSOR_E);
+
+ _rect1.set(30, 127, 155, 147);
+ _rect2.set(130, 142, 210, 167);
+ _rect3.set(-1, 137, 290, 147);
+
+ if (R2_INVENTORY.getObjectScene(36) == 0) {
+ R2_GLOBALS._sound1.changeSound(235);
+ _actor2.postInit();
+ _actor2.setup(2751, 1, 1);
+ _actor2.setPosition(Common::Point(104, 158));
+ _actor2.animate(ANIM_MODE_2, NULL);
+ }
+
+ _actor3.postInit();
+ _actor3.setup(2750, 1, 1);
+ _actor3.setPosition(Common::Point(188, 34));
+ _actor3.animate(ANIM_MODE_2, NULL);
+ _actor3._numFrames = 16;
+
+ _actor4.postInit();
+ _actor4.setup(2700, 4, 1);
+ _actor4.setPosition(Common::Point(188, 37));
+ _actor4.fixPriority(26);
+
+ _actor5.postInit();
+ _actor5.setup(2750, 2, 1);
+ _actor5.setPosition(Common::Point(188, 34));
+ _actor5.hide();
+
+ _actor3.setAction(&_action1);
+
+ _actor6.postInit();
+ _actor6.setup(2750, 3, 1);
+ _actor6.setPosition(Common::Point(9, 167));
+ _actor6.fixPriority(252);
+ _actor6.setAction(&_action2);
+
+ _actor7.postInit();
+ _actor7.setup(2750, 4, 1);
+ _actor7.setPosition(Common::Point(-10, 25));
+ _actor7.animate(ANIM_MODE_1, NULL);
+ _actor7.setStrip2(4);
+ _actor7._moveRate = 20;
+ _actor7.setAction(&_action3);
+
+ _actor8.postInit();
+ _actor8.fixPriority(26);
+ _actor8.setup(2750, 5, 1);
+ _actor8.setPosition(Common::Point(258, 33));
+ _actor8.setAction(&_action4);
+
+ _actor9.postInit();
+ _actor9.fixPriority(26);
+ _actor9.setup(2750, 6, 1);
+ _actor9.setPosition(Common::Point(61, 38));
+ _actor9.setAction(&_action5);
+
+ _actor10.postInit();
+ _actor10.fixPriority(26);
+ _actor10.setup(2750, 7, 1);
+ _actor10.setPosition(Common::Point(69, 37));
+ _actor10.setAction(&_action6);
+
+ _actor11.postInit();
+ _actor11.fixPriority(26);
+ _actor11.setup(2750, 8, 1);
+ _actor11.setPosition(Common::Point(80, 35));
+ _actor11.setAction(&_action7);
+
+ _item2.setDetails(Rect(29, 50, 35, 56), 2750, 3, -1, 5, 1, NULL);
+ _item3.setDetails(Rect(47, 36, 54, 42), 2750, 3, -1, 5, 1, NULL);
+ _item4.setDetails(Rect(193, 21, 206, 34), 2750, 3, -1, 5, 1, NULL);
+ _item5.setDetails(Rect(301, 18, 315, 32), 2750, 3, -1, 5, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 320, 200), 2700, 0, -1, 2, 1, NULL);
+
+ _stripManager.setColors(60, 255);
+ _stripManager.setFontNumber(3);
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_nejSpeaker);
+
+ if (R2_INVENTORY.getObjectScene(36) == 0) {
+ _actor1.postInit();
+ _actor1.setup(2752, 5, 1);
+ _actor1.animate(ANIM_MODE_NONE, NULL);
+ _actor1.setPosition(Common::Point(101, 148));
+ }
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.setVisage(19);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player._moveDiff = Common::Point(2, 2);
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_GLOBALS._sceneManager._previousScene == 2700) {
+ if (R2_INVENTORY.getObjectScene(36) == 0) {
+ R2_GLOBALS._player.setVisage(2752);
+ R2_GLOBALS._player.setStrip(6);
+ R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL);
+ R2_GLOBALS._player.setPosition(Common::Point(81, 165));
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _field416 = 1204;
+ _sceneMode = 11;
+ _stripManager.start(_field416, this);
+ } else {
+ _sceneMode = 2750;
+ _field412 = 1;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2750, &R2_GLOBALS._player, NULL);
+ }
+ } else if (R2_GLOBALS._sceneManager._previousScene == 2800) {
+ _sceneMode = 2751;
+ _field412 = 3;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2751, &R2_GLOBALS._player, NULL);
+ } else {
+ _field412 = 1;
+ R2_GLOBALS._player.setPosition(Common::Point(90, 137));
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.enableControl();
+ }
+}
+void Scene2750::signal() {
+ switch (_sceneMode) {
+ case 10:
+ switch (_field414) {
+ case 1:
+ switch (_field412) {
+ case 2: {
+ _sceneMode = _field414;
+ _field412 = 1;
+ Common::Point pt(90, 137);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 3: {
+ _field412 = 2;
+ Common::Point pt(140, 142);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ case 2: {
+ _sceneMode = _field414;
+ _field412 = 2;
+ Common::Point pt(170, 162);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 3:
+ switch (_field412) {
+ case 1: {
+ _field412 = 2;
+ Common::Point pt(210, 142);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 2: {
+ _sceneMode = _field414;
+ _field412 = 3;
+ Common::Point pt(270, 142);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ case 2752:
+ switch (_field412) {
+ case 1:
+ _sceneMode = _field414;
+ setAction(&_sequenceManager, this, 2752, &R2_GLOBALS._player, NULL);
+ break;
+ case 2: {
+ _field412 = 1;
+ Common::Point pt(20, 132);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 3: {
+ _field412 = 2;
+ Common::Point pt(140, 142);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ case 2753:
+ switch (_field412) {
+ case 1: {
+ _field412 = 2;
+ Common::Point pt(210, 142);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 2: {
+ _field412 = 3;
+ Common::Point pt(300, 132);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 3:
+ _sceneMode = _field414;
+ setAction(&_sequenceManager, this, 2753, &R2_GLOBALS._player, NULL);
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ case 11:
+ // No break on purpose
+ case 2753:
+ g_globals->_sceneManager.changeScene(2800);
+ break;
+ case 2752:
+ g_globals->_sceneManager.changeScene(2700);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl(R2_NEGATOR_GUN);
+ break;
+ }
+}
+
+void Scene2750::process(Event &event) {
+ if ((R2_GLOBALS._player._canWalk) && (event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == R2_NEGATOR_GUN)) {
+ if (_rect1.contains(event.mousePos)) {
+ if (!_rect1.contains(R2_GLOBALS._player._position)) {
+ event.handled = true;
+ _sceneMode = 10;
+ _field414 = 1;
+ }
+ } else if (_rect2.contains(event.mousePos)) {
+ if (!_rect2.contains(R2_GLOBALS._player._position)) {
+ event.handled = true;
+ _sceneMode = 10;
+ _field414 = 2;
+ }
+ } else if (_rect3.contains(event.mousePos)) {
+ if (!_rect3.contains(R2_GLOBALS._player._position)) {
+ event.handled = true;
+ _sceneMode = 10;
+ _field414 = 3;
+ }
+ } else {
+ event.handled = true;
+ R2_GLOBALS._player.updateAngle(Common::Point(event.mousePos.x, event.mousePos.y));
+ }
+
+ if (_sceneMode == 10) {
+ R2_GLOBALS._player.disableControl();
+ switch (_field412) {
+ case 1: {
+ Common::Point pt(140, 142);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 2:
+ if (_field414 == 1) {
+ Common::Point pt(140, 142);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else {
+ Common::Point pt(210, 142);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 3: {
+ Common::Point pt(210, 142);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ Scene::process(event);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2800 - Exiting forest
+ *
+ *--------------------------------------------------------------------------*/
+Scene2800::Scene2800(): SceneExt() {
+ _field412 = 0;
+}
+
+void Scene2800::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field412);
+}
+
+bool Scene2800::Item2::startAction(CursorType action, Event &event) {
+ Scene2800 *scene = (Scene2800 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action == CURSOR_USE) && (R2_GLOBALS.getFlag(47))) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2805;
+ scene->setAction(&scene->_sequenceManager, scene, 2805, &R2_GLOBALS._player, NULL);
+ return true;
+ } else
+ return SceneHotspot::startAction(action, event);
+}
+
+bool Scene2800::Actor1::startAction(CursorType action, Event &event) {
+ Scene2800 *scene = (Scene2800 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_TALK) {
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ R2_GLOBALS.setFlag(47);
+ scene->_field412 = 1205;
+ scene->_sceneMode = 2803;
+ scene->_stripManager.start(scene->_field412, scene);
+ return true;
+ } else if (action == R2_SONIC_STUNNER) {
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS.setFlag(47);
+ scene->_sceneMode = 10;
+ scene->setAction(&scene->_sequenceManager, scene, 2802, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor1, NULL);
+ return true;
+ } else
+ return SceneActor::startAction(action, event);
+}
+
+void Scene2800::Action1::signal() {
+ Scene2800 *scene = (Scene2800 *)R2_GLOBALS._sceneManager._scene;
+
+ if (R2_GLOBALS._player._position.x <= 320) {
+ setDelay(120);
+ Common::Point pt(330, 25);
+ NpcMover *mover = new NpcMover();
+ scene->_object1.addMover(mover, &pt, NULL);
+ } else {
+ setDelay(1800 + R2_GLOBALS._randomSource.getRandomNumber(600));
+ scene->_object1.setPosition(Common::Point(-10, 45));
+ }
+}
+
+void Scene2800::Action2::signal() {
+ Scene2800 *scene = (Scene2800 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(240);
+ R2_GLOBALS._sound1.changeSound(240);
+ R2_GLOBALS._sound2.stop();
+ break;
+ case 1:
+ _object2.postInit();
+ _object2.setVisage(2800);
+ _object2.setStrip(1);
+ _object2._numFrames = 8;
+ _object2._moveRate = 8;
+ _object2.changeZoom(100);
+ _object2.setPosition(Common::Point(1, 1));
+ _object2.show();
+ _object2.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ R2_GLOBALS._sound2.play(130);
+ _object2.setVisage(2800);
+ _object2.setStrip(7);
+
+ _object3.postInit();
+ _object3.setVisage(2800);
+ _object3.setStrip(3);
+ _object3._numFrames = 8;
+ _object3._moveRate = 8;
+ _object3.changeZoom(100);
+ _object3.setPosition(Common::Point(300, 104));
+ _object3.show();
+ _object3.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ R2_GLOBALS._sound1.play(241);
+ _object4.postInit();
+ _object4.setVisage(2800);
+ _object4.setStrip(2);
+ _object4._numFrames = 4;
+ _object4._moveRate = 4;
+ _object4.changeZoom(100);
+ _object4.setPosition(Common::Point(300, 104));
+ _object4.fixPriority(105);
+ _object4.show();
+ _object4.animate(ANIM_MODE_5, this);
+ break;
+ case 4:
+ setDelay(18);
+ _object4.setStrip(4);
+ scene->_actor1.setVisage(2800);
+ scene->_actor1.setStrip(5);
+ scene->_actor1.setFrame(1);
+ scene->_actor1._numFrames = 5;
+ scene->_actor1._moveRate = 5;
+ scene->_actor1.setPosition(Common::Point(300, 104));
+ scene->_actor1.fixPriority(110);
+ scene->_actor1.changeZoom(100);
+ scene->_actor1.show();
+ break;
+ case 5:
+ scene->_actor1.animate(ANIM_MODE_5, this);
+ break;
+ case 6: {
+ scene->_actor1.changeZoom(-1);
+ scene->_actor1.setVisage(3107);
+ scene->_actor1.animate(ANIM_MODE_1, NULL);
+ scene->_actor1.setStrip(3);
+ scene->_actor1.setPosition(Common::Point(297, 140));
+ scene->_actor1._numFrames = 10;
+ scene->_actor1._moveRate = 10;
+ scene->_actor1._moveDiff = Common::Point(3, 2);
+
+ Common::Point pt(297, 160);
+ NpcMover *mover = new NpcMover();
+ scene->_actor1.addMover(mover, &pt, this);
+ break;
+ }
+ case 7: {
+ scene->_actor1.changeZoom(75);
+ scene->_actor1.updateAngle(R2_GLOBALS._player._position);
+
+ Common::Point pt(105, 82);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 8: {
+ R2_GLOBALS._player._numFrames = 8;
+ R2_GLOBALS._player._moveRate = 8;
+ R2_GLOBALS._player.animate(ANIM_MODE_2, NULL);
+ R2_GLOBALS._player.setObjectWrapper(NULL);
+ R2_GLOBALS._player.setStrip(2);
+ R2_GLOBALS._player.changeZoom(-1);
+
+ Common::Point pt(79, 100);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 9: {
+ R2_GLOBALS._player._numFrames = 10;
+ R2_GLOBALS._player._moveRate = 10;
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+
+ Common::Point pt(100, 64);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 10: {
+ R2_GLOBALS._player.fixPriority(124);
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+
+ Common::Point pt(160, 124);
+ PlayerMover *mover = new PlayerMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 11: {
+ R2_GLOBALS._player.fixPriority(-1);
+
+ Common::Point pt(160, 160);
+ PlayerMover *mover = new PlayerMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 12: {
+ Common::Point pt(270, 160);
+ PlayerMover *mover = new PlayerMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 13:
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ scene->_field412 = 1207;
+ scene->_stripManager.start(scene->_field412, this);
+ break;
+ case 14: {
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._player.fixPriority(110);
+
+ Common::Point pt(288, 140);
+ PlayerMover *mover = new PlayerMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 15:
+ setDelay(18);
+ scene->_actor1.updateAngle(R2_GLOBALS._player._position);
+ R2_GLOBALS._player.setVisage(2800);
+ R2_GLOBALS._player.setStrip(6);
+ R2_GLOBALS._player.setFrame(1);
+ R2_GLOBALS._player.changeZoom(100);
+ R2_GLOBALS._player.setPosition(Common::Point(300, 104));
+ R2_GLOBALS._player._numFrames = 5;
+ R2_GLOBALS._player._moveRate = 5;
+ break;
+ case 16:
+ R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 17:
+ setDelay(6);
+ _object4.setStrip(2);
+ _object4.setFrame(11);
+ R2_GLOBALS._player.hide();
+ // No break on purpose
+ case 18:
+ R2_GLOBALS._sound1.play(241);
+ _object4.animate(ANIM_MODE_6, this);
+ break;
+ case 19:
+ _object4.remove();
+ _object3.animate(ANIM_MODE_6, this);
+ break;
+ case 20:
+ setDelay(6);
+ _object3.remove();
+ _object2.setStrip(1);
+ _object2.setFrame(19);
+ break;
+ case 21:
+ setDelay(150);
+ R2_GLOBALS._sound1.play(269);
+ R2_GLOBALS._sound2.stop();
+ break;
+ case 22:
+ scene->_sceneMode = 12;
+ _object2.animate(ANIM_MODE_6, scene);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene2800::postInit(SceneObjectList *OwnerList) {
+ loadScene(2800);
+ setZoomPercents(100, 50, 124, 75);
+ R2_GLOBALS._sound1.stop();
+ R2_GLOBALS._sound2.stop();
+ SceneExt::postInit();
+
+ _object1.postInit();
+ _object1.setup(2750, 4, 1);
+ _object1.setPosition(Common::Point(-10, 25));
+ _object1.animate(ANIM_MODE_1, NULL);
+ _object1.setStrip2(4);
+ _object1._moveRate = 20;
+ _object1.setAction(&_action1);
+
+ _actor3.postInit();
+ _actor3.setup(2802, 1, 1);
+ _actor3.setPosition(Common::Point(116, 80));
+ _actor3.fixPriority(111);
+ _actor3.animate(ANIM_MODE_2, NULL);
+ _actor3._numFrames = 6;
+
+ if (!R2_GLOBALS.getFlag(47)) {
+ _actor1.postInit();
+ _actor1.setVisage(3105);
+ _actor1.setStrip(3);
+ _actor1.setFrame(1);
+ _actor1.setZoom(50);
+ _actor1._moveDiff = Common::Point(2, 1);
+ _actor1.setPosition(Common::Point(122, 82));
+ _actor1.animate(ANIM_MODE_NONE, NULL);
+ _actor1.setDetails(2800, -1, -1, -1, 1, (SceneItem *)NULL);
+ }
+
+ _item1.setDetails(Rect(0, 0, 320, 200), 2800, -1, -1, -1, 1, NULL);
+
+ _stripManager.setColors(60, 255);
+ _stripManager.setFontNumber(3);
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_nejSpeaker);
+ _stripManager.addSpeaker(&_guardSpeaker);
+
+ if (R2_INVENTORY.getObjectScene(36) == 0) {
+ R2_GLOBALS._sound1.fadeSound(237);
+ if (R2_GLOBALS.getFlag(47)) {
+ _item2.setDetails(Rect(76, 45, 155, 90), 2800, 3, -1, -1, 2, NULL);
+ } else {
+ _actor2.postInit();
+ _actor2.setup(2752, 5, 1);
+ _actor2.animate(ANIM_MODE_NONE, NULL);
+ _actor2.changeZoom(100);
+ _actor2._moveDiff = Common::Point(2, 1);
+ _actor2.setPosition(Common::Point(101, 148));
+ }
+ }
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.setVisage(19);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.changeZoom(100);
+ R2_GLOBALS._player._moveDiff = Common::Point(2, 2);
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_INVENTORY.getObjectScene(36) == 0) {
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2800, &R2_GLOBALS._player, NULL);
+ } else if (R2_GLOBALS.getFlag(47)) {
+ R2_GLOBALS._player.setVisage(3110);
+ R2_GLOBALS._player.changeZoom(-1);
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ R2_GLOBALS._player.setPosition(Common::Point(160, 124));
+ R2_GLOBALS._player.enableControl();
+ } else {
+ _sceneMode = 2801;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2801, &R2_GLOBALS._player, &_actor2, &_actor1, NULL);
+ }
+}
+
+void Scene2800::signal() {
+ switch (_sceneMode) {
+ case 10:
+ R2_GLOBALS._sound1.play(238);
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _field412 = 1206;
+ _sceneMode = 2804;
+ _stripManager.start(_field412, this);
+ break;
+ case 11:
+ _actor2.remove();
+ _object1.setAction(NULL);
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ _item2.setDetails(Rect(76, 45, 155, 90), 2800, 3, -1, -1, 2, NULL);
+ break;
+ case 12:
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ R2_GLOBALS._sound2.fadeOut2(NULL);
+ g_globals->_sceneManager.changeScene(1000);
+ break;
+ case 2800:
+ g_globals->_sceneManager.changeScene(2750);
+ break;
+ case 2801:
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ case 2803:
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 10;
+ setAction(&_sequenceManager, this, 2803, &R2_GLOBALS._player, &_actor2, &_actor1, NULL);
+ break;
+ case 2804:
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 11;
+ setAction(&_sequenceManager, this, 2804, &R2_GLOBALS._player, &_actor2, NULL);
+ break;
+ case 2805:
+ _object1.remove();
+ setAction(&_action2);
+ break;
+ default:
+ break;
+ }
+}
+
+} // End of namespace Ringworld2
+} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld2/ringworld2_scenes2.h b/engines/tsage/ringworld2/ringworld2_scenes2.h
new file mode 100644
index 0000000000..281d1da366
--- /dev/null
+++ b/engines/tsage/ringworld2/ringworld2_scenes2.h
@@ -0,0 +1,672 @@
+/* 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 TSAGE_RINGWORLD2_SCENES2_H
+#define TSAGE_RINGWORLD2_SCENES2_H
+
+#include "common/scummsys.h"
+#include "tsage/converse.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+#include "tsage/sound.h"
+#include "tsage/ringworld2/ringworld2_logic.h"
+#include "tsage/ringworld2/ringworld2_speakers.h"
+
+namespace TsAGE {
+
+namespace Ringworld2 {
+
+using namespace TsAGE;
+
+class Scene2000 : public SceneExt {
+ class Action1 : public ActionExt {
+ public:
+ virtual void signal();
+ };
+
+ class Exit1 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class Exit2 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class Exit3 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class Exit4 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class Exit5 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+public:
+ bool _exitingFlag;
+ int _mazePlayerMode;
+
+ NamedHotspot _item1;
+ SceneActor _object1;
+ SceneActor _objList1[11];
+ Exit1 _exit1;
+ Exit2 _exit2;
+ Exit3 _exit3;
+ Exit4 _exit4;
+ Exit5 _exit5;
+ Action1 _action1, _action2, _action3, _action4, _action5;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void synchronize(Serializer &s);
+
+ void initExits();
+ void initPlayer();
+};
+
+class Scene2350 : public SceneExt {
+ class Actor2 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor3 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class ExitUp : public SceneExit {
+ virtual void changeScene();
+ };
+ class ExitWest : public SceneExit {
+ virtual void changeScene();
+ };
+public:
+
+ SpeakerQuinn _quinnSpeaker;
+ SpeakerPharisha _pharishaSpeaker;
+ NamedHotspot _item1;
+ SceneActor _actor1;
+ Actor2 _actor2;
+ Actor3 _actor3;
+ Actor3 _actor4;
+ ExitUp _exitUp;
+ ExitWest _exitWest;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+};
+
+class Scene2400 : public SceneExt {
+ class Exit1 : public SceneExit {
+ virtual void changeScene();
+ };
+ class Exit2 : public SceneExit {
+ virtual void changeScene();
+ };
+public:
+ Exit1 _exit1;
+ Exit2 _exit2;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene2425 : public SceneExt {
+ class Item1 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item2 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item3 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item4 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor1 : public SceneActor {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+ class Actor2 : public SceneActor {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+
+ class Exit1 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+public:
+ Item1 _item1;
+ Item2 _item2;
+ Item3 _item3;
+ Item4 _item4;
+ Actor1 _actor1;
+ Actor2 _actor2;
+ Actor2 _actor3;
+ Exit1 _exit1;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+};
+
+class Scene2430 : public SceneExt {
+ class Actor1 : public SceneActor {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+ class Actor2 : public SceneActor {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+ class Actor3 : public SceneActor {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+
+ class Exit1 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+public:
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ NamedHotspot _item3;
+ NamedHotspot _item4;
+ NamedHotspot _item5;
+ NamedHotspot _item6;
+ NamedHotspot _item7;
+ NamedHotspot _item8;
+ NamedHotspot _item9;
+ NamedHotspot _item10;
+ NamedHotspot _item11;
+ NamedHotspot _item12;
+ NamedHotspot _item13;
+ Actor1 _actor1;
+ Actor2 _actor2;
+ Actor3 _actor3;
+ Exit1 _exit1;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene2435 : public SceneExt {
+ class Actor1 : public SceneActor {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+ class Actor2 : public SceneActor {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+
+ class Exit1 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+public:
+ SpeakerQuinn2435 _quinnSpeaker;
+ SpeakerSeeker2435 _seekerSpeaker;
+ SpeakerPharisha2435 _pharishaSpeaker;
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ NamedHotspot _item3;
+ Actor1 _actor1;
+ Actor2 _actor2;
+ Exit1 _exit1;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+};
+
+class Scene2440 : public SceneExt {
+ class Actor1 : public SceneActor {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+ class Actor2 : public SceneActor {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+
+ class Exit1 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+public:
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ NamedHotspot _item3;
+ NamedHotspot _item4;
+ NamedHotspot _item5;
+ NamedHotspot _item6;
+ NamedHotspot _item7;
+ Actor1 _actor1;
+ Actor2 _actor2;
+ Exit1 _exit1;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+};
+
+class Scene2445 : public SceneExt {
+public:
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene2450 : public SceneExt {
+ class Actor2 : public SceneActor {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+ class Actor3 : public SceneActor {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+
+ class Exit1 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+public:
+ SpeakerQuinn2450 _quinnSpeaker;
+ SpeakerSeeker2450 _seekerSpeaker;
+ SpeakerCaretaker2450 _caretakerSpeaker;
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ NamedHotspot _item3;
+ SceneActor _actor1;
+ Actor2 _actor2;
+ Actor3 _actor3;
+ Exit1 _exit1;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+};
+
+class Scene2455 : public SceneExt {
+ class Actor1 : public SceneActor {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+ class Actor2 : public SceneActor {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+ class Actor3 : public SceneActor {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+
+ class Exit1 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+public:
+ NamedHotspot _item1;
+ Actor1 _actor1;
+ Actor2 _actor2;
+ Actor3 _actor3;
+ Exit1 _exit1;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+};
+
+class Scene2500 : public SceneExt {
+ class Exit1 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+public:
+ SpeakerQuinn _quinnSpeaker;
+ SpeakerSeeker _seekerSpeaker;
+ SpeakerMiranda _mirandaSpeaker;
+ SpeakerWebbster2500 _webbsterSpeaker;
+ NamedHotspot _item1;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ Exit1 _exit1;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene2525 : public SceneExt {
+ class Item5 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor3 : public SceneActor {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+
+ class Exit1 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+public:
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ NamedHotspot _item3;
+ NamedHotspot _item4;
+ Item5 _item5;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ Actor3 _actor3;
+ Exit1 _exit1;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+};
+
+class Scene2530 : public SceneExt {
+ class Actor2 : public SceneActor {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+ class Actor3 : public SceneActor {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+
+ class Exit1 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+public:
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ NamedHotspot _item3;
+ NamedHotspot _item4;
+ NamedHotspot _item5;
+ SceneActor _actor1;
+ Actor2 _actor2;
+ Actor3 _actor3;
+ Exit1 _exit1;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene2535 : public SceneExt {
+ class Actor3 : public SceneActor {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+ class Actor4 : public SceneActor {
+ public:
+ bool startAction(CursorType action, Event &event);
+ };
+
+ class Exit1 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+public:
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ NamedHotspot _item3;
+ NamedHotspot _item4;
+ NamedHotspot _item5;
+ NamedHotspot _item6;
+ NamedHotspot _item7;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ Actor3 _actor3;
+ Actor4 _actor4;
+ Exit1 _exit1;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene2600 : public SceneExt {
+public:
+ SequenceManager _sequenceManager;
+ PaletteRotation *_rotation;
+
+ Scene2600();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+};
+
+class Scene2700 : public SceneExt {
+ class Action1: public Action {
+ public:
+ void signal();
+ };
+ class Action2: public Action {
+ public:
+ void signal();
+ };
+ class Action3: public Action {
+ public:
+ void signal();
+ };
+ class Action4: public Action {
+ public:
+ void signal();
+ };
+
+ class Area1: public SceneArea {
+ public:
+ void process(Event &event);
+ };
+ class Area2: public SceneArea {
+ public:
+ void process(Event &event);
+ };
+public:
+ SpeakerQuinn2700 _quinnSpeaker;
+ SpeakerNej2700 _nejSpeaker;
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ NamedHotspot _item3;
+ NamedHotspot _item4;
+ NamedHotspot _item5;
+ NamedHotspot _item6;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SceneActor _actor4;
+ SceneActor _actor5;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ Area1 _area1;
+ Area2 _area2;
+ Rect _rect1, _rect2, _rect3, _rect4, _rect5, _rect6;
+ SequenceManager _sequenceManager;
+ int _field412, _field414, _field416;
+
+ Scene2700();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+};
+
+class Scene2750 : public SceneExt {
+ class Action1: public Action {
+ public:
+ void signal();
+ };
+ class Action2: public Action {
+ public:
+ void signal();
+ };
+ class Action3: public Action {
+ public:
+ void signal();
+ };
+ class Action4: public Action {
+ public:
+ void signal();
+ };
+ class Action5: public Action {
+ public:
+ void signal();
+ };
+ class Action6: public Action {
+ public:
+ void signal();
+ };
+ class Action7: public Action {
+ public:
+ void signal();
+ };
+
+ class Area1: public SceneArea {
+ public:
+ void process(Event &event);
+ };
+ class Area2: public SceneArea {
+ public:
+ void process(Event &event);
+ };
+public:
+ SpeakerQuinn2750 _quinnSpeaker;
+ SpeakerNej2750 _nejSpeaker;
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ NamedHotspot _item3;
+ NamedHotspot _item4;
+ NamedHotspot _item5;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SceneActor _actor4;
+ SceneActor _actor5;
+ SceneActor _actor6;
+ SceneActor _actor7;
+ SceneActor _actor8;
+ SceneActor _actor9;
+ SceneActor _actor10;
+ SceneActor _actor11;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ Action5 _action5;
+ Action6 _action6;
+ Action7 _action7;
+ Area1 _area1;
+ Area2 _area2;
+ Rect _rect1, _rect2, _rect3;
+ SequenceManager _sequenceManager;
+ int _field412, _field414, _field416;
+
+ Scene2750();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+};
+
+class Scene2800 : public SceneExt {
+ class Item2 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor1 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Action1: public Action {
+ public:
+ void signal();
+ };
+ class Action2: public Action {
+ SceneObject _object2;
+ SceneObject _object3;
+ SceneObject _object4;
+ public:
+ void signal();
+ };
+public:
+ SpeakerQuinn2800 _quinnSpeaker;
+ SpeakerNej2800 _nejSpeaker;
+ SpeakerGuard2800 _guardSpeaker;
+ NamedHotspot _item1;
+ Item2 _item2;
+ Actor1 _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SceneObject _object1;
+ Action1 _action1;
+ Action2 _action2;
+ SequenceManager _sequenceManager;
+ int _field412;
+
+ Scene2800();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+} // End of namespace Ringworld2
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/ringworld2/ringworld2_scenes3.cpp b/engines/tsage/ringworld2/ringworld2_scenes3.cpp
new file mode 100644
index 0000000000..3dd566c900
--- /dev/null
+++ b/engines/tsage/ringworld2/ringworld2_scenes3.cpp
@@ -0,0 +1,5603 @@
+/* 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 "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+#include "tsage/ringworld2/ringworld2_scenes3.h"
+
+namespace TsAGE {
+
+namespace Ringworld2 {
+
+/*--------------------------------------------------------------------------
+ * Scene 3100 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene3100::Scene3100() {
+ _field412 = 0;
+}
+
+void Scene3100::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field412);
+}
+
+bool Scene3100::Guard::startAction(CursorType action, Event &event) {
+ if (action != CURSOR_TALK)
+ return SceneActor::startAction(action, event);
+
+ Scene3100 *scene = (Scene3100 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 10;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ scene->_stripManager.start(606, scene);
+ return true;
+}
+
+void Scene3100::postInit(SceneObjectList *OwnerList) {
+ if (R2_GLOBALS._sceneManager._previousScene == 1000) {
+ if (R2_GLOBALS._player._oldCharacterScene[1] == 3100) {
+ loadScene(3101);
+ R2_GLOBALS._uiElements._active = false;
+ } else {
+ loadScene(3100);
+ g_globals->gfxManager()._bounds.moveTo(Common::Point(160, 0));
+ }
+ } else {
+ loadScene(3100);
+ }
+ // Original was doing it twice in a row. Skipped.
+
+ if (R2_GLOBALS._sceneManager._previousScene == 3255)
+ R2_GLOBALS._uiElements._active = false;
+
+ SceneExt::postInit();
+ _stripManager.addSpeaker(&_guardSpeaker);
+
+ if (R2_GLOBALS._sceneManager._previousScene == -1)
+ R2_GLOBALS._sceneManager._previousScene = 1000;
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player._characterIndex = R2_QUINN;
+ R2_GLOBALS._player.disableControl();
+
+ _actor1.postInit();
+ _item2.setDetails(Rect(212, 97, 320, 114), 3100, 3, -1, -1, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 480, 200), 3100, 0, -1, -1, 1, NULL);
+ _field412 = 0;
+
+ if (R2_GLOBALS._sceneManager._previousScene == 1000) {
+ if (R2_GLOBALS._player._oldCharacterScene[1] == 3100) {
+ _sceneMode = 3102;
+ _actor3.postInit();
+ _actor4.postInit();
+ _actor5.postInit();
+ R2_GLOBALS._sound1.play(274);
+ _sound1.fadeSound(130);
+ setAction(&_sequenceManager, this, 3102, &_actor1, &R2_GLOBALS._player, &_actor3, &_actor4, &_actor5, NULL);
+ } else {
+ _guard.postInit();
+ _guard.setup(3110, 5, 1);
+ _guard.changeZoom(50);
+ _guard.setPosition(Common::Point(10, 149));
+ _guard.setDetails(3100, 6, -1, -1, 2, (SceneItem *)NULL);
+
+ _actor4.postInit();
+ _actor4.setup(3103, 1, 1);
+ _actor4.setPosition(Common::Point(278, 113));
+ _actor4.setDetails(3100, 9, -1, -1, 2, (SceneItem *)NULL);
+ _actor4.animate(ANIM_MODE_2, NULL);
+
+ _field412 = 1;
+ _actor1.setDetails(3100, 3, -1, -1, 2, (SceneItem *)NULL);
+ R2_GLOBALS._sound1.play(243);
+ R2_GLOBALS._sound2.play(130);
+ _sceneMode = 3100;
+
+ setAction(&_sequenceManager, this, 3100, &R2_GLOBALS._player, &_actor1, NULL);
+ }
+ } else if (R2_GLOBALS._sceneManager._previousScene == 3255) {
+ _sceneMode = 3101;
+ _actor2.postInit();
+ _actor3.postInit();
+ _field412 = 1;
+
+ setAction(&_sequenceManager, this, 3101, &R2_GLOBALS._player, &_actor1, &_actor2, &_actor3, NULL);
+ } else {
+ _guard.postInit();
+ _guard.setup(3110, 5, 1);
+ _guard.changeZoom(50);
+ _guard.setPosition(Common::Point(10, 149));
+ _guard.setDetails(3100, 6, -1, -1, 2, (SceneItem *)NULL);
+
+ _actor4.postInit();
+ _actor4.setup(3103, 1, 1);
+ _actor4.setPosition(Common::Point(278, 113));
+ _actor4.setDetails(3100, 9, -1, -1, 2, (SceneItem *)NULL);
+ _actor4.animate(ANIM_MODE_2, NULL);
+
+ _actor1.postInit();
+ _actor1.setup(3104, 4, 1);
+ _actor1.setPosition(Common::Point(143, 104));
+ _actor1.setDetails(3100, 3, -1, -1, 2, (SceneItem *)NULL);
+
+ R2_GLOBALS._player.setup(3110, 3, 1);
+ R2_GLOBALS._player.changeZoom(50);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.setPosition(Common::Point(160, 150));
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+
+ R2_GLOBALS._sound1.play(243);
+ }
+
+ R2_GLOBALS._player._oldCharacterScene[1] = 3100;
+}
+
+void Scene3100::remove() {
+ R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ R2_GLOBALS._sound2.fadeOut2(NULL);
+ _sound1.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene3100::signal() {
+ switch (_sceneMode) {
+ case 10:
+ R2_GLOBALS._player.enableControl(CURSOR_TALK);
+ break;
+ case 3100:
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ break;
+ case 3101:
+ R2_GLOBALS._sceneManager.changeScene(1000);
+ break;
+ case 3102:
+ R2_GLOBALS._player._oldCharacterScene[1] = 1000;
+ R2_GLOBALS._sceneManager.changeScene(1000);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ break;
+ }
+}
+
+void Scene3100::dispatch() {
+ if ((_sceneMode == 3100) && (_field412 != 0) && (R2_GLOBALS._player._position.y == 104)) {
+ _field412 = 0;
+ R2_GLOBALS._sound2.fadeOut2(NULL);
+ }
+
+ if ((_sceneMode == 3101) && (_field412 != 0) && (R2_GLOBALS._player._position.y < 104)) {
+ _field412 = 0;
+ _sound1.fadeSound(130);
+ }
+
+ Scene::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3125 - Ghouls dormitory
+ *
+ *--------------------------------------------------------------------------*/
+Scene3125::Scene3125() {
+ _field412 = 0;
+}
+
+void Scene3125::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field412);
+}
+
+bool Scene3125::Item1::startAction(CursorType action, Event &event) {
+ Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (_useLineNum != -1)
+ SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ break;
+ case CURSOR_LOOK:
+ if (_lookLineNum != -1)
+ SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ break;
+ case CURSOR_TALK:
+ if (_talkLineNum != -1)
+ SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ break;
+ default:
+ return scene->display(action, event);
+ break;
+ }
+
+ return true;
+}
+
+bool Scene3125::Item2::startAction(CursorType action, Event &event) {
+ Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3125;
+ scene->setAction(&scene->_sequenceManager1, scene, 3125, &R2_GLOBALS._player, NULL);
+ break;
+ case CURSOR_LOOK:
+ SceneItem::display(3125, 15, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ break;
+ case CURSOR_TALK:
+ SceneItem::display(3125, 13, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ break;
+ default:
+ return SceneHotspot::startAction(action, event);
+ break;
+ }
+
+ return true;
+}
+
+bool Scene3125::Item3::startAction(CursorType action, Event &event) {
+ Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ R2_GLOBALS._player.disableControl();
+ scene->_actor5.postInit();
+ scene->_sceneMode = 3126;
+ scene->setAction(&scene->_sequenceManager1, scene, 3126, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor3, &scene->_actor4, &scene->_actor1, &scene->_actor5, NULL);
+ break;
+ case CURSOR_LOOK:
+ SceneItem::display(3125, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ break;
+ case CURSOR_TALK:
+ SceneItem::display(3125, 13, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ break;
+ default:
+ return SceneHotspot::startAction(action, event);
+ break;
+ }
+
+ return true;
+}
+
+bool Scene3125::Actor1::startAction(CursorType action, Event &event) {
+ Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3176;
+ scene->setAction(&scene->_sequenceManager1, scene, 3176, &R2_GLOBALS._player, &scene->_actor1, NULL);
+ return true;
+}
+
+void Scene3125::postInit(SceneObjectList *OwnerList) {
+ loadScene(3125);
+ SceneExt::postInit();
+ _field412 = 0;
+
+ _actor1.postInit();
+ _actor1.setup(3175, 1, 1);
+ _actor1.setPosition(Common::Point(35, 72));
+ _actor1.setDetails(3125, 12, 13, -1, 1, (SceneItem *)NULL);
+
+ _actor2.postInit();
+ _actor2.setup(3126, 4, 1);
+ _actor2.setPosition(Common::Point(71, 110));
+ _actor2._numFrames = 20;
+
+ _actor3.postInit();
+ _actor3.setup(3126, 1, 1);
+ _actor3.setPosition(Common::Point(215, 62));
+ _actor3.fixPriority(71);
+
+ _actor4.postInit();
+ _actor4.setup(3126, 1, 1);
+ _actor4.setPosition(Common::Point(171, 160));
+ _actor4.fixPriority(201);
+
+ _item3.setDetails(12, 3125, 9, 13, -1);
+ _item2.setDetails(11, 3125, 15, 13, -1);
+ _item1.setDetails(Rect(0, 0, 320, 200), 3125, 0, 1, 2, 1, NULL);
+
+ R2_GLOBALS._sound1.play(262);
+ R2_GLOBALS._player.postInit();
+
+ if (R2_GLOBALS._player._oldCharacterScene[3] == 3250) {
+ _sceneMode = 3175;
+ setAction(&_sequenceManager1, this, 3175, &R2_GLOBALS._player, &_actor1, NULL);
+ } else {
+ R2_GLOBALS._player.setup(30, 5, 1);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.setPosition(Common::Point(89, 76));
+ R2_GLOBALS._player.enableControl();
+ }
+ R2_GLOBALS._player._oldCharacterScene[3] = 3125;
+}
+
+void Scene3125::signal() {
+ switch (_sceneMode) {
+ case 3125:
+ SceneItem::display(3125, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ _sceneMode = 3127;
+ setAction(&_sequenceManager1, this, 3127, &R2_GLOBALS._player, NULL);
+ break;
+ case 3126:
+ R2_GLOBALS.setFlag(79);
+ // No break on purpose
+ case 3176:
+ R2_GLOBALS._sceneManager.changeScene(3250);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene3125::dispatch() {
+ if ((_sceneMode == 3126) && (_actor2._frame == 2) && (_field412 == 0)) {
+ _field412 = 1;
+ R2_GLOBALS._sound1.play(265);
+ }
+ Scene::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3150 - Jail
+ *
+ *--------------------------------------------------------------------------*/
+bool Scene3150::Item5::startAction(CursorType action, Event &event) {
+ Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (R2_INVENTORY.getObjectScene(47) != 3150)
+ return SceneHotspot::startAction(action, event);
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3154;
+ scene->setAction(&scene->_sequenceManager, scene, 3154, &R2_GLOBALS._player, &scene->_actor3, NULL);
+ return true;
+ case R2_SUPERCONDUCTOR_WIRE:
+ if ((R2_INVENTORY.getObjectScene(47) != 3150) && (R2_GLOBALS.getFlag(75))) {
+ R2_GLOBALS._player.disableControl();
+ scene->_actor3.postInit();
+ scene->_actor3._effect = 3;
+ scene->_actor3._shade = 5;
+ scene->_sceneMode = 3155;
+ scene->setAction(&scene->_sequenceManager, scene, 3155, &R2_GLOBALS._player, &scene->_actor3, NULL);
+ } else {
+ SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ }
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ break;
+ }
+}
+
+bool Scene3150::Item6::startAction(CursorType action, Event &event) {
+ Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case R2_PILLOW:
+ R2_GLOBALS._player.disableControl();
+ scene->_actor4.postInit();
+ scene->_actor4._effect = 6;
+ scene->_actor4._shade = 3;
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3158;
+ scene->setAction(&scene->_sequenceManager, scene, 3158, &R2_GLOBALS._player, &scene->_actor4, NULL);
+ return true;
+ case R2_FOOD_TRAY:
+ if ((R2_INVENTORY.getObjectScene(47) != 3150) && (R2_INVENTORY.getObjectScene(40) == 3150) && (R2_GLOBALS.getFlag(75))) {
+ scene->_actor5.postInit();
+ scene->_actor5._effect = 6;
+ scene->_actor5._shade = 3;
+ scene->_actor5.setDetails(3150, 30, -1, -1, 2, (SceneItem *)NULL);
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3159;
+ scene->setAction(&scene->_sequenceManager, scene, 3159, &R2_GLOBALS._player, &scene->_actor5, NULL);
+ } else {
+ SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ }
+ default:
+ return SceneHotspot::startAction(action, event);
+ break;
+ }
+}
+
+bool Scene3150::Actor4::startAction(CursorType action, Event &event) {
+ Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (R2_GLOBALS.getFlag(75))
+ return SceneActor::startAction(action, event);
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3151;
+ scene->setAction(&scene->_sequenceManager, scene, 3151, &R2_GLOBALS._player, &scene->_actor4, NULL);
+ return true;
+ case R2_FOOD_TRAY:
+ return false;
+ default:
+ return SceneActor::startAction(action, event);
+ break;
+ }
+}
+
+bool Scene3150::Actor5::startAction(CursorType action, Event &event) {
+ Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action != CURSOR_USE) || (R2_GLOBALS.getFlag(77)))
+ return SceneActor::startAction(action ,event);
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3157;
+ scene->setAction(&scene->_sequenceManager, scene, 3157, &R2_GLOBALS._player, &scene->_actor5, NULL);
+ return true;
+}
+
+bool Scene3150::Actor6::startAction(CursorType action, Event &event) {
+ Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ if (R2_GLOBALS.getFlag(75)) {
+ if (R2_GLOBALS.getFlag(77)) {
+ R2_GLOBALS._player.disableControl();
+ if (R2_GLOBALS.getFlag(76)) {
+ scene->_sceneMode = 3152;
+ scene->setAction(&scene->_sequenceManager, scene, 3152, &R2_GLOBALS._player, NULL);
+ } else {
+ scene->_sceneMode = 3153;
+ scene->setAction(&scene->_sequenceManager, scene, 3152, &R2_GLOBALS._player, &scene->_actor4, NULL);
+ }
+ } else {
+ SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ }
+ } else {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3152;
+ scene->setAction(&scene->_sequenceManager, scene, 3152, &R2_GLOBALS._player, NULL);
+ }
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene3150::Actor7::startAction(CursorType action, Event &event) {
+ Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action == R2_LASER_HACKSAW) && (!R2_GLOBALS.getFlag(80))) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3160;
+ scene->setAction(&scene->_sequenceManager, scene, 3160, &R2_GLOBALS._player, &scene->_actor7, NULL);
+ return true;
+ }
+
+ return SceneActor::startAction(action, event);
+}
+
+void Scene3150::Exit1::changeScene() {
+ Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ g_globals->_events.setCursor(CURSOR_ARROW);
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 11;
+
+ Common::Point pt(-20, 180);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene3150::Exit2::changeScene() {
+ Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ g_globals->_events.setCursor(CURSOR_ARROW);
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 12;
+
+ scene->setAction(&scene->_sequenceManager, scene, 3163, &R2_GLOBALS._player, NULL);
+}
+
+void Scene3150::postInit(SceneObjectList *OwnerList) {
+ loadScene(3150);
+ if (R2_GLOBALS._sceneManager._previousScene == -1) {
+ R2_INVENTORY.setObjectScene(35, 2000);
+ R2_GLOBALS._player._oldCharacterScene[1] = 3100;
+ R2_GLOBALS._player._oldCharacterScene[3] = 0;
+ R2_GLOBALS._player._characterIndex = R2_MIRANDA;
+ }
+ SceneExt::postInit();
+
+ if (R2_GLOBALS.getFlag(78)) {
+ _exit1.setDetails(Rect(0, 135, 60, 168), EXITCURSOR_SW, 3275);
+ _exit1.setDest(Common::Point(70, 125));
+ }
+
+ if (R2_GLOBALS.getFlag(80)) {
+ _exit2.setDetails(Rect(249, 36, 279, 60), EXITCURSOR_NE, 3150);
+ _exit2.setDest(Common::Point(241, 106));
+ }
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.disableControl();
+
+ _actor2.postInit();
+ _actor2.setPosition(Common::Point(64, 139));
+ if (R2_GLOBALS.getFlag(78)) {
+ _actor2.setup(3151, 1, 5);
+ _actor2.fixPriority(125);
+ } else {
+ _actor2.setup(3151, 1, 1);
+ _actor2.setDetails(3150, 8, -1, 9, 1, (SceneItem *)NULL);
+ }
+
+ if (R2_GLOBALS.getFlag(78)) {
+ _actor1.postInit();
+ _actor1.setup(3154, 1, 16);
+ _actor1.setPosition(Common::Point(104, 129));
+ _actor1._effect = 6;
+ _actor1._shade = 3;
+ _actor1.setDetails(3150, 24, -1, -1, -1, (SceneItem *)NULL);
+ }
+
+ _actor7.postInit();
+ _actor7.setup(3154, 5, 1);
+ if (R2_GLOBALS.getFlag(80))
+ _actor7.setPosition(Common::Point(264, 108));
+ else
+ _actor7.setPosition(Common::Point(264, 58));
+ _actor7.fixPriority(50);
+ _actor7.setDetails(3150, 17, -1, 19, 1, (SceneItem *)NULL);
+
+ if (R2_INVENTORY.getObjectScene(41) == 3150) {
+ _actor4.postInit();
+ if (R2_GLOBALS.getFlag(75)) {
+ if (R2_GLOBALS.getFlag(76)) {
+ R2_GLOBALS._walkRegions.enableRegion(1);
+ R2_GLOBALS._walkRegions.enableRegion(4);
+ R2_GLOBALS._walkRegions.enableRegion(5);
+ R2_GLOBALS._walkRegions.enableRegion(6);
+ _actor4.setup(3152, 4, 10);
+ _actor4.setDetails(3150, 14, -1, -1, 1, (SceneItem *)NULL);
+ } else {
+ _actor4.setup(3152, 7, 4);
+ _actor4.setDetails(3150, 13, -1, -1, 1, (SceneItem *)NULL);
+ }
+ _actor4.fixPriority(110);
+ _actor4.setPosition(Common::Point(83, 88));
+ _actor4._effect = 6;
+ _actor4._shade = 3;
+ } else {
+ _actor4.setup(3152, 7, 3);
+ _actor4.setPosition(Common::Point(143, 70));
+ _actor4.setDetails(3150, 15, -1, -1, 1, (SceneItem *)NULL);
+ }
+ }
+
+ if (R2_INVENTORY.getObjectScene(47) == 3150) {
+ _actor3.postInit();
+ _actor3.setup(3152, 7, 1);
+ _actor3.setPosition(Common::Point(73, 83));
+ }
+
+ if (R2_INVENTORY.getObjectScene(40) == 3150) {
+ _actor3.postInit();
+ _actor3.setup(3152, 7, 3);
+ _actor3.setPosition(Common::Point(70, 55));
+ _actor3.fixPriority(111);
+ _actor3._effect = 6;
+ _actor3._shade = 5;
+ }
+
+ if (R2_INVENTORY.getObjectScene(42) == 3150) {
+ _actor5.postInit();
+ if (R2_GLOBALS.getFlag(77)) {
+ _actor5.setup(3152, 7, 8);
+ _actor5.setPosition(Common::Point(82, 92));
+ _actor5.fixPriority(111);
+ _actor5._effect = 6;
+ _actor5._shade = 3;
+ } else {
+ _actor5.setup(3152, 7, 7);
+ _actor5.setPosition(Common::Point(155, 79));
+ }
+ _actor5.setDetails(3150, 30, -1, -1, 2, (SceneItem *)NULL);
+ }
+
+ _actor6.postInit();
+ _actor6.setup(3152, 7, 6);
+ _actor6.setPosition(Common::Point(98, 73));
+ _actor6.setDetails(3150, 43, -1, -1, 1, (SceneItem *)NULL);
+
+ _item2.setDetails(12, 3150, 10, -1, 12);
+ _item3.setDetails(Rect(186, 17, 210, 36), 3150, 6, -1, -1, 1, NULL);
+ _item4.setDetails(Rect(61, 21, 92, 41), 3150, 7, -1, -1, 1, NULL);
+ _item5.setDetails(Rect(63, 48, 78, 58), 3150, 6, -1, -1, 1, NULL);
+ _item6.setDetails(Rect(63, 81, 100, 95), 3150, 3, 4, -1, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 200, 320), 3150, 0, 1, 2, 1, NULL);
+
+ switch (R2_GLOBALS._player._oldCharacterScene[3]) {
+ case 0:
+ _sceneMode = 3150;
+ _actor1.postInit();
+ _actor1._effect = 6;
+ _actor1._shade = 5;
+ setAction(&_sequenceManager, this, 3150, &R2_GLOBALS._player, &_actor1, &_actor2, NULL);
+ break;
+ case 1200:
+ _sceneMode = 3162;
+ setAction(&_sequenceManager, this, 3162, &R2_GLOBALS._player, NULL);
+ break;
+ case 3275: {
+ _sceneMode = 10;
+ R2_GLOBALS._player.setup(30, 3, 1);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.setPosition(Common::Point(-20, 180));
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+
+ Common::Point pt(80, 125);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ default:
+ if ((R2_GLOBALS._v56AA0 == 1) && (R2_INVENTORY.getObjectScene(35) == 2000) && (R2_GLOBALS._player._oldCharacterScene[1] == 3100)) {
+ ++R2_GLOBALS._v56AA0;
+ _sceneMode = 3156;
+ _actor1.postInit();
+ _actor1._effect = 6;
+ _actor1._shade = 3;
+
+ _actor2.postInit();
+ _actor5.postInit();
+ _actor5._effect = 6;
+ _actor5._shade = 3;
+
+ setAction(&_sequenceManager, this, 3156, &R2_GLOBALS._player, &_actor1, &_actor2, &_actor5, NULL);
+ } else {
+ if (R2_GLOBALS._v56AA0 != 2)
+ ++R2_GLOBALS._v56AA0;
+
+ R2_GLOBALS._player.setup(30, 3, 1);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.setPosition(Common::Point(155, 120));
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ R2_GLOBALS._player.enableControl();
+ }
+ }
+
+ R2_GLOBALS._player._oldCharacterScene[3] = 3150;
+}
+
+void Scene3150::signal() {
+ switch (_sceneMode) {
+ case 11:
+ R2_GLOBALS._sceneManager.changeScene(3275);
+ break;
+ case 12:
+ R2_GLOBALS._sceneManager.changeScene(1200);
+ break;
+ case 3151:
+ _actor1.remove();
+ R2_INVENTORY.setObjectScene(41, 3);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 3153:
+ R2_GLOBALS.setFlag(76);
+ _actor4.setDetails(3150, 14, -1, -1, 3, (SceneItem *)NULL);
+ _actor1.postInit();
+ _actor1.setDetails(3150, 24, -1, -1, 2, (SceneItem *)NULL);
+ _sceneMode = 3161;
+ setAction(&_sequenceManager, this, 3161, &_actor1, &_actor2, NULL);
+ break;
+ case 3154:
+ _actor3.remove();
+ R2_INVENTORY.setObjectScene(47, 3);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 3155:
+ R2_INVENTORY.setObjectScene(40, 3150);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 3156:
+ _actor5.setDetails(3150, 30, -1, -1, 2, (SceneItem *)NULL);
+ R2_INVENTORY.setObjectScene(42, 3150);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 3157:
+ _actor5.remove();
+ R2_INVENTORY.setObjectScene(42, 3);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 3158:
+ R2_GLOBALS.setFlag(75);
+ R2_INVENTORY.setObjectScene(41, 3150);
+ _actor4.fixPriority(110);
+ _actor4.setDetails(3150, 13, -1, -1, 2, (SceneItem *)NULL);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 3159:
+ R2_GLOBALS.setFlag(77);
+ R2_INVENTORY.setObjectScene(42, 3150);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 3160:
+ R2_INVENTORY.setObjectScene(52, 3150);
+ R2_GLOBALS.setFlag(80);
+ R2_GLOBALS._sceneManager.changeScene(1200);
+ break;
+ case 3161:
+ R2_GLOBALS._sceneItems.remove(&_actor2);
+ _exit1.setDetails(Rect(0, 135, 60, 168), EXITCURSOR_SW, 3275);
+ _exit1.setDest(Common::Point(70, 125));
+ R2_GLOBALS._walkRegions.enableRegion(1);
+ R2_GLOBALS._walkRegions.enableRegion(4);
+ R2_GLOBALS._walkRegions.enableRegion(5);
+ R2_GLOBALS._walkRegions.enableRegion(6);
+ R2_GLOBALS.setFlag(78);
+ R2_GLOBALS._player.enableControl();
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene3150::dispatch() {
+ if (_actor5._position.x == 155) {
+ _actor5._effect = 0;
+ _actor5._shade = 0;
+ }
+
+ if (_actor1._visage == 3154) {
+ _actor1._effect = 0;
+ _actor1._shade = 0;
+ }
+
+ Scene::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3175 - Autopsy room
+ *
+ *--------------------------------------------------------------------------*/
+bool Scene3175::Item1::startAction(CursorType action, Event &event) {
+ Scene3175 *scene = (Scene3175 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (_useLineNum != -1) {
+ SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ return true;
+ }
+ break;
+ case CURSOR_LOOK:
+ if (_lookLineNum != -1) {
+ SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ return true;
+ }
+ break;
+ case CURSOR_TALK:
+ if (_talkLineNum != -1) {
+ SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ return true;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return scene->display(action, event);
+}
+
+bool Scene3175::Actor3::startAction(CursorType action, Event &event) {
+ Scene3175 *scene = (Scene3175 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (_useLineNum != -1) {
+ SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ return true;
+ }
+ break;
+ case CURSOR_LOOK:
+ if (_lookLineNum != -1) {
+ SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ return true;
+ }
+ break;
+ case CURSOR_TALK:
+ if (_talkLineNum != -1) {
+ SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ return true;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return scene->display(action, event);
+}
+
+bool Scene3175::Actor1::startAction(CursorType action, Event &event) {
+ Scene3175 *scene = (Scene3175 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3176;
+ scene->setAction(&scene->_sequenceManager, scene, 3176, &R2_GLOBALS._player, &scene->_actor1, NULL);
+ return true;
+ break;
+ case CURSOR_LOOK:
+ SceneItem::display(3175, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ return true;
+ break;
+ case CURSOR_TALK:
+ SceneItem::display(3175, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ return true;
+ break;
+ default:
+ return SceneActor::startAction(action, event);
+ break;
+ }
+}
+
+void Scene3175::postInit(SceneObjectList *OwnerList) {
+ loadScene(3175);
+ SceneExt::postInit();
+
+ _actor1.postInit();
+ _actor1.setup(3175, 1, 1);
+ _actor1.setPosition(Common::Point(35, 72));
+ _actor1.setDetails(3175, 9, 10, -1, 1, (SceneItem *)NULL);
+
+ _actor2.postInit();
+ _actor2.setup(3175, 2, 1);
+ _actor2.setPosition(Common::Point(87, 148));
+
+ _actor3.postInit();
+ _actor3.setup(3175, 3, 1);
+ _actor3.setPosition(Common::Point(199, 117));
+ _actor3.setDetails(3175, 15, 16, 17, 1, (SceneItem *)NULL);
+
+ _item2.setDetails(12, 3175, 3, 1, 5);
+ _item3.setDetails(11, 3175, 6, 7, 8);
+ _item1.setDetails(Rect(0, 0, 320, 200), 3175, 0, 1, 2, 1, NULL);
+
+ R2_GLOBALS._player.postInit();
+
+ if (R2_GLOBALS._player._oldCharacterScene[3] == 3250) {
+ R2_GLOBALS._player.setup(30, 5, 1);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.setPosition(Common::Point(126, 77));
+ R2_GLOBALS._player.enableControl();
+ } else {
+ _sceneMode = 3175;
+ setAction(&_sequenceManager, this, 3175, &R2_GLOBALS._player, &_actor1, NULL);
+ }
+
+ R2_GLOBALS._player._oldCharacterScene[3] = 3175;
+}
+
+void Scene3175::signal() {
+ if (_sceneMode == 3176)
+ R2_GLOBALS._sceneManager.changeScene(3250);
+ else
+ R2_GLOBALS._player.enableControl();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3200 - Cutscene : Guards - Discussion
+ *
+ *--------------------------------------------------------------------------*/
+void Scene3200::postInit(SceneObjectList *OwnerList) {
+ loadScene(3200);
+ R2_GLOBALS._uiElements._active = false;
+ SceneExt::postInit();
+
+ _stripManager.addSpeaker(&_rockoSpeaker);
+ _stripManager.addSpeaker(&_jockoSpeaker);
+ _stripManager.addSpeaker(&_sockoSpeaker);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.hide();
+ R2_GLOBALS._player.disableControl();
+
+ _actor1.postInit();
+ _actor3.postInit();
+ _actor2.postInit();
+
+ setAction(&_sequenceManager, this, 3200 + R2_GLOBALS._randomSource.getRandomNumber(1), &_actor1, &_actor2, &_actor3, NULL);
+}
+
+void Scene3200::signal() {
+ R2_GLOBALS._sceneManager.changeScene(1200);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3210 - Cutscene : Captain and Private - Discussion
+ *
+ *--------------------------------------------------------------------------*/
+void Scene3210::postInit(SceneObjectList *OwnerList) {
+ loadScene(3210);
+ R2_GLOBALS._uiElements._active = false;
+ SceneExt::postInit();
+
+ _stripManager.addSpeaker(&_privateSpeaker);
+ _stripManager.addSpeaker(&_captainSpeaker);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.hide();
+ R2_GLOBALS._player.disableControl();
+
+ _actor1.postInit();
+ _actor2.postInit();
+
+ setAction(&_sequenceManager, this, 3210 + R2_GLOBALS._randomSource.getRandomNumber(1), &_actor1, &_actor2, NULL);
+}
+
+void Scene3210::signal() {
+ R2_GLOBALS._sceneManager.changeScene(1200);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3220 - Cutscene : Guards in cargo zone
+ *
+ *--------------------------------------------------------------------------*/
+void Scene3220::postInit(SceneObjectList *OwnerList) {
+ loadScene(3220);
+ R2_GLOBALS._uiElements._active = false;
+ SceneExt::postInit();
+
+ _stripManager.addSpeaker(&_rockoSpeaker);
+ _stripManager.addSpeaker(&_jockoSpeaker);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.hide();
+ R2_GLOBALS._player.disableControl();
+
+ _actor1.postInit();
+ _actor2.postInit();
+
+ setAction(&_sequenceManager, this, 3220 + R2_GLOBALS._randomSource.getRandomNumber(1), &_actor1, &_actor2, NULL);
+}
+
+void Scene3220::signal() {
+ R2_GLOBALS._sceneManager.changeScene(1200);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3230 - Cutscene : Guards on duty
+ *
+ *--------------------------------------------------------------------------*/
+void Scene3230::postInit(SceneObjectList *OwnerList) {
+ loadScene(3230);
+ R2_GLOBALS._uiElements._active = false;
+ SceneExt::postInit();
+
+ _stripManager.addSpeaker(&_rockoSpeaker);
+ _stripManager.addSpeaker(&_jockoSpeaker);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.hide();
+ R2_GLOBALS._player.disableControl();
+
+ _actor1.postInit();
+ _actor2.postInit();
+ _actor3.postInit();
+
+ setAction(&_sequenceManager, this, 3230 + R2_GLOBALS._randomSource.getRandomNumber(1), &_actor1, &_actor2, &_actor3, NULL);
+}
+
+void Scene3230::signal() {
+ R2_GLOBALS._sceneManager.changeScene(1200);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3240 - Cutscene : Teal monolog
+ *
+ *--------------------------------------------------------------------------*/
+void Scene3240::postInit(SceneObjectList *OwnerList) {
+ loadScene(3240);
+ R2_GLOBALS._uiElements._active = false;
+ SceneExt::postInit();
+
+ _stripManager.addSpeaker(&_tealSpeaker);
+ _stripManager.addSpeaker(&_webbsterSpeaker);
+ _stripManager.addSpeaker(&_mirandaSpeaker);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.hide();
+ R2_GLOBALS._player.disableControl();
+
+ _actor1.postInit();
+ _actor2.postInit();
+
+ setAction(&_sequenceManager, this, 3240 + R2_GLOBALS._randomSource.getRandomNumber(1), &_actor1, &_actor2, NULL);
+}
+
+void Scene3240::signal() {
+ R2_GLOBALS._sceneManager.changeScene(1200);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3245 - Cutscene : Discussions with Dr. Tomko
+ *
+ *--------------------------------------------------------------------------*/
+void Scene3245::postInit(SceneObjectList *OwnerList) {
+ loadScene(3245);
+ R2_GLOBALS._uiElements._active = false;
+ SceneExt::postInit();
+
+ _stripManager.addSpeaker(&_ralfSpeaker);
+ _stripManager.addSpeaker(&_tomkoSpeaker);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.hide();
+ R2_GLOBALS._player.disableControl();
+
+ _actor1.postInit();
+ _actor2.postInit();
+
+ if (R2_GLOBALS._v56AA1 < 4)
+ ++R2_GLOBALS._v56AA1;
+
+ if (R2_GLOBALS._v56AA1 >= 4) {
+ SceneItem::display(1200, 7, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ signal();
+ } else {
+ setAction(&_sequenceManager, this, 3244 + R2_GLOBALS._v56AA1, &_actor1, &_actor2, NULL);
+ }
+}
+
+void Scene3245::signal() {
+ R2_GLOBALS._sceneManager.changeScene(1200);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3250 - Room with large stasis field negator
+ *
+ *--------------------------------------------------------------------------*/
+bool Scene3250::Item::startAction(CursorType action, Event &event) {
+ Scene3250 *scene = (Scene3250 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (_useLineNum != -1) {
+ SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ return true;
+ }
+ break;
+ case CURSOR_LOOK:
+ if (_lookLineNum != -1) {
+ SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ return true;
+ }
+ break;
+ case CURSOR_TALK:
+ if (_talkLineNum != -1) {
+ SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ return true;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return scene->display(action, event);
+}
+
+bool Scene3250::Actor::startAction(CursorType action, Event &event) {
+ Scene3250 *scene = (Scene3250 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ R2_GLOBALS._player.disableControl();
+
+ switch(_position.x) {
+ case 25:
+ scene->_sceneMode = 3262;
+ scene->setAction(&scene->_sequenceManager, scene, 3262, &R2_GLOBALS._player, &scene->_actor1, NULL);
+ break;
+ case 259:
+ scene->_sceneMode = 3260;
+ scene->setAction(&scene->_sequenceManager, scene, 3260, &R2_GLOBALS._player, &scene->_actor2, NULL);
+ break;
+ case 302:
+ scene->_sceneMode = 3261;
+ scene->setAction(&scene->_sequenceManager, scene, 3261, &R2_GLOBALS._player, &scene->_actor3, NULL);
+ break;
+ default:
+ break;
+ }
+ return true;
+}
+
+void Scene3250::postInit(SceneObjectList *OwnerList) {
+ loadScene(3250);
+
+ if (R2_GLOBALS._sceneManager._previousScene == -1) {
+ R2_GLOBALS._player._oldCharacterScene[3] = 1200;
+ R2_GLOBALS._player._characterIndex = R2_MIRANDA;
+ }
+
+ SceneExt::postInit();
+ _actor1.postInit();
+ _actor1.setup(3250, 6, 1);
+ _actor1.setPosition(Common::Point(25, 148));
+ _actor1.fixPriority(10);
+ _actor1.setDetails(3250, 9, 10, -1, 1, (SceneItem *)NULL);
+
+ _actor2.postInit();
+ _actor2.setup(3250, 4, 1);
+ _actor2.setPosition(Common::Point(259, 126));
+ _actor2.fixPriority(10);
+ _actor2.setDetails(3250, 9, 10, -1, 1, (SceneItem *)NULL);
+
+ _actor3.postInit();
+ _actor3.setup(3250, 5, 1);
+ _actor3.setPosition(Common::Point(302, 138));
+ _actor3.fixPriority(10);
+ _actor3.setDetails(3250, 9, 10, -1, 1, (SceneItem *)NULL);
+
+ _item3.setDetails(Rect(119, 111, 149, 168), 3250, 6, 7, 2, 1, NULL);
+ _item2.setDetails(Rect(58, 85, 231, 138), 3250, 12, 7, 2, 1, NULL);
+ _item4.setDetails(12, 3250, 3, 1, 2);
+ _item1.setDetails(Rect(0, 0, 320, 200), 3250, 0, 1, 2, 1, NULL);
+
+ R2_GLOBALS._player.postInit();
+
+ switch (R2_GLOBALS._player._oldCharacterScene[3]) {
+ case 1200:
+ _sceneMode = 3250;
+ _actor4.postInit();
+ R2_GLOBALS._player._effect = 0;
+ setAction(&_sequenceManager, this, 3250, &R2_GLOBALS._player, &_actor4, NULL);
+ break;
+ case 3125:
+ if (R2_GLOBALS.getFlag(79)) {
+ _sceneMode = 3254;
+ _actor5.postInit();
+ _actor5._effect = 1;
+ _actor6.postInit();
+ _actor6._effect = 1;
+ _actor7.postInit();
+ _actor7._effect = 1;
+ setAction(&_sequenceManager, this, 3254, &R2_GLOBALS._player, &_actor3, &_actor5, &_actor6, &_actor7, &_actor1, NULL);
+ } else {
+ _sceneMode = 3252;
+ setAction(&_sequenceManager, this, 3252, &R2_GLOBALS._player, &_actor3, NULL);
+ }
+ break;
+ case 3175:
+ _sceneMode = 3251;
+ setAction(&_sequenceManager, this, 3251, &R2_GLOBALS._player, &_actor2, NULL);
+ break;
+ case 3255:
+ _sceneMode = 3253;
+ setAction(&_sequenceManager, this, 3253, &R2_GLOBALS._player, &_actor1, NULL);
+ break;
+ default:
+ R2_GLOBALS._player.setup(31, 3, 1);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.setPosition(Common::Point(185, 150));
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+
+ R2_GLOBALS._player._oldCharacterScene[3] = 3250;
+}
+
+void Scene3250::signal() {
+ switch(_sceneMode) {
+ case 3250:
+ R2_GLOBALS._player._effect = 1;
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 3254:
+ //No break on purpose
+ case 3262:
+ R2_GLOBALS._sceneManager.changeScene(3255);
+ break;
+ case 3260:
+ R2_GLOBALS._sceneManager.changeScene(3175);
+ break;
+ case 3261:
+ R2_GLOBALS._sceneManager.changeScene(3125);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene3250::dispatch() {
+ if ((R2_GLOBALS._player._visage == 3250) && (R2_GLOBALS._player._strip == 3) && (R2_GLOBALS._player._effect == 0)) {
+ R2_GLOBALS._player._effect = 6;
+ R2_GLOBALS._player._shade = 6;
+ }
+
+ Scene::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3255 -
+ *
+ *--------------------------------------------------------------------------*/
+void Scene3255::postInit(SceneObjectList *OwnerList) {
+ loadScene(3255);
+ SceneExt::postInit();
+
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_mirandaSpeaker);
+
+ if (R2_GLOBALS._sceneManager._previousScene == -1)
+ R2_GLOBALS.setFlag(79);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_GLOBALS.getFlag(79)) {
+ R2_GLOBALS._sound1.play(267);
+ R2_GLOBALS._sound2.play(268);
+ _sceneMode = 3257;
+ _actor3.postInit();
+ _actor4.postInit();
+ _actor4._effect = 1;
+ setAction(&_sequenceManager, this, 3257, &R2_GLOBALS._player, &_actor4, &_actor3, NULL);
+ } else {
+ _actor1.postInit();
+ _actor1.setup(303, 1, 1);
+ _actor1.setPosition(Common::Point(208, 128));
+ _actor2.postInit();
+ _actor2.setup(3107, 3, 1);
+ _actor2.setPosition(Common::Point(230, 127));
+ _sceneMode = 3255;
+ setAction(&_sequenceManager, this, 3255, &R2_GLOBALS._player, NULL);
+ }
+ R2_GLOBALS._player._oldCharacterScene[3] = 3255;
+}
+
+void Scene3255::signal() {
+ switch (_sceneMode) {
+ case 10:
+ _sceneMode = 3258;
+ _actor5.postInit();
+ _actor6.postInit();
+ _actor7.postInit();
+ setAction(&_sequenceManager, this, 3258, &R2_GLOBALS._player, &_actor4, &_actor3, &_actor5, &_actor6, &_actor7, NULL);
+ break;
+ case 3256:
+ R2_GLOBALS._sceneManager.changeScene(3250);
+ break;
+ case 3257:
+ _sceneMode = 10;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _stripManager.start(607, this);
+ break;
+ case 3258:
+ R2_GLOBALS._sceneManager.changeScene(3100);
+ break;
+ default:
+ SceneItem::display(3255, 0, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ _sceneMode = 3256;
+ setAction(&_sequenceManager, this, 3256, &R2_GLOBALS._player, NULL);
+ }
+}
+
+void Scene3255::dispatch() {
+ if (R2_GLOBALS.getFlag(79)) {
+ if (_actor5._position.y >= 95) {
+ if (_actor5._position.y <= 110)
+ _actor5._shade = 6 - (_actor5._position.y - 95) / 3;
+ else
+ _actor5._effect = 1;
+ } else {
+ _actor5._effect = 6;
+ _actor5._shade = 6;
+ }
+
+ if (_actor6._position.y >= 95) {
+ if (_actor6._position.y <= 110)
+ _actor6._shade = 6 - (_actor6._position.y - 95) / 3;
+ else
+ _actor6._effect = 1;
+ } else {
+ _actor6._effect = 6;
+ _actor6._shade = 6;
+ }
+
+ if (_actor7._position.y >= 95) {
+ if (_actor7._position.y <= 110)
+ _actor7._shade = 6 - (_actor7._position.y - 95) / 3;
+ else
+ _actor7._effect = 1;
+ } else {
+ _actor7._effect = 6;
+ _actor7._shade = 6;
+ }
+ }
+
+ if ((R2_GLOBALS._player._position.x > 250) && (R2_GLOBALS._player._shade == 1)) {
+ R2_GLOBALS._player._effect = 6;
+ _actor4._effect = 6;
+ }
+ Scene::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3260 - Computer room
+ *
+ *--------------------------------------------------------------------------*/
+bool Scene3260::Actor13::startAction(CursorType action, Event &event) {
+ Scene3260 *scene = (Scene3260 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3271;
+ scene->setAction(&scene->_sequenceManager, scene, 3271, &R2_GLOBALS._player, &scene->_actor13, NULL);
+ return true;
+}
+
+bool Scene3260::Actor14::startAction(CursorType action, Event &event) {
+ Scene3260 *scene = (Scene3260 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3272;
+ scene->setAction(&scene->_sequenceManager, scene, 3272, &R2_GLOBALS._player, &scene->_actor14, NULL);
+ return true;
+}
+
+void Scene3260::Action1::signal() {
+ SceneObjectExt *fmtObj = (SceneObjectExt *) _endHandler;
+
+ fmtObj->setFrame(R2_GLOBALS._randomSource.getRandomNumber(6));
+ setDelay(120 + R2_GLOBALS._randomSource.getRandomNumber(179));
+}
+
+void Scene3260::postInit(SceneObjectList *OwnerList) {
+ loadScene(3260);
+ R2_GLOBALS._player._characterIndex = R2_MIRANDA;
+ SceneExt::postInit();
+ R2_GLOBALS._sound1.play(285);
+
+ _actor13.postInit();
+ _actor13.setup(3260, 6, 1);
+ _actor13.setPosition(Common::Point(40, 106));
+ _actor13.setDetails(3260, 18, 1, -1, 1, (SceneItem *)NULL);
+
+ if (R2_INVENTORY.getObjectScene(52) == 3260) {
+ _actor14.postInit();
+ _actor14.setup(3260, 7, 1);
+ _actor14.setPosition(Common::Point(202, 66));
+ _actor14.setDetails(3260, 12, 1, -1, 1, (SceneItem *)NULL);
+ }
+
+ _actor1.postInit();
+ _actor1.setup(3260, 1, 1);
+ _actor1.setPosition(Common::Point(93, 73));
+ _actor1.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
+ _actor1.setAction(&_action1, &_actor1);
+
+ _actor2.postInit();
+ _actor2.setup(3260, 2, 1);
+ _actor2.setPosition(Common::Point(142, 63));
+ _actor2.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
+ _actor2.setAction(&_action2, &_actor2);
+
+ _actor3.postInit();
+ _actor3.setup(3260, 2, 1);
+ _actor3.setPosition(Common::Point(166, 54));
+ _actor3.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
+ _actor3.setAction(&_action3, &_actor3);
+
+ _actor4.postInit();
+ _actor4.setup(3260, 2, 1);
+ _actor4.setPosition(Common::Point(190, 46));
+ _actor4.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
+ _actor4.setAction(&_action4, &_actor4);
+
+ _actor5.postInit();
+ _actor5.setup(3260, 2, 1);
+ _actor5.setPosition(Common::Point(142, 39));
+ _actor5.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
+ _actor5.setAction(&_action5, &_actor5);
+
+ _actor6.postInit();
+ _actor6.setup(3260, 2, 1);
+ _actor6.setPosition(Common::Point(166, 30));
+ _actor6.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
+ _actor6.setAction(&_action6, &_actor6);
+
+ _actor7.postInit();
+ _actor7.setup(3260, 2, 1);
+ _actor7.setPosition(Common::Point(190, 22));
+ _actor7.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
+ _actor7.setAction(&_action7, &_actor7);
+
+ _actor8.postInit();
+ _actor8.setup(3260, 2, 1);
+ _actor8.setPosition(Common::Point(142, 14));
+ _actor8.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
+ _actor8.setAction(&_action8, &_actor8);
+
+ _actor9.postInit();
+ _actor9.setup(3260, 2, 1);
+ _actor9.setPosition(Common::Point(166, 6));
+ _actor9.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
+ _actor9.setAction(&_action9, &_actor9);
+
+ _actor10.postInit();
+ _actor10.setup(3260, 3, 1);
+ _actor10.setPosition(Common::Point(265, 163));
+ _actor10.fixPriority(180);
+ _actor10._numFrames = 10;
+ _actor10.setDetails(3260, 6, 1, 8, 1, (SceneItem *)NULL);
+ _actor10.animate(ANIM_MODE_2, NULL);
+
+ _actor11.postInit();
+ _actor11.setup(3260, 4, 1);
+ _actor11.setPosition(Common::Point(127, 108));
+ _actor11.fixPriority(120);
+ _actor11.setAction(&_action11, &_actor11);
+ _actor11._numFrames = 15;
+ _actor11.setDetails(3260, 6, 1, 8, 1, (SceneItem *)NULL);
+ _actor11.animate(ANIM_MODE_2, NULL);
+
+ _actor12.postInit();
+ _actor12.setup(3260, 5, 1);
+ _actor12.setPosition(Common::Point(274, 65));
+ _actor12.setAction(&_action12, &_actor12);
+ _actor12._numFrames = 5;
+ _actor12.setDetails(3260, 9, 1, 11, 1, (SceneItem *)NULL);
+ _actor12.animate(ANIM_MODE_2, NULL);
+
+ _item1.setDetails(Rect(0, 0, 320, 200), 3260, 0, 1, 2, 1, NULL);
+ R2_GLOBALS._player.postInit();
+
+ if (R2_GLOBALS._player._oldCharacterScene[3] == 3275) {
+ _sceneMode = 3270;
+ setAction(&_sequenceManager, this, 3270, &R2_GLOBALS._player, &_actor13, NULL);
+ } else {
+ R2_GLOBALS._player.setup(30, 5, 1);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.setPosition(Common::Point(53, 113));
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ R2_GLOBALS._player.enableControl();
+ }
+ R2_GLOBALS._player._oldCharacterScene[3] = 3260;
+}
+
+void Scene3260::remove() {
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene3260::signal() {
+ switch (_sceneMode) {
+ case 3271:
+ R2_GLOBALS._sceneManager.changeScene(3275);
+ break;
+ case 3272:
+ _sceneMode = 3273;
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ SceneItem::display(3260, 15, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
+ R2_GLOBALS._player.disableControl();
+ R2_INVENTORY.setObjectScene(52, 3);
+ R2_INVENTORY.setObjectScene(43, 3);
+ setAction(&_sequenceManager, this, 3273, &R2_GLOBALS._player, &_actor14, NULL);
+ break;
+ case 3273:
+ _actor4.remove();
+ R2_GLOBALS._player.enableControl();
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3275 - Hall
+ *
+ *--------------------------------------------------------------------------*/
+bool Scene3275::Actor2::startAction(CursorType action, Event &event) {
+ Scene3275 *scene = (Scene3275 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3275;
+ scene->setAction(&scene->_sequenceManager, scene, 3275, &R2_GLOBALS._player, &scene->_actor2, NULL);
+ return true;
+}
+
+void Scene3275::Exit1::changeScene() {
+ Scene3275 *scene = (Scene3275 *)R2_GLOBALS._sceneManager._scene;
+
+ scene->_sceneMode = 0;
+ g_globals->_events.setCursor(CURSOR_ARROW);
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 10;
+ Common::Point pt(418, 118);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene3275::postInit(SceneObjectList *OwnerList) {
+ loadScene(3275);
+
+ if (R2_GLOBALS._sceneManager._previousScene == -1)
+ R2_GLOBALS._sceneManager._previousScene = 3260;
+
+ if (R2_GLOBALS._sceneManager._previousScene == 3150)
+ g_globals->gfxManager()._bounds.moveTo(Common::Point(160, 0));
+ else
+ g_globals->gfxManager()._bounds.moveTo(Common::Point(0, 0));
+
+ SceneExt::postInit();
+ _exit1.setDetails(Rect(398, 60, 439, 118), SHADECURSOR_UP, 3150);
+ _exit1.setDest(Common::Point(418, 128));
+
+ _actor1.postInit();
+ _actor1.setup(3275, 1, 7);
+ _actor1.setPosition(Common::Point(419, 119));
+
+ _actor2.postInit();
+ _actor2.setup(3275, 2, 1);
+ _actor2.setPosition(Common::Point(56, 118));
+ _actor2.setDetails(3275, 3, 4, -1, 1, (SceneItem *)NULL);
+
+ _item2.setDetails(Rect(153, 58, 200, 120), 3275, 6, 7, 8, 1, NULL);
+ _item3.setDetails(Rect(275, 58, 331, 120), 3275, 6, 7, 8, 1, NULL);
+ _item4.setDetails(Rect(0, 66, 22, 127), 3275, 9, 10, 11, 1, NULL);
+ _item5.setDetails(Rect(457, 66, 480, 127), 3275, 9, 10, 11, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 480, 200), 3275, 0, 1, 2, 1, NULL);
+
+ R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.disableControl();
+ if (R2_GLOBALS._player._oldCharacterScene[3] == 3150) {
+ _sceneMode = 11;
+ R2_GLOBALS._player.setup(30, 3, 1);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.setPosition(Common::Point(418, 118));
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ Common::Point pt(418, 128);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else if (R2_GLOBALS._player._oldCharacterScene[3] == 3260) {
+ _sceneMode = 3276;
+ setAction(&_sequenceManager, this, 3276, &R2_GLOBALS._player, &_actor2, NULL);
+ } else {
+ R2_GLOBALS._player.setup(30, 3, 1);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.setPosition(Common::Point(245, 135));
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ R2_GLOBALS._player.enableControl();
+ }
+ R2_GLOBALS._player._oldCharacterScene[3] = 3275;
+}
+
+void Scene3275::signal() {
+ switch (_sceneMode) {
+ case 10:
+ R2_GLOBALS._sceneManager.changeScene(3150);
+ break;
+ case 3275:
+ R2_GLOBALS._sceneManager.changeScene(3260);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3350 - Cutscene - Ship landing
+ *
+ *--------------------------------------------------------------------------*/
+void Scene3350::postInit(SceneObjectList *OwnerList) {
+ loadScene(3350);
+ R2_GLOBALS._uiElements._active = false;
+ SceneExt::postInit();
+ R2_GLOBALS._sound2.play(310);
+
+ _rotation = R2_GLOBALS._scenePalette.addRotation(176, 203, 1);
+ _rotation->setDelay(3);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.hide();
+ R2_GLOBALS._player.disableControl();
+
+ _actor1.postInit();
+ _actor1.hide();
+ _actor2.postInit();
+ _actor2.hide();
+ _actor3.postInit();
+ _actor3.hide();
+ _actor4.postInit();
+ _actor4.hide();
+ _actor9.postInit();
+ _actor9.hide();
+ _actor8.postInit();
+ _actor8.hide();
+ _actor5.postInit();
+ _actor5.hide();
+ _actor6.postInit();
+ _actor6.hide();
+ _actor7.postInit();
+ _actor7.hide();
+
+ _sceneMode = 3350;
+ setAction(&_sequenceManager, this, _sceneMode, &_actor5, &_actor6, &_actor7, NULL);
+}
+
+void Scene3350::remove() {
+ R2_GLOBALS._sound2.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene3350::signal() {
+ switch (_sceneMode) {
+ case 3350:
+ _sceneMode = 3351;
+ setAction(&_sequenceManager, this, 3351, &_actor4, &_actor9, &_actor8, NULL);
+ break;
+ case 3351:
+ _sceneMode = 3352;
+ setAction(&_sequenceManager, this, 3352, &_actor4, &R2_GLOBALS._player, &_actor1, &_actor2, &_actor3, NULL);
+ case 3352:
+ R2_GLOBALS._sceneManager.changeScene(3395);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3375 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene3375::Scene3375() {
+ _field1488 = _field1492 = 0;
+ for (int i = 0; i < 4; ++i)
+ _field148A[i] = 0;
+}
+
+void Scene3375::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field1488);
+ s.syncAsSint16LE(_field1492);
+ for (int i = 0; i < 4; ++i)
+ s.syncAsSint16LE(_field148A[i]);
+}
+
+void Scene3375::subFC696(int sceneMode) {
+ switch (sceneMode) {
+ case 3379:
+ R2_GLOBALS._player.setPosition(Common::Point(0, 155));
+ _actor1.setPosition(Common::Point(-20, 163));
+ _actor2.setPosition(Common::Point(-5, 150));
+ _actor3.setPosition(Common::Point(-20, 152));
+ break;
+ case 3380:
+ ++R2_GLOBALS._v56A9E;
+ if (R2_GLOBALS._v56A9E >= 4)
+ R2_GLOBALS._v56A9E = 0;
+
+ loadScene(_field148A[R2_GLOBALS._v56A9E]);
+
+ R2_GLOBALS._uiElements.show();
+ R2_GLOBALS._player.setStrip(4);
+ R2_GLOBALS._player.setPosition(Common::Point(148, 230));
+
+ _actor1.setPosition(Common::Point(191, 274));
+ _actor1._effect = 1;
+ _actor2.setPosition(Common::Point(124, 255));
+ _actor2._effect = 1;
+ _actor3.setPosition(Common::Point(155, 245));
+ _actor3._effect = 1;
+ break;
+ case 3381:
+ --R2_GLOBALS._v56A9E;
+ if (R2_GLOBALS._v56A9E < 0)
+ R2_GLOBALS._v56A9E = 3;
+
+ loadScene(_field148A[R2_GLOBALS._v56A9E]);
+
+ R2_GLOBALS._uiElements.show();
+ R2_GLOBALS._player.setStrip(6);
+ R2_GLOBALS._player.setPosition(Common::Point(201, 131));
+
+ _actor1.setPosition(Common::Point(231, 127));
+ _actor1._effect = 1;
+ _actor2.setPosition(Common::Point(231, 127));
+ _actor2._effect = 1;
+ _actor3.setPosition(Common::Point(231, 127));
+ _actor3._effect = 1;
+ break;
+ default:
+ R2_GLOBALS._player.setPosition(Common::Point(192, 155));
+
+ _actor1.setPosition(Common::Point(138, 134));
+ _actor2.setPosition(Common::Point(110, 139));
+ _actor3.setPosition(Common::Point(125, 142));
+ break;
+ }
+
+ if (R2_GLOBALS._v56A9E == 2) {
+ R2_GLOBALS._sceneItems.remove(&_actor4);
+ for (int i = 0; i <= 12; i++)
+ R2_GLOBALS._sceneItems.remove(&_itemArray[i]);
+ R2_GLOBALS._sceneItems.remove(&_item1);
+
+ _actor4.show();
+ _actor4.setDetails(3375, 9, 10, -1, 1, (SceneItem *)NULL);
+
+ for (int i = 0; i <= 12; i++)
+ _itemArray[i].setDetails(3375, 3, -1, -1);
+
+ _item1.setDetails(Rect(0, 0, 320, 200), 3375, 0, -1, -1, 1, NULL);
+ } else {
+ _actor4.hide();
+ R2_GLOBALS._sceneItems.remove(&_actor4);
+ }
+
+ if (_sceneMode == 0)
+ signal();
+ else
+ setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, &_actor1, &_actor2, &_actor3, NULL);
+}
+
+bool Scene3375::Actor1::startAction(CursorType action, Event &event) {
+ Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_TALK)
+ return SceneActor::startAction(action, event);
+
+ scene->_sceneMode = 9999;
+ if (R2_GLOBALS._player._characterIndex == 2)
+ scene->_stripManager.start(3302, scene);
+ else
+ scene->_stripManager.start(3304, scene);
+
+ return true;
+}
+
+bool Scene3375::Actor2::startAction(CursorType action, Event &event) {
+ Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_TALK)
+ return SceneActor::startAction(action, event);
+
+ scene->_sceneMode = 9999;
+ if (R2_GLOBALS._player._characterIndex == 3)
+ scene->_stripManager.start(3302, scene);
+ else
+ scene->_stripManager.start(3301, scene);
+
+ return true;
+}
+
+bool Scene3375::Actor3::startAction(CursorType action, Event &event) {
+ Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_TALK)
+ return SceneActor::startAction(action, event);
+
+ scene->_sceneMode = 9999;
+ scene->_stripManager.start(3303, scene);
+
+ return true;
+}
+
+bool Scene3375::Actor4::startAction(CursorType action, Event &event) {
+ Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ if (R2_GLOBALS._v56A9E != 0) {
+ R2_GLOBALS._walkRegions.disableRegion(2);
+ R2_GLOBALS._walkRegions.disableRegion(3);
+ } else {
+ R2_GLOBALS._walkRegions.disableRegion(1);
+ R2_GLOBALS._walkRegions.disableRegion(3);
+ R2_GLOBALS._walkRegions.disableRegion(4);
+ }
+ R2_GLOBALS._walkRegions.disableRegion(6);
+ R2_GLOBALS._walkRegions.disableRegion(7);
+ R2_GLOBALS._walkRegions.disableRegion(8);
+
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+
+ scene->_sceneMode = 3375;
+ scene->setAction(&scene->_sequenceManager, scene, 3375, &R2_GLOBALS._player, &scene->_actor1, &scene->_actor2, &scene->_actor3, &scene->_actor4, NULL);
+
+ return true;
+}
+
+void Scene3375::Exit1::changeScene() {
+ Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
+
+ _moving = false;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ scene->_sceneMode = 3376;
+ if (R2_GLOBALS._v56A9E != 0) {
+ R2_GLOBALS._walkRegions.disableRegion(2);
+ R2_GLOBALS._walkRegions.disableRegion(3);
+ } else {
+ R2_GLOBALS._walkRegions.disableRegion(1);
+ R2_GLOBALS._walkRegions.disableRegion(3);
+ R2_GLOBALS._walkRegions.disableRegion(4);
+ }
+ if (scene->_actor1._position.y != 163) {
+ R2_GLOBALS._player.setStrip(-1);
+ scene->_actor1.setStrip2(-1);
+ scene->_actor2.setStrip2(-1);
+ scene->_actor3.setStrip2(-1);
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_actor1, &scene->_actor2, &scene->_actor3, NULL);
+ } else {
+ R2_GLOBALS._player.setStrip2(2);
+ scene->_actor1.setStrip2(2);
+ scene->_actor2.setStrip2(2);
+ scene->_actor3.setStrip2(2);
+ R2_GLOBALS._sound2.play(314);
+
+ Common::Point pt(50, 150);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ }
+}
+
+void Scene3375::Exit2::changeScene() {
+ Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
+
+ _moving = false;
+ R2_GLOBALS._player._effect = 6;
+ R2_GLOBALS._player._shade = 4;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+
+ scene->_sceneMode = 3377;
+ scene->_field1488 = 3381;
+
+ if (R2_GLOBALS._v56A9E != 0) {
+ R2_GLOBALS._walkRegions.disableRegion(2);
+ R2_GLOBALS._walkRegions.disableRegion(3);
+ } else {
+ R2_GLOBALS._walkRegions.disableRegion(1);
+ R2_GLOBALS._walkRegions.disableRegion(3);
+ R2_GLOBALS._walkRegions.disableRegion(4);
+ }
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_actor1, &scene->_actor2, &scene->_actor3, NULL);
+}
+
+void Scene3375::Exit3::changeScene() {
+ Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
+
+ _moving = false;
+ R2_GLOBALS._player._effect = 6;
+ R2_GLOBALS._player._shade = 4;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+
+ scene->_sceneMode = 3378;
+ scene->_field1488 = 3380;
+
+ if (R2_GLOBALS._v56A9E != 0) {
+ R2_GLOBALS._walkRegions.disableRegion(2);
+ R2_GLOBALS._walkRegions.disableRegion(3);
+ } else {
+ R2_GLOBALS._walkRegions.disableRegion(1);
+ R2_GLOBALS._walkRegions.disableRegion(3);
+ R2_GLOBALS._walkRegions.disableRegion(4);
+ }
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_actor1, &scene->_actor2, &scene->_actor3, NULL);
+}
+
+void Scene3375::postInit(SceneObjectList *OwnerList) {
+ _field148A[0] = 3376;
+ _field148A[1] = 3377;
+ _field148A[2] = 3375;
+ _field148A[3] = 3378;
+
+ loadScene(_field148A[R2_GLOBALS._v56A9E]);
+ SceneExt::postInit();
+
+ R2_GLOBALS._sound1.play(313);
+
+ _stripManager.setColors(60, 255);
+ _stripManager.setFontNumber(3);
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_seekerSpeaker);
+ _stripManager.addSpeaker(&_mirandaSpeaker);
+ _stripManager.addSpeaker(&_webbsterSpeaker);
+
+ R2_GLOBALS._player._characterScene[1] = 3375;
+ R2_GLOBALS._player._characterScene[2] = 3375;
+ R2_GLOBALS._player._characterScene[3] = 3375;
+
+ setZoomPercents(126, 55, 200, 167);
+ R2_GLOBALS._player.postInit();
+
+ if (R2_GLOBALS._player._characterIndex == 2) {
+ R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
+ } else {
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ }
+ R2_GLOBALS._player.changeZoom(-1);
+
+ switch (R2_GLOBALS._player._characterIndex) {
+ case 2:
+ if (R2_GLOBALS._sceneManager._previousScene == 3385)
+ R2_GLOBALS._player.setup(20, 1, 1);
+ else
+ R2_GLOBALS._player.setup(20, 3, 1);
+ break;
+ case 3:
+ if (R2_GLOBALS._sceneManager._previousScene == 3385)
+ R2_GLOBALS._player.setup(30, 1, 1);
+ else
+ R2_GLOBALS._player.setup(30, 3, 1);
+ break;
+ default:
+ if (R2_GLOBALS._sceneManager._previousScene == 3385)
+ R2_GLOBALS._player.setup(10, 1, 1);
+ else
+ R2_GLOBALS._player.setup(10, 3, 1);
+ break;
+ }
+
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.disableControl();
+
+ _actor1.postInit();
+ if (R2_GLOBALS._player._characterIndex == 2) {
+ _actor1._moveRate = 10;
+ _actor1._moveDiff = Common::Point(3, 2);
+ } else {
+ _actor1._moveRate = 7;
+ _actor1._moveDiff = Common::Point(5, 3);
+ }
+ _actor1.changeZoom(-1);
+ _actor1._effect = 1;
+
+ int tmpStrip, tmpVisage;
+ if (R2_GLOBALS._sceneManager._previousScene == 3385)
+ tmpStrip = 1;
+ else
+ tmpStrip = 4;
+
+ if (R2_GLOBALS._player._characterIndex == 2)
+ tmpVisage = 10;
+ else
+ tmpVisage = 20;
+
+ _actor1.setup(tmpVisage, tmpStrip, 1);
+ _actor1.animate(ANIM_MODE_1, NULL);
+
+ _actor2.postInit();
+ _actor2._moveDiff = Common::Point(3, 2);
+ _actor2.changeZoom(-1);
+ _actor2._effect = 1;
+ if (R2_GLOBALS._sceneManager._previousScene == 3385)
+ tmpStrip = 1;
+ else
+ tmpStrip = 8;
+
+ if (R2_GLOBALS._player._characterIndex == 3)
+ tmpVisage = 10;
+ else
+ tmpVisage = 30;
+
+ _actor2.setup(tmpVisage, tmpStrip, 1);
+ _actor2.animate(ANIM_MODE_1, NULL);
+
+ _actor3.postInit();
+ _actor3._moveRate = 7;
+ _actor3._moveDiff = Common::Point(5, 3);
+ _actor3.changeZoom(-1);
+ _actor3._effect = 1;
+ if (R2_GLOBALS._sceneManager._previousScene == 3385)
+ tmpStrip = 1;
+ else
+ tmpStrip = 4;
+
+ _actor3.setup(40, tmpStrip, 1);
+ _actor3.animate(ANIM_MODE_1, NULL);
+
+ _actor2.setDetails(3375, -1, -1, -1, 1, (SceneItem *)NULL);
+ _actor3.setDetails(3375, 21, -1, -1, 1, (SceneItem *)NULL);
+ _actor1.setDetails(3375, -1, -1, -1, 1, (SceneItem *)NULL);
+
+ _actor4.postInit();
+ _actor4.setup(3375, 1, 1);
+ _actor4.setPosition(Common::Point(254, 166));
+ _actor4.fixPriority(140);
+ _actor4.hide();
+
+ _exit1.setDetails(Rect(0, 84, 24, 167), EXITCURSOR_W, 3375);
+ _exit1.setDest(Common::Point(65, 155));
+ _exit2.setDetails(Rect(103, 152, 183, 170), SHADECURSOR_DOWN, 3375);
+ _exit2.setDest(Common::Point(158, 151));
+ _exit3.setDetails(Rect(180, 75, 213, 132), EXITCURSOR_E, 3375);
+ _exit3.setDest(Common::Point(201, 131));
+
+ for (int i = 0; i <= 12; ++i)
+ _itemArray[i].setDetails(i, 3375, 3, -1, -1);
+
+ _item1.setDetails(Rect(0, 0, 320, 200), 3375, 0, -1, 1, 1, NULL);
+
+ if (R2_GLOBALS._sceneManager._previousScene == 3385)
+ _sceneMode = 3379;
+ else
+ _sceneMode = 0;
+
+ subFC696(_sceneMode);
+}
+
+void Scene3375::remove() {
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene3375::signalCase3379() {
+ switch (R2_GLOBALS._v56A9E) {
+ case 0:
+ _exit1._enabled = true;
+ if (R2_GLOBALS._sceneManager._previousScene == 3385)
+ R2_GLOBALS._walkRegions.enableRegion(1);
+ else {
+ R2_GLOBALS._walkRegions.enableRegion(3);
+ R2_GLOBALS._walkRegions.enableRegion(4);
+ }
+ R2_GLOBALS._walkRegions.enableRegion(6);
+ R2_GLOBALS._walkRegions.enableRegion(7);
+ case 2:
+ _exit1._enabled = false;
+ R2_GLOBALS._walkRegions.enableRegion(2);
+ R2_GLOBALS._walkRegions.enableRegion(3);
+ R2_GLOBALS._walkRegions.enableRegion(5);
+ R2_GLOBALS._walkRegions.enableRegion(6);
+ R2_GLOBALS._walkRegions.enableRegion(7);
+ R2_GLOBALS._walkRegions.enableRegion(8);
+ R2_GLOBALS._walkRegions.enableRegion(9);
+ default:
+ _exit1._enabled = false;
+ R2_GLOBALS._walkRegions.enableRegion(2);
+ R2_GLOBALS._walkRegions.enableRegion(3);
+ R2_GLOBALS._walkRegions.enableRegion(5);
+ R2_GLOBALS._walkRegions.enableRegion(6);
+ break;
+ }
+ R2_GLOBALS._sceneManager._previousScene = 3375;
+ R2_GLOBALS._player._effect = 1;
+ _actor1._effect = 1;
+ _actor2._effect = 1;
+ _actor3._effect = 1;
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+}
+
+void Scene3375::signal() {
+ switch (_sceneMode) {
+ case 3375:
+ R2_GLOBALS._sceneManager.changeScene(3400);
+ break;
+ case 3376:
+ R2_GLOBALS._sceneManager.changeScene(3385);
+ break;
+ case 3377:
+ // No break on purpose
+ case 3378:
+ _sceneMode = _field1488;
+ _field1488 = 0;
+ _actor1._effect = 6;
+ _actor1._shade = 4;
+ _actor2._effect = 6;
+ _actor2._shade = 4;
+ _actor3._effect = 6;
+ _actor3._shade = 4;
+ subFC696(_sceneMode);
+ break;
+ case 3379:
+ signalCase3379();
+ break;
+ case 9999:
+ if (_actor1._position.y == 163)
+ R2_GLOBALS._player.setStrip(1);
+ else
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.enableControl(CURSOR_TALK);
+ default:
+ _actor1.setPriority(130);
+ _actor2.setPriority(132);
+ _actor3.setPriority(134);
+ signalCase3379();
+ break;
+ }
+}
+
+void Scene3375::dispatch() {
+ if ((R2_GLOBALS._player._position.y >= 168) && (R2_GLOBALS._player._effect == 1))
+ R2_GLOBALS._player._effect = 6;
+ else if ((R2_GLOBALS._player._position.y < 168) && (R2_GLOBALS._player._effect == 6))
+ R2_GLOBALS._player._effect = 1;
+
+ if ((_actor1._position.y >= 168) && (_actor1._effect == 1))
+ _actor1._effect = 6;
+ else if ((_actor1._position.y < 168) && (_actor1._effect == 6))
+ _actor1._effect = 1;
+
+ if ((_actor2._position.y >= 168) && (_actor2._effect == 1))
+ _actor2._effect = 6;
+ else if ((_actor2._position.y < 168) && (_actor2._effect == 6))
+ _actor2._effect = 1;
+
+ if ((_actor3._position.y >= 168) && (_actor3._effect == 1))
+ _actor3._effect = 6;
+ else if ((_actor3._position.y < 168) && (_actor3._effect == 6))
+ _actor3._effect = 1;
+
+ Scene::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3385 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene3385::Scene3385() {
+ _field11B2 = 0;
+}
+
+void Scene3385::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field11B2);
+}
+
+bool Scene3385::Actor1::startAction(CursorType action, Event &event) {
+ Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_TALK)
+ return SceneActor::startAction(action, event);
+
+ scene->_sceneMode = 9999;
+ if (R2_GLOBALS._player._characterIndex == 2)
+ scene->_stripManager.start(3302, scene);
+ else
+ scene->_stripManager.start(3304, scene);
+
+ return true;
+}
+
+bool Scene3385::Actor2::startAction(CursorType action, Event &event) {
+ Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_TALK)
+ return SceneActor::startAction(action, event);
+
+ scene->_sceneMode = 9999;
+ if (R2_GLOBALS._player._characterIndex == 3)
+ scene->_stripManager.start(3302, scene);
+ else
+ scene->_stripManager.start(3301, scene);
+
+ return true;
+}
+
+bool Scene3385::Actor3::startAction(CursorType action, Event &event) {
+ Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_TALK)
+ return SceneActor::startAction(action, event);
+
+ scene->_sceneMode = 9999;
+ scene->_stripManager.start(3303, scene);
+
+ return true;
+}
+
+bool Scene3385::Actor4::startAction(CursorType action, Event &event) {
+ Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ if (R2_GLOBALS._sceneManager._previousScene == 3375)
+ R2_GLOBALS._sound2.play(314);
+
+ scene->_sceneMode = 3386;
+ scene->setAction(&scene->_sequenceManager, scene, 3386, &R2_GLOBALS._player, &scene->_actor1, &scene->_actor2, &scene->_actor3, &scene->_actor4, NULL);
+
+ return true;
+}
+
+void Scene3385::Exit1::changeScene() {
+ Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
+
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ scene->_sceneMode = 3387;
+
+ if (R2_GLOBALS._sceneManager._previousScene == 3375)
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_actor1, &scene->_actor2, &scene->_actor3, NULL);
+ else
+ scene->signal();
+}
+
+void Scene3385::Action1::signal() {
+ int v = _actionIndex;
+ ++_actionIndex;
+
+ if (v == 0)
+ setDelay(1);
+ else if (v == 1)
+ R2_GLOBALS._sound2.play(314);
+}
+
+void Scene3385::postInit(SceneObjectList *OwnerList) {
+ loadScene(3385);
+ SceneExt::postInit();
+
+ R2_GLOBALS._sound1.play(313);
+
+ _stripManager.setColors(60, 255);
+ _stripManager.setFontNumber(3);
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_seekerSpeaker);
+ _stripManager.addSpeaker(&_mirandaSpeaker);
+ _stripManager.addSpeaker(&_webbsterSpeaker);
+
+ R2_GLOBALS._player._characterScene[1] = 3385;
+ R2_GLOBALS._player._characterScene[2] = 3385;
+ R2_GLOBALS._player._characterScene[3] = 3385;
+
+ if (R2_GLOBALS._sceneManager._previousScene == 3375)
+ _field11B2 = 3;
+ else
+ _field11B2 = 4;
+
+ setZoomPercents(102, 40, 200, 160);
+ R2_GLOBALS._player.postInit();
+
+ if (R2_GLOBALS._player._characterIndex == 2)
+ R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
+ else
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+
+ R2_GLOBALS._player.changeZoom(-1);
+
+ if (R2_GLOBALS._player._characterIndex == 2)
+ R2_GLOBALS._player.setup(20, _field11B2, 1);
+ else if (R2_GLOBALS._player._characterIndex == 3)
+ R2_GLOBALS._player.setup(30, _field11B2, 1);
+ else
+ R2_GLOBALS._player.setup(10, _field11B2, 1);
+
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.disableControl();
+
+ _actor1.postInit();
+ if (R2_GLOBALS._player._characterIndex == 2) {
+ _actor1._moveRate = 10;
+ _actor1._moveDiff = Common::Point(3, 2);
+ } else {
+ _actor1._moveRate = 7;
+ _actor1._moveDiff = Common::Point(5, 3);
+ }
+ _actor1.changeZoom(-1);
+ _actor1._effect = 1;
+ if (R2_GLOBALS._player._characterIndex == 2)
+ _actor1.setup(10, _field11B2, 1);
+ else
+ _actor1.setup(20, _field11B2, 1);
+ _actor1.animate(ANIM_MODE_1, NULL);
+ _actor1.setDetails(3385, -1, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor2.postInit();
+ _actor2._moveDiff = Common::Point(3, 2);
+ _actor2.changeZoom(-1);
+ _actor2._effect = 1;
+ if (R2_GLOBALS._player._characterIndex == 3)
+ _actor2.setup(10, _field11B2, 1);
+ else
+ _actor2.setup(30, _field11B2, 1);
+ _actor2.animate(ANIM_MODE_1, NULL);
+ _actor2.setDetails(3385, -1, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor3.postInit();
+ _actor3._moveDiff = Common::Point(3, 2);
+ _actor3.changeZoom(-1);
+ _actor3._effect = 1;
+ _actor3.setup(40, _field11B2, 1);
+ _actor3.animate(ANIM_MODE_1, NULL);
+ _actor3.setDetails(3385, 15, -1, -1, 1, (SceneItem *) NULL);
+
+ _exit1.setDetails(Rect(103, 152, 217, 170), SHADECURSOR_DOWN, 3395);
+ _exit1.setDest(Common::Point(158, 151));
+
+ _actor4.postInit();
+ _actor4.setPosition(Common::Point(160, 100));
+ _actor4.fixPriority(90);
+ _actor4.setDetails(3385, 3, 4, -1, 1, (SceneItem *) NULL);
+
+ if (R2_GLOBALS._sceneManager._previousScene == 3375) {
+ R2_GLOBALS._player.setPosition(Common::Point(158, 102));
+ _actor1.setPosition(Common::Point(164, 100));
+ _actor1.fixPriority(98);
+ _actor2.setPosition(Common::Point(150, 100));
+ _actor2.fixPriority(97);
+ _actor3.setPosition(Common::Point(158, 100));
+ _actor3.fixPriority(96);
+ _sceneMode = 3384;
+ _actor4.setup(3385, 1, 6);
+ _actor4.animate(ANIM_MODE_6, this);
+ setAction(&_action1, &_actor4);
+ } else {
+ R2_GLOBALS._player.setPosition(Common::Point(158, 230));
+ _actor1.setPosition(Common::Point(191, 270));
+ _actor2.setPosition(Common::Point(124, 255));
+ _actor3.setPosition(Common::Point(155, 245));
+ _actor4.setup(3385, 1, 1);
+ _sceneMode = 3385;
+ setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, &_actor1, &_actor2, &_actor3, NULL);
+ }
+
+ _item1.setDetails(Rect(0, 0, 320, 200), 3385, 0, -1, -1, 1, NULL);
+ R2_GLOBALS._v56A9E = 0;
+}
+
+void Scene3385::remove() {
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene3385::signal() {
+ switch (_sceneMode) {
+ case 3386:
+ R2_GLOBALS._sceneManager.changeScene(3375);
+ break;
+ case 3387:
+ R2_GLOBALS._sceneManager.changeScene(3395);
+ break;
+ case 9999:
+ if (R2_GLOBALS._sceneManager._previousScene == 3375)
+ R2_GLOBALS._player.setStrip(3);
+ else
+ R2_GLOBALS._player.setStrip(4);
+ R2_GLOBALS._player.enableControl(CURSOR_TALK);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3395 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene3395::Scene3395() {
+ _field142E = 0;
+}
+
+void Scene3395::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field142E);
+}
+
+bool Scene3395::Actor1::startAction(CursorType action, Event &event) {
+ Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_TALK)
+ return SceneActor::startAction(action, event);
+
+ scene->_sceneMode = 9999;
+ if (R2_GLOBALS._player._characterIndex == 2)
+ scene->_stripManager.start(3302, scene);
+ else
+ scene->_stripManager.start(3304, scene);
+
+ return true;
+}
+
+bool Scene3395::Actor2::startAction(CursorType action, Event &event) {
+ Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_TALK)
+ return SceneActor::startAction(action, event);
+
+ scene->_sceneMode = 9999;
+ if (R2_GLOBALS._player._characterIndex == 3)
+ scene->_stripManager.start(3302, scene);
+ else
+ scene->_stripManager.start(3301, scene);
+
+ return true;
+}
+
+bool Scene3395::Actor3::startAction(CursorType action, Event &event) {
+ Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_TALK)
+ return SceneActor::startAction(action, event);
+
+ scene->_sceneMode = 9999;
+ scene->_stripManager.start(3303, scene);
+
+ return true;
+}
+
+bool Scene3395::Actor4::startAction(CursorType action, Event &event) {
+ Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action != CURSOR_USE)
+ return SceneActor::startAction(action, event);
+
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ if (R2_GLOBALS._sceneManager._previousScene == 3385)
+ R2_GLOBALS._sound2.play(314);
+
+ scene->_sceneMode = 3396;
+ scene->setAction(&scene->_sequenceManager, scene, 3396, &R2_GLOBALS._player, &scene->_actor1, &scene->_actor2, &scene->_actor3, &scene->_actor4, NULL);
+
+ return true;
+}
+
+void Scene3395::Action1::signal() {
+ int v = _actionIndex;
+ ++_actionIndex;
+
+ if (v == 0)
+ setDelay(2);
+ else if (v == 1)
+ R2_GLOBALS._sound2.play(314);
+}
+
+void Scene3395::postInit(SceneObjectList *OwnerList) {
+ loadScene(3395);
+ SceneExt::postInit();
+
+ R2_GLOBALS._sound1.play(313);
+
+ _stripManager.setColors(60, 255);
+ _stripManager.setFontNumber(3);
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_seekerSpeaker);
+ _stripManager.addSpeaker(&_mirandaSpeaker);
+ _stripManager.addSpeaker(&_webbsterSpeaker);
+
+ R2_GLOBALS._player._characterScene[1] = 3395;
+ R2_GLOBALS._player._characterScene[2] = 3395;
+ R2_GLOBALS._player._characterScene[3] = 3395;
+
+ if (R2_GLOBALS._sceneManager._previousScene == 3385)
+ _field142E = 3;
+ else
+ _field142E = 4;
+
+ setZoomPercents(51, 40, 200, 137);
+ R2_GLOBALS._player.postInit();
+
+ if (R2_GLOBALS._player._characterIndex == 2)
+ R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
+ else
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+
+ R2_GLOBALS._player.changeZoom(-1);
+
+ if (R2_GLOBALS._player._characterIndex == 2)
+ R2_GLOBALS._player.setup(20, _field142E, 1);
+ else if (R2_GLOBALS._player._characterIndex == 3)
+ R2_GLOBALS._player.setup(30, _field142E, 1);
+ else
+ R2_GLOBALS._player.setup(10, _field142E, 1);
+
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.disableControl();
+
+ _actor1.postInit();
+ if (R2_GLOBALS._player._characterIndex == 2) {
+ _actor1._moveRate = 10;
+ _actor1._moveDiff = Common::Point(3, 2);
+ } else {
+ _actor1._moveRate = 7;
+ _actor1._moveDiff = Common::Point(5, 3);
+ }
+ _actor1.changeZoom(-1);
+ _actor1._effect = 1;
+ if (R2_GLOBALS._player._characterIndex == 2)
+ _actor1.setup(10, _field142E, 1);
+ else
+ _actor1.setup(20, _field142E, 1);
+ _actor1.animate(ANIM_MODE_1, NULL);
+ _actor1.setDetails(3395, -1, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor2.postInit();
+ _actor2._moveDiff = Common::Point(3, 2);
+ _actor2.changeZoom(-1);
+ _actor2._effect = 1;
+ if (R2_GLOBALS._player._characterIndex == 3)
+ _actor2.setup(10, _field142E, 1);
+ else
+ _actor2.setup(30, _field142E, 1);
+ _actor2.animate(ANIM_MODE_1, NULL);
+ _actor2.setDetails(3395, -1, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor3.postInit();
+ _actor3._moveDiff = Common::Point(3, 2);
+ _actor3.changeZoom(-1);
+ _actor3._effect = 1;
+ _actor3.setup(40, _field142E, 1);
+ _actor3.animate(ANIM_MODE_1, NULL);
+ _actor3.setDetails(3385, 18, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor4.postInit();
+ _actor4.setPosition(Common::Point(159, 50));
+ _actor4.fixPriority(40);
+ _actor4.setDetails(3395, 6, 7, -1, 1, (SceneItem *) NULL);
+
+ if (R2_GLOBALS._sceneManager._previousScene == 3385) {
+ R2_GLOBALS._player.setPosition(Common::Point(158, 53));
+ _actor1.setPosition(Common::Point(164, 51));
+ _actor1.fixPriority(48);
+ _actor2.setPosition(Common::Point(150, 51));
+ _actor2.fixPriority(47);
+ _actor3.setPosition(Common::Point(158, 51));
+ _actor3.fixPriority(46);
+ _sceneMode = 3394;
+ _actor4.setup(3395, 1, 7);
+ _actor4.animate(ANIM_MODE_6, this);
+ setAction(&_action1, &_actor4);
+ } else {
+ R2_GLOBALS._player.setPosition(Common::Point(158, 200));
+ _actor1.setPosition(Common::Point(191, 255));
+ _actor2.setPosition(Common::Point(124, 240));
+ _actor3.setPosition(Common::Point(155, 242));
+ _actor4.setup(3395, 1, 1);
+
+ R2_GLOBALS._walkRegions.enableRegion(1);
+
+ _sceneMode = 3395;
+ setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, &_actor1, &_actor2, &_actor3, NULL);
+ }
+
+ for (int i = 0; i <= 12; i++) {
+ _itemArray[i].setDetails(i, 3995, 0, -1, -1);
+ }
+
+ _item1.setDetails(Rect(0, 0, 320, 200), 3395, 3, -1, -1, 1, NULL);
+}
+
+void Scene3395::remove() {
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene3395::signal() {
+ switch (_sceneMode) {
+ case 3396:
+ R2_GLOBALS._sceneManager.changeScene(3385);
+ break;
+ case 9999:
+ if (R2_GLOBALS._sceneManager._previousScene == 3385)
+ R2_GLOBALS._player.setStrip(3);
+ else
+ R2_GLOBALS._player.setStrip(4);
+ R2_GLOBALS._player.enableControl(CURSOR_TALK);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3400 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene3400::Scene3400() {
+ _field157C = 0;
+}
+
+void Scene3400::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field157C);
+}
+
+void Scene3400::postInit(SceneObjectList *OwnerList) {
+ R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
+ g_globals->gfxManager()._bounds.moveTo(Common::Point(160, 0));
+ loadScene(3400);
+ _field157C = 0;
+ R2_GLOBALS._v558B6.set(60, 0, 260, 200);
+ SceneExt::postInit();
+ R2_GLOBALS._sound1.play(317);
+
+ _stripManager.setColors(60, 255);
+ _stripManager.setFontNumber(3);
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_seekerSpeaker);
+ _stripManager.addSpeaker(&_mirandaSpeaker);
+ _stripManager.addSpeaker(&_webbsterSpeaker);
+ _stripManager.addSpeaker(&_tealSpeaker);
+
+ setZoomPercents(51, 46, 180, 200);
+ R2_GLOBALS._player._characterScene[1] = 3400;
+ R2_GLOBALS._player._characterScene[2] = 3400;
+ R2_GLOBALS._player._characterScene[3] = 3400;
+
+ _actor7.postInit();
+ _actor7.setup(3403, 1, 1);
+ _actor7.setPosition(Common::Point(190, 103));
+ _actor7.fixPriority(89);
+
+ R2_GLOBALS._player.postInit();
+ if (R2_GLOBALS._player._characterIndex == 2)
+ R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
+ else
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ R2_GLOBALS._player.changeZoom(-1);
+ R2_GLOBALS._player.setPosition(Common::Point(239, 64));
+
+ if (R2_GLOBALS._player._characterIndex == 2)
+ R2_GLOBALS._player.setup(20, 5, 1);
+ else if (R2_GLOBALS._player._characterIndex == 3)
+ R2_GLOBALS._player.setup(30, 5, 1);
+ else
+ R2_GLOBALS._player.setup(10, 5, 1);
+
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.disableControl();
+
+ _actor1.postInit();
+ if (R2_GLOBALS._player._characterIndex == 2) {
+ _actor1._numFrames = 10;
+ _actor1._moveDiff = Common::Point(3, 2);
+ } else {
+ _actor1._numFrames = 7;
+ _actor1._moveDiff = Common::Point(5, 3);
+ }
+ _actor1.changeZoom(-1);
+ _actor1._effect = 1;
+ _actor1.setPosition(Common::Point(247, 63));
+ if (R2_GLOBALS._player._characterIndex == 2)
+ _actor1.setup(10, 5, 1);
+ else
+ _actor1.setup(20, 5, 1);
+ _actor1.animate(ANIM_MODE_1, NULL);
+
+ _actor2.postInit();
+ _actor2._moveDiff = Common::Point(3, 2);
+ _actor2.changeZoom(-1);
+ _actor2._effect = 1;
+ _actor2.setPosition(Common::Point(225, 63));
+ if (R2_GLOBALS._player._characterIndex == 3)
+ _actor2.setup(10, 5, 1);
+ else
+ _actor2.setup(30, 5, 1);
+ _actor2.animate(ANIM_MODE_1, NULL);
+
+ _actor3.postInit();
+ _actor3._numFrames = 7;
+ _actor3._moveDiff = Common::Point(5, 3);
+ _actor3.changeZoom(-1);
+ _actor3._effect = 1;
+ _actor3.setPosition(Common::Point(235, 61));
+ _actor3.setup(40, 3, 1);
+ _actor3.animate(ANIM_MODE_1, NULL);
+
+ _actor6.postInit();
+ _actor6.setup(3400, 1, 6);
+ _actor6.setPosition(Common::Point(236, 51));
+ _actor6.fixPriority(51);
+ _actor6.animate(ANIM_MODE_6, NULL);
+
+ R2_GLOBALS.clearFlag(71);
+ _sceneMode = 3400;
+ setAction(&_sequenceManager, this, 3400, &R2_GLOBALS._player, &_actor1, &_actor2, &_actor3, NULL);
+}
+
+void Scene3400::remove() {
+ R2_GLOBALS._sound2.fadeOut2(NULL);
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene3400::signal() {
+ switch (_sceneMode) {
+ case 3305: {
+ warning("STUB: sub_1D227()");
+ _tealSpeaker._object1.hide();
+ _actor4.show();
+ _actor4.setStrip(1);
+ Common::Point pt(158, 190);
+ NpcMover *mover = new NpcMover();
+ _actor4.addMover(mover, &pt, this);
+ _sceneMode = 3402;
+ setAction(&_sequenceManager, this, 3402, &R2_GLOBALS._player, &_actor1, &_actor2, &_actor3, NULL);
+ }
+ break;
+ case 3306:
+ R2_GLOBALS._sound2.play(318);
+ _actor1.setStrip(2);
+ R2_GLOBALS._player.setStrip(6);
+ _actor2.setStrip(6);
+ _actor3.setStrip(3);
+ _actor4.setStrip(1);
+ R2_INVENTORY.setObjectScene(34, 0);
+ _stripManager.start(3307, this);
+ if (R2_GLOBALS._player._characterIndex == 2) {
+ _sceneMode = 3400;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 3400, &R2_GLOBALS._player, &_actor4, &_actor8, NULL);
+ } else {
+ _sceneMode = 3408;
+ _actor1.setAction(&_sequenceManager, this, 3408, &_actor1, &_actor4, &_actor8, NULL);
+ }
+ break;
+ case 3307:
+ case 3404:
+ case 3408:
+ if (_field157C == 0) {
+ R2_GLOBALS._sound2.fadeOut2(NULL);
+ _field157C = 1;
+ } else {
+ _sceneMode = 3308;
+ _stripManager.start(3308, this);
+ }
+ break;
+ case 3308:
+ warning("STUB: sub_1D227()");
+ _actor1.setStrip(2);
+ R2_GLOBALS._player.setStrip(6);
+ _actor2.setStrip(6);
+ _actor3.setStrip(3);
+ _actor4.setStrip(1);
+ _sceneMode = 3403;
+ if (R2_GLOBALS._player._characterIndex == 2)
+ setAction(&_sequenceManager, this, 3403, &R2_GLOBALS._player, &_actor3, &_actor7, NULL);
+ else
+ setAction(&_sequenceManager, this, 3403, &_actor1, &_actor3, &_actor7, NULL);
+ break;
+ case 3309:
+ warning("STUB: sub_1D227()");
+ _actor4.setStrip(1);
+ _sceneMode = 3405;
+ if (R2_GLOBALS._player._characterIndex == 3)
+ setAction(&_sequenceManager, this, 3405, &R2_GLOBALS._player, &_actor7, NULL);
+ else
+ setAction(&_sequenceManager, this, 3405, &_actor2, &_actor7, NULL);
+ break;
+ case 3310:
+ warning("STUB: sub_1D227()");
+ _actor4.setStrip(1);
+ _sceneMode = 3406;
+ if (R2_GLOBALS._player._characterIndex == 1)
+ setAction(&_sequenceManager, this, 3406, &R2_GLOBALS._player, &_actor7, NULL);
+ else if (R2_GLOBALS._player._characterIndex == 2)
+ setAction(&_sequenceManager, this, 3406, &_actor1, &_actor7, NULL);
+ else if (R2_GLOBALS._player._characterIndex == 3)
+ setAction(&_sequenceManager, this, 3406, &_actor2, &_actor7, NULL);
+ break;
+ case 3311:
+ warning("STUB: sub_1D227()");
+ _tealSpeaker._object1.hide();
+ _actor4.show();
+ _actor4.setStrip(1);
+ _sceneMode = 3407;
+ setAction(&_sequenceManager, this, 3407, &_actor4, &_actor7, NULL);
+ break;
+ case 3400: {
+ _actor8.postInit();
+ _actor8.hide();
+ _actor4.postInit();
+ _actor4._numFrames = 7;
+ _actor4._moveDiff = Common::Point(3, 2);
+ _actor4.changeZoom(-1);
+ _actor4._effect = 1;
+ _actor4.setPosition(Common::Point(-15, 90));
+ _actor4.setup(3402, 1, 1);
+ _actor4.animate(ANIM_MODE_1, NULL);
+ Common::Point pt1(115, 90);
+ NpcMover *mover1 = new NpcMover();
+ _actor4.addMover(mover1, &pt1, this);
+ R2_GLOBALS._scrollFollower = &_actor4;
+ Common::Point pt2(203, 76);
+ NpcMover *mover2 = new NpcMover();
+ _actor3.addMover(mover2, &pt2, NULL);
+ _sceneMode = 3401;
+ }
+ break;
+ case 3401:
+ _sceneMode = 3305;
+ _stripManager.start(3305, this);
+ break;
+ case 3402:
+ _sceneMode = 3306;
+ _stripManager.start(3306, this);
+ break;
+ case 3403:
+ R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
+ _sceneMode = 3309;
+ _stripManager.start(3309, this);
+ break;
+ case 3405:
+ _sceneMode = 3310;
+ _stripManager.start(3310, this);
+ break;
+ case 3406:
+ _sceneMode = 3311;
+ _stripManager.start(3311, this);
+ break;
+ case 3407:
+ R2_GLOBALS._sceneManager.changeScene(3600);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3500 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene3500::Action1::Action1() {
+ _field1E = 0;
+ _field20 = 0;
+ _field22 = 0;
+ _field24 = 0;
+}
+
+void Scene3500::Action1::synchronize(Serializer &s) {
+ Action::synchronize(s);
+
+ s.syncAsSint16LE(_field1E);
+ s.syncAsSint16LE(_field20);
+ s.syncAsSint16LE(_field22);
+ s.syncAsSint16LE(_field24);
+}
+
+void Scene3500::Action1::sub108670(int arg1) {
+ Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
+
+ _field1E = arg1;
+ _field20 = 1;
+ _field24 = 1;
+
+ scene->_actor9.setStrip(2);
+ scene->_actor9.show();
+
+ if (_field1E == 1)
+ scene->_actor6.show();
+ else
+ scene->_actor5.show();
+
+ if (scene->_actor1._frame % 2 == 0)
+ scene->_actor1._frameChange = _field1E;
+ scene->_actor1.setFrame(scene->_actor1.changeFrame());
+
+ setActionIndex(0);
+}
+
+void Scene3500::Action1::sub108732(int arg1) {
+ Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
+
+ _field20 = arg1;
+ _field1E = -_field1E;
+
+ if (_field1E == 1) {
+ scene->_actor6.show();
+ scene->_actor5.hide();
+ } else {
+ scene->_actor5.show();
+ scene->_actor6.hide();
+ }
+
+ switch (_actionIndex) {
+ case 4:
+ scene->_actor1._frameChange = _field1E;
+ scene->_actor1.setFrame(scene->_actor1.changeFrame());
+ // No break on purpose
+ case 3:
+ _actionIndex = 10;
+ setDelay(0);
+ break;
+ case 5: {
+ scene->_fieldAF8 = 160;
+ Common::Point pt(160, 73);
+ NpcMover *mover = new NpcMover();
+ scene->_actor8.addMover(mover, &pt, NULL);
+
+ scene->_fieldB9E = 160 - (_field1E * 2 * 160);
+ Common::Point pt2(scene->_fieldB9E, 73);
+ NpcMover *mover2 = new NpcMover();
+ scene->_actor9.addMover(mover2, &pt2, this);
+
+ _actionIndex = 11;
+ }
+ break;
+ case 6:
+ scene->_actor1._frameChange = _field1E;
+ scene->_actor1.setFrame(scene->_actor1.changeFrame());
+ setDelay(1);
+ // No break on purpose
+ case 8:
+ scene->_actor9.setStrip(2);
+ _actionIndex = 1;
+ break;
+ default:
+ break;
+ }
+}
+
+Scene3500::Action2::Action2() {
+ _field1E = 0;
+}
+
+void Scene3500::Action2::synchronize(Serializer &s) {
+ Action::synchronize(s);
+
+ s.syncAsSint16LE(_field1E);
+}
+
+Scene3500::Item4::Item4() {
+ _field34 = 0;
+}
+
+void Scene3500::Item4::synchronize(Serializer &s) {
+ NamedHotspot::synchronize(s);
+
+ s.syncAsSint16LE(_field34);
+}
+
+Scene3500::Actor7::Actor7() {
+ _fieldA4 = 0;
+ _fieldA6 = 0;
+ _fieldA8 = 0;
+ _fieldAA = 0;
+ _fieldAC = 0;
+ _fieldAE = 0;
+}
+
+void Scene3500::Actor7::synchronize(Serializer &s) {
+ SceneActor::synchronize(s);
+
+ s.syncAsSint16LE(_fieldA4);
+ s.syncAsSint16LE(_fieldA6);
+ s.syncAsSint16LE(_fieldA8);
+ s.syncAsSint16LE(_fieldAA);
+ s.syncAsSint16LE(_fieldAC);
+ s.syncAsSint16LE(_fieldAE);
+}
+
+void Scene3500::Actor7::sub109466(int arg1, int arg2, int arg3, int arg4, int arg5) {
+ _fieldAE = 0;
+ _fieldA4 = arg1;
+ _fieldA6 = arg2;
+ _fieldA8 = arg3;
+ _fieldAA = arg4;
+ _fieldAC = _fieldAA / _fieldA8;
+
+ postInit();
+ setup(10501, 3, 1);
+ fixPriority(255);
+ sub109663(arg5);
+}
+
+void Scene3500::Actor7::sub1094ED() {
+ Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
+
+ scene->_field1270 = _position.x - _fieldA4;
+}
+
+void Scene3500::Actor7::sub109663(int arg1){
+ sub109693(Common::Point(_fieldA4 + arg1, _fieldA6 - (_fieldAC * arg1)));
+}
+
+void Scene3500::Actor7::sub109693(Common::Point Pt) {
+ setPosition(Pt);
+}
+
+int Scene3500::UnkObject3500::sub1097C9(int arg1) {
+ return (_field2A / 2) + arg1 - (arg1 % _field2A);
+}
+
+int Scene3500::UnkObject3500::sub1097EF(int arg1) {
+ return (_field2C / 2) + arg1 - (arg1 % _field2C);
+}
+
+int Scene3500::UnkObject3500::sub109C09(Common::Point pt) {
+ int vx = pt.x / _field2A;
+ int vy = pt.y / _field2C;
+
+ if ((vx >= 0) && (_field26 > vx) && (_field28 > vy)) {
+ return _field16[((_field26 * vy) + vx) * 2];
+ } else
+ return -1;
+}
+
+int Scene3500::UnkObject3500::sub109C5E(int &x, int &y) {
+ int retVal = sub51AFD(Common::Point(x, y));
+ x = _field2E;
+ y = _field30;
+
+ return retVal;
+}
+
+Scene3500::Scene3500() {
+ _fieldAF8 = 0;
+ _fieldB9E = 0;
+ _rotation = NULL;
+ _field126E = 0;
+ _field1270 = 0;
+ _field1272 = 0;
+ _field1274 = 0;
+ _field1276 = 0;
+ _field1278 = 0;
+ _field127A = 0;
+ _field127C = 0;
+ _field127E = 0;
+ _field1280 = 0;
+ _field1282 = 0;
+ _field1284 = 0;
+ _field1286 = 0;
+}
+
+void Scene3500::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+ SYNC_POINTER(_rotation);
+
+ s.syncAsSint16LE(_fieldAF8);
+ s.syncAsSint16LE(_fieldB9E);
+ s.syncAsSint16LE(_field126E);
+ s.syncAsSint16LE(_field1270);
+ s.syncAsSint16LE(_field1272);
+ s.syncAsSint16LE(_field1274);
+ s.syncAsSint16LE(_field1276);
+ s.syncAsSint16LE(_field1278);
+ s.syncAsSint16LE(_field127A);
+ s.syncAsSint16LE(_field127C);
+ s.syncAsSint16LE(_field127E);
+ s.syncAsSint16LE(_field1280);
+ s.syncAsSint16LE(_field1282);
+ s.syncAsSint16LE(_field1284);
+ s.syncAsSint16LE(_field1286);
+}
+
+void Scene3500::sub107F71(int arg1) {
+ switch (arg1) {
+ case -1:
+ _actor7.sub1094ED();
+ if (_field1270 != 0) {
+ _field1270--;
+ _actor7.sub109663(_field1270);
+ }
+ if (_action1._field24 != 0)
+ _field1270 = 0;
+ break;
+ case 1:
+ _actor7.sub1094ED();
+ if (_field1270 < 16) {
+ ++_field1270;
+ _actor7.sub109663(_field1270);
+ }
+ if (_action1._field24 != 0)
+ _field1270 = 0;
+ break;
+ case 88:
+ if ((_action == 0) || (_action1._field24 == 0)) {
+ // The original makes a second useless check on action, skipped
+ _action2.sub10831F(2);
+ if ((_action) && ((_action2.getActionIndex() != 0) || (_action2._field1E != 2))) {
+ _action2.signal();
+ } else {
+ _actor9.setAction(&_action2, &_actor9, NULL);
+ }
+ }
+ break;
+ case 96:
+ if ((_action) && (_action1._field24 != 0) && (_action2._field1E != 1)) {
+ _field1278 = 0;
+ _action1.sub108732(0);
+ } else if ((_action) && (_field1278 == 0) && (_action1._field24 != 0)) {
+ _field1278 = arg1;
+ } else if ((_action) && (_action1._field24 == 0)) {
+ _action1.sub108670(1);
+ _action1.signal();
+ } else if (_action == 0) {
+ _action1.sub108670(1);
+ setAction(&_action1, &_actor1, NULL);
+ }
+ break;
+ case 104:
+ if ((_action == 0) || (_action1._field24 == 0)) {
+ _action2.sub10831F(-1);
+ if ((_action) && ((_action2.getActionIndex() != 0) || (_action2._field1E != -1))) {
+ _action2.signal();
+ } else {
+ _actor9.setAction(&_action2, &_actor9, NULL);
+ }
+ }
+ break;
+ case 112:
+ if ((_action) && (_action1._field24 != 0) && (_action2._field1E != -1)) {
+ _field1278 = 0;
+ _action1.sub108732(0);
+ } else if ((_action) && (_field1278 == 0) && (_action1._field24 != 0)) {
+ _field1278 = arg1;
+ } else if ((_action) && (_action1._field24 == 0)) {
+ _action1.sub108670(-1);
+ _action1.signal();
+ } else if (_action == 0) {
+ _action1.sub108670(-1);
+ setAction(&_action1, &_actor1, NULL);
+ }
+ break;
+ default:
+ _field1270 = arg1;
+ _actor7.sub109663(arg1);
+ if (_action1._field24 != 0) {
+ _field1270 = 0;
+ }
+ break;
+ }
+}
+
+void Scene3500::Action1::signal() {
+ Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
+
+ switch(_actionIndex++) {
+ case 0:
+ R2_GLOBALS._player.disableControl();
+ scene->_field1286 = 0;
+ if (scene->_field1270 != 0) {
+ scene->_field1270 = 0;
+ scene->_field126E = 0;
+ scene->_field1272 = 0;
+ scene->_rotation->_idxChange = 0;
+ }
+ break;
+ case 1:
+ if ((scene->_actor1._frame % 2) == 0) {
+ setDelay(1);
+ return;
+ }
+ // No break on purpose
+ case 3:
+ scene->_actor1._frameChange = _field1E;
+ scene->_actor1.setFrame(scene->_actor1.changeFrame());
+ setDelay(1);
+ break;
+ case 4: {
+ int si = scene->_unkObj1.sub109C09(Common::Point(scene->_field127A + 70, scene->_field127C + 46));
+ int var2 = scene->_unkObj1.sub1097C9(scene->_field127A + 70) - 70;
+ int var4 = scene->_unkObj1.sub1097EF(scene->_field127C + 46) - 46;
+ int di = abs(var2 - scene->_field127A);
+ int var6 = abs(var4 - scene->_field127C);
+
+ if ((scene->_actor1._frame % 2) != 0) {
+ scene->_actor1._frameChange = _field1E;
+ scene->_actor1.setFrame(scene->_actor1.changeFrame());
+ }
+
+ int var8 = (scene->_action1._field1E * 2 + scene->_field1276);
+ if (var8 > 7)
+ var8 = 1;
+ else if (var8 < 1)
+ var8 = 7;
+
+ switch (var8) {
+ case 0:
+ if ( ((si != 2) && (si != 3) && (si != 6) && (si != 1) && (si != 23) && (si != 24) && (si != 4) && (si != 11))
+ || (var6 != 0)) {
+ if ((si != 25) && (si != 26) && (si != 5) && (si != 14) && (si != 15))
+ _field20 = 0;
+ else if ((var6 != 0) || (di <= 3)) // useless, skipped: "|| (di == 0)"
+ _field20 = 0;
+ else
+ _field20 = 1;
+ } else
+ _field20 = 1;
+ break;
+ case 2:
+ if ( ((si != 12) && (si != 13) && (si != 11) && (si != 16) && (si != 26) && (si != 24) && (si != 15) && (si != 6) && (si != 31))
+ || (di != 0)) {
+ if ((si != 25) && (si != 23) && (si != 14) && (si != 5) && (si != 4))
+ _field20 = 0;
+ else if ((di != 0) || (var6 <= 3)) // useless, skipped: "|| (var6 == 0)"
+ _field20 = 0;
+ else
+ _field20 = 1;
+ } else
+ _field20 = 1;
+ break;
+ case 4:
+ if ( ((si != 2) && (si != 3) && (si != 6) && (si != 1) && (si != 25) && (si != 26) && (si != 5) && (si != 16) && (si != 31))
+ || (var6 != 0)) {
+ if ((si != 23) && (si != 24) && (si != 4) && (si != 14) && (si != 15))
+ _field20 = 0;
+ else if ((var6 != 0) || (di <= 3)) // useless, skipped: "|| (di == 0)"
+ _field20 = 0;
+ else
+ _field20 = 1;
+ } else
+ _field20 = 1;
+ break;
+ case 6:
+ if ( ((si != 12) && (si != 13) && (si != 11) && (si != 16) && (si != 25) && (si != 23) && (si != 14) && (si != 1) && (si != 31))
+ || (var6 != 0)) {
+ if ((si != 26) && (si != 24) && (si != 15) && (si != 5) && (si != 4))
+ _field20 = 0;
+ else if ((var6 <= 0) || (di != 0)) // useless, skipped: "|| (var6 == 0)"
+ _field20 = 0;
+ else
+ _field20 = 1;
+ } else
+ _field20 = 1;
+ default:
+ break;
+ }
+ }
+ // No break on purpose
+ case 2: {
+ scene->_actor8.setPosition(Common::Point(160, 73));
+ scene->_actor8._moveDiff.x = 160 - scene->_field126E;
+ scene->_fieldAF8 = 160 - ((_field1E * 2) * 160);
+ Common::Point pt(scene->_fieldAF8, 73);
+ NpcMover *mover = new NpcMover();
+ scene->_actor8.addMover(mover, &pt, this);
+
+ scene->_actor9.setPosition(Common::Point(160 + ((_field1E * 2) * 160), 73));;
+ scene->_actor9._moveDiff.x = 160 - scene->_field126E;
+ scene->_fieldB9E = 160;
+ Common::Point pt2(scene->_fieldB9E, 73);
+ NpcMover *mover2 = new NpcMover();
+ scene->_actor9.addMover(mover2, &pt2, NULL);
+ }
+ break;
+ case 5:
+ scene->_actor1._frameChange = _field1E;
+ scene->_field1276 = scene->_actor1.changeFrame();
+ scene->_actor1.setFrame(scene->_field1276);
+ setDelay(1);
+ break;
+ case 6:
+ scene->_actor8.setPosition(Common::Point(160, 73));
+ if (_field20 == 0)
+ scene->_actor8.setStrip(1);
+ else
+ scene->_actor8.setStrip(2);
+ scene->_actor8.fixPriority(1);
+
+ scene->_actor9.setPosition(Common::Point(-160, 73));
+ scene->_actor9.setStrip(9);
+ scene->_actor9.fixPriority(11);
+ scene->_actor9.hide();
+ setDelay(1);
+ break;
+ case 7:
+ if ((scene->_actor1._frame % 2) == 0) {
+ scene->_actor1._frameChange = _field1E;
+ scene->_field1276 = scene->_actor1.changeFrame();
+ scene->_actor1.setFrame(scene->_field1276);
+ }
+ setDelay(1);
+ break;
+ case 8: {
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
+ scene->_field1286 = 1;
+ if ((scene->_actor1._frame % 2) == 0) {
+ scene->_actor1._frameChange = _field1E;
+ scene->_actor1.setFrame(scene->_actor1.changeFrame());
+ }
+ // All the var_8 initialization was missing in the original
+ // but it's clearly a cut and paste error from case 4.
+ // The following code allows the switch to work properly.
+ warning("Checkme: fix for dead code");
+ int var_8 = (_field1E * 2 + scene->_field1276);
+ if (var_8 > 7)
+ var_8 = 1;
+ else if (var_8 < 1)
+ var_8 = 7;
+ //
+
+ switch (var_8 - 1) {
+ case 0:
+ // No break on purpose
+ case 4:
+ scene->_field127A = scene->_unkObj1.sub1097C9(scene->_field127A + 70) - 70;
+ break;
+ case 2:
+ // No break on purpose
+ case 6:
+ scene->_field127C = scene->_unkObj1.sub1097EF(scene->_field127C + 46) - 46;
+ break;
+ default:
+ break;
+ }
+ scene->_actor5.hide();
+ scene->_actor6.hide();
+ _field24 = 0;
+ if (_field20 == 0) {
+ scene->_actor7.sub1094ED();
+ if (scene->_field126E == scene->_field1270)
+ scene->_aSound1.play(276);
+ }
+ break;
+ }
+ case 10: {
+ scene->_fieldAF8 = 160;
+ Common::Point pt(160, 73);
+ NpcMover *mover = new NpcMover();
+ scene->_actor8.addMover(mover, &pt, NULL);
+
+ scene->_fieldB9E = 160 - (_field1E * 2 * 160);
+ Common::Point pt2(scene->_fieldB9E, 73);
+ NpcMover *mover2 = new NpcMover();
+ scene->_actor9.addMover(mover2, &pt2, this);
+ _actionIndex = 6;
+ }
+ break;
+ case 11: {
+ scene->_actor8.setStrip(2);
+ scene->_actor8.setPosition(Common::Point(160, 73));
+ scene->_fieldAF8 = 160 - (_field1E * 2 * 160);
+ Common::Point pt(scene->_fieldAF8, 73);
+ NpcMover *mover = new NpcMover();
+ scene->_actor8.addMover(mover, &pt, NULL);
+ scene->_actor8.fixPriority(11);
+ if (_field20 == 0)
+ scene->_actor9.setStrip(1);
+ else
+ scene->_actor9.setStrip(2);
+ scene->_actor9.setPosition(Common::Point(160 - (_field1E * 2 * 160), 73));
+ scene->_fieldB9E = 160;
+ Common::Point pt2(scene->_fieldB9E, 73);
+ NpcMover *mover2 = new NpcMover();
+ scene->_actor9.addMover(mover2, &pt2, this);
+ scene->_actor9.fixPriority(1);
+ _actionIndex = 5;
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene3500::Action1::dispatch() {
+ Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
+
+ Action::dispatch();
+ if ((_actionIndex == 1) && (scene->_field126E <= 4)) {
+ scene->_rotation->_idxChange = 0;
+ signal();
+ }
+}
+
+void Scene3500::Action2::sub10831F(int arg1) {
+ Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
+
+ _field1E = arg1;
+ if (_field1E == -1)
+ scene->_actor3.setFrame2(3);
+ else
+ scene->_actor3.setFrame2(1);
+
+ setActionIndex(0);
+}
+
+void Scene3500::Action2::signal() {
+ Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
+
+ int si;
+ int di;
+
+ switch (_actionIndex++) {
+ case 0: {
+ if (scene->_actor8._mover) {
+ si = scene->_fieldAF8;
+ di = scene->_fieldB9E;
+ } else {
+ scene->_fieldAF8 = scene->_actor8._position.x;
+ si = scene->_fieldAF8;
+ scene->_fieldB9E = scene->_actor9._position.y;
+ di = scene->_fieldB9E;
+ }
+
+ scene->_actor8._moveDiff.y = 9 - (scene->_field126E / 2);
+ Common::Point pt(si, 73 - (_field1E * 12));
+ NpcMover *mover = new NpcMover();
+ scene->_actor8.addMover(mover, &pt, NULL);
+
+ scene->_actor9._moveDiff.y = 9 - (scene->_field126E / 2);
+ Common::Point pt2(di, 73 - (_field1E * 12));
+ NpcMover *mover2 = new NpcMover();
+ scene->_actor9.addMover(mover2, &pt2, NULL);
+ scene->_field126E = (scene->_field126E / 2) + (scene->_field126E % 2);
+ setDelay(17 - scene->_field126E);
+ }
+ break;
+ case 1: {
+ R2_GLOBALS._sound2.play(339);
+ if (scene->_actor8._mover) {
+ si = scene->_fieldAF8;
+ di = scene->_fieldB9E;
+ } else {
+ si = scene->_actor8._position.x;
+ di = scene->_actor9._position.x;
+ }
+
+ scene->_actor7.sub1094ED();
+
+ scene->_actor8._moveDiff.y = 9 - (scene->_field126E / 2);
+ Common::Point pt(si, 73);
+ NpcMover *mover = new NpcMover();
+ scene->_actor8.addMover(mover, &pt, NULL);
+
+ scene->_actor9._moveDiff.y = 9 - (scene->_field126E / 2);
+ Common::Point pt2(di, 73);
+ NpcMover *mover2 = new NpcMover();
+ scene->_actor9.addMover(mover2, &pt2, NULL);
+
+ scene->_actor3.setFrame2(2);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+bool Scene3500::Item4::startAction(CursorType action, Event &event) {
+ Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
+
+ if (scene->_field1286 == 0)
+ return true;
+
+ if (scene->_field1286 != 4)
+ return SceneHotspot::startAction(action, event);
+
+ R2_GLOBALS._sound2.play(14);
+ scene->sub107F71(_field34);
+
+ return true;
+}
+
+void Scene3500::Actor7::process(Event &event) {
+ Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
+
+ if (scene->_field1286 == 0)
+ return;
+
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE) && (_bounds.contains(event.mousePos))) {
+ _fieldAE = 1 + event.mousePos.y - _position.y;
+ event.eventType = EVENT_NONE;
+ }
+
+ if ((event.eventType == EVENT_BUTTON_UP) && (_fieldAE != 0)) {
+ _fieldAE = 0;
+ event.handled = true;
+ if (scene->_action1._field24 == 0)
+ sub1094ED();
+ }
+
+ if (_fieldAE == 0)
+ return;
+
+ R2_GLOBALS._sound2.play(338);
+ event.handled = true;
+
+ int cx = event.mousePos.y - _fieldAE + 1;
+ if (_fieldA6 >= cx) {
+ if (_fieldA6 - _fieldAA <= cx)
+ sub109693(Common::Point(((_fieldA6 - cx) / 2) + _fieldA4 + ((_fieldA6 - cx) % 2), cx));
+ else
+ sub109693(Common::Point(_fieldA4 + _fieldA8, _fieldA6 - _fieldAA));
+ } else {
+ sub109693(Common::Point(_fieldA4, _fieldA6));
+ }
+}
+
+bool Scene3500::Actor7::startAction(CursorType action, Event &event) {
+ Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
+
+ if (scene->_field1286 == 0)
+ return true;
+
+ if (scene->_field1286 == 4)
+ return false;
+
+ return SceneActor::startAction(action, event);
+}
+
+void Scene3500::postInit(SceneObjectList *OwnerList) {
+ byte tmpPal[768];
+ Rect tmpRect;
+
+ loadScene(1050);
+ R2_GLOBALS._uiElements._active = false;
+ R2_GLOBALS._v5589E.set(0, 0, 320, 200);
+ R2_GLOBALS._sound1.play(305);
+ R2_GLOBALS._player._characterIndex = R2_QUINN;
+ R2_GLOBALS._player._characterScene[1] = 3500;
+ R2_GLOBALS._player._characterScene[2] = 3500;
+ R2_GLOBALS._player._characterScene[3] = 3500;
+ _field1284 = 0;
+ _field1282 = 0;
+ _field1278 = 0;
+ _field1272 = 1;
+ _field1270 = 4;
+ _field126E = 4;
+ _field127A = 860;
+ _field127C = 891;
+ _rotation = R2_GLOBALS._scenePalette.addRotation(240, 254, -1);
+ _rotation->setDelay(0);
+ _rotation->_idxChange = 1;
+
+ for (int i = 240; i <= 254; i++) {
+ int tmpIndex = _rotation->_currIndex - 240;
+
+ if (tmpIndex > 254)
+ tmpIndex--;
+
+ tmpPal[3 * i] = R2_GLOBALS._scenePalette._palette[3 * tmpIndex];
+ tmpPal[(3 * i) + 1] = R2_GLOBALS._scenePalette._palette[(3 * tmpIndex) + 1];
+ tmpPal[(3 * i) + 2] = R2_GLOBALS._scenePalette._palette[(3 * tmpIndex) + 2];
+ }
+
+ for (int i = 240; i <= 254; i++) {
+ R2_GLOBALS._scenePalette._palette[3 * i] = tmpPal[3 * i];
+ R2_GLOBALS._scenePalette._palette[(3 * i) + 1] = tmpPal[(3 * i) + 1];
+ R2_GLOBALS._scenePalette._palette[(3 * i) + 2] = tmpPal[(3 * i) + 2];
+ }
+
+ _actor7.sub109466(38, 165, 16, 32, _field1270);
+ _actor7.setDetails(3500, 6, 7, -1, 1, (SceneItem *)NULL);
+ R2_GLOBALS._sound1.play(276);
+
+ _item4._field34 = 88;
+ _item4.setDetails(88, 3500, 18, 10, -1);
+
+ _item5._field34 = 112;
+ _item5.setDetails(112, 3500, 9, 10, -1);
+
+ _item6._field34 = 104;
+ _item6.setDetails(104, 3500, 15, 10, -1);
+
+ _item7._field34 = 96;
+ _item7.setDetails(96, 3500, 12, 10, -1);
+
+ _actor8.postInit();
+ _actor8.setup(10501, 1, 1);
+ _actor8.setPosition(Common::Point(160, 73));
+ _actor8.fixPriority(1);
+
+ _actor9.postInit();
+ _actor9.setup(1050, 2, 1);
+ _actor9.setPosition(Common::Point(-160, 73));
+ _actor9.fixPriority(11);
+ _actor9.hide();
+
+ _item2.setDetails(27, 3500, 21, -1, -1);
+ _item3.setDetails(Rect(160, 89, 299, 182), 3500, 3, -1, -1, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 320, 200), 3500, 0, -1, 2, 1, NULL);
+
+ _actor1.postInit();
+ _field1276 = 1;
+ _actor1.setup(1004, 1, _field1276);
+ _actor1.setPosition(Common::Point(230, 135));
+ _actor1.fixPriority(200);
+ _actor1._frameChange = 1;
+
+ _actor5.postInit();
+ _actor5.setup(1004, 3, 1);
+ _actor5.setPosition(Common::Point(117, 163));
+ _actor5.fixPriority(200);
+ _actor5.hide();
+
+ _actor4.postInit();
+ _actor4.setup(1004, 3, 2);
+ _actor4.setPosition(Common::Point(126, 163));
+ _actor4.fixPriority(200);
+
+ _actor6.postInit();
+ _actor6.setup(1004, 3, 3);
+ _actor6.setPosition(Common::Point(135, 163));
+ _actor6.fixPriority(200);
+ _actor6.hide();
+
+ _actor2.postInit();
+ _actor2.setup(1004, 4, _field126E + 1);
+ _actor2.setPosition(Common::Point(126, 137));
+ _actor2.fixPriority(200);
+
+ _actor3.postInit();
+ _actor3.setup(1004, 5, 2);
+ _actor3.setPosition(Common::Point(126, 108));
+ _actor3.fixPriority(200);
+
+ tmpRect.set(160, 89, 299, 182);
+ _unkObj1.sub9EDE8(tmpRect);
+ _unkObj1.sub51AE9(2);
+ _unkObj1.sub51AFD(Common::Point(_field127A, _field127C));
+
+ _action1._field24 = 0;
+ warning("gfx_set_pane_p()");
+ _unkObj1.sub51B02();
+ warning("gfx_set_pane_p()");
+ _field1286 = 1;
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.hide();
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._uiEnabled = false;
+ R2_GLOBALS._player._canWalk = false;
+}
+
+void Scene3500::remove() {
+ _rotation->remove();
+ R2_GLOBALS._sound2.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene3500::signal() {
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ R2_GLOBALS._player._canWalk = false;
+ _field1286 = 1;
+}
+
+void Scene3500::process(Event &event) {
+ if (_field1286 == 0)
+ return;
+
+ if (event.eventType == EVENT_KEYPRESS) {
+ switch (event.kbd.keycode) {
+ case Common::KEYCODE_1:
+ warning("FIXME: keycode = 0x4700");
+ R2_GLOBALS._sound2.play(338);
+ sub107F71(16);
+ event.handled = true;
+ break;
+ case Common::KEYCODE_2:
+ warning("FIXME: keycode = 0x4800");
+ R2_GLOBALS._sound2.play(14, NULL, 63);
+ sub107F71(88);
+ event.handled = true;
+ break;
+ case Common::KEYCODE_3:
+ warning("FIXME: keycode = 0x4900");
+ if (_field1270 < 16)
+ R2_GLOBALS._sound2.play(338);
+ sub107F71(1);
+ event.handled = true;
+ break;
+ case Common::KEYCODE_4:
+ warning("FIXME: keycode = 0x4B00");
+ R2_GLOBALS._sound2.play(14, NULL, 63);
+ sub107F71(112);
+ event.handled = true;
+ break;
+ case Common::KEYCODE_5:
+ warning("FIXME: keycode = 0x4D00");
+ R2_GLOBALS._sound2.play(14, NULL, 63);
+ sub107F71(96);
+ event.handled = true;
+ break;
+ case Common::KEYCODE_6:
+ warning("FIXME: keycode = 0x4F00");
+ R2_GLOBALS._sound2.play(338);
+ sub107F71(0);
+ event.handled = true;
+ break;
+ case Common::KEYCODE_7:
+ warning("FIXME: keycode = 0x5000");
+ R2_GLOBALS._sound2.play(14, NULL, 63);
+ sub107F71(104);
+ event.handled = true;
+ break;
+ case Common::KEYCODE_8:
+ warning("FIXME: keycode = 0x5100");
+ if (_field1270 != 0)
+ R2_GLOBALS._sound2.play(338);
+ sub107F71(-1);
+ event.handled = true;
+ break;
+ case Common::KEYCODE_9:
+ warning("FIXME: keycode = 0x5200");
+ R2_GLOBALS._sound2.play(338);
+ sub107F71(8);
+ event.handled = true;
+ break;
+ case Common::KEYCODE_0:
+ warning("FIXME: keycode = 0x5300");
+ R2_GLOBALS._sound2.play(338);
+ sub107F71(4);
+ event.handled = true;
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (!event.handled)
+ _actor7.process(event);
+
+ if (!event.handled)
+ _item4.process(event);
+
+ if (!event.handled)
+ _item5.process(event);
+
+ if (!event.handled)
+ _item6.process(event);
+
+ if (!event.handled)
+ _item7.process(event);
+
+ Scene::process(event);
+}
+
+void Scene3500::dispatch() {
+ Rect tmpRect;
+ Scene::dispatch();
+ if (((_actor1._frame % 2) == 0) && (_action1._field24 == 0)) {
+ _actor1.setFrame(_actor1.changeFrame());
+ _field1276 = _actor1._frame;
+ }
+ int oldField1278;
+ if ((_field1278 != 0) && (_action1._field24 == 0)) {
+ oldField1278 = _field1278;
+ _field1278 = 0;
+ sub107F71(oldField1278);
+ }
+
+ if (!_rotation)
+ return;
+
+ int var_field127A = 0;
+ int di = 0;
+ int var_4 = 0;
+ int var_6 = 0;
+ int var_8 = 0;
+ int var_a = 0;
+ int dx = 0;
+ int tmpVar = 0;
+
+ if ((_field126E == 0) && (_field1282 == 0)) {
+ if (_field1284 == 2)
+ R2_GLOBALS._sceneManager.changeScene(1000);
+ } else {
+ _field1282 = 0;
+ tmpRect.set(160, 89, 299, 182);
+
+ var_field127A = _field127A;
+ di = _field127C;
+ var_4 = _unkObj1.sub1097C9(70) - 70;
+ var_6 = _unkObj1.sub1097EF(_field127C + 46) - 46;
+ var_8 = abs(var_4 - var_field127A);
+ var_a = abs(var_6 - di);
+ dx = 0;
+
+ switch (_field1276) {
+ case 0:
+ tmpVar = _unkObj1.sub109C09(Common::Point(var_field127A + 70, 46));
+ if ( ((tmpVar == 2) || (tmpVar == 3) || (tmpVar == 6) || (tmpVar == 1))
+ || (((tmpVar == 25) || (tmpVar == 26) || (tmpVar == 5) || (tmpVar == 14) || (tmpVar == 15)) && (var_8 > 3)) ) {
+ R2_GLOBALS._sound2.play(339);
+ _rotation->_idxChange = 0;
+ _field1270 = 0;
+ _field126E = 0;
+ _field1272 = 0;
+ if (_action1._field24 == 0)
+ _actor8.hide();
+ } else {
+ var_6 = _unkObj1.sub1097EF(di + 46) - 46;
+ di = _field127C - _field126E;
+ dx = _unkObj1.sub109C09(Common::Point(var_field127A + 70, di + 46));
+ if (((tmpVar == 23) || (tmpVar == 24) || (tmpVar == 4)) && (tmpVar != dx)) {
+ di = var_6;
+ R2_GLOBALS._sound2.play(339);
+ _rotation->_idxChange = 0;
+ _field1270 = 0;
+ _field126E = 0;
+ _field1272 = 0;
+ if (_action1._field24 == 0)
+ _actor8.hide();
+ } else if ((tmpVar == 11) && (tmpVar != dx)) {
+ di = var_6 + 3;
+ R2_GLOBALS._sound2.play(339);
+ _rotation->_idxChange = 0;
+ _field1270 = 0;
+ _field126E = 0;
+ _field1272 = 0;
+ if (_action1._field24 == 0)
+ _actor8.hide();
+ } else {
+ var_6 = _unkObj1.sub1097EF(di + 46) - 46;
+ var_a = abs(var_6 - di);
+ tmpVar = _unkObj1.sub109C09(Common::Point(var_field127A + 70, di + 46));
+
+ if ( (((tmpVar == 23) || (tmpVar == 24) || (tmpVar == 4)) && (di <= var_6) && (_field127C>= var_6))
+ || (((tmpVar == 25) || (tmpVar == 26) || (tmpVar == 5) || (tmpVar == 14) || (tmpVar == 15)) && (_field126E >= var_a) && (_field126E > 3) && (_action1._field24 != 0)) ) {
+ di = var_6;
+ if ((tmpVar != 25) && (tmpVar != 26) && (tmpVar != 5) && (tmpVar != 14) && (tmpVar == 15))
+ R2_GLOBALS._sound2.play(339);
+ _rotation->_idxChange = 0;
+ _field1270 = 0;
+ _field126E = 0;
+ _field1272 = 0;
+ if (_action1._field24 == 0)
+ _actor8.hide();
+ } else if ((tmpVar == 11) && (var_6 + 3 >= di) && (_field127C >= var_6 + 3)) {
+ R2_GLOBALS._sound2.play(339);
+ _rotation->_idxChange = 0;
+ _field1270 = 0;
+ _field126E = 0;
+ _field1272 = 0;
+ if (_action1._field24 == 0)
+ _actor8.hide();
+ } else if (((tmpVar == 25) || (tmpVar == 26) || (tmpVar == 5) || (tmpVar == 14) || (tmpVar == 15)) && (var_8 != 0) && (var_8 <= 3)) {
+ var_field127A = var_4;
+ R2_GLOBALS._sound2.play(339);
+ } else {
+ // Nothing
+ }
+ }
+ }
+ break;
+ case 2:
+ tmpVar = _unkObj1.sub109C09(Common::Point(var_field127A + 70, di + 46));
+ if ( ((tmpVar == 12) || (tmpVar == 13) || (tmpVar == 11) || (tmpVar == 16) || (tmpVar == 31))
+ || (((tmpVar == 25) || (tmpVar == 23) || (tmpVar == 14) || (tmpVar == 5) || (tmpVar == 4)) && (var_a > 3)) ) {
+ R2_GLOBALS._sound2.play(339);
+ _rotation->_idxChange = 0;
+ _field1270 = 0;
+ _field126E = 0;
+ _field1272 = 0;
+ if (_action1._field24 == 0)
+ _actor8.hide();
+ } else {
+ var_4 = _unkObj1.sub1097C9(var_field127A + 70) - 70;
+ var_field127A = _field127A + _field126E;
+ dx = _unkObj1.sub109C09(Common::Point(var_field127A + 70, di + 46));
+ if (((tmpVar == 26) || (tmpVar == 24) || (tmpVar == 15)) && (tmpVar != dx)) {
+ var_field127A = var_4;
+ R2_GLOBALS._sound2.play(339);
+ _rotation->_idxChange = 0;
+ _field1270 = 0;
+ _field126E = 0;
+ _field1272 = 0;
+ if (_action1._field24 == 0)
+ _actor8.hide();
+ } else if ((tmpVar == 6) && (tmpVar != dx)) {
+ var_field127A = var_4 - 5;
+ R2_GLOBALS._sound2.play(339);
+ _rotation->_idxChange = 0;
+ _field1270 = 0;
+ _field126E = 0;
+ _field1272 = 0;
+ if (_action1._field24 == 0)
+ _actor8.hide();
+ } else {
+ var_4 = _unkObj1.sub1097C9(var_field127A + 70) - 70;
+ var_8 = abs(var_field127A - var_4);
+ tmpVar = _unkObj1.sub109C09(Common::Point(var_field127A + 70, tmpVar + 46));
+ if ( (((tmpVar == 26) || (tmpVar == 24) || (tmpVar == 15)) && (var_field127A >= var_4) && (_field127A <= var_4))
+ || (((tmpVar == 25) || (tmpVar == 23) || (tmpVar == 14) || (tmpVar == 5) || (tmpVar == 4)) && (_field126E >= var_8) && (_field126E <= 3) && (_action1._field24 != 0)) ) {
+ var_field127A = var_4;
+ if ((tmpVar == 25) || (tmpVar == 23) || (tmpVar == 14) || (tmpVar == 5) || (tmpVar == 4))
+ R2_GLOBALS._sound2.play(339);
+ _rotation->_idxChange = 0;
+ _field1270 = 0;
+ _field126E = 0;
+ _field1272 = 0;
+ if (_action1._field24 == 0)
+ _actor8.hide();
+ } else if ((tmpVar == 6) && (var_4 - 5 <= var_field127A) && (_field127A <= var_4 - 5)) {
+ var_field127A = var_4 - 5;
+ R2_GLOBALS._sound2.play(339);
+ _rotation->_idxChange = 0;
+ _field1270 = 0;
+ _field126E = 0;
+ _field1272 = 0;
+ if (_action1._field24 == 0)
+ _actor8.hide();
+ } else if (((tmpVar == 25) || (tmpVar == 23) || (tmpVar == 14) || (tmpVar == 5) || (tmpVar == 4)) && (var_a != 0) && (var_a <= 3)) {
+ di = var_6;
+ R2_GLOBALS._sound2.play(339);
+ } else {
+ // Nothing
+ }
+ }
+ }
+ break;
+ case 4:
+ tmpVar = _unkObj1.sub109C09(Common::Point(var_field127A + 70, di + 46));
+ if ( ((tmpVar == 2) || (tmpVar == 3) || (tmpVar == 6) || (tmpVar == 1))
+ || (((tmpVar == 23) || (tmpVar == 24) || (tmpVar == 4) || (tmpVar == 14) || (tmpVar == 15)) && (var_8 > 3)) ) {
+ R2_GLOBALS._sound2.play(339);
+ _rotation->_idxChange = 0;
+ _field1270 = 0;
+ _field126E = 0;
+ _field1272 = 0;
+ if (_action1._field24 == 0)
+ _actor8.hide();
+ } else {
+ var_6 = _unkObj1.sub1097EF(di + 46) - 46;
+ di = _field127C + _field126E;
+ dx = _unkObj1.sub109C09(Common::Point(var_field127A + 70, di + 46));
+ if (((tmpVar == 25) || (tmpVar == 26) || (tmpVar == 5)) && (tmpVar == dx)) {
+ R2_GLOBALS._sound2.play(339);
+ _rotation->_idxChange = 0;
+ _field1270 = 0;
+ _field126E = 0;
+ _field1272 = 0;
+ if (_action1._field24 == 0)
+ _actor8.hide();
+ } else if ((tmpVar == 16) && (tmpVar == dx)) {
+ di = var_6 - 3;
+ R2_GLOBALS._sound2.play(339);
+ _rotation->_idxChange = 0;
+ _field1270 = 0;
+ _field126E = 0;
+ _field1272 = 0;
+ if (_action1._field24 == 0)
+ _actor8.hide();
+ } else if ((tmpVar == 31) && (tmpVar == dx)) {
+ di = var_6 + 4;
+ R2_GLOBALS._sound2.play(339);
+ _rotation->_idxChange = 0;
+ _field1270 = 0;
+ _field126E = 0;
+ _field1272 = 0;
+ if (_action1._field24 == 0)
+ _actor8.hide();
+ } else {
+ var_6 = _unkObj1.sub1097EF(di + 46) - 46;
+ var_a = abs(di - var_6);
+ tmpVar = _unkObj1.sub109C09(Common::Point(var_field127A + 70, di + 46));
+ if ( (((tmpVar == 25) || (tmpVar == 26) || (tmpVar == 5)) && (di >= var_6) && (_field127C <= var_6))
+ || (((tmpVar == 23) || (tmpVar == 24) || (tmpVar == 4) || (tmpVar == 14) || (tmpVar == 15)) && (_field126E >= var_a) && (_field126E <= 3) && (_action1._field24 != 0)) ){
+ if ((tmpVar != 23) && (tmpVar != 24) && (tmpVar != 4) && (tmpVar != 14) && (tmpVar != 15))
+ R2_GLOBALS._sound2.play(339);
+ _rotation->_idxChange = 0;
+ _field1270 = 0;
+ _field126E = 0;
+ _field1272 = 0;
+ if (_action1._field24 == 0)
+ _actor8.hide();
+ } else if ((tmpVar == 16) && (var_6 - 3 <= di) && (_field127C <= var_6 - 3)) {
+ di = var_6 - 3;
+ R2_GLOBALS._sound2.play(339);
+ _rotation->_idxChange = 0;
+ _field1270 = 0;
+ _field126E = 0;
+ _field1272 = 0;
+ if (_action1._field24 == 0)
+ _actor8.hide();
+ } else if ((tmpVar == 31) && (var_6 + 4 <= di) && (_field127C <= var_6 + 4)) {
+ di = var_6 + 4;
+ _rotation->_idxChange = 0;
+ _field1270 = 0;
+ _field126E = 0;
+ _field1272 = 0;
+ if (_action1._field24 == 0)
+ _actor8.hide();
+ if ((var_field127A == 660) && (_field126E + 306 <= di) && (di <= 307))
+ ++_field1284;
+ else
+ R2_GLOBALS._sound2.play(339);
+ } else if (((tmpVar == 23) || (tmpVar == 24) || (tmpVar == 4) || (tmpVar == 14) || (tmpVar == 15)) && (var_8 != 0) && (var_8 <= 3)) {
+ var_field127A = var_4;
+ R2_GLOBALS._sound2.play(339);
+ } else {
+ // Nothing
+ }
+ }
+ }
+ break;
+ case 6:
+ tmpVar = _unkObj1.sub109C09(Common::Point(var_field127A + 70, di + 46));
+ if ( ((tmpVar == 12) || (tmpVar == 13) || (tmpVar == 11) || (tmpVar == 16) || (tmpVar == 31))
+ || (((tmpVar == 26) || (tmpVar == 24) || (tmpVar == 15) || (tmpVar == 5) || (tmpVar == 4)) && (var_a > 3)) ) {
+ R2_GLOBALS._sound2.play(339);
+ _rotation->_idxChange = 0;
+ _field1270 = 0;
+ _field126E = 0;
+ _field1272 = 0;
+ if (_action1._field24 == 0)
+ _actor8.hide();
+ } else {
+ var_4 = _unkObj1.sub1097C9(var_field127A + 70) - 70;
+ var_field127A = _field127A - _field126E;
+ dx = _unkObj1.sub109C09(Common::Point(var_field127A + 70, di + 46));
+ if (((tmpVar == 25) || (tmpVar == 23) || (tmpVar == 14)) && (tmpVar != dx)) {
+ var_field127A = var_4;
+ R2_GLOBALS._sound2.play(339);
+ _rotation->_idxChange = 0;
+ _field1270 = 0;
+ _field126E = 0;
+ _field1272 = 0;
+ if (_action1._field24 == 0)
+ _actor8.hide();
+ } else if ((tmpVar == 1) && (tmpVar != dx)) {
+ var_field127A = var_4 + 5;
+ R2_GLOBALS._sound2.play(339);
+ _rotation->_idxChange = 0;
+ _field1270 = 0;
+ _field126E = 0;
+ _field1272 = 0;
+ if (_action1._field24 == 0)
+ _actor8.hide();
+ } else {
+ var_4 = _unkObj1.sub1097C9(var_field127A + 70) - 70;
+ var_8 = abs(var_4 - var_field127A);
+ tmpVar = _unkObj1.sub109C09(Common::Point(var_field127A + 70, di + 46));
+ if ( (((tmpVar == 25) || (tmpVar == 23) || (tmpVar == 14)) && (var_field127A <= var_4) && (_field127A >= var_4))
+ || (((tmpVar == 26) || (tmpVar == 24) || (tmpVar == 15) || (tmpVar == 5) || (tmpVar == 4)) && (_field126E >= var_8) && (_field126E <= 3) && (_action1._field24 != 0)) ) {
+ var_field127A = var_4;
+ if ((tmpVar == 26) || (tmpVar == 24) || (tmpVar == 15) || (tmpVar == 5) || (tmpVar == 4))
+ R2_GLOBALS._sound2.play(339);
+ _rotation->_idxChange = 0;
+ _field1270 = 0;
+ _field126E = 0;
+ _field1272 = 0;
+ if (_action1._field24 == 0)
+ _actor8.hide();
+ } else if ((tmpVar == 1) && (var_field127A >= var_4 + 5) && (_field127A >= var_4 + 5)) {
+ var_field127A = var_4 + 5;
+ R2_GLOBALS._sound2.play(339);
+ _rotation->_idxChange = 0;
+ _field1270 = 0;
+ _field126E = 0;
+ _field1272 = 0;
+ if (_action1._field24 == 0)
+ _actor8.hide();
+ } else if (((tmpVar == 26) || (tmpVar == 24) || (tmpVar == 15) || (tmpVar == 5) || (tmpVar == 4)) && (var_a != 0) && (var_a <= 3)) {
+ di = var_6;
+ R2_GLOBALS._sound2.play(339);
+ } else {
+ // Nothing
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (_field1284 < 2) {
+ _field127A = var_field127A;
+ _field127C = di;
+ if (_unkObj1.sub109C5E(_field127A, _field127C) != 0) {
+ _field1272 = 0;
+ _field126E = 0;
+ _field1270 = 0;
+ _rotation->setDelay(0);
+ _rotation->_idxChange = 0;
+ }
+ warning("gfx_set_pane_p");
+ _unkObj1.sub51B02();
+ if (_field1284 != 0)
+ ++_field1284;
+ }
+ }
+
+ if (_field1272 == 0) {
+ if (_field126E != _field1270) {
+ if (_field126E >= _field1270) {
+ if (_field126E == 1) {
+ if (_action1._field24 != 0) {
+ if ( ((_field1276 == 1) && (var_8 == 0) && (var_a != 0) && (var_a <= 3) && ((tmpVar == 25) || (tmpVar == 26) || (tmpVar == 5) || (tmpVar == 14) || (tmpVar == 15)))
+ || ((_field1276 == 3) && (var_a == 0) && (var_8 != 0) && (var_8 <= 3) && ((tmpVar == 25) || (tmpVar == 23) || (tmpVar == 14) || (tmpVar == 5) || (tmpVar == 4)))
+ || ((_field1276 == 5) && (var_8 == 0) && (var_a != 0) && (var_a <= 3) && ((tmpVar == 23) || (tmpVar == 24) || (tmpVar == 4) || (tmpVar == 14) || (tmpVar == 15)))
+ || ((_field1276 == 7) && (var_a == 0) && (var_8 != 0) && (var_8 <= 3) && ((tmpVar == 26) || (tmpVar == 24) || (tmpVar == 15) || (tmpVar == 5) || (tmpVar == 4))) ){
+ _field126E = 1;
+ } else
+ _field126E--;
+ } else
+ _field126E--;
+ } else
+ _field126E--;
+ } else
+ ++_field126E;
+ _field1272 = 1;
+ }
+ _actor2.setFrame2(_field126E);
+ }
+
+ if (_field1272 == 1) {
+ if (_field126E == 0)
+ _rotation->_idxChange = 0;
+ else if (_field126E > 8)
+ _rotation->_idxChange = 2;
+ else
+ _rotation->_idxChange = 1;
+ }
+
+ if (_field1272 != 0)
+ _field1272--;
+
+ if (_field126E != 0) {
+ R2_GLOBALS._player._uiEnabled = false;
+ if (_field126E != _field1270)
+ _aSound1.play(276);
+ } else {
+ R2_GLOBALS._player._uiEnabled = true;
+ _aSound1.fadeOut2(NULL);
+ }
+
+ if (_rotation->_currIndex != _field1274)
+ _field1274 = _rotation->_currIndex;
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3600 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene3600::Scene3600() {
+ _field2548 = 0;
+ _field254A = 0;
+ _field254C = 0;
+ _field254E = 0;
+ _field2550 = false;
+}
+void Scene3600::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field2548);
+ s.syncAsSint16LE(_field254A);
+ s.syncAsSint16LE(_field254C);
+ s.syncAsSint16LE(_field254E);
+ s.syncAsSint16LE(_field2550);
+}
+
+Scene3600::Action3600::Action3600() {
+ _field1E = 0;
+ _field20 = 0;
+}
+
+void Scene3600::Action3600::synchronize(Serializer &s) {
+ Action::synchronize(s);
+
+ s.syncAsSint16LE(_field1E);
+ s.syncAsSint16LE(_field20);
+}
+
+void Scene3600::Action3600::signal() {
+ Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex) {
+ case 0:
+ ++_actionIndex;
+ setDelay(60);
+ break;
+ case 1:
+ if (_field1E == 0) {
+ _field1E = 1;
+ scene->_actor2.setAction(NULL);
+ R2_GLOBALS._sound2.play(330, NULL, 0);
+ R2_GLOBALS._sound2.fade(127, 5, 10, false, NULL);
+ }
+ setDelay(1);
+ warning("TODO: Palette fader using parameter 2 = 256");
+ R2_GLOBALS._scenePalette.fade((const byte *)&scene->_palette1._palette, true, _field20);
+ if (_field20 > 0)
+ _field20 -= 2;
+ break;
+ case 2:
+ R2_GLOBALS._sound2.stop();
+ ++_actionIndex;
+ setDelay(3);
+ break;
+ case 3:
+ R2_GLOBALS._sound2.play(330, this, 0);
+ R2_GLOBALS._sound2.fade(127, 5, 10, false, NULL);
+ _actionIndex = 1;
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene3600::Action2::signal() {
+ Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex) {
+ case 3621:
+ R2_GLOBALS._events.proc1();
+ R2_GLOBALS._player.enableControl();
+ _actionIndex = 3619;
+ scene->_actor13._state = 0;
+ // No break on purpose
+ case 3619: {
+ ++_actionIndex;
+ scene->_actor13.setup(3127, 2, 1);
+ scene->_actor13.animate(ANIM_MODE_1, NULL);
+ NpcMover *mover = new NpcMover();
+ scene->_actor13.addMover(mover, &scene->_actor13._field8A, scene);
+ }
+ break;
+ default:
+ _actionIndex = 3619;
+ setDelay(360);
+ break;
+ }
+}
+
+bool Scene3600::Item5::startAction(CursorType action, Event &event) {
+ Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action != CURSOR_USE) || (scene->_action1._field1E == 0))
+ return SceneItem::startAction(action, event);
+
+ R2_GLOBALS._walkRegions.disableRegion(2);
+ R2_GLOBALS._walkRegions.disableRegion(7);
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3624;
+ scene->_actor10.setStrip2(-1);
+ scene->_actor11.setStrip2(-1);
+ scene->_actor12.setStrip2(-1);
+ scene->_actor4.setStrip2(-1);
+
+ if (R2_GLOBALS._player._characterIndex == 2)
+ R2_GLOBALS._player.setAction(&scene->_sequenceManager3, scene, 3611, &R2_GLOBALS._player, NULL);
+ else if (R2_GLOBALS._player._characterIndex == 3)
+ R2_GLOBALS._player.setAction(&scene->_sequenceManager4, scene, 3612, &R2_GLOBALS._player, NULL);
+ else
+ R2_GLOBALS._player.setAction(&scene->_sequenceManager2, scene, 3610, &R2_GLOBALS._player, NULL);
+
+ return true;
+}
+
+bool Scene3600::Actor13::startAction(CursorType action, Event &event) {
+ Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
+
+ switch(action) {
+ case CURSOR_TALK:
+ if (!_action)
+ return SceneActor::startAction(action, event);
+
+ scene->_protectorSpeaker._displayMode = 1;
+ if (!R2_GLOBALS._player._mover)
+ R2_GLOBALS._player.addMover(NULL);
+ if (!scene->_actor10._mover)
+ scene->_actor10.addMover(NULL);
+ if (!scene->_actor11._mover)
+ scene->_actor11.addMover(NULL);
+ if (!scene->_actor12._mover)
+ scene->_actor12.addMover(NULL);
+ if (!scene->_actor4._mover)
+ scene->_actor4.addMover(NULL);
+
+ setup(3127, 2, 1);
+ scene->_sceneMode = 3327;
+ scene->_stripManager.start(3327, scene);
+
+ return true;
+ case R2_SONIC_STUNNER:
+ // No break on purpose
+ case R2_PHOTON_STUNNER:
+ if (action == R2_SONIC_STUNNER)
+ R2_GLOBALS._sound3.play(43);
+ else
+ R2_GLOBALS._sound3.play(99);
+ if (_state != 0) {
+ _state = 1;
+ setup(3128, 1, 1);
+ addMover(NULL);
+ }
+ scene->_action2.setActionIndex(3621);
+
+ if (!_action)
+ setAction(&scene->_action2, scene, NULL);
+
+ animate(ANIM_MODE_5, &scene->_action2);
+ R2_GLOBALS._player.disableControl();
+ return true;
+ break;
+ default:
+ return SceneActor::startAction(action, event);
+ break;
+ }
+}
+
+void Scene3600::postInit(SceneObjectList *OwnerList) {
+ if (R2_GLOBALS._sceneManager._previousScene == 3600) {
+ R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
+ R2_GLOBALS._v558B6.set(60, 0, 260, 200);
+ } else {
+ R2_GLOBALS._scrollFollower = &_actor2;
+ g_globals->gfxManager()._bounds.moveTo(Common::Point(160, 0));
+ R2_GLOBALS._v558B6.set(25, 0, 260, 200);
+ }
+
+ loadScene(3600);
+ SceneExt::postInit();
+ _field254C = 0;
+
+ _stripManager.setColors(60, 255);
+ _stripManager.setFontNumber(3);
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_seekerSpeaker);
+ _stripManager.addSpeaker(&_mirandaSpeaker);
+ _stripManager.addSpeaker(&_tealSpeaker);
+ _stripManager.addSpeaker(&_protectorSpeaker);
+
+ setZoomPercents(142, 80, 167, 105);
+ R2_GLOBALS._player._characterScene[1] = 3600;
+ R2_GLOBALS._player._characterScene[2] = 3600;
+ R2_GLOBALS._player._characterScene[3] = 3600;
+
+ _item2.setDetails(33, 3600, 6, -1, -1);
+ _item3.setDetails(Rect(3, 3, 22, 45), 3600, 9, -1, -1, 1, NULL);
+ _item4.setDetails(Rect(449, 3, 475, 45), 3600, 9, -1, -1, 1, NULL);
+
+ _actor10.postInit();
+ _actor10._moveDiff = Common::Point(3, 2);
+ _actor10.changeZoom(-1);
+ _actor10._effect = 1;
+
+ if (R2_GLOBALS._player._characterIndex != 1)
+ _actor10.setDetails(9001, 0, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor11.postInit();
+ _actor11._numFrames = 7;
+ _actor11._moveDiff = Common::Point(5, 3);
+ _actor11.changeZoom(-1);
+ _actor11._effect = 1;
+
+ if (R2_GLOBALS._player._characterIndex != 2)
+ _actor11.setDetails(9002, 1, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor12.postInit();
+ _actor12._moveDiff = Common::Point(3, 2);
+ _actor12.changeZoom(-1);
+ _actor12._effect = 1;
+
+ if (R2_GLOBALS._player._characterIndex != 3)
+ _actor12.setDetails(9003, 1, -1, -1, 1, (SceneItem *) NULL);
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.changeZoom(-1);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.disableControl();
+
+ _actor4.postInit();
+ _actor4._numFrames = 7;
+ _actor4._moveDiff = Common::Point(5, 3);
+ _actor4.changeZoom(-1);
+ _actor4._effect = 1;
+ _actor4.setDetails(3600, 27, -1, -1, 1, (SceneItem *) NULL);
+
+ _actor5.postInit();
+ _actor5._numFrames = 7;
+ _actor5._moveDiff = Common::Point(3, 2);
+ _actor5.changeZoom(-1);
+ _actor5._effect = 1;
+ _actor5.setDetails(3600, 12, -1, -1, 1, (SceneItem *) NULL);
+
+ _palette1.loadPalette(0);
+ _palette1.loadPalette(3601);
+
+ if (R2_GLOBALS._sceneManager._previousScene == 3600) {
+ _item5._sceneRegionId = 200;
+ _item5.setDetails(3600, 30, -1, -1, 5, &_actor4);
+ _field254A = 1;
+ _field2548 = 1;
+
+ R2_GLOBALS._walkRegions.enableRegion(2);
+ R2_GLOBALS._walkRegions.enableRegion(7);
+ R2_GLOBALS._walkRegions.enableRegion(14);
+ R2_GLOBALS._walkRegions.enableRegion(15);
+ R2_GLOBALS._walkRegions.enableRegion(16);
+
+ _actor10.setup(10, 5, 11);
+ _actor10.animate(ANIM_MODE_1, NULL);
+
+ _actor11.setup(20, 5, 11);
+ _actor11.animate(ANIM_MODE_1, NULL);
+
+ _actor12.setup(30, 5, 11);
+ _actor12.animate(ANIM_MODE_1, NULL);
+
+ if (R2_GLOBALS._player._characterIndex == 2) {
+ _actor10.setPosition(Common::Point(76, 148));
+ _actor11.setPosition(Common::Point(134, 148));
+ _actor12.setPosition(Common::Point(100, 148));
+ R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
+ R2_GLOBALS._player.setup(20, _actor11._strip, 1);
+ R2_GLOBALS._player.setPosition(_actor11._position);
+ _actor11.hide();
+ } else if (R2_GLOBALS._player._characterIndex == 3) {
+ _actor10.setPosition(Common::Point(110, 148));
+ _actor11.setPosition(Common::Point(76, 148));
+ _actor12.setPosition(Common::Point(134, 148));
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ R2_GLOBALS._player.setup(30, _actor12._strip, 1);
+ R2_GLOBALS._player.setPosition(_actor12._position);
+ _actor12.hide();
+ } else {
+ _actor10.setPosition(Common::Point(134, 148));
+ _actor11.setPosition(Common::Point(76, 148));
+ _actor12.setPosition(Common::Point(110, 148));
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ R2_GLOBALS._player.setup(10, _actor10._strip, 1);
+ R2_GLOBALS._player.setPosition(_actor10._position);
+ _actor10.hide();
+ }
+ _actor4.setPosition(Common::Point(47, 149));
+ _actor4.setup(40, 1, 11);
+ _actor4.animate(ANIM_MODE_1, NULL);
+
+ _actor5.setPosition(Common::Point(367, 148));
+ _actor5.setup(3601, 7, 5);
+
+ if (!R2_GLOBALS.getFlag(71)) {
+ _actor13.postInit();
+ _actor13._state = 0;
+ _actor13._field8A = Common::Point(226, 152);
+ _actor13._moveDiff = Common::Point(3, 2);
+ _actor13.setPosition(Common::Point(284, 152));
+ _actor13.setup(3127, 2, 1);
+ _actor13.changeZoom(-1);
+ _actor13.setDetails(3600, 15, -1, 17, 1, (SceneItem *) NULL);
+ }
+
+ R2_GLOBALS._sound2.play(330);
+ _actor3.postInit();
+ _actor3.setPosition(Common::Point(84, 156));
+ _actor3.fixPriority(158);
+ _actor3.setup(3601, 5, 1);
+ _actor3.animate(ANIM_MODE_2, NULL);
+
+ _action1._field1E = 1;
+ _action1._field20 = 0;
+ _action1.setActionIndex(1);
+
+ _actor3.setAction(&_action1);
+ _sceneMode = 3623;
+
+ g_globals->_events.setCursor(CURSOR_ARROW);
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ } else {
+ _field254A = 0;
+ _field2548 = 0;
+
+ R2_GLOBALS._walkRegions.enableRegion(17);
+ R2_GLOBALS._walkRegions.enableRegion(18);
+
+ _actor10.setPosition(Common::Point(393, 148));
+ _actor11.setPosition(Common::Point(364, 153));
+ _actor12.setPosition(Common::Point(413, 164));
+
+ R2_GLOBALS._player.hide();
+
+ _actor4.setPosition(Common::Point(373, 164));
+
+ _actor5.setup(3403, 8, 11);
+ _actor5.setPosition(Common::Point(403, 155));
+
+ _actor12.setup(3403, 7, 1);
+
+ _actor13.setPosition(Common::Point(405, 155));
+
+ _actor2.postInit();
+ _actor2.setup(3600, 2, 1);
+ _actor2.setPosition(Common::Point(403, 161));
+ _actor2.fixPriority(149);
+ _actor2.changeZoom(-1);
+
+ _action1._field1E = 0;
+ _action1._field20 = 90;
+
+ _sceneMode = 3600;
+ setAction(&_sequenceManager1, this, 3600, &_actor11, &_actor10, &_actor12, &_actor4, &_actor5, &_actor2, NULL);
+ _field254E = 0;
+ }
+ _field254E = 0;
+ _field2550 = R2_GLOBALS.getFlag(71);
+
+ R2_GLOBALS._sound1.play(326);
+ _item1.setDetails(Rect(0, 0, 480, 200), 3600, 0, -1, -1, 1, NULL);
+}
+
+void Scene3600::remove() {
+ _actor3.animate(ANIM_MODE_NONE, NULL);
+ _actor3.setAction(NULL);
+ R2_GLOBALS._sound2.fadeOut2(NULL);
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
+ SceneExt::remove();
+}
+
+void Scene3600::signal() {
+ switch (_sceneMode) {
+ case 3320:
+ warning("STUB: sub_1D227()");
+ R2_GLOBALS._walkRegions.enableRegion(14);
+ R2_GLOBALS._scrollFollower = &_actor11;
+ _tealSpeaker._object1.hide();
+ _actor5.show();
+ _actor5.setStrip(2);
+ if (R2_GLOBALS._player._characterIndex == 2)
+ _sceneMode = 3602;
+ else if (R2_GLOBALS._player._characterIndex == 3)
+ _sceneMode = 3603;
+ else
+ _sceneMode = 3601;
+ setAction(&_sequenceManager1, this, _sceneMode, &_actor11, &_actor10, &_actor12, &_actor4, &_actor5, NULL);
+ break;
+ case 3321:
+ warning("STUB: sub_1D227()");
+ R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
+ _tealSpeaker.proc16();
+ _actor5.show();
+ _actor5.setStrip(1);
+ _actor3.postInit();
+ _sceneMode = 3604;
+ setAction(&_sequenceManager1, this, _sceneMode, &_actor5, &_actor3, &_actor10, &_actor11, &_actor12, &_actor4, NULL);
+ break;
+ case 3322:
+ warning("STUB: sub_1D227()");
+ _quinnSpeaker.proc16();
+ _quinnSpeaker._displayMode = 1;
+ _tealSpeaker.proc16();
+ _tealSpeaker._displayMode = 7;
+ R2_GLOBALS._scrollFollower = &_actor5;
+ _sceneMode = 3605;
+ setAction(&_sequenceManager1, this, _sceneMode, &_actor5, &_actor13, &_actor2, NULL);
+ break;
+ case 3323:
+ if (_field254A == 0)
+ _field254A = 1;
+ else {
+ warning("STUB: sub_1D227()");
+ _protectorSpeaker.proc16();
+ _actor13.show();
+ _actor13.setup(3258, 6, 1);
+ _sceneMode = 3607;
+ _actor13.setAction(&_sequenceManager1, this, _sceneMode, &_actor13, NULL);
+ R2_GLOBALS._v558C2 = 1;
+ _protectorSpeaker.proc16();
+ _protectorSpeaker._displayMode = 1;
+ _quinnSpeaker._displayMode = 1;
+ _actor13.show();
+ R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
+ R2_GLOBALS._walkRegions.disableRegion(17);
+ R2_GLOBALS._walkRegions.disableRegion(18);
+ R2_GLOBALS._walkRegions.enableRegion(2);
+ R2_GLOBALS._walkRegions.enableRegion(7);
+ R2_GLOBALS._walkRegions.enableRegion(14);
+ R2_GLOBALS._walkRegions.enableRegion(15);
+ R2_GLOBALS._walkRegions.enableRegion(16);
+ _actor13.setAction(&_action1);
+ }
+ break;
+ case 3324:
+ // No break on purpose
+ case 3607:
+ g_globals->_events.setCursor(CURSOR_ARROW);
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ _actor13.fixPriority(-1);
+ _sceneMode = 3623;
+ _field2548 = 1;
+ break;
+ case 3327:
+ g_globals->_events.setCursor(CURSOR_ARROW);
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ _sceneMode = 3623;
+ break;
+ case 3450:
+ R2_GLOBALS._sound1.stop();
+ _actor1.hide();
+ _actor6.hide();
+ g_globals->gfxManager()._bounds.moveTo(Common::Point(40, 0));
+ setZoomPercents(142, 80, 167, 105);
+ loadScene(3600);
+ R2_GLOBALS._uiElements.show();
+ _item5._sceneRegionId = 200;
+ _item5.setDetails(3600, 30, -1, -1, 5, &_actor4);
+
+ _actor3.show();
+ _actor10.show();
+ _actor11.show();
+ _actor12.show();
+ _actor4.show();
+ _actor5.show();
+
+ _actor5.setPosition(Common::Point(298, 151));
+
+ _actor13.postInit();
+ _actor13._state = 0;
+ _actor13._field8A = Common::Point(226, 152);
+ _actor13._moveDiff = Common::Point(5, 3);
+ _actor13.setup(3403, 7, 1);
+ _actor13.setPosition(Common::Point(405, 155));
+ _actor13.changeZoom(-1);
+ _actor13.addMover(NULL);
+ _actor13.animate(ANIM_MODE_NONE);
+ _actor13.hide();
+ _actor13.setDetails(3600, 15, -1, 17, 5, &_item5);
+
+ _actor2.setup(3600, 2, 1);
+ _actor2.setPosition(Common::Point(403, 161));
+ _actor2.fixPriority(149);
+ _actor2.changeZoom(-1);
+ _actor2.show();
+
+ _quinnSpeaker._displayMode = 2;
+ _tealSpeaker._displayMode = 2;
+
+ if (R2_GLOBALS._player._characterIndex == 2) {
+ R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
+ R2_GLOBALS._player.setup(20, _actor11._strip, 1);
+ R2_GLOBALS._player.setPosition(_actor11._position);
+ _actor11.hide();
+ } else if (R2_GLOBALS._player._characterIndex == 3) {
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ R2_GLOBALS._player.setup(30, _actor12._strip, 1);
+ R2_GLOBALS._player.setPosition(_actor12._position);
+ _actor12.hide();
+ } else {
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ R2_GLOBALS._player.setup(10, _actor10._strip, 1);
+ R2_GLOBALS._player.setPosition(_actor10._position);
+ _actor10.hide();
+ }
+ R2_GLOBALS._player.show();
+ R2_GLOBALS._sound1.play(326);
+ _sceneMode = 3322;
+ _stripManager.start(3322, this);
+ R2_GLOBALS._sound2.play(329);
+ break;
+ case 3600:
+ _sceneMode = 3320;
+ _stripManager.start(3320, this);
+ break;
+ case 3601:
+ // No break on purpose
+ case 3602:
+ // No break on purpose
+ case 3603:
+ R2_GLOBALS._walkRegions.enableRegion(2);
+ R2_GLOBALS._walkRegions.enableRegion(7);
+ R2_GLOBALS._v558B6.set(60, 0, 260, 200);
+ _tealSpeaker._displayMode = 1;
+ _sceneMode = 3321;
+ _stripManager.start(3321, this);
+ break;
+ case 3604:
+ R2_GLOBALS._sound2.fadeOut2(NULL);
+ R2_GLOBALS._sound1.stop();
+ R2_GLOBALS._walkRegions.disableRegion(2);
+ R2_GLOBALS._walkRegions.disableRegion(7);
+
+ _actor2.hide();
+ _actor3.hide();
+ R2_GLOBALS._player.hide();
+ _actor10.hide();
+ _actor11.hide();
+ _actor12.hide();
+ _actor4.hide();
+ _actor5.hide();
+
+ g_globals->gfxManager()._bounds.moveTo(Common::Point(60, 0));
+ setZoomPercents(51, 46, 180, 200);
+
+ loadScene(3400);
+ R2_GLOBALS._uiElements.show();
+ _actor1.postInit();
+
+ _actor2.setup(3403, 1, 1);
+ _actor2.setPosition(Common::Point(190, 103));
+ _actor2.fixPriority(89);
+ _actor2.show();
+
+ _actor6.postInit();
+ _actor6.setup(3400, 1, 6);
+ _actor6.setPosition(Common::Point(236, 51));
+ _actor6.fixPriority(51);
+ R2_GLOBALS._scrollFollower = &_actor6;
+
+ R2_GLOBALS._sound1.play(323);
+ _sceneMode = 3450;
+ setAction(&_sequenceManager1, this, 3450, &_actor1, &_actor6, NULL);
+ break;
+ case 3605:
+ _actor13.setup(3258, 4, 1);
+ _actor13.setAction(&_sequenceManager1, this, 3606, &_actor5, &_actor13, &_actor2, NULL);
+ _sceneMode = 3323;
+ _stripManager.start(3323, this);
+
+ break;
+ case 3620:
+ // No break on purpose
+ case 3623:
+ if ((_actor13._position.x == 226) && (_actor13._position.y == 152) && (_action1._field1E != 0) && (_actor13._visage == 3127) && (!R2_GLOBALS.getFlag(71))) {
+ R2_GLOBALS._sound2.stop();
+ R2_GLOBALS._sound2.play(331);
+ R2_GLOBALS.setFlag(71);
+ _sceneMode = 3626;
+ setAction(&_sequenceManager1, this, 3626, &_actor13, NULL);
+ }
+ break;
+ case 3624:
+ R2_GLOBALS._player.disableControl();
+ if ((_field254E != 0) && (_actor10._position.x == 229) && (_actor10._position.y == 154) && (_actor11._position.x == 181) && (_actor11._position.y == 154) && (_actor12._position.x == 207) && (_actor12._position.y == 154) && (_actor4._position.x == 155) && (_actor4._position.y == 154)) {
+ R2_GLOBALS._sound2.stop();
+ R2_GLOBALS._sound2.play(331);
+ _sceneMode = 3625;
+ setAction(&_sequenceManager1, this, 3625, &_actor10, &_actor11, &_actor12, &_actor4, NULL);
+ }
+ break;
+ case 3625:
+ R2_GLOBALS._sound2.stop();
+ R2_GLOBALS._sceneManager.changeScene(3700);
+ break;
+ case 3626:
+ _actor13.setPosition(Common::Point(0, 0));
+ _action1.setActionIndex(2);
+ if (R2_GLOBALS._events.getCursor() > R2_LAST_INVENT) {
+ R2_GLOBALS._events.setCursor(CURSOR_USE);
+ R2_GLOBALS._player.enableControl(CURSOR_USE);
+ } else {
+ R2_GLOBALS._player.enableControl();
+ }
+ R2_GLOBALS._sound2.stop();
+ _sceneMode = 3623;
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene3600::process(Event &event) {
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_ARROW) && (event.mousePos.x > 237) && (!R2_GLOBALS.getFlag(71))) {
+ SceneItem::display(3600, 17, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7 -999);
+ event.handled = true;
+ }
+ Scene::process(event);
+}
+
+void Scene3600::dispatch() {
+ if ((R2_GLOBALS._player.getRegionIndex() == 200) && (_action1._field1E != 0) && (_field254E == 0)){
+ R2_GLOBALS._sound2.fadeOut2(NULL);
+ if (_actor13._mover)
+ _actor13.addMover(NULL);
+ if (R2_GLOBALS._player._action)
+ R2_GLOBALS._player.setAction(NULL);
+ if (R2_GLOBALS._player._mover)
+ R2_GLOBALS._player.addMover(NULL);
+
+ _field254C = 0;
+ _field254E = 1;
+
+ R2_GLOBALS._walkRegions.disableRegion(2);
+ R2_GLOBALS._walkRegions.disableRegion(7);
+ R2_GLOBALS._player.disableControl();
+
+ _sceneMode = 3624;
+
+ _actor10.setStrip(-1);
+ _actor11.setStrip(-1);
+ _actor12.setStrip(-1);
+ _actor4.setStrip(-1);
+
+ R2_GLOBALS._player.hide();
+
+ if (R2_GLOBALS._player._characterIndex == 2) {
+ _actor11.setPosition(R2_GLOBALS._player._position);
+ _actor11.show();
+ } else if (R2_GLOBALS._player._characterIndex == 3) {
+ _actor12.setPosition(R2_GLOBALS._player._position);
+ _actor12.show();
+ } else {
+ _actor10.setPosition(R2_GLOBALS._player._position);
+ _actor10.show();
+ }
+ _actor10.setAction(&_sequenceManager2, this, 3610, &_actor10, NULL);
+ _actor11.setAction(&_sequenceManager3, this, 3611, &_actor11, NULL);
+ _actor12.setAction(&_sequenceManager4, this, 3612, &_actor12, NULL);
+ _actor4.setAction(&_sequenceManager1, this, 3613, &_actor4, NULL);
+ }
+
+ if ((_actor13.getRegionIndex() == 200) && (_action1._field1E != 0) && (_field254E == 0)){
+ R2_GLOBALS._sound2.fadeOut2(NULL);
+ _sceneMode = 3620;
+ _field2550 = 1;
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_GLOBALS._player._mover)
+ R2_GLOBALS._player.addMover(NULL);
+ if (_actor10._mover)
+ _actor10.addMover(NULL);
+ if (_actor11._mover)
+ _actor11.addMover(NULL);
+ if (_actor12._mover)
+ _actor12.addMover(NULL);
+ if (_actor4._mover)
+ _actor4.addMover(NULL);
+ }
+ Scene::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3700 - Cutscene - Teleport outside
+ *
+ *--------------------------------------------------------------------------*/
+void Scene3700::postInit(SceneObjectList *OwnerList) {
+ loadScene(3700);
+ R2_GLOBALS._uiElements._active = false;
+ SceneExt::postInit();
+
+ _stripManager.setColors(60, 255);
+ _stripManager.setFontNumber(3);
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_seekerSpeaker);
+ _stripManager.addSpeaker(&_mirandaSpeaker);
+
+ _actor1.postInit();
+ _actor1._moveDiff = Common::Point(3, 2);
+
+ _actor2.postInit();
+ _actor2._numFrames = 7;
+ _actor2._moveDiff = Common::Point(5, 3);
+ _actor2.hide();
+
+ _actor3.postInit();
+ _actor3._moveDiff = Common::Point(3, 2);
+ _actor3.hide();
+
+ _actor4.postInit();
+ _actor4._numFrames = 7;
+ _actor4._moveDiff = Common::Point(5, 3);
+ _actor4.hide();
+
+ _actor5.postInit();
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._sound1.play(332);
+
+ _sceneMode = 3700;
+ setAction(&_sequenceManager, this, 3700, &_actor1, &_actor2, &_actor3, &_actor4, &_actor5, NULL);
+}
+
+void Scene3700::remove() {
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ SceneExt::remove();
+}
+
+void Scene3700::signal() {
+ switch (_sceneMode) {
+ case 3328:
+ // No break on purpose
+ case 3329:
+ warning("STUB: sub_1D227()");
+ _sceneMode = 3701;
+ setAction(&_sequenceManager, this, 3701, &_actor2, &_actor3, &_actor4, NULL);
+ break;
+ case 3700:
+ _actor1.setup(10, 6, 1);
+ _actor2.setup(20, 5, 1);
+ if (R2_GLOBALS.getFlag(71)) {
+ _sceneMode = 3329;
+ _stripManager.start(3329, this);
+ } else {
+ _sceneMode = 3328;
+ _stripManager.start(3328, this);
+ }
+ break;
+ case 3701:
+ R2_GLOBALS._sceneManager.changeScene(1000);
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3800 -
+ *
+ *--------------------------------------------------------------------------*/
+Scene3800::Scene3800() {
+ _field412 = 0;
+}
+void Scene3800::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field412);
+}
+
+void Scene3800::Exit1::changeScene() {
+ Scene3800 *scene = (Scene3800 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ scene->_field412 = 1;
+
+ if (R2_GLOBALS.getFlag(46)) {
+ if (scene->_field412 == R2_GLOBALS._v566A9) {
+ R2_GLOBALS._v566AA = 3;
+ if (R2_GLOBALS._v56A93 + 1 == 0) {
+ R2_GLOBALS._v566A8--;
+ R2_GLOBALS._v566A9 = 0;
+ } else {
+ R2_GLOBALS._v566A9 = R2_GLOBALS._v566AB[R2_GLOBALS._v56A93];
+ R2_GLOBALS._v56A93--;
+ }
+ } else {
+ ++R2_GLOBALS._v56A93;
+ if (R2_GLOBALS._v56A93 > 999)
+ R2_GLOBALS._v56A93 = 999;
+ R2_GLOBALS._v566AB[R2_GLOBALS._v56A93] = R2_GLOBALS._v566A9;
+ R2_GLOBALS._v566A9 = 3;
+ }
+ }
+
+ if (R2_GLOBALS._v566A8 == 0)
+ scene->_sceneMode = 16;
+ else
+ scene->_sceneMode = 11;
+
+ Common::Point pt(160, 115);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene3800::Exit2::changeScene() {
+ Scene3800 *scene = (Scene3800 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ scene->_field412 = 2;
+
+ if (R2_GLOBALS.getFlag(46)) {
+ if (scene->_field412 == R2_GLOBALS._v566A9) {
+ R2_GLOBALS._v566AA = 4;
+ if (R2_GLOBALS._v56A93 + 1 == 0) {
+ R2_GLOBALS._v566A8--;
+ R2_GLOBALS._v566A9 = 0;
+ } else {
+ R2_GLOBALS._v566A9 = R2_GLOBALS._v566AB[R2_GLOBALS._v56A93];
+ R2_GLOBALS._v56A93--;
+ }
+ } else {
+ ++R2_GLOBALS._v56A93;
+ if (R2_GLOBALS._v56A93 > 999)
+ R2_GLOBALS._v56A93 = 999;
+ R2_GLOBALS._v566AB[R2_GLOBALS._v56A93] = R2_GLOBALS._v566A9;
+ R2_GLOBALS._v566A9 = 4;
+ }
+ }
+
+ if (R2_GLOBALS._v566A8 == 0)
+ scene->_sceneMode = 16;
+ else
+ scene->_sceneMode = 12;
+
+ Common::Point pt(330, 145);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene3800::Exit3::changeScene() {
+ Scene3800 *scene = (Scene3800 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ scene->_field412 = 3;
+
+ if (R2_GLOBALS.getFlag(46)) {
+ if (scene->_field412 == R2_GLOBALS._v566A9) {
+ R2_GLOBALS._v566AA = 1;
+ if (R2_GLOBALS._v56A93 + 1 == 0) {
+ R2_GLOBALS._v566A8--;
+ R2_GLOBALS._v566A9 = 0;
+ } else {
+ R2_GLOBALS._v566A9 = R2_GLOBALS._v566AB[R2_GLOBALS._v56A93];
+ R2_GLOBALS._v56A93--;
+ }
+ } else {
+ ++R2_GLOBALS._v56A93;
+ if (R2_GLOBALS._v56A93 > 999)
+ R2_GLOBALS._v56A93 = 999;
+ R2_GLOBALS._v566AB[R2_GLOBALS._v56A93] = R2_GLOBALS._v566A9;
+ R2_GLOBALS._v566A9 = 1;
+ }
+ }
+
+ if (R2_GLOBALS._v566A8 == 0)
+ scene->_sceneMode = 16;
+ else
+ scene->_sceneMode = 13;
+
+ Common::Point pt(160, 220);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene3800::Exit4::changeScene() {
+ Scene3800 *scene = (Scene3800 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ scene->_field412 = 4;
+
+ if (R2_GLOBALS.getFlag(46)) {
+ if (scene->_field412 == R2_GLOBALS._v566A9) {
+ R2_GLOBALS._v566AA = 2;
+ if (R2_GLOBALS._v56A93 + 1 == 0) {
+ R2_GLOBALS._v566A8--;
+ R2_GLOBALS._v566A9 = 0;
+ } else {
+ R2_GLOBALS._v566A9 = R2_GLOBALS._v566AB[R2_GLOBALS._v56A93];
+ R2_GLOBALS._v56A93--;
+ }
+ } else {
+ ++R2_GLOBALS._v56A93;
+ if (R2_GLOBALS._v56A93 > 999)
+ R2_GLOBALS._v56A93 = 999;
+ R2_GLOBALS._v566AB[R2_GLOBALS._v56A93] = R2_GLOBALS._v566A9;
+ R2_GLOBALS._v566A9 = 2;
+ }
+ }
+
+ if (R2_GLOBALS._v566A8 == 0)
+ scene->_sceneMode = 16;
+ else
+ scene->_sceneMode = 14;
+
+ Common::Point pt(-10, 145);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene3800::initScene3800() {
+ _exit1._enabled = true;
+ _exit2._enabled = true;
+ _exit3._enabled = true;
+ _exit4._enabled = true;
+ _exit1._insideArea = false;
+ _exit2._insideArea = false;
+ _exit3._insideArea = false;
+ _exit4._insideArea = false;
+ _exit1._moving = false;
+ _exit2._moving = false;
+ _exit3._moving = false;
+ _exit4._moving = false;
+
+ loadScene(R2_GLOBALS._v566A6);
+
+ R2_GLOBALS._uiElements.draw();
+}
+
+void Scene3800::sub110BBD() {
+ R2_GLOBALS._player.disableControl();
+ switch (_field412) {
+ case 0:
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.setVisage(10);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.setPosition(Common::Point(160, 145));
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.changeZoom(-1);
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ _actor1.postInit();
+ _actor1.fixPriority(10);
+ _actor1.changeZoom(-1);
+ _actor1.setVisage(1110);
+ _actor1._effect = 5;
+ _actor1._field9C = this->_field312;
+ R2_GLOBALS._player._linkedActor = &_actor1;
+ switch (R2_GLOBALS._sceneManager._previousScene) {
+ case 2600:
+ _object1.postInit();
+ _object2.postInit();
+ _actor1.hide();
+ _sceneMode = 3800;
+ setAction(&_sequenceManager1, this, 3800, &R2_GLOBALS._player, &_object1, &_object2, NULL);
+ break;
+ case 3900:
+ _sceneMode = 15;
+ switch (R2_GLOBALS._v566AA - 1) {
+ case 0: {
+ R2_GLOBALS._player.setPosition(Common::Point(160, 220));
+ Common::Point pt(160, 160);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 1: {
+ R2_GLOBALS._player.setPosition(Common::Point(-10, 145));
+ Common::Point pt(19, 145);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 2: {
+ R2_GLOBALS._player.setPosition(Common::Point(160, 115));
+ Common::Point pt(160, 120);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 3: {
+ R2_GLOBALS._player.setPosition(Common::Point(330, 145));
+ Common::Point pt(300, 145);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ default:
+ break;
+ }
+ default:
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ break;
+ }
+ break;
+ case 1: {
+ _sceneMode = 15;
+ R2_GLOBALS._player.setPosition(Common::Point(160, 220));
+ Common::Point pt(160, 160);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 2: {
+ _sceneMode = 15;
+ R2_GLOBALS._player.setPosition(Common::Point(-10, 145));
+ Common::Point pt(19, 145);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 3: {
+ _sceneMode = 15;
+ R2_GLOBALS._player.setPosition(Common::Point(160, 115));
+ Common::Point pt(160, 120);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 4: {
+ _sceneMode = 15;
+ R2_GLOBALS._player.setPosition(Common::Point(330, 145));
+ Common::Point pt(300, 145);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene3800::postInit(SceneObjectList *OwnerList) {
+ _field412 = 0;
+
+ initScene3800();
+
+ SceneExt::postInit();
+ R2_GLOBALS._sound1.play(231);
+
+ scalePalette(65, 65, 65);
+
+ setZoomPercents(87, 40, 144, 100);
+
+ _exit1.setDetails(Rect(14, 87, 305, 125), SHADECURSOR_UP, 3800);
+ _exit1.setDest(Common::Point(160, 126));
+ _exit2.setDetails(Rect(305, 87, 320, 128), EXITCURSOR_E, 3800);
+ _exit2.setDest(Common::Point(312, 145));
+ _exit3.setDetails(Rect(14, 160, 305, 168), SHADECURSOR_DOWN, 3800);
+ _exit3.setDest(Common::Point(160, 165));
+ _exit4.setDetails(Rect(0, 87, 14, 168), EXITCURSOR_W, 3800);
+ _exit4.setDest(Common::Point(7, 145));
+
+ _rect1.set(0, 0, 320, 87);
+ _item1.setDetails(Rect(0, 0, 320, 200), 3800, 0, 1, 2, 1, (SceneItem *) NULL);
+
+ sub110BBD();
+}
+
+void Scene3800::signal() {
+ switch (_sceneMode) {
+ case 11:
+ R2_GLOBALS._v566A6 += 15;
+ if (R2_GLOBALS._v566A6 > 3815)
+ R2_GLOBALS._v566A6 -= 20;
+ initScene3800();
+ sub110BBD();
+ break;
+ case 12:
+ R2_GLOBALS._v566A6 += 5;
+ if (R2_GLOBALS._v566A6 > 3815)
+ R2_GLOBALS._v566A6 = 3800;
+ initScene3800();
+ sub110BBD();
+ break;
+ case 13:
+ R2_GLOBALS._v566A6 -= 15;
+ if (R2_GLOBALS._v566A6 < 3800)
+ R2_GLOBALS._v566A6 += 20;
+ initScene3800();
+ sub110BBD();
+ break;
+ case 14:
+ R2_GLOBALS._v566A6 -= 5;
+ if (R2_GLOBALS._v566A6 < 3800)
+ R2_GLOBALS._v566A6 = 3815;
+ initScene3800();
+ sub110BBD();
+ break;
+ case 15:
+ R2_GLOBALS._v56AAB = 0;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ break;
+ case 16:
+ g_globals->_sceneManager.changeScene(3900);
+ break;
+ case 3800:
+ _actor1.show();
+ _object1.remove();
+ _object2.remove();
+ R2_GLOBALS._v56AAB = 0;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ break;
+ case 3805:
+ _exit1._enabled = false;
+ _exit2._enabled = false;
+ _exit3._enabled = false;
+ _exit4._enabled = false;
+ R2_GLOBALS._player._canWalk = false;
+ R2_GLOBALS._events.setCursor(CURSOR_USE);
+ break;
+ case 3806:
+ _exit1._enabled = true;
+ _exit2._enabled = true;
+ _exit3._enabled = true;
+ _exit4._enabled = true;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene3800::process(Event &event) {
+ if ((R2_GLOBALS._player._uiEnabled) && (event.eventType == 1) && (_rect1.contains(event.mousePos))) {
+ event.handled = true;
+ switch (R2_GLOBALS._events.getCursor()) {
+ case R2_NEGATOR_GUN:
+ R2_GLOBALS._player.addMover(NULL);
+ R2_GLOBALS._player.updateAngle(event.mousePos);
+ break;
+ case R2_STEPPING_DISKS:
+ SceneItem::display(3800, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ break;
+ case R2_ATTRACTOR_UNIT:
+ SceneItem::display(3800, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ break;
+ default:
+ event.handled = false;
+ break;
+ }
+ }
+
+ Scene::process(event);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3900 -
+ *
+ *--------------------------------------------------------------------------*/
+void Scene3900::Exit1::changeScene() {
+ Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ R2_GLOBALS._v566A9 = 3;
+ R2_GLOBALS._v566AA = 1;
+ R2_GLOBALS._v566A8 = 1;
+ scene->_sceneMode = 14;
+
+ Common::Point pt(160, 115);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene3900::Exit2::changeScene() {
+ Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ R2_GLOBALS._v566A9 = 4;
+ R2_GLOBALS._v566AA = 2;
+ R2_GLOBALS._v566A8 = 1;
+ scene->_sceneMode = 14;
+
+ Common::Point pt(330, 145);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene3900::Exit3::changeScene() {
+ Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ R2_GLOBALS._v566A9 = 1;
+ R2_GLOBALS._v566AA = 3;
+ R2_GLOBALS._v566A8 = 1;
+ scene->_sceneMode = 14;
+
+ Common::Point pt(160, 220);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene3900::Exit4::changeScene() {
+ Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ R2_GLOBALS._v566A9 = 2;
+ R2_GLOBALS._v566AA = 4;
+ R2_GLOBALS._v566A8 = 1;
+ scene->_sceneMode = 14;
+
+ Common::Point pt(-10, 145);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene3900::Exit5::changeScene() {
+ Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ R2_GLOBALS._player.disableControl(CURSOR_ARROW);
+ scene->_sceneMode = 13;
+
+ if (R2_GLOBALS._v566A9 == 4) {
+ Common::Point pt(-10, 135);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ } else {
+ Common::Point pt(330, 135);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+ }
+
+ R2_GLOBALS._v566A9 = 0;
+}
+
+void Scene3900::postInit(SceneObjectList *OwnerList) {
+ if ((R2_GLOBALS._v566AA == 2) && (R2_GLOBALS._sceneManager._previousScene != 2700))
+ loadScene(3825);
+ else
+ loadScene(3820);
+ SceneExt::postInit();
+ R2_GLOBALS._sound1.changeSound(231);
+ setZoomPercents(87, 40, 144, 100);
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.setVisage(10);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.setStrip(3);
+ R2_GLOBALS._player.changeZoom(-1);
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ _actor1.postInit();
+ _actor1.fixPriority(10);
+ _actor1.changeZoom(-1);
+ _actor1.setVisage(1110);
+ _actor1._effect = 5;
+ _actor1._field9C = _field312;
+ R2_GLOBALS._player._linkedActor = &_actor1;
+ if ((R2_GLOBALS._v566AA == 2) && (R2_GLOBALS._sceneManager._previousScene != 2700)) {
+// loadScene(3825);
+ R2_GLOBALS._v566AA = 4;
+ _exit1.setDetails(Rect(29, 87, 305, 125), SHADECURSOR_UP, 3900);
+ _exit3.setDetails(Rect(29, 160, 305, 168), SHADECURSOR_DOWN, 3900);
+
+ _exit2.setDetails(Rect(305, 87, 320, 168), EXITCURSOR_E, 3900);
+ _exit2.setDest(Common::Point(312, 145));
+ _exit2._enabled = true;
+ _exit2._insideArea = false;
+ _exit2._moving = false;
+
+ _exit4._enabled = false;
+
+ _exit5.setDetails(Rect(0, 87, 29, 168), EXITCURSOR_W, 3900);
+ _exit5.setDest(Common::Point(24, 135));
+ } else {
+// loadScene(3820);
+ R2_GLOBALS._v566AA = 2;
+ _exit1.setDetails(Rect(14, 87, 290, 125), SHADECURSOR_UP, 3900);
+ _exit3.setDetails(Rect(14, 160, 290, 168), SHADECURSOR_DOWN, 3900);
+
+
+ _exit2._enabled = false;
+
+ _exit4.setDetails(Rect(0, 87, 14, 168), EXITCURSOR_W, 3900);
+ _exit4.setDest(Common::Point(7, 145));
+ _exit4._enabled = true;
+ _exit4._insideArea = false;
+ _exit4._moving = false;
+
+ _exit5.setDetails(Rect(290, 87, 320, 168), EXITCURSOR_E, 3900);
+ _exit5.setDest(Common::Point(295, 135));
+ }
+ _exit5._enabled = true;
+ _exit5._insideArea = false;
+ _exit5._moving = false;
+
+ scalePalette(65, 65, 65);
+
+ _exit1.setDest(Common::Point(160, 126));
+ _exit1._enabled = true;
+ _exit1._insideArea = false;
+ _exit1._moving = false;
+
+ _exit3.setDest(Common::Point(160, 165));
+ _exit3._enabled = true;
+ _exit3._insideArea = false;
+ _exit3._moving = false;
+
+ R2_GLOBALS._uiElements.draw();
+
+ _rect1.set(0, 0, 320, 87);
+ _item1.setDetails(Rect(0, 0, 320, 200), 3800, 0, 1, 2, 1, (SceneItem *)NULL);
+ if (R2_GLOBALS._sceneManager._previousScene == 3800) {
+ _sceneMode = 11;
+ switch (R2_GLOBALS._v566AA - 1) {
+ case 0: {
+ R2_GLOBALS._player.setPosition(Common::Point(160, 115));
+ Common::Point pt(160, 120);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 1: {
+ R2_GLOBALS._player.setPosition(Common::Point(330, 145));
+ Common::Point pt(300, 145);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 2: {
+ R2_GLOBALS._player.setPosition(Common::Point(160, 220));
+ Common::Point pt(160, 160);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ case 3: {
+ R2_GLOBALS._player.setPosition(Common::Point(-10, 145));
+ Common::Point pt(19, 145);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ }
+ break;
+ default:
+ break;
+ }
+ } else if (R2_GLOBALS._sceneManager._previousScene == 2700) {
+ _sceneMode = 12;
+ R2_GLOBALS._player.setPosition(Common::Point(330, 135));
+ Common::Point pt(265, 135);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ } else {
+ R2_GLOBALS._player.setPosition(Common::Point(160, 145));
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ }
+}
+
+void Scene3900::signal() {
+ switch (_sceneMode) {
+ case 11:
+ // No break on purpose
+ case 12:
+ R2_GLOBALS._v56AAB = 0;
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ break;
+ case 13:
+ R2_GLOBALS._sceneManager.changeScene(2700);
+ break;
+ case 14:
+ R2_GLOBALS._sceneManager.changeScene(3800);
+ break;
+ case 3805:
+ _exit1._enabled = false;
+ _exit2._enabled = false;
+ _exit3._enabled = false;
+ _exit4._enabled = false;
+ R2_GLOBALS._player._canWalk = false;
+ R2_GLOBALS._events.setCursor(R2_STEPPING_DISKS);
+ break;
+ case 3806:
+ _exit1._enabled = true;
+ _exit2._enabled = true;
+ _exit3._enabled = true;
+ _exit4._enabled = true;
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene3900::process(Event &event) {
+ if ((R2_GLOBALS._player._uiEnabled) && (event.eventType == 1) && (_rect1.contains(event.mousePos))) {
+ event.handled = true;
+ switch (R2_GLOBALS._events.getCursor()) {
+ case R2_NEGATOR_GUN:
+ R2_GLOBALS._player.addMover(NULL);
+ R2_GLOBALS._player.updateAngle(event.mousePos);
+ break;
+ case R2_STEPPING_DISKS:
+ SceneItem::display(3800, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ break;
+ case R2_ATTRACTOR_UNIT:
+ SceneItem::display(3800, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ break;
+ default:
+ event.handled = false;
+ break;
+ }
+ }
+ Scene::process(event);
+}
+
+} // End of namespace Ringworld2
+} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld2/ringworld2_scenes3.h b/engines/tsage/ringworld2/ringworld2_scenes3.h
new file mode 100644
index 0000000000..44787b9eef
--- /dev/null
+++ b/engines/tsage/ringworld2/ringworld2_scenes3.h
@@ -0,0 +1,868 @@
+/* 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 TSAGE_RINGWORLD2_SCENES3_H
+#define TSAGE_RINGWORLD2_SCENES3_H
+
+#include "common/scummsys.h"
+#include "tsage/converse.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+#include "tsage/sound.h"
+#include "tsage/ringworld2/ringworld2_logic.h"
+#include "tsage/ringworld2/ringworld2_speakers.h"
+
+namespace TsAGE {
+
+namespace Ringworld2 {
+
+using namespace TsAGE;
+
+
+class Scene3100 : public SceneExt {
+ class Guard : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+
+ int _field412;
+ SpeakerGuard _guardSpeaker;
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SceneActor _actor4;
+ SceneActor _actor5;
+ Guard _guard;
+ ASoundExt _sound1;
+ SequenceManager _sequenceManager;
+
+ Scene3100();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void dispatch();
+ virtual void synchronize(Serializer &s);
+};
+
+class Scene3125 : public SceneExt {
+ class Item1 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item2 : public Item1 {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item3 : public Item1 {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor1 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+
+ int _field412;
+ Item1 _item1;
+ Actor1 _actor1;
+ Item2 _item2;
+ Item3 _item3;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SceneActor _actor4;
+ SceneActor _actor5;
+ SequenceManager _sequenceManager1;
+ // Second sequence manager... Unused?
+ SequenceManager _sequenceManager2;
+
+ Scene3125();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+ virtual void synchronize(Serializer &s);
+};
+
+class Scene3150 : public SceneExt {
+ class Item5 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item6 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor4 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor5 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor6 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor7 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Exit1 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class Exit2 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+public:
+
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ NamedHotspot _item3;
+ NamedHotspot _item4;
+ Item5 _item5;
+ Item6 _item6;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ Actor4 _actor4;
+ Actor5 _actor5;
+ Actor6 _actor6;
+ Actor7 _actor7;
+ Exit1 _exit1;
+ Exit2 _exit2;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene3175 : public SceneExt {
+ class Item1 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor3 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor1 : public Actor3 {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+
+ Item1 _item1;
+ Item1 _item2;
+ Item1 _item3;
+ Actor1 _actor1;
+ SceneActor _actor2;
+ Actor3 _actor3;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene3200 : public SceneExt {
+public:
+ SpeakerRocko3200 _rockoSpeaker;
+ SpeakerJocko3200 _jockoSpeaker;
+ SpeakerSocko3200 _sockoSpeaker;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene3210 : public SceneExt {
+public:
+ SpeakerCaptain3210 _captainSpeaker;
+ SpeakerPrivate3210 _privateSpeaker;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene3220 : public SceneExt {
+public:
+ SpeakerRocko3220 _rockoSpeaker;
+ SpeakerJocko3220 _jockoSpeaker;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene3230 : public SceneExt {
+public:
+ SpeakerRocko3230 _rockoSpeaker;
+ SpeakerJocko3230 _jockoSpeaker;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene3240 : public SceneExt {
+public:
+ SpeakerTeal3240 _tealSpeaker;
+ SpeakerWebbster3240 _webbsterSpeaker;
+ SpeakerMiranda _mirandaSpeaker;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene3245 : public SceneExt {
+public:
+ SpeakerRalf3245 _ralfSpeaker;
+ SpeakerTomko3245 _tomkoSpeaker;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene3250 : public SceneExt {
+ class Item : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+
+ Item _item1;
+ Item _item2;
+ Item _item3;
+ Item _item4;
+ Actor _actor1;
+ Actor _actor2;
+ Actor _actor3;
+ Actor _actor4;
+ SceneActor _actor5;
+ SceneActor _actor6;
+ SceneActor _actor7;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene3255 : public SceneExt {
+public:
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SceneActor _actor4;
+ SceneActor _actor5;
+ SceneActor _actor6;
+ SceneActor _actor7;
+ SpeakerQuinn3255 _quinnSpeaker;
+ SpeakerMiranda3255 _mirandaSpeaker;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene3260 : public SceneExt {
+ class Actor13 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor14 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Action1: public Action {
+ public:
+ void signal();
+ };
+public:
+
+ NamedHotspot _item1;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SceneActor _actor4;
+ SceneActor _actor5;
+ SceneActor _actor6;
+ SceneActor _actor7;
+ SceneActor _actor8;
+ SceneActor _actor9;
+ SceneActor _actor10;
+ SceneActor _actor11;
+ SceneActor _actor12;
+ Actor13 _actor13;
+ Actor14 _actor14;
+ Action1 _action1;
+ Action1 _action2;
+ Action1 _action3;
+ Action1 _action4;
+ Action1 _action5;
+ Action1 _action6;
+ Action1 _action7;
+ Action1 _action8;
+ Action1 _action9;
+ Action1 _action10;
+ Action1 _action11;
+ Action1 _action12;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+};
+
+class Scene3275 : public SceneExt {
+ class Actor2 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Exit1 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+public:
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ NamedHotspot _item3;
+ NamedHotspot _item4;
+ NamedHotspot _item5;
+ SceneActor _actor1;
+ Actor2 _actor2;
+ Exit1 _exit1;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene3350 : public SceneExt {
+public:
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SceneActor _actor4;
+ SceneActor _actor5;
+ SceneActor _actor6;
+ SceneActor _actor7;
+ SceneActor _actor8;
+ SceneActor _actor9;
+ SequenceManager _sequenceManager;
+ PaletteRotation *_rotation;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+};
+
+class Scene3375 : public SceneExt {
+ class Actor1 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor2 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor3 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor4 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Exit1 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class Exit2 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class Exit3 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+
+ void signalCase3379();
+ void subFC696(int sceneMode);
+
+public:
+ SpeakerQuinn3375 _quinnSpeaker;
+ SpeakerSeeker3375 _seekerSpeaker;
+ SpeakerMiranda3375 _mirandaSpeaker;
+ SpeakerWebbster3375 _webbsterSpeaker;
+ NamedHotspot _item1;
+ NamedHotspot _itemArray[13];
+ Actor1 _actor1;
+ Actor2 _actor2;
+ Actor3 _actor3;
+ Actor4 _actor4;
+ Exit1 _exit1;
+ Exit2 _exit2;
+ Exit3 _exit3;
+ SequenceManager _sequenceManager;
+ int _field1488;
+ int _field148A[4];
+ int _field1492;
+
+ Scene3375();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void dispatch();
+ virtual void synchronize(Serializer &s);
+};
+
+class Scene3385 : public SceneExt {
+ class Actor1 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor2 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor3 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor4 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Exit1 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+
+public:
+ SpeakerQuinn3385 _quinnSpeaker;
+ SpeakerSeeker3385 _seekerSpeaker;
+ SpeakerMiranda3385 _mirandaSpeaker;
+ SpeakerWebbster3385 _webbsterSpeaker;
+ NamedHotspot _item1;
+ Actor1 _actor1;
+ Actor2 _actor2;
+ Actor3 _actor3;
+ Actor4 _actor4;
+ Exit1 _exit1;
+ Action1 _action1;
+ SequenceManager _sequenceManager;
+
+ int _field11B2;
+
+ Scene3385();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void synchronize(Serializer &s);
+};
+
+class Scene3395 : public SceneExt {
+ class Actor1 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor2 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor3 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor4 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+
+public:
+ SpeakerQuinn3395 _quinnSpeaker;
+ SpeakerSeeker3395 _seekerSpeaker;
+ SpeakerMiranda3395 _mirandaSpeaker;
+ SpeakerWebbster3395 _webbsterSpeaker;
+ NamedHotspot _item1;
+ NamedHotspot _itemArray[13];
+ Actor1 _actor1;
+ Actor2 _actor2;
+ Actor3 _actor3;
+ Actor4 _actor4;
+ Action1 _action1;
+ SequenceManager _sequenceManager;
+
+ int _field142E;
+
+ Scene3395();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void synchronize(Serializer &s);
+};
+
+class Scene3400 : public SceneExt {
+public:
+ SpeakerQuinn3400 _quinnSpeaker;
+ SpeakerSeeker3400 _seekerSpeaker;
+ SpeakerMiranda3400 _mirandaSpeaker;
+ SpeakerWebbster3400 _webbsterSpeaker;
+ SpeakerTeal3400 _tealSpeaker;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SceneActor _actor4;
+ SceneActor _actor5;
+ SceneActor _actor6;
+ SceneActor _actor7;
+ SceneActor _actor8;
+ SequenceManager _sequenceManager;
+ int16 _field157C;
+
+ Scene3400();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void synchronize(Serializer &s);
+};
+
+class Scene3500 : public SceneExt {
+ class Action1: public Action {
+ public:
+ int _field1E;
+ int _field20;
+ int _field22;
+ int _field24;
+
+ Action1();
+ virtual void synchronize(Serializer &s);
+ void sub108670(int arg1);
+ void sub108732(int arg1);
+ virtual void signal();
+ virtual void dispatch();
+ };
+ class Action2: public Action {
+ public:
+ int _field1E;
+
+ Action2();
+ virtual void synchronize(Serializer &s);
+ void sub10831F(int arg1);
+
+ virtual void signal();
+ };
+
+ class Item4 : public NamedHotspot {
+ public:
+ int _field34;
+
+ Item4();
+ virtual void synchronize(Serializer &s);
+
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor7 : public SceneActor {
+ public:
+ int _fieldA4;
+ int _fieldA6;
+ int _fieldA8;
+ int _fieldAA;
+ int _fieldAC;
+ int _fieldAE;
+
+ Actor7();
+ virtual void synchronize(Serializer &s);
+
+ void sub109466(int arg1, int arg2, int arg3, int arg4, int arg5);
+ void sub1094ED();
+ void sub109663(int arg1);
+ void sub109693(Common::Point Pt);
+
+ virtual void process(Event &event);
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor8 : public SceneActor {
+ public:
+ // TODO: double check if nothing specific is present, then remove this class
+ };
+
+ class UnkObject3500 : public UnkObject1200 {
+ public:
+ int sub1097C9(int arg1);
+ int sub1097EF(int arg1);
+ int sub109C09(Common::Point pt);
+ int sub109C5E(int &x, int &y);
+ };
+public:
+ Action1 _action1;
+ Action2 _action2;
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ NamedHotspot _item3;
+ Item4 _item4;
+ Item4 _item5;
+ Item4 _item6;
+ Item4 _item7;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SceneActor _actor4;
+ SceneActor _actor5;
+ SceneActor _actor6;
+ Actor7 _actor7;
+ Actor8 _actor8;
+ Actor8 _actor9;
+ ASoundExt _aSound1;
+ UnkObject3500 _unkObj1;
+ SequenceManager _sequenceManager;
+
+ int _fieldAF8;
+ int _fieldB9E;
+ PaletteRotation *_rotation;
+ int _field126E;
+ int _field1270;
+ int _field1272;
+ int _field1274;
+ int _field1276;
+ int _field1278;
+ int _field127A;
+ int _field127C;
+ int _field127E;
+ int _field1280;
+ int _field1282;
+ int _field1284;
+ int _field1286;
+
+ Scene3500();
+ void sub107F71(int arg1);
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+ virtual void synchronize(Serializer &s);
+};
+
+class Scene3600 : public SceneExt {
+ class Action3600: public ActionExt {
+ public:
+ int _field1E, _field20;
+
+ Action3600();
+ virtual void synchronize(Serializer &s);
+ virtual void signal();
+ };
+ class Action2: public Action {
+ public:
+ virtual void signal();
+ };
+
+ class Item5 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor13 : public SceneActorExt {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+public:
+ Action3600 _action1;
+ Action2 _action2;
+ SpeakerQuinn3600 _quinnSpeaker;
+ SpeakerSeeker3600 _seekerSpeaker;
+ SpeakerMiranda3600 _mirandaSpeaker;
+ SpeakerTeal3600 _tealSpeaker;
+ SpeakerProtector3600 _protectorSpeaker;
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ NamedHotspot _item3;
+ NamedHotspot _item4;
+ Item5 _item5;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SceneActor _actor4;
+ SceneActor _actor5;
+ SceneActor _actor6;
+ SceneActor _actor7;
+ SceneActor _actor8;
+ SceneActor _actor9;
+ SceneActor _actor10;
+ SceneActor _actor11;
+ SceneActor _actor12;
+ Actor13 _actor13;
+ SequenceManager _sequenceManager1;
+ SequenceManager _sequenceManager2;
+ SequenceManager _sequenceManager3;
+ SequenceManager _sequenceManager4;
+ ScenePalette _palette1;
+
+ int _field2548;
+ int _field254A;
+ int _field254C;
+ int _field254E;
+ bool _field2550;
+
+ Scene3600();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+ virtual void synchronize(Serializer &s);
+};
+
+class Scene3700 : public SceneExt {
+public:
+ SpeakerQuinn3700 _quinnSpeaker;
+ SpeakerSeeker3700 _seekerSpeaker;
+ SpeakerMiranda3700 _mirandaSpeaker;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SceneActor _actor4;
+ SceneActor _actor5;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+};
+
+class Scene3800 : public SceneExt {
+ class Exit1 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+
+ class Exit2 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+
+ class Exit3 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+
+ class Exit4 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+
+public:
+ SceneObject _object1;
+ SceneObject _object2;
+ SceneActor _actor1;
+ NamedHotspot _item1;
+ Exit1 _exit1;
+ Exit2 _exit2;
+ Exit3 _exit3;
+ Exit4 _exit4;
+ Rect _rect1;
+ SequenceManager _sequenceManager1;
+
+ int _field412;
+
+ Scene3800();
+ void initScene3800();
+ void sub110BBD();
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void synchronize(Serializer &s);
+};
+
+class Scene3900 : public SceneExt {
+ class Exit1 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+
+ class Exit2 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+
+ class Exit3 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+
+ class Exit4 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+
+ class Exit5 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+public:
+ SceneActor _actor1;
+ NamedHotspot _item1;
+ Exit1 _exit1;
+ Exit2 _exit2;
+ Exit3 _exit3;
+ Exit4 _exit4;
+ Exit5 _exit5;
+ Rect _rect1;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+};
+
+} // End of namespace Ringworld2
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/ringworld2/ringworld2_speakers.cpp b/engines/tsage/ringworld2/ringworld2_speakers.cpp
new file mode 100644
index 0000000000..da1449efdf
--- /dev/null
+++ b/engines/tsage/ringworld2/ringworld2_speakers.cpp
@@ -0,0 +1,2968 @@
+/* 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 "tsage/ringworld2/ringworld2_speakers.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/graphics.h"
+#include "tsage/staticres.h"
+#include "tsage/ringworld2/ringworld2_scenes0.h"
+#include "tsage/ringworld2/ringworld2_scenes1.h"
+#include "tsage/ringworld2/ringworld2_scenes2.h"
+#include "tsage/ringworld2/ringworld2_scenes3.h"
+
+namespace TsAGE {
+
+namespace Ringworld2 {
+
+VisualSpeaker::VisualSpeaker(): Speaker() {
+ _delayAmount = 0;
+ _frameNumber = R2_GLOBALS._events.getFrameNumber();
+ _color1 = 8;
+ _color2 = 0;
+ _displayMode = 0;
+ _fieldF6 = 0;
+}
+
+void VisualSpeaker::remove() {
+ if (_object2) {
+ if (_fieldF8) {
+ _fieldF8 = 0;
+ _object1.setStrip(_object1._strip - 1);
+ _object1.setFrame(_object1.getFrameCount());
+ _object1.animate(ANIM_MODE_6, (_fieldF6 == 0xff) ? this : NULL);
+ } else {
+ _object1.animate(ANIM_MODE_6, (_fieldF6 == 0xff) ? this : NULL);
+ }
+ }
+
+ Speaker::remove();
+}
+
+void VisualSpeaker::synchronize(Serializer &s) {
+ Speaker::synchronize(s);
+
+ SYNC_POINTER(_object2);
+ s.syncAsSint16LE(_fieldF6);
+ s.syncAsSint16LE(_fieldF8);
+ s.syncAsSint16LE(_displayMode);
+ s.syncAsSint16LE(_soundId);
+ s.syncAsSint16LE(_delayAmount);
+ s.syncAsByte(_removeObject);
+ s.syncAsSint32LE(_frameNumber);
+ s.syncAsSint16LE(_numFrames);
+}
+
+void VisualSpeaker::setText(const Common::String &msg) {
+ _sceneText.remove();
+
+ // Position the text depending on the specified display mode
+ switch (_displayMode) {
+ case 2:
+ _textPos = Common::Point(60, 20);
+ break;
+ case 3:
+ _textPos = Common::Point(110, 20);
+ break;
+ case 4:
+ _textPos = Common::Point(10, 100);
+ break;
+ case 5:
+ _textPos = Common::Point(60, 100);
+ break;
+ case 6:
+ _textPos = Common::Point(110, 100);
+ break;
+ case 7:
+ _textPos = Common::Point(170, 20);
+ break;
+ case 8:
+ _textPos = Common::Point(170, 100);
+ break;
+ case 9:
+ _textPos = Common::Point(330, 20);
+ break;
+ default:
+ _textPos = Common::Point(10, 20);
+ break;
+ }
+
+ // Check if the message starts with a '!'. If so, it indicates a speech resource Id to be played,
+ // in which case extract the resource number from the message.
+ _soundId = 0;
+ Common::String s = msg;
+ if (s.hasPrefix("!")) {
+ s.deleteChar(0);
+ _soundId = atoi(s.c_str());
+
+ while (!s.empty() && (*s.c_str() >= '0' && *s.c_str() <= '9'))
+ s.deleteChar(0);
+ }
+
+ // Set up the text details
+ _sceneText._color1 = _color1;
+ _sceneText._color2 = _color2;
+ _sceneText._color3 = _color3;
+ _sceneText._width = _textWidth;
+ _sceneText._fontNumber = _fontNumber;
+ _sceneText._textMode = _textMode;
+ _sceneText.setup(s);
+
+ //_sceneText.clone();
+
+ _sceneText.setPosition(_textPos);
+ _sceneText.fixPriority(256);
+
+ // If subtitles are turned off, don't show the text
+ if (!(R2_GLOBALS._speechSubtitles & SPEECH_TEXT)) {
+ _sceneText.hide();
+ }
+
+ // Figure out the text delay if subtitles are turned on, or there's no speech resource specified
+ if ((R2_GLOBALS._speechSubtitles & SPEECH_TEXT) || !_soundId) {
+ const char *msgP = s.c_str();
+ int numWords = 0;
+ while (*msgP != '\0') {
+ if (*msgP++ == ' ')
+ ++numWords;
+ }
+
+ if (!numWords && !s.empty())
+ ++numWords;
+
+ _numFrames = numWords * 30 + 120;
+ setDelay(_numFrames);
+ } else {
+ _numFrames = 1;
+ }
+
+ // If the text is empty, no delay is needed
+ if (s.empty())
+ _numFrames = 0;
+
+
+ if (_fieldF6) {
+ if ((R2_GLOBALS._speechSubtitles & SPEECH_TEXT) || !_soundId)
+ _sceneText.hide();
+ } else {
+ if ((R2_GLOBALS._speechSubtitles & SPEECH_VOICE) && _soundId) {
+ if (!R2_GLOBALS._playStream.play(_soundId, NULL))
+ _sceneText.show();
+ }
+ }
+}
+
+void VisualSpeaker::proc16() {
+ R2_GLOBALS._playStream.stop();
+ _fieldF6 = 0;
+ _object1.remove();
+
+ assert(_object2);
+ _object2->show();
+ _object2 = NULL;
+ _fieldF8 = 0;
+}
+
+void VisualSpeaker::setFrame(int numFrames) {
+ _delayAmount = numFrames;
+ _frameNumber = R2_GLOBALS._events.getFrameNumber();
+}
+
+void VisualSpeaker::setDelay(int delay) {
+ _delayAmount = delay;
+ _frameNumber = R2_GLOBALS._events.getFrameNumber();
+}
+
+//----------------------------------------------------------------------------
+
+SpeakerGameText::SpeakerGameText(): VisualSpeaker() {
+ _speakerName = "GAMETEXT";
+ _color1 = 8;
+ _color2 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+}
+
+//----------------------------------------------------------------------------
+// Classes related to CAPTAIN
+//----------------------------------------------------------------------------
+
+SpeakerCaptain3210::SpeakerCaptain3210() {
+ _speakerName = "Captain";
+ _color1 = 5;
+ _color2 = 0;
+ _fieldF6 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+ _displayMode = 1;
+ _numFrames = 0;
+}
+
+void SpeakerCaptain3210::proc15() {
+ int v = _fieldF6;
+ Scene3210 *scene = (Scene3210 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!_object2) {
+ _object2 = &scene->_actor1;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4060, (_object2->_strip * 2) - 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+//----------------------------------------------------------------------------
+// Classes related to CARETAKER
+//----------------------------------------------------------------------------
+
+SpeakerCaretaker2450::SpeakerCaretaker2450() {
+ _speakerName = "CARETAKER";
+ _color1 = 43;
+ _color2 = 0;
+ _fieldF6 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+ _displayMode = 1;
+ _numFrames = 0;
+}
+
+//----------------------------------------------------------------------------
+// Classes related to CHIEF
+//----------------------------------------------------------------------------
+
+SpeakerChief1100::SpeakerChief1100() {
+ _speakerName = "CHIEF";
+ _color1 = 8;
+ _color2 = 0;
+ _fieldF6 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+ _displayMode = 1;
+ _numFrames = 0;
+}
+
+void SpeakerChief1100::proc15() {
+ int v = _fieldF6;
+ Scene1100 *scene = (Scene1100 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!_object2) {
+ _object2 = &scene->_actor18;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4080, 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4080, 3, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ case 100:
+ _numFrames = 0;
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setStrip(_object1._strip - 1);
+ _object1.setFrame(_object1.getFrameCount());
+ _object1.animate(ANIM_MODE_6, this);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+//----------------------------------------------------------------------------
+// Classes related to GUARD
+//----------------------------------------------------------------------------
+
+SpeakerGuard::SpeakerGuard() {
+ _speakerName = "GUARD";
+ _color1 = 5;
+ _color2 = 0;
+ _fieldF6 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+ _displayMode = 1;
+ _numFrames = 0;
+}
+
+void SpeakerGuard2800::proc15() {
+ int v = _fieldF6;
+ Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!_object2) {
+ _object2 = &scene->_actor1;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setZoom(75);
+ _object1.setup(4060, 3, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+//----------------------------------------------------------------------------
+// Classes related to JOCKO
+//----------------------------------------------------------------------------
+
+SpeakerJocko::SpeakerJocko() {
+ _speakerName = "Jocko";
+ _color1 = 45;
+ _color2 = 0;
+ _fieldF6 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+ _displayMode = 1;
+ _numFrames = 0;
+}
+
+void SpeakerJocko3200::proc15() {
+ int v = _fieldF6;
+ Scene3200 *scene = (Scene3200 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!_object2) {
+ _object2 = &scene->_actor2;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4060, (_object2->_strip * 2) - 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerJocko3220::proc15() {
+ int v = _fieldF6;
+ Scene3220 *scene = (Scene3220 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!_object2) {
+ _object2 = &scene->_actor2;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4060, (_object2->_strip * 2) - 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerJocko3230::proc15() {
+ int v = _fieldF6;
+ Scene3230 *scene = (Scene3230 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!_object2) {
+ _object2 = &scene->_actor2;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4060, (_object2->_strip * 2) - 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+//----------------------------------------------------------------------------
+// Classes related to MIRANDA
+//----------------------------------------------------------------------------
+
+SpeakerMiranda::SpeakerMiranda(): VisualSpeaker() {
+ _speakerName = "MIRANDA";
+ _color1 = 154;
+ _color2 = 0;
+ _fieldF6 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+ _displayMode = 1;
+ _numFrames = 0;
+}
+
+void SpeakerMiranda300::proc15() {
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 3) {
+ _object2 = &R2_GLOBALS._player;
+ } else {
+ Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+ _object2 = &scene->_miranda;
+ }
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else if (v == 100) {
+ _numFrames = 0;
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+
+ _object1.setStrip(_object1._strip - 1);
+ _object1.setFrame(_object1.getFrameCount());
+ _object1.animate(ANIM_MODE_6, this);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+
+ if (v == 4) {
+ _object1.setup(304, 5, 1);
+ } else {
+ _object1.setup(305, v * 2 - 1, 1);
+ }
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerMiranda1625::proc15() {
+ int v = _fieldF6;
+
+ if (!_object2) {
+ Scene1625 *scene = (Scene1625 *)R2_GLOBALS._sceneManager._scene;
+ _object2 = &scene->_actor3;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(Common::Point(196, 65));
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(1627, 3, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerMiranda3255::proc15() {
+ int v = _fieldF6;
+
+ if (!_object2) {
+ _object2 = &R2_GLOBALS._player;
+ _object2->hide();
+ _object1.postInit();
+ _object1._effect = _object2->_effect;
+ _object1._shade = _object2->_shade;
+ _object1.setPosition(_object2->_position);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(3257, 5, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerMiranda3375::proc15() {
+ Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 3)
+ _object2 = &R2_GLOBALS._player;
+ else
+ _object2 = &scene->_actor2;
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ _object1._effect = 1;
+ _object1.changeZoom(-1);
+
+ if (scene->_actor1._position.y != 163)
+ R2_GLOBALS._player.setStrip(8);
+ else
+ R2_GLOBALS._player.setStrip(2);
+
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_GLOBALS._player._mover)
+ R2_GLOBALS._player.addMover(NULL);
+
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4051, 5, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+void SpeakerMiranda3385::proc15() {
+ Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 3)
+ _object2 = &R2_GLOBALS._player;
+ else
+ _object2 = &scene->_actor2;
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ _object1._effect = 1;
+ _object1.changeZoom(-1);
+
+ if (R2_GLOBALS._sceneManager._previousScene == 3375)
+ R2_GLOBALS._player.setStrip(4);
+ else
+ R2_GLOBALS._player.setStrip(3);
+
+ if (R2_GLOBALS._player._mover)
+ R2_GLOBALS._player.addMover(NULL);
+
+ R2_GLOBALS._player.disableControl(CURSOR_TALK);
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4051, 5, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+void SpeakerMiranda3395::proc15() {
+ Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 3)
+ _object2 = &R2_GLOBALS._player;
+ else
+ _object2 = &scene->_actor2;
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ _object1._effect = 1;
+ _object1.changeZoom(-1);
+
+ if (R2_GLOBALS._sceneManager._previousScene == 3385)
+ R2_GLOBALS._player.setStrip(4);
+ else
+ R2_GLOBALS._player.setStrip(3);
+
+ R2_GLOBALS._player.disableControl(CURSOR_TALK);
+
+ if (R2_GLOBALS._player._mover)
+ R2_GLOBALS._player.addMover(NULL);
+
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4051, 5, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+void SpeakerMiranda3400::proc15() {
+ Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 3)
+ _object2 = &R2_GLOBALS._player;
+ else
+ _object2 = &scene->_actor2;
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ _object1._effect = 1;
+ _object1.changeZoom(-1);
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4051, 5, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ case 2:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4050, 3, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+void SpeakerMiranda3600::proc15() {
+ Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 3)
+ _object2 = &R2_GLOBALS._player;
+ else
+ _object2 = &scene->_actor12;
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ _object1._effect = 1;
+ _object1.changeZoom(-1);
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+
+ _object1.setPosition(_object2->_position);
+ }
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4051, 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4050, 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+void SpeakerMiranda3700::proc15() {
+ Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ _object2 = &scene->_actor3;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ _object1.setPosition(_object2->_position);
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ scene->_actor1.setup(10, 6, 1);
+ scene->_actor2.setup(20, 5, 1);
+ _object2->setup(30, 1, 1);
+ scene->_actor4.setup(40, 1, 1);
+ _object1.setup(4050, 5, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ case 2:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ scene->_actor3.setup(30, 8, 1);
+ _object1.setup(4052, 3, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ case 3:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ scene->_actor2.setup(20, 1, 1);
+ scene->_actor3.setup(30, 1, 1);
+ _object1.setup(4051, 7, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+//----------------------------------------------------------------------------
+// Classes related to NEJ
+//----------------------------------------------------------------------------
+
+SpeakerNej::SpeakerNej() {
+ _speakerName = "NEJ";
+ _color1 = 171;
+ _color2 = 0;
+ _fieldF6 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+ _displayMode = 1;
+ _numFrames = 0;
+}
+
+void SpeakerNej2700::proc15() {
+ int v = _fieldF6;
+ Scene2700 *scene = (Scene2700 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!_object2) {
+ _object2 = &scene->_actor1;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ switch (_object2->_visage) {
+ case 2701:
+ _object1.setup(4022, 3, 1);
+ _object1.setPosition(Common::Point(164, 163));
+ _object2->setPosition(Common::Point(-10, -10));
+ break;
+ case 2705:
+ _object1.setup(4022, 7, 1);
+ _object1.fixPriority(162);
+ break;
+ default:
+ break;
+ }
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerNej2750::proc15() {
+ int v = _fieldF6;
+ Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!_object2) {
+ _object2 = &scene->_actor1;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ switch (_object2->_visage) {
+ case 2705:
+ _object1.setup(4022, 7, 1);
+ break;
+ case 2752:
+ _object1.setup(2752, 1, 1);
+ break;
+ default:
+ break;
+ }
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerNej2800::proc15() {
+ int v = _fieldF6;
+ Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!_object2) {
+ _object2 = &scene->_actor2;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4023, 3, 1);
+ if (_object2->_visage == 2801)
+ _object1.setPosition(Common::Point(R2_GLOBALS._player._position.x - 12, R2_GLOBALS._player._position.y));
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+//----------------------------------------------------------------------------
+// Classes related to PHARISHA
+//----------------------------------------------------------------------------
+
+SpeakerPharisha::SpeakerPharisha(): VisualSpeaker() {
+ _speakerName = "PHARISHA";
+ _color1 = 151;
+ _color2 = 0;
+ _fieldF6 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+ _displayMode = 1;
+ _numFrames = 0;
+}
+
+void SpeakerPharisha2435::proc15() {
+ int v = _fieldF6;
+ Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!_object2) {
+ _object2 = &scene->_actor2;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4098, 5, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+//----------------------------------------------------------------------------
+// Classes related to PRIVATE
+//----------------------------------------------------------------------------
+
+SpeakerPrivate3210::SpeakerPrivate3210() {
+ _speakerName = "Private";
+ _color1 = 45;
+ _color2 = 0;
+ _fieldF6 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+ _displayMode = 1;
+ _numFrames = 0;
+}
+
+void SpeakerPrivate3210::proc15() {
+ int v = _fieldF6;
+ Scene3210 *scene = (Scene3210 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!_object2) {
+ _object2 = &scene->_actor2;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4060, (_object2->_strip * 2) - 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+//----------------------------------------------------------------------------
+// Classes related to PROTECTOR
+//----------------------------------------------------------------------------
+
+SpeakerProtector3600::SpeakerProtector3600() {
+ _speakerName = "Protector";
+ _color1 = 170;
+ _color2 = 0;
+ _fieldF6 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+ _displayMode = 7;
+ _numFrames = 0;
+}
+
+void SpeakerProtector3600::proc15() {
+ int v = _fieldF6;
+ Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!_object2) {
+ _object2 = &scene->_actor13;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ _object1._effect = 1;
+ _object1.changeZoom(-1);
+
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ _object1.setPosition(_object2->_position);
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ if (scene->_sceneMode != 3324) {
+ _object1.setup(4125, 3, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ } else {
+ _object1.setup(3258, 6, 1);
+ _object1.animate(ANIM_MODE_2, NULL);
+ _object1.hide();
+ _object2->setup(3258, 6, 1);
+ _object2->show();
+ }
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+//----------------------------------------------------------------------------
+// Classes related to QUINN
+//----------------------------------------------------------------------------
+
+SpeakerQuinn::SpeakerQuinn(): VisualSpeaker() {
+ _speakerName = "QUINN";
+ _color1 = 60;
+ _color2 = 0;
+ _fieldF6 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+ _displayMode = 1;
+ _numFrames = 0;
+}
+
+void SpeakerQuinn300::proc15() {
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 3) {
+ _object2 = &R2_GLOBALS._player;
+ } else {
+ Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+ _object2 = &scene->_quinn;
+ }
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else if (v == 100) {
+ _numFrames = 0;
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+
+ _object1.setStrip(_object1._strip - 1);
+ _object1.setFrame(_object1.getFrameCount());
+ _object1.animate(ANIM_MODE_6, this);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+
+ switch (_object2->_visage) {
+ case 10:
+ _object1.setup((v - 1) / 4 + 4010, ((v - ((v - 1) / 4 * 4) - 1) % 8) * 2 + 1, 1);
+ break;
+ case 302:
+ _object1.setup(308, (v - 1) % 8 + 1, 1);
+ break;
+ case 308:
+ _object1.setup(308, 5, 1);
+ break;
+ }
+
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerQuinn1100::proc15() {
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (v == 0)
+ return;
+
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ _object2 = &R2_GLOBALS._player;
+ } else {
+ Scene1100 *scene = (Scene1100 *)R2_GLOBALS._sceneManager._scene;
+ _object2 = &scene->_actor16;
+ }
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(1108, 7, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(1109, 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(1109, 5, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+void SpeakerQuinn2435::proc15() {
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ _object2 = &R2_GLOBALS._player;
+ } else {
+ Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene;
+ _object2 = &scene->_actor1;
+ }
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object2->setStrip(7);
+ _object1.setup(2020, 5, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerQuinn2450::proc15() {
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 1) {
+ _object2 = &R2_GLOBALS._player;
+ } else {
+ Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene;
+ _object2 = &scene->_actor1;
+ }
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ if (R2_GLOBALS.getFlag(61))
+ _object1.setup(2020, 3, 1);
+ else
+ _object1.setup(2020, 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerQuinn2700::proc15() {
+ int v = _fieldF6;
+
+ if (!_object2) {
+ _object2 = &R2_GLOBALS._player;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ switch (_object2->_visage) {
+ case 19:
+ _object1.setup(4022, 5, 1);
+ break;
+ case 2701:
+ _object1.setup(4022, 1, 1);
+ break;
+ default:
+ break;
+ }
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerQuinn2750::proc15() {
+ int v = _fieldF6;
+
+ if (!_object2) {
+ _object2 = &R2_GLOBALS._player;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ switch (_object2->_visage) {
+ case 19:
+ _object1.setup(4022, 5, 1);
+ break;
+ case 2752:
+ _object1.setup(2752, 1, 1);
+ break;
+ default:
+ break;
+ }
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerQuinn2800::proc15() {
+ int v = _fieldF6;
+
+ if (!_object2) {
+ _object2 = &R2_GLOBALS._player;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ switch (_object2->_visage) {
+ case 16:
+ _object1.setZoom(75);
+ _object1.setup(4023, 5, 1);
+ break;
+ case 19:
+ _object1.setup(4023, 1, 1);
+ break;
+ case 3110:
+ _object1.setZoom(75);
+ if (_object2->_strip == 1)
+ _object1.setup(4061 , 1, 1);
+ else
+ _object1.setup(4061 , 3, 1);
+ break;
+ default:
+ break;
+ }
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerQuinn3255::proc15() {
+ Scene3255 *scene = (Scene3255 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ _object2 = &scene->_actor4;
+ _object2->hide();
+ _object1.postInit();
+ _object1._effect = _object2->_effect;
+ _object1._shade = _object2->_shade;
+ _object1.setPosition(_object2->_position);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(3257, 3, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerQuinn3375::proc15() {
+ Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _object2 = &R2_GLOBALS._player;
+ else if (R2_GLOBALS._player._characterIndex == 2)
+ _object2 = &scene->_actor1;
+ else
+ _object2 = &scene->_actor2;
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ _object1._effect = 1;
+ _object1.changeZoom(-1);
+
+ if (scene->_actor1._position.y != 163)
+ R2_GLOBALS._player.setStrip(8);
+ else
+ R2_GLOBALS._player.setStrip(2);
+
+ if (R2_GLOBALS._player._mover)
+ R2_GLOBALS._player.addMover(NULL);
+
+ R2_GLOBALS._player.disableControl(CURSOR_TALK);
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4010, 5, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+void SpeakerQuinn3385::proc15() {
+ Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _object2 = &R2_GLOBALS._player;
+ else if (R2_GLOBALS._player._characterIndex == 2)
+ _object2 = &scene->_actor1;
+ else
+ _object2 = &scene->_actor2;
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ _object1._effect = 1;
+ _object1.changeZoom(-1);
+
+ if (R2_GLOBALS._sceneManager._previousScene == 3375)
+ R2_GLOBALS._player.setStrip(4);
+ else
+ R2_GLOBALS._player.setStrip(3);
+
+ if (R2_GLOBALS._player._mover)
+ R2_GLOBALS._player.addMover(NULL);
+
+ R2_GLOBALS._player.disableControl(CURSOR_TALK);
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ if (R2_GLOBALS._player._characterIndex == 2)
+ _object1.setup(4010, 3, 1);
+ else
+ _object1.setup(4010, 5, 1);
+
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+void SpeakerQuinn3395::proc15() {
+ Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _object2 = &R2_GLOBALS._player;
+ else if (R2_GLOBALS._player._characterIndex == 2)
+ _object2 = &scene->_actor1;
+ else
+ _object2 = &scene->_actor2;
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ _object1._effect = 1;
+ _object1.changeZoom(-1);
+
+ if (R2_GLOBALS._sceneManager._previousScene == 3385)
+ R2_GLOBALS._player.setStrip(4);
+ else
+ R2_GLOBALS._player.setStrip(3);
+
+ if (R2_GLOBALS._player._mover)
+ R2_GLOBALS._player.addMover(NULL);
+
+ R2_GLOBALS._player.disableControl(CURSOR_TALK);
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ if (R2_GLOBALS._player._characterIndex == 2)
+ _object1.setup(4010, 3, 1);
+ else
+ _object1.setup(4010, 5, 1);
+
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+void SpeakerQuinn3400::proc15() {
+ Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _object2 = &R2_GLOBALS._player;
+ else if (R2_GLOBALS._player._characterIndex == 2)
+ _object2 = &scene->_actor1;
+ else
+ _object2 = &scene->_actor2;
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ _object1._effect = 1;
+ _object1.changeZoom(-1);
+ R2_GLOBALS._player.disableControl();
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4010, 5, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ case 2:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4010, 3, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ case 3:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4012, 3, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+void SpeakerQuinn3600::proc15() {
+ Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 1)
+ _object2 = &R2_GLOBALS._player;
+ else
+ _object2 = &scene->_actor10;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ _object1._effect = 1;
+ _object1.changeZoom(-1);
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4021, 7, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4010, 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4012, 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+void SpeakerQuinn3700::setText(const Common::String &msg) {
+ Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_fieldF6) {
+ case 2:
+ scene->_actor3.setup(30, 1, 1);
+ R2_GLOBALS._sound2.play(44);
+ break;
+ case 3:
+ scene->_actor3.setup(30, 1, 1);
+ break;
+ default:
+ scene->_actor3.setup(30, 7, 1);
+ break;
+ }
+ VisualSpeaker::setText(msg);
+}
+
+void SpeakerQuinn3700::proc15() {
+ Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ _object2 = &scene->_actor1;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ _object1.setPosition(_object2->_position);
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ R2_GLOBALS._sound2.stop();
+ scene->_actor1.setup(10, 4, 1);
+ scene->_actor3.setup(30, 7, 1);
+ _object1.setup(3701, 1, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ case 2:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ scene->_actor2.setup(20, 1, 1);
+ scene->_actor3.setup(30, 1, 1);
+ _object1.setup(3701, 2, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ case 3:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ scene->_actor1.setup(10, 2, 1);
+ scene->_actor3.setup(30, 1, 1);
+ _object1.setup(4011, 1, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+//----------------------------------------------------------------------------
+// Classes related to QUINNL
+//----------------------------------------------------------------------------
+
+SpeakerQuinnL::SpeakerQuinnL(): VisualSpeaker() {
+ _speakerName = "QUINNL";
+ _color1 = 35;
+ _color2 = 0;
+ _fieldF6 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+ _displayMode = 1;
+ _numFrames = 0;
+ _fontNumber = 10;
+}
+
+//----------------------------------------------------------------------------
+// Classes related to RALF
+//----------------------------------------------------------------------------
+
+SpeakerRalf3245::SpeakerRalf3245() {
+ _speakerName = "Ralf";
+ _color1 = 5;
+ _color2 = 0;
+ _fieldF6 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+ _displayMode = 1;
+ _numFrames = 0;
+}
+
+void SpeakerRalf3245::proc15() {
+ int v = _fieldF6;
+ Scene3245 *scene = (Scene3245 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!_object2) {
+ _object2 = &scene->_actor1;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ switch (_object2->_visage) {
+ case 3100:
+ _object1.setup(4105, (_object2->_strip * 2) - 1, 1);
+ break;
+ case 3101:
+ _object1.setup(4108, (_object2->_strip * 2) - 1, 1);
+ break;
+ case 3102:
+ _object1.setup(4109, (_object2->_strip * 2) - 1, 1);
+ break;
+ default:
+ break;
+ }
+
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+//----------------------------------------------------------------------------
+// Classes related to ROCKO
+//----------------------------------------------------------------------------
+
+SpeakerRocko::SpeakerRocko() {
+ _speakerName = "Rocko";
+ _color1 = 5;
+ _color2 = 0;
+ _fieldF6 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+ _displayMode = 1;
+ _numFrames = 0;
+}
+
+void SpeakerRocko3200::proc15() {
+ int v = _fieldF6;
+ Scene3200 *scene = (Scene3200 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!_object2) {
+ _object2 = &scene->_actor1;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4060, (_object2->_strip * 2) - 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerRocko3220::proc15() {
+ int v = _fieldF6;
+ Scene3220 *scene = (Scene3220 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!_object2) {
+ _object2 = &scene->_actor1;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4060, (_object2->_strip * 2) - 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerRocko3230::proc15() {
+ int v = _fieldF6;
+ Scene3230 *scene = (Scene3230 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!_object2) {
+ _object2 = &scene->_actor1;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4111, (_object2->_strip * 2) - 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+//----------------------------------------------------------------------------
+// Classes related to SEEKER
+//----------------------------------------------------------------------------
+
+SpeakerSeeker::SpeakerSeeker(): VisualSpeaker() {
+ _speakerName = "SEEKER";
+ _color1 = 35;
+ _color2 = 0;
+ _fieldF6 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+ _displayMode = 1;
+ _numFrames = 0;
+}
+
+void SpeakerSeeker300::proc15() {
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 3) {
+ _object2 = &R2_GLOBALS._player;
+ } else {
+ Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+ _object2 = &scene->_seeker;
+ }
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.fixPriority(140);
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else if (v == 100) {
+ _numFrames = 0;
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+
+ _object1.setStrip(_object1._strip - 1);
+ _object1.setFrame(_object1.getFrameCount());
+ _object1.animate(ANIM_MODE_6, this);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(306, v * 2 - 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerSeeker1100::proc15() {
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (v == 0)
+ return;
+
+ if (R2_GLOBALS._player._characterIndex == 2) {
+ _object2 = &R2_GLOBALS._player;
+ } else {
+ Scene1100 *scene = (Scene1100 *)R2_GLOBALS._sceneManager._scene;
+ _object2 = &scene->_actor16;
+ }
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(1108, 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(1108, 3, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ _object1.setPosition(Common::Point(197, 134));
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(1108, 5, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ case 4:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(1109, 7, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ case 5:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(1109, 3, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+void SpeakerSeeker1900::proc15() {
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 2) {
+ _object2 = &R2_GLOBALS._player;
+ } else {
+ Scene1900 *scene = (Scene1900 *)R2_GLOBALS._sceneManager._scene;
+ _object2 = &scene->_actor1;
+ }
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else if (v == 1) {
+ _object1.setup(4032, 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ } else {
+ signal();
+ }
+}
+
+void SpeakerSeeker2435::proc15() {
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 2) {
+ _object2 = &R2_GLOBALS._player;
+ } else {
+ Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene;
+ _object2 = &scene->_actor1;
+ }
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object2->setStrip(7);
+ _object1.setup(4099, 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerSeeker2450::proc15() {
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 2) {
+ _object2 = &R2_GLOBALS._player;
+ } else {
+ Scene2450 *scene = (Scene2450 *)R2_GLOBALS._sceneManager._scene;
+ _object2 = &scene->_actor1;
+ }
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4099, 3, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerSeeker3375::proc15() {
+ Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 2)
+ _object2 = &R2_GLOBALS._player;
+ else
+ _object2 = &scene->_actor1;
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ _object1._effect = 1;
+ _object1.changeZoom(-1);
+
+ if (scene->_actor1._position.y != 163)
+ R2_GLOBALS._player.setStrip(8);
+ else
+ R2_GLOBALS._player.setStrip(2);
+
+ if (R2_GLOBALS._player._mover)
+ R2_GLOBALS._player.addMover(NULL);
+
+ R2_GLOBALS._player.disableControl(CURSOR_TALK);
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4031, 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+void SpeakerSeeker3385::proc15() {
+ Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 2)
+ _object2 = &R2_GLOBALS._player;
+ else
+ _object2 = &scene->_actor1;
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ _object1._effect = 1;
+ _object1.changeZoom(-1);
+
+ if (R2_GLOBALS._sceneManager._previousScene == 3375)
+ R2_GLOBALS._player.setStrip(4);
+ else
+ R2_GLOBALS._player.setStrip(3);
+
+ if (R2_GLOBALS._player._mover)
+ R2_GLOBALS._player.addMover(NULL);
+
+ R2_GLOBALS._player.disableControl(CURSOR_TALK);
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4031, 3, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+void SpeakerSeeker3395::proc15() {
+ Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 2)
+ _object2 = &R2_GLOBALS._player;
+ else
+ _object2 = &scene->_actor1;
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ _object1._effect = 1;
+ _object1.changeZoom(-1);
+
+ if (R2_GLOBALS._sceneManager._previousScene == 3385)
+ R2_GLOBALS._player.setStrip(4);
+ else
+ R2_GLOBALS._player.setStrip(3);
+
+ if (R2_GLOBALS._player._mover)
+ R2_GLOBALS._player.addMover(NULL);
+
+ R2_GLOBALS._player.disableControl(CURSOR_TALK);
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4031, 3, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+void SpeakerSeeker3400::proc15() {
+ Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 2)
+ _object2 = &R2_GLOBALS._player;
+ else
+ _object2 = &scene->_actor1;
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ _object1._effect = 1;
+ _object1.changeZoom(-1);
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4031, 1, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ case 2:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4031, 3, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ case 3:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4030, 3, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ case 4:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4031, 7, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ case 5:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4033, 1, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+void SpeakerSeeker3600::proc15() {
+ Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ if (R2_GLOBALS._player._characterIndex == 2)
+ _object2 = &R2_GLOBALS._player;
+ else
+ _object2 = &scene->_actor11;
+
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ _object1._effect = 1;
+ _object1.changeZoom(-1);
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+
+ _object1.setPosition(_object2->_position);
+
+ }
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4031, 5, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4030, 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+void SpeakerSeeker3700::setText(const Common::String &msg) {
+ Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
+
+ if (_fieldF6 == 1) {
+ R2_GLOBALS._sound2.play(44);
+ scene->_actor3.setup(30, 8, 1);
+ } else {
+ scene->_actor3.setup(30, 2, 1);
+ }
+ VisualSpeaker::setText(msg);
+}
+
+void SpeakerSeeker3700::proc15() {
+ Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ _object2 = &scene->_actor2;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ _object1.setPosition(_object2->_position);
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ R2_GLOBALS._sound2.stop();
+ scene->_actor1.setup(10, 8, 1);
+ scene->_actor2.setup(20, 7, 1);
+ scene->_actor3.setup(30, 8, 1);
+ _object1.setup(3701, 3, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ case 2:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ scene->_actor1.setup(10, 2, 1);
+ scene->_actor2.setup(20, 1, 1);
+ scene->_actor3.setup(30, 1, 1);
+ _object1.setup(4031, 1, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+//----------------------------------------------------------------------------
+// Classes related to SEEKERL
+//----------------------------------------------------------------------------
+
+SpeakerSeekerL::SpeakerSeekerL(): VisualSpeaker() {
+ _speakerName = "SEEKERL";
+ _color1 = 35;
+ _color2 = 0;
+ _fieldF6 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+ _displayMode = 1;
+ _numFrames = 0;
+ _fontNumber = 10;
+}
+
+//----------------------------------------------------------------------------
+// Classes related to SOCKO
+//----------------------------------------------------------------------------
+
+SpeakerSocko3200::SpeakerSocko3200() {
+ _speakerName = "Socko";
+ _color1 = 10;
+ _color2 = 0;
+ _fieldF6 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+ _displayMode = 1;
+ _numFrames = 0;
+}
+
+void SpeakerSocko3200::proc15() {
+ int v = _fieldF6;
+ Scene3200 *scene = (Scene3200 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!_object2) {
+ _object2 = &scene->_actor3;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4060, (_object2->_strip * 2) - 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+//----------------------------------------------------------------------------
+// Classes related to SOLDIER
+//----------------------------------------------------------------------------
+
+SpeakerSoldier::SpeakerSoldier(int colour) {
+ _speakerName = "SOLDIER";
+ _color1 = colour;
+ _color2 = 0;
+ _fieldF6 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+ _displayMode = 1;
+ _numFrames = 0;
+}
+
+void SpeakerSoldier300::proc15() {
+ int v = _fieldF6;
+
+ if (!_object2) {
+ Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+ _object2 = &scene->_teal;
+ _object2->hide();
+
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(303, 3, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+//----------------------------------------------------------------------------
+// Classes related to TEAL
+//----------------------------------------------------------------------------
+
+SpeakerTeal::SpeakerTeal(): VisualSpeaker() {
+ _speakerName = "TEAL";
+ _color1 = 22;
+ _color2 = 0;
+ _fieldF6 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+ _displayMode = 1;
+ _numFrames = 0;
+}
+
+SpeakerTealMode7::SpeakerTealMode7(): SpeakerTeal() {
+ _displayMode = 7;
+}
+
+void SpeakerTeal300::proc15() {
+ int v = _fieldF6;
+
+ if (!_object2) {
+ Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+ _object2 = &scene->_teal;
+ _object2->hide();
+
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(303, 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerTeal1625::proc15() {
+ int v = _fieldF6;
+
+ if (!_object2) {
+ Scene1625 *scene = (Scene1625 *)R2_GLOBALS._sceneManager._scene;
+ _object2 = &scene->_actor2;
+ _object2->hide();
+
+ _object1.postInit();
+ _object1.setPosition(Common::Point(68, 68));
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(1627, 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerTeal3240::proc15() {
+ int v = _fieldF6;
+ Scene3240 *scene = (Scene3240 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!_object2) {
+ _object2 = &scene->_actor1;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4070, (_object2->_strip * 2) - 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerTeal3400::proc15() {
+ Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ _object2 = &scene->_actor4;
+ _object2->hide();
+ _object1.postInit();
+ _object1._numFrames = 7;
+ _object1._effect = 1;
+ _object1.changeZoom(-1);
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+ _object1.setPosition(_object2->_position);
+ _object1.show();
+
+ if (scene ->_sceneMode == 3305) {
+ R2_GLOBALS._player.setStrip(6);
+ scene->_actor1.setStrip(6);
+ scene->_actor2.setStrip(6);
+ }
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4107, 5, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ case 2:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4107, 1, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ case 3:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4107, 7, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ case 4:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4107, 3, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+void SpeakerTeal3600::proc15() {
+ Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ _object2 = &scene->_actor5;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ _object1._effect = 1;
+ _object1.changeZoom(-1);
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+ _object1.setPosition(_object2->_position);
+
+ if (scene ->_sceneMode == 3323) {
+ _object1.hide();
+ _object2->show();
+ }
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4107, 5, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4107, 1, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4107, 7, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ case 4:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4107, 3, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+//----------------------------------------------------------------------------
+// Classes related to TOMKO
+//----------------------------------------------------------------------------
+
+SpeakerTomko3245::SpeakerTomko3245() {
+ _speakerName = "Tomko";
+ _color1 = 10;
+ _color2 = 0;
+ _fieldF6 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+ _displayMode = 1;
+ _numFrames = 0;
+}
+
+void SpeakerTomko3245::proc15() {
+ int v = _fieldF6;
+ Scene3245 *scene = (Scene3245 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!_object2) {
+ _object2 = &scene->_actor2;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ switch (_object2->_visage) {
+ case 3100:
+ _object1.setup(4105, (_object2->_strip * 2) - 1, 1);
+ break;
+ case 3101:
+ _object1.setup(4108, (_object2->_strip * 2) - 1, 1);
+ break;
+ case 3102:
+ _object1.setup(4109, (_object2->_strip * 2) - 1, 1);
+ break;
+ default:
+ break;
+ }
+
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+//----------------------------------------------------------------------------
+// Classes related to WEBBSTER
+//----------------------------------------------------------------------------
+
+SpeakerWebbster::SpeakerWebbster(int colour) {
+ _speakerName = "WEBBSTER";
+ _color1 = colour;
+ _color2 = 0;
+ _fieldF6 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+ _displayMode = 1;
+ _numFrames = 0;
+}
+
+void SpeakerWebbster3240::proc15() {
+ int v = _fieldF6;
+ Scene3240 *scene = (Scene3240 *)R2_GLOBALS._sceneManager._scene;
+
+ if (!_object2) {
+ _object2 = &scene->_actor2;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ if (v == 0) {
+ _object1.animate(ANIM_MODE_2, NULL);
+ } else {
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4110, 5, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
+
+void SpeakerWebbster3375::proc15() {
+ Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ _object2 = &scene->_actor3;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ _object1._effect = 1;
+ _object1.changeZoom(-1);
+
+ if (scene->_actor1._position.y != 163)
+ R2_GLOBALS._player.setStrip(8);
+ else
+ R2_GLOBALS._player.setStrip(2);
+
+ if (R2_GLOBALS._player._mover)
+ R2_GLOBALS._player.addMover(NULL);
+
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4110, 5, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+void SpeakerWebbster3385::proc15() {
+ Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ _object2 = &scene->_actor3;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ _object1._effect = 1;
+ _object1.changeZoom(-1);
+
+ if (R2_GLOBALS._sceneManager._previousScene == 3375)
+ R2_GLOBALS._player.setStrip(4);
+ else
+ R2_GLOBALS._player.setStrip(3);
+
+ if (R2_GLOBALS._player._mover)
+ R2_GLOBALS._player.addMover(NULL);
+
+ R2_GLOBALS._player.disableControl(CURSOR_TALK);
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4110, 5, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+void SpeakerWebbster3395::proc15() {
+ Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ _object2 = &scene->_actor3;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ _object1._effect = 1;
+ _object1.changeZoom(-1);
+
+ if (R2_GLOBALS._sceneManager._previousScene == 3385)
+ R2_GLOBALS._player.setStrip(4);
+ else
+ R2_GLOBALS._player.setStrip(3);
+
+ if (R2_GLOBALS._player._mover)
+ R2_GLOBALS._player.addMover(NULL);
+
+ R2_GLOBALS._player.disableControl(CURSOR_TALK);
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4110, 5, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+void SpeakerWebbster3400::proc15() {
+ Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ _object2 = &scene->_actor3;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+ _object1._numFrames = 7;
+ _object1._effect = 1;
+ _object1.changeZoom(-1);
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4110, 5, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ case 2:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4110, 7, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ case 3:
+ ((SceneItem *)_action)->_sceneRegionId = 0;
+ _object1.setup(4110, 3, 1);
+ _object1.animate(ANIM_MODE_5, NULL);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+//----------------------------------------------------------------------------
+
+SpeakerDutyOfficer::SpeakerDutyOfficer(): VisualSpeaker() {
+ _speakerName = "DUTYOFFICER";
+ _color1 = 5;
+ _color2 = 0;
+ _fieldF6 = 0;
+ _textWidth = 300;
+ _hideObjects = false;
+ _object2 = NULL;
+ _displayMode = 1;
+ _numFrames = 0;
+}
+
+void SpeakerDutyOfficer::proc15() {
+ Scene180 *scene = (Scene180 *)R2_GLOBALS._sceneManager._scene;
+
+ int v = _fieldF6;
+
+ if (!_object2) {
+ _object2 = &scene->_object2;
+ _object2->hide();
+ _object1.postInit();
+ _object1.setPosition(_object2->_position);
+
+ if (_object2->_mover)
+ _object2->addMover(NULL);
+ }
+
+ switch (v) {
+ case 0:
+ _object1.animate(ANIM_MODE_2, NULL);
+ break;
+ case 1:
+ _action = NULL;
+ _object1.setup(76, 2, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ default:
+ signal();
+ break;
+ }
+}
+
+
+} // End of namespace Ringworld2
+} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld2/ringworld2_speakers.h b/engines/tsage/ringworld2/ringworld2_speakers.h
new file mode 100644
index 0000000000..e336564c5f
--- /dev/null
+++ b/engines/tsage/ringworld2/ringworld2_speakers.h
@@ -0,0 +1,637 @@
+/* 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 TSAGE_RINGWORLD2_SPEAKERS_H
+#define TSAGE_RINGWORLD2_SPEAKERS_H
+
+#include "common/scummsys.h"
+#include "tsage/converse.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+#include "tsage/ringworld2/ringworld2_logic.h"
+
+namespace TsAGE {
+
+namespace Ringworld2 {
+
+using namespace TsAGE;
+
+class VisualSpeaker : public Speaker {
+public:
+ SceneActor _object1;
+ SceneObject *_object2;
+ int _fieldF6, _fieldF8;
+ int _displayMode;
+ int _soundId;
+ int _delayAmount;
+ bool _removeObject;
+ int _frameNumber;
+ int _numFrames;
+private:
+ void setFrame(int numFrames);
+public:
+ VisualSpeaker();
+
+ virtual Common::String getClassName() { return "VisualSpeaker"; }
+ virtual void synchronize(Serializer &s);
+ virtual void remove();
+ virtual void setText(const Common::String &msg);
+ virtual void proc15() {}
+ virtual void proc16();
+
+ void setDelay(int delay);
+};
+
+class SpeakerGameText : public VisualSpeaker {
+public:
+ SpeakerGameText();
+
+ virtual Common::String getClassName() { return "SpeakerGameText"; }
+};
+
+// Classes related to Captain
+
+class SpeakerCaptain3210 : public VisualSpeaker {
+public:
+ SpeakerCaptain3210();
+
+ virtual Common::String getClassName() { return "SpeakerCaptain3210"; }
+ virtual void proc15();
+};
+
+// Classes related to Caretaker
+
+class SpeakerCaretaker2450 : public VisualSpeaker {
+public:
+ SpeakerCaretaker2450();
+
+ virtual Common::String getClassName() { return "SpeakerCaretaker2450"; }
+};
+
+// Classes related to Chief
+
+class SpeakerChief1100 : public VisualSpeaker {
+public:
+ SpeakerChief1100();
+
+ virtual Common::String getClassName() { return "SpeakerChief1100"; }
+ virtual void proc15();
+};
+
+// Classes related to Guard
+
+class SpeakerGuard : public VisualSpeaker {
+public:
+ SpeakerGuard();
+ virtual Common::String getClassName() { return "SpeakerGuard"; }
+};
+
+class SpeakerGuard2800 : public SpeakerGuard {
+public:
+ virtual Common::String getClassName() { return "SpeakerGuard2800"; }
+ virtual void proc15();
+};
+
+// Classes related to Jocko
+
+class SpeakerJocko : public VisualSpeaker {
+public:
+ SpeakerJocko();
+ virtual Common::String getClassName() { return "SpeakerJocko"; }
+};
+
+class SpeakerJocko3200 : public SpeakerJocko {
+public:
+ virtual Common::String getClassName() { return "SpeakerJocko3200"; }
+ virtual void proc15();
+};
+
+class SpeakerJocko3220 : public SpeakerJocko {
+public:
+ virtual Common::String getClassName() { return "SpeakerJocko3220"; }
+ virtual void proc15();
+};
+
+class SpeakerJocko3230 : public SpeakerJocko {
+public:
+ virtual Common::String getClassName() { return "SpeakerJocko3230"; }
+ virtual void proc15();
+};
+
+// Classes related to Miranda
+
+class SpeakerMiranda : public VisualSpeaker {
+public:
+ SpeakerMiranda();
+ virtual Common::String getClassName() { return "SpeakerMiranda"; }
+};
+
+class SpeakerMiranda300 : public SpeakerMiranda {
+public:
+ virtual Common::String getClassName() { return "SpeakerMiranda300"; }
+ virtual void proc15();
+};
+
+class SpeakerMiranda1625 : public SpeakerMiranda {
+public:
+ virtual Common::String getClassName() { return "SpeakerMiranda1625"; }
+ virtual void proc15();
+};
+
+class SpeakerMiranda3255 : public SpeakerMiranda {
+public:
+ virtual Common::String getClassName() { return "SpeakerMiranda3255"; }
+ virtual void proc15();
+};
+
+class SpeakerMiranda3375 : public SpeakerMiranda {
+public:
+ virtual Common::String getClassName() { return "SpeakerMiranda3375"; }
+ virtual void proc15();
+};
+
+class SpeakerMiranda3385 : public SpeakerMiranda {
+public:
+ virtual Common::String getClassName() { return "SpeakerMiranda3385"; }
+ virtual void proc15();
+};
+
+class SpeakerMiranda3395 : public SpeakerMiranda {
+public:
+ virtual Common::String getClassName() { return "SpeakerMiranda3395"; }
+ virtual void proc15();
+};
+
+class SpeakerMiranda3400 : public SpeakerMiranda {
+public:
+ virtual Common::String getClassName() { return "SpeakerMiranda3400"; }
+ virtual void proc15();
+};
+
+class SpeakerMiranda3600 : public SpeakerMiranda {
+public:
+ virtual Common::String getClassName() { return "SpeakerMiranda3600"; }
+ virtual void proc15();
+};
+
+class SpeakerMiranda3700 : public SpeakerMiranda {
+public:
+ virtual Common::String getClassName() { return "SpeakerMiranda3700"; }
+ virtual void proc15();
+};
+
+// Classes related to Nej
+
+class SpeakerNej : public VisualSpeaker {
+public:
+ SpeakerNej();
+ virtual Common::String getClassName() { return "SpeakerNej"; }
+};
+
+class SpeakerNej2700 : public SpeakerNej {
+public:
+ virtual Common::String getClassName() { return "SpeakerNej2700"; }
+ virtual void proc15();
+};
+
+class SpeakerNej2750 : public SpeakerNej {
+public:
+ virtual Common::String getClassName() { return "SpeakerNej2750"; }
+ virtual void proc15();
+};
+
+class SpeakerNej2800 : public SpeakerNej {
+public:
+ virtual Common::String getClassName() { return "SpeakerNej2800"; }
+ virtual void proc15();
+};
+
+// Classes related to Pharisha
+
+class SpeakerPharisha : public VisualSpeaker {
+public:
+ SpeakerPharisha();
+
+ virtual Common::String getClassName() { return "SpeakerPharisha"; }
+};
+
+class SpeakerPharisha2435 : public SpeakerPharisha {
+public:
+ virtual Common::String getClassName() { return "SpeakerPharisha2435"; }
+ virtual void proc15();
+};
+
+// Classes related to Private
+
+class SpeakerPrivate3210 : public VisualSpeaker {
+public:
+ SpeakerPrivate3210();
+
+ virtual Common::String getClassName() { return "SpeakerPrivate3210"; }
+ virtual void proc15();
+};
+
+// Classes related to Protector
+
+class SpeakerProtector3600 : public VisualSpeaker {
+public:
+ SpeakerProtector3600();
+
+ virtual Common::String getClassName() { return "SpeakerProtector3600"; }
+ virtual void proc15();
+};
+
+// Classes related to Quinn
+
+class SpeakerQuinn : public VisualSpeaker {
+public:
+ SpeakerQuinn();
+ virtual Common::String getClassName() { return "SpeakerQuinn"; }
+};
+
+class SpeakerQuinn300 : public SpeakerQuinn {
+public:
+ virtual Common::String getClassName() { return "SpeakerQuinn300"; }
+ virtual void proc15();
+};
+
+class SpeakerQuinn1100 : public SpeakerQuinn {
+public:
+ virtual Common::String getClassName() { return "SpeakerQuinn1100"; }
+ virtual void proc15();
+};
+
+class SpeakerQuinn2435 : public SpeakerQuinn {
+public:
+ virtual Common::String getClassName() { return "SpeakerQuinn2435"; }
+ virtual void proc15();
+};
+
+class SpeakerQuinn2450 : public SpeakerQuinn {
+public:
+ virtual Common::String getClassName() { return "SpeakerQuinn2450"; }
+ virtual void proc15();
+};
+
+class SpeakerQuinn2700 : public SpeakerQuinn {
+public:
+ virtual Common::String getClassName() { return "SpeakerQuinn2700"; }
+ virtual void proc15();
+};
+
+class SpeakerQuinn2750 : public SpeakerQuinn {
+public:
+ virtual Common::String getClassName() { return "SpeakerQuinn2750"; }
+ virtual void proc15();
+};
+
+class SpeakerQuinn2800 : public SpeakerQuinn {
+public:
+ virtual Common::String getClassName() { return "SpeakerQuinn2800"; }
+ virtual void proc15();
+};
+
+class SpeakerQuinn3255 : public SpeakerQuinn {
+public:
+ virtual Common::String getClassName() { return "SpeakerQuinn3255"; }
+ virtual void proc15();
+};
+
+class SpeakerQuinn3375 : public SpeakerQuinn {
+public:
+ virtual Common::String getClassName() { return "SpeakerQuinn3375"; }
+ virtual void proc15();
+};
+
+class SpeakerQuinn3385 : public SpeakerQuinn {
+public:
+ virtual Common::String getClassName() { return "SpeakerQuinn3385"; }
+ virtual void proc15();
+};
+
+class SpeakerQuinn3395 : public SpeakerQuinn {
+public:
+ virtual Common::String getClassName() { return "SpeakerQuinn3395"; }
+ virtual void proc15();
+};
+
+class SpeakerQuinn3400 : public SpeakerQuinn {
+public:
+ virtual Common::String getClassName() { return "SpeakerQuinn3400"; }
+ virtual void proc15();
+};
+
+class SpeakerQuinn3600 : public SpeakerQuinn {
+public:
+ virtual Common::String getClassName() { return "SpeakerQuinn3600"; }
+ virtual void proc15();
+};
+
+class SpeakerQuinn3700 : public SpeakerQuinn {
+public:
+ virtual Common::String getClassName() { return "SpeakerQuinn3700"; }
+ virtual void setText(const Common::String &msg);
+ virtual void proc15();
+};
+
+// Classes related to QuinnL
+
+class SpeakerQuinnL : public VisualSpeaker {
+public:
+ SpeakerQuinnL();
+
+ virtual Common::String getClassName() { return "SpeakerQuinnL"; }
+};
+
+// Classes related to Ralf
+
+class SpeakerRalf3245 : public VisualSpeaker {
+public:
+ SpeakerRalf3245();
+
+ virtual Common::String getClassName() { return "SpeakerRalf3245"; }
+ virtual void proc15();
+};
+
+// Classes related to Rocko
+
+class SpeakerRocko : public VisualSpeaker {
+public:
+ SpeakerRocko();
+ virtual Common::String getClassName() { return "SpeakerRocko"; }
+};
+
+class SpeakerRocko3200 : public SpeakerRocko {
+public:
+ virtual Common::String getClassName() { return "SpeakerRocko3200"; }
+ virtual void proc15();
+};
+
+class SpeakerRocko3220 : public SpeakerRocko {
+public:
+ virtual Common::String getClassName() { return "SpeakerRocko3220"; }
+ virtual void proc15();
+};
+
+class SpeakerRocko3230 : public SpeakerRocko {
+public:
+ virtual Common::String getClassName() { return "SpeakerRocko3230"; }
+ virtual void proc15();
+};
+
+// Classes related to Seeker
+
+class SpeakerSeeker : public VisualSpeaker {
+public:
+ SpeakerSeeker();
+ virtual Common::String getClassName() { return "SpeakerSeeker"; }
+};
+
+class SpeakerSeeker300 : public SpeakerSeeker {
+public:
+ virtual Common::String getClassName() { return "SpeakerSeeker300"; }
+ virtual void proc15();
+};
+
+class SpeakerSeeker1100 : public SpeakerSeeker {
+public:
+ virtual Common::String getClassName() { return "SpeakerSeeker1100"; }
+ virtual void proc15();
+};
+
+class SpeakerSeeker1900 : public SpeakerSeeker {
+public:
+ virtual Common::String getClassName() { return "SpeakerSeeker1900"; }
+ virtual void proc15();
+};
+
+class SpeakerSeeker2435 : public SpeakerSeeker {
+public:
+ virtual Common::String getClassName() { return "SpeakerSeeker2435"; }
+ virtual void proc15();
+};
+
+class SpeakerSeeker2450 : public SpeakerSeeker {
+public:
+ virtual Common::String getClassName() { return "SpeakerSeeker2450"; }
+ virtual void proc15();
+};
+
+class SpeakerSeeker3375 : public SpeakerSeeker {
+public:
+ virtual Common::String getClassName() { return "SpeakerSeeker3375"; }
+ virtual void proc15();
+};
+
+class SpeakerSeeker3385 : public SpeakerSeeker {
+public:
+ virtual Common::String getClassName() { return "SpeakerSeeker3385"; }
+ virtual void proc15();
+};
+
+class SpeakerSeeker3395 : public SpeakerSeeker {
+public:
+ virtual Common::String getClassName() { return "SpeakerSeeker3395"; }
+ virtual void proc15();
+};
+
+class SpeakerSeeker3400 : public SpeakerSeeker {
+public:
+ virtual Common::String getClassName() { return "SpeakerSeeker3400"; }
+ virtual void proc15();
+};
+
+class SpeakerSeeker3600 : public SpeakerSeeker {
+public:
+ virtual Common::String getClassName() { return "SpeakerSeeker3600"; }
+ virtual void proc15();
+};
+
+class SpeakerSeeker3700 : public SpeakerSeeker {
+public:
+ virtual Common::String getClassName() { return "SpeakerSeeker3700"; }
+ virtual void setText(const Common::String &msg);
+ virtual void proc15();
+};
+
+// Classes related to SeekerL
+
+class SpeakerSeekerL : public VisualSpeaker {
+public:
+ SpeakerSeekerL();
+
+ virtual Common::String getClassName() { return "SpeakerSeekerL"; }
+};
+
+// Classes related to Socko
+
+class SpeakerSocko3200 : public VisualSpeaker {
+public:
+ SpeakerSocko3200();
+
+ virtual Common::String getClassName() { return "SpeakerSocko3200"; }
+ virtual void proc15();
+};
+
+// Classes related to Soldier
+
+class SpeakerSoldier : public VisualSpeaker {
+public:
+ SpeakerSoldier(int colour);
+ virtual Common::String getClassName() { return "SpeakerSoldier"; }
+};
+
+class SpeakerSoldier300 : public SpeakerSoldier {
+public:
+ SpeakerSoldier300() : SpeakerSoldier(60) {};
+ virtual Common::String getClassName() { return "SpeakerSoldier300"; }
+ virtual void proc15();
+};
+
+class SpeakerSoldier1625 : public SpeakerSoldier {
+public:
+ SpeakerSoldier1625() : SpeakerSoldier(5) {};
+ virtual Common::String getClassName() { return "SpeakerSoldier1625"; }
+};
+
+// Classes related to Teal
+
+class SpeakerTeal : public VisualSpeaker {
+public:
+ SpeakerTeal();
+ virtual Common::String getClassName() { return "SpeakerTeal"; }
+};
+
+class SpeakerTealMode7 : public SpeakerTeal {
+public:
+ SpeakerTealMode7();
+ virtual Common::String getClassName() { return "SpeakerTealMode7"; }
+};
+
+class SpeakerTeal300 : public SpeakerTeal {
+public:
+ virtual Common::String getClassName() { return "SpeakerTeal300"; }
+ virtual void proc15();
+};
+
+class SpeakerTeal1625 : public SpeakerTeal {
+public:
+ virtual Common::String getClassName() { return "SpeakerTeal1625"; }
+ virtual void proc15();
+};
+
+class SpeakerTeal3240 : public SpeakerTeal {
+public:
+ virtual Common::String getClassName() { return "SpeakerTeal3240"; }
+ virtual void proc15();
+};
+
+class SpeakerTeal3400 : public SpeakerTeal {
+public:
+ virtual Common::String getClassName() { return "SpeakerTeal3400"; }
+ virtual void proc15();
+};
+
+class SpeakerTeal3600 : public SpeakerTealMode7 {
+public:
+ virtual Common::String getClassName() { return "SpeakerTeal3600"; }
+ virtual void proc15();
+};
+
+// Classes related to Tomko
+
+class SpeakerTomko3245 : public VisualSpeaker {
+public:
+ SpeakerTomko3245();
+
+ virtual Common::String getClassName() { return "SpeakerTomko3245"; }
+ virtual void proc15();
+};
+
+// Classes related to Webbster
+
+class SpeakerWebbster : public VisualSpeaker {
+public:
+ SpeakerWebbster(int colour);
+ virtual Common::String getClassName() { return "SpeakerWebbster"; }
+};
+
+class SpeakerWebbster2500 : public SpeakerWebbster {
+public:
+ SpeakerWebbster2500() : SpeakerWebbster(27) {}
+ virtual Common::String getClassName() { return "SpeakerWebbster2500"; }
+};
+
+class SpeakerWebbster3240 : public SpeakerWebbster {
+public:
+ SpeakerWebbster3240() : SpeakerWebbster(10) {};
+
+ virtual Common::String getClassName() { return "SpeakerWebbster3240"; }
+ virtual void proc15();
+};
+
+class SpeakerWebbster3375 : public SpeakerWebbster {
+public:
+ SpeakerWebbster3375() : SpeakerWebbster(60) {};
+
+ virtual Common::String getClassName() { return "SpeakerWebbster3375"; }
+ virtual void proc15();
+};
+
+class SpeakerWebbster3385 : public SpeakerWebbster {
+public:
+ SpeakerWebbster3385() : SpeakerWebbster(60) {};
+
+ virtual Common::String getClassName() { return "SpeakerWebbster3385"; }
+ virtual void proc15();
+};
+
+class SpeakerWebbster3395 : public SpeakerWebbster {
+public:
+ SpeakerWebbster3395() : SpeakerWebbster(60) {};
+
+ virtual Common::String getClassName() { return "SpeakerWebbster3395"; }
+ virtual void proc15();
+};
+
+class SpeakerWebbster3400 : public SpeakerWebbster {
+public:
+ SpeakerWebbster3400() : SpeakerWebbster(27) {};
+
+ virtual Common::String getClassName() { return "SpeakerWebbster3400"; }
+ virtual void proc15();
+};
+
+class SpeakerDutyOfficer: public VisualSpeaker {
+public:
+ SpeakerDutyOfficer();
+
+ virtual Common::String getClassName() { return "SpeakerDutyOfficer"; }
+ virtual void proc15();
+};
+
+} // End of namespace Ringworld2
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/saveload.cpp b/engines/tsage/saveload.cpp
index db52050b03..af2f3566ad 100644
--- a/engines/tsage/saveload.cpp
+++ b/engines/tsage/saveload.cpp
@@ -189,6 +189,8 @@ Common::Error Saver::restore(int slot) {
// Read in the savegame header
tSageSavegameHeader header;
readSavegameHeader(saveFile, header);
+ if (header.thumbnail)
+ header.thumbnail->free();
delete header.thumbnail;
serializer.setSaveVersion(header.version);
@@ -290,6 +292,7 @@ void Saver::writeSavegameHeader(Common::OutSaveFile *out, tSageSavegameHeader &h
::createThumbnail(thumb, (const byte *)s.pixels, SCREEN_WIDTH, SCREEN_HEIGHT, thumbPalette);
Graphics::saveThumbnail(*out, *thumb);
g_globals->_screenSurface.unlockSurface();
+ thumb->free();
delete thumb;
// Write out the save date/time
diff --git a/engines/tsage/saveload.h b/engines/tsage/saveload.h
index 52b23413d4..4126e31822 100644
--- a/engines/tsage/saveload.h
+++ b/engines/tsage/saveload.h
@@ -33,7 +33,7 @@ namespace TsAGE {
typedef void (*SaveNotifierFn)(bool postFlag);
-#define TSAGE_SAVEGAME_VERSION 7
+#define TSAGE_SAVEGAME_VERSION 10
class SavedObject;
diff --git a/engines/tsage/scenes.cpp b/engines/tsage/scenes.cpp
index 686b8725f5..0756d71d4c 100644
--- a/engines/tsage/scenes.cpp
+++ b/engines/tsage/scenes.cpp
@@ -133,7 +133,7 @@ void SceneManager::fadeInIfNecessary() {
percent = 100;
g_globals->_scenePalette.fade((const byte *)&adjustData, false, percent);
- g_system->updateScreen();
+ GLOBALS._screenSurface.updateScreen();
g_system->delayMillis(10);
}
@@ -164,7 +164,7 @@ void SceneManager::changeScene(int newSceneNumber) {
sceneObj->setObjectWrapper(NULL);
sceneObj->animate(ANIM_MODE_NONE, 0);
- sceneObj->_flags &= !OBJFLAG_PANES;
+ sceneObj->_flags &= ~OBJFLAG_PANES;
}
// Blank out the screen
@@ -240,7 +240,7 @@ void SceneManager::listenerSynchronize(Serializer &s) {
if (s.isLoading()) {
changeScene(_sceneNumber);
-
+
if (_nextSceneNumber != -1) {
sceneChange();
_nextSceneNumber = -1;
@@ -259,7 +259,7 @@ Scene::Scene() : _sceneBounds(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT),
_sceneMode = 0;
_activeScreenNumber = 0;
_oldSceneBounds = Rect(4000, 4000, 4100, 4100);
- Common::set_to(&_zoomPercents[0], &_zoomPercents[256], 0);
+ Common::fill(&_zoomPercents[0], &_zoomPercents[256], 0);
}
Scene::~Scene() {
@@ -317,7 +317,7 @@ void Scene::loadSceneData(int sceneNum) {
_activeScreenNumber = sceneNum;
if (g_vm->getGameID() == GType_Ringworld2) {
- // Most scenes in Ringworld 2 don't have a scene size resource, but rather just have
+ // Most scenes in Ringworld 2 don't have a scene size resource, but rather just have
// a standard 320x200 size. Only read the scene size data for the specific few scenes
switch (sceneNum) {
case 700:
@@ -363,7 +363,7 @@ void Scene::loadSceneData(int sceneNum) {
_priorities.load(sceneNum);
// Initialize the section enabled list
- Common::set_to(&_enabledSections[0], &_enabledSections[16 * 16], 0xffff);
+ Common::fill(&_enabledSections[0], &_enabledSections[16 * 16], 0xffff);
g_globals->_sceneOffset.x = (_sceneBounds.left / 160) * 160;
g_globals->_sceneOffset.y = (_sceneBounds.top / 100) * 100;
@@ -456,8 +456,9 @@ void Scene::refreshBackground(int xAmount, int yAmount) {
(xSectionSrc + 1) * 160, (ySectionSrc + 1) * 100);
Rect destBounds(xSectionDest * 160, ySectionDest * 100,
(xSectionDest + 1) * 160, (ySectionDest + 1) * 100);
- if (g_vm->getGameID() == GType_BlueForce) {
- // For Blue Force, if the scene has an interface area, exclude it from the copy
+ if (g_vm->getGameID() != GType_Ringworld) {
+ // For Blue Force and Return to Ringworld, if the scene has an interface area,
+ // exclude it from the copy
srcBounds.bottom = MIN<int16>(srcBounds.bottom, BF_GLOBALS._interfaceY);
destBounds.bottom = MIN<int16>(destBounds.bottom, BF_GLOBALS._interfaceY);
}
diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp
index b61e63236b..9df5a6666b 100644
--- a/engines/tsage/sound.cpp
+++ b/engines/tsage/sound.cpp
@@ -36,7 +36,7 @@ static SoundManager *_soundManager = NULL;
SoundManager::SoundManager() {
_soundManager = this;
- __sndmgrReady = false;
+ _sndmgrReady = false;
_ourSndResVersion = 0x102;
_ourDrvResVersion = 0x10A;
@@ -52,7 +52,7 @@ SoundManager::SoundManager() {
}
SoundManager::~SoundManager() {
- if (__sndmgrReady) {
+ if (_sndmgrReady) {
Common::StackLock slock(_serverDisabledMutex);
g_vm->_mixer->stopAll();
@@ -83,7 +83,7 @@ SoundManager::~SoundManager() {
}
void SoundManager::postInit() {
- if (!__sndmgrReady) {
+ if (!_sndmgrReady) {
g_saver->addSaveNotifier(&SoundManager::saveNotifier);
g_saver->addLoadNotifier(&SoundManager::loadNotifier);
g_saver->addListener(this);
@@ -94,7 +94,7 @@ void SoundManager::postInit() {
// thread, and doesn't get too far ahead, I've left it to the AdlibSoundDriver class to
// call the update method, rather than having it be called separately
// g_system->getTimerManager()->installTimerProc(_sfUpdateCallback, 1000000 / SOUND_FREQUENCY, NULL, "tsageSoundUpdate");
- __sndmgrReady = true;
+ _sndmgrReady = true;
}
}
@@ -136,7 +136,7 @@ void SoundManager::update() {
}
Common::List<SoundDriverEntry> &SoundManager::buildDriverList(bool detectFlag) {
- assert(__sndmgrReady);
+ assert(_sndmgrReady);
_availableDrivers.clear();
// Build up a list of available drivers. Currently we only implement an Adlib music
@@ -549,7 +549,7 @@ void SoundManager::loadNotifier(bool postFlag) {
void SoundManager::loadNotifierProc(bool postFlag) {
if (!postFlag) {
// Stop any currently playing sounds
- if (__sndmgrReady) {
+ if (_sndmgrReady) {
Common::StackLock slock(_serverDisabledMutex);
for (Common::List<Sound *>::iterator i = _soundList.begin(); i != _soundList.end(); ) {
@@ -569,7 +569,7 @@ void SoundManager::loadNotifierProc(bool postFlag) {
void SoundManager::listenerSynchronize(Serializer &s) {
s.validate("SoundManager");
- assert(__sndmgrReady && _driversDetected);
+ assert(_sndmgrReady && _driversDetected);
if (s.getVersion() < 6)
return;
@@ -798,7 +798,7 @@ void SoundManager::_sfRethinkVoiceTypes() {
continue;
_sfUpdateVoiceStructs();
- Common::set_to(sound->_chWork, sound->_chWork + SOUND_ARR_SIZE, false);
+ Common::fill(sound->_chWork, sound->_chWork + SOUND_ARR_SIZE, false);
for (;;) {
// Scan for sub priority
@@ -1485,7 +1485,7 @@ Sound::Sound() {
memset(_chNumVoices, 0, SOUND_ARR_SIZE * sizeof(int));
memset(_chSubPriority, 0, SOUND_ARR_SIZE * sizeof(int));
memset(_chFlags, 0, SOUND_ARR_SIZE * sizeof(int));
- Common::set_to(_chWork, _chWork + SOUND_ARR_SIZE, false);
+ Common::fill(_chWork, _chWork + SOUND_ARR_SIZE, false);
memset(_channelData, 0, SOUND_ARR_SIZE * sizeof(byte *));
memset(_trkChannel, 0, SOUND_ARR_SIZE * sizeof(int));
memset(_trkState, 0, SOUND_ARR_SIZE * sizeof(int));
@@ -2557,7 +2557,7 @@ AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() {
_mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true);
- Common::set_to(_channelVoiced, _channelVoiced + ADLIB_CHANNEL_COUNT, false);
+ Common::fill(_channelVoiced, _channelVoiced + ADLIB_CHANNEL_COUNT, false);
memset(_channelVolume, 0, ADLIB_CHANNEL_COUNT * sizeof(int));
memset(_v4405E, 0, ADLIB_CHANNEL_COUNT * sizeof(int));
memset(_v44067, 0, ADLIB_CHANNEL_COUNT * sizeof(int));
@@ -2565,7 +2565,7 @@ AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() {
memset(_v44079, 0, ADLIB_CHANNEL_COUNT * sizeof(int));
memset(_v44082, 0, ADLIB_CHANNEL_COUNT * sizeof(int));
_v44082[ADLIB_CHANNEL_COUNT] = 0x90;
- Common::set_to(_pitchBlend, _pitchBlend + ADLIB_CHANNEL_COUNT, 0x2000);
+ Common::fill(_pitchBlend, _pitchBlend + ADLIB_CHANNEL_COUNT, 0x2000);
memset(_v4409E, 0, ADLIB_CHANNEL_COUNT * sizeof(int));
_patchData = NULL;
}
diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h
index 2c5d2ac951..77d1f3d3ac 100644
--- a/engines/tsage/sound.h
+++ b/engines/tsage/sound.h
@@ -87,7 +87,7 @@ public:
int _driverResID;
public:
SoundDriver();
- virtual ~SoundDriver() {};
+ virtual ~SoundDriver() {}
const Common::String &getShortDriverDescription() { return _shortDescription; }
const Common::String &getLongDriverDescription() { return _longDescription; }
@@ -169,7 +169,7 @@ class SoundManager : public SaveListener {
private:
SoundDriver *instantiateDriver(int driverNum);
public:
- bool __sndmgrReady;
+ bool _sndmgrReady;
int _ourSndResVersion, _ourDrvResVersion;
SynchronizedList<Sound *> _playList;
Common::List<SoundDriver *> _installedDrivers;
@@ -414,6 +414,16 @@ public:
virtual void signal();
};
+class PlayStream {
+public:
+ Sound _sound;
+
+ void setFile(const Common::String &filename) {}
+ bool play(int soundNum, EventHandler *endAction) { return false; }
+ void stop() {}
+ void proc1() {}
+ bool isPlaying() const { return false; }
+};
#define ADLIB_CHANNEL_COUNT 9
diff --git a/engines/tsage/staticres.cpp b/engines/tsage/staticres.cpp
index c98d9d2e53..a273ec2a0b 100644
--- a/engines/tsage/staticres.cpp
+++ b/engines/tsage/staticres.cpp
@@ -64,120 +64,390 @@ const byte CURSOR_WALK_DATA[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09
};
-const char *LOOK_SCENE_HOTSPOT = "You see nothing special.";
-const char *USE_SCENE_HOTSPOT = "That accomplishes nothing.";
-const char *TALK_SCENE_HOTSPOT = "Yak, yak.";
-const char *SPECIAL_SCENE_HOTSPOT = "That is a unique use for that.";
-const char *DEFAULT_SCENE_HOTSPOT = "That accomplishes nothing.";
-const char *SAVE_ERROR_MSG = "Error occurred saving game. Please do not try to restore this game!";
-const char *SAVING_NOT_ALLOWED_MSG = "Saving is not allowed at this time.";
-const char *RESTORING_NOT_ALLOWED_MSG = "Restoring is not allowed at this time.";
-const char *INV_EMPTY_MSG = "You have nothing in your possesion.";
-
-const char *QUIT_CONFIRM_MSG = "Do you want to quit playing this game?";
-const char *RESTART_MSG = "Do you want to restart this game?";
-const char *GAME_PAUSED_MSG = "Game is paused.";
-const char *OPTIONS_MSG = "\x01Options...";
-const char *OK_BTN_STRING = " Ok ";
-const char *CANCEL_BTN_STRING = "Cancel";
-const char *QUIT_BTN_STRING = " Quit ";
-const char *RESTART_BTN_STRING = "Restart";
-const char *SAVE_BTN_STRING = "Save";
-const char *RESTORE_BTN_STRING = "Restore";
-const char *SOUND_BTN_STRING = "Sound";
-const char *RESUME_BTN_STRING = " Resume \rplay";
-const char *LOOK_BTN_STRING = "Look";
-const char *PICK_BTN_STRING = "Pick";
+char const *const LOOK_SCENE_HOTSPOT = "You see nothing special.";
+char const *const USE_SCENE_HOTSPOT = "That accomplishes nothing.";
+char const *const TALK_SCENE_HOTSPOT = "Yak, yak.";
+char const *const SPECIAL_SCENE_HOTSPOT = "That is a unique use for that.";
+char const *const DEFAULT_SCENE_HOTSPOT = "That accomplishes nothing.";
+char const *const SAVE_ERROR_MSG = "Error occurred saving game. Please do not try to restore this game!";
+char const *const SAVING_NOT_ALLOWED_MSG = "Saving is not allowed at this time.";
+char const *const RESTORING_NOT_ALLOWED_MSG = "Restoring is not allowed at this time.";
+char const *const INV_EMPTY_MSG = "You have nothing in your possesion.";
+
+char const *const QUIT_CONFIRM_MSG = "Do you want to quit playing this game?";
+char const *const RESTART_MSG = "Do you want to restart this game?";
+char const *const GAME_PAUSED_MSG = "Game is paused.";
+char const *const OK_BTN_STRING = " Ok ";
+char const *const CANCEL_BTN_STRING = "Cancel";
+char const *const QUIT_BTN_STRING = " Quit ";
+char const *const RESTART_BTN_STRING = "Restart";
+char const *const SAVE_BTN_STRING = "Save";
+char const *const RESTORE_BTN_STRING = "Restore";
+char const *const SOUND_BTN_STRING = "Sound";
+char const *const RESUME_BTN_STRING = " Resume \rplay";
+char const *const LOOK_BTN_STRING = "Look";
+char const *const PICK_BTN_STRING = "Pick";
namespace Ringworld {
// Dialog resources
-const char *HELP_MSG = "Ringworld\rRevenge of the Patriarch\x14\rScummVM Version\r\r\
+char const *const HELP_MSG = "Ringworld\rRevenge of the Patriarch\x14\rScummVM Version\r\r\
\x01 Keyboard shortcuts...\rF2 - Sound options\rF3 - Quit\r\
F4 - Restart\rF5 - Save game\rF7 - Restore Game\rF10 - Pause game";
-const char *WATCH_INTRO_MSG = "Do you wish to watch the introduction?";
-const char *START_PLAY_BTN_STRING = " Start Play ";
-const char *INTRODUCTION_BTN_STRING = "Introduction";
+char const *const WATCH_INTRO_MSG = "Do you wish to watch the introduction?";
+char const *const START_PLAY_BTN_STRING = " Start Play ";
+char const *const INTRODUCTION_BTN_STRING = "Introduction";
+char const *const OPTIONS_MSG = "\x01Options...";
// Scene specific resources
-const char *EXIT_MSG = " EXIT ";
-const char *SCENE6100_CAREFUL = "Be careful! The probe cannot handle too much of that.";
-const char *SCENE6100_TOUGHER = "Hey! This is tougher than it looks!";
-const char *SCENE6100_ONE_MORE_HIT = "You had better be more careful. One more hit like that \
+char const *const EXIT_MSG = " EXIT ";
+char const *const SCENE6100_CAREFUL = "Be careful! The probe cannot handle too much of that.";
+char const *const SCENE6100_TOUGHER = "Hey! This is tougher than it looks!";
+char const *const SCENE6100_ONE_MORE_HIT = "You had better be more careful. One more hit like that \
and the probe may be destroyed.";
-const char *SCENE6100_DOING_BEST = "I'm doing the best I can. I just hope it holds together!";
-const char *SCENE6100_REPAIR = "\r\rQuinn and Seeker repair the probe....";
-const char *SCENE6100_ROCKY_AREA = "The rocky area should be directly ahead of you. Do you see it?";
-const char *SCENE6100_REPLY = "Yes. Now if I can just avoid those sunbeams.";
-const char *SCENE6100_TAKE_CONTROLS = "You had better take the controls Seeker. My hands are sweating.";
-const char *SCENE6100_SURPRISE = "You surprise me Quinn. I would have thought you of hardier stock.";
-const char *SCENE6100_SWEAT = "Humans sweat, Kzin twitch their tail. What's the difference?";
-const char *SCENE6100_VERY_WELL = "Very well. I will retrieve the stasis box and return the probe. \
+char const *const SCENE6100_DOING_BEST = "I'm doing the best I can. I just hope it holds together!";
+char const *const SCENE6100_REPAIR = "\r\rQuinn and Seeker repair the probe....";
+char const *const SCENE6100_ROCKY_AREA = "The rocky area should be directly ahead of you. Do you see it?";
+char const *const SCENE6100_REPLY = "Yes. Now if I can just avoid those sunbeams.";
+char const *const SCENE6100_TAKE_CONTROLS = "You had better take the controls Seeker. My hands are sweating.";
+char const *const SCENE6100_SURPRISE = "You surprise me Quinn. I would have thought you of hardier stock.";
+char const *const SCENE6100_SWEAT = "Humans sweat, Kzin twitch their tail. What's the difference?";
+char const *const SCENE6100_VERY_WELL = "Very well. I will retrieve the stasis box and return the probe. \
Wait for it's return in the lander bay.";
-const char *DEMO_HELP_MSG = " Help...\rF2 - Sound Options\rF3 - Exit demo\r\rPress ENTER\rto continue";
-const char *DEMO_PAUSED_MSG = "Ringworld\x14 demo is paused";
-const char *DEMO_EXIT_MSG = "Press ENTER to resume the Ringworld\x14 demo. Press ESC to exit";
-const char *EXIT_BTN_STRING = "Exit";
-const char *DEMO_BTN_STRING = "Demo";
-const char *DEMO_RESUME_BTN_STRING = "Resume";
+char const *const DEMO_HELP_MSG = " Help...\rF2 - Sound Options\rF3 - Exit demo\r\rPress ENTER\rto continue";
+char const *const DEMO_PAUSED_MSG = "Ringworld\x14 demo is paused";
+char const *const DEMO_EXIT_MSG = "Press ENTER to resume the Ringworld\x14 demo. Press ESC to exit";
+char const *const EXIT_BTN_STRING = "Exit";
+char const *const DEMO_BTN_STRING = "Demo";
+char const *const DEMO_RESUME_BTN_STRING = "Resume";
} // End of namespace Ringworld
namespace BlueForce {
// Dialog resources
-const char *HELP_MSG = "Blue Force\x14\rScummVM Version\r\r\
+char const *const HELP_MSG = "Blue Force\x14\rScummVM Version\r\r\
Keyboard shortcuts...\rF2 - Sound options\rF3 - Quit\r\
F4 - Restart\rF5 - Save game\rF7 - Restore Game\rF10 - Pause game";
-const char *WATCH_INTRO_MSG = "Do you wish to watch the introduction?";
-const char *START_PLAY_BTN_STRING = " Play ";
-const char *INTRODUCTION_BTN_STRING = " Watch ";
+char const *const WATCH_INTRO_MSG = "Do you wish to watch the introduction?";
+char const *const START_PLAY_BTN_STRING = " Play ";
+char const *const INTRODUCTION_BTN_STRING = " Watch ";
+char const *const OPTIONS_MSG = "Options...";
// Blue Force general messages
-const char *BF_NAME = "Blue Force";
-const char *BF_COPYRIGHT = " Copyright, 1993 Tsunami Media, Inc.";
-const char *BF_ALL_RIGHTS_RESERVED = "All Rights Reserved";
-const char *BF_19840518 = "May 18, 1984";
-const char *BF_19840515 = "May 15, 1984";
-const char *BF_3_DAYS = "Three days later";
-const char *BF_11_YEARS = "Eleven years later.";
-const char *BF_NEXT_DAY = "The Next Day";
-const char *BF_ACADEMY = "Here we are at the Academy";
+char const *const BF_NAME = "Blue Force";
+char const *const BF_COPYRIGHT = " Copyright, 1993 Tsunami Media, Inc.";
+char const *const BF_ALL_RIGHTS_RESERVED = "All Rights Reserved";
+char const *const BF_19840518 = "May 18, 1984";
+char const *const BF_19840515 = "May 15, 1984";
+char const *const BF_3_DAYS = "Three days later";
+char const *const BF_11_YEARS = "Eleven years later.";
+char const *const BF_NEXT_DAY = "The Next Day";
+char const *const BF_ACADEMY = "Here we are at the Academy";
// Scene 50 hotspots
-const char *GRANDMA_FRANNIE = "Grandma Frannie";
-const char *MARINA = "Marina";
-const char *POLICE_DEPARTMENT = "Police Department";
-const char *TONYS_BAR = "Tony's Bar";
-const char *CHILD_PROTECTIVE_SERVICES = "Child Protective Services";
-const char *ALLEY_CAT = "Alley Cat";
-const char *CITY_HALL_JAIL = "City Hall & Jail";
-const char *JAMISON_RYAN = "Jamison & Ryan";
-const char *BIKINI_HUT = "Bikini Hut";
+char const *const GRANDMA_FRANNIE = "Grandma Frannie";
+char const *const MARINA = "Marina";
+char const *const POLICE_DEPARTMENT = "Police Department";
+char const *const TONYS_BAR = "Tony's Bar";
+char const *const CHILD_PROTECTIVE_SERVICES = "Child Protective Services";
+char const *const ALLEY_CAT = "Alley Cat";
+char const *const CITY_HALL_JAIL = "City Hall & Jail";
+char const *const JAMISON_RYAN = "Jamison & Ryan";
+char const *const BIKINI_HUT = "Bikini Hut";
// Scene 60 radio messages
-const char *RADIO_BTN_LIST[8] = { "10-2 ", "10-4 ", "10-13", "10-15", "10-27", "10-35", "10-97", "10-98" };
+char const *const RADIO_BTN_LIST[8] = { "10-2 ", "10-4 ", "10-13", "10-15", "10-27", "10-35", "10-97", "10-98" };
// Scene 570 computer messageS
-const char *SCENE570_PASSWORD = "PASSWORD -> ";
-const char *SCENE570_C_DRIVE = "C:\\";
-const char *SCENE570_RING = "RING";
-const char *SCENE570_PROTO = "PROTO";
-const char *SCENE570_WACKY = "WACKY";
-const char *SCENE570_COBB = "COBB";
-const char *SCENE570_LETTER = "LETTER";
-const char *SCENE570_RINGEXE = "RINGEXE";
-const char *SCENE570_RINGDATA = "RINGDATA";
-const char *SCENE570_PROTOEXE = "PROTOEXE";
-const char *SCENE570_PROTODATA = "PROTODATA";
-const char *SCENE570_WACKYEXE = "WACKYEXE";
-const char *SCENE570_WACKYDATA = "WACKYDATA";
+char const *const SCENE570_PASSWORD = "PASSWORD -> ";
+char const *const SCENE570_C_DRIVE = "C:\\";
+char const *const SCENE570_RING = "RING";
+char const *const SCENE570_PROTO = "PROTO";
+char const *const SCENE570_WACKY = "WACKY";
+char const *const SCENE570_COBB = "COBB";
+char const *const SCENE570_LETTER = "LETTER";
+char const *const SCENE570_RINGEXE = "RINGEXE";
+char const *const SCENE570_RINGDATA = "RINGDATA";
+char const *const SCENE570_PROTOEXE = "PROTOEXE";
+char const *const SCENE570_PROTODATA = "PROTODATA";
+char const *const SCENE570_WACKYEXE = "WACKYEXE";
+char const *const SCENE570_WACKYDATA = "WACKYDATA";
// Scene 180 messages
-const char *THE_NEXT_DAY = "The Next Day";
+char const *const THE_NEXT_DAY = "The Next Day";
} // End of namespace BlueForce
+namespace Ringworld2 {
+
+char const *const CONSOLE125_MESSAGES[] = {
+ NULL, "Select Language", "Computer Services", "Food Services", "Entertainment Services",
+ "Main Menu", "Exit Menu", "Previous Menu", "Interworld", "Hero's Tongue", "Personal Log",
+ "Database", "Starchart", "Iso-Opto Disk Reader", "Eject Disk", "Meals", "Snacks",
+ "Beverages", "Human Basic Snacks", "Kzin Basic Snacks", "Hot Beverages", "Cold Beverages",
+ "Music", "Outpost Alpha", " ", " ", "Done", "A-G", "H-O", "P-S", "T-Z", "Tchaikovsky",
+ "Mozart", "Bach", "Rossini"
+};
+
+char const *const CONSOLE325_MESSAGES[] = {
+ NULL, "Select Language", "Database", "Star Chart", "Scan Ops", "Deep Scan",
+ "Short Scan", "Main Menu", "Previous Menu", "Exit Menu", "Interworld", "Hero's Tongue",
+ "Done", " ", " ", "Passive Enabled", "Active Enabled", "Technological", "Biological",
+ "Geographical", "Astronomical", "Dipole Anomaly Sweep", "Structural Analysis",
+ "A-G", "N-O", "P-S", "T-Z", "Tchaikovsky", "Mozart", "Bach", "Rossini"
+};
+
+// Scene 825 Autodoc messages
+char const *const MAIN_MENU = "main menu";
+char const *const DIAGNOSIS = "diagnosis";
+char const *const ADVANCED_PROCEDURES = "advanced procedures";
+char const *const VITAL_SIGNS = "vital signs";
+char const *const OPEN_DOOR = "open door";
+char const *const TREATMENTS = "treatments";
+char const *const NO_MALADY_DETECTED = "no malady detected";
+char const *const NO_TREATMENT_REQUIRED = "no treatment required";
+char const *const ACCESS_CODE_REQUIRED = "access code required";
+char const *const INVALID_ACCESS_CODE = "invalid access code";
+char const *const FOREIGN_OBJECT_EXTRACTED = "foreign object extracted";
+
+char const *const HELP_MSG = "\x1\rRETURN TO\r RINGWORLD\x14";
+char const *const CHAR_TITLE = "\x01Select Character:";
+char const *const CHAR_QUINN_MSG = " Quinn ";
+char const *const CHAR_SEEKER_MSG = " Seeker ";
+char const *const CHAR_MIRANDA_MSG = "Miranda";
+char const *const CHAR_CANCEL_MSG = " Cancel ";
+
+char const *const GAME_VERSION = "ScummVM Version";
+char const *const SOUND_OPTIONS = "Sound options";
+char const *const QUIT_GAME = "Quit";
+char const *const RESTART_GAME = "Restart";
+char const *const SAVE_GAME = "Save game";
+char const *const RESTORE_GAME = "Restore game";
+char const *const SHOW_CREDITS = "Show credits";
+char const *const PAUSE_GAME = "Pause game";
+char const *const RESUME_PLAY = " Resume play ";
+char const *const F2 = "F2";
+char const *const F3 = "F3";
+char const *const F4 = "F4";
+char const *const F5 = "F5";
+char const *const F7 = "F7";
+char const *const F8 = "F8";
+char const *const F10 = "F10";
+
+char const *const DONE_MSG = "Done";
+char const *const YES_MSG = " Yes ";
+char const *const NO_MSG = " No ";
+char const *const USE_INTERCEPTOR = "Do you want to use your interceptor card?";
+char const *const USE_DOUBLE_AGENT = "Do you want to use your double agent?";
+char const *const NEED_INSTRUCTIONS = "Do you want instructions?";
+char const *const WRONG_ANSWER_MSG = "Wrong respond value sent.";
+const byte k562CC[] = {
+ 20, 7, 41, 6,
+ 3, 6, 42, 11,
+ 10, 15, 43, 6,
+ 15, 1, 44, 7,
+ 1, 1, 2, 1,
+ 1, 1, 21, 12,
+ 5, 1, 36, 1,
+ 5, 1, 28, 2,
+ 9, 1, 10, 7,
+ 9, 1, 12, 10,
+ 19, 1, 10, 8,
+ 19, 1, 2, 13,
+ 25, 1, 31, 1,
+ 27, 1, 15, 6,
+ 27, 1, 20, 7,
+ 28, 1, 24, 4,
+ 6, 2, 22, 1,
+ 6, 2, 16, 5,
+ 12, 2, 40, 1,
+ 12, 2, 6, 11,
+ 18, 2, 21, 5,
+ 20, 5, 19, 4,
+ 20, 5, 18, 8,
+ 1, 6, 20, 11,
+ 1, 6, 18, 15,
+ 1, 6, 16, 4,
+ 7, 6, 6, 16,
+ 8, 6, 23, 9,
+ 8, 6, 38, 10,
+ 8, 6, 14, 13,
+ 8, 6, 6, 14,
+ 8, 6, 11, 15,
+ 10, 6, 3, 1,
+ 10, 6, 8, 2,
+ 10, 6, 13, 3,
+ 10, 6, 6, 15,
+ 17, 6, 4, 15,
+ 5, 7, 26, 11,
+ 25, 7, 27, 3,
+ 28, 7, 21, 5,
+ 2, 8, 23, 5,
+ 14, 8, 21, 5,
+ 14, 8, 22, 16,
+ 22, 8, 34, 3,
+ 22, 8, 24, 7,
+ 6, 9, 38, 5,
+ 6, 9, 32, 6,
+ 6, 9, 18, 7,
+ 9, 9, 34, 15,
+ 9, 9, 35, 16,
+ 18, 9, 1, 5,
+ 18, 9, 24, 11,
+ 26, 9, 21, 10,
+ 1, 10, 21, 9,
+ 1, 10, 12, 13,
+ 11, 10, 21, 16,
+ 15, 10, 8, 1,
+ 15, 10, 12, 6,
+ 15, 10, 14, 10,
+ 20, 10, 14, 10,
+ 20, 10, 39, 11,
+ 3, 11, 5, 9,
+ 3, 11, 4, 13,
+ 5, 11, 32, 7,
+ 5, 11, 20, 8,
+ 5, 11, 20, 11,
+ 7, 12, 22, 11,
+ 7, 12, 2, 12,
+ 7, 12, 23, 16,
+ 8, 12, 25, 9,
+ 13, 12, 23, 10,
+ 16, 12, 3, 11,
+ 17, 12, 25, 10,
+ 17, 12, 28, 15,
+ 25, 12, 8, 15,
+ 26, 12, 7, 14,
+ 1, 13, 8, 6,
+ 10, 13, 28, 11,
+ 21, 13, 25, 13,
+ 21, 13, 24, 16,
+ 25, 13, 25, 3,
+ 5, 14, 17, 6,
+ 5, 14, 23, 16,
+ 12, 14, 36, 15,
+ 12, 14, 17, 16,
+ 13, 14, 40, 13,
+ 13, 14, 38, 14,
+ 19, 14, 18, 10,
+ 2, 15, 4, 14,
+ 8, 15, 1, 13,
+ 12, 15, 21, 4,
+ 12, 15, 27, 7,
+ 12, 15, 28, 8,
+ 13, 15, 34, 1,
+ 13, 15, 31, 5,
+ 14, 15, 21, 16,
+ 15, 15, 29, 1,
+ 15, 15, 23, 13,
+ 25, 15, 24, 6,
+ 25, 15, 23, 11,
+ 28, 15, 8, 6,
+ 28, 15, 9, 10,
+ 1, 16, 1, 1,
+ 1, 16, 22, 5,
+ 7, 16, 3, 4,
+ 8, 16, 7, 1,
+ 11, 17, 4, 12,
+ 18, 17, 1, 13,
+ 22, 17, 21, 6,
+ 22, 17, 28, 15,
+ 27, 17, 12, 7,
+ 27, 17, 8, 8,
+ 27, 17, 14, 11,
+ 27, 17, 18, 15,
+ 27, 17, 2, 16,
+ 6, 18, 24, 7,
+ 14, 18, 21, 13,
+ 27, 18, 38, 4,
+ 28, 18, 20, 1,
+ 1, 18, 11, 15,
+ 9, 18, 7, 1,
+ 9, 18, 13, 12,
+ 16, 18, 32, 10,
+ 16, 18, 25, 13,
+ 16, 18, 31, 14,
+ 25, 18, 20, 7,
+ 28, 18, 21, 1
+};
+
+const byte k5A4D6[] = {
+ 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
+ 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18,
+ 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19,
+ 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,
+ 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,
+ 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,
+ 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,
+ 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,
+ 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,
+ 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,
+ 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,
+ 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,
+ 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,
+ 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,
+ 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,
+ 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,
+ 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,
+ 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,
+ 13, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14
+};
+
+const byte k5A72E[] = {0, 98, 135, 183, 229, 81, 133, 185, 235, 75, 131, 187, 241, 70, 129, 190, 247};
+const byte k5A73F[] = {0, 42, 42, 42, 42, 67, 67, 67, 67, 92, 92, 92, 92, 116, 116, 116, 116};
+const byte k5A750[] = {
+ 9, 10, 7, 13, 7, 8, 9, 7, 9, 10,
+ 2, 3, 3, 2, 2, 2, 4, 3, 3, 4,
+ 3, 2, 3, 4, 3, 8, 10, 4, 0
+};
+const byte k5A76D[] = {
+ 3, 3, 3, 4, 3, 3, 3, 3, 1, 3,
+ 3, 3, 3, 7, 3, 7, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3
+};
+const byte k5A78A[] = {0, 8, 15, 16, 12, 7, 18, 17, 13, 6, 19, 20, 14, 5, 11, 10, 9};
+const byte k5A79B[] = {
+ 23, 3, 1,
+ 23, 4, 1,
+ 26, 3, 1,
+ 26, 4, 1,
+ 15, 16, 2,
+ 2, 16, 3,
+ 3, 16, 4,
+ 10, 7, 5,
+ 11, 7, 6,
+ 3, 0, 7,
+ 4, 0, 8,
+ 24, 11, 9,
+ 25, 11, 10,
+ 12, 8, 11,
+ 9, 11, 12
+};
+
+const byte k5A7F6[] = {
+ 4, 11, 6,
+ 5, 14, 5,
+ 5, 11, 6,
+ 5, 7, 5,
+ 6, 9, 6,
+ 7, 16, 7,
+ 7, 12, 7,
+ 8, 6, 5,
+ 9, 9, 7,
+ 10, 13, 9,
+ 10, 6, 8,
+ 11, 10, 9,
+ 12, 15, 10,
+ 13, 12, 11,
+ 14, 8, 9,
+ 15, 16, 1,
+ 15, 10, 11
+};
+
+} // End of namespace Ringworld2
+
} // End of namespace TsAGE
diff --git a/engines/tsage/staticres.h b/engines/tsage/staticres.h
index 203fa1481d..e3daf73333 100644
--- a/engines/tsage/staticres.h
+++ b/engines/tsage/staticres.h
@@ -31,118 +31,186 @@ extern const byte CURSOR_ARROW_DATA[];
extern const byte CURSOR_WALK_DATA[];
-extern const char *LOOK_SCENE_HOTSPOT;
-extern const char *USE_SCENE_HOTSPOT;
-extern const char *TALK_SCENE_HOTSPOT;
-extern const char *SPECIAL_SCENE_HOTSPOT;
-extern const char *DEFAULT_SCENE_HOTSPOT;
-extern const char *SAVE_ERROR_MSG;
-extern const char *SAVING_NOT_ALLOWED_MSG;
-extern const char *RESTORING_NOT_ALLOWED_MSG;
+extern char const *const LOOK_SCENE_HOTSPOT;
+extern char const *const USE_SCENE_HOTSPOT;
+extern char const *const TALK_SCENE_HOTSPOT;
+extern char const *const SPECIAL_SCENE_HOTSPOT;
+extern char const *const DEFAULT_SCENE_HOTSPOT;
+extern char const *const SAVE_ERROR_MSG;
+extern char const *const SAVING_NOT_ALLOWED_MSG;
+extern char const *const RESTORING_NOT_ALLOWED_MSG;
// Dialogs
-extern const char *QUIT_CONFIRM_MSG;
-extern const char *RESTART_MSG;
-extern const char *GAME_PAUSED_MSG;
-extern const char *OPTIONS_MSG;
-extern const char *OK_BTN_STRING;
-extern const char *CANCEL_BTN_STRING;
-extern const char *QUIT_BTN_STRING;
-extern const char *RESTART_BTN_STRING;
-extern const char *SAVE_BTN_STRING;
-extern const char *RESTORE_BTN_STRING;
-extern const char *SOUND_BTN_STRING;
-extern const char *RESUME_BTN_STRING;
-extern const char *LOOK_BTN_STRING;
-extern const char *PICK_BTN_STRING;
-extern const char *INV_EMPTY_MSG;
+extern char const *const QUIT_CONFIRM_MSG;
+extern char const *const RESTART_MSG;
+extern char const *const GAME_PAUSED_MSG;
+extern char const *const OK_BTN_STRING;
+extern char const *const CANCEL_BTN_STRING;
+extern char const *const QUIT_BTN_STRING;
+extern char const *const RESTART_BTN_STRING;
+extern char const *const SAVE_BTN_STRING;
+extern char const *const RESTORE_BTN_STRING;
+extern char const *const SOUND_BTN_STRING;
+extern char const *const RESUME_BTN_STRING;
+extern char const *const LOOK_BTN_STRING;
+extern char const *const PICK_BTN_STRING;
+extern char const *const INV_EMPTY_MSG;
namespace Ringworld {
// Dialog resources
-extern const char *HELP_MSG;
-extern const char *WATCH_INTRO_MSG;
-extern const char *START_PLAY_BTN_STRING;
-extern const char *INTRODUCTION_BTN_STRING;
+extern char const *const HELP_MSG;
+extern char const *const WATCH_INTRO_MSG;
+extern char const *const START_PLAY_BTN_STRING;
+extern char const *const INTRODUCTION_BTN_STRING;
+extern char const *const OPTIONS_MSG;
// Scene specific resources
-extern const char *EXIT_MSG;
-extern const char *SCENE6100_CAREFUL;
-extern const char *SCENE6100_TOUGHER;
-extern const char *SCENE6100_ONE_MORE_HIT;
-extern const char *SCENE6100_DOING_BEST;
-extern const char *SCENE6100_REPAIR;
-extern const char *SCENE6100_ROCKY_AREA;
-extern const char *SCENE6100_REPLY;
-extern const char *SCENE6100_TAKE_CONTROLS;
-extern const char *SCENE6100_SURPRISE;
-extern const char *SCENE6100_SWEAT;
-extern const char *SCENE6100_VERY_WELL;
+extern char const *const EXIT_MSG;
+extern char const *const SCENE6100_CAREFUL;
+extern char const *const SCENE6100_TOUGHER;
+extern char const *const SCENE6100_ONE_MORE_HIT;
+extern char const *const SCENE6100_DOING_BEST;
+extern char const *const SCENE6100_REPAIR;
+extern char const *const SCENE6100_ROCKY_AREA;
+extern char const *const SCENE6100_REPLY;
+extern char const *const SCENE6100_TAKE_CONTROLS;
+extern char const *const SCENE6100_SURPRISE;
+extern char const *const SCENE6100_SWEAT;
+extern char const *const SCENE6100_VERY_WELL;
// Demo messages
-extern const char *DEMO_HELP_MSG;
-extern const char *DEMO_PAUSED_MSG;
-extern const char *DEMO_HELP_MSG;
-extern const char *DEMO_PAUSED_MSG;
-extern const char *DEMO_EXIT_MSG;
-extern const char *EXIT_BTN_STRING;
-extern const char *DEMO_BTN_STRING;
-extern const char *DEMO_RESUME_BTN_STRING;
+extern char const *const DEMO_HELP_MSG;
+extern char const *const DEMO_PAUSED_MSG;
+extern char const *const DEMO_HELP_MSG;
+extern char const *const DEMO_PAUSED_MSG;
+extern char const *const DEMO_EXIT_MSG;
+extern char const *const EXIT_BTN_STRING;
+extern char const *const DEMO_BTN_STRING;
+extern char const *const DEMO_RESUME_BTN_STRING;
} // End of namespace Ringworld
namespace BlueForce {
// Dialog resources
-extern const char *HELP_MSG;
-extern const char *WATCH_INTRO_MSG;
-extern const char *START_PLAY_BTN_STRING;
-extern const char *INTRODUCTION_BTN_STRING;
+extern char const *const HELP_MSG;
+extern char const *const WATCH_INTRO_MSG;
+extern char const *const START_PLAY_BTN_STRING;
+extern char const *const INTRODUCTION_BTN_STRING;
+extern char const *const OPTIONS_MSG;
// Blue Force messages
-extern const char *BF_NAME;
-extern const char *BF_COPYRIGHT;
-extern const char *BF_ALL_RIGHTS_RESERVED;
-extern const char *BF_19840518;
-extern const char *BF_19840515;
-extern const char *BF_3_DAYS;
-extern const char *BF_11_YEARS;
-extern const char *BF_NEXT_DAY;
-extern const char *BF_ACADEMY;
+extern char const *const BF_NAME;
+extern char const *const BF_COPYRIGHT;
+extern char const *const BF_ALL_RIGHTS_RESERVED;
+extern char const *const BF_19840518;
+extern char const *const BF_19840515;
+extern char const *const BF_3_DAYS;
+extern char const *const BF_11_YEARS;
+extern char const *const BF_NEXT_DAY;
+extern char const *const BF_ACADEMY;
// Scene 50 tooltips
-extern const char *GRANDMA_FRANNIE;
-extern const char *MARINA;
-extern const char *POLICE_DEPARTMENT;
-extern const char *TONYS_BAR;
-extern const char *CHILD_PROTECTIVE_SERVICES;
-extern const char *ALLEY_CAT;
-extern const char *CITY_HALL_JAIL;
-extern const char *JAMISON_RYAN;
-extern const char *BIKINI_HUT;
-
-extern const char *SCENE570_PASSWORD;
-extern const char *SCENE570_C_DRIVE;
-extern const char *SCENE570_RING;
-extern const char *SCENE570_PROTO;
-extern const char *SCENE570_WACKY;
-extern const char *SCENE570_COBB;
-extern const char *SCENE570_LETTER;
-extern const char *SCENE570_RINGEXE;
-extern const char *SCENE570_RINGDATA;
-extern const char *SCENE570_PROTOEXE;
-extern const char *SCENE570_PROTODATA;
-extern const char *SCENE570_WACKYEXE;
-extern const char *SCENE570_WACKYDATA;
+extern char const *const GRANDMA_FRANNIE;
+extern char const *const MARINA;
+extern char const *const POLICE_DEPARTMENT;
+extern char const *const TONYS_BAR;
+extern char const *const CHILD_PROTECTIVE_SERVICES;
+extern char const *const ALLEY_CAT;
+extern char const *const CITY_HALL_JAIL;
+extern char const *const JAMISON_RYAN;
+extern char const *const BIKINI_HUT;
+
+extern char const *const SCENE570_PASSWORD;
+extern char const *const SCENE570_C_DRIVE;
+extern char const *const SCENE570_RING;
+extern char const *const SCENE570_PROTO;
+extern char const *const SCENE570_WACKY;
+extern char const *const SCENE570_COBB;
+extern char const *const SCENE570_LETTER;
+extern char const *const SCENE570_RINGEXE;
+extern char const *const SCENE570_RINGDATA;
+extern char const *const SCENE570_PROTOEXE;
+extern char const *const SCENE570_PROTODATA;
+extern char const *const SCENE570_WACKYEXE;
+extern char const *const SCENE570_WACKYDATA;
// Scene 60 radio dispatch buttons
-extern const char *RADIO_BTN_LIST[8];
+extern char const *const RADIO_BTN_LIST[8];
// Scene 180 message
-extern const char *THE_NEXT_DAY;
+extern char const *const THE_NEXT_DAY;
} // End of namespace BlueForce
+namespace Ringworld2 {
+
+// Scene 125 - Console messages
+extern char const *const CONSOLE125_MESSAGES[];
+
+// Scene 325 - Console messages
+extern char const *const CONSOLE325_MESSAGES[];
+
+// Scene 825 - Autodoc Messages
+extern char const *const MAIN_MENU;
+extern char const *const DIAGNOSIS;
+extern char const *const ADVANCED_PROCEDURES;
+extern char const *const VITAL_SIGNS;
+extern char const *const OPEN_DOOR;
+extern char const *const TREATMENTS;
+extern char const *const NO_MALADY_DETECTED;
+extern char const *const NO_TREATMENT_REQUIRED;
+extern char const *const ACCESS_CODE_REQUIRED;
+extern char const *const INVALID_ACCESS_CODE;
+extern char const *const FOREIGN_OBJECT_EXTRACTED;
+
+// Dialog messages
+extern char const *const HELP_MSG;
+extern char const *const CHAR_TITLE;
+extern char const *const CHAR_QUINN_MSG;
+extern char const *const CHAR_SEEKER_MSG;
+extern char const *const CHAR_MIRANDA_MSG;
+extern char const *const CHAR_CANCEL_MSG;
+
+extern char const *const GAME_VERSION;
+extern char const *const SOUND_OPTIONS;
+extern char const *const QUIT_GAME;
+extern char const *const RESTART_GAME;
+extern char const *const SAVE_GAME;
+extern char const *const RESTORE_GAME;
+extern char const *const SHOW_CREDITS;
+extern char const *const PAUSE_GAME;
+extern char const *const RESUME_PLAY;
+extern char const *const F2;
+extern char const *const F3;
+extern char const *const F4;
+extern char const *const F5;
+extern char const *const F7;
+extern char const *const F8;
+extern char const *const F10;
+
+extern char const *const DONE_MSG;
+extern char const *const YES_MSG;
+extern char const *const NO_MSG;
+extern char const *const USE_INTERCEPTOR;
+extern char const *const USE_DOUBLE_AGENT;
+extern char const *const NEED_INSTRUCTIONS;
+extern char const *const WRONG_ANSWER_MSG;
+
+// Scene 1550 arrays of constants
+extern const byte k562CC[];
+extern const byte k5A4D6[];
+extern const byte k5A72E[];
+extern const byte k5A73F[];
+extern const byte k5A750[];
+extern const byte k5A76D[];
+extern const byte k5A78A[];
+extern const byte k5A79B[];
+extern const byte k5A7F6[];
+
+} // End of namespace Ringworld2
+
} // End of namespace TsAGE
#endif
diff --git a/engines/tsage/tsage.cpp b/engines/tsage/tsage.cpp
index 7e7198fc2b..40f4dfcfd2 100644
--- a/engines/tsage/tsage.cpp
+++ b/engines/tsage/tsage.cpp
@@ -38,7 +38,14 @@ TSageEngine::TSageEngine(OSystem *system, const tSageGameDescription *gameDesc)
_gameDescription(gameDesc) {
g_vm = this;
DebugMan.addDebugChannel(kRingDebugScripts, "scripts", "Scripts debugging");
- _debugger = new Debugger();
+ if (g_vm->getFeatures() & GF_DEMO)
+ _debugger = new DemoDebugger();
+ else if (g_vm->getGameID() == GType_Ringworld)
+ _debugger = new RingworldDebugger();
+ else if (g_vm->getGameID() == GType_BlueForce)
+ _debugger = new BlueForceDebugger();
+ else if (g_vm->getGameID() == GType_Ringworld2)
+ _debugger = new Ringworld2Debugger();
}
Common::Error TSageEngine::init() {
@@ -61,6 +68,9 @@ bool TSageEngine::hasFeature(EngineFeature f) const {
}
void TSageEngine::initialize() {
+ // Set up the correct graphics mode
+ init();
+
g_saver = new Saver();
// Set up the resource manager
@@ -97,7 +107,7 @@ void TSageEngine::initialize() {
// Reset all global variables
R2_GLOBALS.reset();
- }
+ }
g_globals->gfxManager().setDefaults();
diff --git a/engines/tsage/tsage.h b/engines/tsage/tsage.h
index eb36cf0790..41179c4915 100644
--- a/engines/tsage/tsage.h
+++ b/engines/tsage/tsage.h
@@ -54,7 +54,8 @@ enum {
enum {
kRingDebugScripts = 1 << 0,
ktSageSound = 1 << 1,
- ktSageCore = 1 << 2
+ ktSageCore = 1 << 2,
+ ktSageDebugGraphics = 1 << 3
};
struct tSageGameDescription;
diff --git a/engines/tsage/user_interface.cpp b/engines/tsage/user_interface.cpp
index b7f96b3806..10cb6961dc 100644
--- a/engines/tsage/user_interface.cpp
+++ b/engines/tsage/user_interface.cpp
@@ -25,6 +25,7 @@
#include "tsage/tsage.h"
#include "tsage/blue_force/blueforce_dialogs.h"
#include "tsage/blue_force/blueforce_logic.h"
+#include "tsage/ringworld2/ringworld2_logic.h"
namespace TsAGE {
@@ -70,12 +71,27 @@ void UIQuestion::process(Event &event) {
}
void UIQuestion::showDescription(CursorType cursor) {
- if (cursor == INV_FOREST_RAP) {
- // Forest rap item has a graphical display
- showItem(5, 1, 1);
- } else {
- // Display object description
- SceneItem::display2(9001, (int)cursor);
+ switch (g_vm->getGameID()) {
+ case GType_BlueForce:
+ if (cursor == INV_FOREST_RAP) {
+ // Forest rap item has a graphical display
+ showItem(5, 1, 1);
+ } else {
+ // Display object description
+ SceneItem::display2(9001, (int)cursor);
+ }
+ break;
+ case GType_Ringworld2:
+ if ((cursor == R2_COM_SCANNER) || (cursor == R2_COM_SCANNER_2)) {
+ // Show communicator
+ warning("TODO: Communicator");
+ } else {
+ // Show object description
+ SceneItem::display2(3, (int)cursor);
+ }
+ break;
+ default:
+ break;
}
}
@@ -96,16 +112,16 @@ void UIQuestion::showItem(int resNum, int rlbNum, int frameNum) {
imgRect.center(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2);
// Save the area behind where the image will be displayed
- GfxSurface *savedArea = Surface_getArea(BF_GLOBALS.gfxManager().getSurface(), imgRect);
+ GfxSurface *savedArea = Surface_getArea(GLOBALS.gfxManager().getSurface(), imgRect);
// Draw the image
- BF_GLOBALS.gfxManager().copyFrom(objImage, imgRect);
+ GLOBALS.gfxManager().copyFrom(objImage, imgRect);
// Wait for a press
- BF_GLOBALS._events.waitForPress();
+ GLOBALS._events.waitForPress();
// Restore the old area
- BF_GLOBALS.gfxManager().copyFrom(*savedArea, imgRect);
+ GLOBALS.gfxManager().copyFrom(*savedArea, imgRect);
delete savedArea;
}
@@ -183,9 +199,9 @@ void UIInventoryScroll::process(Event &event) {
// Draw the button as selected
toggle(true);
- event.handled = true;
- break;
- case EVENT_BUTTON_UP:
+ // Wait for the mouse to be released
+ BF_GLOBALS._events.waitForPress(EVENT_BUTTON_UP);
+
// Restore unselected version
toggle(false);
@@ -232,8 +248,8 @@ void UICollection::show() {
void UICollection::erase() {
if (_clearScreen) {
Rect tempRect(0, UI_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT);
- BF_GLOBALS._screenSurface.fillRect(tempRect, 0);
- BF_GLOBALS._sceneManager._scene->_backSurface.fillRect(tempRect, 0);
+ GLOBALS._screenSurface.fillRect(tempRect, 0);
+ GLOBALS._sceneManager._scene->_backSurface.fillRect(tempRect, 0);
_clearScreen = false;
}
}
@@ -253,7 +269,7 @@ void UICollection::draw() {
_objList[idx]->draw();
// Draw the resulting UI onto the screen
- BF_GLOBALS._screenSurface.copyFrom(BF_GLOBALS._sceneManager._scene->_backSurface,
+ GLOBALS._screenSurface.copyFrom(GLOBALS._sceneManager._scene->_backSurface,
Rect(0, UI_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT),
Rect(0, UI_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT));
@@ -265,9 +281,11 @@ void UICollection::draw() {
/*--------------------------------------------------------------------------*/
UIElements::UIElements(): UICollection() {
- _cursorVisage.setVisage(1, 5);
+ if (g_vm->getGameID() == GType_Ringworld2)
+ _cursorVisage.setVisage(5, 1);
+ else
+ _cursorVisage.setVisage(1, 5);
g_saver->addLoadNotifier(&UIElements::loadNotifierProc);
- _characterIndex = 0;
}
void UIElements::synchronize(Serializer &s) {
@@ -295,22 +313,21 @@ void UIElements::synchronize(Serializer &s) {
s.syncAsSint16LE(itemId);
}
}
-
- if (g_vm->getGameID() == GType_Ringworld2)
- s.syncAsSint16LE(_characterIndex);
}
void UIElements::process(Event &event) {
- if (_clearScreen && BF_GLOBALS._player._enabled && (BF_GLOBALS._sceneManager._sceneNumber != 50)) {
+ if (_clearScreen && GLOBALS._player._enabled &&
+ ((g_vm->getGameID() != GType_BlueForce) || (GLOBALS._sceneManager._sceneNumber != 50))) {
if (_bounds.contains(event.mousePos)) {
// Cursor inside UI area
if (!_cursorChanged) {
- if (BF_GLOBALS._events.isInventoryIcon()) {
+ if (GLOBALS._events.isInventoryIcon()) {
// Inventory icon being displayed, so leave alone
} else {
// Change to the inventory use cursor
- GfxSurface surface = _cursorVisage.getFrame(6);
- BF_GLOBALS._events.setCursor(surface);
+ int cursorId = (g_vm->getGameID() == GType_Ringworld2) ? 11 : 6;
+ GfxSurface surface = _cursorVisage.getFrame(cursorId);
+ GLOBALS._events.setCursor(surface);
}
_cursorChanged = true;
}
@@ -329,13 +346,13 @@ void UIElements::process(Event &event) {
} else if (_cursorChanged) {
// Cursor outside UI area, so reset as necessary
- BF_GLOBALS._events.setCursor(BF_GLOBALS._events.getCursor());
+ GLOBALS._events.setCursor(GLOBALS._events.getCursor());
_cursorChanged = false;
/*
- SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene;
+ SceneExt *scene = (SceneExt *)GLOBALS._sceneManager._scene;
if (scene->_focusObject) {
GfxSurface surface = _cursorVisage.getFrame(7);
- BF_GLOBALS._events.setCursor(surface);
+ GLOBALS._events.setCursor(surface);
}
*/
}
@@ -403,9 +420,10 @@ void UIElements::setup(const Common::Point &pt) {
// Set up the score
_score.postInit();
add(&_score);
+ break;
case GType_Ringworld2:
// Set up the character display
- _character.setup(1, 5, _characterIndex, 285, 11, 255);
+ _character.setup(1, 5, R2_GLOBALS._player._characterIndex, 285, 11, 255);
add(&_character);
break;
default:
@@ -434,7 +452,16 @@ void UIElements::add(UIElement *obj) {
* Handles updating the visual inventory in the user interface
*/
void UIElements::updateInventory() {
- _score.updateScore();
+ switch (g_vm->getGameID()) {
+ case GType_BlueForce:
+ // Update the score
+ _score.updateScore();
+ break;
+ case GType_Ringworld2:
+ _character.setFrame(R2_GLOBALS._player._characterIndex);
+ break;
+ }
+
updateInvList();
// Enable scroll buttons if the player has more than four items
@@ -459,7 +486,7 @@ void UIElements::updateInventory() {
// Loop through the inventory objects
SynchronizedList<InvObject *>::iterator i;
int objIndex = 0;
- for (i = BF_INVENTORY._itemList.begin(); i != BF_INVENTORY._itemList.end(); ++i, ++objIndex) {
+ for (i = GLOBALS._inventory->_itemList.begin(); i != GLOBALS._inventory->_itemList.end(); ++i, ++objIndex) {
InvObject *obj = *i;
// Check whether the object is in any of the four inventory slots
@@ -475,6 +502,8 @@ void UIElements::updateInventory() {
slot->setVisage(obj->_visage);
slot->setStrip(obj->_strip);
slot->setFrame(obj->_frame);
+
+ slot->reposition();
}
}
}
@@ -493,7 +522,7 @@ void UIElements::updateInvList() {
SynchronizedList<InvObject *>::iterator i;
int itemIndex = 0;
- for (i = BF_GLOBALS._inventory->_itemList.begin(); i != BF_GLOBALS._inventory->_itemList.end(); ++i, ++itemIndex) {
+ for (i = GLOBALS._inventory->_itemList.begin(); i != GLOBALS._inventory->_itemList.end(); ++i, ++itemIndex) {
InvObject *invObject = *i;
if (invObject->inInventory())
_itemList.push_back(itemIndex);
@@ -505,7 +534,7 @@ void UIElements::updateInvList() {
*/
void UIElements::addScore(int amount) {
_scoreValue += amount;
- BF_GLOBALS._sound2.play(0);
+ T2_GLOBALS._inventorySound.play(0);
updateInventory();
}
diff --git a/engines/tsage/user_interface.h b/engines/tsage/user_interface.h
index 94a2444e39..0fbfc5a00f 100644
--- a/engines/tsage/user_interface.h
+++ b/engines/tsage/user_interface.h
@@ -129,7 +129,6 @@ public:
Common::Array<int> _itemList;
Visage _cursorVisage;
UIElement _character;
- int _characterIndex;
UIElements();
virtual Common::String getClassName() { return "UIElements"; }