aboutsummaryrefslogtreecommitdiff
path: root/engines/tsage/ringworld
diff options
context:
space:
mode:
authorPaul Gilbert2011-08-13 19:49:54 +1000
committerPaul Gilbert2011-08-13 19:49:54 +1000
commite9c8232da864891fafcceb217b291a50096738ce (patch)
tree496ccf031f0500cd2d84bc8780ed5fc0d0ab656e /engines/tsage/ringworld
parentc109a60a9233bfe6f30475abf4814ad5c6bc2f70 (diff)
downloadscummvm-rg350-e9c8232da864891fafcceb217b291a50096738ce.tar.gz
scummvm-rg350-e9c8232da864891fafcceb217b291a50096738ce.tar.bz2
scummvm-rg350-e9c8232da864891fafcceb217b291a50096738ce.zip
TSAGE: Split up the hard-coded logic files for Ringworld and Blue Force into separate sub-folderes
Diffstat (limited to 'engines/tsage/ringworld')
-rw-r--r--engines/tsage/ringworld/ringworld_demo.cpp120
-rw-r--r--engines/tsage/ringworld/ringworld_demo.h59
-rw-r--r--engines/tsage/ringworld/ringworld_logic.cpp1490
-rw-r--r--engines/tsage/ringworld/ringworld_logic.h461
-rw-r--r--engines/tsage/ringworld/ringworld_scenes1.cpp3345
-rw-r--r--engines/tsage/ringworld/ringworld_scenes1.h538
-rw-r--r--engines/tsage/ringworld/ringworld_scenes10.cpp2089
-rw-r--r--engines/tsage/ringworld/ringworld_scenes10.h532
-rw-r--r--engines/tsage/ringworld/ringworld_scenes2.cpp928
-rw-r--r--engines/tsage/ringworld/ringworld_scenes2.h149
-rw-r--r--engines/tsage/ringworld/ringworld_scenes3.cpp6133
-rw-r--r--engines/tsage/ringworld/ringworld_scenes3.h895
-rw-r--r--engines/tsage/ringworld/ringworld_scenes4.cpp250
-rw-r--r--engines/tsage/ringworld/ringworld_scenes4.h92
-rw-r--r--engines/tsage/ringworld/ringworld_scenes5.cpp4441
-rw-r--r--engines/tsage/ringworld/ringworld_scenes5.h693
-rw-r--r--engines/tsage/ringworld/ringworld_scenes6.cpp2200
-rw-r--r--engines/tsage/ringworld/ringworld_scenes6.h330
-rw-r--r--engines/tsage/ringworld/ringworld_scenes8.cpp2545
-rw-r--r--engines/tsage/ringworld/ringworld_scenes8.h490
20 files changed, 27780 insertions, 0 deletions
diff --git a/engines/tsage/ringworld/ringworld_demo.cpp b/engines/tsage/ringworld/ringworld_demo.cpp
new file mode 100644
index 0000000000..ce06df8e80
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_demo.cpp
@@ -0,0 +1,120 @@
+/* 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/ringworld/ringworld_demo.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+
+namespace tSage {
+
+void RingworldDemoGame::start() {
+ // Start the demo's single scene
+ _globals->_sceneManager.changeScene(1);
+
+ _globals->_events.setCursor(CURSOR_NONE);
+}
+
+Scene *RingworldDemoGame::createScene(int sceneNumber) {
+ // The demo only has a single scene, so ignore the scene number and always return it
+ return new RingworldDemoScene();
+}
+
+void RingworldDemoGame::quitGame() {
+ if (MessageDialog::show(DEMO_EXIT_MSG, EXIT_BTN_STRING, DEMO_BTN_STRING) == 0)
+ _vm->quitGame();
+}
+
+void RingworldDemoGame::pauseGame() {
+ _globals->_events.setCursor(CURSOR_ARROW);
+ MessageDialog *dlg = new MessageDialog(DEMO_PAUSED_MSG, EXIT_BTN_STRING, DEMO_RESUME_BTN_STRING);
+ dlg->draw();
+
+ GfxButton *selectedButton = dlg->execute(&dlg->_btn2);
+ bool exitFlag = selectedButton != &dlg->_btn2;
+
+ delete dlg;
+ _globals->_events.hideCursor();
+
+ if (exitFlag)
+ _vm->quitGame();
+}
+
+void RingworldDemoGame::processEvent(Event &event) {
+ if (event.eventType == EVENT_KEYPRESS) {
+ switch (event.kbd.keycode) {
+ case Common::KEYCODE_F1:
+ // F1 - Help
+ MessageDialog::show(DEMO_HELP_MSG, OK_BTN_STRING);
+ break;
+
+ case Common::KEYCODE_F2: {
+ // F2 - Sound Options
+ ConfigDialog *dlg = new ConfigDialog();
+ dlg->runModal();
+ delete dlg;
+ _globals->_soundManager.syncSounds();
+ _globals->_events.setCursorFromFlag();
+ break;
+ }
+
+ case Common::KEYCODE_F3:
+ // F3 - Quit
+ quitGame();
+ event.handled = false;
+ break;
+
+ default:
+ break;
+ }
+ } else if (event.eventType == EVENT_BUTTON_DOWN) {
+ pauseGame();
+ event.handled = true;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Ringworld Demo scene
+ *
+ *--------------------------------------------------------------------------*/
+
+void RingworldDemoScene::postInit(SceneObjectList *OwnerList) {
+ signal();
+}
+
+void RingworldDemoScene::signal() {
+ _soundHandler.play(4);
+ _actor1.postInit();
+ _actor2.postInit();
+ _actor3.postInit();
+ _actor4.postInit();
+ _actor5.postInit();
+ _actor6.postInit();
+
+ setAction(&_sequenceManager, this, 22, &_actor1, &_actor2, &_actor3, &_actor4, &_actor5, &_actor6, NULL);
+}
+
+void RingworldDemoScene::process(Event &event) {
+
+}
+
+} // End of namespace tSage
diff --git a/engines/tsage/ringworld/ringworld_demo.h b/engines/tsage/ringworld/ringworld_demo.h
new file mode 100644
index 0000000000..3e7431e107
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_demo.h
@@ -0,0 +1,59 @@
+/* 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_RINGWORLD_DEMO_H
+#define TSAGE_RINGWORLD_DEMO_H
+
+#include "common/scummsys.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+#include "tsage/sound.h"
+
+namespace tSage {
+
+class RingworldDemoGame: public Game {
+private:
+ void pauseGame();
+public:
+ virtual void start();
+ virtual Scene *createScene(int sceneNumber);
+ virtual void quitGame();
+ virtual void processEvent(Event &event);
+};
+
+class RingworldDemoScene: public Scene {
+public:
+ SequenceManager _sequenceManager;
+ SceneObject _actor1, _actor2, _actor3;
+ SceneObject _actor4, _actor5, _actor6;
+ ASound _soundHandler;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void process(Event &event);
+ virtual void signal();
+};
+
+} // End of namespace tSage
+
+#endif
diff --git a/engines/tsage/ringworld/ringworld_logic.cpp b/engines/tsage/ringworld/ringworld_logic.cpp
new file mode 100644
index 0000000000..99890c90ff
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_logic.cpp
@@ -0,0 +1,1490 @@
+/* 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 "common/config-manager.h"
+#include "common/translation.h"
+#include "gui/saveload.h"
+#include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+#include "tsage/ringworld/ringworld_demo.h"
+#include "tsage/ringworld/ringworld_scenes1.h"
+#include "tsage/ringworld/ringworld_scenes2.h"
+#include "tsage/ringworld/ringworld_scenes3.h"
+#include "tsage/ringworld/ringworld_scenes4.h"
+#include "tsage/ringworld/ringworld_scenes5.h"
+#include "tsage/ringworld/ringworld_scenes6.h"
+#include "tsage/ringworld/ringworld_scenes8.h"
+#include "tsage/ringworld/ringworld_scenes10.h"
+
+namespace tSage {
+
+Scene *RingworldGame::createScene(int sceneNumber) {
+ switch (sceneNumber) {
+ /* Scene group 1 */
+ // Kziniti Palace (Introduction)
+ case 10: return new Scene10();
+ // Outer Space (Introduction)
+ case 15: return new Scene15();
+ // Cut-scenes for Ch'mee house in distance
+ case 20: return new Scene20();
+ // Outside Ch'mee residence
+ case 30: return new Scene30();
+ // Chmeee Home
+ case 40: return new Scene40();
+ // By Flycycles
+ case 50: return new Scene50();
+ // Flycycle controls
+ case 60: return new Scene60();
+ // Shipyard Entrance
+ case 90: return new Scene90();
+ // Ship Close-up
+ case 95: return new Scene95();
+ // Sunflower navigation sequence
+ case 6100: return new Scene6100();
+
+ /* Scene group 2 */
+ // Title screen
+ case 1000: return new Scene1000();
+ // Fleeing planet cutscene
+ case 1001: return new Scene1001();
+ // Unused
+ case 1250: return new Scene1250();
+ // Ringworld Wall
+ case 1400: return new Scene1400();
+ // Ringworld Space-port
+ case 1500: return new Scene1500();
+
+ /* Scene group 3 - Part #1 */
+ // Cockpit cutscenes
+ case 2000: return new Scene2000();
+ // Starcraft - Cockpit
+ case 2100: return new Scene2100();
+ // Encyclopedia
+ case 2120: return new Scene2120();
+ // Starcraft - Level 2
+ case 2150: return new Scene2150();
+ // Starcraft - AutoDoc
+ case 2200: return new Scene2200();
+ // Stasis Field Map
+ case 2222: return new Scene2222();
+ // Starcraft - Quinn's Room
+ case 2230: return new Scene2230();
+
+ /* Scene group 3 - Part #2 */
+ // Starcraft - Storage Room
+ case 2280: return new Scene2280();
+ // Starcraft - Hanger Bay
+ case 2300: return new Scene2300();
+ // Starcraft - Copy Protection Screen
+ case 2310: return new Scene2310();
+ // Starcraft - Lander Bay
+ case 2320: return new Scene2320();
+ // Scene 2400 - Descending in Lander
+ case 2400: return new Scene2400();
+
+ /* Scene group 4 */
+ // Ringworld Scan
+ case 3500: return new Scene3500();
+ // Remote Viewer
+ case 3700: return new Scene3700();
+
+ /* Scene group 5 */
+ // Village
+ case 4000: return new Scene4000();
+ // Village - Outside Lander
+ case 4010: return new Scene4010();
+ // Village - Puzzle Board
+ case 4025: return new Scene4025();
+ // Village - Temple Antechamber
+ case 4045: return new Scene4045();
+ // Village - Temple
+ case 4050: return new Scene4050();
+ // Village - Hut
+ case 4100: return new Scene4100();
+ // Village - Bedroom
+ case 4150: return new Scene4150();
+ // Village - Near Slaver Ship
+ case 4250: return new Scene4250();
+ // Village - Slaver Ship
+ case 4300: return new Scene4300();
+ // Village - Slaver Ship Keypad
+ case 4301: return new Scene4301();
+
+ /* Scene group 6 */
+ // Caverns - Entrance
+ case 5000: return new Scene5000();
+ // Caverns
+ case 5100: return new Scene5100();
+ // Caverns - Throne-room
+ case 5200: return new Scene5200();
+ // Caverns - Pit
+ case 5300: return new Scene5300();
+
+ /* Scene group 8 */
+ // Landing near beach
+ case 7000: return new Scene7000();
+ // Underwater: swimming
+ case 7100: return new Scene7100();
+ // Underwater: Entering the cave
+ case 7200: return new Scene7200();
+ // Underwater: Lord Poria
+ case 7300: return new Scene7300();
+ // Floating Buildings: Outside
+ case 7600: return new Scene7600();
+ // Floating Buildings: In the lab
+ case 7700: return new Scene7700();
+
+ /* Scene group 10 */
+ // Near beach: Slave washing clothes
+ case 9100: return new Scene9100();
+ // Castle: Outside the bulwarks
+ case 9150: return new Scene9150();
+ // Castle: Near the fountain
+ case 9200: return new Scene9200();
+ // Castle: In front of a large guarded door
+ case 9300: return new Scene9300();
+ // Castle: In a hallway
+ case 9350: return new Scene9350();
+ // Castle: In a hallway
+ case 9360: return new Scene9360();
+ // Castle: Black-Smith room
+ case 9400: return new Scene9400();
+ // Castle: Dining room
+ case 9450: return new Scene9450();
+ // Castle: Bedroom
+ case 9500: return new Scene9500();
+ // Castle: Balcony
+ case 9700: return new Scene9700();
+ // Castle: In the garden
+ case 9750: return new Scene9750();
+ // Castle: Dressing room
+ case 9850: return new Scene9850();
+ // Ending
+ case 9900: return new Scene9900();
+ // Space travel
+ case 9999: return new Scene9999();
+
+ default:
+ error("Unknown scene number - %d", sceneNumber);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+DisplayHotspot::DisplayHotspot(int regionId, ...) {
+ _sceneRegionId = regionId;
+
+ // Load up the actions
+ va_list va;
+ va_start(va, regionId);
+
+ int param = va_arg(va, int);
+ while (param != LIST_END) {
+ _actions.push_back(param);
+ param = va_arg(va, int);
+ }
+
+ va_end(va);
+}
+
+bool DisplayHotspot::performAction(int action) {
+ for (uint i = 0; i < _actions.size(); i += 3) {
+ if (_actions[i] == action) {
+ display(_actions[i + 1], _actions[i + 2], SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+DisplayObject::DisplayObject(int firstAction, ...) {
+ // Load up the actions
+ va_list va;
+ va_start(va, firstAction);
+
+ int param = firstAction;
+ while (param != LIST_END) {
+ _actions.push_back(param);
+ param = va_arg(va, int);
+ }
+
+ va_end(va);
+}
+
+bool DisplayObject::performAction(int action) {
+ for (uint i = 0; i < _actions.size(); i += 3) {
+ if (_actions[i] == action) {
+ display(_actions[i + 1], _actions[i + 2], SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SceneArea::SceneArea() {
+ _savedArea = NULL;
+ _pt.x = _pt.y = 0;
+}
+
+SceneArea::~SceneArea() {
+ delete _savedArea;
+}
+
+void SceneArea::setup(int resNum, int rlbNum, int subNum, int actionId) {
+ _resNum = resNum;
+ _rlbNum = rlbNum;
+ _subNum = subNum;
+ _actionId = actionId;
+
+ _surface = surfaceFromRes(resNum, rlbNum, subNum);
+}
+
+void SceneArea::draw2() {
+ _surface.draw(Common::Point(_bounds.left, _bounds.top));
+}
+
+void SceneArea::display() {
+ _bounds.left = _pt.x - (_surface.getBounds().width() / 2);
+ _bounds.top = _pt.y + 1 - _surface.getBounds().height();
+ _bounds.setWidth(_surface.getBounds().width());
+ _bounds.setHeight(_surface.getBounds().height());
+
+ _savedArea = Surface_getArea(_globals->_gfxManagerInstance.getSurface(), _bounds);
+ draw2();
+}
+
+void SceneArea::restore() {
+ assert(_savedArea);
+ _savedArea->draw(Common::Point(_bounds.left, _bounds.top));
+ delete _savedArea;
+ _savedArea = NULL;
+}
+
+void SceneArea::draw(bool flag) {
+ _surface = surfaceFromRes(_resNum, _rlbNum, flag ? _subNum + 1 : _subNum);
+ _surface.draw(Common::Point(_bounds.left, _bounds.top));
+}
+
+void SceneArea::wait() {
+ // Wait until a mouse or keypress
+ Event event;
+ while (!_vm->shouldQuit() && !_globals->_events.getEvent(event)) {
+ g_system->updateScreen();
+ g_system->delayMillis(10);
+ }
+
+ SynchronizedList<SceneItem *>::iterator ii;
+ for (ii = _globals->_sceneItems.begin(); ii != _globals->_sceneItems.end(); ++ii) {
+ SceneItem *sceneItem = *ii;
+ if (sceneItem->contains(event.mousePos)) {
+ sceneItem->doAction(_actionId);
+ break;
+ }
+ }
+
+ _globals->_events.setCursor(CURSOR_ARROW);
+}
+
+void SceneArea::synchronize(Serializer &s) {
+ if (s.getVersion() >= 2)
+ SavedObject::synchronize(s);
+
+ s.syncAsSint16LE(_pt.x);
+ s.syncAsSint16LE(_pt.y);
+ s.syncAsSint32LE(_resNum);
+ s.syncAsSint32LE(_rlbNum);
+ s.syncAsSint32LE(_subNum);
+ s.syncAsSint32LE(_actionId);
+ _bounds.synchronize(s);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerGText::SpeakerGText() {
+ _speakerName = "GTEXT";
+ _textWidth = 160;
+ _textPos = Common::Point(130, 10);
+ _color1 = 42;
+ _hideObjects = false;
+}
+
+void SpeakerGText::setText(const Common::String &msg) {
+ // Set the animation properties
+ _sceneObject.postInit();
+ _sceneObject.setVisage(9405);
+ _sceneObject.setStrip2(3);
+ _sceneObject.fixPriority(255);
+ _sceneObject.changeZoom(100);
+ _sceneObject._frame = 1;
+ _sceneObject.setPosition(Common::Point(183, 71));
+ _sceneObject.animate(ANIM_MODE_7, 0, NULL);
+
+ // Set the text
+ Rect textRect;
+ _globals->gfxManager()._font.getStringBounds(msg.c_str(), textRect, _textWidth);
+ textRect.center(_sceneObject._position.x, _sceneObject._position.y);
+ _textPos.x = textRect.left;
+ Speaker::setText(msg);
+}
+
+void SpeakerGText::removeText() {
+ _sceneObject.remove();
+ Speaker::removeText();
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerPOR::SpeakerPOR() {
+ _speakerName = "POR";
+ _newSceneNumber = 7221;
+ _textPos = Common::Point(10, 30);
+ _color1 = 41;
+}
+
+void SpeakerPOR::SpeakerAction1::signal(){
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(_globals->_randomSource.getRandomNumber(60) + 60);
+ break;
+ case 1:
+ static_cast<SceneObject *>(_owner)->animate(ANIM_MODE_5, this, NULL);
+ break;
+ case 2:
+ setDelay(_globals->_randomSource.getRandomNumber(10));
+ _actionIndex = 0;
+ break;
+ default:
+ break;
+ }
+}
+
+void SpeakerPOR::setText(const Common::String &msg) {
+ _object1.postInit(&_objectList);
+ _object1.setVisage(7223);
+ _object1.setStrip2(2);
+ _object1.setPosition(Common::Point(191, 166));
+ _object1.animate(ANIM_MODE_7, 0, NULL);
+
+ _object2.postInit(&_objectList);
+ _object2.setVisage(7223);
+ _object2.setPosition(Common::Point(159, 86));
+ _object2.setAction(&_speakerAction, NULL);
+
+ _object3.postInit(&_objectList);
+ _object3.setVisage(7223);
+ _object3.setStrip(3);
+ _object3.setPosition(Common::Point(119, 107));
+ _object3.fixPriority(199);
+ _object3.setAction(&_action2);
+
+ Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerOR::SpeakerOR() {
+ _speakerName = "OR";
+ _newSceneNumber = 9430;
+ _textPos = Common::Point(8, 36);
+ _color1 = 42;
+ _textWidth = 136;
+}
+
+void SpeakerOR::setText(const Common::String &msg) {
+ _object1.postInit(&_objectList);
+ _object1.setVisage(9431);
+ _object1.setStrip2(2);
+ _object1.fixPriority(255);
+ _object1.changeZoom(100);
+ _object1._frame = 1;
+ _object1.setPosition(Common::Point(202, 147));
+ _object1.animate(ANIM_MODE_7, 0, NULL);
+
+ _object2.postInit(&_objectList);
+ _object2.setVisage(9431);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.setZoom(100);
+ _object2._frame = 1;
+ _object2.setPosition(Common::Point(199, 85));
+ _object2.setAction(&_speakerAction, NULL);
+
+ Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerOText::SpeakerOText() : SpeakerGText() {
+ _speakerName = "OTEXT";
+ _textWidth = 240;
+ _textPos = Common::Point(130, 10);
+ _color1 = 42;
+ _hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerQText::SpeakerQText() : ScreenSpeaker() {
+ _speakerName = "QTEXT";
+ _textPos = Common::Point(160, 40);
+ _color1 = 35;
+ _textWidth = 240;
+ _textMode = ALIGN_CENTER;
+ _hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerSText::SpeakerSText() : ScreenSpeaker() {
+ _speakerName = "STEXT";
+ _color1 = 13;
+ _textWidth = 240;
+ _textMode = ALIGN_CENTER;
+ _hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerPOText::SpeakerPOText() : ScreenSpeaker() {
+ _speakerName = "POTEXT";
+ _textWidth = 240;
+ _textMode = ALIGN_CENTER;
+ _color1 = 41;
+ _hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerMText::SpeakerMText() {
+ _speakerName = "MTEXT";
+ _color1 = 22;
+ _textWidth = 230;
+ _textMode = ALIGN_CENTER;
+ _hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerCText::SpeakerCText() {
+ _speakerName = "CTEXT";
+ _color1 = 4;
+ _textWidth = 240;
+ _textMode = ALIGN_CENTER;
+ _hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerEText::SpeakerEText() {
+ _speakerName = "ETEXT";
+ _textPos = Common::Point(20, 20);
+ _color1 = 22;
+ _hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerGR::SpeakerGR() : AnimatedSpeaker() {
+ _speakerName = "GR";
+ _newSceneNumber = 9220;
+ _textWidth = 136;
+ _textPos = Common::Point(168, 36);
+ _color1 = 14;
+}
+
+void SpeakerGR::setText(const Common::String &msg) {
+ _object1.postInit(&_objectList);
+ _object1.setVisage(9221);
+ _object1.setStrip2(2);
+ _object1.fixPriority(255);
+ _object1.changeZoom(100);
+ _object1._frame = 1;
+ _object1.setPosition(Common::Point(101, 70));
+ _object1.animate(ANIM_MODE_7, 0, NULL);
+
+ Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerHText::SpeakerHText() {
+ _speakerName = "HTEXT";
+ _textPos = Common::Point(160, 40);
+ _color1 = 52;
+ _hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerSKText::SpeakerSKText() : ScreenSpeaker() {
+ _speakerName = "SKTEXT";
+ _textWidth = 240;
+ _textMode = ALIGN_CENTER;
+ _color1 = 9;
+ _hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerPText::SpeakerPText() {
+ _speakerName = "PTEXT";
+ _textWidth = 240;
+ _textMode = ALIGN_CENTER;
+ _color1 = 5;
+ _hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerCHFText::SpeakerCHFText() {
+ _speakerName = "CHFTEXT";
+ _textWidth = 240;
+ _textMode = ALIGN_CENTER;
+ _color1 = 56;
+ _hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerCDRText::SpeakerCDRText() {
+ _speakerName = "CDRTEXT";
+ _textWidth = 240;
+ _textMode = ALIGN_CENTER;
+ _color1 = 52;
+ _hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerFLText::SpeakerFLText() {
+ _speakerName = "FLTEXT";
+ _textPos = Common::Point(10, 40);
+ _color1 = 17;
+ _hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerBatText::SpeakerBatText() {
+ _speakerName = "BATTEXT";
+ _textWidth = 240;
+ _textMode = ALIGN_CENTER;
+ _color1 = 3;
+ _hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerSKL::SpeakerSKL() : AnimatedSpeaker() {
+ _speakerName = "SKL";
+ _newSceneNumber = 7011;
+ _textPos = Common::Point(10, 30);
+ _color1 = 9;
+}
+
+void SpeakerSKL::setText(const Common::String &msg) {
+ _object1.postInit(&_objectList);
+ _object1.setVisage(7013);
+ _object1.setStrip2(2);
+ _object1.fixPriority(255);
+ _object1.changeZoom(100);
+ _object1._frame = 1;
+ _object1.setPosition(Common::Point(203, 120));
+ _object1.animate(ANIM_MODE_7, 0, NULL);
+
+ _object2.postInit(&_objectList);
+ _object2.setVisage(7013);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.changeZoom(100);
+ _object2._frame = 1;
+ _object2.setPosition(Common::Point(197, 80));
+ _object2.setAction(&_speakerAction, NULL);
+
+ Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerQL::SpeakerQL() : AnimatedSpeaker() {
+ _speakerName = "QL";
+ _newSceneNumber = 2610;
+ _textPos = Common::Point(160, 30);
+ _color1 = 35;
+ _textMode = ALIGN_CENTER;
+}
+
+void SpeakerQL::setText(const Common::String &msg) {
+ _object1.postInit(&_objectList);
+ _object1.setVisage(2612);
+ _object1.setStrip2(2);
+ _object1.fixPriority(255);
+ _object1.changeZoom(100);
+ _object1._frame = 1;
+ _object1.setPosition(Common::Point(128, 146));
+ _object1.animate(ANIM_MODE_7, 0, NULL);
+
+ _object2.postInit(&_objectList);
+ _object2.setVisage(2612);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.changeZoom(100);
+ _object2._frame = 1;
+ _object2.setPosition(Common::Point(122, 84));
+ _object2.setAction(&_speakerAction, NULL);
+
+ Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerSR::SpeakerSR() {
+ _speakerName = "SR";
+ _newSceneNumber = 2811;
+ _textPos = Common::Point(10, 30);
+ _color1 = 13;
+ _textMode = ALIGN_CENTER;
+}
+
+void SpeakerSR::setText(const Common::String &msg) {
+ _object1.postInit(&_objectList);
+ _object1.setVisage(2813);
+ _object1.setStrip2(2);
+ _object1.fixPriority(255);
+ _object1.changeZoom(100);
+ _object1._frame = 1;
+ _object1.setPosition(Common::Point(224, 198));
+ _object1.animate(ANIM_MODE_7, 0, NULL);
+
+ _object2.postInit(&_objectList);
+ _object2.setVisage(2813);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.changeZoom(100);
+ _object2._frame = 1;
+ _object2.setPosition(Common::Point(203, 96));
+ _object2.setAction(&_speakerAction, NULL);
+
+ _object3.postInit(&_objectList);
+ _object3.setVisage(2813);
+ _object3.setStrip(3);
+ _object3.setPosition(Common::Point(204, 91));
+ _object3.fixPriority(199);
+ _object3._numFrames = 3;
+ _object3.animate(ANIM_MODE_7, 0, NULL);
+
+ Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerSL::SpeakerSL() {
+ _speakerName = "SL";
+ _newSceneNumber = 2810;
+ _textPos = Common::Point(140, 30);
+ _textWidth = 160;
+ _color1 = 13;
+ _textMode = ALIGN_CENTER;
+}
+
+void SpeakerSL::setText(const Common::String &msg) {
+ _object1.postInit(&_objectList);
+ _object1.setVisage(2812);
+ _object1.setStrip2(2);
+ _object1.fixPriority(255);
+ _object1.changeZoom(100);
+ _object1._frame = 1;
+ _object1.setPosition(Common::Point(95, 198));
+ _object1.animate(ANIM_MODE_7, 0, NULL);
+
+ _object2.postInit(&_objectList);
+ _object2.setVisage(2812);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.changeZoom(100);
+ _object2._frame = 1;
+ _object2.setPosition(Common::Point(116, 96));
+ _object2.setAction(&_speakerAction, NULL);
+
+ Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerQR::SpeakerQR() {
+ _speakerName = "QR";
+ _newSceneNumber = 2611;
+ _textPos = Common::Point(10, 30);
+ _color1 = 35;
+ _textMode = ALIGN_CENTER;
+}
+
+void SpeakerQR::setText(const Common::String &msg) {
+ _object1.postInit(&_objectList);
+ _object1.setVisage(2613);
+ _object1.setStrip2(2);
+ _object1.fixPriority(255);
+ _object1.changeZoom(100);
+ _object1._frame = 1;
+ _object1.setPosition(Common::Point(191, 146));
+ _object1.animate(ANIM_MODE_7, 0, NULL);
+
+ _object2.postInit(&_objectList);
+ _object2.setVisage(2613);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.changeZoom(100);
+ _object2._frame = 1;
+ _object2.setPosition(Common::Point(197, 84));
+ _object2.setAction(&_speakerAction, NULL);
+
+ Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerQU::SpeakerQU() {
+ _speakerName = "QU";
+ _newSceneNumber = 7020;
+ _textPos = Common::Point(160, 30);
+ _color1 = 35;
+ _textMode = ALIGN_CENTER;
+}
+
+void SpeakerQU::setText(const Common::String &msg) {
+ _object1.postInit(&_objectList);
+ _object1.setVisage(7021);
+ _object1.setStrip2(2);
+ _object1.fixPriority(255);
+ _object1.changeZoom(100);
+ _object1._frame = 1;
+ _object1.setPosition(Common::Point(116, 120));
+ _object1.animate(ANIM_MODE_7, 0, NULL);
+
+ _object2.postInit(&_objectList);
+ _object2.setVisage(7021);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.changeZoom(100);
+ _object2._frame = 1;
+ _object2.setPosition(Common::Point(111, 84));
+ _object2.setAction(&_speakerAction, NULL);
+
+ Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerCR::SpeakerCR() {
+ _speakerName = "CR";
+ _newSceneNumber = 9010;
+ _textPos = Common::Point(20, 40);
+ _color1 = 4;
+}
+
+void SpeakerCR::setText(const Common::String &msg) {
+ _object1.postInit(&_objectList);
+ _object1.setVisage(9011);
+ _object1.setStrip2(2);
+ _object1.fixPriority(255);
+ _object1.setPosition(Common::Point(219, 168));
+ _object1.animate(ANIM_MODE_7, 0, NULL);
+
+ _object2.postInit(&_objectList);
+ _object2.setVisage(9011);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.setPosition(Common::Point(232, 81));
+ _object2.setAction(&_speakerAction, NULL);
+
+ Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerMR::SpeakerMR() {
+ _speakerName = "MR";
+ _newSceneNumber = 2711;
+ _textPos = Common::Point(10, 40);
+ _color1 = 22;
+}
+
+void SpeakerMR::setText(const Common::String &msg) {
+ _object1.postInit(&_objectList);
+ _object1.setVisage(2713);
+ _object1.setStrip2(2);
+ _object1.fixPriority(255);
+ _object1.changeZoom(100);
+ _object1._frame = 1;
+ _object1.setPosition(Common::Point(220, 143));
+ _object1.animate(ANIM_MODE_7, 0, NULL);
+
+ _object2.postInit(&_objectList);
+ _object2.setVisage(2713);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.changeZoom(100);
+ _object2._frame = 1;
+ _object2.setPosition(Common::Point(215, 99));
+ _object2.setAction(&_speakerAction, NULL);
+
+ Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerSAL::SpeakerSAL() {
+ _speakerName = "SAL";
+ _newSceneNumber = 2851;
+ _textPos = Common::Point(10, 30);
+ _color1 = 13;
+ _textMode = ALIGN_CENTER;
+}
+
+void SpeakerSAL::setText(const Common::String &msg) {
+ _object1.postInit(&_objectList);
+ _object1.setVisage(2853);
+ _object1.setStrip2(2);
+ _object1.fixPriority(255);
+ _object1.changeZoom(100);
+ _object1._frame = 1;
+ _object1.setPosition(Common::Point(185, 200));
+ _object1.animate(ANIM_MODE_7, 0, NULL);
+
+ _object2.postInit(&_objectList);
+ _object2.setVisage(2853);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.changeZoom(100);
+ _object2._frame = 1;
+ _object2.setPosition(Common::Point(170, 92));
+ _object2.setAction(&_speakerAction, NULL);
+
+ Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerML::SpeakerML() {
+ _speakerName = "ML";
+ _newSceneNumber = 2710;
+ _textPos = Common::Point(160, 40);
+ _color1 = 22;
+}
+
+void SpeakerML::setText(const Common::String &msg) {
+ _object1.postInit(&_objectList);
+ _object1.setVisage(2712);
+ _object1.setStrip2(2);
+ _object1.fixPriority(255);
+ _object1.changeZoom(100);
+ _object1._frame = 1;
+ _object1.setPosition(Common::Point(99, 143));
+ _object1.animate(ANIM_MODE_7, 0, NULL);
+
+ _object2.postInit(&_objectList);
+ _object2.setVisage(2712);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.changeZoom(100);
+ _object2._frame = 1;
+ _object2.setPosition(Common::Point(105, 99));
+ _object2.setAction(&_speakerAction, NULL);
+
+ Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerCHFL::SpeakerCHFL() {
+ _speakerName = "CHFL";
+ _newSceneNumber = 4111;
+ _textPos = Common::Point(10, 40);
+ _color1 = 56;
+}
+
+void SpeakerCHFL::setText(const Common::String &msg) {
+ _object1.postInit(&_objectList);
+ _object1.setVisage(4113);
+ _object1.setStrip2(2);
+ _object1.fixPriority(255);
+ _object1.changeZoom(100);
+ _object1._frame = 1;
+ _object1.setPosition(Common::Point(205, 116));
+ _object1.animate(ANIM_MODE_7, 0, NULL);
+
+ _object2.postInit(&_objectList);
+ _object2.setVisage(4113);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.changeZoom(100);
+ _object2._frame = 1;
+ _object2.setPosition(Common::Point(202, 71));
+ _object2.setAction(&_speakerAction, NULL);
+
+ Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerCHFR::SpeakerCHFR() {
+ _speakerName = "CHFR";
+ _newSceneNumber = 4110;
+ _textPos = Common::Point(160, 40);
+ _color1 = 56;
+}
+
+void SpeakerCHFR::setText(const Common::String &msg) {
+ _object1.postInit(&_objectList);
+ _object1.setVisage(4112);
+ _object1.setStrip2(2);
+ _object1.fixPriority(255);
+ _object1.changeZoom(100);
+ _object1._frame = 1;
+ _object1.setPosition(Common::Point(103, 116));
+ _object1.animate(ANIM_MODE_7, 0, NULL);
+
+ _object2.postInit(&_objectList);
+ _object2.setVisage(4112);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.changeZoom(100);
+ _object2._frame = 1;
+ _object2.setPosition(Common::Point(106, 71));
+ _object2.setAction(&_speakerAction, NULL);
+
+ Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerPL::SpeakerPL() {
+ _speakerName = "PL";
+ _newSceneNumber = 4060;
+ _textPos = Common::Point(160, 40);
+ _color1 = 5;
+}
+
+void SpeakerPL::setText(const Common::String &msg) {
+ _object1.postInit(&_objectList);
+ _object1.setVisage(4062);
+ _object1.setStrip2(2);
+ _object1.fixPriority(255);
+ _object1.changeZoom(100);
+ _object1._frame = 1;
+ _object1.setPosition(Common::Point(107, 117));
+ _object1.animate(ANIM_MODE_7, 0, NULL);
+
+ _object2.postInit(&_objectList);
+ _object2.setVisage(4062);
+ _object2.setStrip2(1);
+ _object2.fixPriority(200);
+ _object2.changeZoom(100);
+ _object2._frame = 1;
+ _object2.setPosition(Common::Point(105, 62));
+ _object2.setAction(&_speakerAction, NULL);
+
+ _object3.postInit(&_objectList);
+ _object3.setVisage(4062);
+ _object3.setStrip2(3);
+ _object3.fixPriority(255);
+ _object3.changeZoom(100);
+ _object3._frame = 1;
+ _object3.setPosition(Common::Point(105, 59));
+ _object3.setAction(&_speakerAction2, NULL);
+
+ Speaker::setText(msg);
+}
+
+void SpeakerPL::removeText() {
+ _object3.remove();
+ AnimatedSpeaker::removeText();
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerPR::SpeakerPR() {
+ _speakerName = "PR";
+ _newSceneNumber = 4061;
+ _textPos = Common::Point(10, 40);
+ _color1 = 5;
+}
+
+void SpeakerPR::setText(const Common::String &msg) {
+ _object1.postInit(&_objectList);
+ _object1.setVisage(4063);
+ _object1.setStrip2(1);
+ _object1.fixPriority(255);
+ _object1.changeZoom(100);
+ _object1._frame = 1;
+ _object1.setPosition(Common::Point(212, 117));
+ _object1.animate(ANIM_MODE_7, 0, NULL);
+
+ _object2.postInit(&_objectList);
+ _object2.setVisage(4063);
+ _object2.setStrip2(2);
+ _object2.fixPriority(200);
+ _object2.changeZoom(100);
+ _object2._frame = 1;
+ _object2.setPosition(Common::Point(214, 62));
+ _object2.setAction(&_speakerAction, NULL);
+
+ _object3.postInit(&_objectList);
+ _object3.setVisage(4063);
+ _object3.setStrip2(3);
+ _object3.fixPriority(255);
+ _object3.changeZoom(100);
+ _object3._frame = 1;
+ _object3.setPosition(Common::Point(214, 59));
+ _object3.setAction(&_speakerAction2, NULL);
+
+ Speaker::setText(msg);
+}
+
+void SpeakerPR::removeText() {
+ _object3.remove();
+ AnimatedSpeaker::removeText();
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerCDR::SpeakerCDR() {
+ _speakerName = "CDR";
+ _newSceneNumber = 4161;
+ _textPos = Common::Point(10, 40);
+ _color1 = 52;
+}
+
+void SpeakerCDR::setText(const Common::String &msg) {
+ _object1.postInit(&_objectList);
+ _object1.setVisage(4163);
+ _object1.setStrip2(1);
+ _object1.fixPriority(255);
+ _object1.changeZoom(100);
+ _object1._frame = 1;
+ _object1.setPosition(Common::Point(208, 97));
+ _object1.animate(ANIM_MODE_7, 0, NULL);
+
+ _object2.postInit(&_objectList);
+ _object2.setVisage(4163);
+ _object2.setStrip2(2);
+ _object2.fixPriority(255);
+ _object2.changeZoom(100);
+ _object2._frame = 1;
+ _object2.setPosition(Common::Point(200, 57));
+ _object2.setAction(&_speakerAction, NULL);
+
+ Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerCDL::SpeakerCDL() {
+ _speakerName = "CDL";
+ _newSceneNumber = 4160;
+ _textPos = Common::Point(160, 40);
+ _color1 = 52;
+}
+
+void SpeakerCDL::setText(const Common::String &msg) {
+ _object1.postInit(&_objectList);
+ _object1.setVisage(4162);
+ _object1.setStrip2(1);
+ _object1.fixPriority(255);
+ _object1.changeZoom(100);
+ _object1._frame = 1;
+ _object1.setPosition(Common::Point(112, 97));
+ _object1.animate(ANIM_MODE_7, 0, NULL);
+
+ _object2.postInit(&_objectList);
+ _object2.setVisage(4162);
+ _object2.setStrip2(2);
+ _object2.fixPriority(255);
+ _object2.changeZoom(100);
+ _object2._frame = 1;
+ _object2.setPosition(Common::Point(115, 57));
+ _object2.setAction(&_speakerAction, NULL);
+
+ Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerFLL::SpeakerFLL() {
+ _speakerName = "FLL";
+ _newSceneNumber = 5221;
+ _textPos = Common::Point(10, 40);
+ _color1 = 17;
+}
+
+void SpeakerFLL::setText(const Common::String &msg) {
+ _object1.postInit(&_objectList);
+ _object1.setVisage(5223);
+ _object1.setStrip2(2);
+ _object1.fixPriority(255);
+ _object1.changeZoom(100);
+ _object1._frame = 1;
+ _object1.setPosition(Common::Point(216, 129));
+ _object1.animate(ANIM_MODE_7, 0, NULL);
+
+ _object2.postInit(&_objectList);
+ _object2.setVisage(5223);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.changeZoom(100);
+ _object2._frame = 1;
+ _object2.setPosition(Common::Point(210, 67));
+ _object2.setAction(&_speakerAction, NULL);
+
+ Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerBatR::SpeakerBatR() {
+ _speakerName = "BATR";
+ _newSceneNumber = 5360;
+ _textPos = Common::Point(140, 40);
+ _color1 = 3;
+}
+
+void SpeakerBatR::setText(const Common::String &msg) {
+ _object1.postInit(&_objectList);
+ _object1.setVisage(5361);
+ _object1.setStrip2(2);
+ _object1.fixPriority(255);
+ _object1.changeZoom(100);
+ _object1._frame = 1;
+ _object1.setPosition(Common::Point(137, 122));
+ _object1.animate(ANIM_MODE_7, 0, NULL);
+
+ _object2.postInit(&_objectList);
+ _object2.setVisage(5361);
+ _object2.setStrip2(1);
+ _object2.fixPriority(255);
+ _object2.changeZoom(100);
+ _object2._frame = 1;
+ _object2.setPosition(Common::Point(137, 104));
+ _object2.setAction(&_speakerAction, NULL);
+
+ Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+RingworldInvObjectList::RingworldInvObjectList() :
+ _stunner(2280, 1, 2, OBJECT_STUNNER, "This is your stunner."),
+ _scanner(1, 1, 3, OBJECT_SCANNER, "A combination scanner comm unit."),
+ _stasisBox(5200, 1, 4, OBJECT_STASIS_BOX, "A stasis box."),
+ _infoDisk(40, 1, 1, OBJECT_INFODISK, "The infodisk you took from the assassin."),
+ _stasisNegator(0, 2, 2, OBJECT_STASIS_NEGATOR, "The stasis field negator."),
+ _keyDevice(4250, 1, 6, OBJECT_KEY_DEVICE, "A magnetic key device."),
+ _medkit(2280, 1, 7, OBJECT_MEDKIT, "Your medkit."),
+ _ladder(4100, 1, 8, OBJECT_LADDER, "The chief's ladder."),
+ _rope(4150, 1, 9, OBJECT_ROPE, "The chief's rope."),
+ _key(7700, 1, 11, OBJECT_KEY, "A key."),
+ _translator(7700, 1, 13, OBJECT_TRANSLATOR, "The dolphin translator box."),
+ _ale(2150, 1, 10, OBJECT_ALE, "A bottle of ale."),
+ _paper(7700, 1, 12, OBJECT_PAPER, "A slip of paper with the numbers 2,4, and 3 written on it."),
+ _waldos(0, 1, 14, OBJECT_WALDOS, "A pair of waldos from the ruined probe."),
+ _stasisBox2(8100, 1, 4, OBJECT_STASIS_BOX2, "A stasis box."),
+ _ring(8100, 2, 5, OBJECT_RING, "This is a signet ring sent to you by Louis Wu."),
+ _cloak(9850, 2, 6, OBJECT_CLOAK, "A fine silk cloak."),
+ _tunic(9450, 2, 7, OBJECT_TUNIC, "The patriarch's soiled tunic."),
+ _candle(9500, 2, 8, OBJECT_CANDLE, "A tallow candle."),
+ _straw(9400, 2, 9, OBJECT_STRAW, "Clean, dry straw."),
+ _scimitar(9850, 1, 18, OBJECT_SCIMITAR, "A scimitar from the Patriarch's closet."),
+ _sword(9850, 1, 17, OBJECT_SWORD, "A short sword from the Patriarch's closet."),
+ _helmet(9500, 2, 4, OBJECT_HELMET, "Some type of helmet."),
+ _items(4300, 2, 10, OBJECT_ITEMS, "Two interesting items from the Tnuctipun vessel."),
+ _concentrator(4300, 2, 11, OBJECT_CONCENTRATOR, "The Tnuctipun anti-matter concentrator contained in a stasis field."),
+ _nullifier(5200, 2, 12, OBJECT_NULLIFIER, "A purported neural wave nullifier."),
+ _peg(4045, 2, 16, OBJECT_PEG, "A peg with a symbol."),
+ _vial(5100, 2, 17, OBJECT_VIAL, "A vial of the bat creatures anti-pheromone drug."),
+ _jacket(9850, 3, 1, OBJECT_JACKET, "A natty padded jacket."),
+ _tunic2(9850, 3, 2, OBJECT_TUNIC2, "A very hairy tunic."),
+ _bone(5300, 3, 5, OBJECT_BONE, "A very sharp bone."),
+ _jar(7700, 3, 4, OBJECT_JAR, "An jar filled with a green substance."),
+ _emptyJar(7700, 3, 3, OBJECT_EMPTY_JAR, "An empty jar.") {
+
+ // Add the items to the list
+ _itemList.push_back(&_stunner);
+ _itemList.push_back(&_scanner);
+ _itemList.push_back(&_stasisBox);
+ _itemList.push_back(&_infoDisk);
+ _itemList.push_back(&_stasisNegator);
+ _itemList.push_back(&_keyDevice);
+ _itemList.push_back(&_medkit);
+ _itemList.push_back(&_ladder);
+ _itemList.push_back(&_rope);
+ _itemList.push_back(&_key);
+ _itemList.push_back(&_translator);
+ _itemList.push_back(&_ale);
+ _itemList.push_back(&_paper);
+ _itemList.push_back(&_waldos);
+ _itemList.push_back(&_stasisBox2);
+ _itemList.push_back(&_ring);
+ _itemList.push_back(&_cloak);
+ _itemList.push_back(&_tunic);
+ _itemList.push_back(&_candle);
+ _itemList.push_back(&_straw);
+ _itemList.push_back(&_scimitar);
+ _itemList.push_back(&_sword);
+ _itemList.push_back(&_helmet);
+ _itemList.push_back(&_items);
+ _itemList.push_back(&_concentrator);
+ _itemList.push_back(&_nullifier);
+ _itemList.push_back(&_peg);
+ _itemList.push_back(&_vial);
+ _itemList.push_back(&_jacket);
+ _itemList.push_back(&_tunic2);
+ _itemList.push_back(&_bone);
+ _itemList.push_back(&_jar);
+ _itemList.push_back(&_emptyJar);
+
+ _selectedItem = NULL;
+}
+
+/*--------------------------------------------------------------------------*/
+
+void RingworldGame::restartGame() {
+ if (MessageDialog::show(RESTART_MSG, CANCEL_BTN_STRING, RESTART_BTN_STRING) == 1)
+ _globals->_game->restart();
+}
+
+void RingworldGame::saveGame() {
+ if (!_vm->canSaveGameStateCurrently())
+ MessageDialog::show(SAVING_NOT_ALLOWED_MSG, OK_BTN_STRING);
+ else {
+ // Show the save dialog
+ handleSaveLoad(true, _globals->_sceneHandler._saveGameSlot, _globals->_sceneHandler._saveName);
+ }
+}
+
+void RingworldGame::restoreGame() {
+ if (!_vm->canLoadGameStateCurrently())
+ MessageDialog::show(RESTORING_NOT_ALLOWED_MSG, OK_BTN_STRING);
+ else {
+ // Show the load dialog
+ handleSaveLoad(false, _globals->_sceneHandler._loadGameSlot, _globals->_sceneHandler._saveName);
+ }
+}
+
+void RingworldGame::quitGame() {
+ if (MessageDialog::show(QUIT_CONFIRM_MSG, CANCEL_BTN_STRING, QUIT_BTN_STRING) == 1)
+ _vm->quitGame();
+}
+
+void RingworldGame::handleSaveLoad(bool saveFlag, int &saveSlot, Common::String &saveName) {
+ const EnginePlugin *plugin = 0;
+ EngineMan.findGame(_vm->getGameId(), &plugin);
+ GUI::SaveLoadChooser *dialog;
+ if (saveFlag)
+ dialog = new GUI::SaveLoadChooser(_("Save game:"), _("Save"));
+ else
+ dialog = new GUI::SaveLoadChooser(_("Load game:"), _("Load"));
+
+ dialog->setSaveMode(saveFlag);
+
+ saveSlot = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName());
+ saveName = dialog->getResultString();
+
+ delete dialog;
+}
+
+void RingworldGame::start() {
+ // Set some default flags
+ _globals->setFlag(12);
+ _globals->setFlag(34);
+
+ // Set the screen to scroll in response to the player moving off-screen
+ _globals->_scrollFollower = &_globals->_player;
+
+ // Set the object's that will be in the player's inventory by default
+ RING_INVENTORY._stunner._sceneNumber = 1;
+ RING_INVENTORY._scanner._sceneNumber = 1;
+ RING_INVENTORY._ring._sceneNumber = 1;
+
+ int slot = -1;
+
+ if (ConfMan.hasKey("save_slot")) {
+ slot = ConfMan.getInt("save_slot");
+ Common::String file = _vm->generateSaveName(slot);
+ Common::InSaveFile *in = _vm->_system->getSavefileManager()->openForLoading(file);
+ if (in)
+ delete in;
+ else
+ slot = -1;
+ }
+
+ if (slot >= 0)
+ _globals->_sceneHandler._loadGameSlot = slot;
+ else
+ // Switch to the title screen
+ _globals->_sceneManager.setNewScene(1000);
+
+ _globals->_events.showCursor();
+}
+
+void RingworldGame::restart() {
+ _globals->_scenePalette.clearListeners();
+ _globals->_soundHandler.stop();
+
+ // Reset the flags
+ _globals->reset();
+ _globals->setFlag(34);
+
+ // Clear save/load slots
+ _globals->_sceneHandler._saveGameSlot = -1;
+ _globals->_sceneHandler._loadGameSlot = -1;
+
+ _globals->_stripNum = 0;
+ _globals->_events.setCursor(CURSOR_WALK);
+
+ // Reset item properties
+ RING_INVENTORY._stunner._sceneNumber = 1;
+ RING_INVENTORY._scanner._sceneNumber = 1;
+ RING_INVENTORY._stasisBox._sceneNumber = 5200;
+ RING_INVENTORY._infoDisk._sceneNumber = 40;
+ RING_INVENTORY._stasisNegator._sceneNumber = 0;
+ RING_INVENTORY._keyDevice._sceneNumber = 0;
+ RING_INVENTORY._medkit._sceneNumber = 2280;
+ RING_INVENTORY._ladder._sceneNumber = 4100;
+ RING_INVENTORY._rope._sceneNumber = 4150;
+ RING_INVENTORY._key._sceneNumber = 7700;
+ RING_INVENTORY._translator._sceneNumber = 2150;
+ RING_INVENTORY._paper._sceneNumber = 7700;
+ RING_INVENTORY._waldos._sceneNumber = 0;
+ RING_INVENTORY._ring._sceneNumber = 1;
+ RING_INVENTORY._stasisBox2._sceneNumber = 8100;
+ RING_INVENTORY._cloak._sceneNumber = 9850;
+ RING_INVENTORY._tunic._sceneNumber = 9450;
+ RING_INVENTORY._candle._sceneNumber = 9500;
+ RING_INVENTORY._straw._sceneNumber = 9400;
+ RING_INVENTORY._scimitar._sceneNumber = 9850;
+ RING_INVENTORY._sword._sceneNumber = 9850;
+ RING_INVENTORY._helmet._sceneNumber = 9500;
+ RING_INVENTORY._items._sceneNumber = 4300;
+ RING_INVENTORY._concentrator._sceneNumber = 4300;
+ RING_INVENTORY._nullifier._sceneNumber = 4300;
+ RING_INVENTORY._peg._sceneNumber = 4045;
+ RING_INVENTORY._vial._sceneNumber = 5100;
+ RING_INVENTORY._jacket._sceneNumber = 9850;
+ RING_INVENTORY._tunic2._sceneNumber = 9850;
+ RING_INVENTORY._bone._sceneNumber = 5300;
+ RING_INVENTORY._jar._sceneNumber = 7700;
+ RING_INVENTORY._emptyJar._sceneNumber = 7700;
+ RING_INVENTORY._selectedItem = NULL;
+
+ // Change to the first game scene
+ _globals->_sceneManager.changeScene(30);
+}
+
+void RingworldGame::endGame(int resNum, int lineNum) {
+ _globals->_events.setCursor(CURSOR_WALK);
+ Common::String msg = _resourceManager->getMessage(resNum, lineNum);
+ bool savesExist = _saver->savegamesExist();
+
+ if (!savesExist) {
+ // No savegames exist, so prompt the user to restart or quit
+ if (MessageDialog::show(msg, QUIT_BTN_STRING, RESTART_BTN_STRING) == 0)
+ _vm->quitGame();
+ else
+ restart();
+ } else {
+ // Savegames exist, so prompt for Restore/Restart
+ bool breakFlag;
+ do {
+ if (_vm->shouldQuit()) {
+ breakFlag = true;
+ } else if (MessageDialog::show(msg, RESTART_BTN_STRING, RESTORE_BTN_STRING) == 0) {
+ restart();
+ breakFlag = true;
+ } else {
+ handleSaveLoad(false, _globals->_sceneHandler._loadGameSlot, _globals->_sceneHandler._saveName);
+ breakFlag = _globals->_sceneHandler._loadGameSlot >= 0;
+ }
+ } while (!breakFlag);
+ }
+
+ _globals->_events.setCursorFromFlag();
+}
+
+void RingworldGame::processEvent(Event &event) {
+ if (event.eventType == EVENT_KEYPRESS) {
+ switch (event.kbd.keycode) {
+ case Common::KEYCODE_F1:
+ // F1 - Help
+ MessageDialog::show(HELP_MSG, OK_BTN_STRING);
+ break;
+
+ case Common::KEYCODE_F2: {
+ // F2 - Sound Options
+ ConfigDialog *dlg = new ConfigDialog();
+ dlg->runModal();
+ delete dlg;
+ _globals->_soundManager.syncSounds();
+ _globals->_events.setCursorFromFlag();
+ break;
+ }
+
+ case Common::KEYCODE_F3:
+ // F3 - Quit
+ quitGame();
+ event.handled = false;
+ break;
+
+ case Common::KEYCODE_F4:
+ // F4 - Restart
+ restartGame();
+ _globals->_events.setCursorFromFlag();
+ break;
+
+ case Common::KEYCODE_F7:
+ // F7 - Restore
+ restoreGame();
+ _globals->_events.setCursorFromFlag();
+ break;
+
+ case Common::KEYCODE_F10:
+ // F10 - Pause
+ GfxDialog::setPalette();
+ MessageDialog::show(GAME_PAUSED_MSG, OK_BTN_STRING);
+ _globals->_events.setCursorFromFlag();
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+} // End of namespace tSage
diff --git a/engines/tsage/ringworld/ringworld_logic.h b/engines/tsage/ringworld/ringworld_logic.h
new file mode 100644
index 0000000000..19b0f10b42
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_logic.h
@@ -0,0 +1,461 @@
+/* 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_RINGWORLD_LOGIC_H
+#define TSAGE_RINGWORLD_LOGIC_H
+
+#include "common/scummsys.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+
+namespace tSage {
+
+#define ADD_PLAYER_MOVER(X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \
+ _globals->_player.addMover(mover, &pt, this); }
+#define ADD_PLAYER_MOVER_NULL(OBJ, X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \
+ OBJ.addMover(mover, &pt, NULL); }
+#define ADD_PLAYER_MOVER_THIS(OBJ, X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \
+ OBJ.addMover(mover, &pt, this); }
+
+#define ADD_MOVER(OBJ, X, Y) { Common::Point pt(X, Y); NpcMover *mover = new NpcMover(); \
+ OBJ.addMover(mover, &pt, this); }
+#define ADD_MOVER_NULL(OBJ, X, Y) { Common::Point pt(X, Y); NpcMover *mover = new NpcMover(); \
+ OBJ.addMover(mover, &pt, NULL); }
+
+
+class SceneFactory {
+public:
+ static Scene *createScene(int sceneNumber);
+};
+
+class DisplayHotspot : public SceneObject {
+private:
+ Common::Array<int> _actions;
+ bool performAction(int action);
+public:
+ DisplayHotspot(int regionId, ...);
+
+ virtual void doAction(int action) {
+ if (!performAction(action))
+ SceneHotspot::doAction(action);
+ }
+};
+
+class DisplayObject : public SceneObject {
+private:
+ Common::Array<int> _actions;
+ bool performAction(int action);
+public:
+ DisplayObject(int firstAction, ...);
+
+ virtual void doAction(int action) {
+ if (!performAction(action))
+ SceneHotspot::doAction(action);
+ }
+};
+
+class SceneArea : public SavedObject {
+public:
+ GfxSurface _surface;
+ GfxSurface *_savedArea;
+ Common::Point _pt;
+ int _resNum;
+ int _rlbNum;
+ int _subNum;
+ int _actionId;
+ Rect _bounds;
+public:
+ SceneArea();
+ ~SceneArea();
+
+ void setup(int resNum, int rlbNum, int subNum, int actionId);
+ void draw2();
+ void display();
+ void restore();
+
+ virtual void synchronize(Serializer &s);
+ virtual void draw(bool flag);
+ virtual void wait();
+};
+
+/*--------------------------------------------------------------------------*/
+// Ringworld specific game speakers
+
+class SpeakerGText : public Speaker {
+public:
+ SceneObject _sceneObject;
+public:
+ SpeakerGText();
+
+ virtual Common::String getClassName() { return "SpeakerGText"; }
+ virtual void setText(const Common::String &msg);
+ virtual void removeText();
+};
+
+class SpeakerPOR : public AnimatedSpeaker {
+ class SpeakerAction1 : public SpeakerAction {
+ public:
+ virtual void signal();
+ };
+
+public:
+ SceneObject _object3;
+ SpeakerAction1 _action2;
+public:
+ SpeakerPOR();
+ virtual Common::String getClassName() { return "SpeakerPOR"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerOR : public AnimatedSpeaker {
+public:
+ SpeakerOR();
+ virtual Common::String getClassName() { return "SpeakerOR"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerOText : public SpeakerGText {
+public:
+ SpeakerOText();
+
+ virtual Common::String getClassName() { return "SpeakerOText"; }
+};
+
+class SpeakerPOText : public ScreenSpeaker {
+public:
+ SpeakerPOText();
+
+ virtual Common::String getClassName() { return "SpeakerPOText"; }
+};
+
+class SpeakerSText : public ScreenSpeaker {
+public:
+ SpeakerSText();
+
+ virtual Common::String getClassName() { return "SpeakerSText"; }
+};
+
+class SpeakerQText : public ScreenSpeaker {
+public:
+ SpeakerQText();
+
+ virtual Common::String getClassName() { return "SpeakerQText"; }
+};
+
+class SpeakerMText : public ScreenSpeaker {
+public:
+ SpeakerMText();
+
+ virtual Common::String getClassName() { return "SpeakerMText"; }
+};
+
+class SpeakerCText : public ScreenSpeaker {
+public:
+ SpeakerCText();
+
+ virtual Common::String getClassName() { return "SpeakerCText"; }
+};
+
+class SpeakerEText : public ScreenSpeaker {
+public:
+ SpeakerEText();
+
+ virtual Common::String getClassName() { return "SpeakerEText"; }
+};
+
+class SpeakerGR : public AnimatedSpeaker {
+public:
+ SpeakerGR();
+
+ virtual Common::String getClassName() { return "SpeakerGR"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerHText : public ScreenSpeaker {
+public:
+ SpeakerHText();
+
+ virtual Common::String getClassName() { return "SpeakerHText"; }
+};
+
+class SpeakerPText : public ScreenSpeaker {
+public:
+ SpeakerPText();
+
+ virtual Common::String getClassName() { return "SpeakerPText"; }
+};
+
+class SpeakerCHFText : public ScreenSpeaker {
+public:
+ SpeakerCHFText();
+
+ virtual Common::String getClassName() { return "SpeakerCHFText"; }
+};
+
+class SpeakerSKText : public ScreenSpeaker {
+public:
+ SpeakerSKText();
+
+ virtual Common::String getClassName() { return "SpeakerSKText"; }
+};
+
+class SpeakerCDRText : public ScreenSpeaker {
+public:
+ SpeakerCDRText();
+
+ virtual Common::String getClassName() { return "SpeakerCDRText"; }
+};
+
+class SpeakerFLText : public ScreenSpeaker {
+public:
+ SpeakerFLText();
+
+ virtual Common::String getClassName() { return "SpeakerFLText"; }
+};
+
+class SpeakerBatText : public ScreenSpeaker {
+public:
+ SpeakerBatText();
+
+ virtual Common::String getClassName() { return "SpeakerFLText"; }
+};
+
+class SpeakerQR : public AnimatedSpeaker {
+public:
+ SpeakerQR();
+
+ virtual Common::String getClassName() { return "SpeakerQR"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerQU : public AnimatedSpeaker {
+public:
+ SpeakerQU();
+
+ virtual Common::String getClassName() { return "SpeakerQU"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerSKL : public AnimatedSpeaker {
+public:
+ SpeakerSKL();
+
+ virtual Common::String getClassName() { return "SpeakerQL"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerQL : public AnimatedSpeaker {
+public:
+ SpeakerQL();
+
+ virtual Common::String getClassName() { return "SpeakerQL"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerSR : public AnimatedSpeaker {
+public:
+ SceneObject _object3;
+public:
+ SpeakerSR();
+
+ virtual Common::String getClassName() { return "SpeakerSR"; }
+ void setText(const Common::String &msg);
+};
+
+class SpeakerSL : public AnimatedSpeaker {
+public:
+ SpeakerSL();
+
+ virtual Common::String getClassName() { return "SpeakerSL"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerCR : public AnimatedSpeaker {
+public:
+ SpeakerCR();
+
+ virtual Common::String getClassName() { return "SpeakerCR"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerMR : public AnimatedSpeaker {
+public:
+ SpeakerMR();
+
+ virtual Common::String getClassName() { return "SpeakerMR"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerSAL : public AnimatedSpeaker {
+public:
+ SpeakerSAL();
+
+ virtual Common::String getClassName() { return "SpeakerSAL"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerML : public AnimatedSpeaker {
+public:
+ SpeakerML();
+
+ virtual Common::String getClassName() { return "SpeakerML"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerCHFL : public AnimatedSpeaker {
+public:
+ SpeakerCHFL();
+
+ virtual Common::String getClassName() { return "SpeakerCHFL"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerCHFR : public AnimatedSpeaker {
+public:
+ SpeakerCHFR();
+
+ virtual Common::String getClassName() { return "SpeakerCHFR"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerPL : public AnimatedSpeaker {
+public:
+ SceneObject _object3;
+ SpeakerAction _speakerAction2;
+
+ SpeakerPL();
+
+ virtual Common::String getClassName() { return "SpeakerPL"; }
+ virtual void setText(const Common::String &msg);
+ virtual void removeText();
+};
+
+class SpeakerPR : public AnimatedSpeaker {
+public:
+ SceneObject _object3;
+ SpeakerAction _speakerAction2;
+
+ SpeakerPR();
+
+ virtual Common::String getClassName() { return "SpeakerPR"; }
+ virtual void setText(const Common::String &msg);
+ virtual void removeText();
+};
+
+class SpeakerCDR : public AnimatedSpeaker {
+public:
+ SpeakerCDR();
+
+ virtual Common::String getClassName() { return "SpeakerCDR"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerCDL : public AnimatedSpeaker {
+public:
+ SpeakerCDL();
+
+ virtual Common::String getClassName() { return "SpeakerCDL"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerFLL : public AnimatedSpeaker {
+public:
+ SpeakerFLL();
+
+ virtual Common::String getClassName() { return "SpeakerFLL"; }
+ virtual void setText(const Common::String &msg);
+};
+
+class SpeakerBatR : public AnimatedSpeaker {
+public:
+ SpeakerBatR();
+
+ virtual Common::String getClassName() { return "SpeakerBatR"; }
+ virtual void setText(const Common::String &msg);
+};
+
+/*--------------------------------------------------------------------------*/
+
+class RingworldInvObjectList : public InvObjectList {
+public:
+ InvObject _stunner;
+ InvObject _scanner;
+ InvObject _stasisBox;
+ InvObject _infoDisk;
+ InvObject _stasisNegator;
+ InvObject _keyDevice;
+ InvObject _medkit;
+ InvObject _ladder;
+ InvObject _rope;
+ InvObject _key;
+ InvObject _translator;
+ InvObject _ale;
+ InvObject _paper;
+ InvObject _waldos;
+ InvObject _stasisBox2;
+ InvObject _ring;
+ InvObject _cloak;
+ InvObject _tunic;
+ InvObject _candle;
+ InvObject _straw;
+ InvObject _scimitar;
+ InvObject _sword;
+ InvObject _helmet;
+ InvObject _items;
+ InvObject _concentrator;
+ InvObject _nullifier;
+ InvObject _peg;
+ InvObject _vial;
+ InvObject _jacket;
+ InvObject _tunic2;
+ InvObject _bone;
+ InvObject _jar;
+ InvObject _emptyJar;
+public:
+ RingworldInvObjectList();
+
+ virtual Common::String getClassName() { return "RingworldInvObjectList"; }
+};
+
+#define RING_INVENTORY (*((RingworldInvObjectList *)_globals->_inventory))
+
+class RingworldGame: public Game {
+protected:
+ virtual void handleSaveLoad(bool saveFlag, int &saveSlot, Common::String &saveName);
+public:
+ virtual void start();
+ virtual void restart();
+ virtual void restartGame();
+ virtual void saveGame();
+ virtual void restoreGame();
+ virtual void quitGame();
+ virtual void endGame(int resNum, int lineNum);
+
+ virtual Scene *createScene(int sceneNumber);
+ virtual void processEvent(Event &event);
+};
+
+} // End of namespace tSage
+
+#endif
diff --git a/engines/tsage/ringworld/ringworld_scenes1.cpp b/engines/tsage/ringworld/ringworld_scenes1.cpp
new file mode 100644
index 0000000000..880fa51e6e
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_scenes1.cpp
@@ -0,0 +1,3345 @@
+/* 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/ringworld/ringworld_scenes1.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+
+namespace tSage {
+
+/*--------------------------------------------------------------------------
+ * Scene 10 - Kziniti Palace (Introduction)
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene10::Action1::signal() {
+ Scene10 *scene = (Scene10 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(6);
+ break;
+ case 1:
+ _globals->_scenePalette.addRotation(240, 254, -1);
+ scene->_stripManager.start(10, this);
+ break;
+ case 2:
+ scene->_speakerSText.setTextPos(Common::Point(20, 20));
+ scene->_speakerSText._color1 = 10;
+ scene->_speakerSText._textWidth = 160;
+ scene->_stripManager.start(11, this, scene);
+ break;
+ case 3:
+ scene->_object2.hide();
+ scene->_object3.hide();
+ scene->_object3.setAction(NULL);
+ scene->_object4.animate(ANIM_MODE_5, this);
+ break;
+ case 4:
+ case 9:
+ scene->_object1.animate(ANIM_MODE_5, this);
+ break;
+ case 5:
+ scene->_object2.setStrip(3);
+ scene->_object2.setFrame(1);
+ scene->_object2.setPosition(Common::Point(240, 51));
+ scene->_object2.show();
+
+ scene->_object3.setStrip(6);
+ scene->_object3.setFrame(1);
+ scene->_object3.setPosition(Common::Point(200, 76));
+ scene->_object3._numFrames = 20;
+ scene->_object3.show();
+
+ scene->_stripManager.start(12, this, scene);
+ break;
+ case 6:
+ scene->_object2.hide();
+ scene->_object3.hide();
+ scene->_object1.animate(ANIM_MODE_6, this);
+ break;
+ case 7:
+ scene->_object3.show();
+ scene->_object3.setStrip2(5);
+ scene->_object3._numFrames = 10;
+ scene->_object3.setPosition(Common::Point(180, 87));
+ scene->_object3.setAction(&scene->_action2);
+
+ scene->_object2.setStrip(4);
+ scene->_object2.setFrame(1);
+ scene->_object2.setPosition(Common::Point(204, 59));
+ scene->_object2.show();
+
+ scene->_stripManager.start(13, this, scene);
+ break;
+ case 8:
+ scene->_object2.hide();
+ scene->_object3.hide();
+ scene->_object4.animate(ANIM_MODE_6, this);
+ break;
+ case 10:
+ _globals->_soundHandler.fadeOut(this);
+ break;
+ case 11:
+ _globals->_scenePalette.clearListeners();
+ _globals->_sceneManager.changeScene(15);
+ break;
+ }
+}
+
+void Scene10::Action2::signal() {
+ Scene10 *scene = (Scene10 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(_globals->_randomSource.getRandomNumber(179));
+ break;
+ case 1:
+ scene->_object3.setFrame(1);
+ scene->_object3.animate(ANIM_MODE_5, this);
+ _actionIndex = 0;
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene10::postInit(SceneObjectList *OwnerList) {
+ loadScene(10);
+ setZoomPercents(0, 100, 200, 100);
+
+ _stripManager.addSpeaker(&_speakerSText);
+ _stripManager.addSpeaker(&_speakerQText);
+ _speakerSText._speakerName = "STEXT";
+ _speakerQText._speakerName = "QTEXT";
+ _speakerSText._hideObjects = false;
+ _speakerQText._hideObjects = false;
+ _speakerQText.setTextPos(Common::Point(140, 120));
+ _speakerQText._color1 = 4;
+ _speakerQText._textWidth = 160;
+ _speakerSText.setTextPos(Common::Point(20, 20));
+ _speakerSText._color1 = 7;
+ _speakerSText._textWidth = 320;
+
+ _stripManager.setCallback(this);
+
+ _object1.postInit();
+ _object1.setVisage(10);
+ _object1.setPosition(Common::Point(232, 90));
+ _object1.fixPriority(1);
+
+ _object2.postInit();
+ _object2.setVisage(10);
+ _object2.setStrip(4);
+ _object2.setFrame(1);
+ _object2.setPosition(Common::Point(204, 59));
+ _object2.fixPriority(198);
+
+ _object3.postInit();
+ _object3.setVisage(10);
+ _object3.setStrip2(5);
+ _object3.setPosition(Common::Point(180, 87));
+ _object3.fixPriority(196);
+ _object3.setAction(&_action2);
+
+ _object4.postInit();
+ _object4.setVisage(10);
+ _object4.setStrip(2);
+ _object4.setPosition(Common::Point(0, 209));
+ _object4.animate(ANIM_MODE_1, NULL);
+
+ _object5.postInit();
+ _object5.setVisage(11);
+ _object5.setPosition(Common::Point(107, 146));
+ _object5.animate(ANIM_MODE_2, NULL);
+ _object5._numFrames = 5;
+
+ _object6.postInit();
+ _object6.setVisage(11);
+ _object6.setStrip(2);
+ _object6.setPosition(Common::Point(287, 149));
+ _object6.animate(ANIM_MODE_2, NULL);
+ _object6._numFrames = 5;
+
+ _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
+ _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+
+ setAction(&_action1);
+ _globals->_soundHandler.play(5);
+}
+
+void Scene10::stripCallback(int v) {
+ switch (v) {
+ case 1:
+ _object2.animate(ANIM_MODE_7, -1, NULL);
+ break;
+ case 2:
+ _object2.animate(ANIM_MODE_NONE);
+ break;
+ case 3:
+ _object2.animate(ANIM_MODE_7, -1, NULL);
+ _object3.animate(ANIM_MODE_5, NULL);
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 15 - Outer Space (Introduction)
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene15::Action1::signal() {
+ Scene15 *scene = (Scene15 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(60);
+ break;
+ case 1:
+ SceneItem::display(15, 0, SET_Y, 20, SET_FONT, 2, SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 7,
+ SET_WIDTH, 320, SET_KEEP_ONSCREEN, 1, LIST_END);
+ setDelay(300);
+ break;
+ case 2: {
+ SceneItem::display(15, 1, SET_Y, 20, SET_FONT, 2, SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 7,
+ SET_WIDTH, 320, SET_KEEP_ONSCREEN, 1, LIST_END);
+ scene->_object1.postInit();
+ scene->_object1.setVisage(15);
+ scene->_object1.setPosition(Common::Point(160, -10));
+ scene->_object1.animate(ANIM_MODE_2, NULL);
+ Common::Point pt(160, 100);
+ NpcMover *mover = new NpcMover();
+ scene->_object1.addMover(mover, &pt, this);
+ scene->_soundHandler.play(7);
+ break;
+ }
+ case 3:
+ SceneItem::display(0, 0);
+ _globals->_sceneManager.changeScene(20);
+ break;
+ }
+}
+
+void Scene15::Action1::dispatch() {
+ Scene15 *scene = (Scene15 *)_globals->_sceneManager._scene;
+
+ if (scene->_object1._position.y < 100)
+ scene->_object1.changeZoom(100 - scene->_object1._position.y);
+ Action::dispatch();
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene15::postInit(SceneObjectList *OwnerList) {
+ loadScene(15);
+ Scene::postInit();
+ setZoomPercents(0, 100, 200, 100);
+ _globals->_soundHandler.play(6);
+ setAction(&_action1);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 20 - Cut-scenes where House Chmeee is in the distance
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene20::Action1::signal() {
+ Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(120);
+ break;
+ case 1:
+ scene->_stripManager.start(20, this);
+ break;
+ case 2:
+ _globals->_soundHandler.fadeOut(this);
+ break;
+ case 3:
+ _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
+ _globals->_sceneManager.changeScene(30); // First game scene
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene20::Action2::signal() {
+ Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene;
+ NpcMover *npcMover;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(10);
+ break;
+ case 1:
+ SceneItem::display(20, 1, SET_WIDTH, 200, SET_Y, 20, SET_X, 160, SET_KEEP_ONSCREEN, true,
+ SET_EXT_BGCOLOR, 4, LIST_END);
+ setDelay(120);
+ break;
+ case 2: {
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(455, 77);
+ _globals->_player.addMover(mover, &pt, this);
+ ObjectMover2 *mover2 = new ObjectMover2();
+ scene->_SceneObjectExt.addMover(mover2, 5, 10, &_globals->_player);
+ ObjectMover2 *mover3 = new ObjectMover2();
+ scene->_sceneObject3.addMover(mover3, 10, 15, &_globals->_player);
+ break;
+ }
+ case 3: {
+ npcMover = new NpcMover();
+ Common::Point pt(557, 100);
+ _globals->_player.addMover(npcMover, &pt, this);
+ break;
+ }
+ case 4: {
+ npcMover = new NpcMover();
+ Common::Point pt(602, 90);
+ _globals->_player.addMover(npcMover, &pt, this);
+ break;
+ }
+ case 5: {
+ npcMover = new NpcMover();
+ Common::Point pt(618, 90);
+ _globals->_player.addMover(npcMover, &pt, this);
+ break;
+ }
+ case 6: {
+ npcMover = new NpcMover();
+ Common::Point pt(615, 81);
+ _globals->_player.addMover(npcMover, &pt, this);
+ break;
+ }
+ case 7: {
+ npcMover = new NpcMover();
+ Common::Point pt(588, 79);
+ _globals->_player.addMover(npcMover, &pt, this);
+ break;
+ }
+ case 8:
+ scene->_sound.release();
+ _globals->_soundHandler.fadeOut(this);
+ break;
+ case 9:
+ SceneItem::display(0, 0, LIST_END);
+ _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
+ _globals->_sceneManager.changeScene(40);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene20::Action3::signal() {
+ Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene;
+ NpcMover *npcMover;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(120);
+ break;
+ case 1: {
+ npcMover = new NpcMover();
+ Common::Point pt(615, 81);
+ _globals->_player.addMover(npcMover, &pt, this);
+ ObjectMover2 *mover1 = new ObjectMover2();
+ scene->_SceneObjectExt.addMover(mover1, 5, 10, &_globals->_player);
+ ObjectMover2 *mover2 = new ObjectMover2();
+ scene->_sceneObject3.addMover(mover2, 20, 25, &_globals->_player);
+ break;
+ }
+ case 2: {
+ npcMover = new NpcMover();
+ Common::Point pt(618, 90);
+ _globals->_player.addMover(npcMover, &pt, this);
+ break;
+ }
+ case 3: {
+ _globals->_player._moveDiff = Common::Point(10, 10);
+ scene->_SceneObjectExt._moveDiff = Common::Point(10, 10);
+ scene->_sceneObject3._moveDiff = Common::Point(10, 10);
+ npcMover = new NpcMover();
+ Common::Point pt(445, 132);
+ _globals->_player.addMover(npcMover, &pt, this);
+ break;
+ }
+ case 4: {
+ npcMover = new NpcMover();
+ Common::Point pt(151, 137);
+ _globals->_player.addMover(npcMover, &pt, this);
+ break;
+ }
+ case 5: {
+ npcMover = new NpcMover();
+ Common::Point pt(-15, 137);
+ _globals->_player.addMover(npcMover, &pt, this);
+ break;
+ }
+ case 6:
+ scene->_sound.play(60, this, 127);
+ _globals->_soundHandler.release();
+ break;
+ case 7:
+ _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
+ _globals->_sceneManager.changeScene(90);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene20::Action4::signal() {
+ Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene;
+ NpcMover *npcMover;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(60);
+ break;
+ case 1: {
+ npcMover = new NpcMover();
+ Common::Point pt(486, 134);
+ _globals->_player.addMover(npcMover, &pt, this);
+ ObjectMover2 *mover1 = new ObjectMover2();
+ scene->_SceneObjectExt.addMover(mover1, 20, 35, &_globals->_player);
+ break;
+ }
+ case 2: {
+ _globals->_player._moveDiff = Common::Point(12, 12);
+ scene->_SceneObjectExt._moveDiff = Common::Point(12, 12);
+ NpcMover *mover1 = new NpcMover();
+ Common::Point pt(486, 134);
+ scene->_sceneObject3.addMover(mover1, &pt, this);
+ NpcMover *mover2 = new NpcMover();
+ pt = Common::Point(-15, 134);
+ _globals->_player.addMover(mover2, &pt, NULL);
+ NpcMover *mover3 = new NpcMover();
+ pt = Common::Point(-15, 134);
+ scene->_SceneObjectExt.addMover(mover3, &pt, NULL);
+ break;
+ }
+ case 3: {
+ scene->_sceneObject3._moveDiff = Common::Point(20, 20);
+ npcMover = new NpcMover();
+ Common::Point pt(320, 134);
+ scene->_sceneObject3.addMover(npcMover, &pt, this);
+ break;
+ }
+ case 4: {
+ scene->_sound.play(28);
+ scene->_sceneObject4.postInit();
+ scene->_sceneObject4.setVisage(21);
+ scene->_sceneObject4.setStrip(3);
+ scene->_sceneObject4.setPosition(Common::Point(scene->_sceneObject3._position.x - 36,
+ scene->_sceneObject3._position.y - 1));
+ scene->_sceneObject4._moveDiff.x = 48;
+
+ ObjectMover3 *mover = new ObjectMover3();
+ scene->_sceneObject4.addMover(mover, &scene->_SceneObjectExt, 4, this);
+ break;
+ }
+ case 5: {
+ scene->_sound.play(42);
+ scene->_sceneObject4.remove();
+ scene->_SceneObjectExt.setVisage(21);
+ scene->_SceneObjectExt.setStrip(1);
+ scene->_SceneObjectExt.setFrame(1);
+ scene->_SceneObjectExt.animate(ANIM_MODE_5, NULL);
+
+ scene->_SceneObjectExt._moveDiff.x = 4;
+ NpcMover *mover1 = new NpcMover();
+ Common::Point pt(scene->_SceneObjectExt._position.x - 12, scene->_SceneObjectExt._position.y + 5);
+ scene->_SceneObjectExt.addMover(mover1, &pt, NULL);
+
+ scene->_sceneObject5.postInit();
+ scene->_sceneObject5.setVisage(21);
+ scene->_sceneObject5.setStrip(3);
+ scene->_sceneObject5.setPosition(Common::Point(scene->_sceneObject3._position.x - 36,
+ scene->_sceneObject3._position.y - 1));
+ scene->_sceneObject5._moveDiff.x = 48;
+
+ ObjectMover3 *mover = new ObjectMover3();
+ scene->_sceneObject5.addMover(mover, &_globals->_player, 4, this);
+ break;
+ }
+ case 6: {
+ scene->_sound.play(42);
+ scene->_SceneObjectExt.setStrip(2);
+ scene->_SceneObjectExt.animate(ANIM_MODE_2, NULL);
+
+ scene->_sceneObject5.remove();
+ _globals->_player.setVisage(21);
+ _globals->_player.setStrip(1);
+ _globals->_player.setFrame(1);
+ _globals->_player.animate(ANIM_MODE_5, this);
+ _globals->_player._moveDiff.x = 4;
+
+ npcMover = new NpcMover();
+ Common::Point pt(_globals->_player._position.x - 25, _globals->_player._position.y + 5);
+ _globals->_player.addMover(npcMover, &pt, this);
+ break;
+ }
+ case 7:
+ _globals->_player.setStrip(2);
+ _globals->_player.animate(ANIM_MODE_2, NULL);
+ scene->_sound.play(77, this, 127);
+ break;
+ case 8:
+ _globals->_game->endGame(20, 0);
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene20::Scene20() {
+}
+
+void Scene20::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ setZoomPercents(0, 100, 200, 100);
+
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerGameText);
+ _speakerQText._npc = &_globals->_player;
+
+ if (_globals->_sceneManager._previousScene == 30) {
+ // Cut scene: Assassins are coming
+ _globals->_player.postInit();
+ _globals->_player.setVisage(20);
+ _globals->_player.setPosition(Common::Point(405, 69));
+ _globals->_player._moveDiff = Common::Point(10, 10);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+
+ _SceneObjectExt.postInit();
+ _SceneObjectExt.setVisage(20);
+ _SceneObjectExt.setPosition(Common::Point(400, 69));
+ _SceneObjectExt.animate(ANIM_MODE_1, NULL);
+
+ _sceneObject3.postInit();
+ _sceneObject3.setVisage(20);
+ _sceneObject3.setPosition(Common::Point(395, 69));
+ _sceneObject3.animate(ANIM_MODE_1, NULL);
+
+ _SceneObjectExt._moveDiff = Common::Point(10, 10);
+ _sceneObject3._moveDiff = Common::Point(10, 10);
+ _globals->_soundHandler.play(20);
+ _sound.play(21);
+ _sound.holdAt(true);
+ setAction(&_action2);
+
+ _sceneBounds = Rect(320, 0, 640, 200);
+ } else if (_globals->_sceneManager._previousScene == 60) {
+ // Evasion
+ _sound.play(30);
+ _globals->_player.postInit();
+ _globals->_player.setVisage(20);
+ _globals->_player.setPosition(Common::Point(588, 79));
+ _globals->_player._moveDiff = Common::Point(5, 5);
+ _globals->_player.fixPriority(50);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+
+ _SceneObjectExt.postInit();
+ _SceneObjectExt.setVisage(20);
+ _SceneObjectExt.setPosition(Common::Point(583, 79));
+ _SceneObjectExt.animate(ANIM_MODE_1, NULL);
+
+ _sceneObject3.postInit();
+ _sceneObject3.setVisage(20);
+ _sceneObject3.setStrip2(2);
+ _sceneObject3.setPosition(Common::Point(595, 79));
+ _sceneObject3.animate(ANIM_MODE_1, NULL);
+
+ if ((_globals->getFlag(120) && _globals->getFlag(116)) ||
+ (_globals->getFlag(117) && _globals->getFlag(119))) {
+ // Successful evasion
+ setAction(&_action3);
+ } else if (_globals->getFlag(104)) {
+ _sceneMode = 21;
+ setAction(&_sequenceManager, this, 21, &_globals->_player, &_SceneObjectExt, NULL);
+ } else {
+ // Failed evasion
+ _sceneObject3._moveDiff = Common::Point(8, 8);
+ setAction(&_action4);
+ }
+ _sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y);
+ } else {
+ // Intro: Quinn looking at the monaster
+ _globals->_player.postInit();
+ _globals->_player.setVisage(2640);
+ _globals->_player.animate(ANIM_MODE_NONE, NULL);
+ _globals->_player.setStrip2(1);
+ _globals->_player.setFrame2(4);
+ _globals->_player.fixPriority(200);
+ _globals->_player.setPosition(Common::Point(425, 233));
+
+ setAction(&_action1);
+ _speakerQText.setTextPos(Common::Point(350, 20));
+ _speakerQText._textWidth = 260;
+ _speakerGameText.setTextPos(Common::Point(350, 20));
+ _speakerGameText._textWidth = 260;
+
+ _globals->_soundHandler.play(8);
+ _sceneBounds = Rect(320, 0, 640, 200);
+ }
+
+ _globals->_player.disableControl();
+ loadScene(20);
+}
+
+void Scene20::signal() {
+ if (_sceneMode == 21)
+ _globals->_sceneManager.changeScene(90);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 30 - First game scene (Outside Ch'mee house)
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene30::BeamObject::doAction(int action) {
+ if (action == OBJECT_SCANNER)
+ display2(30, 14);
+ else if (action == CURSOR_LOOK)
+ display2(30, 2);
+ else if (action == CURSOR_USE) {
+ Scene30 *parent = (Scene30 *)_globals->_sceneManager._scene;
+ parent->setAction(&parent->_beamAction);
+ } else
+ SceneObject::doAction(action);
+}
+
+void Scene30::DoorObject::doAction(int action) {
+ if (action == OBJECT_SCANNER)
+ display2(30, 13);
+ else if (action == CURSOR_LOOK)
+ display2(30, 1);
+ else if (action == CURSOR_USE)
+ display2(30, 7);
+ else
+ SceneObject::doAction(action);
+}
+
+void Scene30::BeamAction::signal() {
+ Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ // Disable control and move player to the doorway beam
+ _globals->_player.disableControl();
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(114, 198);
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+
+ case 1:
+ // Perform the animation of player raising hand
+ _globals->_player.setVisage(31);
+ _globals->_player.setStrip(1);
+ _globals->_player.setFrame(1);
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+
+ case 2:
+ // Hide the beam and lower the player's hand
+ scene->_sound.play(10, NULL, 127);
+ _globals->_player.animate(ANIM_MODE_6, this);
+ scene->_beam.remove();
+ break;
+
+ case 3: {
+ // Bring the Kzin to the doorway
+ _globals->_player.setVisage(0);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setStrip(7);
+ scene->_kzin.postInit();
+ scene->_kzin.setVisage(2801);
+ scene->_kzin.animate(ANIM_MODE_1, NULL);
+ scene->_kzin.setObjectWrapper(new SceneObjectWrapper());
+ scene->_kzin.setPosition(Common::Point(334, 1));
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(158, 170);
+ scene->_kzin.addMover(mover, &pt, this);
+ _globals->_sceneItems.push_front(&scene->_kzin);
+ break;
+ }
+
+ case 4:
+ // Open the door
+ scene->_sound.play(11, NULL, 127);
+ scene->_door.animate(ANIM_MODE_5, this);
+ break;
+
+ case 5:
+ // Run the Kzin's talk sequence
+ scene->_sound.play(13, NULL, 127);
+ _globals->_soundHandler.play(12, NULL, 127);
+ scene->_stripManager.start((scene->_sceneMode == 0) ? 30 : 37, this);
+ break;
+
+ case 6:
+ // Slight delay
+ setDelay(3);
+ break;
+
+ case 7:
+ // Re-activate player control
+ scene->_sceneMode = 31;
+ scene->_kzin.setAction(&scene->_kzinAction);
+ _globals->_player.enableControl();
+
+ // End this action
+ remove();
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene30::KzinAction::signal() {
+ Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(1200);
+ break;
+ case 1:
+ _globals->_soundHandler.fadeOut(NULL);
+ _globals->_player.disableControl();
+ setAction(&scene->_sequenceManager, _globals->_sceneManager._scene, 31, &scene->_kzin, &scene->_door, NULL);
+ break;
+ case 2:
+ _globals->_player.enableControl();
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene30::RingAction::signal() {
+ Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ _globals->_player.disableControl();
+ scene->_kzin.setAction(NULL);
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(114, 198);
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+
+ case 1:
+ _globals->_player.checkAngle(&scene->_kzin);
+ scene->_stripManager.start(32, this);
+ break;
+
+ case 2: {
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(143, 177);
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+
+ case 3:
+ scene->_sound.play(11, NULL, 127);
+ scene->_door.animate(ANIM_MODE_6, this);
+ break;
+
+ case 4: {
+ scene->_sound.play(13, NULL, 127);
+ NpcMover *kzinMover = new NpcMover();
+ Common::Point pt(354, 5);
+ scene->_kzin.addMover(kzinMover, &pt, this);
+ NpcMover *playerMover = new NpcMover();
+ pt = Common::Point(335, 36);
+ _globals->_player.addMover(playerMover, &pt, this);
+ break;
+ }
+
+ case 5:
+ break;
+
+ case 6:
+ _globals->_sceneManager.changeScene(20);
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene30::TalkAction::signal() {
+ Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ _globals->_player.disableControl();
+ scene->_kzin.setAction(NULL);
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(114, 198);
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 1:
+ _globals->_player.checkAngle(&scene->_kzin);
+ scene->_stripManager.start(34, this);
+ break;
+ case 2:
+ setDelay(5);
+ break;
+ case 3:
+ scene->_kzin.setAction(&scene->_kzinAction);
+ _globals->_player.enableControl();
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene30::KzinObject::doAction(int action) {
+ Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case OBJECT_STUNNER:
+ display2(30, 12);
+ break;
+ case OBJECT_SCANNER:
+ display2(30, 11);
+ break;
+ case OBJECT_RING:
+ RING_INVENTORY._ring._sceneNumber = 30;
+ scene->setAction(&scene->_ringAction);
+ break;
+ case CURSOR_LOOK:
+ display2(30, 6);
+ break;
+ case CURSOR_USE:
+ display2(30, 10);
+ break;
+ case CURSOR_TALK:
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_talkAction);
+ break;
+ default:
+ SceneObject::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene30::Scene30() :
+ _groundHotspot(9, OBJECT_SCANNER, 50, 17, CURSOR_LOOK, 30, 3, CURSOR_USE, 30, 8, LIST_END),
+ _wallsHotspot(8, OBJECT_SCANNER, 50, 13, CURSOR_LOOK, 30, 0, CURSOR_USE, 30, 7, LIST_END),
+ _courtyardHotspot(0, CURSOR_LOOK, 30, 4, LIST_END),
+ _treeHotspot(10, OBJECT_SCANNER, 40, 39, CURSOR_LOOK, 30, 5, CURSOR_USE, 30, 9, LIST_END) {
+}
+
+void Scene30::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ setZoomPercents(0, 100, 200, 100);
+
+ // Add the speaker classes to the strip manager
+ _stripManager.addSpeaker(&_speakerQL);
+ _stripManager.addSpeaker(&_speakerSR);
+ _stripManager.addSpeaker(&_speakerSText);
+ _stripManager.addSpeaker(&_speakerQText);
+ _speakerSText._npc = &_kzin;
+ _speakerQText._npc = &_globals->_player;
+
+
+ // Setup player
+ _globals->_player.postInit();
+ _globals->_player.setVisage(0);
+ _globals->_player.animate(ANIM_MODE_1);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.setStrip(7);
+ _globals->_player.setFrame(1);
+ _globals->_player.setPosition(Common::Point(114, 198));
+ _globals->_player.changeZoom(75);
+ _globals->_player.enableControl();
+
+ // Set up beam object
+ _beam.postInit();
+ _beam.setVisage(31);
+ _beam.setStrip(2);
+ _beam.setPosition(Common::Point(124, 178));
+ _beam.fixPriority(188);
+
+ // Set up door object
+ _door.postInit();
+ _door.setVisage(30);
+ _door.setPosition(Common::Point(150, 183));
+
+ // Final processing and add of scene items
+ _courtyardHotspot.setBounds(Rect(0, 0, 320, 200));
+
+ // Add the objects and hotspots to the scene
+ _globals->_sceneItems.addItems(&_beam, &_wallsHotspot, &_door, &_treeHotspot, &_groundHotspot,
+ &_courtyardHotspot, NULL);
+
+ // Load the scene data
+ loadScene(30);
+ _sceneMode = 0;
+}
+
+void Scene30::signal() {
+ if (_sceneMode == 31) {
+ // Re-activate beam if the Kzin goes back inside
+ _beam.postInit();
+ _beam.setVisage(31);
+ _beam.setStrip(2);
+ _beam.setPosition(Common::Point(124, 178));
+ _beam.fixPriority(188);
+ _globals->_sceneItems.push_front(&_beam);
+ _globals->_player.enableControl();
+ } else if (_sceneMode == 32) {
+ _globals->_player.disableControl();
+ _sceneMode = 31;
+ setAction(&_sequenceManager, _globals->_sceneManager._scene, 31, &_kzin, &_door, NULL);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 40 - Chmeee Home
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene40::Action1::signal() {
+ Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(120);
+ break;
+ case 1:
+ _globals->_events.setCursor(CURSOR_WALK);
+ scene->_stripManager.start(40, this);
+ break;
+ case 2:
+ scene->_doorway.postInit();
+ scene->_doorway.setVisage(46);
+ scene->_doorway.setPosition(Common::Point(305, 61));
+ scene->_doorway.animate(ANIM_MODE_5, this);
+ scene->_soundHandler.play(25);
+ break;
+ case 3:
+ scene->_doorway.hide();
+ scene->_dyingKzin.setPosition(Common::Point(296, 62));
+ _globals->_player.animate(ANIM_MODE_5, NULL);
+ scene->_object1.setVisage(43);
+ scene->_object1.setStrip(3);
+ scene->_object1.animate(ANIM_MODE_5, NULL);
+ scene->_object2.hide();
+ scene->_object3.hide();
+ scene->_stripManager.start(45, this);
+ break;
+ case 4:
+ scene->_object2.remove();
+ scene->_object3.remove();
+ scene->_assassin.setVisage(42);
+ scene->_assassin.setStrip(2);
+ scene->_assassin.setFrame(1);
+ scene->_assassin.setPosition(Common::Point(13, 171));
+ scene->_assassin.animate(ANIM_MODE_5, this);
+ scene->_soundHandler.play(25);
+ break;
+ case 5:
+ scene->_doorway.show();
+ scene->_doorway.setVisage(42);
+ scene->_doorway.setStrip(3);
+ scene->_doorway.setFrame(1);
+ scene->_doorway.setPosition(Common::Point(41, 144));
+ scene->_assassin.animate(ANIM_MODE_6, NULL);
+ setDelay(6);
+ break;
+ case 6:
+ scene->_doorway.setPosition(Common::Point(178, 101));
+ setDelay(6);
+ break;
+ case 7:
+ scene->_doorway.setPosition(Common::Point(271, 69));
+ setDelay(6);
+ break;
+ case 8:
+ scene->_doorway.remove();
+ scene->_dyingKzin.animate(ANIM_MODE_5, this);
+ break;
+ case 9: {
+ scene->_dyingKzin.setStrip(1);
+ //Workaround: The original uses setFrame(1) but it's completely wrong.
+ scene->_dyingKzin.setFrame(2);
+ scene->_dyingKzin._moveDiff.y = 15;
+ scene->_dyingKzin.animate(ANIM_MODE_5, NULL);
+ Common::Point pt(223, 186);
+ NpcMover *mover = new NpcMover();
+ scene->_dyingKzin.addMover(mover, &pt, this);
+ break;
+ }
+ case 10: {
+ scene->_soundHandler.play(27);
+ Common::Point pt(223, 184);
+ NpcMover *mover = new NpcMover();
+ scene->_dyingKzin.addMover(mover, &pt, this);
+ break;
+ }
+ case 11: {
+ Common::Point pt(223, 186);
+ NpcMover *mover = new NpcMover();
+ scene->_dyingKzin.addMover(mover, &pt, this);
+ break;
+ }
+ case 12: {
+ _globals->_soundHandler.play(26);
+ _globals->_player._uiEnabled = true;
+ scene->_assassin.setVisage(42);
+ scene->_assassin.setPosition(Common::Point(4, 191));
+ scene->_assassin.setStrip(1);
+ scene->_assassin.animate(ANIM_MODE_1, NULL);
+ Common::Point pt(230, 187);
+ NpcMover *mover = new NpcMover();
+ scene->_assassin.addMover(mover, &pt, this);
+ break;
+ }
+ case 13:
+ setDelay(180);
+ break;
+ case 14:
+ scene->_assassin.setVisage(45);
+ scene->_assassin.setStrip(1);
+ scene->_assassin.setFrame(1);
+ scene->_assassin.animate(ANIM_MODE_5, this);
+ scene->_soundHandler.play(28);
+ break;
+ case 15:
+ _globals->_player.disableControl();
+ scene->_object1.setVisage(40);
+ scene->_object1.setStrip(4);
+ scene->_object1.setFrame(1);
+ scene->_object1.animate(ANIM_MODE_5, NULL);
+ _globals->_player.setVisage(40);
+ _globals->_player.setStrip(2);
+ _globals->_player.setFrame(1);
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 16:
+ _globals->_soundHandler.play(77, this);
+ break;
+ case 17:
+ _globals->_game->endGame(40, 20);
+ remove();
+ break;
+ }
+}
+
+void Scene40::Action2::signal() {
+ Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ if (scene->_assassin._position.x < 229)
+ _actionIndex = 0;
+ setDelay(1);
+ break;
+ case 1:
+ scene->_assassin.animate(ANIM_MODE_NONE, NULL);
+ _globals->_player.setStrip(2);
+ _globals->_player.setFrame(1);
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 2: {
+ scene->_soundHandler.play(28);
+ scene->_doorway.postInit();
+ scene->_doorway.setVisage(16);
+ scene->_doorway.setStrip2(6);
+ scene->_doorway.fixPriority(200);
+ scene->_doorway.setPosition(Common::Point(159, 191));
+ scene->_doorway._moveDiff = Common::Point(40, 40);
+ scene->_doorway._moveRate = 60;
+ scene->_doorway.animate(ANIM_MODE_5, NULL);
+
+ Common::Point pt(271, 165);
+ NpcMover *mover = new NpcMover();
+ scene->_doorway.addMover(mover, &pt, this);
+ break;
+ }
+ case 3:
+ scene->_doorway.remove();
+ scene->_assassin.setVisage(44);
+ scene->_assassin._frame = 1;
+ scene->_assassin.animate(ANIM_MODE_5, this);
+ scene->_soundHandler.play(29);
+ RING_INVENTORY._infoDisk._sceneNumber = 40;
+ break;
+ case 4:
+ _globals->_player.animate(ANIM_MODE_6, this);
+ break;
+ case 5: {
+ _globals->_player.setVisage(0);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setStrip(1);
+ Common::Point pt(230, 195);
+ PlayerMover *mover = new PlayerMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 6: {
+ _globals->_player.setStrip(7);
+ scene->_object1.setVisage(2806);
+ scene->_object1.animate(ANIM_MODE_1, NULL);
+ SceneObjectWrapper *wrapper = new SceneObjectWrapper();
+ scene->_object1.setObjectWrapper(wrapper);
+ Common::Point pt(200, 190);
+ NpcMover *mover = new NpcMover();
+ scene->_object1.addMover(mover, &pt, this);
+ break;
+ }
+ case 7:
+ scene->_stripManager.start(44, this);
+ break;
+ case 8: {
+ Common::Point pt(170, 260);
+ NpcMover *mover = new NpcMover();
+ scene->_object1.addMover(mover, &pt, this);
+ break;
+ }
+ case 9:
+ scene->_dyingKzin.setAction(&scene->_action7);
+ scene->_object1.remove();
+ _globals->_stripNum = 88;
+ _globals->_events.setCursor(CURSOR_WALK);
+ _globals->_player.enableControl();
+ scene->_assassin.setAction(&scene->_action8);
+ break;
+ }
+}
+
+void Scene40::Action3::signal() {
+ Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ _globals->_player.setAction(NULL);
+ _globals->_stripNum = 99;
+ _globals->_player.disableControl();
+ Common::Point pt(240, 195);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 1:
+ _globals->_player.setVisage(5010);
+ _globals->_player._strip = 2;
+ _globals->_player._frame = 1;
+ _globals->_player.animate(ANIM_MODE_4, 5, 1, this);
+ break;
+ case 2:
+ scene->_assassin.setStrip(2);
+ scene->_assassin.setFrame(1);
+ RING_INVENTORY._infoDisk._sceneNumber = 1;
+ _globals->_player.animate(ANIM_MODE_6, this);
+ break;
+ case 3:
+ _globals->_player.setVisage(0);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setStrip(7);
+ _globals->_stripNum = 88;
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene40::Action4::signal() {
+ switch (_actionIndex++) {
+ case 0: {
+ Common::Point pt(178, 190);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 1:
+ _globals->_stripNum = 88;
+ _globals->_player.enableControl();
+ break;
+ }
+}
+
+void Scene40::Action5::signal() {
+ Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(_globals->_randomSource.getRandomNumber(119) + 120);
+ break;
+ case 1:
+ scene->_object2.animate(ANIM_MODE_8, 1, this);
+ _actionIndex = 0;
+ }
+}
+
+void Scene40::Action6::signal() {
+ Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ scene->_object1.postInit();
+ scene->_object1.setVisage(16);
+ scene->_object1.setStrip2(6);
+ scene->_object1._moveDiff = Common::Point(40, 40);
+ scene->_object1.setPosition(Common::Point(313, 53));
+ scene->_object1._moveRate = 60;
+
+ Common::Point pt(141, 194);
+ NpcMover *mover = new NpcMover();
+ scene->_object1.addMover(mover, &pt, NULL);
+ scene->_object1.animate(ANIM_MODE_5, NULL);
+
+ scene->_doorway.postInit();
+ scene->_doorway.setVisage(46);
+ scene->_doorway.setPosition(Common::Point(305, 61));
+ scene->_doorway.animate(ANIM_MODE_5, this);
+ scene->_soundHandler.play(25);
+ break;
+ }
+ case 1:
+ scene->_soundHandler.play(28);
+ scene->_doorway.setPosition(Common::Point(148, 74));
+ scene->_doorway.setFrame(1);
+ scene->_doorway.setStrip(2);
+ scene->_doorway.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ remove();
+ break;
+ }
+}
+
+void Scene40::Action7::signal() {
+ Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(_globals->_randomSource.getRandomNumber(499) + 500);
+ break;
+ case 1:
+ scene->_object7.postInit();
+ scene->_object7.setVisage(46);
+
+ if (_globals->_randomSource.getRandomNumber(32767) >= 16384) {
+ scene->_object7.setStrip(3);
+ scene->_object7.setPosition(Common::Point(15, 185));
+ } else {
+ scene->_object7.setPosition(Common::Point(305, 61));
+ scene->_object7.setFrame(15);
+ }
+ scene->_object7.animate(ANIM_MODE_5, this);
+ scene->_soundHandler.play(25);
+ break;
+ case 2:
+ scene->_object7.remove();
+ _actionIndex = 0;
+ setDelay(60);
+ break;
+ }
+}
+
+void Scene40::Action8::signal() {
+ Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(300);
+ break;
+ case 1:
+ _globals->_player.disableControl();
+
+ if ((_globals->_player._position.y >= 197) || (_globals->_player._visage)) {
+ _actionIndex = 1;
+ setDelay(30);
+ } else {
+ scene->_doorway.postInit();
+ scene->_doorway.setVisage(16);
+ scene->_doorway.setStrip2(6);
+ scene->_doorway.fixPriority(200);
+ scene->_doorway._moveRate = 60;
+
+ if (_globals->_player._position.x >= 145) {
+ scene->_doorway.fixPriority(-1);
+ scene->_doorway.setPosition(Common::Point(6, 157));
+ } else {
+ scene->_doorway.setPosition(Common::Point(313, 53));
+ }
+
+ scene->_doorway._moveDiff = Common::Point(40, 40);
+ Common::Point pt(_globals->_player._position.x, _globals->_player._position.y - 18);
+ NpcMover *mover = new NpcMover();
+ scene->_doorway.addMover(mover, &pt, this);
+ scene->_doorway.animate(ANIM_MODE_5, NULL);
+ }
+ break;
+ case 2:
+ scene->_doorway.remove();
+ _globals->_player.setVisage(40);
+ _globals->_player.setStrip(2);
+ _globals->_player.setFrame(1);
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ _globals->_soundHandler.play(77, this);
+ break;
+ case 4:
+ _globals->_game->endGame(40, 45);
+ remove();
+ break;
+ }
+}
+
+void Scene40::Action8::dispatch() {
+ if (_action)
+ _action->dispatch();
+
+ if (_delayFrames) {
+ uint32 frameNumber = _globals->_events.getFrameNumber();
+ if ((_startFrame + 60) < frameNumber) {
+ --_delayFrames;
+ _startFrame = frameNumber;
+
+ if (_delayFrames <= 0) {
+ _delayFrames = 0;
+ signal();
+ }
+ }
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene40::DyingKzin::doAction(int action) {
+ switch (action) {
+ case OBJECT_STUNNER:
+ SceneItem::display2(40, 44);
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(40, 43);
+ break;
+ case CURSOR_LOOK:
+ SceneItem::display2(40, 12);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(40, 18);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene40::Assassin::doAction(int action) {
+ Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case OBJECT_STUNNER:
+ if (scene->_assassin._visage == 44)
+ SceneItem::display2(40, 21);
+ else {
+ _globals->_player.disableControl();
+ Common::Point pt(230, 187);
+ NpcMover *mover = new NpcMover();
+ addMover(mover, &pt, NULL);
+ scene->setAction(&scene->_action2);
+ }
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(40, (scene->_assassin._visage == 44) ? 22 : 23);
+ break;
+ case CURSOR_LOOK:
+ if (scene->_assassin._visage != 44)
+ SceneItem::display2(40, 13);
+ else
+ SceneItem::display2(40, (RING_INVENTORY._infoDisk._sceneNumber == 1) ? 19 : 14);
+ break;
+ case CURSOR_USE:
+ if (scene->_assassin._visage != 44)
+ SceneItem::display2(40, 15);
+ else if (RING_INVENTORY._infoDisk._sceneNumber == 1)
+ SceneItem::display2(40, 19);
+ else {
+ _globals->_player.disableControl();
+ setAction(&scene->_action3);
+ }
+ break;
+ case CURSOR_TALK:
+ SceneItem::display2(40, 38);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene40::Item2::doAction(int action) {
+ switch (action) {
+ case OBJECT_STUNNER:
+ SceneItem::display2(40, 35);
+ _globals->_events.setCursor(CURSOR_WALK);
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(40, 34);
+ break;
+ case CURSOR_LOOK:
+ SceneItem::display2(40, 8);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(40, 36);
+ break;
+ case CURSOR_TALK:
+ SceneItem::display2(40, 37);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene40::Item6::doAction(int action) {
+ switch (action) {
+ case OBJECT_STUNNER:
+ SceneItem::display2(40, 25);
+ _globals->_events.setCursor(CURSOR_WALK);
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(40, 42);
+ break;
+ case CURSOR_LOOK:
+ SceneItem::display2(40, 6);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(40, 36);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene40::Scene40() :
+ _item1(2, OBJECT_SCANNER, 40, 24, OBJECT_STUNNER, 40, 25, CURSOR_LOOK, 40, 7, CURSOR_USE, 40, 16, LIST_END),
+ _item3(5, OBJECT_SCANNER, 40, 28, OBJECT_STUNNER, 40, 27, CURSOR_LOOK, 40, 2, CURSOR_USE, 40, 30, LIST_END),
+ _item4(6, OBJECT_SCANNER, 40, 31, OBJECT_STUNNER, 40, 32, CURSOR_LOOK, 40, 5, CURSOR_USE, 40, 33, LIST_END),
+ _item5(0, CURSOR_LOOK, 40, 11, LIST_END),
+ _item7(4, OBJECT_SCANNER, 40, 26, OBJECT_STUNNER, 40, 27, CURSOR_LOOK, 40, 9, CURSOR_USE, 40, 17, LIST_END),
+ _item8(8, OBJECT_SCANNER, 40, 39, OBJECT_STUNNER, 40, 40, CURSOR_LOOK, 40, 3, CURSOR_USE, 40, 41, LIST_END) {
+}
+
+void Scene40::postInit(SceneObjectList *OwnerList) {
+ loadScene(40);
+ Scene::postInit();
+
+ setZoomPercents(0, 100, 200, 100);
+ _globals->_stripNum = 99;
+
+ _stripManager.addSpeaker(&_speakerQR);
+ _stripManager.addSpeaker(&_speakerSL);
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerSText);
+ _stripManager.addSpeaker(&_speakerGameText);
+
+ _speakerGameText._color1 = 9;
+ _speakerGameText.setTextPos(Common::Point(160, 30));
+ _speakerQText._npc = &_globals->_player;
+ _speakerSText._npc = &_object1;
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(0);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.setPosition(Common::Point(130, 220));
+ _globals->_player.disableControl();
+
+ if (_globals->_sceneManager._previousScene == 20) {
+ _globals->_soundHandler.play(24);
+ _globals->_player.setVisage(43);
+
+ _object1.postInit();
+ _object1.setVisage(41);
+ _object1.setPosition(Common::Point(105, 220));
+ _object2.postInit();
+ _object2.setVisage(41);
+ _object2.setStrip(6);
+ _object2.fixPriority(200);
+ _object2.setPosition(Common::Point(94, 189));
+ _object2.setAction(&_action5);
+
+ _object3.postInit();
+ _object3.setVisage(41);
+ _object3.setStrip(5);
+ _object3.fixPriority(205);
+ _object3.setPosition(Common::Point(110, 186));
+ _object3._numFrames = 2;
+ _object3.animate(ANIM_MODE_8, NULL, NULL);
+
+ _assassin.postInit();
+ _assassin.setPosition(Common::Point(-40, 191));
+ _globals->_sceneItems.push_back(&_assassin);
+
+ _dyingKzin.postInit();
+ _dyingKzin.setVisage(40);
+ _dyingKzin.setStrip(6);
+ _dyingKzin.setPosition(Common::Point(-90, 65));
+ _dyingKzin.fixPriority(170);
+
+ setAction(&_action1);
+ } else {
+ _doorway.postInit();
+ _doorway.setVisage(46);
+ _doorway.setPosition(Common::Point(148, 74));
+ _doorway.setStrip(2);
+ _doorway.setFrame(_doorway.getFrameCount());
+
+ _dyingKzin.postInit();
+ _dyingKzin.setVisage(40);
+ _dyingKzin.setPosition(Common::Point(205, 183));
+ _dyingKzin.fixPriority(170);
+ _dyingKzin._frame = 9;
+ _dyingKzin.setAction(&_action7);
+
+ _assassin.postInit();
+ _assassin.setVisage(44);
+ _assassin.setPosition(Common::Point(230, 187));
+ _assassin.setAction(&_action8);
+
+ if (RING_INVENTORY._infoDisk._sceneNumber == 40) {
+ _assassin.setStrip(1);
+ _assassin.setFrame(_assassin.getFrameCount());
+ } else {
+ _assassin.setStrip(2);
+ }
+
+ _globals->_sceneItems.push_back(&_assassin);
+ _globals->_player.setPosition(Common::Point(170, 220));
+
+ setAction(&_action4);
+ }
+
+ _item5.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+ _item6._sceneRegionId = 3;
+ _item2._sceneRegionId = 7;
+
+ _globals->_sceneItems.addItems(&_dyingKzin, &_item8, &_item1, &_item2, &_item3, &_item4,
+ &_item6, &_item7, &_item5, NULL);
+}
+
+void Scene40::signal() {
+ if (_sceneMode == 41)
+ _globals->_sceneManager.changeScene(50);
+}
+
+void Scene40::dispatch() {
+ if ((_globals->_stripNum == 88) && (_globals->_player._position.y >= 197)) {
+ _globals->_player.disableControl();
+ _globals->_stripNum = 0;
+ _globals->_player.setAction(NULL);
+ _sceneMode = 41;
+ setAction(&_sequenceManager, this, 41, &_globals->_player, NULL);
+
+ if (_globals->_sceneManager._previousScene == 20) {
+ _dyingKzin.setAction(&_action6);
+ }
+ }
+
+ Scene::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 50 - By Flycycles
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene50::Action1::signal() {
+ Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setAction(&scene->_sequenceManager, this, 54, &_globals->_player, NULL);
+ break;
+ case 1:
+ _globals->_events.setCursor(CURSOR_WALK);
+ scene->_stripManager.start(63, this);
+ break;
+ case 2:
+ if (scene->_stripManager._field2E8 != 107) {
+ _globals->_player.enableControl();
+ remove();
+ } else {
+ Common::Point pt(282, 139);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ }
+ break;
+ case 3:
+ _globals->_stripNum = -1;
+ _globals->_sceneManager.changeScene(60);
+ break;
+ }
+}
+
+void Scene50::Action2::signal() {
+ Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ scene->_stripManager.start(66, this);
+ break;
+ case 1: {
+ Common::Point pt(141, 142);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 2:
+ _globals->_sceneManager.changeScene(40);
+ remove();
+ break;
+ }
+}
+
+void Scene50::Action3::signal() {
+ switch (_actionIndex++) {
+ case 0: {
+ _globals->_player.disableControl();
+ Common::Point pt(136, 185);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 1:
+ _globals->_sceneManager.changeScene(60);
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene50::Object1::doAction(int action) {
+ Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case OBJECT_STUNNER:
+ SceneItem::display2(50, 20);
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(50, 19);
+ break;
+ case CURSOR_LOOK:
+ SceneItem::display2(50, 4);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(50, 21);
+ break;
+ case CURSOR_TALK:
+ _globals->_player.disableControl();
+ scene->_sceneMode = 52;
+ scene->setAction(&scene->_sequenceManager, scene, 52, NULL);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene50::Object2::doAction(int action) {
+ Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case OBJECT_STUNNER:
+ SceneItem::display2(50, 11);
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(50, 10);
+ break;
+ case CURSOR_LOOK:
+ SceneItem::display2(50, 1);
+ break;
+ case OBJECT_INFODISK:
+ case CURSOR_USE:
+ _globals->_stripNum = 50;
+ scene->setAction(&scene->_action3);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene50::Object3::doAction(int action) {
+ Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case OBJECT_STUNNER:
+ SceneItem::display2(50, 11);
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(50, 10);
+ break;
+ case CURSOR_LOOK:
+ SceneItem::display2(50, 1);
+ break;
+ case OBJECT_INFODISK:
+ case CURSOR_USE:
+ SceneItem::display2(50, 8);
+ break;
+ case CURSOR_TALK:
+ _globals->_player.disableControl();
+ scene->_sceneMode = 52;
+ scene->setAction(&scene->_sequenceManager, scene, 52, NULL);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene50::Object4::doAction(int action) {
+ Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case OBJECT_STUNNER:
+ SceneItem::display2(50, 11);
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(50, 10);
+ break;
+ case CURSOR_LOOK:
+ SceneItem::display2(50, 1);
+ break;
+ case OBJECT_INFODISK:
+ case CURSOR_USE:
+ _globals->_player.disableControl();
+ _globals->_stripNum = 0;
+ scene->_sceneMode = 51;
+ scene->setAction(&scene->_sequenceManager, scene, 51, &_globals->_player, NULL);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene50::Scene50() :
+ _item0(0, CURSOR_LOOK, 50, 3, LIST_END),
+ _item1(0, OBJECT_SCANNER, 50, 15, CURSOR_USE, 50, 16, CURSOR_LOOK, 50, 3, LIST_END),
+ _item2(0, CURSOR_LOOK, 50, 7, LIST_END),
+ _item3(8, OBJECT_STUNNER, 50, 14, OBJECT_SCANNER, 50, 13, CURSOR_LOOK, 50, 3, LIST_END),
+ _item4(9, OBJECT_SCANNER, 40, 39, OBJECT_STUNNER, 40, 40, CURSOR_USE, 40, 41, CURSOR_LOOK, 50, 5, LIST_END),
+ _item5(10, OBJECT_SCANNER, 50, 17, OBJECT_STUNNER, 50, 18, CURSOR_LOOK, 50, 6, CURSOR_USE, 30, 8, LIST_END) {
+
+ _doorwayRect = Rect(80, 108, 160, 112);
+}
+
+void Scene50::postInit(SceneObjectList *OwnerList) {
+ loadScene(50);
+ Scene::postInit();
+ setZoomPercents(0, 100, 200, 100);
+
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerSText);
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(0);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player._canWalk = false;
+ _globals->_player.changeZoom(75);
+ _globals->_player._moveDiff.y = 3;
+
+ if (_globals->_sceneManager._previousScene == 40) {
+ _globals->_player.setPosition(Common::Point(128, 123));
+ } else if (_globals->_stripNum == 50) {
+ _globals->_player.setPosition(Common::Point(136, 185));
+ } else {
+ _globals->_player.setPosition(Common::Point(270, 143));
+ }
+
+ _object2.postInit();
+ _object2.setVisage(2331);
+ _object2.setStrip(6);
+ _object2.setPosition(Common::Point(136, 192));
+ _object2.fixPriority(200);
+
+ _object3.postInit();
+ _object3.setVisage(2337);
+ _object3.setStrip(6);
+ _object3.setPosition(Common::Point(260, 180));
+ _object3.fixPriority(200);
+
+ _object4.postInit();
+ _object4.setVisage(2331);
+ _object4.setStrip(6);
+ _object4.setPosition(Common::Point(295, 144));
+ _object4.fixPriority(178);
+
+ _globals->_sceneItems.addItems(&_object2, &_object3, &_object4, NULL);
+
+ if (!_globals->getFlag(101)) {
+ _globals->_player.disableControl();
+ _globals->setFlag(101);
+ setAction(&_action1);
+ } else {
+ _globals->_player.enableControl();
+
+ if (_globals->_sceneManager._previousScene == 40) {
+ _globals->_player.disableControl();
+ _sceneMode = 54;
+ setAction(&_sequenceManager, this, 54, &_globals->_player, NULL);
+ }
+ }
+
+ _item0.setBounds(Rect(200, 0, 320, 200));
+ _globals->_sceneItems.addItems(&_item3, &_item4, &_item5, &_item0, NULL);
+}
+
+void Scene50::signal() {
+ switch (_sceneMode) {
+ case 51:
+ _globals->_sceneManager.changeScene(60);
+ break;
+ case 55:
+ _globals->_sceneManager.changeScene(40);
+ break;
+ case 52:
+ case 54:
+ _globals->_player.enableControl();
+ break;
+ }
+}
+
+void Scene50::dispatch() {
+ Scene::dispatch();
+
+ if ((_sceneMode != 55) && _doorwayRect.contains(_globals->_player._position)) {
+ // Player in house doorway, start player moving to within
+ _globals->_player.disableControl();
+ _sceneMode = 55;
+ Common::Point pt(89, 111);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 60 - Flycycle controls
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene60::Action1::signal() {
+ Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(3);
+ break;
+ case 1:
+ scene->_floppyDrive.postInit();
+ scene->_floppyDrive.setVisage(60);
+ scene->_floppyDrive.setStrip(7);
+ scene->_floppyDrive.setPosition(Common::Point(136, 65));
+ scene->_floppyDrive.animate(ANIM_MODE_5, this);
+
+ scene->_soundHandler1.play(35);
+ break;
+ case 2:
+ scene->_redLights.postInit();
+ scene->_redLights.setVisage(60);
+ scene->_redLights.setPosition(Common::Point(199, 186));
+ scene->_redLights.animate(ANIM_MODE_8, 0, NULL);
+ scene->_redLights._numFrames = 5;
+
+ scene->_controlButton.animate(ANIM_MODE_2, NULL);
+
+ if (!_globals->getFlag(83)) {
+ scene->_message.postInit();
+ scene->_message.setVisage(60);
+ scene->_message.setStrip2(3);
+ scene->_message.setFrame(2);
+ scene->_message.setPosition(Common::Point(148, 85));
+ scene->_message.animate(ANIM_MODE_2, NULL);
+ scene->_message._numFrames = 5;
+
+ _globals->_sceneItems.push_front(&scene->_message);
+ scene->_soundHandler2.play(38);
+ }
+
+ _globals->_events.setCursor(CURSOR_USE);
+ break;
+ case 3:
+ scene->_soundHandler2.play(37);
+ scene->loadScene(65);
+ scene->_message.remove();
+
+ if (_globals->_sceneObjects->contains(&scene->_redLights))
+ scene->_redLights.remove();
+
+ scene->_controlButton.remove();
+ scene->_slaveButton.remove();
+ scene->_masterButton.remove();
+ scene->_item1.remove();
+ scene->_item2.remove();
+
+ scene->_nextButton.postInit();
+ scene->_nextButton.setVisage(65);
+ scene->_nextButton.setPosition(Common::Point(118, 197));
+
+ scene->_prevButton.postInit();
+ scene->_prevButton.setVisage(65);
+ scene->_prevButton.setStrip(2);
+ scene->_prevButton.setPosition(Common::Point(160, 197));
+
+ scene->_exitButton.postInit();
+ scene->_exitButton.setVisage(65);
+ scene->_exitButton.setStrip(3);
+ scene->_exitButton.setPosition(Common::Point(202, 197));
+
+ scene->_rose.postInit();
+ scene->_rose.setVisage(65);
+ scene->_rose.setStrip(4);
+ scene->_rose.setFrame(1);
+ scene->_rose.setPosition(Common::Point(145, 165));
+
+ _globals->_sceneItems.push_front(&scene->_nextButton);
+ _globals->_sceneItems.push_front(&scene->_prevButton);
+ _globals->_sceneItems.push_front(&scene->_exitButton);
+ setDelay(10);
+
+ _globals->_events.setCursor(CURSOR_USE);
+ break;
+ case 4:
+ _globals->setFlag(90);
+ // Deliberate fall-through
+ case 5:
+ case 6:
+ case 7:
+ SceneItem::display(60, _actionIndex - 4, SET_Y, 40, SET_X, 25, SET_FONT, 75,
+ SET_EXT_BGCOLOR, -1, SET_FG_COLOR, 34, SET_POS_MODE, 0,
+ SET_WIDTH, 280, SET_KEEP_ONSCREEN, 1, LIST_END);
+ _globals->_events.setCursor(CURSOR_USE);
+ break;
+ case 9:
+ _globals->_player._uiEnabled = false;
+ RING_INVENTORY._infoDisk._sceneNumber = 1;
+
+ if (_globals->_sceneObjects->contains(&scene->_message))
+ scene->_message.remove();
+
+ scene->_controlButton.animate(ANIM_MODE_NONE);
+ scene->_controlButton.setFrame(1);
+ scene->_redLights.remove();
+
+ scene->_floppyDrive.postInit();
+ scene->_floppyDrive.setVisage(60);
+ scene->_floppyDrive.setStrip(7);
+ scene->_floppyDrive.setPosition(Common::Point(136, 65));
+ scene->_floppyDrive.setFrame(scene->_floppyDrive.getFrameCount());
+ scene->_floppyDrive.animate(ANIM_MODE_6, this);
+
+ scene->_soundHandler1.play(35);
+ scene->_soundHandler3.stop();
+
+ scene->_masterButton.setFrame(1);
+ scene->_masterButton._state = 0;
+
+ _globals->clearFlag(103);
+ _globals->clearFlag(!_globals->_stripNum ? 116 : 119);
+ break;
+ case 10:
+ setDelay(60);
+ break;
+ case 11:
+ _globals->_player._uiEnabled = true;
+ scene->_floppyDrive.remove();
+ remove();
+ break;
+ case 8:
+ default:
+ break;
+ }
+}
+
+void Scene60::Action2::signal() {
+ Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ case 2:
+ setDelay(3);
+ break;
+ case 1:
+ scene->_stripManager.start(66, this);
+ break;
+ case 3:
+ _globals->_sceneManager.changeScene(50);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene60::PrevObject::doAction(int action) {
+ Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+ if (action == CURSOR_LOOK) {
+ SceneItem::display2(60, 16);
+ } else if (action == CURSOR_USE) {
+ animate(ANIM_MODE_8, 1, NULL);
+
+ if (scene->_action1.getActionIndex() > 5) {
+ scene->_soundHandler3.play(36);
+ scene->_action1.setActionIndex(scene->_action1.getActionIndex() - 2);
+ scene->_action1.setDelay(1);
+ }
+ } else {
+ SceneHotspot::doAction(action);
+ }
+}
+
+void Scene60::NextObject::doAction(int action) {
+ Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+ if (action == CURSOR_LOOK) {
+ SceneItem::display2(60, 17);
+ } else if (action == CURSOR_USE) {
+ animate(ANIM_MODE_8, 1, NULL);
+
+ if (scene->_action1.getActionIndex() < 8) {
+ scene->_soundHandler3.play(36);
+ scene->_action1.setDelay(1);
+ }
+ } else {
+ SceneHotspot::doAction(action);
+ }
+}
+
+void Scene60::ExitObject::doAction(int action) {
+ Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+ if (action == CURSOR_LOOK) {
+ SceneItem::display2(60, 18);
+ } else if (action == CURSOR_USE) {
+ scene->_soundHandler3.play(36);
+ animate(ANIM_MODE_8, 1, NULL);
+ scene->_nextButton.remove();
+ scene->_prevButton.remove();
+ scene->_exitButton.remove();
+ scene->_rose.remove();
+
+ SceneItem::display(0, 0);
+ scene->loadScene(60);
+
+ scene->_controlButton.postInit();
+ scene->_controlButton.setVisage(60);
+ scene->_controlButton.setStrip(5);
+ scene->_controlButton.setPosition(Common::Point(233, 143));
+ scene->_controlButton.animate(ANIM_MODE_2, NULL);
+
+ scene->_slaveButton.postInit();
+ scene->_slaveButton.setVisage(60);
+ scene->_slaveButton.setStrip(8);
+ scene->_slaveButton.setPosition(Common::Point(143, 125));
+
+ scene->_masterButton.postInit();
+ scene->_masterButton.setVisage(60);
+ scene->_masterButton.setStrip(8);
+ scene->_masterButton.setPosition(Common::Point(143, 105));
+
+ _globals->_sceneItems.push_front(&scene->_masterButton);
+ _globals->_sceneItems.push_front(&scene->_slaveButton);
+
+ scene->_redLights.postInit();
+ scene->_redLights.setVisage(60);
+ scene->_redLights.setPosition(Common::Point(199, 186));
+ scene->_redLights.animate(ANIM_MODE_8, 0, NULL);
+ scene->_redLights._numFrames = 5;
+ scene->_redLights.setAction(&scene->_sequenceManager, scene, 61, NULL);
+
+ if (scene->_slaveButton._state)
+ scene->_slaveButton.setFrame(2);
+ if (scene->_masterButton._state)
+ scene->_masterButton.setFrame(2);
+
+ _globals->_sceneItems.push_front(&scene->_item1);
+ _globals->_sceneItems.push_front(&scene->_controlButton);
+ _globals->_sceneItems.push_front(&scene->_slaveButton);
+ _globals->_sceneItems.push_front(&scene->_masterButton);
+ _globals->_sceneItems.push_back(&scene->_item2);
+
+ _globals->gfxManager()._font.setFontNumber(2);
+ _globals->_sceneText._fontNumber = 2;
+
+ scene->_action1.setActionIndex(2);
+ scene->_action1.setDelay(1);
+ scene->_sceneMode = 9999;
+ scene->signal();
+ } else {
+ SceneHotspot::doAction(action);
+ }
+}
+
+void Scene60::MessageObject::doAction(int action) {
+ Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+ if (action == CURSOR_LOOK) {
+ SceneItem::display2(60, 9);
+ } else if (action == CURSOR_USE) {
+ scene->_action1.setDelay(1);
+ _globals->setFlag(83);
+ } else {
+ SceneHotspot::doAction(action);
+ }
+}
+
+void Scene60::ControlObject::doAction(int action) {
+ Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+ if (action == CURSOR_LOOK) {
+ SceneItem::display2(60, 11);
+ } else if (action == CURSOR_USE) {
+ if (_animateMode == ANIM_MODE_NONE)
+ SceneItem::display2(60, 14);
+ else if (!scene->_slaveButton._state) {
+ _globals->_soundHandler.play(40);
+ _globals->_soundHandler.holdAt(true);
+ _globals->_sceneManager.changeScene(20);
+ } else {
+ scene->_sceneMode = 15;
+ setAction(&scene->_sequenceManager, scene, 62, NULL);
+ }
+ } else {
+ SceneHotspot::doAction(action);
+ }
+}
+
+void Scene60::SlaveObject::doAction(int action) {
+ Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+ if (action == CURSOR_LOOK) {
+ SceneItem::display2(60, 8);
+ } else if (action == CURSOR_USE) {
+ if (scene->_masterButton._state)
+ scene->_sceneMode = 19;
+ else if (_state) {
+ scene->_soundHandler3.stop();
+ animate(ANIM_MODE_6, NULL);
+ _globals->clearFlag(102);
+ _globals->clearFlag(!_globals->_stripNum ? 117 : 120);
+ _state = 0;
+ scene->_sceneMode = 9998;
+ } else {
+ scene->_soundHandler3.play(39);
+ _globals->setFlag(102);
+ _globals->setFlag(!_globals->_stripNum ? 117 : 120);
+ animate(ANIM_MODE_5, NULL);
+ _state = 1;
+ scene->_sceneMode = 9998;
+ }
+
+ setAction(&scene->_sequenceManager, scene, 62, NULL);
+ } else {
+ SceneHotspot::doAction(action);
+ }
+}
+
+void Scene60::MasterObject::doAction(int action) {
+ Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+ if (action == CURSOR_LOOK) {
+ SceneItem::display2(60, 7);
+ } else if (action == CURSOR_USE) {
+ if (!scene->_controlButton._animateMode)
+ scene->_sceneMode = 14;
+ else if (scene->_slaveButton._state)
+ scene->_sceneMode = 20;
+ else if (_state) {
+ scene->_soundHandler3.stop();
+ animate(ANIM_MODE_6, NULL);
+ _state = 0;
+ _globals->clearFlag(103);
+ _globals->clearFlag(!_globals->_stripNum ? 116 : 119);
+ scene->_sceneMode = 9998;
+ } else {
+ scene->_soundHandler3.play(39);
+ animate(ANIM_MODE_5, NULL);
+ _state = 1;
+ _globals->setFlag(103);
+ _globals->setFlag(!_globals->_stripNum ? 116 : 119);
+ scene->_sceneMode = 9998;
+ }
+
+ setAction(&scene->_sequenceManager, scene, 62, NULL);
+ } else {
+ SceneHotspot::doAction(action);
+ }
+}
+
+void Scene60::FloppyDrive::doAction(int action) {
+ Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+ if (action == CURSOR_LOOK) {
+ SceneItem::display2(60, 13);
+ } else if (action == CURSOR_USE) {
+ _globals->setFlag(!_globals->_stripNum ? 118 : 121);
+ scene->setAction(&scene->_action1);
+ } else {
+ SceneHotspot::doAction(action);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene60::Item1::doAction(int action) {
+ Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case OBJECT_INFODISK:
+ RING_INVENTORY._infoDisk._sceneNumber = 60;
+ _globals->setFlag(!_globals->_stripNum ? 118 : 121);
+ scene->_sceneMode = 0;
+ scene->setAction(&scene->_action1);
+ break;
+ case CURSOR_LOOK:
+ SceneItem::display2(60, 10);
+ break;
+ case CURSOR_USE:
+ if (RING_INVENTORY._infoDisk._sceneNumber == 60) {
+ if (_globals->getFlag(118) && !_globals->_stripNum) {
+ _globals->clearFlag(118);
+ scene->setAction(&scene->_action1);
+ scene->_action1.setActionIndex(9);
+ scene->_action1.setDelay(1);
+ }
+ if (_globals->getFlag(121) && !_globals->_stripNum) {
+ _globals->clearFlag(121);
+ scene->setAction(&scene->_action1);
+ scene->_action1.setActionIndex(9);
+ scene->_action1.setDelay(1);
+ }
+ } else if (RING_INVENTORY._infoDisk._sceneNumber == 1) {
+ scene->_sceneMode = 0;
+ setAction(&scene->_sequenceManager, scene, 62, NULL);
+ } else {
+ scene->setAction(&scene->_action2);
+ }
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene60::Item::doAction(int action) {
+ Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(60, _messageNum);
+ break;
+ case CURSOR_USE:
+ scene->_sceneMode = _sceneMode;
+ setAction(&scene->_sequenceManager, this, 62, NULL);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene60::Scene60() :
+ _item2(0, 12, 12),
+ _item3(8, 22, 23),
+ _item4(9, 24, 25),
+ _item5(10, 26, 27),
+ _item6(11, 28, 29) {
+}
+
+void Scene60::postInit(SceneObjectList *OwnerList) {
+ loadScene(60);
+ Scene::postInit();
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerSText);
+
+ _globals->_player._uiEnabled = true;
+ _globals->_events.setCursor(CURSOR_USE);
+
+ _slaveButton.postInit();
+ _slaveButton.setVisage(60);
+ _slaveButton.setStrip(8);
+ _slaveButton.setPosition(Common::Point(143, 125));
+ _slaveButton._state = 0;
+
+ _masterButton.postInit();
+ _masterButton.setVisage(60);
+ _masterButton.setStrip(8);
+ _masterButton.setPosition(Common::Point(143, 105));
+ _masterButton._state = 0;
+
+ _globals->_sceneItems.push_back(&_masterButton);
+ _globals->_sceneItems.push_back(&_slaveButton);
+
+ _controlButton.postInit();
+ _controlButton.setVisage(60);
+ _controlButton.setStrip(5);
+ _controlButton.setPosition(Common::Point(233, 143));
+ _globals->_sceneItems.push_back(&_controlButton);
+
+ if (_globals->_stripNum == -1) {
+ _globals->_stripNum = 0;
+ } else {
+ _globals->_player.disableControl();
+ _sceneMode = 9999;
+ setAction(&_sequenceManager, this, 61, NULL);
+ }
+
+ _item1.setBounds(Rect(130, 55, 174, 70));
+ _item2.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+
+ if (_globals->_stripNum == 0) {
+ if (_globals->getFlag(117)) {
+ _slaveButton._state = 1;
+ _slaveButton.setFrame(2);
+ }
+
+ if (_globals->getFlag(116)) {
+ _masterButton._state = 1;
+ _masterButton.setFrame(2);
+ }
+
+ if (_globals->getFlag(118)) {
+ _controlButton.animate(ANIM_MODE_2, NULL);
+
+ _redLights.postInit();
+ _redLights.setVisage(60);
+ _redLights.setPosition(Common::Point(199, 186));
+ _redLights.animate(ANIM_MODE_8, 0, NULL);
+
+ _soundHandler1.play(35);
+
+ if (!_globals->getFlag(83)) {
+ _message.postInit();
+ _message.setVisage(60);
+ _message.setStrip2(3);
+ _message.setFrame(2);
+ _message.setPosition(Common::Point(148, 85));
+ _message.animate(ANIM_MODE_2, NULL);
+ _message._numFrames = 5;
+ _globals->_sceneItems.push_front(&_message);
+
+ _soundHandler2.play(38);
+ }
+ }
+ } else {
+ if (_globals->getFlag(120)) {
+ _slaveButton._state = 1;
+ _slaveButton.setFrame(2);
+ }
+
+ if (_globals->getFlag(119)) {
+ _masterButton._state = 1;
+ _masterButton.setFrame(2);
+ }
+
+ if (_globals->getFlag(121)) {
+ _controlButton.animate(ANIM_MODE_2, NULL);
+
+ _redLights.postInit();
+ _redLights.setVisage(60);
+ _redLights.setPosition(Common::Point(199, 186));
+ _redLights.animate(ANIM_MODE_8, 0, NULL);
+ _redLights._numFrames = 5;
+
+ _soundHandler1.play(35);
+
+ if (!_globals->getFlag(83)) {
+ _message.postInit();
+ _message.setVisage(60);
+ _message.setStrip2(3);
+ _message.setFrame(2);
+ _message.setPosition(Common::Point(148, 85));
+ _message.animate(ANIM_MODE_2, NULL);
+ _message._numFrames = 5;
+ _globals->_sceneItems.push_front(&_message);
+
+ _soundHandler2.play(38);
+ }
+ }
+ }
+
+ _globals->_sceneItems.addItems(&_item3, &_item4, &_item5, &_item6,
+ &_item1, &_item2, NULL);
+}
+
+void Scene60::signal() {
+ if (_sceneMode != 0) {
+ if (_sceneMode == 9998) {
+ _globals->_events.setCursor(CURSOR_USE);
+ } else if (_sceneMode == 9999) {
+ _globals->_player._uiEnabled = true;
+ _globals->_events.setCursor(CURSOR_USE);
+
+ _gfxButton.setText(EXIT_MSG);
+ _gfxButton._bounds.center(160, 193);
+ _gfxButton.draw();
+ _gfxButton._bounds.expandPanes();
+ } else {
+ SceneItem::display2(60, _sceneMode);
+ _globals->_events.setCursor(CURSOR_USE);
+ }
+ }
+}
+
+void Scene60::process(Event &event) {
+ Scene::process(event);
+
+ if (_screenNumber == 60) {
+ if (_gfxButton.process(event))
+ _globals->_sceneManager.changeScene(50);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 90 - Shipyard Entrance
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene90::Action1::signal() {
+ Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(10);
+ break;
+ case 1:
+ _globals->_scenePalette.addRotation(64, 72, -1);
+ _globals->_events.setCursor(CURSOR_WALK);
+ scene->_stripManager.start(90, this);
+ break;
+ case 2:
+ setDelay(2);
+ break;
+ case 3: {
+ Common::Point pt(278, 191);
+ NpcMover *mover = new NpcMover();
+ scene->_object2.addMover(mover, &pt, this);
+ break;
+ }
+ case 4:
+ scene->_object2.setStrip(3);
+ setDelay(2);
+ break;
+ case 5:
+ scene->_soundHandler2.play(58);
+
+ if (scene->_stripManager._field2E8 == 220)
+ scene->_stripManager.start(91, this, scene);
+ else {
+ scene->_stripManager.start(_globals->getFlag(104) ? 93 : 92, this, scene);
+ _actionIndex = 7;
+ }
+ break;
+ case 6:
+ scene->_object2.animate(ANIM_MODE_NONE);
+ _globals->_player._uiEnabled = true;
+ break;
+ case 7:
+ scene->_object2.animate(ANIM_MODE_NONE);
+ _globals->_soundHandler.play(56);
+ scene->_object3.animate(ANIM_MODE_5, this);
+ break;
+ case 8: {
+ Common::Point pt(215, 127);
+ PlayerMover *mover = new PlayerMover();
+ scene->_object5.addMover(mover, &pt, this);
+ break;
+ }
+ case 9: {
+ Common::Point pt1(215, 127);
+ PlayerMover *mover1 = new PlayerMover();
+ scene->_object1.addMover(mover1, &pt1, this);
+ Common::Point pt2(86, 62);
+ PlayerMover *mover2 = new PlayerMover();
+ scene->_object5.addMover(mover2, &pt2, this);
+ break;
+ }
+ case 10: {
+ PlayerMover2 *mover = new PlayerMover2();
+ scene->_object1.addMover(mover, 10, 15, &scene->_object5);
+
+ if (!_globals->getFlag(104)) {
+ mover = new PlayerMover2();
+ scene->_object4.addMover(mover, 10, 15, &scene->_object1);
+ }
+ setDelay(60);
+ break;
+ }
+ case 11:
+ _globals->_soundHandler.play(57);
+ _globals->_soundHandler.play(68);
+ scene->_object3.animate(ANIM_MODE_6, NULL);
+
+ SceneItem::display(90, _globals->getFlag(104) ? 15 : 14,
+ SET_EXT_BGCOLOR, 13, SET_KEEP_ONSCREEN, -1, SET_X, 120, SET_Y, 20, LIST_END);
+ break;
+ case 12:
+ SceneItem::display(0, 0);
+ _globals->_scenePalette.clearListeners();
+ _globals->_sceneManager.changeScene(95);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene90::Object1::doAction(int action) {
+ Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(90, 7);
+ break;
+ case CURSOR_USE:
+ _globals->_player.disableControl();
+ scene->_sceneMode = 97;
+ setAction(&scene->_sequenceManager, scene, 97, this, NULL);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene90::Object2::doAction(int action) {
+ Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case OBJECT_STUNNER:
+ case CURSOR_USE:
+ _globals->_player.disableControl();
+ scene->_object6.postInit();
+ scene->_object6.setVisage(90);
+ scene->_object6.setStrip(6);
+ scene->_object6.setPosition(Common::Point(184, 210));
+ scene->_object6.hide();
+
+ scene->_sceneMode = 91;
+ scene->_soundHandler1.play(59);
+ scene->_soundHandler1.holdAt(true);
+ scene->setAction(&scene->_sequenceManager, scene, 91, this, &scene->_object6, NULL);
+ break;
+ case CURSOR_LOOK:
+ SceneItem::display2(90, 8);
+ break;
+ case CURSOR_TALK:
+ _globals->_player.disableControl();
+ setAction(&scene->_sequenceManager, scene, 96, this, NULL);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene90::Scene90() :
+ _item1(0, CURSOR_LOOK, 90, 9, LIST_END),
+ _item2(0, CURSOR_LOOK, 90, 10, LIST_END),
+ _item3(0, CURSOR_LOOK, 90, 11, LIST_END),
+ _object3(OBJECT_STUNNER, 90, 13, CURSOR_LOOK, 90, 12, CURSOR_USE, 90, 16, LIST_END),
+ _object4(CURSOR_LOOK, 90, 17, LIST_END),
+ _object5(CURSOR_LOOK, 90, 18, CURSOR_USE, 90, 19, LIST_END) {
+}
+
+void Scene90::stripCallback(int v) {
+ Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene;
+
+ if (v == 1)
+ scene->_object2.animate(ANIM_MODE_7, NULL);
+ else if (v == 2)
+ scene->_object2.animate(ANIM_MODE_NONE);
+}
+
+void Scene90::postInit(SceneObjectList *OwnerList) {
+ loadScene(90);
+ Scene::postInit();
+
+ setZoomPercents(70, 10, 180, 100);
+ _stripManager.addSpeaker(&_speakerSText);
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerMText);
+ _stripManager.addSpeaker(&_speakerQL);
+ _stripManager.addSpeaker(&_speakerSR);
+
+ _speakerMText._npc = &_object2;
+ _speakerQText._textWidth = 160;
+ _speakerQText._npc = &_object5;
+ _speakerSText._npc = &_object1;
+
+ _object5.postInit();
+ _object5.setVisage(2333);
+ _object5.setObjectWrapper(new SceneObjectWrapper());
+ _object5._strip = 7;
+ _object5._moveDiff = Common::Point(22, 22);
+ _object5.setPosition(Common::Point(151, 177));
+ _object5.changeZoom(-1);
+ _globals->_sceneItems.push_back(&_object5);
+
+ _object1.postInit();
+ _object1.setVisage(2337);
+ _object1.setObjectWrapper(new SceneObjectWrapper());
+ _object1._strip = 4;
+ _object1._moveDiff = Common::Point(20, 20);
+ _object1.setPosition(Common::Point(212, 183));
+ _object1.changeZoom(-1);
+ _globals->_sceneItems.push_back(&_object1);
+
+ if (!_globals->getFlag(104)) {
+ _object4.postInit();
+ _object4.setVisage(2331);
+ _object4.setObjectWrapper(new SceneObjectWrapper());
+ _object4._strip = 4;
+ _object4._moveDiff = Common::Point(20, 20);
+ _object4.setPosition(Common::Point(251, 207));
+ _object4.changeZoom(-1);
+ _globals->_sceneItems.push_back(&_object4);
+ }
+
+ _object2.postInit();
+ _object2.setVisage(90);
+ _object2.animate(ANIM_MODE_1, NULL);
+ _object2.setPosition(Common::Point(315, 185));
+ _object2._strip = 2;
+ _globals->_sceneItems.push_back(&_object2);
+
+ _object3.postInit();
+ _object3.setVisage(90);
+ _object3.animate(ANIM_MODE_1, NULL);
+ _object3.setPosition(Common::Point(196, 181));
+ _object3.fixPriority(175);
+ _globals->_sceneItems.push_back(&_object3);
+
+ _globals->_player.disableControl();
+ _globals->_soundHandler.play(55);
+ _soundHandler1.play(52);
+ _soundHandler1.holdAt(true);
+
+ setAction(&_action1);
+
+ _item3.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+ _item1.setBounds(Rect(271, 65, 271, 186));
+ _item2.setBounds(Rect(0, 17, 124, 77));
+
+ _globals->_sceneItems.addItems(&_item1, &_item2, &_item3, NULL);
+}
+
+void Scene90::signal() {
+ switch (_sceneMode) {
+ case 91:
+ _sceneMode = 92;
+ _globals->_soundHandler.play(77, this);
+ break;
+ case 92:
+ _globals->_scenePalette.clearListeners();
+ _globals->_game->endGame(90, 6);
+ break;
+ case 96:
+ _globals->_player.enableControl();
+ break;
+ case 97:
+ _stripManager._field2E8 = 0;
+ _action1.setActionIndex(5);
+ _action1.setDelay(1);
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 95 - Ship Close-up
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene95::Action1::signal() {
+ Scene95 *scene = (Scene95 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _state = 6;
+ setDelay(60);
+ break;
+ case 1:
+ if (_state) {
+ SceneItem::display(95, _state % 2, SET_FONT, 2,
+ SET_EXT_BGCOLOR, -1, SET_EXT_BGCOLOR, 20,
+ SET_WIDTH, 200, SET_KEEP_ONSCREEN, 1, SET_TEXT_MODE, 1, LIST_END);
+ --_state;
+ _actionIndex = 1;
+ }
+ setDelay(60);
+ break;
+ case 2: {
+ scene->_soundHandler.play(66);
+ scene->_object3._numFrames = 5;
+ scene->_object3.animate(ANIM_MODE_5, NULL);
+ SceneItem::display(0, 0);
+
+ Common::Point pt1(5, 198);
+ NpcMover *mover1 = new NpcMover();
+ _globals->_player.addMover(mover1, &pt1, this);
+
+ Common::Point pt2(9, 190);
+ NpcMover *mover2 = new NpcMover();
+ scene->_object1.addMover(mover2, &pt2, NULL);
+ break;
+ }
+ case 3: {
+ scene->_soundHandler.play(21);
+
+ Common::Point pt1(235, 72);
+ PlayerMover *mover1 = new PlayerMover();
+ _globals->_player.addMover(mover1, &pt1, NULL);
+
+ Common::Point pt2(235, 72);
+ PlayerMover *mover2 = new PlayerMover();
+ scene->_object1.addMover(mover2, &pt2, NULL);
+
+ SceneItem::display(95, 2, SET_Y, 45, SET_FONT, 2,
+ SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 13, SET_WIDTH, 200,
+ SET_KEEP_ONSCREEN, 1, LIST_END);
+ setDelay(240);
+ break;
+ }
+ case 4:
+ scene->_object3.remove();
+
+ SceneItem::display(95, 3, SET_Y, 45, SET_FONT, 2,
+ SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 35, SET_WIDTH, 200,
+ SET_KEEP_ONSCREEN, 1, LIST_END);
+ setDelay(240);
+ break;
+ case 5:
+ SceneItem::display(95, 4, SET_Y, 45, SET_FONT, 2,
+ SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 35, SET_WIDTH, 200,
+ SET_KEEP_ONSCREEN, 1, LIST_END);
+ setDelay(240);
+ break;
+ case 6:
+ setDelay(20);
+ break;
+ case 7: {
+ SceneItem::display(0, 0);
+ _globals->_player.setVisage(92);
+ _globals->_player.setPosition(Common::Point(-25, 200));
+ scene->_object1.setVisage(91);
+ scene->_object1.setPosition(Common::Point(-22, 220));
+
+ scene->_soundHandler.play(21);
+
+ Common::Point pt1(5, 198);
+ NpcMover *mover1 = new NpcMover();
+ _globals->_player.addMover(mover1, &pt1, this);
+
+ Common::Point pt2(9, 190);
+ NpcMover *mover2 = new NpcMover();
+ scene->_object1.addMover(mover2, &pt2, NULL);
+ break;
+ }
+ case 8: {
+ Common::Point pt1(108, 112);
+ PlayerMover *mover1 = new PlayerMover();
+ _globals->_player.addMover(mover1, &pt1, this);
+
+ Common::Point pt2(108, 112);
+ PlayerMover *mover2 = new PlayerMover();
+ scene->_object1.addMover(mover2, &pt2, NULL);
+ break;
+ }
+ case 9:
+ _globals->_sceneManager.changeScene(2300);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene95::Scene95() {
+}
+
+void Scene95::postInit(SceneObjectList *OwnerList) {
+ loadScene(95);
+ Scene::postInit();
+ setZoomPercents(100, 10, 200, 100);
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(2337);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player._strip = 4;
+ _globals->_player._moveDiff = Common::Point(30, 30);
+ _globals->_player.setPosition(Common::Point(-35, 200));
+ _globals->_player.changeZoom(-1);
+ _globals->_player.disableControl();
+
+ _object1.postInit();
+ _object1.setVisage(2333);
+ _object1.setPosition(Common::Point(-22, 220));
+ _object1.animate(ANIM_MODE_1, NULL);
+ _object1.setObjectWrapper(new SceneObjectWrapper());
+ _object1._moveDiff = Common::Point(30, 30);
+ _object1.changeZoom(-1);
+
+ _object3.postInit();
+ _object3.setVisage(96);
+ _object3.setPosition(Common::Point(29, 198));
+
+ _soundHandler.play(67);
+ setAction(&_action1);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 6100 - Sunflower navigation sequence
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene6100::Action1::signal() {
+ Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->showMessage(SCENE6100_CAREFUL, 13, this);
+ break;
+ case 1:
+ scene->showMessage(SCENE6100_TOUGHER, 35, this);
+ break;
+ case 2:
+ scene->showMessage(NULL, 0, NULL);
+ remove();
+ break;
+ }
+}
+
+void Scene6100::Action2::signal() {
+ Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->showMessage(SCENE6100_ONE_MORE_HIT, 13, this);
+ break;
+ case 1:
+ scene->showMessage(SCENE6100_DOING_BEST, 35, this);
+ break;
+ case 2:
+ scene->showMessage(NULL, 0, NULL);
+ remove();
+ break;
+ }
+}
+
+void Scene6100::Action3::signal() {
+ Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_speed = 0;
+ setDelay(60);
+ break;
+ case 1:
+ _globals->_scenePalette.clearListeners();
+ scene->_fadePercent = 100;
+ _globals->_scenePalette.refresh();
+ scene->loadScene(9997);
+ scene->_object1.hide();
+ scene->_object2.hide();
+ scene->_object3.hide();
+ scene->_sunflower1.hide();
+ scene->_sunflower2.hide();
+ scene->_sunflower3.hide();
+ scene->_rocks.hide();
+ scene->_sceneText.hide();
+
+ _globals->_events.setCursor(CURSOR_WALK);
+ scene->_stripManager.start(8120, this);
+ break;
+ case 2:
+ scene->showMessage(SCENE6100_REPAIR, 7, this);
+ break;
+ case 3:
+ scene->showMessage(NULL, 0, NULL);
+ _globals->_events.setCursor(CURSOR_WALK);
+ scene->_stripManager.start(8130, this);
+ break;
+ case 4:
+ _globals->setFlag(76);
+ _globals->_sceneManager.changeScene(
+ (scene->_stripManager._field2E8 == 135) ? 6100 : 2320);
+ remove();
+ break;
+ }
+}
+
+void Scene6100::Action4::signal() {
+ Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->showMessage(SCENE6100_ROCKY_AREA, 13, this);
+ break;
+ case 1:
+ scene->showMessage(SCENE6100_REPLY, 35, this);
+ break;
+ case 2:
+ scene->showMessage(NULL, 0, NULL);
+ remove();
+ break;
+ }
+}
+
+void Scene6100::Action5::dispatch() {
+ Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+ FloatSet zeroSet;
+ const double MULTIPLY_FACTOR = 0.01744; // 2 * pi / 360
+
+ if (scene->_turnAmount) {
+ scene->_angle = (scene->_turnAmount + scene->_angle) % 360;
+
+ for (int objIndex = 1; objIndex <= 3; ++objIndex) {
+ SceneObject *obj = &scene->_object1;
+ if (objIndex == 2) obj = &scene->_object2;
+ if (objIndex == 3) obj = &scene->_object3;
+
+ obj->_position.x += scene->_turnAmount * 2;
+ if (obj->_position.x >= 320)
+ obj->_position.x -= 480;
+ if (obj->_position.x < -160)
+ obj->_position.x += 480;
+ }
+ }
+
+ scene->_object1._flags |= OBJFLAG_PANES;
+ scene->_object2._flags |= OBJFLAG_PANES;
+ scene->_object3._flags |= OBJFLAG_PANES;
+
+ double distance = scene->_speed;
+ double angle = (double)scene->_angle * MULTIPLY_FACTOR;
+ scene->_probe._floats._float1 += sin(angle) * distance;
+ scene->_probe._floats._float2 += cos(angle) * distance;
+
+ for (int idx = 0; idx < 4; ++idx) {
+ FloatSet tempSet = scene->_objList[idx]->_floats;
+ tempSet.add(-scene->_probe._floats._float1, -scene->_probe._floats._float2,
+ -scene->_probe._floats._float3);
+
+ tempSet.proc1(scene->_angle * MULTIPLY_FACTOR);
+
+ double sqrtVal = tempSet.sqrt(zeroSet);
+ if (sqrtVal != 0.0) {
+ scene->_objList[idx]->_position.y = static_cast<int>(13800.0 / sqrtVal + 62.0);
+ }
+
+ scene->_objList[idx]->_position.x = static_cast<int>(
+ 160.0 - (330.0 / (tempSet._float2 + 330.0) * tempSet._float1));
+ scene->_objList[idx]->dispatch();
+
+ if (tempSet._float2 < 0) {
+ scene->_objList[idx]->_position.y = 300;
+
+ if (idx != 3) {
+ scene->_objList[idx]->_floats._float1 =
+ _globals->_randomSource.getRandomNumber(199);
+ scene->_objList[idx]->_floats._float2 =
+ _globals->_randomSource.getRandomNumber(999) + 750.0;
+
+ scene->_objList[idx]->_floats.proc1(
+ -(scene->_turnAmount * 10 + scene->_angle) * MULTIPLY_FACTOR);
+ scene->_objList[idx]->_floats.add(scene->_probe._floats._float1,
+ scene->_probe._floats._float2, scene->_probe._floats._float3);
+ }
+ }
+
+ if (idx == 3) {
+ scene->_rocksCheck = (ABS((int)tempSet._float1) < 100) && (tempSet._float2 > 0);
+ }
+
+ scene->_objList[idx]->_flags |= OBJFLAG_PANES;
+
+ if ((idx != 3) && (scene->_fadePercent == 100) &&
+ (tempSet.sqrt(zeroSet) < 150.0)) {
+ switch (scene->_hitCount++) {
+ case 0:
+ scene->_soundHandler.play(233);
+ scene->showMessage(NULL, 0, NULL);
+
+ if (!_globals->getFlag(76))
+ scene->_probe.setAction(&scene->_action1);
+ break;
+ case 1:
+ scene->_soundHandler.play(233);
+ scene->showMessage(NULL, 0, NULL);
+
+ if (!_globals->getFlag(76))
+ scene->_probe.setAction(&scene->_action2);
+ break;
+ case 2:
+ scene->_soundHandler.play(234);
+ scene->showMessage(NULL, 0, NULL);
+
+ if (!_globals->getFlag(76))
+ scene->_probe.setAction(NULL);
+ scene->setAction(&scene->_action3);
+ break;
+ }
+
+ _globals->_scenePalette.clearListeners();
+ scene->_fadePercent = 0;
+ }
+ }
+}
+
+void Scene6100::GetBoxAction::signal() {
+ Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ scene->_turnAmount = 0;
+ Common::Point pt(scene->_rocks._position.x, scene->_rocks._position.y + 10);
+ ProbeMover *mover = new ProbeMover();
+ scene->_probe.addMover(mover, &pt, NULL);
+ scene->_probe.show();
+ break;
+ }
+ case 1: {
+ scene->showMessage(SCENE6100_TAKE_CONTROLS, 35, this);
+ _globals->_scenePalette.clearListeners();
+
+ Common::Point pt(scene->_rocks._position.x, scene->_rocks._position.y - 10);
+ NpcMover *mover = new NpcMover();
+ scene->_probe.addMover(mover, &pt, NULL);
+ break;
+ }
+ case 2:
+ scene->_probe._percent = 4;
+ scene->showMessage(SCENE6100_SURPRISE, 13, this);
+ break;
+ case 3:
+ scene->showMessage(SCENE6100_SWEAT, 35, this);
+ break;
+ case 4:
+ scene->showMessage(SCENE6100_VERY_WELL, 13, this);
+ break;
+ case 5:
+ scene->showMessage(NULL, 0, NULL);
+ _globals->_sceneManager.changeScene(2320);
+ remove();
+ }
+}
+
+void Scene6100::GetBoxAction::dispatch() {
+ Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+
+ if (!scene->_probe._mover && (scene->_getBoxAction._actionIndex >= 1)) {
+ if (scene->_getBoxAction._actionIndex == 1) {
+ scene->_speed = 0;
+ scene->_getBoxAction.signal();
+ }
+
+ if (scene->_probe._percent > 4)
+ // Handle the probe disappearing into the rocks
+ scene->_probe._percent = scene->_probe._percent * 7 / 8;
+ scene->_probe._flags |= OBJFLAG_PANES;
+ }
+
+ Action::dispatch();
+}
+
+void Scene6100::Action7::signal() {
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(30);
+ break;
+ case 1:
+ setDelay(90);
+ break;
+ case 2:
+ _globals->_sceneManager.changeScene(2100);
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene6100::Object::synchronize(Serializer &s) {
+ SceneObject::synchronize(s);
+
+ // Save the double fields of the FloatSet
+ s.syncAsDouble(_floats._float1);
+ s.syncAsDouble(_floats._float2);
+ s.syncAsDouble(_floats._float3);
+ s.syncAsDouble(_floats._float4);
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene6100::ProbeMover::dispatch() {
+ Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+
+ if (!dontMove()) {
+ if (scene->_speed > 0) {
+ scene->_action5.dispatch();
+ scene->_speed = (scene->_speed * 4) / 5;
+ }
+ }
+
+ NpcMover::dispatch();
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene6100::Item1::doAction(int action) {
+ SceneItem::display2(4000, 0);
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene6100::Scene6100(): Scene() {
+ _objList[0] = &_sunflower1;
+ _objList[1] = &_sunflower2;
+ _objList[2] = &_sunflower3;
+ _objList[3] = &_rocks;
+
+ _speed = 30;
+ _fadePercent = 100;
+ _rocksCheck = false;
+ _hitCount = 0;
+ _turnAmount = 0;
+ _angle = 0;
+ _msgActive = false;
+
+ _globals->_sceneHandler._delayTicks = 8;
+
+ _globals->_player.disableControl();
+ _globals->_events.setCursor(CURSOR_WALK);
+}
+
+void Scene6100::synchronize(Serializer &s) {
+ Scene::synchronize(s);
+
+ s.syncAsSint16LE(_speed);
+ s.syncAsSint16LE(_fadePercent);
+ s.syncAsByte(_rocksCheck);
+ s.syncAsByte(_msgActive);
+ s.syncAsSint16LE(_hitCount);
+ s.syncAsSint16LE(_turnAmount);
+ s.syncAsSint16LE(_angle);
+}
+
+void Scene6100::postInit(SceneObjectList *OwnerList) {
+ loadScene(6100);
+ Scene::postInit();
+ setZoomPercents(62, 2, 200, 425);
+
+ _stripManager.addSpeaker(&_speakerQR);
+ _stripManager.addSpeaker(&_speakerSL);
+
+ _object1.postInit();
+ _object1.setVisage(6100);
+ _object1._frame = 1;
+ _object1._strip = 4;
+ _object1.setPosition(Common::Point(0, 60));
+ _object1.fixPriority(1);
+
+ _object2.postInit();
+ _object2.setVisage(6100);
+ _object2._frame = 1;
+ _object2._strip = 4;
+ _object2.setPosition(Common::Point(160, 60));
+ _object2.fixPriority(1);
+
+ _object3.postInit();
+ _object3.setVisage(6100);
+ _object3._frame = 1;
+ _object3._strip = 4;
+ _object3.setPosition(Common::Point(320, 60));
+ _object3.fixPriority(1);
+
+ _rocks.postInit();
+ _rocks.setVisage(6100);
+ _rocks._frame = 1;
+ _rocks._strip = 3;
+ _rocks.setPosition(Common::Point(320, 0));
+ _rocks.fixPriority(2);
+ _rocks.changeZoom(-1);
+ _rocks._floats._float1 = 320.0;
+ _rocks._floats._float2 = 25000.0;
+ _rocks._floats._float3 = 0.0;
+
+ _probe.postInit();
+ _probe._moveDiff = Common::Point(15, 15);
+ _probe.setVisage(6100);
+ _probe._frame = 1;
+ _probe._strip = 5;
+ _probe.setPosition(Common::Point(160, 260));
+ _probe.fixPriority(3);
+ _probe._floats._float1 = 320.0;
+ _probe._floats._float2 = 0.0;
+ _probe._floats._float3 = 0.0;
+ _probe.hide();
+
+ int baseVal = 2000;
+ for (int idx = 0; idx < 3; ++idx) {
+ _objList[idx]->_floats._float1 = _globals->_randomSource.getRandomNumber(999);
+ _objList[idx]->_floats._float2 = baseVal;
+ _objList[idx]->_floats._float3 = 0.0;
+ baseVal += _globals->_randomSource.getRandomNumber(499);
+
+ _objList[idx]->postInit();
+ _objList[idx]->setVisage(6100);
+ _objList[idx]->_frame = 1;
+ _objList[idx]->_strip = 2;
+
+ _objList[idx]->setPosition(Common::Point(
+ _globals->_randomSource.getRandomNumber(319), 60));
+ _objList[idx]->fixPriority(1);
+ _objList[idx]->changeZoom(-1);
+ }
+
+ setAction(&_action5);
+ _globals->_scenePalette.addRotation(96, 143, -1);
+
+ if (!_globals->getFlag(76))
+ _probe.setAction(&_action4);
+
+ _globals->_soundHandler.play(231);
+}
+
+void Scene6100::remove() {
+ _globals->_player.disableControl();
+ _globals->_scenePalette.clearListeners();
+ Scene::remove();
+}
+
+void Scene6100::process(Event &event) {
+ Scene::process(event);
+
+ if (event.eventType == EVENT_KEYPRESS) {
+ // Handle incremental turning speeds with arrow keys
+ if ((event.kbd.keycode == Common::KEYCODE_LEFT) || (event.kbd.keycode == Common::KEYCODE_KP4)) {
+ _turnAmount = MIN(_turnAmount + 1, 8);
+ } else if ((event.kbd.keycode == Common::KEYCODE_RIGHT) || (event.kbd.keycode == Common::KEYCODE_KP6)) {
+ _turnAmount = MAX(_turnAmount - 1, -8);
+ }
+ }
+
+ if (_probe._action)
+ _probe._action->process(event);
+}
+
+void Scene6100::dispatch() {
+ Scene::dispatch();
+
+ if (_probe._action)
+ _probe._action->dispatch();
+
+ // Handle mouse controlling the turning
+ int changeAmount = (_globals->_events._mousePos.x - 160) / -20;
+ _turnAmount += (changeAmount - _turnAmount) / 2;
+
+ if (_fadePercent < 100) {
+ _fadePercent += 10;
+ if (_fadePercent >= 100) {
+ _globals->_scenePalette.addRotation(96, 143, -1);
+ _fadePercent = 100;
+ }
+
+ byte adjustData[] = {0xff, 0xff, 0xff, 0};
+ _globals->_scenePalette.fade(adjustData, false, _fadePercent);
+ }
+
+ if (_action != &_action3) {
+ // Display the distance remaining to the target
+ int distance = (int)_probe._floats.sqrt(_rocks._floats);
+ Common::String s = Common::String::format("%06d", distance);
+
+ _sceneText.setPosition(Common::Point(24, 160));
+ _sceneText._fontNumber = 0;
+ _sceneText._color1 = 35;
+ _sceneText.setup(s);
+ }
+
+ if (_rocksCheck && (_action == &_action5)) {
+ // Check whether the probe is close enough to the rocks
+ double distance = _probe._floats.sqrt(_rocks._floats);
+
+ if ((distance >= 300.0) && (distance <= 500.0))
+ setAction(&_getBoxAction);
+ }
+}
+
+void Scene6100::showMessage(const Common::String &msg, int color, Action *action) {
+ if (_msgActive) {
+ _msgActive = false;
+ _speaker1.removeText();
+ }
+
+ if (!msg.empty()) {
+ _msgActive = true;
+ _speaker1._textPos.x = 20;
+ _speaker1._textWidth = 280;
+ _speaker1._color1 = color;
+ _speaker1._action = action;
+ _speaker1.setText(msg);
+ }
+}
+
+} // End of namespace tSage
diff --git a/engines/tsage/ringworld/ringworld_scenes1.h b/engines/tsage/ringworld/ringworld_scenes1.h
new file mode 100644
index 0000000000..dd64e563cd
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_scenes1.h
@@ -0,0 +1,538 @@
+/* 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_RINGWORLD_SCENES1_H
+#define TSAGE_RINGWORLD_SCENES1_H
+
+#include "common/scummsys.h"
+#include "tsage/ringworld/ringworld_logic.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"
+
+namespace tSage {
+
+class Scene10 : public Scene {
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2 : public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ Speaker _speakerSText;
+ Speaker _speakerQText;
+ Action1 _action1;
+ Action2 _action2;
+ SceneObject _object1, _object2, _object3;
+ SceneObject _object4, _object5, _object6;
+
+ virtual void stripCallback(int v);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+};
+
+class Scene15 : public Scene {
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ virtual void dispatch();
+ };
+public:
+ Action1 _action1;
+ SceneObject _object1;
+ ASound _soundHandler;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+};
+
+class Scene20 : public Scene {
+ /* 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();
+ };
+public:
+ SequenceManager _sequenceManager;
+ SpeakerQText _speakerQText;
+ SpeakerGameText _speakerGameText;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ SceneObject _sceneObject1, _SceneObjectExt, _sceneObject3, _sceneObject4, _sceneObject5;
+ ASound _sound;
+public:
+ Scene20();
+ virtual ~Scene20() {}
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene30 : public Scene {
+ /* Scene objects */
+ // Doorway beam sensor
+ class BeamObject : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ // Doorway object
+ class DoorObject : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ // Kzin object
+ class KzinObject : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+
+ /* Actions */
+ class BeamAction : public Action {
+ public:
+ virtual void signal();
+ };
+ class KzinAction : public Action {
+ public:
+ virtual void signal();
+ };
+ class RingAction : public Action {
+ public:
+ virtual void signal();
+ };
+ class TalkAction : public Action {
+ public:
+ virtual void signal();
+ };
+
+public:
+ ASound _sound;
+ DisplayHotspot _groundHotspot, _wallsHotspot, _courtyardHotspot, _treeHotspot;
+ BeamObject _beam;
+ DoorObject _door;
+ KzinObject _kzin;
+
+ BeamAction _beamAction;
+ KzinAction _kzinAction;
+ RingAction _ringAction;
+ TalkAction _talkAction;
+ SequenceManager _sequenceManager;
+
+ SpeakerSR _speakerSR;
+ SpeakerQL _speakerQL;
+ SpeakerSText _speakerSText;
+ SpeakerQText _speakerQText;
+public:
+ Scene30();
+ virtual ~Scene30() {}
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene40 : public Scene {
+ /* 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();
+ };
+ class Action5 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action6 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action7 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action8 : public Action {
+ public:
+ virtual void signal();
+ virtual void dispatch();
+ };
+
+ /* Objects */
+ class DyingKzin : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Assassin : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+
+ /* Items */
+ class Item2 : public SceneHotspot {
+ public:
+ virtual void doAction(int action);
+ };
+ class Item6 : public SceneHotspot {
+ public:
+ virtual void doAction(int action);
+ };
+ class Item8 : public SceneHotspot {
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ SequenceManager _sequenceManager;
+ SpeakerSL _speakerSL;
+ SpeakerQR _speakerQR;
+ SpeakerQText _speakerQText;
+ SpeakerSText _speakerSText;
+ SpeakerGameText _speakerGameText;
+ ASound _soundHandler;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ Action5 _action5;
+ Action6 _action6;
+ Action7 _action7;
+ Action8 _action8;
+ SceneObject _object1, _object2, _object3;
+ DyingKzin _dyingKzin;
+ Assassin _assassin;
+ SceneObject _doorway, _object7, _object8;
+ DisplayHotspot _item1;
+ Item2 _item2;
+ DisplayHotspot _item3, _item4, _item5;
+ Item6 _item6;
+ DisplayHotspot _item7, _item8;
+
+ Scene40();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene50 : public Scene {
+ /* 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();
+ };
+
+ /* Objects */
+ class Object1 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Object2 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Object3 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Object4 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+
+public:
+ SequenceManager _sequenceManager;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Object1 _object1;
+ Object2 _object2;
+ Object3 _object3;
+ Object4 _object4;
+ Rect _doorwayRect;
+ SpeakerSText _speakerSText;
+ SpeakerQText _speakerQText;
+ DisplayHotspot _item0, _item1, _item2;
+ DisplayHotspot _item3, _item4, _item5;
+
+ Scene50();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene60 : public Scene {
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2 : public Action {
+ public:
+ virtual void signal();
+ };
+ class PrevObject : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class NextObject : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class ExitObject : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class MessageObject : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class ControlObject : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class SlaveObject : public SceneObjectExt {
+ public:
+ virtual void doAction(int action);
+ };
+ class MasterObject : public SceneObjectExt {
+ public:
+ virtual void doAction(int action);
+ };
+ class FloppyDrive : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Item1 : public SceneHotspot {
+ public:
+ virtual void doAction(int action);
+ };
+ class Item : public SceneHotspot {
+ public:
+ int _messageNum, _sceneMode;
+
+ Item(int sceneRegionId, int messageNum, int sceneMode) {
+ _sceneRegionId = sceneRegionId;
+ _messageNum = messageNum;
+ _sceneMode = sceneMode;
+ }
+ virtual void doAction(int action);
+ };
+
+public:
+ GfxButton _gfxButton;
+ SequenceManager _sequenceManager;
+ SpeakerQText _speakerQText;
+ SpeakerSText _speakerSText;
+ Action1 _action1;
+ Action2 _action2;
+ SceneObject _rose;
+ PrevObject _prevButton;
+ NextObject _nextButton;
+ ExitObject _exitButton;
+ MessageObject _message;
+ ControlObject _controlButton;
+ SlaveObject _slaveButton;
+ MasterObject _masterButton;
+ FloppyDrive _floppyDrive;
+ SceneObject _redLights;
+ Item1 _item1;
+ Item _item2, _item3, _item4, _item5, _item6;
+ ASound _soundHandler1;
+ ASound _soundHandler2;
+ ASound _soundHandler3;
+
+ Scene60();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+};
+
+class Scene90 : public Scene {
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Object1 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Object2 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ SequenceManager _sequenceManager;
+ SpeakerSText _speakerSText;
+ SpeakerQText _speakerQText;
+ SpeakerQL _speakerQL;
+ SpeakerSR _speakerSR;
+ SpeakerMText _speakerMText;
+ Action1 _action1;
+ Object1 _object1;
+ Object2 _object2;
+ DisplayObject _object3, _object4, _object5;
+ SceneObject _object6;
+ DisplayHotspot _item1, _item2, _item3;
+ ASound _soundHandler1, _soundHandler2;
+
+ Scene90();
+
+ virtual void stripCallback(int v);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene95 : public Scene {
+ class Action1 : public ActionExt {
+ public:
+ virtual void signal();
+ };
+
+public:
+ Action1 _action1;
+ SceneObject _object1, _object2, _object3;
+ ASound _soundHandler;
+
+ Scene95();
+ virtual void postInit(SceneObjectList *OwnerList);
+};
+
+class Scene6100 : public Scene {
+ /* 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();
+ };
+ class Action5 : public Action {
+ public:
+ virtual void dispatch();
+ };
+ class GetBoxAction : public Action {
+ public:
+ virtual void signal();
+ virtual void dispatch();
+ };
+ class Action7 : public Action {
+ public:
+ virtual void signal();
+ };
+
+ /* Objects */
+ class Object : public SceneObject {
+ public:
+ FloatSet _floats;
+
+ virtual void synchronize(Serializer &s);
+ };
+ class ProbeMover : public NpcMover {
+ public:
+ virtual void dispatch();
+ };
+
+ /* Items */
+ class Item1 : public SceneItem {
+ public:
+ virtual void doAction(int action);
+ };
+
+public:
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ Action5 _action5;
+ GetBoxAction _getBoxAction;
+ Action7 _action7;
+ ASound _soundHandler;
+ Speaker _speaker1;
+ SpeakerQR _speakerQR;
+ SpeakerSL _speakerSL;
+ SceneObject _object1, _object2, _object3;
+ Object _rocks, _probe;
+ Object _sunflower1, _sunflower2, _sunflower3;
+ SceneText _sceneText;
+ SceneItem _item1;
+
+ int _turnAmount, _angle, _speed, _fadePercent;
+ int _hitCount;
+ bool _rocksCheck;
+ Object *_objList[4];
+ bool _msgActive;
+
+ Scene6100();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void process(Event &event);
+ virtual void dispatch();
+ void showMessage(const Common::String &msg, int color, Action *action);
+
+};
+
+} // End of namespace tSage
+
+#endif
diff --git a/engines/tsage/ringworld/ringworld_scenes10.cpp b/engines/tsage/ringworld/ringworld_scenes10.cpp
new file mode 100644
index 0000000000..1cff5d0aaf
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_scenes10.cpp
@@ -0,0 +1,2089 @@
+/* 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 "graphics/cursorman.h"
+#include "tsage/ringworld/ringworld_scenes10.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+
+namespace tSage {
+
+Scene2::Scene2() : Scene() {
+ _sceneState = 0;
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Object9350::postInit(SceneObjectList *OwnerList) {
+ //SceneObject::postInit(&_globals->_sceneManager._altSceneObjects);
+ SceneObject::postInit(OwnerList);
+}
+
+void Object9350::draw() {
+ reposition();
+ Rect destRect = _bounds;
+ destRect.translate(-_globals->_sceneOffset.x, -_globals->_sceneOffset.y);
+ Region *priorityRegion = _globals->_sceneManager._scene->_priorities.find(_globals->_sceneManager._scene->_stripManager._stripNum);
+ GfxSurface frame = getFrame();
+ _globals->gfxManager().copyFrom(frame, destRect, priorityRegion);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9100 - Near beach: Slave washing clothes
+ *
+ *--------------------------------------------------------------------------*/
+void Scene9100::SceneHotspot1::doAction(int action) {
+ Scene9100 *scene = (Scene9100 *)_globals->_sceneManager._scene;
+
+ if (action == CURSOR_TALK) {
+ if (_globals->getFlag(23)) {
+ _globals->_player.disableControl();
+ scene->_sceneMode = 9104;
+ } else {
+ _globals->setFlag(23);
+ _globals->_player.disableControl();
+ scene->_sceneMode = 9105;
+ }
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &_globals->_player, &scene->_object5, &scene->_object6, NULL);
+ } else {
+ NamedHotspot::doAction(action);
+ }
+}
+
+void Scene9100::dispatch() {
+ Scene9100 *scene = (Scene9100 *)_globals->_sceneManager._scene;
+
+ if (!_action) {
+ if (_globals->_player._position.x < 25) {
+ _globals->_player.disableControl();
+ if (!_globals->getFlag(23) || _globals->getFlag(11))
+ _sceneMode = 9106;
+ else {
+ _sceneMode = 9108;
+ _globals->setFlag(11);
+ }
+
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &_globals->_player, NULL);
+ }
+ } else {
+ Scene::dispatch();
+ }
+}
+
+void Scene9100::signal() {
+ Scene9100 *scene = (Scene9100 *)_globals->_sceneManager._scene;
+
+ switch (scene->_sceneMode) {
+ case 9102:
+ case 9106:
+ case 9108:
+ _globals->_sceneManager.changeScene(9150);
+ break;
+ case 9105:
+ _sceneHotspot3.remove();
+ // No break on purpose
+ case 9103:
+ case 9104:
+ case 9107:
+ case 9109:
+ default:
+ _globals->_player.enableControl();
+ break;
+ }
+}
+
+void Scene9100::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ setZoomPercents(0, 100, 200, 100);
+ _object1.postInit();
+ _object1.setVisage(9100);
+ _object1._strip = 1;
+ _object1._numFrames = 6;
+ _object1.setPosition(Common::Point(279, 132));
+ _object1.animate(ANIM_MODE_2, NULL);
+ _object1.fixPriority(10);
+
+ _globals->_player.postInit();
+
+ _object2.postInit();
+ _object2.hide();
+
+ _object3.postInit();
+ _object3.hide();
+
+ _object4.postInit();
+ _object4.hide();
+
+ _object5.postInit();
+ _object5.hide();
+
+ if (!_globals->getFlag(23)) {
+ _object6.postInit();
+ _object6.setVisage(9111);
+ _object6.setStrip(6);
+ _object6.setFrame(1);
+ _object6.setPosition(Common::Point(138, 166));
+ _sceneHotspot3.setup(145, 125, 166, 156, 9100, 40, 43);
+ }
+ _sceneHotspot1.setup(140, 176, 185, 215, 9100, 36, 37);
+ _sceneHotspot2.setup(161, 138, 182, 175, 9100, 38, 39);
+ _sceneHotspot4.setup(37, 196, 47, 320, 9100, 44, -1);
+ _sceneHotspot5.setup(69, 36, 121, 272, 9100, 45, 46);
+ _sceneHotspot6.setup(127, 0, 200, 52, 9100, 47, 48);
+
+ _globals->_soundHandler.play(251);
+ if (_globals->_sceneManager._previousScene == 9150) {
+ if (_globals->getFlag(20)) {
+ _globals->_player.disableControl();
+ if (_globals->getFlag(11))
+ _sceneMode = 9107;
+ else
+ _sceneMode = 9109;
+ setAction(&_sequenceManager, this, _sceneMode, &_globals->_player, &_object5, NULL);
+ } else {
+ _sceneMode = 9103;
+ _globals->_player.disableControl();
+ setAction(&_sequenceManager, this, _sceneMode, &_globals->_player, &_object2, &_object3, &_object4, &_object5, NULL);
+ _globals->setFlag(20);
+ }
+ } else {
+ _sceneMode = 9102;
+ _globals->_player.disableControl();
+ setAction(&_sequenceManager, this, _sceneMode, &_globals->_player, &_object2, &_object3, &_object4, &_object5, NULL);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9150 - Castle: Outside the bulwarks
+ *
+ *--------------------------------------------------------------------------*/
+void Scene9150::Object3::signal() {
+ switch (_signalFlag++) {
+ case 0:
+ _timer = 10 + _globals->_randomSource.getRandomNumber(90);
+ break;
+ default:
+ animate(ANIM_MODE_5, this);
+ _signalFlag = 0;
+ break;
+ }
+}
+
+void Scene9150::Object3::dispatch() {
+ SceneObject::dispatch();
+ if ((_timer != 0) && (--_timer == 0))
+ signal();
+}
+
+void Scene9150::signal() {
+ switch (_sceneMode) {
+ case 9151:
+ case 9157:
+ _globals->_sceneManager.changeScene(9100);
+ break;
+ case 9153:
+ _globals->_sceneManager.changeScene(9300);
+ break;
+ case 9152:
+ case 9155:
+ case 9156:
+ _globals->_player.enableControl();
+ break;
+ case 9154:
+ default:
+ break;
+ }
+}
+
+void Scene9150::dispatch() {
+
+ if ((_sceneState != 0) && (_sceneBounds.left == 0)) {
+ _object3._timer = 0;
+ _sceneState = 0;
+ _object3.setAction(&_sequenceManager2, NULL, 9154, &_object3, NULL);
+ _sceneHotspot10.remove();
+ }
+
+ if (_action) {
+ _action->dispatch();
+ } else {
+ if (_globals->_player._position.x >= 160) {
+ if (_globals->_player._position.x > 630) {
+ _globals->_player.disableControl();
+ _sceneMode = 9157;
+ setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, NULL);
+ }
+ } else {
+ _globals->_player.disableControl();
+ if (_globals->getFlag(11)) {
+ _globals->_soundHandler.play(286);
+ _sceneMode = 9153;
+ } else {
+ _sceneMode = 9156;
+ }
+ setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, NULL);
+ }
+ }
+}
+
+void Scene9150::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ setZoomPercents(0, 100, 200, 100);
+ _globals->_player.postInit();
+
+ _object3.postInit();
+ _sceneState = 1;
+ _object3.setVisage(9151);
+ _object3._strip = 1;
+ _object3._frame = 1;
+ _object3.setPosition(Common::Point(312, 95));
+ _object3.signal();
+
+ _sceneHotspot1.setup(0, 0, 200, 94, 9150, 46, -1);
+ _sceneHotspot2.setup(51, 90, 118, 230, 9150, 47, -1);
+ _sceneHotspot3.setup(182, 104, 200, 320, 9150, 48, 49);
+ _sceneHotspot4.setup(103, 292, 152, 314, 9150, 50, 51);
+ _sceneHotspot5.setup(115, 350, 160, 374, 9150, 52, 53);
+ _sceneHotspot6.setup(0, 471, 200, 531, 9150, 54, 55);
+ _sceneHotspot7.setup(170, 320, 185, 640, 9150, 56, -1);
+ _sceneHotspot9.setup(157, 107, 186, 320, 9150, 56, -1);
+ _sceneHotspot8.setup(133, 584, 142, 640, 9150, 57, -1);
+ _sceneHotspot10.setup(83, 304, 103, 323, 9150, 58, 59);
+
+ _globals->_soundHandler.play(285);
+ _globals->_player.disableControl();
+
+ if (_globals->getFlag(20)) {
+ // Walking alone
+ _globals->_scrollFollower = &_globals->_player;
+ if (_globals->getFlag(11))
+ // Hero wearing peasan suit
+ _sceneMode = 9155;
+ else
+ // Hero wearing Purple suit
+ _sceneMode = 9152;
+ setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, NULL);
+ } else {
+ // Walking with the tiger
+ _sceneMode = 9151;
+ _object2.postInit();
+ _object2.hide();
+ _object1.postInit();
+ setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, &_object1, &_object2, NULL);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9200 - Castle: Near the fountain
+ *
+ *--------------------------------------------------------------------------*/
+void Scene9200::SceneHotspot1::doAction(int action) {
+ Scene9200 *scene = (Scene9200 *)_globals->_sceneManager._scene;
+
+ if (action == OBJECT_TUNIC) {
+ _globals->_player.disableControl();
+ if (_globals->getFlag(93)) {
+ scene->_sceneState = 9214;
+ scene->setAction(&scene->_sequenceManager, scene, 9214, &_globals->_player, &scene->_object2, NULL);
+ } else {
+ _globals->setFlag(93);
+ scene->_sceneState = 9213;
+ scene->setAction(&scene->_sequenceManager, scene, 9213, &_globals->_player, &scene->_object2, NULL);
+ }
+ } else if (action <= 100) {
+ _globals->_player.disableControl();
+ scene->_sceneState = 9214;
+ scene->setAction(&scene->_sequenceManager, scene, 9214, &_globals->_player, &scene->_object2, NULL);
+ } else {
+ NamedHotspot::doAction(action);
+ }
+}
+
+void Scene9200::signal() {
+ switch (_sceneState++) {
+ case 9207:
+ _globals->_sceneManager.changeScene(9700);
+ break;
+ case 9208:
+ case 9211:
+ case 9212:
+ _globals->_sceneManager.changeScene(9500);
+ break;
+ case 9209:
+ _globals->_sceneManager.changeScene(9360);
+ break;
+ case 9210:
+ _hotspot1.remove();
+ // No break on purpose
+ case 9201:
+ case 9202:
+ case 9203:
+ case 9204:
+ case 9205:
+ case 9206:
+ default:
+ _globals->_player.enableControl();
+ break;
+ }
+}
+
+void Scene9200::process(Event &event) {
+ Scene::process(event);
+}
+
+void Scene9200::dispatch() {
+// Rect rect9200 = Rect(320, 175, 250, 154);
+ Rect rect9200 = Rect(250, 154, 320, 175);
+
+ if (_action) {
+ _action->dispatch();
+ } else {
+ if ( (_globals->_player._position.x <= 0) || ((_globals->_player._position.x < 100) && (_globals->_player._position.y > 199))) {
+ _globals->_player.disableControl();
+ _sceneState = 9209;
+ setAction(&_sequenceManager, this, 9209, &_globals->_player, &_object2, &_object3, NULL);
+ } else {
+ if (rect9200.contains(_globals->_player._position)) {
+ if (_globals->getFlag(93)) {
+ if (_globals->getFlag(86)) {
+ _sceneState = 9215;
+ setAction(&_sequenceManager, this, 9215, &_globals->_player, &_object2, &_object3, NULL);
+ } else {
+ _sceneState = 9208;
+ setAction(&_sequenceManager, this, 9208, &_globals->_player, &_object2, &_object3, NULL);
+ }
+ } else {
+ _globals->_player.disableControl();
+ _sceneState = 9204;
+ setAction(&_sequenceManager, this, 9204, &_globals->_player, &_object2, &_object3, NULL);
+ }
+ } else {
+ if (_globals->_player._position.y < 140) {
+ _globals->_player.disableControl();
+ _sceneState = 9207;
+ setAction(&_sequenceManager, this, 9207, &_globals->_player, &_object2, &_object3, NULL);
+ }
+ }
+ }
+ }
+}
+
+void Scene9200::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ setZoomPercents(130, 50, 200, 150);
+
+ _globals->_player.postInit();
+ _object3.postInit();
+ _object3.hide();
+ _object1.postInit();
+ // Water animation
+ _object1.setVisage(9200);
+ _object1._strip = 3;
+ _object1.animate(ANIM_MODE_2, NULL);
+ _object1.setPosition(Common::Point(132, 114));
+ _object1.fixPriority(140);
+ _soundHandler.play(297);
+
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerGR);
+ _stripManager.addSpeaker(&_speakerGText);
+
+ if (!_globals->getFlag(86)) {
+ _object2.postInit();
+ _hotspot1.setup(96, 194, 160, 234, 9200, 29, 31);
+ }
+ _hotspot2.setup(164, 0, 200, 282, 9200, 0, 1);
+ _hotspot3.setup(140, 39, 165, 153, 9200, 2, 3);
+ _hotspot4.setup(92, 122, 139, 152, 9200, 4, 5);
+ _hotspot5.setup(33, 20, 142, 115, 9200, 6, 7);
+ _hotspot6.setup(104, 235, 153, 265, 9200, 8, 9);
+ _hotspot7.setup(107, 262, 153, 286, 9200, 10, 11);
+ _hotspot8.setup(69, 276, 164, 320, 9200, 12, 13);
+
+ _globals->_events.setCursor(CURSOR_WALK);
+ _globals->_player.disableControl();
+
+ switch (_globals->_sceneManager._previousScene) {
+ case 9500:
+ if (_globals->getFlag(85)) {
+ if (RING_INVENTORY._helmet._sceneNumber == 1) {
+ _globals->setFlag(86);
+ _globals->_player.disableControl();
+ _sceneState = 9210;
+ setAction(&_sequenceManager, this, 9210, &_globals->_player, &_object2, &_object3, NULL);
+ } else {
+ _globals->_player.disableControl();
+ _sceneState = 9212;
+ setAction(&_sequenceManager, this, 9212, &_globals->_player, &_object2, &_object3, NULL);
+ }
+ } else {
+ if (RING_INVENTORY._helmet._sceneNumber == 1) {
+ _globals->_player.disableControl();
+ _sceneState = 9211;
+ setAction(&_sequenceManager, this, 9211, &_globals->_player, &_object2, &_object3, NULL);
+ } else {
+ _globals->_player.disableControl();
+ _sceneState = 9202;
+ setAction(&_sequenceManager, this, 9202, &_globals->_player, &_object2, &_object3, NULL);
+ }
+ }
+ break;
+ case 9700:
+ if (_globals->getFlag(86)) {
+ _sceneState = 9206;
+ setAction(&_sequenceManager, this, 9206, &_globals->_player, &_object2, &_object3, NULL);
+ } else {
+ _sceneState = 9203;
+ setAction(&_sequenceManager, this, 9203, &_globals->_player, &_object2, &_object3, NULL);
+ }
+ break;
+ case 9360:
+ default:
+ if (_globals->getFlag(86)) {
+ _sceneState = 9205;
+ setAction(&_sequenceManager, this, 9205, &_globals->_player, &_object2, &_object3, NULL);
+ } else {
+ _sceneState = 9201;
+ setAction(&_sequenceManager, this, 9201, &_globals->_player, &_object2, &_object3, NULL);
+ }
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9300 - Castle: In front of a large guarded door
+ *
+ *--------------------------------------------------------------------------*/
+void Scene9300::signal() {
+ switch (_sceneMode++) {
+ case 9301:
+ _globals->setFlag(84);
+ // No break on purpose
+ case 9303:
+ _globals->_soundHandler.play(295);
+ _globals->_sceneManager.changeScene(9350);
+ break;
+ case 9302:
+ _globals->_player.enableControl();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene9300::dispatch() {
+ if (_action) {
+ _action->dispatch();
+ } else if (_globals->_player._position.y < 145) {
+ _globals->_player.disableControl();
+ _sceneMode = 9303;
+ setAction(&_sequenceManager, this, 9303, &_globals->_player, &_object1, &_object2, NULL);
+ }
+}
+
+void Scene9300::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ setZoomPercents(130, 75, 230, 150);
+
+ _sceneMode = 0;
+ _globals->_player.postInit();
+ _globals->_player.changeZoom(-1);
+ _object1.postInit();
+ _object2.postInit();
+ _globals->_soundHandler.play(289);
+
+ _hotspot1.setup(35, 142, 76, 212, 9300, 0, 1);
+ _hotspot2.setup(28, 90, 81, 143, 9300, 2, 3);
+ _hotspot3.setup(78, 142, 146, 216, 9300, 4, 5);
+ _hotspot4.setup(3, 43, 91, 74, 9300, 6, 7);
+ _hotspot5.setup(82, 19, 157, 65, 9300, 8, 9);
+ _hotspot6.setup(5, 218, 84, 274, 9300, 10, 11);
+ _hotspot7.setup(86, 233, 168, 293, 9300, 12, 13);
+ _hotspot8.setup(157, 0, 200, 230, 9300, 14, 15);
+ _hotspot9.setup(169, 227, 200, 320, 9300, 16, 17);
+ _hotspot10.setup(145, 97, 166, 225, 9300, 18, 19);
+ _hotspot11.setup(81, 75, 145, 145, 9300, 20, 21);
+ _hotspot12.setup(0, 0, 94, 35, 9300, 22, 23);
+ _hotspot13.setup(12, 268, 149, 320, 9300, 24, 25);
+
+ if (_globals->_sceneManager._previousScene == 9350) {
+ _globals->_player.disableControl();
+ _sceneMode = 9302;
+ setAction(&_sequenceManager, this, 9302, &_globals->_player, &_object1, &_object2, NULL);
+ } else {
+ _globals->_player.disableControl();
+ _sceneMode = 9301;
+ setAction(&_sequenceManager, this, 9301, &_globals->_player, &_object1, &_object2, NULL);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9350 - Castle: In a hallway
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene9350::signal() {
+ switch (_sceneState ++) {
+ case 0:
+ case 9352:
+ case 9353:
+ case 9354:
+ _globals->_player.enableControl();
+ break;
+ case 9355:
+ _globals->_sceneManager.changeScene(9300);
+ break;
+ case 9356:
+ _globals->_sceneManager.changeScene(9360);
+ break;
+ case 9357:
+ case 9359:
+ _globals->_sceneManager.changeScene(9400);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene9350::dispatch() {
+ if (_action == 0) {
+ if ((_globals->_player._position.x > 300) && (_globals->_player._position.y < 160)) {
+ _globals->_player.disableControl();
+ _sceneState = 9356;
+ setAction(&_sequenceManager, this, 9356, &_globals->_player, &_object2, NULL);
+ } else if ((_globals->_player._position.x > 110) && (_globals->_player._position.y >= 195)) {
+ _globals->_player.disableControl();
+ _sceneState = 9357;
+ setAction(&_sequenceManager, this, 9357, &_globals->_player, &_object2, NULL);
+ } else if ((_globals->_player._position.x < 10) || ((_globals->_player._position.x <= 110) && (_globals->_player._position.y >= 195))) {
+ _globals->_player.disableControl();
+ _sceneState = 9355;
+ setAction(&_sequenceManager, this, 9355, &_globals->_player, &_object2, NULL);
+ }
+ } else {
+ Scene::dispatch();
+ }
+}
+
+void Scene9350::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ setZoomPercents(95, 80, 200, 100);
+ _globals->_player.postInit();
+
+ _object1.setup(9351, 1, 3, 139, 97, 0);
+ _sceneHotspot1.setup(42, 0, 97, 60, 9350, 0, -1);
+ _sceneHotspot2.setup(37, 205, 82, 256, 9350, 0, -1);
+ _sceneHotspot3.setup(29, 93, 92, 174, 9350, 1, -1);
+ _sceneHotspot4.setup(0, 308, 109, 320, 9350, 2, -1);
+ _sceneHotspot5.setup(0, 0, 200, 320, 9350, 3, -1);
+
+ _globals->_events.setCursor(CURSOR_WALK);
+ _globals->_player.disableControl();
+
+ if (_globals->_sceneManager._previousScene == 9360) {
+ _globals->_player.disableControl();
+ _sceneState = 9352;
+ setAction(&_sequenceManager, this, 9352, &_globals->_player, &_object2, NULL);
+ } else if (_globals->_sceneManager._previousScene == 9400) {
+ _globals->_player.disableControl();
+ _sceneState = 9353;
+ setAction(&_sequenceManager, this, 9353, &_globals->_player, &_object2, NULL);
+ } else {
+ if (_globals->getFlag(84)) {
+ _globals->clearFlag(84);
+ _object2.postInit();
+ _globals->_player.disableControl();
+ _sceneState = 9359;
+ setAction(&_sequenceManager, this, 9359, &_globals->_player, &_object2, NULL);
+ } else {
+ _globals->_player.disableControl();
+ _sceneState = 9354;
+ setAction(&_sequenceManager, this, 9354, &_globals->_player, &_object2, NULL);
+ }
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9360 - Castle: In a hallway
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene9360::signal() {
+ switch (_sceneState ++) {
+ case 0:
+ case 9362:
+ case 9363:
+ case 9364:
+ _globals->_player.enableControl();
+ break;
+ case 9365:
+ _globals->_sceneManager.changeScene(9350);
+ break;
+ case 9366:
+ _globals->_sceneManager.changeScene(9200);
+ break;
+ case 9367:
+ _globals->_sceneManager.changeScene(9450);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene9360::dispatch() {
+ if (_action == 0) {
+ if ((_globals->_player._position.x > 300) && (_globals->_player._position.y < 160)) {
+ _globals->_player.disableControl();
+ _sceneState = 9366;
+ setAction(&_sequenceManager, this, 9366, &_globals->_player, NULL);
+ } else if ((_globals->_player._position.x > 110) && (_globals->_player._position.y >= 195)) {
+ _globals->_player.disableControl();
+ _sceneState = 9367;
+ setAction(&_sequenceManager, this, 9367, &_globals->_player, NULL);
+ } else if ((_globals->_player._position.x < 10) || ((_globals->_player._position.x <= 110) && (_globals->_player._position.y >= 195))) {
+ _globals->_player.disableControl();
+ _sceneState = 9365;
+ setAction(&_sequenceManager, this, 9365, &_globals->_player, NULL);
+ }
+ } else {
+ Scene::dispatch();
+ }
+}
+
+void Scene9360::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ setZoomPercents(95, 80, 200, 100);
+ _globals->_player.postInit();
+
+ _hotspot1.setup(37, 92, 93, 173, 9360, 0, 1);
+ _hotspot2.setup(42, 0, 100, 63, 9360, 2, -1);
+ _hotspot3.setup(36, 205, 82, 260, 9360, 3, -1);
+ _hotspot4.setup(103, 2, 200, 320, 9360, 4, -1);
+ _hotspot5.setup(0, 0, 37, 320, 9360, 4, -1);
+ _hotspot6.setup(35, 61, 103, 92, 9360, 4, -1);
+ _hotspot7.setup(33, 174, 93, 207, 9360, 4, -1);
+ _hotspot8.setup(28, 257, 149, 320, 9360, 4, -1);
+ _globals->_events.setCursor(CURSOR_WALK);
+ _globals->_player.disableControl();
+ if (_globals->_sceneManager._previousScene == 9350) {
+ _globals->_player.disableControl();
+ _sceneState = 9364;
+ setAction(&_sequenceManager, this, 9364, &_globals->_player, NULL);
+ } else if (_globals->_sceneManager._previousScene == 9450) {
+ _globals->_player.disableControl();
+ _sceneState = 9363;
+ setAction(&_sequenceManager, this, 9363, &_globals->_player, NULL);
+ } else {
+ _globals->_player.disableControl();
+ _sceneState = 9362;
+ setAction(&_sequenceManager, this, 9362, &_globals->_player, NULL);
+ }
+ _object1.setup(9351, 1, 1, 131, 90, 0);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9400 - Castle: Black-Smith room
+ *
+ *--------------------------------------------------------------------------*/
+Scene9400::Scene9400() {
+ _field1032 = 0;
+}
+
+void Scene9400::SceneHotspot7::doAction(int action) {
+ Scene9400 *scene = (Scene9400 *)_globals->_sceneManager._scene;
+
+ if ((action == CURSOR_USE) && (RING_INVENTORY._straw._sceneNumber != 1)) {
+ scene->_sceneState = 1;
+ RING_INVENTORY._straw._sceneNumber = 1;
+ scene->setAction(&scene->_sequenceManager, scene, 9408, &_globals->_player, NULL);
+ } else {
+ NamedHotspot::doAction(action);
+ }
+}
+
+void Scene9400::SceneHotspot8::doAction(int action) {
+ Scene9400 *scene = (Scene9400 *)_globals->_sceneManager._scene;
+
+ if (action == CURSOR_TALK) {
+ _globals->_player.disableControl();
+ scene->_sceneState = 2;
+ scene->signal();
+ } else {
+ NamedHotspot::doAction(action);
+ }
+}
+
+void Scene9400::signal() {
+ switch (_sceneState ++) {
+ case 0:
+ _object1._numFrames = 6;
+ _stripManager.start(9400, this);
+ break;
+ case 1:
+ _object1._numFrames = 6;
+ _object1.animate(ANIM_MODE_2, NULL);
+ _globals->_player.enableControl();
+ break;
+ case 2:
+ _object1.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ _stripManager.start(9405, this);
+ break;
+ case 4:
+ _object1.animate(ANIM_MODE_2, this);
+ _globals->_player.enableControl();
+ break;
+ case 9350:
+ _globals->_sceneManager.changeScene(9350);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene9400::dispatch() {
+ if ((_object1._animateMode == 2) && (_object1._strip == 1) && (_object1._frame == 4)){
+ if (_field1032 == 0) {
+ _soundHandler.play(296);
+ _field1032 = 1;
+ }
+ } else {
+ _field1032 = 0;
+ }
+ if (_action == 0) {
+ if (_globals->_player._position.y < 120) {
+ _sceneState = 9350;
+ _globals->_player.disableControl();
+ setAction(&_action1);
+ Common::Point pt(-45, 88);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ }
+ } else {
+ Scene::dispatch();
+ }
+}
+
+void Scene9400::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ _screenNumber = 9400;
+ setZoomPercents(0, 100, 200, 100);
+ _globals->_player.postInit();
+ _object1.postInit();
+ _object3.postInit();
+ _speakerQText._textPos.x = 20;
+
+ _hotspot7.setup(157, 66, 180, 110, 9400, 21, 23);
+ _hotspot5.setup(130, 133, 152, 198, 9400, 22, -1);
+ _hotspot1.setup(33, 280, 69, 297, 9400, 1, 2);
+ _hotspot2.setup(73, 96, 87, 159, 9400, 3, 4);
+ _hotspot3.setup(89, 253, 111, 305, 9400, 5, 6);
+ _hotspot4.setup(46, 0, 116, 35, 9400, 7, 8);
+ _hotspot8.setup(58, 169, 122, 200, 9400, 9, 10);
+ _hotspot6.setup(0, 0, 199, 319, 9400, 16, 0);
+
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerOR);
+ _stripManager.addSpeaker(&_speakerOText);
+
+ _globals->_events.setCursor(CURSOR_WALK);
+ _globals->_player.disableControl();
+
+ // Useless check (skipped) : if (_globals->_sceneManager._previousScene == 9350)
+ _sceneState = 2;
+ if (!_globals->getFlag(89)) {
+ _globals->setFlag(89);
+ _sceneState = 0;
+ }
+
+ setAction(&_sequenceManager, this, 9400, &_globals->_player, &_object1, &_object3, NULL);
+}
+
+void Scene9400::synchronize(Serializer &s) {
+ Scene::synchronize(s);
+ if (s.getVersion() >= 3)
+ s.syncAsSint16LE(_field1032);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9450 - Castle: Dining room
+ *
+ *--------------------------------------------------------------------------*/
+void Scene9450::Object2::signal() {
+ Scene9450 *scene = (Scene9450 *)_globals->_sceneManager._scene;
+
+ this->setAction(&scene->_sequenceManager3, this, 9458, this, &scene->_object1, NULL);
+}
+
+void Scene9450::Object3::dispatch() {
+ SceneObject::dispatch();
+ _percent = (_percent * 20) / 30;
+}
+
+void Scene9450::Hotspot1::doAction(int action) {
+ Scene9450 *scene = (Scene9450 *)_globals->_sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ if (scene->_object2._action)
+ scene->_object2._action->remove();
+ scene->_sceneMode = 9459;
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_sequenceManager1, scene, 9459, &scene->_object2, &scene->_object1, &scene->_object3, &_globals->_player, NULL);
+ } else {
+ NamedHotspot::doAction(action);
+ }
+}
+
+void Scene9450::Hotspot3::doAction(int action) {
+ Scene9450 *scene = (Scene9450 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case OBJECT_CLOAK:
+ case OBJECT_JACKET:
+ case OBJECT_TUNIC2:
+ scene->_sceneMode = 9460;
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_sequenceManager1, scene, 9460, &_globals->_player, &scene->_object2, &scene->_object1, NULL);
+ break;
+ case OBJECT_TUNIC:
+ SceneItem::display(9450, 49, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ break;
+ case CURSOR_WALK:
+ // nothing
+ break;
+ case CURSOR_LOOK:
+ SceneItem::display(9450, 41, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ break;
+ case CURSOR_USE:
+ case CURSOR_TALK:
+ if (RING_INVENTORY._tunic._sceneNumber == 9450) {
+ if (scene->_object2._action)
+ scene->_object2._action->remove();
+ scene->_sceneMode = 9459;
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_sequenceManager1, scene, 9459, &scene->_object2, &scene->_object1, &scene->_object3, &_globals->_player, NULL);
+ } else if ((RING_INVENTORY._cloak._sceneNumber != 1) && (RING_INVENTORY._jacket._sceneNumber != 1) && (RING_INVENTORY._tunic2._sceneNumber != 1)) {
+ SceneItem::display(9450, 38, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ } else {
+ scene->_sceneMode = 9460;
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_sequenceManager1, scene, 9460, &_globals->_player, &scene->_object2, &scene->_object1, NULL);
+ }
+ break;
+ default:
+ SceneItem::display(9450, 45, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ break;
+ }
+}
+
+void Scene9450::signal() {
+ switch (_sceneMode++) {
+ case 1002:
+ case 1004:
+ // Drink
+ setAction(&_sequenceManager1, this, 9456, &_object2, &_object1, &_object3, NULL);
+ break;
+ case 1005:
+ // Bring me more wine
+ setAction(&_sequenceManager1, this, 9457, &_object2, &_object1, &_object3, NULL);
+ break;
+ case 9451:
+ if (_globals->getFlag(87)) {
+ _globals->_player.enableControl();
+ } else {
+ _sceneMode = 1001;
+ if (_object2._action)
+ _object2._action->remove();
+ // Eat
+ setAction(&_sequenceManager1, this, 9455, &_object2, &_object1, &_object3, NULL);
+ }
+ break;
+ case 1001:
+ case 1003:
+ // Eat
+ setAction(&_sequenceManager1, this, 9455, &_object2, &_object1, &_object3, NULL);
+ break;
+ case 9453:
+ _globals->_sceneManager.changeScene(9360);
+ break;
+ case 9459:
+ RING_INVENTORY._tunic._sceneNumber = 1;
+ _object2.signal();
+ _globals->_player.enableControl();
+ _globals->_events.setCursor(CURSOR_WALK);
+ _hotspot1.remove();
+ break;
+ case 1006:
+ _globals->setFlag(87);
+ // No break on purpose
+ default:
+ _globals->_player.enableControl();
+ break;
+ }
+}
+
+void Scene9450::dispatch() {
+ if (_action) {
+ _action->dispatch();
+ } else {
+ if ((_globals->_player._position.y < 98) && (_globals->_player._position.x > 241) && (_globals->_player._position.x < 282)) {
+ _globals->_player.disableControl();
+ _sceneMode = 9452;
+ setAction(&_sequenceManager1, this, 9452, &_globals->_player, NULL);
+ } else if ((_globals->_player._position.y < 99) && (_globals->_player._position.x > 68) && (_globals->_player._position.x < 103)) {
+ _globals->_player.disableControl();
+ _sceneMode = 9453;
+ setAction(&_sequenceManager1, this, 9453, &_globals->_player, NULL);
+ }
+ }
+}
+
+void Scene9450::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ setZoomPercents(84, 75, 167, 150);
+ _globals->_events.setCursor(CURSOR_WALK);
+ _globals->_player.postInit();
+
+ _object2.postInit();
+ _object1.postInit();
+ _object1.hide();
+
+ _globals->_player.disableControl();
+ _sceneMode = 9451;
+ setAction(&_sequenceManager1, this, 9451, &_globals->_player, NULL);
+
+ if (_globals->getFlag(87)) {
+ if (RING_INVENTORY._tunic._sceneNumber == 1) {
+ _object2.signal();
+ } else {
+ _object2.setPosition(Common::Point(184, 144));
+ _object2.setVisage(9451);
+ _object2.fixPriority(250);
+ _object2._strip = 5;
+ _object2._frame = 10;
+ }
+ } else {
+ _object3.postInit();
+ _object3.hide();
+ _object3.setAction(&_sequenceManager2, NULL, 9455, &_object2, &_object1, NULL);
+ }
+
+ if (RING_INVENTORY._tunic._sceneNumber != 1)
+ _hotspot1.setup(123, 139, 138, 170, 9450, 37, -1);
+
+ _hotspot2.setup(153, 102, 176, 141, 9450, 39, 40);
+ _hotspot3.setup(97, 198, 130, 229, 9450, 41, 42);
+ _hotspot15.setup(131, 190, 145, 212, 9450, 43, 44);
+ _hotspot4.setup(33, 144, 105, 192, 9450, 0, 1);
+ _hotspot5.setup(20, 236, 106, 287, 9450, 2, 3);
+ _hotspot6.setup(137, 119, 195, 320, 9450, 4, 5);
+ _hotspot7.setup(20, 59, 99, 111, 9450, 6, -1);
+ _hotspot8.setup(110, 0, 199, 117, 9450, 7, 8);
+ _hotspot9.setup(101, 104, 130, 174, 9450, 9, 10);
+ _hotspot10.setup(110, 246, 149, 319, 9450, 11, 12);
+ _hotspot11.setup(16, 34, 74, 62, 6450, 13, 14);
+ _hotspot12.setup(19, 108, 72, 134, 9450, 15, 16);
+ _hotspot13.setup(18, 215, 71, 237, 9450, 17, 18);
+ _hotspot14.setup(15, 288, 76, 314, 9450, 19, 20);
+ _hotspot16.setup(0, 0, 200, 320, 9450, 46, -1);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9500 - Castle: Bedroom
+ *
+ *--------------------------------------------------------------------------*/
+void Scene9500::Hotspot1::doAction(int action) {
+ Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene;
+
+ if (action == OBJECT_SWORD) {
+ scene->_sceneMode = 9510;
+ _globals->setFlag(92);
+ RING_INVENTORY._sword._sceneNumber = 9500;
+ _globals->_player.disableControl();
+ _globals->_sceneItems.remove(this);
+ scene->_hotspot2.setup(87, 294, 104, 314, 9400, 17, -1);
+ scene->setAction(&scene->_sequenceManager, scene, 9510, &_globals->_player, &scene->_object2, NULL);
+ } else {
+ NamedHotspot::doAction(action);
+ }
+}
+
+void Scene9500::Hotspot2::doAction(int action) {
+ Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ scene->_sceneMode = 9511;
+ _globals->_player.disableControl();
+ _globals->_sceneItems.remove(this);
+ scene->setAction(&scene->_sequenceManager, scene, 9511, &_globals->_player, &scene->_object2, NULL);
+ } else {
+ NamedHotspot::doAction(action);
+ }
+}
+
+void Scene9500::Hotspot3::doAction(int action) {
+ Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene;
+
+ if ((action == CURSOR_USE) && (RING_INVENTORY._candle._sceneNumber != 1)){
+ scene->_sceneMode = 9505;
+ _globals->_player.disableControl();
+ _globals->_sceneItems.remove(this);
+ scene->setAction(&scene->_sequenceManager, scene, 9505, &_globals->_player, &scene->_candle, NULL);
+ } else {
+ NamedHotspot::doAction(action);
+ }
+}
+
+void Scene9500::Hotspot4::doAction(int action) {
+ Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene;
+
+ if (action == OBJECT_CANDLE) {
+ _globals->_player.disableControl();
+ if (RING_INVENTORY._straw._sceneNumber == 9500) {
+ scene->_sceneMode = 9506;
+ _globals->_sceneItems.remove(&scene->_hotspot5);
+ _globals->_sceneItems.remove(this);
+ scene->setAction(&scene->_sequenceManager, scene, 9506, &_globals->_player, &scene->_object3, NULL);
+ RING_INVENTORY._candle._sceneNumber = 9850;
+ } else {
+ scene->_sceneMode = 9507;
+ scene->setAction(&scene->_sequenceManager, scene, 9507, &_globals->_player, &scene->_object3, NULL);
+ }
+ } else if (action == OBJECT_STRAW) {
+ scene->_sceneMode = 9512;
+ _globals->_player.disableControl();
+ RING_INVENTORY._straw._sceneNumber = 9500;
+ scene->setAction(&scene->_sequenceManager, scene, 9512, &_globals->_player, &scene->_object3, NULL);
+ } else {
+ NamedHotspot::doAction(action);
+ }
+}
+
+void Scene9500::signal() {
+ switch (_sceneMode) {
+ case 9503:
+ _globals->_sceneManager.changeScene(9200);
+ _globals->_soundHandler.play(295);
+ break;
+ case 9504:
+ _globals->_sceneManager.changeScene(9850);
+ break;
+ case 9505:
+ _candle.setStrip(2);
+ RING_INVENTORY._candle._sceneNumber = 1;
+ _globals->_player.enableControl();
+ break;
+ case 9506:
+ _globals->setFlag(85);
+ _globals->_player.enableControl();
+ break;
+ case 9511:
+ RING_INVENTORY._helmet._sceneNumber = 1;
+ _globals->_player.enableControl();
+ if (!_globals->getFlag(51)) {
+ _globals->setFlag(51);
+ _globals->_player.disableControl();
+ _sceneMode = 9514;
+ setAction(&_sequenceManager, this, 9514, &_globals->_player, NULL, NULL, NULL, NULL);
+ }
+ break;
+ case 0:
+ case 9514:
+ default:
+ _globals->_player.enableControl();
+ break;
+ }
+}
+
+void Scene9500::dispatch() {
+ if (_action) {
+ _action->dispatch();
+ } else {
+ if (_globals->_player._position.y >= 199) {
+ _globals->_player.disableControl();
+ _sceneMode = 9503;
+ setAction(&_sequenceManager, this, 9503, &_globals->_player, NULL, NULL, NULL, NULL);
+ } else if (_globals->_player._position.y < 127) {
+ _globals->_player.disableControl();
+ _sceneMode = 9504;
+ setAction(&_sequenceManager, this, 9504, &_globals->_player, NULL, NULL, NULL, NULL);
+ }
+ }
+
+}
+
+void Scene9500::process(Event &event) {
+ Scene::process(event);
+}
+
+void Scene9500::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ setZoomPercents(110, 75, 200, 150);
+
+ _globals->_player.postInit();
+ _globals->_soundHandler.play(305);
+
+ _candle.postInit();
+ _candle.setVisage(9500);
+ _candle.setStrip(1);
+ _candle.animate(ANIM_MODE_2);
+ _candle.setPosition(Common::Point(30, 105));
+ if (RING_INVENTORY._candle._sceneNumber != 9500)
+ _candle.setStrip(2);
+
+ _object3.postInit();
+ _object3.hide();
+ _object3.fixPriority(150);
+ _object3.setPosition(Common::Point(166, 133));
+ if (RING_INVENTORY._straw._sceneNumber == 9500) {
+ _object3.show();
+ _object3.setVisage(5);
+ _object3._strip = 2;
+ _object3._frame = 9;
+ _object3.setPosition(Common::Point(168, 128));
+ if (_globals->getFlag(85)) {
+ _object3.setVisage(9500);
+ _object3.setStrip(4);
+ _object3.animate(ANIM_MODE_8, 0, NULL);
+ _object3.setPosition(Common::Point(166, 133));
+ }
+ }
+
+ _object2.postInit();
+ _object2.hide();
+ if (_globals->getFlag(92)) {
+ _object2.show();
+ _object2.setVisage(9501);
+ _object2.setStrip(1);
+ _object2.setFrame(_object2.getFrameCount());
+ _object2.setPosition(Common::Point(303, 130));
+ _object2.fixPriority(132);
+ if (RING_INVENTORY._helmet._sceneNumber == 1) {
+ _hotspot2.setup(87, 294, 104, 314, 9400, 17, -1);
+ } else {
+ _object2.setStrip(2);
+ _object2.setFrame(1);
+ }
+ } else {
+ _hotspot1.setup(105, 295, 134, 313, 9500, 9, 10);
+ }
+
+ _hotspot17.setup(101, 293, 135, 315, 9500, 9, 10);
+ _hotspot3.setup(84, 12, 107, 47, 9500, 15, 15);
+ _hotspot6.setup(93, 11, 167, 46, 9500, 0, 1);
+ _hotspot7.setup(100, 70, 125, 139, 9500, 2, 3);
+
+ if (!_globals->getFlag(85)) {
+ _hotspot5.setup(111, 68, 155, 244, 9500, 17, -1);
+ _hotspot4.setup(57, 71, 120, 126, 9500, 16, -1);
+ }
+
+ _hotspot8.setup(60, 24, 90, 53, 9500, 4, 5);
+ _hotspot9.setup(72, 143, 93, 163, 9500, 4, 5);
+ _hotspot10.setup(70, 205, 92, 228, 9500, 4, 5);
+ _hotspot11.setup(66, 291, 90, 317, 9500, 4, 5);
+ _hotspot12.setup(22, 58, 101, 145, 9500, 6, 7);
+ _hotspot13.setup(121, 57, 163, 249, 9500, 6, 7);
+ _hotspot14.setup(115, 133, 135, 252, 9500, 6, 7);
+ _hotspot15.setup(55, 240, 125, 254, 9500, 6, 7);
+ _hotspot16.setup(53, 251, 132, 288, 9500, 8, -1);
+ _hotspot19.setup(101, 207, 120, 225, 9500, 9, 10);
+ _hotspot18.setup(98, 144, 117, 162, 9500, 9, 10);
+ _hotspot20.setup(102, 27, 132, 50, 9500, 9, 10);
+
+ _globals->_events.setCursor(CURSOR_WALK);
+ _globals->_player.disableControl();
+
+ if ((_globals->_sceneManager._previousScene == 9200) || (_globals->_sceneManager._previousScene != 9850)) {
+ _sceneMode = 0;
+ if (RING_INVENTORY._helmet._sceneNumber != 1) {
+ setAction(&_sequenceManager, this, 9501, &_globals->_player, &_candle, NULL);
+ } else {
+ RING_INVENTORY._helmet._sceneNumber = 9500;
+ _hotspot2.setup(87, 294, 104, 314, 9400, 17, -1);
+ setAction(&_sequenceManager, this, 9513, &_globals->_player, &_object2, NULL);
+ }
+ } else {
+ _sceneMode = 0;
+ setAction(&_sequenceManager, this, 9502, &_globals->_player, &_candle, NULL);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9700 - Castle: Balcony
+ *
+ *--------------------------------------------------------------------------*/
+void Scene9700::signal() {
+ switch (_sceneMode ++) {
+ case 9703:
+ _globals->setFlag(88);
+ // No break on purpose
+ case 9701:
+ case 9702:
+ _gfxButton1.setText(EXIT_MSG);
+ _gfxButton1._bounds.center(50, 190);
+ _gfxButton1.draw();
+ _gfxButton1._bounds.expandPanes();
+ _globals->_player.enableControl();
+ _globals->_player._canWalk = false;
+ _globals->_events.setCursor(CURSOR_USE);
+ break;
+ case 9704:
+ _globals->_soundHandler.play(323);
+ _globals->_sceneManager.changeScene(9750);
+ break;
+ }
+}
+
+void Scene9700::process(Event &event) {
+ Scene::process(event);
+ if ((event.eventType == EVENT_BUTTON_DOWN) && !_action) {
+ if (_gfxButton1.process(event)) {
+ _globals->_sceneManager.changeScene(9200);
+ } else if (_globals->_events._currentCursor == OBJECT_SCANNER) {
+ event.handled = true;
+ if (RING_INVENTORY._helmet._sceneNumber == 1) {
+ _globals->_player.disableControl();
+ _sceneMode = 9704;
+ setAction(&_sequenceManager, this, 9704, &_globals->_player, &_object1, NULL);
+ } else {
+ _globals->_player.disableControl();
+ _sceneMode = 9703;
+ setAction(&_sequenceManager, this, 9703, &_globals->_player, &_object1, NULL);
+ }
+ }
+ }
+}
+
+void Scene9700::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ setZoomPercents(0, 100, 200, 100);
+
+ _sceneHotspot1.setup(84, 218, 151, 278, 9700, 14, -1);
+ _sceneHotspot2.setup(89, 11, 151, 121, 9700, 14, -1);
+ _sceneHotspot3.setup(69, 119, 138, 216, 9700, 15, 16);
+ _sceneHotspot4.setup(34, 13, 88, 116, 9700, 17, -1);
+ _sceneHotspot5.setup(52, 119, 68, 204, 9700, 17, -1);
+ _sceneHotspot6.setup(0, 22, 56, 275, 9700, 18, -1);
+
+ _object1.postInit();
+ _object1.hide();
+ _globals->_player.postInit();
+ if (!_globals->getFlag(97)) {
+ _globals->_player.disableControl();
+ _sceneMode = 9701;
+ setAction(&_sequenceManager, this, 9701, &_globals->_player, &_object1, NULL);
+ _globals->setFlag(97);
+ } else {
+ _globals->_player.disableControl();
+ _sceneMode = 9702;
+ setAction(&_sequenceManager, this, 9702, &_globals->_player, &_object1, NULL);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9750 - Castle: In the garden
+ *
+ *--------------------------------------------------------------------------*/
+void Scene9750::signal() {
+ switch (_sceneMode ++) {
+ case 9751:
+ _globals->_soundHandler.fadeOut(this);
+ break;
+ case 9752:
+ _globals->_sceneManager.changeScene(2100);
+ default:
+ break;
+ }
+}
+
+void Scene9750::dispatch() {
+ Scene::dispatch();
+}
+
+void Scene9750::postInit(SceneObjectList *OwnerList) {
+ loadScene(9750);
+ Scene::postInit();
+ setZoomPercents(0, 100, 200, 100);
+
+ _globals->_player.postInit();
+ _object1.postInit();
+ _object1.hide();
+ _object2.postInit();
+ _object2.hide();
+ _globals->_player.disableControl();
+ _sceneMode = 9751;
+ setAction(&_sequenceManager, this, 9751, &_globals->_player, &_object1, &_object2, NULL);
+}
+
+
+/*--------------------------------------------------------------------------
+ * Scene 9850 - Castle: Dressing room
+ *
+ *--------------------------------------------------------------------------*/
+void Scene9850::Object6::doAction(int action) {
+ if ((_flags & OBJFLAG_HIDE) == 0) {
+ if (action == CURSOR_LOOK) {
+ SceneItem::display(9850, 27, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ } else if (action == CURSOR_USE) {
+ RING_INVENTORY._scimitar._sceneNumber = 1;
+ hide();
+ } else {
+ SceneHotspot::doAction(action);
+ }
+ }
+}
+void Scene9850::Object7::doAction(int action) {
+ if ((_flags & OBJFLAG_HIDE) == 0) {
+ if (action == CURSOR_LOOK) {
+ SceneItem::display(9850, 28, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ } else if (action == CURSOR_USE) {
+ RING_INVENTORY._sword._sceneNumber = 1;
+ hide();
+ } else {
+ SceneHotspot::doAction(action);
+ }
+ }
+}
+
+// Hair covered tunic
+void Scene9850::Hotspot12::doAction(int action) {
+ Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ if (RING_INVENTORY._tunic2._sceneNumber != 1) {
+ RING_INVENTORY._tunic2._sceneNumber = 1;
+ _globals->_player.disableControl();
+ scene->_sceneMode = 9858;
+ scene->setAction(&scene->_sequenceManager, scene, 9858, &_globals->_player, &scene->_objTunic2, NULL);
+ } else {
+ RING_INVENTORY._tunic2._sceneNumber = 9850;
+ _globals->_player.disableControl();
+ scene->_sceneMode = 9861;
+ scene->setAction(&scene->_sequenceManager, scene, 9861, &_globals->_player, &scene->_objTunic2, NULL);
+ }
+ } else if ((action != CURSOR_LOOK) || (RING_INVENTORY._tunic2._sceneNumber != 1)) {
+ NamedHotspot::doAction(action);
+ } else {
+ SceneItem::display(9850, 30, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ }
+}
+
+void Scene9850::Hotspot14::doAction(int action) {
+ Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ if (RING_INVENTORY._jacket._sceneNumber != 1) {
+ RING_INVENTORY._jacket._sceneNumber = 1;
+ _globals->_player.disableControl();
+ scene->_sceneMode = 9857;
+ scene->setAction(&scene->_sequenceManager, scene, 9857, &_globals->_player, &scene->_objJacket, NULL);
+ } else {
+ RING_INVENTORY._jacket._sceneNumber = 9850;
+ _globals->_player.disableControl();
+ scene->_sceneMode = 9860;
+ scene->setAction(&scene->_sequenceManager, scene, 9860, &_globals->_player, &scene->_objJacket, NULL);
+ }
+ } else if ((action != CURSOR_LOOK) || (RING_INVENTORY._jacket._sceneNumber != 1)) {
+ NamedHotspot::doAction(action);
+ } else {
+ SceneItem::display(9850, 30, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ }
+}
+
+void Scene9850::Hotspot16::doAction(int action) {
+ Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ if (RING_INVENTORY._cloak._sceneNumber != 1) {
+ RING_INVENTORY._cloak._sceneNumber = 1;
+ _globals->_player.disableControl();
+ scene->_sceneMode = 9862;
+ scene->setAction(&scene->_sequenceManager, scene, 9862, &_globals->_player, &scene->_objCloak, NULL);
+ } else {
+ RING_INVENTORY._cloak._sceneNumber = 9850;
+ _globals->_player.disableControl();
+ scene->_sceneMode = 9859;
+ scene->setAction(&scene->_sequenceManager, scene, 9859, &_globals->_player, &scene->_objCloak, NULL);
+ }
+ } else if ((action != CURSOR_LOOK) || (RING_INVENTORY._cloak._sceneNumber != 1)) {
+ NamedHotspot::doAction(action);
+ } else {
+ SceneItem::display(9850, 30, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ }
+}
+
+void Scene9850::Hotspot17::doAction(int action) {
+ Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene;
+
+ if (action == OBJECT_SCANNER) {
+ SceneItem::display(9850, 32, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ } else {
+ if (action == CURSOR_USE)
+ scene->_soundHandler.play(306);
+ NamedHotspot::doAction(action);
+ }
+}
+
+void Scene9850::Hotspot18::doAction(int action) {
+ Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene;
+
+ if (action == OBJECT_SCANNER) {
+ SceneItem::display(9850, 32, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ } else {
+ if (action == CURSOR_USE)
+ scene->_soundHandler.play(306);
+ NamedHotspot::doAction(action);
+ }
+}
+
+void Scene9850::Hotspot19::doAction(int action) {
+ Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene;
+
+ if (action == OBJECT_SCANNER) {
+ SceneItem::display(9850, 31, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+ } else {
+ if (action == CURSOR_USE)
+ scene->_soundHandler.play(313);
+ NamedHotspot::doAction(action);
+ }
+}
+
+// Arrow on Statue
+void Scene9850::Hotspot20::doAction(int action) {
+ Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ _globals->_player.disableControl();
+ if (scene->_objSword._state == 0) {
+ if (RING_INVENTORY._scimitar._sceneNumber == 9850)
+ scene->_objScimitar.show();
+ if (RING_INVENTORY._sword._sceneNumber == 9850)
+ scene->_objSword.show();
+ scene->_sceneMode = 11;
+ setAction(&scene->_sequenceManager, scene, 9853, &_globals->_player, &scene->_objDoor, &scene->_objLever, NULL);
+ } else {
+ scene->_sceneMode = 10;
+ setAction(&scene->_sequenceManager, scene, 9854, &_globals->_player, &scene->_objDoor, &scene->_objLever, NULL);
+ }
+ scene->_objSword._state ^= 1;
+ } else {
+ NamedHotspot::doAction(action);
+ }
+}
+
+void Scene9850::signal() {
+ switch (_sceneMode ++) {
+ case 10:
+ // Hidden closet closed
+ if (RING_INVENTORY._scimitar._sceneNumber == 9850)
+ _objScimitar.hide();
+ if (RING_INVENTORY._sword._sceneNumber == 9850)
+ _objSword.hide();
+ _globals->_sceneItems.remove(&_objScimitar);
+ _globals->_sceneItems.remove(&_objSword);
+ _globals->_sceneItems.addItems(&_hotspot19, NULL);
+ _globals->_player.enableControl();
+ break;
+ case 11:
+ // Hidden closet opened
+ if (RING_INVENTORY._scimitar._sceneNumber == 9850)
+ _globals->_sceneItems.addItems(&_objScimitar, NULL);
+ if (RING_INVENTORY._sword._sceneNumber == 9850)
+ _globals->_sceneItems.addItems(&_objSword, NULL);
+ _globals->_sceneItems.remove(&_hotspot19);
+ _globals->_player.enableControl();
+ break;
+ case 9500:
+ _globals->_sceneManager.changeScene(_sceneMode - 1);
+ break;
+ case 0:
+ default:
+ _globals->_player.enableControl();
+ break;
+ }
+}
+
+void Scene9850::process(Event &event) {
+ Scene::process(event);
+ if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_4)) {
+ event.handled = true;
+ _globals->_player.disableControl();
+ if (_objSword._state == 0) {
+ _sceneMode = 0;
+ setAction(&_sequenceManager, this, 9853, &_objLever, &_objDoor, &_objScimitar, &_objSword, NULL);
+ } else {
+ _sceneMode = 10;
+ setAction(&_sequenceManager, this, 9854, &_objLever, &_objDoor, &_objScimitar, &_objSword, NULL);
+ }
+ _objSword._state ^= 1;
+ }
+}
+
+void Scene9850::dispatch() {
+ if (_action) {
+ _action->dispatch();
+ } else if (_globals->_player._position.y >= 198) {
+ _globals->_player.disableControl();
+ _sceneMode = 9500;
+ setAction(&_sequenceManager, this, 9852, &_globals->_player, NULL);
+ }
+}
+
+void Scene9850::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ _objSword._state = 0;
+
+ _objDoor.postInit();
+ _objDoor.setVisage(9850);
+ _objDoor.setStrip(1);
+ _objDoor.setFrame(1);
+ _objDoor.setPosition(Common::Point(28, 118));
+ _objDoor.fixPriority(90);
+
+ _objLever.postInit();
+ _objLever.setVisage(9850);
+ _objLever.setStrip(4);
+ _objLever.setFrame(1);
+ _objLever.setPosition(Common::Point(256, 35));
+
+ _objCloak.postInit();
+ _objCloak.setVisage(9850);
+ _objCloak.setStrip(5);
+ _objCloak.setFrame(1);
+ _objCloak.fixPriority(90);
+ _objCloak.setPosition(Common::Point(157, 81));
+ if (RING_INVENTORY._cloak._sceneNumber != 9850)
+ _objCloak.hide();
+
+ _objJacket.postInit();
+ _objJacket.setVisage(9850);
+ _objJacket.setStrip(5);
+ _objJacket.setFrame(2);
+ _objJacket.fixPriority(90);
+ _objJacket.setPosition(Common::Point(201, 84));
+ if (RING_INVENTORY._jacket._sceneNumber != 9850)
+ _objJacket.hide();
+
+ _objTunic2.postInit();
+ _objTunic2.setVisage(9850);
+ _objTunic2.setStrip(5);
+ _objTunic2.setFrame(3);
+ _objTunic2.fixPriority(90);
+ _objTunic2.setPosition(Common::Point(295, 90));
+ if (RING_INVENTORY._tunic2._sceneNumber != 9850)
+ _objTunic2.hide();
+
+ if (RING_INVENTORY._scimitar._sceneNumber == 9850) {
+ _objScimitar.postInit();
+ _objScimitar.setVisage(9850);
+ _objScimitar.setStrip(2);
+ _objScimitar.setFrame(1);
+ _objScimitar.setPosition(Common::Point(55, 83));
+ _objScimitar.fixPriority(80);
+ _objScimitar.hide();
+ }
+
+ if (RING_INVENTORY._sword._sceneNumber == 9850) {
+ _objSword.postInit();
+ _objSword.setVisage(9850);
+ _objSword.setStrip(3);
+ _objSword.setFrame(1);
+ _objSword.setPosition(Common::Point(56, 101));
+ _objSword.fixPriority(80);
+ _objSword.hide();
+ }
+
+ _spotLever.setup(30, 251, 45, 270, 9850, 26, -1);
+ _hotspot1.setup(123, 0, 200, 320, 9850, 0, 1);
+ _hotspot2.setup(107, 87, 133, 308, 9850, 0, 1);
+ _hotspot3.setup(2, 28, 53, 80, 9850, 2, 3);
+ _hotspot4.setup(13, 0, 55, 27, 9850, 2, 3);
+ _hotspot5.setup(8, 74, 27, 91, 9850, 4, 5);
+ _hotspot17.setup(61, 0, 125, 28, 9850, 6, 7);
+ _hotspot18.setup(51, 95, 105, 145, 9850, 6, 7);
+ _hotspot19.setup(56, 28, 115, 97, 9850, 6, 8);
+ _hotspot6.setup(0, 223, 115, 257, 9850, 9, 10);
+ _hotspot7.setup(15, 254, 33, 268, 9850, 9, -1);
+ _hotspot8.setup(17, 218, 37, 233, 9850, 9, 10);
+ _hotspot9.setup(8, 113, 26, 221, 9850, 11, 12);
+ _hotspot10.setup(14, 94, 53, 112, 9850, 13, 14);
+ _hotspot11.setup(5, 269, 29, 303, 9850, 15, 16);
+ _hotspot12.setup(43, 278, 91, 317, 9850, 17, 18);
+ _hotspot13.setup(47, 263, 112, 282, 9850, 19, 20);
+ _hotspot14.setup(43, 188, 86, 224, 9850, 21, 22);
+ _hotspot15.setup(43, 162, 92, 191, 9850, 23, 24);
+ _hotspot16.setup(40, 146, 90, 169, 9850, 25, -1);
+
+ _globals->_player.postInit();
+ _globals->_player.disableControl();
+ _sceneMode = 0;
+ setAction(&_sequenceManager, this, 9851, &_globals->_player, NULL);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9900 - Ending
+ *
+ *--------------------------------------------------------------------------*/
+void Scene9900::strAction1::signal() {
+ const byte mask1[3] = {0xff, 0xff, 0xff};
+ const byte mask2[3] = {0, 0, 0};
+
+ Scene9900 *scene = (Scene9900 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_soundHandler.play(351);
+ _object9.postInit();
+ _object9.setVisage(18);
+ _object9._frame = 1;
+ _object9._strip = 6;
+ _object9.fixPriority(250);
+ _object9.setPosition(Common::Point(171, 59));
+ _object9.animate(ANIM_MODE_5, NULL);
+ _globals->_scenePalette.addRotation(67, 111, 1, 1, this);
+ scene->_object2.hide();
+ break;
+ case 1:
+ _palette1.getPalette();
+ _globals->_scenePalette.addFader(&mask1[0], 1, 10, this);
+ break;
+ case 2:
+ _object9.remove();
+ _globals->_scenePalette.addFader(&mask2[0], 1, 5, this);
+ break;
+ case 3:
+ _globals->_soundHandler.play(377);
+ setDelay(120);
+ break;
+ case 4:
+ _globals->_scenePalette.addFader(_palette1._palette, 256, 1, this);
+ break;
+ case 5:
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene9900::strAction2::signal() {
+ switch (_actionIndex++) {
+ case 0:
+ _lineNum = 0;
+ _txtArray1Index = 0;
+ _txtArray1[0]._position.y = 200;
+ _txtArray1[1]._position.y = 300;
+ _txtArray2[0]._position.y = 400;
+ _txtArray2[1]._position.y = 500;
+ _var3 = 0;
+ // No break on purpose
+ case 1: {
+ Common::String msg = _resourceManager->getMessage(8030, _lineNum++);
+ if (msg.compareTo("LASTCREDIT")) {
+ if (_var3) {
+ // Not used?
+ // int x = _txtArray1[_txtArray1Index].getFrame().getBounds().height();
+ _txtArray1[_txtArray1Index]._moveDiff.y = 10;
+
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(_txtArray1[_txtArray1Index]._position.x, -100);
+ _txtArray1[_txtArray1Index].addMover(mover, &pt, NULL);
+
+ // Not used?
+ // int x = _txtArray2[_txtArray1Index].getFrame().getBounds().height();
+ _txtArray2[_txtArray1Index]._moveDiff.y = 10;
+ _txtArray1Index = (_txtArray1Index + 1) % 2;
+ }
+ _var3 = 1;
+ _txtArray1[_txtArray1Index]._textMode = ALIGN_CENTER;
+ _txtArray1[_txtArray1Index]._width = 240;
+ _txtArray1[_txtArray1Index]._fontNumber = 2;
+ _txtArray1[_txtArray1Index]._color1 = 7;
+ _txtArray1[_txtArray1Index].setup(msg);
+ _txtArray1[_txtArray1Index]._moveRate = 20;
+ _txtArray1[_txtArray1Index]._moveDiff.y = 2;
+ _txtArray1[_txtArray1Index].fixPriority(255);
+ int frameWidth = _txtArray1[_txtArray1Index].getFrame().getBounds().width();
+ int frameHeight = _txtArray1[_txtArray1Index].getFrame().getBounds().height();
+ _txtArray1[_txtArray1Index].setPosition(Common::Point((320 - frameWidth) / 2, 200));
+
+ NpcMover *mover2 = new NpcMover();
+ Common::Point pt2(_txtArray1[_txtArray1Index]._position.x, 100);
+ _txtArray1[_txtArray1Index].addMover(mover2, &pt2, this);
+
+ _txtArray2[_txtArray1Index]._textMode = ALIGN_CENTER;
+ _txtArray2[_txtArray1Index]._width = 240;
+ _txtArray2[_txtArray1Index]._fontNumber = 2;
+ _txtArray2[_txtArray1Index]._color1 = 23;
+
+ msg = _resourceManager->getMessage(8030, _lineNum++);
+ _txtArray2[_txtArray1Index].setup(msg);
+ _txtArray2[_txtArray1Index]._moveRate = 20;
+ _txtArray2[_txtArray1Index]._moveDiff.y = 2;
+ _txtArray2[_txtArray1Index].fixPriority(255);
+ frameWidth = _txtArray2[_txtArray1Index].getFrame().getBounds().width();
+ _txtArray2[_txtArray1Index].setPosition(Common::Point((320 - frameWidth) / 2, 200 + frameHeight));
+ } else {
+ // WORKAROUND: Fix inventory becoming available at end of credits
+ _globals->_events.setCursor(CURSOR_WALK);
+ _actionIndex = 3;
+ signal();
+ }
+ break;
+ }
+ case 2:
+ setDelay(60);
+ _actionIndex = 1;
+ break;
+ case 3:
+ setDelay(7200);
+ break;
+ case 4:
+ _txtArray1[0].remove();
+ _txtArray1[1].remove();
+ _txtArray2[0].remove();
+ _txtArray2[1].remove();
+ remove();
+ break;
+ default:
+ break;
+ }
+}
+void Scene9900::strAction2::dispatch() {
+// if (this->_txtArray1[0]._textSurface != 0) {
+ int frameHeight = _txtArray1[0].getFrame().getBounds().height();
+ _txtArray2[0]._position.y = frameHeight + _txtArray1[0]._position.y;
+ _txtArray2[0]._flags |= OBJFLAG_PANES;
+// }
+// if (this->_txtArray1[1]._textSurface != 0) {
+ frameHeight = _txtArray1[1].getFrame().getBounds().height();
+ _txtArray2[1]._position.y = frameHeight + _txtArray1[1]._position.y;
+ _txtArray2[1]._flags |= OBJFLAG_PANES;
+// }
+ Action::dispatch();
+}
+
+void Scene9900::strAction2::synchronize(Serializer &s) {
+ Action::synchronize(s);
+ if (s.getVersion() >= 3) {
+ s.syncAsSint16LE(_lineNum);
+ s.syncAsSint16LE(_txtArray1Index);
+ s.syncAsSint16LE(_var3);
+ }
+}
+
+void Scene9900::strAction3::signal() {
+ const byte mask3[3] = {0xff, 0, 0};
+ const byte mask4[3] = {0, 0, 0};
+
+ switch (_actionIndex++) {
+ case 0:
+ _palette2.getPalette();
+ _palette3.loadPalette(2003);
+ _globals->_scenePalette.addFader(_palette3._palette, 256, 5, this);
+ break;
+ case 1:
+ _globals->_scenePalette.addFader(&mask3[0], 1, 10, this);
+ break;
+ case 2:
+ _globals->_scenePalette.addFader(&mask4[0], 1, 1, this);
+ break;
+ case 3:
+ _palette2.loadPalette(17);
+ _globals->_sceneManager._scene->loadScene(17);
+ _globals->_scenePalette.addFader(_palette2._palette, 256, 5, this);
+ break;
+ case 4:
+ _globals->_game->endGame(9900, 61);
+ remove();
+ default:
+ break;
+ }
+}
+
+void Scene9900::signal() {
+ if ((_sceneMode != 9913) && (_sceneMode != 9905) && (_sceneMode != 9904) && (_sceneMode != 9912)) {
+ _object1.hide();
+ _object2.hide();
+ _object3.hide();
+ _object4.hide();
+ _object5.hide();
+ _object6.hide();
+ }
+
+ _object1.animate(ANIM_MODE_NONE, NULL);
+ _object2.animate(ANIM_MODE_NONE, NULL);
+ _object3.animate(ANIM_MODE_NONE, NULL);
+ _object4.animate(ANIM_MODE_NONE, NULL);
+ _object5.animate(ANIM_MODE_NONE, NULL);
+ _object6.animate(ANIM_MODE_NONE, NULL);
+
+ _object1.setObjectWrapper(NULL);
+ _object2.setObjectWrapper(NULL);
+ _object3.setObjectWrapper(NULL);
+ _object4.setObjectWrapper(NULL);
+ _object5.setObjectWrapper(NULL);
+ _object6.setObjectWrapper(NULL);
+
+ _object1.addMover(NULL);
+ _object2.addMover(NULL);
+ _object3.addMover(NULL);
+ _object4.addMover(NULL);
+ _object5.addMover(NULL);
+ _object6.addMover(NULL);
+
+ switch (_sceneMode){
+ case 150:
+ _globals->_soundHandler.play(380);
+ _object8.postInit();
+ _object8.setVisage(2002);
+ _object8.setStrip(1);
+ _object8.setFrame(1);
+ _object8.fixPriority(200);
+ _object8.setPosition(Common::Point(64, 199));
+ _globals->_player.disableControl();
+ _sceneMode = 9908;
+ setAction(&_sequenceManager, this, 9908, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+ break;
+ case 162:
+ warning("TBC: shutdown();");
+ _globals->_game->quitGame();
+ break;
+ case 9901:
+ _globals->_player.disableControl();
+ _sceneMode = 9906;
+ setAction(&_sequenceManager, this, 9906, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+ _globals->_player._uiEnabled = true;
+ _globals->_events.setCursor(CURSOR_USE);
+ break;
+ case 9902:
+ _globals->_player.disableControl();
+ _sceneMode = 9901;
+ setAction(&_sequenceManager, this, 9901, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+ break;
+ case 9903:
+ _globals->_player.disableControl();
+ _sceneMode = 9902;
+ setAction(&_sequenceManager, this, 9902, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+ break;
+ case 9904:
+ _globals->_soundHandler.play(390);
+ _sceneMode = 9912;
+ setAction(&_strAction2, this);
+ break;
+ case 9905:
+ _sceneMode = 150;
+ setAction(&_strAction1, this);
+ break;
+ case 9906:
+ if (_object8._state == 0) {
+ _globals->_player.disableControl();
+ _sceneMode = 9913;
+ setAction(&_sequenceManager, this, 9913, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+ } else {
+ _globals->_player.disableControl();
+ _sceneMode = 9905;
+ setAction(&_sequenceManager, this, 9905, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+ }
+ break;
+ case 9907:
+ _globals->_player.disableControl();
+ _sceneMode = 9903;
+ setAction(&_sequenceManager, this, 9903, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+ break;
+ case 9908:
+ _object8.remove();
+ _globals->_player.disableControl();
+ _sceneMode = 9904;
+ setAction(&_sequenceManager, this, 9904, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+ break;
+ case 9909:
+ _globals->_soundHandler.play(375);
+ _globals->_player.disableControl();
+ _sceneMode = 9907;
+ setAction(&_sequenceManager, this, 9907, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+ break;
+ case 9910:
+ _globals->_player.disableControl();
+ _sceneMode = 9911;
+ setAction(&_sequenceManager, this, 9911, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+ break;
+ case 9911:
+ _globals->_soundHandler.play(367);
+ _globals->_player.disableControl();
+ _sceneMode = 9909;
+ setAction(&_sequenceManager, this, 9909, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+ break;
+ case 9912:
+ _globals->_player.disableControl();
+ _sceneMode = 9912;
+ setAction(&_sequenceManager, this, 9912, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+ _sceneMode = 162;
+ _globals->_player.enableControl();
+ _globals->_player._canWalk = false;
+ break;
+ case 9913:
+ _sceneMode = 200;
+ setAction(&_strAction3, this);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene9900::process(Event &event) {
+ if (event.handled)
+ return;
+ Scene::process(event);
+ if (_sceneMode == 9906) {
+ if ((event.eventType == EVENT_BUTTON_DOWN) && (_globals->_events.getCursor() == OBJECT_ITEMS)) {
+ _object8._state = 1;
+ RING_INVENTORY._items._sceneNumber = 9900;
+ _globals->_events.setCursor(CURSOR_USE);
+ }
+ }
+}
+
+void Scene9900::dispatch() {
+ if (_action)
+ _action->dispatch();
+}
+
+void Scene9900::postInit(SceneObjectList *OwnerList) {
+ _object1.postInit();
+ _object1.hide();
+ _object2.postInit();
+ _object2.hide();
+ _object3.postInit();
+ _object3.hide();
+ _object4.postInit();
+ _object4.hide();
+ _object5.postInit();
+ _object5.hide();
+ _object6.postInit();
+ _object6.hide();
+
+ _object8._state = 0;
+
+ RING_INVENTORY._concentrator._sceneNumber = 9900;
+ RING_INVENTORY._items._rlbNum = 3;
+ RING_INVENTORY._items._cursorNum = 6;
+ RING_INVENTORY._items._description = Common::String("One of the items from the stasis ship. The other is on the Lance's bridge.");
+
+ _stripManager.addSpeaker(&_speakerMR);
+ _globals->_player.disableControl();
+ _sceneMode = 9910;
+ setAction(&_sequenceManager, this, 9910, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9999 - Space travel
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene9999::Action1::signal() {
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(600);
+ break;
+ case 1:
+ _globals->_sceneManager.changeScene(3500);
+ break;
+ default:
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene9999::Action2::signal() {
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(10);
+ break;
+ case 1:
+ SceneItem::display(9999, 0, SET_Y, 10, SET_X, 30, SET_FONT, 2, SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 23, SET_WIDTH, 260, SET_KEEP_ONSCREEN, 1, LIST_END);
+ setDelay(300);
+ break;
+ case 2:
+ _globals->_stripNum = 3600;
+ _globals->_sceneManager.changeScene(3600);
+ default:
+ break;
+ }
+}
+
+void Scene9999::postInit(SceneObjectList *OwnerList) {
+ loadScene(9998);
+ Scene::postInit();
+ setZoomPercents(0, 100, 200, 100);
+
+ _object1.postInit();
+ _object1.setVisage(1303);
+ _object1.setStrip2(3);
+ _object1.setPosition(Common::Point(160, 152));
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(1303);
+ _globals->_player.setStrip2(1);
+ _globals->_player.fixPriority(250);
+ _globals->_player.animate(ANIM_MODE_2, NULL);
+ _globals->_player.setPosition(Common::Point(194, 98));
+ _globals->_player._numFrames = 20;
+ _globals->_player.disableControl();
+
+ _object2.postInit();
+ _object2.setVisage(1303);
+ _object2.setStrip2(2);
+ _object2.fixPriority(2);
+ _object2.setPosition(Common::Point(164, 149));
+
+ _object3.postInit();
+ _object3.setVisage(1303);
+ _object3.setStrip2(2);
+ _object3.fixPriority(2);
+ _object3.setFrame(2);
+ _object3.setPosition(Common::Point(292, 149));
+ _object3.setAction(&_action3);
+
+ if (_globals->_sceneManager._previousScene == 3500)
+ setAction(&_action2);
+ else
+ setAction(&_action1);
+
+ _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y);
+ _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
+ _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+
+ if (_globals->_sceneManager._previousScene == 3500)
+ _globals->_stripNum = 2222;
+ else
+ _globals->_stripNum = 2121;
+
+ _globals->_soundHandler.play(118);
+
+}
+
+} // End of namespace tSage
diff --git a/engines/tsage/ringworld/ringworld_scenes10.h b/engines/tsage/ringworld/ringworld_scenes10.h
new file mode 100644
index 0000000000..792234cc91
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_scenes10.h
@@ -0,0 +1,532 @@
+/* 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_RINGWORLD_SCENES10_H
+#define TSAGE_RINGWORLD_SCENES10_H
+
+#include "common/scummsys.h"
+#include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+
+namespace tSage {
+
+class SceneObject9150 : public SceneObject {
+public:
+ int _timer, _signalFlag;
+
+ virtual void synchronize(Serializer &s) {
+ SceneObject::synchronize(s);
+ s.syncAsSint16LE(_timer);
+ s.syncAsSint16LE(_signalFlag);
+ }
+ virtual Common::String getClassName() { return "SceneObject9150"; }
+};
+
+class Scene2 : public Scene {
+public :
+ int _sceneState;
+
+ Scene2();
+ virtual void synchronize(Serializer &s) {
+ Scene::synchronize(s);
+ s.syncAsSint16LE(_sceneState);
+ }
+};
+
+class Object9350 : public SceneObject {
+public:
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void draw();
+};
+
+class Scene9100 : public Scene {
+ /* Items */
+ class SceneHotspot1 : public NamedHotspot {
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ SequenceManager _sequenceManager;
+ SceneObject _object1;
+ SceneObject _object2;
+ SceneObject _object3;
+ SceneObject _object4;
+ SceneObject _object5;
+ SceneObject _object6;
+ SceneHotspot1 _sceneHotspot1;
+ NamedHotspot _sceneHotspot2;
+ NamedHotspot _sceneHotspot3;
+ NamedHotspot _sceneHotspot4;
+ NamedHotspot _sceneHotspot5;
+ NamedHotspot _sceneHotspot6;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene9150 : public Scene2 {
+ class Object3 : public SceneObject9150 {
+ public:
+ virtual void signal();
+ virtual void dispatch();
+ };
+public:
+ SequenceManager _sequenceManager1;
+ SequenceManager _sequenceManager2;
+ SceneObject _object1;
+ SceneObject _object2;
+ Object3 _object3;
+ NamedHotspot _sceneHotspot1;
+ NamedHotspot _sceneHotspot2;
+ NamedHotspot _sceneHotspot3;
+ NamedHotspot _sceneHotspot4;
+ NamedHotspot _sceneHotspot5;
+ NamedHotspot _sceneHotspot6;
+ NamedHotspot _sceneHotspot7;
+ NamedHotspot _sceneHotspot8;
+ NamedHotspot _sceneHotspot9;
+ NamedHotspot _sceneHotspot10;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene9200 : public Scene2 {
+ class SceneHotspot1 : public NamedHotspot{
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ SequenceManager _sequenceManager;
+ SceneObject _object1;
+ SceneObject _object2;
+ SceneObject _object3;
+ Action _action1;
+ SpeakerGText _speakerGText;
+ SpeakerGR _speakerGR;
+ SpeakerQText _speakerQText;
+ ASound _soundHandler;
+ SceneHotspot1 _hotspot1;
+ NamedHotspot _hotspot2;
+ NamedHotspot _hotspot3;
+ NamedHotspot _hotspot4;
+ NamedHotspot _hotspot5;
+ NamedHotspot _hotspot6;
+ NamedHotspot _hotspot7;
+ NamedHotspot _hotspot8;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+ virtual void process(Event &event);
+};
+
+class Scene9300 : public Scene {
+public:
+ SequenceManager _sequenceManager;
+ SceneObject _object1;
+ SceneObject _object2;
+ NamedHotspot _hotspot1;
+ NamedHotspot _hotspot2;
+ NamedHotspot _hotspot3;
+ NamedHotspot _hotspot4;
+ NamedHotspot _hotspot5;
+ NamedHotspot _hotspot6;
+ NamedHotspot _hotspot7;
+ NamedHotspot _hotspot8;
+ NamedHotspot _hotspot9;
+ NamedHotspot _hotspot10;
+ NamedHotspot _hotspot11;
+ NamedHotspot _hotspot12;
+ NamedHotspot _hotspot13;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene9350 : public Scene2 {
+public:
+ SequenceManager _sequenceManager;
+ Object9350 _object1;
+ SceneObject _object2;
+ NamedHotspot _sceneHotspot1;
+ NamedHotspot _sceneHotspot2;
+ NamedHotspot _sceneHotspot3;
+ NamedHotspot _sceneHotspot4;
+ NamedHotspot _sceneHotspot5;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene9360 : public Scene2 {
+public:
+ SequenceManager _sequenceManager;
+ Action _action1;
+ Object9350 _object1;
+ NamedHotspot _hotspot1;
+ NamedHotspot _hotspot2;
+ NamedHotspot _hotspot3;
+ NamedHotspot _hotspot4;
+ NamedHotspot _hotspot5;
+ NamedHotspot _hotspot6;
+ NamedHotspot _hotspot7;
+ NamedHotspot _hotspot8;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene9400 : public Scene2 {
+ class SceneHotspot7 : public NamedHotspot{
+ public:
+ virtual void doAction(int action);
+ };
+
+ class SceneHotspot8 : public NamedHotspot{
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ Scene9400();
+ SequenceManager _sequenceManager;
+ Action _action1;
+ SceneObject _object1;
+ SceneObject _object2;
+ SceneObject _object3;
+ SpeakerOText _speakerOText;
+ SpeakerOR _speakerOR;
+ SpeakerQText _speakerQText;
+ NamedHotspot _hotspot1;
+ NamedHotspot _hotspot2;
+ NamedHotspot _hotspot3;
+ NamedHotspot _hotspot4;
+ NamedHotspot _hotspot5;
+ NamedHotspot _hotspot6;
+ ASound _soundHandler;
+ int _field1032;
+ SceneHotspot7 _hotspot7;
+ SceneHotspot8 _hotspot8;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+ virtual void synchronize(Serializer &s);
+};
+
+class Scene9450 : public Scene2 {
+ class Object2 : public SceneObject {
+ public:
+ virtual void signal();
+ };
+
+ class Object3 : public SceneObject9150 {
+ public:
+ virtual void dispatch();
+ };
+
+ class Hotspot1 : public NamedHotspot{
+ public:
+ virtual void doAction(int action);
+ };
+
+ class Hotspot3 : public NamedHotspot{
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ SceneObject _object1;
+ SequenceManager _sequenceManager1;
+ SequenceManager _sequenceManager2;
+ Object2 _object2;
+ SequenceManager _sequenceManager3;
+ Object3 _object3;
+ Hotspot1 _hotspot1;
+ NamedHotspot _hotspot2;
+ Hotspot3 _hotspot3;
+ NamedHotspot _hotspot4;
+ NamedHotspot _hotspot5;
+ NamedHotspot _hotspot6;
+ NamedHotspot _hotspot7;
+ NamedHotspot _hotspot8;
+ NamedHotspot _hotspot9;
+ NamedHotspot _hotspot10;
+ NamedHotspot _hotspot11;
+ NamedHotspot _hotspot12;
+ NamedHotspot _hotspot13;
+ NamedHotspot _hotspot14;
+ NamedHotspot _hotspot15;
+ NamedHotspot _hotspot16;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene9500 : public Scene2 {
+ class Hotspot1 : public NamedHotspot{
+ public:
+ virtual void doAction(int action);
+ };
+
+ class Hotspot2 : public NamedHotspot{
+ public:
+ virtual void doAction(int action);
+ };
+
+ class Hotspot3 : public NamedHotspot{
+ public:
+ virtual void doAction(int action);
+ };
+
+ class Hotspot4 : public NamedHotspot{
+ public:
+ virtual void doAction(int action);
+ };
+
+public:
+ SequenceManager _sequenceManager;
+ SceneObject _candle;
+ SceneObject _object2;
+ SceneObject _object3;
+ Hotspot1 _hotspot1;
+ Hotspot2 _hotspot2;
+ Hotspot3 _hotspot3;
+ Hotspot4 _hotspot4;
+ Hotspot4 _hotspot5;
+ NamedHotspot _hotspot6;
+ NamedHotspot _hotspot7;
+ NamedHotspot _hotspot8;
+ NamedHotspot _hotspot9;
+ NamedHotspot _hotspot10;
+ NamedHotspot _hotspot11;
+ NamedHotspot _hotspot12;
+ NamedHotspot _hotspot13;
+ NamedHotspot _hotspot14;
+ NamedHotspot _hotspot15;
+ NamedHotspot _hotspot16;
+ NamedHotspot _hotspot17;
+ NamedHotspot _hotspot18;
+ NamedHotspot _hotspot19;
+ NamedHotspot _hotspot20;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+ virtual void process(Event &event);
+};
+
+class Scene9700 : public Scene2 {
+ SequenceManager _sequenceManager;
+ SceneObject _object1;
+ NamedHotspot _sceneHotspot1;
+ NamedHotspot _sceneHotspot2;
+ NamedHotspot _sceneHotspot3;
+ NamedHotspot _sceneHotspot4;
+ NamedHotspot _sceneHotspot5;
+ NamedHotspot _sceneHotspot6;
+ GfxButton _gfxButton1;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+};
+
+class Scene9750 : public Scene {
+public:
+ SequenceManager _sequenceManager;
+ SceneObject _object1;
+ SceneObject _object2;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene9850 : public Scene {
+ class Object6 : public SceneObject{
+ public:
+ virtual void doAction(int action);
+ };
+
+ class Object7 : public SceneObjectExt{
+ public:
+ virtual void doAction(int action);
+ };
+
+ class Hotspot12 : public NamedHotspot{
+ public:
+ virtual void doAction(int action);
+ };
+
+ class Hotspot14 : public NamedHotspot{
+ public:
+ virtual void doAction(int action);
+ };
+
+ class Hotspot16 : public NamedHotspot{
+ public:
+ virtual void doAction(int action);
+ };
+
+ class Hotspot17 : public NamedHotspot{
+ public:
+ virtual void doAction(int action);
+ };
+
+ class Hotspot18 : public NamedHotspot{
+ public:
+ virtual void doAction(int action);
+ };
+
+ class Hotspot19 : public NamedHotspot{
+ public:
+ virtual void doAction(int action);
+ };
+
+ class Hotspot20 : public NamedHotspot{
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ SequenceManager _sequenceManager;
+ SceneObject _objDoor;
+ SceneObject _objCloak;
+ SceneObject _objJacket;
+ SceneObject _objTunic2;
+ SceneObject _objLever;
+ Object6 _objScimitar;
+ Object7 _objSword;
+ ASound _soundHandler;
+ NamedHotspot _hotspot1;
+ NamedHotspot _hotspot2;
+ NamedHotspot _hotspot3;
+ NamedHotspot _hotspot4;
+ NamedHotspot _hotspot5;
+ NamedHotspot _hotspot6;
+ NamedHotspot _hotspot7;
+ NamedHotspot _hotspot8;
+ NamedHotspot _hotspot9;
+ NamedHotspot _hotspot10;
+ NamedHotspot _hotspot11;
+ Hotspot12 _hotspot12;
+ NamedHotspot _hotspot13;
+ Hotspot14 _hotspot14;
+ NamedHotspot _hotspot15;
+ Hotspot16 _hotspot16;
+ Hotspot17 _hotspot17;
+ Hotspot18 _hotspot18;
+ Hotspot19 _hotspot19;
+ Hotspot20 _spotLever;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene9900 : public Scene {
+ class strAction1 : public Action {
+ public:
+ SceneObject _object9;
+ ScenePalette _palette1;
+
+ virtual void signal();
+ };
+
+ class strAction2 : public Action {
+ public:
+ SceneText _txtArray1[2];
+ SceneText _txtArray2[2];
+ int _lineNum, _txtArray1Index, _var3;
+
+ virtual void signal();
+ virtual void dispatch();
+ virtual void synchronize(Serializer &s);
+ };
+
+ class strAction3 : public Action {
+ public:
+ SceneObject _object10;
+ ScenePalette _palette2;
+ ScenePalette _palette3;
+
+ virtual void signal();
+ };
+
+public:
+ ASound _soundHandler;
+ SequenceManager _sequenceManager;
+ SceneObject _object1;
+ SceneObject _object2;
+ SceneObject _object3;
+ SceneObject _object4;
+ SceneObject _object5;
+ SceneObject _object6;
+ SceneObject _object7;
+ SceneObjectExt _object8;
+ strAction1 _strAction1;
+ strAction2 _strAction2;
+ strAction3 _strAction3;
+ SpeakerMR _speakerMR;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+ virtual void process(Event &event);
+};
+
+class Scene9999 : public Scene {
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2 : public Action {
+ public:
+ virtual void signal();
+ };
+
+public:
+
+ Action1 _action1;
+ Action2 _action2;
+ Action _action3;
+ SceneObject _object1;
+ SceneObject _object2;
+ SceneObject _object3;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+};
+
+
+} // End of namespace tSage
+
+#endif
diff --git a/engines/tsage/ringworld/ringworld_scenes2.cpp b/engines/tsage/ringworld/ringworld_scenes2.cpp
new file mode 100644
index 0000000000..2dadaf4c30
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_scenes2.cpp
@@ -0,0 +1,928 @@
+/* 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 "common/config-manager.h"
+#include "tsage/ringworld/ringworld_scenes2.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+
+namespace tSage {
+
+/*--------------------------------------------------------------------------
+ * Scene 1000 - Title Screen
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene1000::Action1::signal() {
+ Scene1000 *scene = (Scene1000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(10);
+ break;
+ case 1:
+ scene->_object4.postInit();
+ scene->_object4.setVisage(1001);
+ scene->_object4._frame = 1;
+ scene->_object4.setStrip2(5);
+ scene->_object4.changeZoom(100);
+ scene->_object4.animate(ANIM_MODE_2, NULL);
+ scene->_object4.setPosition(Common::Point(403, 163));
+ setDelay(90);
+ break;
+ case 2: {
+ SceneItem::display(0, 0);
+ scene->_object4.remove();
+ scene->_object1.changeZoom(-1);
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(180, 100);
+ scene->_object1.addMover(mover, &pt, this);
+ break;
+ }
+ case 3:
+ _globals->_sceneManager.changeScene(1400);
+ break;
+ }
+
+}
+
+void Scene1000::Action2::signal() {
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(10);
+ break;
+ case 1:
+ SceneItem::display(1000, 0, SET_Y, 20, SET_FONT, 2, SET_BG_COLOR, -1,
+ SET_EXT_BGCOLOR, 35, SET_WIDTH, 200, SET_KEEP_ONSCREEN, 1, LIST_END);
+ setDelay(180);
+ break;
+ case 2:
+ SceneItem::display(0, 0);
+ _globals->_sceneManager.changeScene(2000);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene1000::Action3::signal() {
+ Scene1000 *scene = (Scene1000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_sceneManager._scene->loadBackground(0, 0);
+ setDelay(60);
+ break;
+ case 1: {
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(158, 31);
+ scene->_object3.addMover(mover, &pt, this);
+ break;
+ }
+ case 2:
+ case 3:
+ setDelay(60);
+ break;
+ case 4:
+ _globals->_player.show();
+ setDelay(240);
+ break;
+ case 5: {
+ _globals->_player.enableControl();
+
+ const char *SEEN_INTRO = "seen_intro";
+ if (!ConfMan.hasKey(SEEN_INTRO) || !ConfMan.getBool(SEEN_INTRO)) {
+ // First time being played, so show the introduction
+ ConfMan.setBool(SEEN_INTRO, true);
+ ConfMan.flushToDisk();
+
+ setDelay(1);
+ } else {
+ // Prompt user for whether to start play or watch introduction
+ _globals->_player.enableControl();
+
+ if (MessageDialog::show2(WATCH_INTRO_MSG, START_PLAY_BTN_STRING, INTRODUCTION_BTN_STRING) == 0) {
+ _actionIndex = 20;
+ _globals->_soundHandler.fadeOut(this);
+ } else {
+ setDelay(1);
+ }
+ }
+
+ _globals->_player.disableControl();
+ break;
+ }
+ case 6: {
+ scene->_object3.remove();
+ _globals->_player.setStrip2(2);
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(480, 100);
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 7:
+ _globals->_scenePalette.loadPalette(1002);
+ _globals->_scenePalette.refresh();
+ _globals->_scenePalette.addRotation(80, 95, -1);
+ scene->_object3.postInit();
+ scene->_object3.setVisage(1002);
+ scene->_object3.setStrip(1);
+ scene->_object3.setPosition(Common::Point(284, 122));
+ scene->_object3.changeZoom(1);
+
+ zoom(true);
+ setDelay(200);
+ break;
+ case 8:
+ zoom(false);
+ setDelay(10);
+ break;
+ case 9:
+ scene->_object3.setStrip(2);
+ scene->_object3.setPosition(Common::Point(285, 155));
+
+ zoom(true);
+ setDelay(400);
+ break;
+ case 10:
+ zoom(false);
+ setDelay(10);
+ break;
+ case 11:
+ scene->_object3.setStrip(3);
+ scene->_object3.setPosition(Common::Point(279, 172));
+
+ zoom(true);
+ setDelay(240);
+ break;
+ case 12:
+ zoom(false);
+ setDelay(10);
+ break;
+ case 13:
+ scene->_object3.setStrip(4);
+ scene->_object3.setPosition(Common::Point(270, 128));
+
+ zoom(true);
+ setDelay(300);
+ break;
+ case 14:
+ zoom(false);
+ setDelay(10);
+ break;
+ case 15:
+ scene->_object3.setStrip(1);
+ scene->_object3.setFrame(2);
+ scene->_object3.setPosition(Common::Point(283, 137));
+
+ zoom(true);
+ setDelay(300);
+ break;
+ case 16:
+ zoom(false);
+ setDelay(10);
+ break;
+ case 17:
+ scene->_object3.setStrip(5);
+ scene->_object3.setFrame(1);
+ scene->_object3.setPosition(Common::Point(292, 192));
+
+ zoom(true);
+ setDelay(300);
+ break;
+ case 18:
+ zoom(false);
+ _globals->_scenePalette.clearListeners();
+ _globals->_soundHandler.fadeOut(this);
+ break;
+ case 19:
+ _globals->_sceneManager.changeScene(10);
+ break;
+ case 20:
+ _globals->_sceneManager.changeScene(30);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene1000::Action3::zoom(bool up) {
+ Scene1000 *scene = (Scene1000 *)_globals->_sceneManager._scene;
+
+ if (up) {
+ while ((scene->_object3._percent < 100) && !_vm->shouldQuit()) {
+ scene->_object3.changeZoom(MIN(scene->_object3._percent + 5, 100));
+ _globals->_sceneObjects->draw();
+ _globals->_events.delay(1);
+ }
+ } else {
+ while ((scene->_object3._percent > 0) && !_vm->shouldQuit()) {
+ scene->_object3.changeZoom(MAX(scene->_object3._percent - 5, 0));
+ _globals->_sceneObjects->draw();
+ _globals->_events.delay(1);
+ }
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene1000::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ setZoomPercents(0, 100, 200, 100);
+ loadScene(1000);
+
+ if (_globals->_sceneManager._previousScene == 2000) {
+ setZoomPercents(150, 10, 180, 100);
+ _object1.postInit();
+ _object1.setVisage(1001);
+ _object1._strip = 7;
+ _object1.animate(ANIM_MODE_2, 0);
+ _object1._moveDiff = Common::Point(1, 1);
+ _object1.setPosition(Common::Point(120, 180));
+
+ setAction(&_action2);
+
+ _globals->_sceneManager._scene->_sceneBounds.center(_object1._position.x, _object1._position.y);
+ _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
+
+ _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+ _globals->_soundHandler.play(114);
+ } else if (_globals->_sceneManager._previousScene == 2222) {
+ setZoomPercents(150, 10, 180, 100);
+ _object1.postInit();
+ _object1.setVisage(1001);
+ _object1._strip = 7;
+ _object1.animate(ANIM_MODE_2, 0);
+ _object1._moveDiff = Common::Point(2, 2);
+ _object1.setPosition(Common::Point(120, 180));
+
+ _globals->_sceneManager._scene->_sceneBounds.center(_object1._position.x, _object1._position.y);
+ _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
+ _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+
+ setAction(&_action1);
+ } else {
+ _globals->_soundHandler.play(4);
+ setZoomPercents(0, 10, 30, 100);
+ _object3.postInit();
+ _object3.setVisage(1050);
+ _object3.changeZoom(-1);
+ _object3.setPosition(Common::Point(158, 0));
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(1050);
+ _globals->_player.setStrip(3);
+ _globals->_player.setPosition(Common::Point(160, 191));
+ _globals->_player._moveDiff.x = 12;
+ _globals->_player.hide();
+ _globals->_player.disableControl();
+
+ _globals->_sceneManager._scene->_sceneBounds.center(_object3._position.x, _object3._position.y);
+
+ setAction(&_action3);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 1001 - Fleeing planet cutscene
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene1001::Action1::signal() {
+ Scene1001 *scene = (Scene1001 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(10);
+ break;
+ case 1:
+ scene->_object3.animate(ANIM_MODE_5, this);
+ break;
+ case 2: {
+ Common::Point pt(108, 171);
+ NpcMover *mover = new NpcMover();
+ scene->_object3.addMover(mover, &pt, this);
+ break;
+ }
+ case 3: {
+ Common::Point pt(170, 159);
+ NpcMover *mover = new NpcMover();
+ scene->_object3.addMover(mover, &pt, this);
+ break;
+ }
+ case 4: {
+ scene->_object2.postInit();
+ scene->_object2.setVisage(16);
+ scene->_object2.setStrip2(4);
+ scene->_object2.setPosition(Common::Point(61, 177));
+ scene->_object2.animate(ANIM_MODE_5, this);
+
+ Common::Point pt(320, 100);
+ NpcMover *mover = new NpcMover();
+ scene->_object3.addMover(mover, &pt, this);
+ break;
+ }
+ case 5: {
+ Common::Point pt(82, 166);
+ NpcMover *mover = new NpcMover();
+ scene->_object2.addMover(mover, &pt, this);
+ break;
+ }
+ case 6: {
+ Common::Point pt(64, 149);
+ NpcMover *mover = new NpcMover();
+ scene->_object2.addMover(mover, &pt, this);
+ break;
+ }
+ case 7: {
+ Common::Point pt(15, 136);
+ NpcMover *mover = new NpcMover();
+ scene->_object2.addMover(mover, &pt, this);
+ break;
+ }
+ case 8: {
+ Common::Point pt(-5, 120);
+ NpcMover *mover = new NpcMover();
+ scene->_object2.addMover(mover, &pt, this);
+ break;
+ }
+ case 9: {
+ scene->_object1.postInit();
+ scene->_object1.setVisage(16);
+ scene->_object1.setStrip2(1);
+ scene->_object1.setFrame(1);
+ scene->_object1.setPosition(Common::Point(-75, 87));
+ scene->_object1.animate(ANIM_MODE_2, NULL);
+
+ Common::Point pt(0, 100);
+ NpcMover *mover = new NpcMover();
+ scene->_object1.addMover(mover, &pt, this);
+ break;
+ }
+ case 10: {
+ Common::Point pt1(107, 115);
+ NpcMover *mover1 = new NpcMover();
+ scene->_object1.addMover(mover1, &pt1, NULL);
+
+ scene->_object3.setVisage(16);
+ scene->_object3.setStrip2(5);
+ scene->_object3.setFrame2(2);
+ scene->_object3.setPosition(Common::Point(220, 200));
+
+ Common::Point pt2(187, 181);
+ NpcMover *mover2 = new NpcMover();
+ scene->_object3.addMover(mover2, &pt2, this);
+ break;
+ }
+ case 11: {
+ scene->_object2.setVisage(16);
+ scene->_object2.setStrip2(5);
+ scene->_object2.setFrame2(1);
+ scene->_object2.setPosition(Common::Point(211, 0));
+
+ Common::Point pt(189, 30);
+ NpcMover *mover = new NpcMover();
+ scene->_object2.addMover(mover, &pt, this);
+ break;
+ }
+ case 12:
+ scene->_stripManager.start(100, this);
+ break;
+ case 13: {
+ scene->_object4.postInit();
+ scene->_object4.setVisage(16);
+ scene->_object4.setStrip2(2);
+ scene->_object4.setFrame(4);
+ scene->_object4.setPosition(Common::Point(360, 80));
+ scene->_object4.animate(ANIM_MODE_2, NULL);
+
+ Common::Point pt(303, 97);
+ NpcMover *mover = new NpcMover();
+ scene->_object4.addMover(mover, &pt, this);
+ break;
+ }
+ case 14:
+ scene->_stripManager.start(110, this);
+ break;
+ case 15:
+ setDelay(10);
+ break;
+ case 16: {
+ scene->_soundHandler1.play(90);
+
+ scene->_object6.postInit();
+ scene->_object6.setVisage(16);
+ scene->_object6.setStrip2(6);
+ scene->_object6.setFrame2(2);
+ scene->_object6._moveDiff = Common::Point(20, 20);
+ scene->_object6.fixPriority(20);
+ scene->_object6.setPosition(Common::Point(scene->_object2._position.x - 6, scene->_object2._position.y + 7));
+ scene->_object6.animate(ANIM_MODE_5, NULL);
+
+ Common::Point pt(scene->_object6._position.x - 70, scene->_object6._position.y + 70);
+ NpcMover *mover = new NpcMover();
+ scene->_object6.addMover(mover, &pt, this);
+ break;
+ }
+ case 17: {
+ scene->_soundHandler1.play(90);
+ scene->_object6.remove();
+
+ scene->_object7.postInit();
+ scene->_object7.setVisage(16);
+ scene->_object7.setStrip2(6);
+ scene->_object7.setFrame2(1);
+ scene->_object7._moveDiff = Common::Point(20, 20);
+ scene->_object7.setPosition(Common::Point(scene->_object3._position.x - 28, scene->_object3._position.y - 11));
+ scene->_object7.fixPriority(200);
+ scene->_object7.animate(ANIM_MODE_5, NULL);
+
+ Common::Point pt(scene->_object7._position.x - 70, scene->_object7._position.y - 70);
+ NpcMover *mover = new NpcMover();
+ scene->_object7.addMover(mover, &pt, this);
+ break;
+ }
+ case 18:
+ scene->_object7.remove();
+
+ scene->_object5.postInit();
+ scene->_object5.setVisage(16);
+ scene->_object5.setPosition(Common::Point(306, 93));
+ scene->_object5._strip = 3;
+ scene->_object5.fixPriority(200);
+ scene->_object5.animate(ANIM_MODE_2, NULL);
+ setDelay(30);
+ break;
+ case 19: {
+ _globals->_soundHandler.play(91);
+ byte adjustData[4] = {0xff, 0xff, 0xff, 0};
+ _globals->_scenePalette.fade(adjustData, false, 0);
+
+ scene->_object1._strip = 7;
+ scene->_object1._frame = 1;
+ scene->_object1.setPosition(Common::Point(314, 112));
+ scene->_object1.addMover(NULL);
+ setDelay(2);
+ break;
+ }
+ case 20:
+ _globals->_scenePalette.loadPalette(16);
+ _globals->_scenePalette.refresh();
+ setDelay(6);
+ break;
+ case 21:
+ scene->_object1._numFrames = 15;
+ scene->_object1.animate(ANIM_MODE_5, this);
+ break;
+ case 22:
+ _globals->_soundHandler.play(92);
+ scene->_stripManager.start(111, this);
+ break;
+ case 23:
+ setDelay(60);
+ break;
+ case 24:
+ _globals->_sceneManager.changeScene(2000);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene1001::postInit(SceneObjectList *OwnerList) {
+ loadScene(16);
+ Scene::postInit();
+ setZoomPercents(0, 100, 200, 100);
+
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerCText);
+ _stripManager.addSpeaker(&_speakerCR);
+ _stripManager.addSpeaker(&_speakerSL);
+ _speakerQText._color1 = 11;
+
+ _object3.postInit();
+ _object3.setVisage(16);
+ _object3.setStrip2(4);
+ _object3.setPosition(Common::Point(61, 177));
+
+ _globals->_soundHandler.play(85);
+ setAction(&_action1);
+}
+
+
+/*--------------------------------------------------------------------------
+ * Scene 1250 -
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene1250::Action1::signal() {
+ Scene1250 *scene = (Scene1250 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(_globals->_randomSource.getRandomNumber(120) + 60);
+ break;
+ case 1:
+ scene->_object1.animate(ANIM_MODE_5, this);
+ _actionIndex = 0;
+ break;
+ }
+}
+
+void Scene1250::Action2::signal() {
+ Scene1250 *scene = (Scene1250 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ switch (_globals->_randomSource.getRandomNumber(2)) {
+ case 0:
+ scene->_object2.setPosition(Common::Point(163, 75));
+ break;
+ case 1:
+ scene->_object2.setPosition(Common::Point(109, 65));
+ break;
+ case 2:
+ scene->_object2.setPosition(Common::Point(267, 20));
+ break;
+ }
+
+ setDelay(30);
+ break;
+ case 1:
+ scene->_object2.animate(ANIM_MODE_5, this);
+ _actionIndex = 0;
+ break;
+ }
+}
+
+void Scene1250::Action3::signal() {
+ Scene1250 *scene = (Scene1250 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(30);
+ break;
+ case 1:
+ scene->_stripManager.start(1251, this);
+ break;
+ case 2:
+ setDelay(6);
+ break;
+ case 3:
+ _globals->_sceneManager.changeScene(1000);
+ break;
+ }
+}
+
+void Scene1250::Action4::signal() {
+ Scene1250 *scene = (Scene1250 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(3);
+ break;
+ case 1:
+ scene->_stripManager.start(1250, this);
+ break;
+ case 2:
+ setDelay(6);
+ break;
+ case 3:
+ _globals->_sceneManager.changeScene(2000);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene1250::postInit(SceneObjectList *OwnerList) {
+ loadScene(1250);
+ Scene::postInit();
+ setZoomPercents(0, 100, 200, 100);
+
+ _stripManager.addSpeaker(&_speakerQText);
+ _speakerQText._textPos = Common::Point(120, 120);
+ _speakerQText._textWidth = 180;
+
+ _object1.postInit();
+ _object1.setVisage(1250);
+ _object1.setPosition(Common::Point(126, 69));
+ _object1.setStrip2(1);
+ _object1._frame = 1;
+ _object1.setAction(&_action1);
+
+ _object2.postInit();
+ _object2.setVisage(1250);
+ _object2.setPosition(Common::Point(126, 69));
+ _object2.setStrip2(2);
+ _object2.fixPriority(255);
+ _object2._frame = 1;
+ _object2.setAction(&_action2);
+
+ _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
+ _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+
+ if ((_globals->_sceneManager._previousScene != 2000) || (_globals->_stripNum != 1250)) {
+ setAction(&_action4);
+ } else {
+ setAction(&_action3);
+ _globals->_soundHandler.play(114);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 1400 - Ringworld Wall
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene1400::Action1::signal() {
+ Scene1400 *scene = (Scene1400 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(5);
+ break;
+ case 1: {
+ SceneItem::display(1400, 0, SET_X, 120, SET_Y, 610, SET_FONT, 2, SET_EXT_BGCOLOR, 23, SET_KEEP_ONSCREEN, -1, LIST_END);
+
+ Common::Point pt(160, 700);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 2: {
+ _globals->_player.setStrip2(3);
+ _globals->_player.changeZoom(100);
+
+ Common::Point pt(160, 100);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+
+ SceneItem::display(0, 0);
+ setDelay(360);
+ break;
+ }
+ case 3:
+ SceneItem::display(1400, 2, SET_X, 60, SET_Y, _globals->_sceneManager._scene->_sceneBounds.bottom - 80,
+ SET_FONT, 2, SET_FG_COLOR, 13, SET_POS_MODE, 0, SET_KEEP_ONSCREEN, -1, LIST_END);
+ setDelay(420);
+ break;
+ case 4:
+ SceneItem::display(0, 0);
+ setDelay(360);
+ break;
+ case 5:
+ SceneItem::display(1400, 3, SET_X, 60, SET_Y, _globals->_sceneManager._scene->_sceneBounds.bottom - 80,
+ SET_FONT, 2, SET_FG_COLOR, 23, SET_POS_MODE, 0, SET_KEEP_ONSCREEN, -1, LIST_END);
+ setDelay(360);
+ break;
+ case 6:
+ SceneItem::display(0, 0);
+ break;
+ case 7: {
+ _globals->_player._frame = 1;
+ _globals->_player.setStrip2(1);
+ _globals->_player._numFrames = 5;
+ _globals->_player.animate(ANIM_MODE_5, this);
+
+ Common::Point pt(205, 70);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, NULL);
+ _globals->_sceneManager._fadeMode = FADEMODE_NONE;
+
+ scene->loadScene(1402);
+ break;
+ }
+ case 8:
+ _globals->_player.setStrip2(2);
+ _globals->_player._numFrames = 10;
+ _globals->_player.animate(ANIM_MODE_2, NULL);
+
+ SceneItem::display(1400, 4, SET_X, 30, SET_Y, _globals->_player._position.y + 10, SET_FONT, 2,
+ SET_FG_COLOR, 13, SET_POS_MODE, 0, SET_KEEP_ONSCREEN, -1, LIST_END);
+ setDelay(300);
+ break;
+ case 9: {
+ SceneItem::display(0, 0);
+ Common::Point pt(450, 45);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 10:
+ _globals->_sceneManager._scrollerRect = Rect(40, 20, 280, 180);
+ _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
+ _globals->_stripNum = 1500;
+ _globals->_soundHandler.stop();
+
+ _globals->_sceneManager.changeScene(1500);
+ break;
+ }
+}
+
+void Scene1400::Action1::dispatch() {
+ Action::dispatch();
+
+ if ((_actionIndex > 3) && (_actionIndex < 9))
+ _globals->_sceneText.setPosition(Common::Point(60, _globals->_sceneManager._scene->_sceneBounds.bottom - 80));
+
+ if ((_actionIndex <= 2) && (_globals->_player._percent > 22))
+ _globals->_player.changeZoom(100 - (800 - _globals->_player._position.y));
+
+ if ((_actionIndex >= 9) && (_globals->_player._percent > 22))
+ _globals->_player.changeZoom(100 - (_globals->_player._position.x - 205));
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene1400::postInit(SceneObjectList *OwnerList) {
+ if (_globals->_stripNum != 1400) {
+ loadScene(1401);
+ } else {
+ loadScene(1402);
+ }
+ Scene::postInit();
+
+ _globals->_sceneManager._scrollerRect = Rect(40, 90, 280, 180);
+ _globals->_player.postInit();
+ _globals->_player.setVisage(1401);
+ _globals->_player.animate(ANIM_MODE_2, 0);
+ _globals->_player.setStrip2(4);
+ _globals->_player.fixPriority(4);
+ _globals->_player.disableControl();
+
+ _globals->_player._moveDiff = Common::Point(4, 2);
+ _globals->_player.setPosition(Common::Point(160, 800));
+ _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position);
+ _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
+ _globals->_sceneOffset.y = (_globals->_sceneManager._scene->_sceneBounds.top / 100) * 100;
+
+ setAction(&_action1);
+ _globals->_soundHandler.play(118);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 1500 - Ringworld Space-port
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene1500::Action1::signal() {
+ Scene1500 *scene = (Scene1500 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ scene->_object1.postInit();
+ scene->_object1.setVisage(1501);
+ scene->_object1._moveDiff = Common::Point(2, 1);
+ scene->_object1.setPosition(Common::Point(204, 85));
+ scene->_object1.animate(ANIM_MODE_2, NULL);
+ scene->_object1._numFrames = 3;
+ scene->_object1.changeZoom(-1);
+
+ Common::Point pt(238, 121);
+ PlayerMover *mover = new PlayerMover();
+ scene->_object1.addMover(mover, &pt, this);
+ break;
+ }
+ case 1: {
+ Common::Point pt(312, 145);
+ PlayerMover *mover = new PlayerMover();
+ scene->_object1.addMover(mover, &pt, this);
+ break;
+ }
+ case 2: {
+ scene->_object1.setStrip(2);
+ scene->_object1.setFrame(1);
+ scene->_object1._moveDiff.y = 2;
+ scene->_object1._numFrames = 5;
+
+ Common::Point pt(310, 150);
+ PlayerMover *mover = new PlayerMover();
+ scene->_object1.addMover(mover, &pt, this);
+ break;
+ }
+ case 3: {
+ Common::Point pt(304, 165);
+ PlayerMover *mover = new PlayerMover();
+ scene->_object1.addMover(mover, &pt, this);
+ break;
+ }
+ case 4: {
+ scene->_object1._numFrames = 3;
+ scene->_object1.setStrip2(3);
+ scene->_object1.animate(ANIM_MODE_2, this);
+
+ Common::Point pt(94, 175);
+ PlayerMover *mover = new PlayerMover();
+ scene->_object1.addMover(mover, &pt, this);
+ break;
+ }
+ case 5:
+ setDelay(30);
+ break;
+ case 6:
+ scene->_soundHandler.play(123);
+ scene->_object1.setStrip2(4);
+ scene->_object1.setFrame(1);
+ scene->_object1.animate(ANIM_MODE_5, this);
+ break;
+ case 7:
+ scene->_object1.setStrip2(5);
+ scene->_object1.animate(ANIM_MODE_2, NULL);
+ scene->_soundHandler.play(124, this);
+ break;
+ case 8:
+ _globals->_soundHandler.play(126, this);
+ break;
+ case 9:
+ _globals->_soundHandler.play(127);
+ _globals->_sceneManager.changeScene(2000);
+ break;
+ }
+}
+
+void Scene1500::Action2::signal() {
+ Scene1500 *scene = (Scene1500 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(6);
+ break;
+ case 1: {
+ scene->_object2.postInit();
+ scene->_object2.setVisage(1502);
+ scene->_object2.fixPriority(255);
+ scene->_object2.changeZoom(5);
+ scene->_object2._frame = 1;
+ scene->_object2._moveDiff = Common::Point(1, 1);
+ scene->_object2.setPosition(Common::Point(104, 184));
+ scene->_object2.animate(ANIM_MODE_2, NULL);
+
+ Common::Point pt(118, 147);
+ NpcMover *mover = new NpcMover();
+ scene->_object2.addMover(mover, &pt, this);
+ break;
+ }
+ case 2: {
+ scene->_object2._moveDiff.x = 5;
+ scene->_object2.changeZoom(-1);
+ Common::Point pt(-55, 200);
+ NpcMover *mover = new NpcMover();
+ scene->_object2.addMover(mover, &pt, this);
+ break;
+ }
+ case 3:
+ scene->_soundHandler.release();
+ _globals->_stripNum = 1505;
+ _globals->_sceneManager.changeScene(2400);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene1500::postInit(SceneObjectList *OwnerList) {
+ loadScene(1500);
+ Scene::postInit();
+
+ if ((_globals->_stripNum == 1500) || ((_globals->_stripNum != 1504) && (_globals->_stripNum != 2751))) {
+ _globals->_soundHandler.play(120);
+ setZoomPercents(105, 20, 145, 100);
+
+ setAction(&_action1);
+ } else {
+ setZoomPercents(150, 5, 200, 100);
+
+ _object1.postInit();
+ _object1.setVisage(1501);
+ _object1.setStrip2(5);
+ _object1.setPosition(Common::Point(94, 175));
+ _object1.animate(ANIM_MODE_2, NULL);
+
+ setAction(&_action2);
+ }
+}
+
+} // End of namespace tSage
diff --git a/engines/tsage/ringworld/ringworld_scenes2.h b/engines/tsage/ringworld/ringworld_scenes2.h
new file mode 100644
index 0000000000..ef3158bbb9
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_scenes2.h
@@ -0,0 +1,149 @@
+/* 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_RINGWORLD_SCENES2_H
+#define TSAGE_RINGWORLD_SCENES2_H
+
+#include "common/scummsys.h"
+#include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+
+namespace tSage {
+
+class Scene1000 : public Scene {
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action3 : public Action {
+ private:
+ void zoom(bool up);
+ public:
+ virtual void signal();
+ };
+
+public:
+ SceneObject _object1, _object2, _object3, _object4;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+};
+
+class Scene1001 : public Scene {
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ SpeakerQText _speakerQText;
+ SpeakerSL _speakerSL;
+ SpeakerCText _speakerCText;
+ SpeakerCR _speakerCR;
+ Action1 _action1;
+ SceneObject _object1, _object2, _object3, _object4;
+ SceneObject _object5, _object6, _object7;
+ ASound _soundHandler1, _soundHandler2;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+};
+
+class Scene1250 : public Scene {
+public:
+ /* 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();
+ };
+public:
+ SpeakerQText _speakerQText;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ SceneObject _object1, _object2;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+};
+
+class Scene1400 : public Scene {
+public:
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ virtual void dispatch();
+ };
+public:
+ Action1 _action1;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+
+};
+
+class Scene1500 : public Scene {
+public:
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2 : public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ ASound _soundHandler;
+ Action1 _action1;
+ Action2 _action2;
+ SceneObject _object1, _object2, _object3;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+};
+
+
+
+} // End of namespace tSage
+
+#endif
diff --git a/engines/tsage/ringworld/ringworld_scenes3.cpp b/engines/tsage/ringworld/ringworld_scenes3.cpp
new file mode 100644
index 0000000000..3d8f151c35
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_scenes3.cpp
@@ -0,0 +1,6133 @@
+/* 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 "common/config-manager.h"
+#include "tsage/ringworld/ringworld_scenes3.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+
+namespace tSage {
+
+/*--------------------------------------------------------------------------
+ * Scene 2000 - Cockpit cutscenes
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene2000::Action1::signal() {
+ Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ error("Old stuff");
+ break;
+ case 1:
+ scene->_stripManager.start(2075, this);
+ break;
+ case 2:
+ setDelay(4);
+ break;
+ case 3:
+ _globals->_stripNum = 0;
+ _globals->_sceneManager.changeScene(1250);
+ break;
+ }
+}
+
+void Scene2000::Action2::signal() {
+ Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_object2.animate(ANIM_MODE_6, NULL);
+ setDelay(_globals->_randomSource.getRandomNumber(179) + 60);
+ break;
+ case 1:
+ setDelay(_globals->_randomSource.getRandomNumber(179) + 60);
+ if (_globals->_randomSource.getRandomNumber(4) >= 2)
+ _actionIndex = 0;
+ break;
+ case 2:
+ setDelay(_globals->_randomSource.getRandomNumber(179) + 60);
+ _actionIndex = _globals->_randomSource.getRandomNumber(1);
+ break;
+ }
+}
+
+void Scene2000::Action3::signal() {
+ Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_object6.animate(ANIM_MODE_5, NULL);
+ setDelay(_globals->_randomSource.getRandomNumber(179) + 60);
+ break;
+ case 1:
+ scene->_object6.animate(ANIM_MODE_6, NULL);
+ setDelay(_globals->_randomSource.getRandomNumber(179) + 60);
+ _actionIndex = 0;
+ break;
+ }
+}
+
+void Scene2000::Action4::signal() {
+ Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_object4.animate(ANIM_MODE_5, NULL);
+ setDelay(_globals->_randomSource.getRandomNumber(179) + 60);
+ break;
+ case 1:
+ scene->_object4.animate(ANIM_MODE_6, NULL);
+ setDelay(_globals->_randomSource.getRandomNumber(179) + 60);
+ _actionIndex = 0;
+ break;
+ }
+}
+
+void Scene2000::Action5::signal() {
+ Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_object3.animate(ANIM_MODE_5, NULL);
+ setDelay(_globals->_randomSource.getRandomNumber(125) + 300);
+ break;
+ case 1:
+ scene->_object3.animate(ANIM_MODE_6, NULL);
+ setDelay(_globals->_randomSource.getRandomNumber(125) + 300);
+ _actionIndex = 0;
+ break;
+ }
+}
+
+void Scene2000::Action6::signal() {
+ Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(130);
+ break;
+ case 1:
+ scene->_soundHandler2.play(79);
+ scene->_stripManager.start(2000, this);
+ break;
+ case 2:
+ _globals->_soundHandler.play(81);
+ scene->_object6.postInit();
+ scene->_object6.setVisage(2003);
+ scene->_object6.setAction(NULL);
+ scene->_object6.setStrip2(2);
+ scene->_object6.setPosition(Common::Point(184, 137));
+ scene->_object6.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ scene->_stripManager.start(95, this);
+ break;
+ case 4:
+ scene->_object6.animate(ANIM_MODE_6, this);
+ break;
+ case 5:
+ _globals->_soundHandler.play(80);
+ scene->_object6.remove();
+ _globals->_sceneManager.changeScene(1001);
+ break;
+ }
+}
+
+void Scene2000::Action7::signal() {
+ Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(30);
+ break;
+ case 1:
+ scene->_stripManager.start(2072, this);
+ break;
+ case 2:
+ setDelay(3);
+ break;
+ case 3:
+ _globals->_sceneManager.changeScene(2222);
+ break;
+ }
+}
+
+void Scene2000::Action8::signal() {
+ Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ error("Old stuff");
+ break;
+ case 1:
+ scene->_stripManager.start(2073, this);
+ break;
+ case 2:
+ setDelay(10);
+ break;
+ case 3:
+ _globals->_stripNum = 2005;
+ _globals->_sceneManager.changeScene(1000);
+ break;
+ }
+}
+
+void Scene2000::Action9::signal() {
+ Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ error("Old stuff");
+ break;
+ case 1:
+ scene->_stripManager.start(2074, this);
+ break;
+ case 2:
+ setDelay(3);
+ break;
+ case 3:
+ _globals->_stripNum = 2008;
+ _globals->_sceneManager.changeScene(9999);
+ break;
+ }
+}
+
+void Scene2000::Action10::signal() {
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(30);
+ break;
+ case 1:
+ error("Old stuff");
+ break;
+ case 2:
+ SceneItem::display(2000, 17, SET_Y, 20, SET_X, 110, SET_FONT, 2, SET_BG_COLOR, -1,
+ SET_FG_COLOR, 17, SET_WIDTH, 200, SET_POS_MODE, 0, SET_KEEP_ONSCREEN, 1, LIST_END);
+ break;
+ case 3:
+ SceneItem::display(0, 0);
+ _globals->_stripNum = 0;
+ _globals->_sceneManager.changeScene(9999);
+ break;
+ }
+}
+
+void Scene2000::Action11::signal() {
+ Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ error("Old stuff");
+ break;
+ case 1:
+ scene->_stripManager.start(2076, this);
+ break;
+ case 2:
+ scene->_stripManager.start(2077, this);
+ break;
+ case 3:
+ _globals->_stripNum = 0;
+ _globals->_sceneManager.changeScene(1400);
+ break;
+ }
+}
+
+void Scene2000::Action12::signal() {
+ Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(60);
+ break;
+ case 1:
+ _globals->_events.setCursor(CURSOR_WALK);
+ scene->_stripManager.start(2020, this);
+ break;
+ case 2:
+ _globals->_player.disableControl();
+ setDelay(10);
+ break;
+ case 3:
+ _globals->_sceneManager.changeScene(2300);
+ break;
+ }
+}
+
+void Scene2000::Action13::signal() {
+ Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(30);
+ break;
+ case 1:
+ scene->_stripManager.start(2078, this);
+ break;
+ case 2:
+ SceneItem::display(0, 0);
+ _globals->_stripNum = 2751;
+ _globals->_sceneManager.changeScene(1500);
+ break;
+ }
+}
+
+void Scene2000::Action14::signal() {
+ Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(30);
+ break;
+ case 1:
+ scene->_stripManager.start(2070, this);
+ break;
+ case 2:
+ setDelay(60);
+ break;
+ case 3:
+ _globals->_soundHandler.play(99);
+ scene->_object8.show();
+ scene->_object8.animate(ANIM_MODE_5, this);
+ break;
+ case 4:
+ _globals->_soundHandler.play(12);
+ scene->_object8.setStrip(2);
+ scene->_object8.setFrame(1);
+ scene->_object9.show();
+ scene->_object10.show();
+ setDelay(60);
+ break;
+ case 5:
+ scene->_stripManager.start(2001, this, scene);
+ break;
+ case 6:
+ _globals->_soundHandler.fadeOut(NULL);
+ scene->_object8.setStrip(1);
+ scene->_object8.setFrame(scene->_object8.getFrameCount());
+ scene->_object8.animate(ANIM_MODE_6, this);
+
+ scene->_object9.remove();
+ scene->_object10.remove();
+ break;
+ case 7:
+ _globals->_soundHandler.play(111);
+ scene->_object8.remove();
+ setDelay(5);
+ break;
+ case 8:
+ scene->_stripManager.start(2071, this);
+ break;
+ case 9:
+ _globals->_stripNum = 1250;
+ _globals->_sceneManager.changeScene(1000);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene2000::postInit(SceneObjectList *OwnerList) {
+ loadScene(2000);
+ Scene::postInit();
+ setZoomPercents(0, 100, 200, 100);
+
+ _stripManager.addSpeaker(&_speakerQR);
+ _stripManager.addSpeaker(&_speakerSL);
+ _stripManager.addSpeaker(&_speakerMR);
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerMText);
+ _stripManager.addSpeaker(&_speakerSText);
+ _stripManager.addSpeaker(&_speakerGameText);
+ _stripManager.addSpeaker(&_speakerHText);
+
+ _speakerQText._npc = &_object2;
+ _speakerSText._npc = &_object3;
+ _speakerMText._npc = &_object6;
+ _speakerHText._npc = &_object6;
+ _stripManager.setCallback(this);
+
+ _object3.postInit();
+ _object3.setVisage(2002);
+ _object3.setPosition(Common::Point(65, 199));
+
+ _object4.postInit();
+ _object4.setVisage(2002);
+ _object4.setStrip(2);
+ _object4.setPosition(Common::Point(125, 199));
+ _object4.setAction(&_action4);
+
+ _object2.postInit();
+ _object2.setVisage(2001);
+ _object2.setPosition(Common::Point(43, 115));
+ _object2.setAction(&_action2);
+
+ _globals->_player.disableControl();
+
+ _object6.postInit();
+ _object6.setVisage(2003);
+ _object6.setPosition(Common::Point(267, 170));
+ _object6.setAction(&_action3);
+
+ _object8.postInit();
+ _object8.setVisage(2005);
+ _object8.setPosition(Common::Point(169, 133));
+ _object8.setPriority(133);
+ _object8.hide();
+
+ _object9.postInit();
+ _object9.setVisage(2005);
+ _object9.setStrip2(3);
+ _object9.setFrame(4);
+ _object9.setPosition(Common::Point(136, 86));
+ _object9.fixPriority(190);
+ _object9.hide();
+
+ _object10.postInit();
+ _object10.setVisage(2005);
+ _object10.setStrip2(5);
+ _object10.setFrame(4);
+ _object10.setPosition(Common::Point(202, 86));
+ _object10.fixPriority(195);
+ _object10.hide();
+
+ switch (_globals->_sceneManager._previousScene) {
+ case 1000:
+ setAction(&_action7);
+ break;
+ case 1001:
+ _object6.remove();
+ setAction(&_action12);
+ break;
+ case 1500:
+ setAction(&_action13);
+ break;
+ case 2200:
+ _globals->_soundHandler.play(111);
+ setAction(&_action14);
+ break;
+ case 2222:
+ _globals->_soundHandler.play(115);
+ setAction(&_action8);
+ break;
+ case 3500:
+ setAction(&_action11);
+ break;
+ default:
+ _object6.remove();
+ _globals->_soundHandler.play(80);
+ setAction(&_action6);
+ break;
+ }
+
+ _soundHandler1.play(78);
+ _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
+ _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+}
+
+void Scene2000::stripCallback(int v) {
+ switch (v) {
+ case 0:
+ _object9.setStrip(3);
+ _object9.animate(ANIM_MODE_7, NULL);
+ _object10.setStrip(6);
+ _object10.setFrame(1);
+ _object10.animate(ANIM_MODE_5, NULL);
+ break;
+ case 1:
+ _object10.setStrip(5);
+ _object10.animate(ANIM_MODE_7, NULL);
+ _object9.setStrip(4);
+ _object9.setFrame(1);
+ _object9.animate(ANIM_MODE_5, NULL);
+ break;
+ case 2:
+ _object9.animate(ANIM_MODE_NONE, NULL);
+ break;
+ case 3:
+ _object10.setStrip(6);
+ _object10.setFrame(1);
+ _object10.animate(ANIM_MODE_5, NULL);
+ _object9.setStrip(4);
+ _object9.setFrame(1);
+ _object9.animate(ANIM_MODE_5, NULL);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2100 - Starcraft Cockpit
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene2100::Action1::signal() {
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ if (!scene->_sitFl)
+ setDelay(1);
+ else {
+ setAction(&scene->_sequenceManager, this, 2102, &_globals->_player, NULL);
+ scene->_sitFl = 0;
+ }
+ break;
+ case 1: {
+ Common::Point pt(157, 62);
+ PlayerMover *mover = new PlayerMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 2:
+ scene->_soundHandler.play(162);
+ scene->_object1.animate(ANIM_MODE_5, this);
+ break;
+ case 3: {
+ Common::Point pt(157, 56);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 4:
+ _globals->_player._strip = 3;
+ setDelay(3);
+ break;
+ case 5:
+ _globals->_player.fixPriority(1);
+ scene->_area1.display();
+ scene->_area2.display();
+ scene->_area3.display();
+ scene->_area4.display();
+
+ scene->_area1.draw(true);
+ _state = 0;
+ _globals->_events.setCursor(CURSOR_USE);
+
+ while (!_state && !_vm->shouldQuit()) {
+ // Wait for an event
+ Event event;
+ if (!_globals->_events.getEvent(event)) {
+ g_system->updateScreen();
+ g_system->delayMillis(10);
+ continue;
+ }
+
+ if (scene->_area1._bounds.contains(event.mousePos)) {
+ scene->_area1.draw(true);
+ _state = scene->_area1._actionId;
+ }
+ if (scene->_area2._bounds.contains(event.mousePos)) {
+ scene->_area1.draw(false);
+ scene->_area2.draw(true);
+ _state = scene->_area2._actionId;
+ }
+ if (scene->_area3._bounds.contains(event.mousePos)) {
+ scene->_area1.draw(false);
+ scene->_area3.draw(true);
+ _state = scene->_area3._actionId;
+ }
+ }
+
+ scene->_soundHandler.play(161);
+ scene->_area1.restore();
+ scene->_area2.restore();
+ scene->_area3.restore();
+ scene->_area4.restore();
+
+ if (_state == 2100) {
+ setDelay(1);
+ } else {
+ scene->_soundHandler.play(162);
+ scene->_object1.animate(ANIM_MODE_6, this);
+ }
+ break;
+ case 6:
+ if (_state == 2100) {
+ Common::Point pt(157, 65);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ } else {
+ _globals->_sceneManager.changeScene(_state);
+ }
+ break;
+ case 7:
+ _globals->_player.fixPriority(-1);
+ scene->_soundHandler.play(162);
+ scene->_object1.animate(ANIM_MODE_6, this);
+ break;
+ case 8:
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene2100::Action2::signal() {
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_object3._numFrames = 5;
+ setDelay(_globals->_randomSource.getRandomNumber(59));
+ break;
+ case 1:
+ scene->_object3.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ setDelay(_globals->_randomSource.getRandomNumber(59));
+ break;
+ case 3:
+ scene->_object3.animate(ANIM_MODE_6, this);
+ _actionIndex = 0;
+ break;
+ }
+}
+
+void Scene2100::Action3::signal() {
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ case 2:
+ setDelay(_globals->_randomSource.getRandomNumber(119));
+ break;
+ case 1:
+ scene->_object2.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ scene->_object2.animate(ANIM_MODE_6, this);
+ _actionIndex = 0;
+ break;
+ }
+}
+
+void Scene2100::Action4::signal() {
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ if (!scene->_sitFl)
+ setDelay(1);
+ else
+ setAction(&scene->_sequenceManager, this, 2102, &_globals->_player, NULL);
+ break;
+ case 1: {
+ Common::Point pt(80, 66);
+ PlayerMover *mover = new PlayerMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 2:
+ _globals->_player.setVisage(2109);
+ _globals->_player._frame = 1;
+ _globals->_player._strip = 2;
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ _globals->_sceneManager.changeScene(2120);
+ break;
+ }
+}
+
+void Scene2100::Action5::signal() {
+ // Quinn enters the cokpit after Seeker decided to enter the cave alone
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(30);
+ break;
+ case 1:
+ setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL);
+ break;
+ case 2: {
+ Common::Point pt(272, 127);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 3:
+ _globals->_player.checkAngle(&scene->_object3);
+ setDelay(30);
+ break;
+ case 4:
+ _globals->_sceneManager.changeScene(3700);
+ break;
+ }
+}
+
+void Scene2100::Action6::signal() {
+ // Seeker stands up and walks to the elevator
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ scene->_object2.setVisage(2806);
+ scene->_object2.setStrip(1);
+ scene->_object2.setStrip2(-1);
+ scene->_object2.changeZoom(-1);
+ scene->_object2.setPosition(Common::Point(155, 116));
+ scene->_object2.setObjectWrapper(new SceneObjectWrapper());
+ scene->_object2.setAction(NULL);
+ scene->_object2.animate(ANIM_MODE_1, NULL);
+
+ Common::Point pt(130, 116);
+ NpcMover *mover = new NpcMover();
+ scene->_object2.addMover(mover, &pt, this);
+ break;
+ }
+ case 1: {
+ scene->_object2.fixPriority(-1);
+ Common::Point pt(153, 67);
+ NpcMover *mover = new NpcMover();
+ scene->_object2.addMover(mover, &pt, this);
+ break;
+ }
+ case 2:
+ remove();
+ break;
+ }
+}
+
+void Scene2100::Action7::signal() {
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(60);
+ break;
+ case 1:
+ setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL);
+ break;
+ case 2:
+ setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, NULL);
+ break;
+ case 3:
+ _globals->_sceneManager.changeScene(8100);
+ break;
+ }
+}
+
+void Scene2100::Action8::signal() {
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(60);
+ break;
+ case 1:
+ setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL);
+ break;
+ case 2: {
+ Common::Point pt(200, 174);
+ PlayerMover *mover = new PlayerMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 3:
+ _globals->_player.checkAngle(&scene->_object3);
+ scene->_stripManager.start((RING_INVENTORY._translator._sceneNumber == 1) ? 7720 : 7710, this);
+ break;
+ case 4:
+ if (RING_INVENTORY._translator._sceneNumber != 1)
+ _globals->_sceneManager.changeScene(7600);
+ else {
+ _globals->setFlag(24);
+ _globals->_player.enableControl();
+ remove();
+ }
+ break;
+ }
+}
+
+void Scene2100::Action9::signal() {
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(60);
+ break;
+ case 1:
+ scene->_stripManager.start(6050, this);
+ break;
+ case 2:
+ scene->_soundHandler.play(99);
+ scene->_object4.show();
+ scene->_object4.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ scene->_soundHandler.play(12);
+ scene->_object4.setStrip(2);
+ scene->_stripManager.start(6051, this, scene);
+ break;
+ case 4:
+ scene->_soundHandler.fadeOut(NULL);
+ scene->_object4.setStrip(1);
+ scene->_object4.setFrame(scene->_object4.getFrameCount());
+ scene->_object4.animate(ANIM_MODE_6, this);
+ break;
+ case 5:
+ scene->_object4.hide();
+ _globals->_events.setCursor(CURSOR_WALK);
+ scene->_stripManager.start(6010, this);
+ break;
+ case 6:
+ if (scene->_stripManager._field2E8 != 165)
+ setAction(&scene->_action10);
+ else
+ setAction(&scene->_action11);
+ break;
+ }
+}
+
+void Scene2100::Action10::signal() {
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(60);
+ break;
+ case 1:
+ setAction(&scene->_sequenceManager, this, 2102, &_globals->_player, NULL);
+ break;
+ case 2: {
+ _globals->_player.disableControl();
+ Common::Point pt(155, 64);
+ PlayerMover *mover = new PlayerMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 3:
+ scene->_object3.setVisage(2105);
+ scene->_object3.setStrip(2);
+ scene->_object3.setFrame(1);
+ scene->_object3._numFrames = 10;
+ scene->_object3.setAction(NULL);
+ scene->_object3.animate(ANIM_MODE_5, this);
+ break;
+ case 4: {
+ scene->_object3.setVisage(2705);
+ scene->_object3.setStrip2(-1);
+ scene->_object3.changeZoom(-1);
+ scene->_object3.fixPriority(-1);
+ scene->_object3.setPosition(Common::Point(260, 156));
+ scene->_object3.setObjectWrapper(new SceneObjectWrapper());
+ scene->_object3.animate(ANIM_MODE_1, NULL);
+
+ Common::Point pt(166, 64);
+ PlayerMover *mover = new PlayerMover();
+ scene->_object3.addMover(mover, &pt, this);
+
+ setAction(&scene->_action6, NULL);
+ break;
+ }
+ case 5:
+ scene->_soundHandler.play(162);
+ scene->_object1.animate(ANIM_MODE_5, this);
+ break;
+ case 6: {
+ _globals->_player.fixPriority(1);
+ Common::Point pt(144, 54);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 7: {
+ scene->_object3.fixPriority(2);
+ Common::Point pt1(163, 55);
+ NpcMover *mover1 = new NpcMover();
+ scene->_object3.addMover(mover1, &pt1, NULL);
+
+ scene->_object2.fixPriority(2);
+ Common::Point pt2(158, 55);
+ NpcMover *mover2 = new NpcMover();
+ scene->_object2.addMover(mover2, &pt2, this);
+ break;
+ }
+ case 8:
+ _globals->_player.fixPriority(1);
+ _globals->_player.setStrip(1);
+ scene->_object3.fixPriority(1);
+ scene->_object3.setStrip(2);
+ scene->_object2.fixPriority(2);
+ scene->_object2.setStrip(3);
+
+ setDelay(45);
+ break;
+ case 9:
+ scene->_soundHandler.play(162);
+ scene->_object1.animate(ANIM_MODE_6, this);
+ break;
+ case 10:
+ _globals->setFlag(70);
+ _globals->_stripNum = 2101;
+ _globals->_sceneManager.changeScene(2320);
+ break;
+ }
+}
+
+void Scene2100::Action11::signal() {
+ // Miranda stands up and walks to the elevator
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(60);
+ break;
+ case 1:
+ scene->_object3._numFrames = 10;
+ scene->_object3.setAction(NULL);
+ scene->_object3.setVisage(2105);
+ scene->_object3.setStrip(2);
+ scene->_object3.setFrame(1);
+ scene->_object3.animate(ANIM_MODE_5, this);
+ break;
+ case 2: {
+ scene->_object3.setVisage(2705);
+ scene->_object3.setStrip2(-1);
+ scene->_object3.changeZoom(-1);
+ scene->_object3.fixPriority(-1);
+ scene->_object3.setPosition(Common::Point(260, 156));
+ scene->_object3.setObjectWrapper(new SceneObjectWrapper());
+ scene->_object3.animate(ANIM_MODE_1, NULL);
+
+ Common::Point pt(158, 62);
+ PlayerMover *mover = new PlayerMover();
+ scene->_object3.addMover(mover, &pt, this);
+
+ setAction(&scene->_action6, NULL);
+ break;
+ }
+ case 3:
+ scene->_soundHandler.play(162);
+ scene->_object1.animate(ANIM_MODE_5, this);
+ break;
+ case 4: {
+ scene->_object3.fixPriority(1);
+ Common::Point pt1(163, 55);
+ NpcMover *mover1 = new NpcMover();
+ scene->_object3.addMover(mover1, &pt1, NULL);
+
+ scene->_object2.fixPriority(1);
+ Common::Point pt2(158, 55);
+ NpcMover *mover2 = new NpcMover();
+ scene->_object2.addMover(mover2, &pt2, this);
+ break;
+ }
+ case 5:
+ scene->_object3.setStrip(2);
+ scene->_object2.setStrip(3);
+ setDelay(45);
+ break;
+ case 6:
+ scene->_soundHandler.play(162);
+ scene->_object1.animate(ANIM_MODE_6, this);
+ break;
+ case 7:
+ scene->_object3.remove();
+ scene->_object2.remove();
+ _globals->setFlag(70);
+ _globals->_stripNum = 2102;
+ _globals->_player.enableControl();
+ _globals->_player._canWalk = false;
+ break;
+ }
+}
+
+void Scene2100::Action12::signal() {
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(10);
+ break;
+ case 1:
+ scene->_stripManager.start(6000, this);
+ break;
+ case 2:
+ scene->_soundHandler.play(162);
+ scene->_object1.animate(ANIM_MODE_5, this);
+ break;
+ case 3: {
+ Common::Point pt1(158, 74);
+ NpcMover *mover1 = new NpcMover();
+ _globals->_player.addMover(mover1, &pt1, this);
+
+ Common::Point pt2(158, 68);
+ NpcMover *mover2 = new NpcMover();
+ scene->_object2.addMover(mover2, &pt2, NULL);
+ break;
+ }
+ case 4: {
+ scene->_soundHandler.play(162);
+ scene->_object1.animate(ANIM_MODE_6, NULL);
+
+ _globals->_player.fixPriority(-1);
+ Common::Point pt1(277, 84);
+ PlayerMover *mover1 = new PlayerMover();
+ _globals->_player.addMover(mover1, &pt1, this);
+
+ scene->_object2.fixPriority(-1);
+ Common::Point pt2(255, 76);
+ PlayerMover *mover2 = new PlayerMover();
+ scene->_object2.addMover(mover2, &pt2, this);
+ break;
+ }
+ case 6:
+ _globals->_player.setStrip(4);
+ scene->_object2.setStrip(4);
+ setDelay(60);
+ break;
+ case 7:
+ _globals->_events.setCursor(CURSOR_WALK);
+ scene->_stripManager.start(6052, this);
+ break;
+ case 8:
+ if (scene->_stripManager._field2E8 == 320)
+ _globals->setFlag(74);
+ setDelay(30);
+ break;
+ case 9:
+ _globals->_events.setCursor(OBJECT_STUNNER);
+ scene->_object2.setAction(&scene->_action13);
+ setDelay(60);
+ break;
+ case 10:
+ if (_globals->getFlag(74))
+ setDelay(1);
+ else
+ setAction(&scene->_sequenceManager, this, 2101, &_globals->_player, NULL);
+ break;
+ case 11:
+ scene->_stripManager.start(2170, this);
+ break;
+ case 12:
+ setDelay(5);
+ break;
+ case 13:
+ scene->_stripManager.start(_globals->getFlag(74) ? 2172 : 2174, this);
+ break;
+ case 14:
+ if (_globals->getFlag(74)) {
+ _globals->_stripNum = 6100;
+ _globals->_sceneManager.changeScene(2320);
+ } else {
+ _globals->_sceneManager.changeScene(6100);
+ }
+ remove();
+ break;
+ }
+}
+
+void Scene2100::Action13::signal() {
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(6);
+ break;
+ case 1: {
+ scene->_object2.fixPriority(113);
+ Common::Point pt(178, 116);
+ PlayerMover *mover = new PlayerMover();
+ scene->_object2.addMover(mover, &pt, this);
+ break;
+ }
+ case 2: {
+ Common::Point pt(150, 116);
+ NpcMover *mover = new NpcMover();
+ scene->_object2.addMover(mover, &pt, this);
+ break;
+ }
+ case 3:
+ scene->_object2.setVisage(2108);
+ scene->_object2._strip = 3;
+ scene->_object2.setPosition(Common::Point(150, 100));
+ scene->_object2.animate(ANIM_MODE_NONE, NULL);
+ scene->_object2.changeZoom(100);
+ scene->_object2.setAction(&scene->_action3);
+ setDelay(15);
+ break;
+ case 4:
+ remove();
+ break;
+ }
+}
+
+void Scene2100::Action14::signal() {
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(6);
+ break;
+ case 1:
+ setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL);
+ break;
+ case 2:
+ setAction(&scene->_sequenceManager, this, 2101, &_globals->_player, NULL);
+ break;
+ case 3:
+ scene->_stripManager.start(6008, this);
+ break;
+ case 4:
+ scene->_soundHandler.play(99);
+ scene->_object4.show();
+ scene->_object4.animate(ANIM_MODE_5, this);
+ break;
+ case 5:
+ scene->_object4.setStrip(2);
+ scene->_stripManager.start(6009, this, scene);
+ break;
+ case 6:
+ scene->_soundHandler.fadeOut(NULL);
+ scene->_object4.setStrip(1);
+ scene->_object4.setFrame(scene->_object4.getFrameCount());
+ scene->_object4.animate(ANIM_MODE_6, this);
+ break;
+ case 7:
+ scene->_stripManager.start(6060, this);
+ break;
+ case 8:
+ scene->_object3._numFrames = 10;
+ scene->_object3.setAction(NULL);
+ scene->_object3.setVisage(2105);
+ scene->_object3.setStrip(2);
+ scene->_object3.setFrame(1);
+ scene->_object3.animate(ANIM_MODE_5, this);
+ break;
+ case 9: {
+ scene->_object3.setVisage(2705);
+ scene->_object3.setStrip2(-1);
+ scene->_object3.changeZoom(-1);
+ scene->_object3.fixPriority(-1);
+ scene->_object3.setPosition(Common::Point(260, 156));
+ scene->_object3.setObjectWrapper(new SceneObjectWrapper());
+ scene->_object3.animate(ANIM_MODE_1, NULL);
+
+ Common::Point pt(157, 65);
+ PlayerMover *mover = new PlayerMover();
+ scene->_object3.addMover(mover, &pt, this);
+ break;
+ }
+ case 10:
+ scene->_soundHandler.play(162);
+ scene->_object1.animate(ANIM_MODE_5, this);
+ break;
+ case 11: {
+ Common::Point pt(159, 51);
+ NpcMover *mover = new NpcMover();
+ scene->_object3.addMover(mover, &pt, this);
+ break;
+ }
+ case 12:
+ scene->_object3.setStrip(2);
+ setDelay(30);
+ break;
+ case 13:
+ scene->_object3.fixPriority(1);
+ scene->_soundHandler.play(162);
+ scene->_object1.animate(ANIM_MODE_6, this);
+ break;
+ case 14:
+ setDelay(90);
+ break;
+ case 15:
+ _globals->_sceneManager.changeScene(7000);
+ remove();
+ break;
+ }
+}
+
+void Scene2100::Action15::signal() {
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(6);
+ break;
+ case 1:
+ scene->_object3.postInit();
+ scene->_object3.setVisage(2705);
+ scene->_object3.animate(ANIM_MODE_1, NULL);
+ scene->_object3.setObjectWrapper(new SceneObjectWrapper());
+ scene->_object3.setPosition(Common::Point(157, 56));
+ scene->_object3.fixPriority(1);
+ scene->_object3.changeZoom(-1);
+
+ scene->_soundHandler.play(162);
+ scene->_object1.animate(ANIM_MODE_5, this);
+ break;
+ case 2: {
+ scene->_object3.fixPriority(-1);
+ Common::Point pt(177, 68);
+ NpcMover *mover = new NpcMover();
+ scene->_object3.addMover(mover, &pt, this);
+ break;
+ }
+ case 3: {
+ scene->_soundHandler.play(162);
+ scene->_object1.animate(ANIM_MODE_6, this);
+
+ Common::Point pt(272, 140);
+ NpcMover *mover = new NpcMover();
+ scene->_object3.addMover(mover, &pt, this);
+ break;
+ }
+ case 4: {
+ Common::Point pt(266, 150);
+ NpcMover *mover = new NpcMover();
+ scene->_object3.addMover(mover, &pt, this);
+ break;
+ }
+ case 5: {
+ scene->_object3.fixPriority(156);
+
+ Common::Point pt(260, 156);
+ NpcMover *mover = new NpcMover();
+ scene->_object3.addMover(mover, &pt, this);
+ break;
+ }
+ case 6:
+ scene->_object3.setVisage(2105);
+ scene->_object3._strip = 1;
+ scene->_object3._frame = 1;
+ scene->_object3.setPosition(Common::Point(256, 156));
+ scene->_object3.animate(ANIM_MODE_5, this);
+ scene->_object3.changeZoom(100);
+
+ scene->_object3.animate(ANIM_MODE_NONE, NULL);
+ break;
+ case 7:
+ remove();
+ break;
+ }
+}
+
+void Scene2100::Action16::signal() {
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ case 4:
+ setDelay(3);
+ break;
+ case 1:
+ scene->_stripManager.start(7001, this);
+ break;
+ case 2:
+ setAction(&scene->_sequenceManager, this, 2102, &_globals->_player, NULL);
+ break;
+ case 3: {
+ _globals->_player.disableControl();
+ Common::Point pt(155, 63);
+ PlayerMover *mover = new PlayerMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 5:
+ scene->_soundHandler.play(162);
+ scene->_object1.animate(ANIM_MODE_5, this);
+ break;
+ case 6: {
+ Common::Point pt(160, 54);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 7:
+ _globals->_player.fixPriority(1);
+ _globals->_player.setStrip(3);
+ setDelay(45);
+ break;
+ case 8:
+ scene->_soundHandler.play(162);
+ scene->_object1.animate(ANIM_MODE_6, this);
+ break;
+ case 9:
+ _globals->setFlag(15);
+ _globals->setFlag(36);
+ _globals->_sceneManager.changeScene(7000);
+ remove();
+ break;
+ }
+}
+
+void Scene2100::Action17::signal() {
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(60);
+ break;
+ case 1:
+ setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL);
+ break;
+ case 2:
+ setAction(&scene->_sequenceManager, this, 2101, &_globals->_player, NULL);
+ break;
+ case 3:
+ scene->_stripManager.start(7070, this);
+ break;
+ case 4:
+ scene->_soundHandler.play(99);
+ scene->_object4.show();
+ scene->_object4.animate(ANIM_MODE_5, this);
+ break;
+ case 5:
+ scene->_soundHandler.play(12);
+ scene->_object4.setStrip(2);
+ scene->_stripManager.start(7071, this, scene);
+ break;
+ case 6:
+ scene->_soundHandler.fadeOut(NULL);
+ scene->_object4.setStrip(1);
+ scene->_object4.setFrame(scene->_object4.getFrameCount());
+ scene->_object4.animate(ANIM_MODE_6, this);
+ break;
+ case 7:
+ scene->_stripManager.start(7072, this);
+ break;
+ case 8:
+ RING_INVENTORY._stasisNegator._sceneNumber = 1;
+ _globals->_sceneManager.changeScene(9100);
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene2100::Hotspot2::doAction(int action) {
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2100, 3);
+ break;
+ case CURSOR_USE:
+ if (_globals->getFlag(13))
+ SceneItem::display2(2100, 29);
+ else {
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_action4);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2100::Hotspot3::doAction(int action) {
+ // Computer, on the left
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2100, 4);
+ break;
+ case CURSOR_USE:
+ if (_globals->getFlag(13))
+ SceneItem::display2(2100, 29);
+ else {
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_action4);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2100::Hotspot4::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2100, 5);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(2100, 6);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2100::Hotspot8::doAction(int action) {
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2100, 12);
+ break;
+ case CURSOR_USE:
+ if (_globals->getFlag(13))
+ SceneItem::display2(2100, 29);
+ else {
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_action4);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2100::Hotspot10::doAction(int action) {
+ // Quinn's Console
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2100, 13);
+ break;
+ case CURSOR_USE:
+ if (scene->_sitFl) {
+ _globals->_player.disableControl();
+ scene->_sceneMode = 2102;
+ scene->setAction(&scene->_sequenceManager, scene, 2102, &_globals->_player, NULL);
+ } else if (_globals->getFlag(13)) {
+ SceneItem::display2(2100, 28);
+ } else {
+ _globals->_player.disableControl();
+ scene->_sceneMode = 2101;
+ scene->setAction(&scene->_sequenceManager, scene, 2101, &_globals->_player, NULL);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2100::Hotspot14::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_globals->getFlag(0))
+ SceneItem::display2(2100, 19);
+ else
+ SceneItem::display2(2100, 18);
+ break;
+ case CURSOR_USE:
+ if (_globals->getFlag(1))
+ SceneItem::display2(2100, 21);
+ else
+ SceneItem::display2(2100, 20);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2100::Object1::doAction(int action) {
+ // Elevator
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2100, 1);
+ break;
+ case CURSOR_USE:
+ scene->setAction(&scene->_action1);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2100::Object2::doAction(int action) {
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2100, 30);
+ break;
+ case CURSOR_TALK:
+ if (_globals->getFlag(72)) {
+ _globals->_player.disableControl();
+ if (!_globals->getFlag(52)) {
+ scene->_sceneMode = 2111;
+ scene->setAction(&scene->_sequenceManager, scene, 2111, NULL);
+ } else {
+ scene->_sceneMode = _globals->getFlag(53) ? 2112 : 2110;
+ scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, NULL);
+ }
+ } else if (_globals->getFlag(13)) {
+ SceneItem::display2(2100, 31);
+ } else if (_globals->getFlag(14)) {
+ SceneItem::display2(2100, 32);
+ } else {
+ _globals->setFlag(14);
+ _globals->_player.disableControl();
+ scene->_sceneMode = 2108;
+ scene->setAction(&scene->_sequenceManager, scene, 2109, NULL);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2100::Object3::doAction(int action) {
+ // Miranda
+ Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_globals->getFlag(59))
+ SceneItem::display2(2100, 34);
+ else
+ error("***I have no response.");
+ break;
+
+ case CURSOR_TALK:
+ if (_globals->getFlag(59)) {
+ _globals->_player.disableControl();
+ scene->_sceneMode = 2108;
+ scene->setAction(&scene->_sequenceManager, scene, 2108, NULL);
+ } else {
+ error("***I have no response.");
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene2100::Scene2100() :
+ _hotspot1(0, CURSOR_LOOK, 2100, 2, LIST_END),
+ _hotspot5(0, CURSOR_LOOK, 2100, 9, LIST_END),
+ _hotspot6(0, CURSOR_LOOK, 2100, 7, CURSOR_USE, 2100, 8, LIST_END),
+ _hotspot7(0, CURSOR_LOOK, 2100, 7, CURSOR_USE, 2100, 11, LIST_END),
+ _hotspot9(0, CURSOR_LOOK, 2100, 14, LIST_END),
+ _hotspot11(0, CURSOR_LOOK, 2100, 15, CURSOR_USE, 2100, 16, LIST_END),
+ _hotspot12(0, CURSOR_LOOK, 2100, 24, CURSOR_USE, 2100, 25, LIST_END),
+ _hotspot13(0, CURSOR_LOOK, 2100, 17, LIST_END),
+ _hotspot15(0, CURSOR_LOOK, 2100, 22, CURSOR_USE, 2100, 23, LIST_END) {
+ _area1.setup(2153, 2, 1, 2100);
+ _area1._pt = Common::Point(200, 31);
+ _area2.setup(2153, 3, 1, 2150);
+ _area2._pt = Common::Point(200, 50);
+ _area3.setup(2153, 4, 1, 2320);
+ _area3._pt = Common::Point(200, 75);
+ _area4.setup(2153, 1, 1, OBJECT_TRANSLATOR);
+ _area4._pt = Common::Point(237, 77);
+}
+
+void Scene2100::postInit(SceneObjectList *OwnerList) {
+ loadScene(2100);
+ Scene::postInit();
+ setZoomPercents(60, 80, 200, 100);
+
+ _stripManager.addSpeaker(&_speakerMText);
+ _stripManager.addSpeaker(&_speakerMR);
+ _stripManager.addSpeaker(&_speakerQL);
+ _stripManager.addSpeaker(&_speakerQR);
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerSText);
+ _stripManager.addSpeaker(&_speakerSL);
+ _stripManager.addSpeaker(&_speakerSAL);
+ _stripManager.addSpeaker(&_speakerHText);
+ _stripManager.addSpeaker(&_speakerGameText);
+ _speakerMText._npc = &_object3;
+ _speakerQText._npc = &_globals->_player;
+ _speakerSText._npc = &_object2;
+
+ _object1.postInit();
+ _object1.setVisage(2100);
+ _object1.animate(ANIM_MODE_NONE, NULL);
+ _object1.setPosition(Common::Point(157, 57));
+ _object1.fixPriority(5);
+
+ _hotspot3.postInit();
+ _hotspot3.setVisage(2101);
+ _hotspot3._frame = 1;
+ _hotspot3.animate(ANIM_MODE_2, NULL);
+ _hotspot3.setPosition(Common::Point(53, 44));
+ _hotspot3.changeZoom(100);
+ _hotspot3.fixPriority(1);
+
+ _hotspot4.postInit();
+ _hotspot4.setVisage(2101);
+ _hotspot4._frame = 1;
+ _hotspot4._strip = 3;
+ _hotspot4.animate(ANIM_MODE_8, 0, NULL);
+ _hotspot4.setPosition(Common::Point(274, 52));
+ _hotspot4.changeZoom(100);
+ _hotspot4.fixPriority(1);
+
+ _hotspot5.postInit();
+ _hotspot5.setVisage(2101);
+ _hotspot5._frame = 1;
+ _hotspot5._strip = 4;
+ _hotspot5.animate(ANIM_MODE_8, 0, NULL);
+ _hotspot5.setPosition(Common::Point(219, 141));
+ _hotspot5.changeZoom(100);
+ _hotspot5.fixPriority(160);
+
+ _hotspot6.postInit();
+ _hotspot6.setVisage(2101);
+ _hotspot6._frame = 1;
+ _hotspot6._strip = 5;
+ _hotspot6.fixPriority(175);
+ _hotspot6.animate(ANIM_MODE_8, 0, NULL);
+ _hotspot6.setPosition(Common::Point(97, 142));
+ _hotspot6.changeZoom(100);
+
+ _hotspot7.postInit();
+ _hotspot7.setVisage(2101);
+ _hotspot7._frame = 1;
+ _hotspot7._strip = 6;
+ _hotspot7.animate(ANIM_MODE_NONE, NULL);
+ _hotspot7.setPosition(Common::Point(133, 46));
+ _hotspot7.changeZoom(100);
+ _hotspot7.fixPriority(1);
+
+ _hotspot8.postInit();
+ _hotspot8.setVisage(2101);
+ _hotspot8._frame = 1;
+ _hotspot8._strip = 7;
+ _hotspot8.animate(ANIM_MODE_8, 0, NULL);
+ _hotspot8.setPosition(Common::Point(20, 45));
+ _hotspot8.changeZoom(100);
+ _hotspot8.fixPriority(1);
+
+ _hotspot2.postInit();
+ _hotspot2.setVisage(2101);
+ _hotspot2._frame = 1;
+ _hotspot2._strip = 8;
+ _hotspot2.animate(ANIM_MODE_8, 0, NULL);
+ _hotspot2.setPosition(Common::Point(88, 41));
+ _hotspot2.changeZoom(100);
+ _hotspot2.fixPriority(1);
+
+ _hotspot11.setBounds(Rect(139, 74, 173, 96));
+ _hotspot10.setBounds(Rect(71, 100, 91, 135));
+ _hotspot9.setBounds(Rect(225, 110, 251, 136));
+ _hotspot14.setBounds(Rect(100, 97, 216, 130));
+ _hotspot13.setBounds(Rect(13, 124, 94, 168));
+ _hotspot12.setBounds(Rect(217, 141, 307, 155));
+ _hotspot15.setBounds(Rect(14, 90, 46, 107));
+ _hotspot1.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+
+ if (!_globals->getFlag(36) && !_globals->getFlag(70) && !_globals->getFlag(43)) {
+ _object3.postInit();
+ _object3.setPosition(Common::Point(246, 156));
+ _object3.animate(ANIM_MODE_NONE, NULL);
+ _object3.changeZoom(100);
+ _object3.fixPriority(156);
+ _object3.setVisage(2107);
+ _object3.setStrip(1);
+ _object3.setAction(&_action2);
+ _globals->_sceneItems.push_back(&_object3);
+ }
+
+ if (!_globals->getFlag(59) && !_globals->getFlag(70) && !_globals->getFlag(37) && !_globals->getFlag(114)) {
+ _object2.postInit();
+ _object2.setVisage(2108);
+ _object2._strip = 3;
+ _object2.setPosition(Common::Point(150, 100));
+ _object2.animate(ANIM_MODE_NONE, NULL);
+ _object2.changeZoom(100);
+ _object2.fixPriority(113);
+ _object2.setAction(&_action3);
+ _globals->_sceneItems.push_back(&_object2);
+ }
+
+ _globals->_sceneItems.addItems(&_hotspot15, &_hotspot11, &_hotspot10, &_hotspot9, &_hotspot14,
+ &_hotspot13, &_hotspot12, &_hotspot8, &_object1, &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5,
+ &_hotspot6, &_hotspot7, &_hotspot1, NULL);
+
+ _globals->_player.postInit();
+ if (_globals->getFlag(13)) {
+ _globals->_player.setVisage(2170);
+ _globals->_player._moveDiff.y = 1;
+ } else {
+ _globals->_player.setVisage(0);
+ _globals->_player._moveDiff.y = 3;
+ }
+
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player._moveDiff.x = 4;
+ _globals->_player.changeZoom(-1);
+ _globals->_player.disableControl();
+ _sitFl = 0;
+
+ switch (_globals->_sceneManager._previousScene) {
+ case 2120:
+ _globals->_soundHandler.play(160);
+ _globals->_soundHandler.holdAt(true);
+ _object1.fixPriority(-1);
+ _globals->_player.fixPriority(-1);
+ _globals->_player.setPosition(Common::Point(80, 66));
+ _globals->_player.enableControl();
+ break;
+ case 2150:
+ _globals->_player.fixPriority(1);
+ _globals->_player.setPosition(Common::Point(157, 56));
+ _sceneMode = 2104;
+ setAction(&_sequenceManager, this, 2104, &_globals->_player, &_object1, NULL);
+ break;
+ case 2222:
+ if (_globals->_sceneObjects->contains(&_object3))
+ _object3.remove();
+
+ _globals->_player.fixPriority(1);
+ _globals->_player.setPosition(Common::Point(144, 55));
+
+ _object2.setVisage(2806);
+ _object2.changeZoom(-1);
+ _object2.setPosition(Common::Point(158, 55));
+ _object2.fixPriority(1);
+ _object2.setAction(NULL);
+ _object2.setObjectWrapper(new SceneObjectWrapper());
+ _object2.animate(ANIM_MODE_1, NULL);
+ _object2.setStrip(3);
+ setAction(&_action12);
+ break;
+ case 2320:
+ if (_globals->_stripNum == 2321) {
+ if (_globals->_sceneObjects->contains(&_object3))
+ _object3.remove();
+
+ _globals->_player.fixPriority(1);
+ _globals->_player.setPosition(Common::Point(144, 55));
+
+ _object2.postInit();
+ _object2.setVisage(2806);
+ _object2.setStrip(1);
+ _object2.changeZoom(-1);
+ _object2.setPosition(Common::Point(158, 55));
+ _object2.fixPriority(1);
+ _object2.setAction(NULL);
+ _object2.setObjectWrapper(new SceneObjectWrapper());
+ _object2.animate(ANIM_MODE_1, NULL);
+
+ setAction(&_action12);
+ } else if (_globals->_stripNum == 6100) {
+ _globals->_player.setPosition(Common::Point(157, 56));
+ _globals->_player.fixPriority(1);
+
+ _object4.postInit();
+ _object4.setVisage(2102);
+ _object4.setPosition(Common::Point(160, 199));
+ _object4.hide();
+
+ setAction(&_action14);
+ } else {
+ _globals->_player.disableControl();
+ _globals->_player.fixPriority(1);
+ _globals->_player.setPosition(Common::Point(157, 56));
+ _sceneMode = 2104;
+
+ setAction(&_sequenceManager, this, 2104, &_globals->_player, &_object1, NULL);
+ }
+ break;
+ case 3700:
+ _globals->_soundHandler.play(160);
+ _globals->_soundHandler.holdAt(true);
+ Scene::setZoomPercents(80, 75, 100, 90);
+
+ if (_globals->_sceneObjects->contains(&_object2))
+ _object2.remove();
+
+ _globals->_player._angle = 225;
+ _globals->_player.setStrip(6);
+ _globals->_player.setFrame(1);
+ _globals->_player.fixPriority(-1);
+ _globals->_player.setPosition(Common::Point(272, 127));
+
+ _object3.setPosition(Common::Point(246, 156));
+ _object3.fixPriority(156);
+ _sceneMode = 2105;
+ setAction(&_sequenceManager, this, 2105, &_object3, NULL);
+ break;
+ case 4250:
+ _globals->_soundHandler.play(160);
+ _globals->_soundHandler.holdAt(true);
+ _globals->clearFlag(43);
+
+ _globals->_player.setVisage(2104);
+ _globals->_player.setFrame(1);
+ _globals->_player.setPosition(Common::Point(65, 149));
+ _globals->_player.fixPriority(152);
+ _globals->_player.setStrip(2);
+
+ _object4.postInit();
+ _object4.setVisage(2102);
+ _object4.setPosition(Common::Point(160, 199));
+ _object4.hide();
+
+ _sceneMode = 2107;
+ setAction(&_sequenceManager, this, 2107, &_object4, NULL);
+ break;
+ case 5000:
+ _globals->_soundHandler.play(160);
+ _globals->_soundHandler.holdAt(true);
+
+ if (_globals->_sceneObjects->contains(&_object2))
+ _object2.remove();
+
+ _globals->_player.setStrip(3);
+ _globals->_player.setFrame(1);
+ _globals->_player.fixPriority(1);
+ _globals->_player.setPosition(Common::Point(157, 56));
+
+ _object3.setPosition(Common::Point(246, 156));
+ _object3.fixPriority(156);
+
+ setAction(&_action5);
+ break;
+ case 5100:
+ _globals->_soundHandler.play(160);
+ _globals->_soundHandler.holdAt(true);
+ _globals->_player.setVisage(2104);
+ _globals->_player.setFrame(1);
+ _globals->_player.setPosition(Common::Point(65, 149));
+ _globals->_player.fixPriority(152);
+ _globals->_player.setStrip(2);
+
+ _sitFl = 1;
+
+ _object4.postInit();
+ _object4.setVisage(2102);
+ _object4.setPosition(Common::Point(160, 199));
+ _object4.hide();
+
+ RING_INVENTORY._stasisBox._sceneNumber = 0;
+ setAction(&_action9);
+ break;
+ case 7000:
+ _globals->_soundHandler.play(160);
+ _globals->_soundHandler.holdAt(true);
+
+ if (RING_INVENTORY._stasisBox2._sceneNumber == 1) {
+ _globals->_player.fixPriority(1);
+ _globals->_player.setPosition(Common::Point(157, 56));
+
+ _object4.postInit();
+ _object4.setVisage(2102);
+ _object4.setPosition(Common::Point(160, 199));
+ _object4.hide();
+ _globals->clearFlag(15);
+ _globals->clearFlag(109);
+ _globals->clearFlag(72);
+
+ setAction(&_action17);
+ } else {
+ _globals->_player.setVisage(2104);
+ _globals->_player.setFrame(1);
+ _globals->_player.setPosition(Common::Point(65, 149));
+ _globals->_player.fixPriority(152);
+ _globals->_player.setStrip(2);
+
+ _sitFl = 1;
+ setAction(&_action16);
+ }
+ break;
+ case 7600:
+ _globals->_soundHandler.play(160);
+ _globals->_soundHandler.holdAt(true);
+
+ if (_globals->_sceneObjects->contains(&_object2))
+ _object2.remove();
+
+ _globals->_player.fixPriority(1);
+ _globals->_player.setPosition(Common::Point(157, 56));
+
+ setAction(&_action8);
+ break;
+ case 8100:
+ _globals->_soundHandler.play(160);
+ _globals->_soundHandler.holdAt(true);
+
+ _globals->_player.setVisage(2104);
+ _globals->_player.setFrame(1);
+ _globals->_player.setPosition(Common::Point(65, 149));
+ _globals->_player.fixPriority(152);
+ _globals->_player.setStrip(2);
+
+ _sceneMode = 2106;
+ setAction(&_sequenceManager, this, 2106, NULL);
+ break;
+ case 9750:
+ _globals->_soundHandler.play(160);
+ _globals->_soundHandler.holdAt(true);
+
+ _globals->_player.setVisage(2104);
+ _globals->_player.setFrame(1);
+ _globals->_player.setPosition(Common::Point(65, 149));
+ _globals->_player.fixPriority(152);
+ _globals->_player.setStrip(2);
+
+ _object4.postInit();
+ _object4.setVisage(2102);
+ _object4.setPosition(Common::Point(160, 199));
+ _object4.hide();
+
+ _sceneMode = 2103;
+ setAction(&_sequenceManager, this, 2103, &_object4, NULL);
+ break;
+ default:
+ _globals->_soundHandler.play(160);
+ _globals->_soundHandler.holdAt(true);
+
+ _globals->_player._uiEnabled = true;
+ break;
+ }
+
+ _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
+ _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+}
+
+void Scene2100::stripCallback(int v) {
+ switch (v) {
+ case 1:
+ _object4._numFrames = 4;
+ _object4.animate(ANIM_MODE_7, NULL);
+ break;
+ case 2:
+ _object4.animate(ANIM_MODE_NONE, NULL);
+ break;
+ }
+}
+
+void Scene2100::signal() {
+ switch (_sceneMode) {
+ case 2101:
+ _sitFl = 1;
+ _globals->_player._uiEnabled = true;
+ _globals->_events.setCursor(CURSOR_USE);
+ break;
+ case 2102:
+ _sitFl = 0;
+ _globals->_player.enableControl();
+ break;
+ case 2103:
+ _globals->_stripNum = 9000;
+ _globals->_sceneManager.changeScene(4000);
+ break;
+ case 2106:
+ _globals->_sceneManager.changeScene(7000);
+ break;
+ case 2107:
+ _globals->_sceneManager.changeScene(5000);
+ break;
+ case 2104:
+ case 2105:
+ case 2108:
+ case 2110:
+ case 2111:
+ case 2112:
+ _globals->_player.enableControl();
+ break;
+ }
+}
+
+void Scene2100::synchronize(Serializer &s) {
+ Scene::synchronize(s);
+ if (s.getVersion() >= 3)
+ s.syncAsSint16LE(_sitFl);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2120 - Encyclopedia
+ *
+ *--------------------------------------------------------------------------*/
+
+Scene2120::Action1::Action1() {
+ _entries.push_back(Entry(0, 0, 0));
+ _entries.push_back(Entry(0, 0, 0));
+ _entries.push_back(Entry(4, 1, 2123));
+ _entries.push_back(Entry(1, 6, 0));
+ _entries.push_back(Entry(2, 8, 0));
+ _entries.push_back(Entry(1, 11, 0));
+ _entries.push_back(Entry(4, 13, 2131));
+ _entries.push_back(Entry(2, 18, 0));
+ _entries.push_back(Entry(4, 21, 0));
+ _entries.push_back(Entry(7, 26, 2128));
+ _entries.push_back(Entry(3, 34, 0));
+ _entries.push_back(Entry(0, 38, 0));
+ _entries.push_back(Entry(3, 39, 2126));
+ _entries.push_back(Entry(3, 43, 0));
+ _entries.push_back(Entry(4, 47, 2125));
+ _entries.push_back(Entry(3, 52, 0));
+ _entries.push_back(Entry(4, 56, 2129));
+ _entries.push_back(Entry(7, 61, 0));
+ _entries.push_back(Entry(2, 69, 2127));
+ _entries.push_back(Entry(7, 72, 2122));
+ _entries.push_back(Entry(0, 80, 2124));
+ _entries.push_back(Entry(0, 81, 0));
+ _entries.push_back(Entry(0, 82, 0));
+ _entries.push_back(Entry(1, 83, 0));
+ _entries.push_back(Entry(2, 85, 2132));
+ _entries.push_back(Entry(1, 88, 2133));
+ _entries.push_back(Entry(2, 90, 2136));
+ _entries.push_back(Entry(1, 93, 0));
+ _entries.push_back(Entry(10, 95, 2135));
+ _entries.push_back(Entry(5, 106, 0));
+ _entries.push_back(Entry(2, 112, 2134));
+ _entries.push_back(Entry(1, 115, 2130));
+ _entries.push_back(Entry(0, 117, 0));
+}
+
+void Scene2120::Action1::signal() {
+ Scene2120 *scene = (Scene2120 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(30);
+ _globals->_events.setCursor(CURSOR_WALK);
+ break;
+ case 1:
+ // First page of index
+ SceneItem::display(2120, 0, SET_X, 120, SET_FONT, 1, SET_EXT_BGCOLOR, 7, SET_BG_COLOR, -1,
+ SET_WIDTH, 200, SET_KEEP_ONSCREEN, -1, SET_TEXT_MODE, 0, LIST_END);
+ break;
+ case 2:
+ // Second page of index
+ SceneItem::display(2120, 1, SET_X, 120, SET_FONT, 1, SET_EXT_BGCOLOR, 7, SET_BG_COLOR, -1,
+ SET_WIDTH, 200, SET_KEEP_ONSCREEN, -1, SET_TEXT_MODE, 0, LIST_END);
+ break;
+ case 3:
+ // Display an image associated with the encyclopedia entry
+ SceneItem::display(0, 0);
+
+ scene->_visageHotspot.postInit();
+ scene->_visageHotspot.setVisage(_entries[scene->_subjectIndex]._visage);
+ scene->_visageHotspot.setPosition(Common::Point(129, 180));
+ scene->_visageHotspot.animate(ANIM_MODE_NONE, NULL);
+ scene->_visageVisable = true;
+ break;
+ case 4:
+ // Display page of text
+ SceneItem::display(2121, _entries[scene->_subjectIndex]._lineNum + scene->_lineOffset,
+ SET_X, 130, SET_FONT, 1, SET_EXT_BGCOLOR, 7, SET_BG_COLOR, -1, SET_WIDTH, 200,
+ SET_KEEP_ONSCREEN, -1, SET_TEXT_MODE, 0, LIST_END);
+ _actionIndex = 4;
+ break;
+ }
+}
+
+void Scene2120::Action1::dispatch() {
+ Scene2120 *scene = (Scene2120 *)_globals->_sceneManager._scene;
+
+ Event event;
+ if (_globals->_events.getEvent(event) && (event.eventType == EVENT_BUTTON_DOWN)) {
+ if (scene->_listRect.contains(event.mousePos) && (scene->_dbMode != 2)) {
+ scene->_topicArrowHotspot.setPosition(Common::Point(scene->_topicArrowHotspot._position.x, event.mousePos.y));
+ }
+
+ // Subject button handling
+ if (scene->_subjectButton._bounds.contains(event.mousePos) && (scene->_dbMode != 2)) {
+ scene->_arrowHotspot.setPosition(Common::Point(291, 34));
+ scene->_arrowHotspot._strip = 1;
+ scene->_arrowHotspot.animate(ANIM_MODE_5, NULL);
+
+ if (scene->_dbMode == 0)
+ scene->_subjectIndex = (scene->_topicArrowHotspot._position.y - 48) / 8;
+ else
+ scene->_subjectIndex = (scene->_topicArrowHotspot._position.y - 44) / 8 + 16;
+
+ if ((scene->_subjectIndex == 27) && _globals->getFlag(70))
+ _globals->setFlag(75);
+
+ scene->_topicArrowHotspot.hide();
+ scene->_prevDbMode = scene->_dbMode;
+ scene->_dbMode = 2;
+ scene->_lineOffset = 0;
+
+ _actionIndex = !_entries[scene->_subjectIndex]._visage ? 4 : 3;
+ setDelay(30);
+ scene->_soundHandler.play(159);
+ }
+
+ // Next Page button handling
+ if (scene->_nextPageButton._bounds.contains(event.mousePos)) {
+ if (!scene->_dbMode) {
+ scene->_arrowHotspot._strip = 2;
+ scene->_arrowHotspot.setPosition(Common::Point(291, 76));
+ scene->_arrowHotspot.animate(ANIM_MODE_5, NULL);
+ scene->_dbMode = 1;
+
+ _actionIndex = 2;
+ setDelay(30);
+ }
+
+ if ((scene->_dbMode == 2) && (scene->_lineOffset < _entries[scene->_subjectIndex]._size)) {
+ if (!scene->_visageVisable) {
+ ++scene->_lineOffset;
+ } else {
+ scene->_visageVisable = false;
+ scene->_visageHotspot.remove();
+ }
+ setDelay(30);
+ }
+
+ if ((scene->_subjectIndex == 20) && scene->_visageVisable) {
+ scene->_visageVisable = false;
+ scene->_visageHotspot.remove();
+ setDelay(30);
+ }
+
+ scene->_soundHandler.play(159);
+ }
+
+ // Previous Page button handling
+ if (scene->_previousPageButton._bounds.contains(event.mousePos)) {
+ switch (scene->_dbMode) {
+ case 1:
+ scene->_arrowHotspot._strip = 3;
+ scene->_arrowHotspot.setPosition(Common::Point(291, 117));
+ scene->_arrowHotspot.animate(ANIM_MODE_5, NULL);
+
+ scene->_dbMode = 0;
+ _actionIndex = 1;
+ setDelay(30);
+ break;
+ case 2:
+ if (scene->_lineOffset > 0) {
+ --scene->_lineOffset;
+ setDelay(20);
+ }
+ if ((_entries[scene->_subjectIndex]._visage != 0) && (scene->_lineOffset == 0)) {
+ _actionIndex = 3;
+ setDelay(30);
+ }
+ break;
+ }
+
+ scene->_soundHandler.play(159);
+ }
+
+ // Exit button handling
+ if (scene->_exitButton._bounds.contains(event.mousePos)) {
+ if (scene->_dbMode != 2) {
+ // In the index, so return to the previous scene
+ setAction(NULL);
+ SceneItem::display(0, 0);
+
+ _globals->_gfxManagerInstance._font.setFontNumber(2);
+ _globals->_sceneText._fontNumber = 2;
+ _globals->_sceneManager.changeScene(_globals->_sceneManager._previousScene);
+ } else {
+ // Exit out of topic display to index
+ SceneItem::display(0, 0);
+
+ if (_entries[scene->_subjectIndex]._visage)
+ scene->_visageHotspot.remove();
+
+ scene->_arrowHotspot._strip = 4;
+ scene->_arrowHotspot.setPosition(Common::Point(291, 159));
+ scene->_arrowHotspot.animate(ANIM_MODE_5, NULL);
+ scene->_dbMode = scene->_prevDbMode;
+ _actionIndex = scene->_prevDbMode + 1;
+
+ scene->_topicArrowHotspot.show();
+ setDelay(1);
+ }
+
+ scene->_soundHandler.play(159);
+ }
+ }
+
+ Action::dispatch();
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene2120::Scene2120(): Scene() {
+ _listRect = Rect(18, 48, 260, 177);
+ _dbMode = 0;
+ _prevDbMode = 0;
+ _visageVisable = false;
+ _subjectIndex = 0;
+}
+
+void Scene2120::postInit(SceneObjectList *OwnerList) {
+ loadScene(2120);
+ setZoomPercents(0, 100, 200, 100);
+ _globals->_player.disableControl();
+
+ _subjectButton.setBounds(Rect(266, 13, 320, 56));
+ _nextPageButton.setBounds(Rect(266, 56, 320, 98));
+ _previousPageButton.setBounds(Rect(266, 98, 320, 140));
+ _exitButton.setBounds(Rect(266, 140, 320, 182));
+
+ _topicArrowHotspot.postInit();
+ _topicArrowHotspot.setVisage(2120);
+ _topicArrowHotspot.animate(ANIM_MODE_NONE, NULL);
+ _topicArrowHotspot.setPosition(Common::Point(240, 55));
+
+ _arrowHotspot.postInit();
+ _arrowHotspot.setVisage(2121);
+ _arrowHotspot.animate(ANIM_MODE_NONE, NULL);
+ _arrowHotspot._frame = 1;
+ _arrowHotspot.setPosition(Common::Point(400, 200));
+
+ setAction(&_action1);
+ _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
+ _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+}
+
+void Scene2120::synchronize(Serializer &s) {
+ Scene::synchronize(s);
+
+ s.syncAsSint16LE(_dbMode);
+ s.syncAsSint16LE(_prevDbMode);
+ s.syncAsSint16LE(_visageVisable);
+ s.syncAsSint16LE(_subjectIndex);
+ s.syncAsSint16LE(_lineOffset);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2150 - Starcraft Level 2
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene2150::Action1::signal() {
+ Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ _globals->_player.disableControl();
+ Common::Point pt(158, 103);
+ PlayerMover *mover = new PlayerMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 1:
+ scene->_soundHandler.play(162);
+ scene->_hotspot1.animate(ANIM_MODE_5, this);
+ break;
+ case 2: {
+ _globals->_player.setStrip2(4);
+ Common::Point pt(158, 95);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 3:
+ _globals->_player.setStrip2(-1);
+ _globals->_player._strip = 3;
+ setDelay(10);
+ break;
+ case 4:
+ scene->_area1.display();
+ scene->_area2.display();
+ scene->_area3.display();
+ scene->_area4.display();
+
+ scene->_area2.draw(true);
+ _state = 0;
+ _globals->_events.setCursor(CURSOR_USE);
+
+ while (!_state && !_vm->shouldQuit()) {
+ // Wait for an event
+ Event event;
+ if (!_globals->_events.getEvent(event)) {
+ g_system->updateScreen();
+ g_system->delayMillis(10);
+ continue;
+ }
+
+ if (scene->_area1._bounds.contains(event.mousePos)) {
+ scene->_area2.draw(false);
+ scene->_area1.draw(true);
+ _state = scene->_area1._actionId;
+ }
+ if (scene->_area2._bounds.contains(event.mousePos)) {
+ scene->_area2.draw(true);
+ _state = scene->_area2._actionId;
+ }
+ if (scene->_area3._bounds.contains(event.mousePos)) {
+ scene->_area2.draw(false);
+ scene->_area3.draw(true);
+ _state = scene->_area3._actionId;
+ }
+ }
+
+ scene->_soundHandler.play(161);
+ scene->_area1.restore();
+ scene->_area2.restore();
+ scene->_area3.restore();
+ scene->_area4.restore();
+
+ if (_state == 2150) {
+ setDelay(1);
+ } else {
+ scene->_soundHandler.play(162);
+ scene->_hotspot1.animate(ANIM_MODE_6, this);
+ }
+ break;
+ case 5:
+ if (_state == 2150) {
+ Common::Point pt(158, 103);
+ PlayerMover *mover = new PlayerMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ } else {
+ _globals->_sceneManager.changeScene(_state);
+ }
+ break;
+ case 6:
+ scene->_soundHandler.play(162);
+ scene->_hotspot1.animate(ANIM_MODE_6, this);
+ break;
+ case 7:
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene2150::Action2::signal() {
+ Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ _globals->_player.disableControl();
+ Common::Point pt(47, 85);
+ PlayerMover *mover = new PlayerMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 1:
+ _globals->_player.setVisage(2152);
+ _globals->_player.setFrame(1);
+ _globals->_player.setStrip(8);
+ _globals->_player.animate(ANIM_MODE_8, 1, this);
+
+ scene->_soundHandler.play(163);
+ break;
+ case 2:
+ scene->_soundHandler.play(164);
+ scene->_hotspot10.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ _globals->_events.setCursor(CURSOR_WALK);
+ scene->_stripManager.start((RING_INVENTORY._ale._sceneNumber == 2150) ? 2151 : 2152, this);
+ break;
+ case 4:
+ scene->_hotspot14.postInit();
+ scene->_hotspot14.setVisage(2152);
+ scene->_hotspot14.setStrip(6);
+ scene->_hotspot14.setPosition(Common::Point(59, 54));
+
+ if (scene->_stripManager._field2E8 == 15) {
+ scene->_hotspot14.setFrame(5);
+ RING_INVENTORY._ale._sceneNumber = 1;
+ } else {
+ scene->_hotspot14.setFrame(scene->_stripManager._field2E8 - 5);
+ }
+
+ _globals->_player.setFrame(1);
+ _globals->_player.setStrip(7);
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 5:
+ scene->_soundHandler.play(164);
+ scene->_hotspot10.animate(ANIM_MODE_6, NULL);
+ scene->_hotspot14.remove();
+
+ _globals->_player.animate(ANIM_MODE_6, this);
+ break;
+ case 6:
+ _globals->_player.setVisage(0);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.enableControl();
+
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene2150::Hotspot1::doAction(int action) {
+ Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2150, 0);
+ break;
+ case CURSOR_USE:
+ scene->setAction(&scene->_action1);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2150::Hotspot2::doAction(int action) {
+ Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2150, 1);
+ break;
+ case CURSOR_USE:
+ _globals->_player.disableControl();
+ scene->_sceneMode = 2156;
+ scene->setAction(&scene->_sequenceManager, scene, 2156, &_globals->_player, this, NULL);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2150::Hotspot4::doAction(int action) {
+ Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2150, 3);
+ break;
+ case CURSOR_USE:
+ _globals->_player.disableControl();
+ scene->_sceneMode = 2155;
+ scene->setAction(&scene->_sequenceManager, scene, 2155, &_globals->_player, &scene->_hotspot4, NULL);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2150::Hotspot7::doAction(int action) {
+ Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2150, 7);
+ break;
+ case CURSOR_USE:
+ if (_globals->getFlag(13))
+ SceneItem::display2(2150, 19);
+ else {
+ _globals->_player.disableControl();
+ scene->_sceneMode = 2154;
+ scene->setAction(&scene->_sequenceManager, scene, 2154, &_globals->_player, NULL);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2150::Hotspot10::doAction(int action) {
+ Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2150, 10);
+ break;
+ case CURSOR_USE:
+ if (_globals->getFlag(13))
+ SceneItem::display2(2150, 19);
+ else
+ scene->setAction(&scene->_action2);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene2150::Scene2150() :
+ _hotspot3(18, CURSOR_LOOK, 2150, 2, CURSOR_USE, 2150, 18, LIST_END),
+ _hotspot5(17, CURSOR_LOOK, 2150, 4, CURSOR_USE, 2150, 18, LIST_END),
+ _hotspot6(0, CURSOR_LOOK, 2150, 5, CURSOR_USE, 2150, 18, LIST_END),
+ _hotspot8(16, CURSOR_LOOK, 2150, 8, LIST_END),
+ _hotspot9(0, CURSOR_LOOK, 2150, 9, CURSOR_USE, 2150, 13, LIST_END),
+ _hotspot11(0, CURSOR_LOOK, 2150, 12, LIST_END) {
+ _rect1 = Rect(260, 70, 270, 77);
+ _rect2 = Rect(222, 142, 252, 150);
+ _area1.setup(2153, 2, 1, 2100);
+ _area1._pt = Common::Point(200, 31);
+ _area2.setup(2153, 3, 1, 2150);
+ _area2._pt = Common::Point(200, 50);
+ _area3.setup(2153, 4, 1, 2320);
+ _area3._pt = Common::Point(200, 75);
+ _area4.setup(2153, 1, 1, 10);
+ _area4._pt = Common::Point(237, 77);
+
+}
+
+void Scene2150::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ setZoomPercents(55, 85, 200, 100);
+ loadScene(2150);
+
+ _stripManager.addSpeaker(&_speakerGameText);
+
+ _hotspot7.postInit();
+ _hotspot7.setVisage(2152);
+ _hotspot7._frame = 1;
+ _hotspot7._strip = 2;
+ _hotspot7.animate(ANIM_MODE_8, 0, NULL);
+ _hotspot7.setPosition(Common::Point(122, 62));
+ _hotspot7.changeZoom(100);
+ _hotspot7.fixPriority(76);
+
+ _hotspot2.postInit();
+ _hotspot2.setVisage(2151);
+ _hotspot2._frame = 1;
+ _hotspot2._strip = 3;
+ _hotspot2.animate(ANIM_MODE_NONE, NULL);
+ _hotspot2.setPosition(Common::Point(257, 67));
+ _hotspot2.changeZoom(100);
+ _hotspot2.fixPriority(60);
+
+ _hotspot1.postInit();
+ _hotspot1.setVisage(2151);
+ _hotspot1._frame = 1;
+ _hotspot1._strip = 2;
+ _hotspot1.animate(ANIM_MODE_NONE, NULL);
+ _hotspot1.setPosition(Common::Point(158, 99));
+ _hotspot1.changeZoom(100);
+ _hotspot1.fixPriority(99);
+
+ _hotspot4.postInit();
+ _hotspot4.setVisage(2150);
+ _hotspot4._frame = 1;
+ _hotspot4._strip = 2;
+ _hotspot4.animate(ANIM_MODE_NONE, NULL);
+ _hotspot4.setPosition(Common::Point(218, 200));
+ _hotspot4.changeZoom(100);
+ _hotspot4.fixPriority(200);
+
+ _hotspot10.postInit();
+ _hotspot10.setVisage(2152);
+ _hotspot10.setStrip(5);
+ _hotspot10.setPosition(Common::Point(59, 56));
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(_globals->getFlag(13) ? 2170 : 0);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.fixPriority(-1);
+ _globals->_player.changeZoom(-1);
+ _globals->_player._moveDiff.y = 3;
+
+ _hotspot8.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+ _hotspot9.setBounds(Rect(133, 0, 198, 91));
+ _hotspot11.setBounds(Rect(142, 119, 176, 158));
+
+ _globals->_sceneItems.addItems(&_hotspot1, &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5,
+ &_hotspot6, &_hotspot7, &_hotspot10, &_hotspot9, &_hotspot11, &_hotspot8, NULL);
+
+ switch (_globals->_sceneManager._previousScene) {
+ case 2120:
+ _globals->_soundHandler.play(160);
+ _globals->_soundHandler.holdAt(true);
+ _globals->_player.setPosition(Common::Point(108, 99));
+ break;
+ case 2200:
+ _globals->_player.disableControl();
+ _globals->_player.setPosition(Common::Point(159, 240));
+ _sceneMode = 2152;
+ setAction(&_sequenceManager, this, 2152, &_globals->_player, NULL);
+ break;
+ case 2280:
+ _globals->_player.disableControl();
+ _globals->_player._angle = 180;
+ _globals->_player.setPosition(Common::Point(265, 80));
+
+ _hotspot2._frame = _hotspot2.getFrameCount();
+ _sceneMode = 2157;
+ setAction(&_sequenceManager, this, 2157, &_hotspot2, NULL);
+ break;
+ case 2230:
+ _globals->_events.setCursor(CURSOR_WALK);
+ _globals->_player._strip = 4;
+ _globals->_player.setPosition(Common::Point(229, 139));
+ break;
+ case 2100:
+ default:
+ _globals->_player.disableControl();
+ _globals->_player.setPosition(Common::Point(158, 95));
+ _globals->_player.setStrip(3);
+ _sceneMode = 2151;
+
+ setAction(&_sequenceManager, this, 2151, &_globals->_player, &_hotspot1, NULL);
+ break;
+ }
+
+ _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
+ _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+}
+
+void Scene2150::synchronize(Serializer &s) {
+ Scene::synchronize(s);
+ _rect1.synchronize(s);
+ _rect2.synchronize(s);
+}
+
+void Scene2150::signal() {
+ switch (_sceneMode) {
+ case 2151:
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.enableControl();
+ break;
+ case 2152:
+ case 2153:
+ case 2157:
+ _globals->_player.enableControl();
+ break;
+ case 2154:
+ _globals->_sceneManager.changeScene(2120);
+ break;
+ case 2155:
+ _globals->_sceneManager.changeScene(2230);
+ break;
+ case 2156:
+ _globals->_sceneManager.changeScene(2280);
+ break;
+ }
+}
+
+void Scene2150::dispatch() {
+ Scene::dispatch();
+
+ if (!_action) {
+ if (_rect1.contains(_globals->_player._position)) {
+ _globals->_player.disableControl();
+ _sceneMode = 2156;
+ setAction(&_sequenceManager, this, 2156, &_globals->_player, &_hotspot2, NULL);
+ }
+ if (_rect2.contains(_globals->_player._position)) {
+ _globals->_player.disableControl();
+ _sceneMode = 2155;
+ setAction(&_sequenceManager, this, 2155, &_globals->_player, &_hotspot4, NULL);
+ }
+ if (_globals->_player._position.y >= 196) {
+ _globals->_player.disableControl();
+ SceneItem::display2(2150, 20);
+
+ _sceneMode = 2153;
+ setAction(&_sequenceManager, this, 2153, &_globals->_player, NULL);
+ }
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2200 - Starcraft - AutoDoc
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene2200::Action1::signal() {
+ Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(6);
+ break;
+ case 1:
+ scene->_hotspot4.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ SceneItem::display2(2200, 7);
+ _globals->_sceneManager.changeScene(2150);
+ remove();
+ break;
+ }
+}
+
+void Scene2200::Action2::signal() {
+ Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(3);
+ break;
+ case 1:
+ setDelay(30);
+ break;
+ case 2:
+ scene->_hotspot4.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ scene->_hotspot4.setStrip(4);
+ setDelay(30);
+ break;
+ case 4:
+ _globals->_events.setCursor(CURSOR_WALK);
+ scene->_stripManager.start(2040, this, scene);
+ break;
+ case 5:
+ scene->_hotspot4.setStrip(4);
+ scene->_hotspot4.animate(ANIM_MODE_NONE, NULL);
+ _globals->_player._uiEnabled = true;
+ remove();
+ break;
+ }
+}
+
+void Scene2200::Action3::signal() {
+ Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ scene->_soundHandler2.play(103);
+
+ scene->_hotspot4.setStrip(4);
+ scene->_hotspot4.animate(ANIM_MODE_NONE, NULL);
+ _globals->_player.disableControl();
+
+ scene->_hotspot2.postInit();
+ scene->_hotspot2.setVisage(2201);
+ scene->_hotspot2._strip = 2;
+ scene->_hotspot2.setPosition(Common::Point(218, 0));
+
+ Common::Point pt(218, 63);
+ NpcMover *mover = new NpcMover();
+ scene->_hotspot2.addMover(mover, &pt, this);
+ break;
+ }
+ case 1:
+ scene->_soundHandler2.play(104);
+ scene->_hotspot4.setStrip(2);
+ scene->_hotspot4.setFrame(2);
+ setDelay(120);
+ break;
+ case 2:
+ if (_globals->getFlag(83)) {
+ _actionIndex = 8;
+ setDelay(5);
+ } else {
+ for (SynchronizedList<SceneObject *>::iterator i = _globals->_sceneObjects->begin();
+ i != _globals->_sceneObjects->end(); ++i) {
+ (*i)->hide();
+ }
+
+ _globals->_sceneManager._scene->loadScene(66);
+
+ scene->_hotspot6.postInit();
+ scene->_hotspot6.setVisage(66);
+ scene->_hotspot6.setPosition(Common::Point(160, 197));
+
+ scene->_hotspot7.postInit();
+ scene->_hotspot7.setVisage(65);
+ scene->_hotspot7.setStrip(4);
+ scene->_hotspot7.setFrame(1);
+ scene->_hotspot7.setPosition(Common::Point(145, 165));
+
+ SceneItem::display(60, 1, SET_Y, 40, SET_X, 25, SET_FONT, 75, SET_BG_COLOR, -1, SET_FG_COLOR, 34,
+ SET_POS_MODE, 0, SET_WIDTH, 280, SET_KEEP_ONSCREEN, 1, LIST_END);
+ _state = 1;
+ setDelay(1800);
+ }
+ break;
+ case 3:
+ case 4:
+ case 5:
+ SceneItem::display(60, _actionIndex - 2, SET_Y, 40, SET_X, 25, SET_FONT, 75, SET_BG_COLOR, -1, SET_FG_COLOR, 34,
+ SET_POS_MODE, 0, SET_WIDTH, 280, SET_KEEP_ONSCREEN, 1, LIST_END);
+ setDelay(1800);
+ break;
+ case 6:
+ scene->_hotspot7.remove();
+ SceneItem::display(0, 0);
+ _state = 0;
+ setDelay(5);
+ break;
+ case 7:
+ for (SynchronizedList<SceneObject *>::iterator i = _globals->_sceneObjects->begin();
+ i != _globals->_sceneObjects->end(); ++i)
+ (*i)->show();
+
+ scene->_hotspot6.remove();
+ _globals->_sceneManager._scene->loadScene(2200);
+ setDelay(5);
+ break;
+ case 8:
+ scene->_stripManager.start(2060, this, scene);
+ break;
+ case 9:
+ scene->_hotspot4.setStrip(4);
+ scene->_hotspot4.animate(ANIM_MODE_NONE, NULL);
+ break;
+ case 10:
+ _globals->_sceneManager.changeScene(2000);
+ remove();
+ break;
+ }
+}
+
+void Scene2200::Action3::process(Event &event) {
+ if (!event.handled && ((event.eventType == EVENT_KEYPRESS) || (event.eventType == EVENT_BUTTON_DOWN))) {
+ _state = 0;
+ event.handled = true;
+ setDelay(1);
+ }
+
+ Action::process(event);
+}
+
+void Scene2200::Action4::signal() {
+ Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(5);
+ break;
+ case 1:
+ scene->_stripManager.start(2202, this, scene);
+ break;
+ case 2:
+ scene->_hotspot4.setStrip(4);
+ scene->_hotspot4.animate(ANIM_MODE_NONE, NULL);
+ setDelay(10);
+ break;
+ case 3:
+ _globals->_player._uiEnabled = true;
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene2200::Hotspot3::doAction(int action) {
+ Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2200, 10);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(2200, 11);
+ break;
+ case CURSOR_TALK:
+ _globals->_player._uiEnabled = false;
+ scene->setAction(&scene->_action4);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2200::Hotspot5::doAction(int action) {
+ Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2200, 8);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(2200, 9);
+ break;
+ case CURSOR_TALK:
+ scene->_sceneMode = 2201;
+ _globals->_player._uiEnabled = false;
+ scene->setAction(&scene->_sequenceManager, scene, 2201, NULL);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2200::Hotspot9::doAction(int action) {
+ Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2200, _globals->getFlag(8) ? 1 : 0);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(2200, 3);
+ break;
+ case OBJECT_INFODISK:
+ if (_globals->_sceneManager._previousScene == 2310) {
+ scene->_soundHandler2.play(35);
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_action3);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+
+Scene2200::Scene2200() :
+ _hotspot1(0, CURSOR_LOOK, 2200, 5, CURSOR_USE, 2200, 6, LIST_END),
+ _hotspot10(0, CURSOR_LOOK, 2200, 4, LIST_END) {
+}
+
+void Scene2200::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ setZoomPercents(0, 200, 200, 200);
+ loadScene(2200);
+
+ _stripManager.addSpeaker(&_speakerMText);
+ _stripManager.addSpeaker(&_speakerSText);
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerSL);
+ _stripManager.addSpeaker(&_speakerQR);
+ _stripManager.addSpeaker(&_speakerQL);
+ _stripManager.addSpeaker(&_speakerMR);
+ _stripManager.addSpeaker(&_speakerGameText);
+
+ _speakerQText._npc = &_globals->_player;
+ _speakerSText._npc = &_hotspot5;
+ _speakerMText._npc = &_hotspot3;
+
+ _stripManager.setCallback(this);
+
+ _hotspot5.postInit();
+ _hotspot5.setVisage(2840);
+ _hotspot5.setPosition(Common::Point(50, 235));
+
+ _hotspot8.postInit();
+ _hotspot8.setVisage(2840);
+ _hotspot8.setStrip(2);
+ _hotspot8.setPosition(Common::Point(96, 184));
+ _hotspot8.fixPriority(236);
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(2640);
+ _globals->_player.setFrame2(3);
+ _globals->_player.setPosition(Common::Point(110, 233));
+ _globals->_player.disableControl();
+
+ switch (_globals->_sceneManager._previousScene) {
+ case 2150:
+ _hotspot5.remove();
+ _hotspot8.remove();
+ break;
+ case 4000:
+ _globals->_soundHandler.play(100);
+ _globals->_soundHandler.holdAt(true);
+ _globals->_player.remove();
+ _hotspot5.remove();
+ _hotspot8.remove();
+
+ _hotspot1.postInit();
+ _hotspot1.setVisage(2202);
+ _hotspot1.setPosition(Common::Point(175, 173));
+ _hotspot1.fixPriority(99);
+
+ _hotspot3.postInit();
+ _hotspot3.setVisage(2202);
+ _hotspot3._strip = 2;
+ _hotspot3.setPosition(Common::Point(152, 76));
+ _hotspot3.fixPriority(100);
+
+ _hotspot4.postInit();
+ _hotspot4.setVisage(2202);
+ _hotspot4._strip = 3;
+ _hotspot4.setPosition(Common::Point(115, 76));
+ _hotspot4.fixPriority(200);
+
+ setAction(&_action1);
+ break;
+ case 2310:
+ default:
+ RING_INVENTORY._infoDisk._sceneNumber = 1;
+
+ _hotspot3.postInit();
+ _hotspot3.setVisage(2215);
+ _hotspot3.setPosition(Common::Point(144, 132));
+ _globals->_sceneItems.push_back(&_hotspot3);
+
+ _hotspot4.postInit();
+ _hotspot4.setVisage(2215);
+ _hotspot4._strip = 2;
+ _hotspot4.setPosition(Common::Point(120, 78));
+ _hotspot4.fixPriority(255);
+ _globals->_sceneItems.push_back(&_hotspot4);
+
+ _soundHandler1.play(101);
+ _soundHandler2.play(100);
+ _globals->_soundHandler.holdAt(true);
+
+ _globals->_sceneItems.push_back(&_hotspot5);
+ setAction(&_action2);
+ break;
+ }
+
+ _exitRect = Rect(0, 0, 35, SCREEN_HEIGHT);
+ _hotspot9.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+ _hotspot10.setBounds(Rect(87, 43, 149, 109));
+
+ _globals->_sceneItems.addItems(&_hotspot10, &_hotspot9, NULL);
+ _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
+ _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+}
+
+void Scene2200::stripCallback(int v) {
+ switch (v) {
+ case 1:
+ _hotspot4.setStrip(3);
+ _hotspot4.animate(ANIM_MODE_7, 0, NULL);
+ break;
+ case 2:
+ _hotspot4.setStrip(4);
+ _hotspot4.animate(ANIM_MODE_NONE, NULL);
+ break;
+ }
+}
+
+void Scene2200::synchronize(Serializer &s) {
+ Scene::synchronize(s);
+ _exitRect.synchronize(s);
+}
+
+void Scene2200::signal() {
+ if ((_sceneMode == 2201) || (_sceneMode == 2202))
+ _globals->_player._uiEnabled = true;
+}
+
+void Scene2200::dispatch() {
+ Scene::dispatch();
+
+ if (!_action) {
+ if (_exitRect.contains(_globals->_player._position))
+ _globals->_sceneManager.changeScene(2150);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2222 - Stasis Field Map
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene2222::Action1::signal() {
+ Scene2222 *scene = (Scene2222 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(5);
+ break;
+ case 1:
+ scene->_stripManager.start(2222, this);
+ break;
+ case 2:
+ setDelay(30);
+ break;
+ case 3:
+ _globals->_sceneManager.changeScene(1000);
+ break;
+ }
+}
+
+void Scene2222::Action2::signal() {
+ Scene2222 *scene = (Scene2222 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(60);
+ break;
+ case 1:
+ scene->_stripManager.start(5700, this);
+ break;
+ case 2:
+ setDelay(120);
+ break;
+ case 3:
+ _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
+ _globals->_sceneManager.changeScene(2100);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene2222::postInit(SceneObjectList *OwnerList) {
+ loadScene((_globals->_sceneManager._previousScene == 2000) ? 3400 : 3450);
+ Scene::postInit();
+ setZoomPercents(0, 100, 200, 100);
+
+ _stripManager.addSpeaker(&_speakerSText);
+ _stripManager.addSpeaker(&_speakerMText);
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerSR);
+ _stripManager.addSpeaker(&_speakerML);
+
+ _hotspot1.postInit();
+ _hotspot1.setVisage(3401);
+ _hotspot1.setStrip2(1);
+ _hotspot1._frame = 1;
+ _hotspot1.animate(ANIM_MODE_2, 0);
+
+ _hotspot2.postInit();
+ _hotspot2.setVisage(3401);
+ _hotspot2.setStrip2(2);
+ _hotspot2._frame = 2;
+ _hotspot2.animate(ANIM_MODE_2, 0);
+
+ _hotspot3.postInit();
+ _hotspot3.setVisage(3401);
+ _hotspot3.setStrip2(2);
+ _hotspot3._frame = 3;
+ _hotspot3.animate(ANIM_MODE_2, 0);
+
+ _hotspot4.postInit();
+ _hotspot4.setVisage(3401);
+ _hotspot4.setStrip2(2);
+ _hotspot4._frame = 4;
+ _hotspot4.animate(ANIM_MODE_2, 0);
+
+ _hotspot5.postInit();
+ _hotspot5.setVisage(3401);
+ _hotspot5.setStrip2(2);
+ _hotspot5.setFrame(5);
+ _hotspot5.animate(ANIM_MODE_2, 0);
+
+ if (_globals->_sceneManager._previousScene == 2100) {
+ _hotspot1.setPosition(Common::Point(61, 101));
+ _hotspot2.setPosition(Common::Point(239, 149));
+ _hotspot3.setPosition(Common::Point(184, 85));
+ _hotspot4.setPosition(Common::Point(105, 165));
+ _hotspot5.remove();
+
+ setAction(&_action2);
+ } else {
+ _hotspot1.setPosition(Common::Point(110, 108));
+ _hotspot2.setPosition(Common::Point(175, 136));
+ _hotspot3.setPosition(Common::Point(162, 96));
+ _hotspot4.setPosition(Common::Point(118, 141));
+ _hotspot5.setPosition(Common::Point(124, 107));
+
+ setAction(&_action1);
+ }
+
+ _soundHandler.play(116);
+ _globals->_sceneManager._scene->_sceneBounds.center(_hotspot1._position);
+
+ _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
+ _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+}
+
+
+/*--------------------------------------------------------------------------
+ * Scene 2230 - Starcraft - Quinn's Room
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene2230::Action1::signal() {
+ Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ switch (scene->_field30A) {
+ case 1:
+ scene->setAction(&scene->_action3);
+ break;
+ case 2:
+ scene->setAction(&scene->_action6);
+ break;
+ default:
+ setDelay(10);
+ break;
+ }
+ break;
+ case 1: {
+ Common::Point pt(84, 74);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 2:
+ scene->_hotspot1.animate(ANIM_MODE_5, this);
+ break;
+ case 3: {
+ Common::Point pt(63, 60);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 4:
+ scene->_hotspot1.animate(ANIM_MODE_6, this);
+ break;
+ case 5:
+ _globals->_sceneManager.changeScene(2150);
+ break;
+ }
+}
+
+void Scene2230::Action2::signal() {
+ Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ switch (scene->_field30A) {
+ case 2:
+ scene->setAction(&scene->_action6, this);
+ break;
+ default:
+ setDelay(10);
+ break;
+ }
+ break;
+ case 1: {
+ _globals->_player.disableControl();
+ scene->_field30A = 1;
+ _globals->_player._regionBitList |= ~0x80;
+ Common::Point pt(160, 96);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 2:
+ _globals->_player.setVisage(2235);
+ _globals->_player.setStrip2(1);
+ _globals->_player.fixPriority(100);
+ _globals->_player._frame = 1;
+ _globals->_player.setPosition(Common::Point(200, 68));
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ scene->_soundHandler.play(157);
+ _globals->_player._moveDiff = Common::Point(1, 1);
+ _globals->_player.setAction(&scene->_action4);
+ _globals->_player._uiEnabled = true;
+
+ _globals->_events.setCursor(CURSOR_USE);
+ remove();
+ break;
+ }
+}
+
+void Scene2230::Action3::signal() {
+ Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ _globals->_player.setAction(NULL);
+ _globals->_player._moveDiff = Common::Point(5, 3);
+ _globals->_player.setStrip2(_globals->_player._strip);
+
+ Common::Point pt(190, 74);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+
+ scene->_soundHandler.stop();
+ break;
+ }
+ case 1:
+ _globals->_player._strip = 3;
+ _globals->_player._frame = 1;
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ _globals->_player._regionBitList |= 0x80;
+ scene->_field30A = 0;
+
+ _globals->_player.setVisage(0);
+ _globals->_player.setStrip2(-1);
+ _globals->_player.fixPriority(-1);
+ _globals->_player.setPosition(Common::Point(164, 96));
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player._canWalk = true;
+
+ _globals->_events.setCursor(CURSOR_USE);
+ remove();
+ }
+}
+
+void Scene2230::Action4::signal() {
+ switch (_actionIndex++) {
+ case 0:
+ Common::Point pt(190 + _globals->_randomSource.getRandomNumber(9), 68);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ _actionIndex = 0;
+ break;
+ }
+}
+
+void Scene2230::Action5::signal() {
+ Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ switch (scene->_field30A) {
+ case 2:
+ scene->setAction(&scene->_action3, this);
+ break;
+ default:
+ setDelay(10);
+ break;
+ }
+ break;
+ case 1: {
+ _globals->_player.disableControl();
+ Common::Point pt(209, 124);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 2:
+ _globals->_player.fixPriority(1430);
+ _globals->_player.setVisage(2232);
+ _globals->_player._strip = 1;
+ _globals->_player._frame = 1;
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ _globals->_events.setCursor(CURSOR_USE);
+ _globals->_player._uiEnabled = true;
+ scene->_field30A = 2;
+ remove();
+ break;
+ }
+}
+
+void Scene2230::Action6::signal() {
+ Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player._strip = 2;
+ _globals->_player._frame = 1;
+ _globals->_player.fixPriority(-1);
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 1:
+ scene->_field30A = 0;
+ _globals->_player.setVisage(0);
+ _globals->_player._strip = 1;
+ _globals->_player._canWalk = true;
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ remove();
+ break;
+ }
+}
+
+void Scene2230::Action7::signal() {
+ Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+
+ switch (scene->_field30A) {
+ case 1:
+ scene->setAction(&scene->_action3, this);
+ break;
+ case 2:
+ scene->setAction(&scene->_action6, this);
+ break;
+ default:
+ setDelay(10);
+ break;
+ }
+ break;
+ case 1: {
+ Common::Point pt(140, 119);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 2: {
+ scene->_soundHandler.play(158);
+ scene->_hotspot8.setStrip2(2);
+
+ Common::Point pt(scene->_hotspot8._position.x, 97);
+ NpcMover *mover = new NpcMover();
+ scene->_hotspot8.addMover(mover, &pt, this);
+ break;
+ }
+ case 3:
+ scene->_hotspot2.postInit();
+ scene->_hotspot2.setVisage(2231);
+ scene->_hotspot2._strip = 3;
+ scene->_hotspot2.setPosition(Common::Point(166, 116));
+ scene->_hotspot2.fixPriority(131);
+ scene->_hotspot2.animate(ANIM_MODE_5, this);
+
+ scene->_hotspot8._frame = 2;
+ break;
+ case 4:
+ _globals->_sceneItems.push_front(&scene->_hotspot10);
+ _globals->_sceneItems.push_front(&scene->_hotspot11);
+ _globals->_sceneItems.push_front(&scene->_hotspot12);
+
+ scene->_hotspot2.remove();
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene2230::Action8::signal() {
+ Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+
+ switch (scene->_field30A) {
+ case 1:
+ scene->setAction(&scene->_action3, this);
+ break;
+ case 2:
+ scene->setAction(&scene->_action6, this);
+ break;
+ default:
+ setDelay(10);
+ break;
+ }
+ break;
+ case 1: {
+ Common::Point pt(140, 119);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 2: {
+ _globals->_sceneItems.remove(&scene->_hotspot10);
+ _globals->_sceneItems.remove(&scene->_hotspot11);
+ _globals->_sceneItems.remove(&scene->_hotspot12);
+
+ switch (scene->_field30A) {
+ case 1:
+ scene->setAction(&scene->_action3, this);
+ break;
+ case 2:
+ scene->setAction(&scene->_action6, this);
+ break;
+ default:
+ setDelay(10);
+ break;
+ }
+ break;
+ }
+ case 3:
+ scene->_hotspot2.postInit();
+ scene->_hotspot2.setVisage(2231);
+ scene->_hotspot2._strip = 3;
+ scene->_hotspot2._frame = scene->_hotspot2.getFrameCount();
+ scene->_hotspot2.setPosition(Common::Point(166, 116));
+ scene->_hotspot2.fixPriority(131);
+ scene->_hotspot2.animate(ANIM_MODE_6, this);
+ break;
+ case 4: {
+ scene->_soundHandler.play(158);
+ scene->_hotspot2.remove();
+ scene->_hotspot8._frame = 1;
+
+ Common::Point pt(scene->_hotspot8._position.x, 133);
+ NpcMover *mover = new NpcMover();
+ scene->_hotspot8.addMover(mover, &pt, this);
+ break;
+ }
+ case 5:
+ scene->_hotspot8.setStrip2(1);
+ _globals->_player.enableControl();
+
+ remove();
+ break;
+ }
+}
+
+
+/*--------------------------------------------------------------------------*/
+
+void Scene2230::Hotspot1::doAction(int action) {
+ Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2230, 0);
+ break;
+ case CURSOR_USE:
+ scene->setAction(&scene->_action1);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2230::Hotspot3::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_globals->getFlag(4))
+ SceneItem::display2(2230, 1);
+ else {
+ SceneItem::display2(2230, 1);
+ SceneItem::display2(2230, 2);
+ SceneItem::display2(2230, 3);
+ _globals->setFlag(4);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2230::Hotspot4::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_globals->getFlag(30))
+ SceneItem::display2(2230, 6);
+ else if (_globals->getFlag(29)) {
+ SceneItem::display2(2230, 5);
+ _globals->setFlag(30);
+ } else {
+ SceneItem::display2(2230, 4);
+ _globals->setFlag(29);
+ }
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(2230, 7);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2230::Hotspot5::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_globals->getFlag(5))
+ SceneItem::display2(2230, 9);
+ else {
+ _globals->setFlag(5);
+ SceneItem::display2(2230, 8);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2230::Hotspot6::doAction(int action) {
+ Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_globals->getFlag(6))
+ SceneItem::display2(2230, 11);
+ else {
+ _globals->setFlag(6);
+ SceneItem::display2(2230, 10);
+ }
+ break;
+ case CURSOR_USE:
+ if (scene->_field30A == 1)
+ scene->setAction(&scene->_action3);
+ else if (_globals->getFlag(13))
+ SceneItem::display2(2230, 28);
+ else
+ scene->setAction(&scene->_action2);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2230::Hotspot7::doAction(int action) {
+ Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_globals->getFlag(7))
+ SceneItem::display2(2230, 13);
+ else {
+ _globals->setFlag(6);
+ SceneItem::display2(2230, 12);
+ }
+ break;
+ case CURSOR_USE:
+ if (scene->_field30A == 2)
+ scene->setAction(&scene->_action6);
+ else if (_globals->getFlag(13))
+ SceneItem::display2(2230, 29);
+ else
+ scene->setAction(&scene->_action5);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2230::Hotspot8::doAction(int action) {
+ Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ if (scene->_hotspot8._strip == 1) {
+ if (_globals->getFlag(22))
+ SceneItem::display2(2230, 19);
+ else {
+ _globals->setFlag(22);
+ SceneItem::display2(2230, 14);
+ }
+ } else {
+ if (_globals->getFlag(25))
+ SceneItem::display2(2230, 21);
+ else {
+ _globals->setFlag(25);
+ SceneItem::display2(2230, 20);
+ }
+ }
+ break;
+ case CURSOR_USE:
+ if (scene->_hotspot8._strip == 1)
+ scene->setAction(&scene->_action7);
+ else
+ scene->setAction(&scene->_action8);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2230::Hotspot10::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_globals->getFlag(26))
+ SceneItem::display2(2230, 25);
+ else {
+ _globals->setFlag(26);
+ SceneItem::display2(2230, 24);
+ }
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(2230, 28);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2230::Hotspot11::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_globals->getFlag(27))
+ SceneItem::display2(2230, 23);
+ else {
+ _globals->setFlag(27);
+ SceneItem::display2(2230, 22);
+ }
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(2230, 28);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2230::Hotspot12::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_globals->getFlag(28))
+ SceneItem::display2(2230, 27);
+ else {
+ _globals->setFlag(28);
+ SceneItem::display2(2230, 26);
+ }
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(2230, 28);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene2230::Scene2230() :
+ _hotspot9(0, CURSOR_LOOK, 2230, 16, CURSOR_USE, 2230, 18, LIST_END) {
+}
+
+void Scene2230::postInit(SceneObjectList *OwnerList) {
+ loadScene(2230);
+ Scene::postInit();
+ setZoomPercents(75, 80, 120, 100);
+
+ _hotspot1.postInit();
+ _hotspot1.setVisage(2230);
+ _hotspot1._frame = 1;
+ _hotspot1.animate(ANIM_MODE_NONE, 0);
+ _hotspot1.setPosition(Common::Point(72, 69));
+ _hotspot1.changeZoom(100);
+
+ _hotspot8.postInit();
+ _hotspot8.setVisage(2231);
+ _hotspot8._frame = 1;
+ _hotspot8.animate(ANIM_MODE_NONE, 0);
+ _hotspot8.setPosition(Common::Point(164, 133));
+ _hotspot8.changeZoom(100);
+ _hotspot8.fixPriority(129);
+
+ _rect1 = Rect(59, 64, 89, 74);
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(_globals->getFlag(13) ? 2170 : 0);
+ _globals->_player.animate(ANIM_MODE_1, 0);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.setPosition(Common::Point(80, 80));
+ _globals->_player._moveDiff.y = 3;
+ _globals->_player._regionBitList |= 0x80;
+ _globals->_player.changeZoom(-1);
+
+ _field30A = 0;
+ _globals->_player.enableControl();
+
+ _hotspot5.setBounds(Rect(108, 34, 142, 76));
+ _hotspot4.setBounds(Rect(92, 14, 106, 57));
+ _hotspot6.setBounds(Rect(169, 58, 261, 95));
+ _hotspot7.setBounds(Rect(111, 117, 222, 158));
+ _hotspot3.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+ _hotspot10.setBounds(Rect(170, 96, 176, 106));
+ _hotspot11.setBounds(Rect(158, 109, 164, 115));
+ _hotspot12.setBounds(Rect(170, 109, 177, 115));
+
+ _globals->_sceneItems.addItems(&_hotspot8, &_hotspot5, &_hotspot4, &_hotspot6, &_hotspot7,
+ &_hotspot1, &_hotspot3, NULL);
+
+ _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
+ _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+}
+
+void Scene2230::synchronize(Serializer &s) {
+ Scene::synchronize(s);
+ _rect1.synchronize(s);
+ s.syncAsSint16LE(_field30A);
+}
+
+void Scene2230::dispatch() {
+ Scene::dispatch();
+
+ if (!_action) {
+ if (_rect1.contains(_globals->_player._position))
+ setAction(&_action1);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2280 - Starcraft - Storage Room
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene2280::Action1::signal() {
+ Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ _globals->_player.disableControl();
+ Common::Point pt(192, 97);
+ PlayerMover *mover = new PlayerMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 1:
+ scene->_soundHandler.play(162);
+ scene->_hotspot16.animate(ANIM_MODE_5, this);
+ break;
+ case 2: {
+ Common::Point pt(218, 87);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 3:
+ _globals->_player.setStrip(3);
+ setDelay(10);
+ break;
+ case 4:
+ _globals->_player.fixPriority(1);
+ scene->_soundHandler.play(162);
+ scene->_hotspot16.animate(ANIM_MODE_6, this);
+ break;
+ case 5:
+ _globals->_sceneManager.changeScene(7000);
+ break;
+ }
+}
+
+void Scene2280::Action2::signal() {
+ Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ _globals->_player.disableControl();
+ Common::Point pt(94, 117);
+ PlayerMover *mover = new PlayerMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 1:
+ scene->_soundHandler.play(265);
+
+ _globals->_player.setVisage(2162);
+ _globals->_player._frame = 1;
+ _globals->_player._strip = 1;
+ _globals->_player.animate(ANIM_MODE_5, this);
+
+ scene->_hotspot8.remove();
+ scene->_hotspot10.remove();
+ break;
+ case 2:
+ _globals->_player._frame = 1;
+ _globals->_player._strip = 2;
+ _globals->_player.animate(ANIM_MODE_4, 3, 1, this);
+ break;
+ case 3:
+ _globals->_player.animate(ANIM_MODE_5, this);
+ scene->_hotspot12.remove();
+ break;
+ case 4:
+ scene->_soundHandler.play(266);
+ _globals->_player.setVisage(2170);
+ _globals->_player._frame = 1;
+ _globals->_player._strip = 4;
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player._moveDiff = Common::Point(4, 1);
+
+ _globals->setFlag(13);
+ SceneItem::display2(2280, 37);
+
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene2280::Action3::signal() {
+ Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ _globals->_player.disableControl();
+ Common::Point pt(94, 117);
+ PlayerMover *mover = new PlayerMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 1:
+ scene->_soundHandler.play(265);
+
+ _globals->_player.setVisage(2162);
+ _globals->_player._frame = 6;
+ _globals->_player._strip = 2;
+ _globals->_player.animate(ANIM_MODE_4, 3, -1, this);
+ break;
+ case 2:
+ scene->_hotspot12.postInit();
+ scene->_hotspot12.setVisage(2280);
+ scene->_hotspot12._strip = 2;
+ scene->_hotspot12._frame = 3;
+ scene->_hotspot12.setPosition(Common::Point(88, 76));
+ scene->_hotspot12.fixPriority(1);
+
+ _globals->_player.animate(ANIM_MODE_6, this);
+ break;
+ case 3:
+ _globals->_player._strip = 1;
+ _globals->_player._frame = 12;
+
+ _globals->_player.animate(ANIM_MODE_6, this);
+ break;
+ case 4:
+ scene->_hotspot8.postInit();
+ scene->_hotspot8.setVisage(2280);
+ scene->_hotspot8._strip = 2;
+ scene->_hotspot8._frame = 1;
+ scene->_hotspot8.animate(ANIM_MODE_NONE, NULL);
+ scene->_hotspot8.setPosition(Common::Point(79, 108));
+ scene->_hotspot8.changeZoom(100);
+ scene->_hotspot8.fixPriority(1);
+
+ scene->_hotspot10.postInit();
+ scene->_hotspot10.setVisage(2280);
+ scene->_hotspot10._strip = 2;
+ scene->_hotspot10._frame = 2;
+ scene->_hotspot10.animate(ANIM_MODE_NONE, NULL);
+ scene->_hotspot10.setPosition(Common::Point(79, 104));
+ scene->_hotspot10.changeZoom(100);
+ scene->_hotspot10.fixPriority(1);
+
+ _globals->clearFlag(13);
+
+ _globals->_player.setVisage(0);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player._strip = 4;
+ _globals->_player._moveDiff = Common::Point(3, 5);
+
+ SceneItem::display2(2280, 38);
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene2280::Action4::signal() {
+ Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ switch (_state) {
+ case 1:
+ case 51: {
+ Common::Point pt(163, 67);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 6:
+ case 50: {
+ Common::Point pt(173, 63);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ }
+ break;
+ }
+ case 1:
+ _globals->_player.setVisage(2161);
+ _globals->_player._strip = 1;
+ _globals->_player._frame = 1;
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ switch (_state) {
+ case 1:
+ scene->_hotspot18.remove();
+ RING_INVENTORY._scanner._sceneNumber = 1;
+ break;
+ case 6:
+ scene->_hotspot17.remove();
+ RING_INVENTORY._medkit._sceneNumber = 1;
+ break;
+ case 50:
+ scene->_hotspot17.postInit();
+ scene->_hotspot17.setVisage(2161);
+ scene->_hotspot17._strip = 2;
+ scene->_hotspot17._frame = 1;
+ scene->_hotspot17.animate(ANIM_MODE_NONE, NULL);
+ scene->_hotspot17.setPosition(Common::Point(162, 39));
+ scene->_hotspot17.changeZoom(100);
+ scene->_hotspot17.fixPriority(1);
+
+ RING_INVENTORY._medkit._sceneNumber = 2280;
+ _globals->_sceneItems.push_front(&scene->_hotspot17);
+ break;
+ case 51:
+ scene->_hotspot18.postInit();
+ scene->_hotspot18.setVisage(2161);
+ scene->_hotspot18._strip = 2;
+ scene->_hotspot18._frame = 2;
+ scene->_hotspot18.animate(ANIM_MODE_NONE, NULL);
+ scene->_hotspot18.setPosition(Common::Point(152, 43));
+ scene->_hotspot18.changeZoom(100);
+ scene->_hotspot18.fixPriority(1);
+
+ RING_INVENTORY._scanner._sceneNumber = 2280;
+ _globals->_sceneItems.push_front(&scene->_hotspot18);
+ break;
+ }
+
+ _globals->_player.animate(ANIM_MODE_6, this);
+ break;
+ case 3:
+ _globals->_player.enableControl();
+ _globals->_player.setVisage(0);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player._strip = 2;
+
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene2280::Hotspot1::doAction(int action) {
+ Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_globals->getFlag(16))
+ SceneItem::display2(2280, 22);
+ else {
+ _globals->setFlag(16);
+ SceneItem::display2(2230, 21);
+ }
+ break;
+ case CURSOR_USE:
+ if (!_globals->getFlag(15))
+ SceneItem::display2(2280, 23);
+ else if (!_globals->getFlag(13))
+ SceneItem::display2(2280, 46);
+ else {
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_action1);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2280::Hotspot2::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_globals->getFlag(2))
+ SceneItem::display2(2280, 1);
+ else {
+ _globals->setFlag(2);
+ SceneItem::display2(2280, 0);
+ }
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(2280, 2);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2280::Hotspot4::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_globals->getFlag(21))
+ SceneItem::display2(2280, 33);
+ else {
+ _globals->setFlag(21);
+ SceneItem::display2(2280, 32);
+ }
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(2280, 34);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2280::Hotspot7::doAction(int action) {
+ Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2280, 24);
+ break;
+ case OBJECT_SCANNER:
+ if (_globals->getFlag(13))
+ SceneItem::display2(2280, 43);
+ else {
+ _globals->_player.disableControl();
+ scene->_action4._state = 51;
+ _globals->_events.setCursor(CURSOR_WALK);
+ _globals->_events._currentCursor = CURSOR_700;
+ scene->setAction(&scene->_action4);
+ }
+ break;
+ case OBJECT_MEDKIT:
+ if (_globals->getFlag(13))
+ SceneItem::display2(2280, 43);
+ else {
+ _globals->_player.disableControl();
+ scene->_action4._state = 50;
+ _globals->_events.setCursor(CURSOR_WALK);
+ _globals->_events._currentCursor = CURSOR_700;
+ scene->setAction(&scene->_action4);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2280::Hotspot8::doAction(int action) {
+ Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2280, 3);
+ break;
+ case CURSOR_USE:
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_action2);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2280::Hotspot10::doAction(int action) {
+ Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2280, 4);
+ break;
+ case CURSOR_USE:
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_action2);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2280::Hotspot12::doAction(int action) {
+ Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2280, 11);
+ break;
+ case CURSOR_USE:
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_action2);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2280::Hotspot14::doAction(int action) {
+ Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2280, 3);
+ break;
+ case CURSOR_USE:
+ _globals->_player.disableControl();
+ if (_globals->getFlag(13))
+ scene->setAction(&scene->_action3);
+ else
+ scene->setAction(&scene->_action2);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2280::Hotspot17::doAction(int action) {
+ Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_globals->getFlag(18))
+ SceneItem::display2(2280, 26);
+ else {
+ _globals->setFlag(18);
+ SceneItem::display2(2280, 25);
+ }
+ break;
+ case CURSOR_USE:
+ if (_globals->getFlag(13))
+ SceneItem::display2(2280, 29);
+ else {
+ _globals->_player.disableControl();
+ scene->_action4._state = 6;
+ scene->setAction(&scene->_action4);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2280::Hotspot18::doAction(int action) {
+ Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_globals->getFlag(19))
+ SceneItem::display2(2280, 28);
+ else {
+ _globals->setFlag(19);
+ SceneItem::display2(2280, 27);
+ }
+ break;
+ case CURSOR_USE:
+ if (_globals->getFlag(13))
+ SceneItem::display2(2280, 29);
+ else {
+ _globals->_player.disableControl();
+ scene->_action4._state = 1;
+ scene->setAction(&scene->_action4);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene2280::Scene2280() :
+ _hotspot3(0, CURSOR_LOOK, 2280, 30, CURSOR_USE, 2280, 31, LIST_END),
+ _hotspot5(0, CURSOR_LOOK, 2280, 35, CURSOR_USE, 2280, 36, LIST_END),
+ _hotspot6(0, CURSOR_LOOK, 2280, 19, CURSOR_USE, 2280, 20, LIST_END),
+ _hotspot9(0, CURSOR_LOOK, 2280, 5, CURSOR_USE, 2280, 6, LIST_END),
+ _hotspot11(0, CURSOR_LOOK, 2280, 7, CURSOR_USE, 2280, 8, LIST_END),
+ _hotspot13(0, CURSOR_LOOK, 2280, 9, CURSOR_USE, 2280, 10, LIST_END),
+ _hotspot15(0, CURSOR_LOOK, 2280, 45, LIST_END),
+ _hotspot16(0, CURSOR_LOOK, 2280, 16, CURSOR_USE, 2280, 42, LIST_END) {
+}
+
+void Scene2280::postInit(SceneObjectList *OwnerList) {
+ loadScene(2280);
+ Scene::postInit();
+ setZoomPercents(0, 70, 200, 100);
+
+ _hotspot16.postInit();
+ _hotspot16.setVisage(2281);
+ _hotspot16.setPosition(Common::Point(208, 90));
+ _hotspot16.fixPriority(80);
+
+ if (RING_INVENTORY._medkit._sceneNumber == 2280) {
+ _hotspot17.postInit();
+ _hotspot17.setVisage(2161);
+ _hotspot17._strip = 2;
+ _hotspot17.setPosition(Common::Point(162, 39));
+ _hotspot17.fixPriority(1);
+
+ _globals->_sceneItems.push_back(&_hotspot17);
+ }
+
+ if (RING_INVENTORY._scanner._sceneNumber == 2280) {
+ _hotspot18.postInit();
+ _hotspot18.setVisage(2161);
+ _hotspot18._strip = 2;
+ _hotspot18._frame = 2;
+ _hotspot17.setPosition(Common::Point(152, 43));
+ _hotspot17.fixPriority(1);
+
+ _globals->_sceneItems.push_back(&_hotspot17);
+ }
+
+ if (!_globals->getFlag(13)) {
+ _hotspot8.postInit();
+ _hotspot8.setVisage(2280);
+ _hotspot8._strip = 2;
+ _hotspot8.setPosition(Common::Point(79, 108));
+ _hotspot8.fixPriority(1);
+
+ _hotspot10.postInit();
+ _hotspot10.setVisage(2280);
+ _hotspot10._strip = 2;
+ _hotspot10._frame = 2;
+ _hotspot10.setPosition(Common::Point(79, 104));
+ _hotspot10.fixPriority(2);
+
+ _hotspot12.postInit();
+ _hotspot12.setVisage(2280);
+ _hotspot12._strip = 2;
+ _hotspot12._frame = 3;
+ _hotspot12.setPosition(Common::Point(88, 76));
+ _hotspot12.fixPriority(1);
+
+ _globals->_sceneItems.addItems(&_hotspot8, &_hotspot10, &_hotspot12, NULL);
+ }
+
+ _hotspot14.setBounds(Rect(70, 50, 90, 104));
+
+ _hotspot9.postInit();
+ _hotspot9.setVisage(2280);
+ _hotspot9.setPosition(Common::Point(104, 96));
+ _hotspot9.fixPriority(1);
+
+ _hotspot11.postInit();
+ _hotspot11.setVisage(2280);
+ _hotspot11._frame = 2;
+ _hotspot11.setPosition(Common::Point(130, 79));
+ _hotspot11.fixPriority(1);
+
+ _hotspot13.postInit();
+ _hotspot13.setVisage(2280);
+ _hotspot13._frame = 3;
+ _hotspot13.setPosition(Common::Point(113, 63));
+ _hotspot13.fixPriority(1);
+
+ _hotspot1.setBounds(Rect(225, 70, 234, 80));
+ _hotspot2.setBounds(Rect(44, 78, 56, 105));
+ _hotspot3.setBounds(Rect(47, 108, 56, 117));
+ _hotspot4.setBounds(Rect(56, 78, 69, 101));
+ _hotspot5.setBounds(Rect(56, 108, 66, 113));
+ _hotspot6.setBounds(Rect(261, 39, 276, 90));
+ _hotspot7.setBounds(Rect(142, 19, 174, 38));
+ _hotspot15.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+
+ _exitRect = Rect(145, 180, 195, 195);
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(_globals->getFlag(13) ? 2170 : 0);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.setPosition(Common::Point(146, 161));
+ _globals->_player.changeZoom(-1);
+ _globals->_player._moveDiff = Common::Point(4, 3);
+
+ if ((_globals->_sceneManager._previousScene != 7300) && (_globals->_sceneManager._previousScene != 7000)) {
+ _globals->_player.enableControl();
+ } else {
+ _globals->setFlag(109);
+ _globals->_player.fixPriority(76);
+ _globals->_player.disableControl();
+
+ _sceneMode = 2281;
+ setAction(&_sequenceManager, this, 2281, &_globals->_player, &_hotspot16, NULL);
+
+ _globals->_soundHandler.play(160);
+ _globals->_soundHandler.holdAt(true);
+ }
+
+ _globals->_sceneItems.addItems(&_hotspot13, &_hotspot11, &_hotspot9, &_hotspot14, &_hotspot7,
+ &_hotspot6, &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5, &_hotspot1, &_hotspot16, &_hotspot15, NULL);
+
+ _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
+ _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+}
+
+void Scene2280::signal() {
+ if (_sceneMode == 2281) {
+ _globals->_player.fixPriority(-1);
+ _globals->_player.enableControl();
+ }
+}
+
+void Scene2280::dispatch() {
+ Scene::dispatch();
+ if (!_action) {
+ if (_exitRect.contains(_globals->_player._position))
+ _globals->_sceneManager.changeScene(2150);
+ }
+}
+
+void Scene2280::synchronize(Serializer &s) {
+ Scene::synchronize(s);
+ _exitRect.synchronize(s);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2300 - Starcraft - Hanger Bay
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene2300::Action1::signal() {
+ // Quinn and Seeker
+ Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(10);
+ break;
+ case 1: {
+ Common::Point pt(SCREEN_WIDTH, SCREEN_HEIGHT);
+ NpcMover *mover = new NpcMover();
+ scene->_hotspot2.addMover(mover, &pt, this);
+ break;
+ }
+ case 2: {
+ scene->_hotspot8.setAction(&scene->_action4);
+ scene->_soundHandler2.play(21);
+
+ Common::Point pt1(95, scene->_hotspot5._position.y);
+ NpcMover *mover1 = new NpcMover();
+ scene->_hotspot5.addMover(mover1, &pt1, this);
+
+ Common::Point pt2(99, scene->_hotspot6._position.y);
+ NpcMover *mover2 = new NpcMover();
+ scene->_hotspot6.addMover(mover2, &pt2, NULL);
+ break;
+ }
+ case 3:
+ setDelay(2);
+ _globals->_player._uiEnabled = true;
+ _globals->_events.setCursor(CURSOR_WALK);
+ break;
+ case 4: {
+ scene->_hotspot5.setVisage(93);
+ scene->_hotspot6.setVisage(94);
+ scene->_hotspot5.setStrip(1);
+ scene->_hotspot6.setStrip(1);
+ scene->_hotspot5.changeZoom(50);
+ scene->_hotspot6.changeZoom(50);
+ scene->_hotspot5._moveDiff.x = 5;
+ scene->_hotspot6._moveDiff.x = 5;
+ scene->_hotspot5.animate(ANIM_MODE_1, NULL);
+ scene->_hotspot6.animate(ANIM_MODE_1, NULL);
+
+ Common::Point pt1(178, 147);
+ NpcMover *mover1 = new NpcMover();
+ scene->_hotspot5.addMover(mover1, &pt1, this);
+
+ Common::Point pt2(170, 145);
+ NpcMover *mover2 = new NpcMover();
+ scene->_hotspot6.addMover(mover2, &pt2, this);
+ break;
+ }
+ case 6:
+ scene->_soundHandler1.play(28);
+ _globals->_player.disableControl();
+
+ scene->_hotspot2.setVisage(40);
+ scene->_hotspot2.setStrip(4);
+ scene->_hotspot2.setFrame(1);
+ scene->_hotspot2.animate(ANIM_MODE_5, NULL);
+
+ _globals->_player.setVisage(40);
+ _globals->_player.setStrip(2);
+ _globals->_player.setFrame(1);
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 7:
+ _globals->_soundHandler.play(77, this);
+ break;
+ case 8:
+ _globals->_game->endGame(2300, 0);
+ remove();
+ break;
+ case 9:
+ if (scene->_hotspot5._mover)
+ scene->_hotspot5.addMover(NULL);
+ if (scene->_hotspot6._mover)
+ scene->_hotspot6.addMover(NULL);
+
+ scene->_hotspot5.animate(ANIM_MODE_NONE, NULL);
+ scene->_hotspot6.animate(ANIM_MODE_NONE, NULL);
+
+ _globals->_player.disableControl();
+ _globals->_player.setVisage(2672);
+ _globals->_player._strip = 5;
+ _globals->_player._frame = 1;
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 10:
+ _globals->_player.setVisage(2674);
+ _globals->_player._strip = 5;
+ _globals->_player._frame = 1;
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 11:
+ scene->_soundHandler1.play(28);
+
+ scene->_hotspot5._strip = 2;
+ scene->_hotspot6._strip = 2;
+ scene->_hotspot5._frame = 1;
+ scene->_hotspot6._frame = 1;
+ scene->_hotspot5.animate(ANIM_MODE_5, NULL);
+ scene->_hotspot6.animate(ANIM_MODE_5, NULL);
+ scene->_hotspot5.fixPriority(20);
+ scene->_hotspot6.fixPriority(20);
+
+ _globals->_player.setVisage(2672);
+ _globals->_player._strip = 5;
+ _globals->_player._frame = _globals->_player.getFrameCount();
+ _globals->_player.animate(ANIM_MODE_6, this);
+ break;
+ case 12:
+ scene->_soundHandler1.play(77);
+ _globals->_player.setVisage(0);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setStrip(4);
+ _globals->_player._uiEnabled = false;
+ setDelay(60);
+ break;
+ case 13:
+ scene->_stripManager.start(2300, this);
+ break;
+ case 14:
+ setDelay(5);
+ _actionIndex = 16;
+ break;
+ case 15: {
+ Common::Point pt1(101, 148);
+ PlayerMover *mover1 = new PlayerMover();
+ _globals->_player.addMover(mover1, &pt1, this);
+
+ Common::Point pt2(scene->_hotspot5._position.x + 5, scene->_hotspot5._position.y + 5);
+ NpcMover *mover2 = new NpcMover();
+ scene->_hotspot2.addMover(mover2, &pt2, NULL);
+ break;
+ }
+ case 16:
+ _globals->_sceneManager.changeScene(2000);
+ remove();
+ break;
+ }
+}
+
+void Scene2300::Action2::signal() {
+ // Miranda tearing cables
+ Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(30);
+ break;
+ case 1: {
+ Common::Point pt(153, 135);
+ PlayerMover *mover = new PlayerMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 2:
+ _globals->_events.setCursor(CURSOR_WALK);
+ scene->_stripManager.start(2030, this);
+ break;
+ case 3:
+ _globals->_player.enableControl();
+ setDelay(600);
+ break;
+ case 4: {
+ _globals->_player.disableControl();
+
+ scene->_hotspot2.postInit();
+ scene->_hotspot2.setVisage(2801);
+ scene->_hotspot2.setPosition(Common::Point(109, 145));
+ scene->_hotspot2.changeZoom(50);
+ scene->_hotspot2.animate(ANIM_MODE_1, NULL);
+ scene->_hotspot2.setObjectWrapper(new SceneObjectWrapper());
+
+ Common::Point pt(160, 145);
+ NpcMover *mover = new NpcMover();
+ scene->_hotspot2.addMover(mover, &pt, this);
+ break;
+ }
+ case 5:
+ scene->_stripManager.start(2032, this);
+ break;
+ case 6:
+ scene->_hotspot2.setVisage(93);
+ scene->_hotspot2.setStrip(3);
+ scene->_hotspot2.setFrame(1);
+ scene->_hotspot2.animate(ANIM_MODE_5, this);
+
+ scene->_soundHandler1.play(28);
+ scene->_soundHandler2.play(97);
+ break;
+ case 7:
+ scene->_hotspot7._strip = 2;
+ scene->_hotspot7._frame = 1;
+ scene->_hotspot7.animate(ANIM_MODE_5, this);
+ break;
+ case 8:
+ scene->_hotspot2.animate(ANIM_MODE_6, this);
+ break;
+ case 9:
+ scene->_stripManager.start(2035, this);
+ break;
+ case 10:
+ _globals->_sceneManager.changeScene(2310);
+ break;
+ }
+}
+
+void Scene2300::Action3::signal() {
+ // Stunned Miranda
+ Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ Common::Point pt(153, 135);
+ PlayerMover *mover = new PlayerMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 1:
+ _globals->_player.disableControl();
+ _globals->_player.setVisage(2672);
+ _globals->_player._strip = 2;
+ _globals->_player._frame = 1;
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ _globals->_player.setVisage(2674);
+ _globals->_player._strip = 2;
+ _globals->_player._frame = 1;
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ scene->_soundHandler1.play(97);
+ scene->_soundHandler2.play(28);
+
+ scene->_hotspot7._strip = 2;
+ scene->_hotspot7._frame = 1;
+ scene->_hotspot7.animate(ANIM_MODE_5, this);
+
+ _globals->_player.setVisage(2672);
+ _globals->_player._strip = 2;
+ _globals->_player._frame = _globals->_player.getFrameCount();
+ _globals->_player.animate(ANIM_MODE_6, NULL);
+ break;
+ case 4:
+ scene->_soundHandler2.play(97);
+ _globals->_player.setVisage(0);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setStrip(1);
+ scene->_stripManager.start(2034, this);
+ break;
+ case 5:
+ setDelay(10);
+ break;
+ case 6:
+ _globals->_sceneManager.changeScene(2310);
+ break;
+ }
+}
+
+void Scene2300::Action4::signal() {
+ // Ennemies coming
+ Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_hotspot8.animate(ANIM_MODE_5, this);
+ scene->_soundHandler1.play(11);
+ break;
+ case 1:
+ scene->_hotspot9.postInit();
+ scene->_hotspot9.setVisage(2301);
+ scene->_hotspot9.setStrip2(2);
+ scene->_hotspot9.setFrame(3);
+ scene->_hotspot9.setPosition(Common::Point(273, 199));
+ scene->_hotspot9.fixPriority(19);
+ scene->_hotspot9.animate(ANIM_MODE_5, this);
+ scene->_soundHandler1.play(11);
+ break;
+ case 2:
+ scene->_hotspot8.remove();
+
+ scene->_hotspot10.postInit();
+ scene->_hotspot10.setVisage(2301);
+ scene->_hotspot10.setStrip(3);
+ scene->_hotspot10.setFrame(4);
+ scene->_hotspot10.setPosition(Common::Point(292, 113));
+ scene->_hotspot10.animate(ANIM_MODE_5, this);
+ scene->_soundHandler1.play(11);
+ break;
+ case 3:
+ scene->_soundHandler1.play(13);
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene2300::Hotspot5::doAction(int action) {
+ // Ennemies
+ Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case OBJECT_STUNNER:
+ _globals->_player.disableControl();
+ _globals->_player.addMover(NULL);
+ scene->_action1.setActionIndex(9);
+ scene->_action1.setDelay(1);
+ break;
+ case CURSOR_LOOK:
+ SceneItem::display2(2300, 3);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(2300, 4);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2300::Hotspot7::doAction(int action) {
+ // Miranda
+ Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case OBJECT_STUNNER:
+ scene->setAction(&scene->_action3);
+ break;
+ case CURSOR_LOOK:
+ SceneItem::display2(2300, 2);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(2300, 21);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene2300::Scene2300() :
+ _hotspot11(0, CURSOR_LOOK, 2300, 6, CURSOR_USE, 2300, 14, LIST_END),
+ _hotspot12(0, CURSOR_LOOK, 2300, 5, CURSOR_USE, 2300, 13, LIST_END),
+ _hotspot13(0, CURSOR_LOOK, 2300, 9, CURSOR_USE, 2300, 20, LIST_END),
+ _hotspot14(0, CURSOR_LOOK, 2300, 7, CURSOR_USE, 2300, 15, LIST_END),
+ _hotspot15(0, CURSOR_LOOK, 2300, 1, LIST_END) {
+}
+
+void Scene2300::postInit(SceneObjectList *OwnerList) {
+ loadScene(2300);
+ Scene::postInit();
+ setZoomPercents(0, 100, 200, 100);
+
+ _stripManager.addSpeaker(&_speakerSL);
+ _stripManager.addSpeaker(&_speakerMText);
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerSText);
+
+ RING_INVENTORY._stunner._sceneNumber = 1;
+ RING_INVENTORY._infoDisk._sceneNumber = 1;
+
+ _hotspot8.postInit();
+ _hotspot8.setVisage(2301);
+ _hotspot8.setPosition(Common::Point(288, 74));
+
+ _globals->_soundHandler.play(96);
+ if (_globals->_sceneManager._previousScene == 2000) {
+ _hotspot8.remove();
+
+ _hotspot9.postInit();
+ _hotspot9.setVisage(2301);
+ _hotspot9.setStrip2(2);
+ _hotspot9._frame = _hotspot9.getFrameCount();
+ _hotspot9.setPosition(Common::Point(273, 199));
+ _hotspot9.fixPriority(1);
+
+ _hotspot10.postInit();
+ _hotspot10.setVisage(2301);
+ _hotspot10.setStrip(3);
+ _hotspot10._frame = _hotspot10.getFrameCount();
+ _hotspot10.setPosition(Common::Point(292, 113));
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(0);
+ _globals->_player.setPosition(Common::Point(109, 139));
+ _globals->_player.changeZoom(40);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.disableControl();
+
+ _hotspot7.postInit();
+ _hotspot7.setVisage(2302);
+ _hotspot7.animate(ANIM_MODE_2, NULL);
+ _hotspot7.setPosition(Common::Point(229, 125));
+ _hotspot7._numFrames = 5;
+
+ _soundHandler1.play(95);
+ _soundHandler2.play(96);
+ _globals->_sceneItems.push_back(&_hotspot7);
+
+ setAction(&_action2);
+ } else {
+ _hotspot8._numFrames = 3;
+
+ _hotspot3.postInit();
+ _hotspot3.setVisage(2331);
+ _hotspot3.setStrip(7);
+ _hotspot3.setPosition(Common::Point(231, 190));
+ _hotspot3.changeZoom(40);
+
+ _hotspot2.postInit();
+ _hotspot2.setVisage(2801);
+ _hotspot2.setPosition(Common::Point(269, 195));
+ _hotspot2.changeZoom(50);
+ _hotspot2.animate(ANIM_MODE_1, NULL);
+ _hotspot2.setObjectWrapper(new SceneObjectWrapper());
+
+ _hotspot1.postInit();
+ _hotspot1.setVisage(2331);
+ _hotspot1.setStrip(7);
+ _hotspot1.setPosition(Common::Point(255, 190));
+ _hotspot1.changeZoom(40);
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(0);
+ _globals->_player.setPosition(Common::Point(203, 191));
+ _globals->_player.changeZoom(40);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.disableControl();
+
+ _hotspot5.postInit();
+ _hotspot5.setVisage(91);
+ _hotspot5.setPosition(Common::Point(343, 145));
+ _hotspot5._moveDiff = Common::Point(35, 35);
+ _hotspot5.changeZoom(40);
+ _hotspot5.setObjectWrapper(new SceneObjectWrapper());
+
+ _hotspot6.postInit();
+ _hotspot6.setVisage(92);
+ _hotspot6.setPosition(Common::Point(343, 130));
+ _hotspot6._moveDiff = Common::Point(35, 35);
+ _hotspot6.changeZoom(40);
+ _hotspot6.setObjectWrapper(new SceneObjectWrapper());
+
+ _globals->_sceneItems.push_back(&_hotspot5);
+ setAction(&_action1);
+ }
+
+ _hotspot12._sceneRegionId = 8;
+ _hotspot11._sceneRegionId = 9;
+ _hotspot13._sceneRegionId = 10;
+ _hotspot14._sceneRegionId = 11;
+
+ _hotspot15.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+ _globals->_sceneItems.addItems(&_hotspot12, &_hotspot11, &_hotspot13, &_hotspot14, &_hotspot15, NULL);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2310 - Starcraft - Copy Protection Screen
+ *
+ *--------------------------------------------------------------------------*/
+
+Scene2310::Scene2310() {
+ _pageList[0].set(0, 0, 0, 0, 0, 0);
+ _pageList[1].set(1, 0, 3, 2, 1, 4);
+ _pageList[2].set(2, 1, 4, 3, 2, 0);
+ _pageList[3].set(3, 2, 0, 4, 3, 1);
+ _pageList[4].set(4, 3, 1, 0, 2, 4);
+ _pageList[5].set(5, 4, 2, 1, 3, 0);
+ _pageList[6].set(6, 0, 4, 2, 3, 1);
+ _pageList[7].set(7, 1, 0, 2, 4, 3);
+ _pageList[8].set(8, 2, 1, 3, 0, 4);
+ _pageList[9].set(9, 3, 2, 4, 1, 0);
+ _pageList[10].set(10, 4, 1, 2, 0, 3);
+ _pageList[11].set(11, 0, 2, 3, 4, 1);
+ _pageList[12].set(12, 1, 2, 0, 4, 3);
+ _pageList[13].set(13, 2, 4, 0, 3, 1);
+ _pageList[14].set(14, 3, 4, 1, 0, 2);
+ _pageList[15].set(15, 4, 3, 1, 2, 0);
+ _pageList[16].set(16, 0, 1, 4, 2, 3);
+ _pageList[17].set(17, 1, 3, 4, 0, 2);
+ _pageList[18].set(18, 2, 3, 0, 1, 4);
+ _pageList[19].set(19, 3, 0, 1, 4, 2);
+ _pageList[20].set(20, 4, 0, 3, 1, 2);
+
+ _rectList[0].set(135, 70, 151, 140);
+ _rectList[1].set(151, 70, 167, 140);
+ _rectList[2].set(167, 70, 183, 140);
+ _rectList[3].set(183, 70, 199, 140);
+ _rectList[4].set(199, 70, 215, 140);
+
+ _wireIndex = 5;
+}
+
+void Scene2310::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ loadScene(2301);
+ Common::Point pointList[5] = { Common::Point(142, 82), Common::Point(158, 82), Common::Point(174, 82),
+ Common::Point(190, 82), Common::Point(205, 82) };
+
+ for (int idx = 0; idx < 5; ++idx) {
+ _wireList[idx].postInit();
+ _wireList[idx].setVisage(2300);
+ _wireList[idx]._strip = idx + 1;
+ _wireList[idx]._frame = 1;
+ _wireList[idx].setPosition(pointList[idx]);
+ }
+
+ _globals->_player.disableControl();
+ _globals->_events.setCursor(CURSOR_WALK);
+
+ if (_vm->getFeatures() & GF_CD)
+ _pageIndex = _globals->_randomSource.getRandomNumber(14) + 2;
+ else
+ _pageIndex = _globals->_randomSource.getRandomNumber(19) + 1;
+ signal();
+}
+
+void Scene2310::signal() {
+ switch (_sceneMode++) {
+ case 0: {
+ Common::String fmtString = _resourceManager->getMessage(2300, 22);
+ Common::String msg = Common::String::format(fmtString.c_str(), _pageList[_pageIndex]._pageNumber);
+
+ _sceneText._width = 280;
+ _sceneText._textMode = ALIGN_CENTER;
+ _sceneText._color1 = 35;
+ _sceneText._fontNumber = 2;
+ _sceneText.setup(msg);
+ _sceneText.fixPriority(255);
+ _sceneText.setPosition(Common::Point(30, 20));
+ break;
+ }
+ case 1: {
+ Common::String msg = _resourceManager->getMessage(2300, 23);
+ _sceneText.setup(msg);
+ _sceneText.fixPriority(255);
+ _sceneText.setPosition(Common::Point(30, 170));
+
+ _globals->_sceneObjects->draw();
+ _globals->_events.waitForPress();
+
+ _sceneText.hide();
+ _globals->_sceneObjects->draw();
+
+ _globals->_sceneManager.changeScene(2200);
+ break;
+ }
+ }
+}
+
+void Scene2310::synchronize(Serializer &s) {
+ Scene::synchronize(s);
+
+ s.syncAsSint16LE(_wireIndex);
+ s.syncAsSint16LE(_pageIndex);
+}
+
+void Scene2310::process(Event &event) {
+ int frameNum = 0;
+
+ if (!event.handled && (event.eventType == EVENT_BUTTON_DOWN)) {
+ int idx = 0;
+ while (idx < 5) {
+ if (_rectList[idx].contains(event.mousePos))
+ break;
+ ++idx;
+ }
+
+ if (idx < 5) {
+ // In handled rectangle area
+ if (_wireIndex == 5) {
+ // No wire is currently active, so start moving designated wire
+ _wireIndex = idx;
+ frameNum = idx + 2;
+
+ if (event.mousePos.y > 105)
+ idx = findObject(idx);
+
+ if (idx != 5) {
+ _wireList[idx].hide();
+ _globals->_sceneObjects->draw();
+ _wireList[idx].setFrame(frameNum);
+
+ _wireList[idx].show();
+ _globals->_sceneObjects->draw();
+ }
+ } else {
+ // End the moving of the currently active wire
+ _wireList[_wireIndex].setFrame(idx + 2);
+ _wireIndex = 5;
+
+ // Check if solution has been reached
+ int idx2 = 0;
+ do {
+ int objIndex = findObject(idx2);
+ if (_pageList[_pageIndex]._connectionList[idx2] != objIndex)
+ // Mismatch
+ break;
+ } while (++idx2 < 5);
+
+ if (idx2 == 5)
+ // All the entries are correct
+ signal();
+ }
+
+ event.handled = true;
+ } else if (_wireIndex != 5) {
+ // Reset the active wire back to unplugged
+ _wireList[_wireIndex].setFrame(1);
+ _wireIndex = 5;
+ }
+ }
+}
+
+void Scene2310::dispatch() {
+ if (_wireIndex != 5) {
+ for (int idx = 0; idx < 5; ++idx) {
+ if (_rectList[idx].contains(_globals->_events._mousePos)) {
+ _wireList[_wireIndex].setFrame(idx + 2);
+ return;
+ }
+ }
+
+ _wireList[_wireIndex].setFrame(1);
+ }
+}
+
+int Scene2310::findObject(int objIndex) {
+ for (int idx = 0; idx < 5; ++idx) {
+ if (_wireList[idx]._frame == (objIndex + 2))
+ return idx;
+ }
+
+ return 5;
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2320 - Starcraft - Lander Bay
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene2320::Action1::signal() {
+ Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(10);
+ if (_globals->_sceneManager._previousScene == 2120)
+ _actionIndex = 3;
+ break;
+ case 1: {
+ Common::Point pt(513, 144);
+ NpcMover *mover = new NpcMover();
+ scene->_hotspot11.addMover(mover, &pt, this);
+ break;
+ }
+ case 2: {
+ Common::Point pt(510, 164);
+ NpcMover *mover = new NpcMover();
+ scene->_hotspot11.addMover(mover, &pt, this);
+ break;
+ }
+ case 3:
+ setAction(&scene->_sequenceManager2, this, 2328, &scene->_hotspot11, NULL);
+ break;
+ case 4:
+ scene->_hotspot11.animate(ANIM_MODE_NONE);
+ setDelay(120);
+ _actionIndex = 3;
+ break;
+ }
+}
+
+void Scene2320::Action2::signal() {
+ Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ scene->_soundHandler.play(253);
+ scene->_hotspot13.fixPriority(99);
+
+ Common::Point pt(scene->_hotspot13._position.x, 200);
+ NpcMover *mover = new NpcMover();
+ scene->_hotspot13.addMover(mover, &pt, this);
+ break;
+ }
+ case 1:
+ scene->_hotspot13.hide();
+ remove();
+ break;
+ }
+}
+
+void Scene2320::Action3::signal() {
+ Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ Common::Point pt(320, 86);
+ PlayerMover *mover = new PlayerMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 1:
+ scene->_soundHandler.play(162);
+ scene->_hotspot6.animate(ANIM_MODE_5, this);
+ break;
+ case 2: {
+ Common::Point pt(320, 79);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 3:
+ _globals->_player.fixPriority(scene->_hotspot6._priority - 1);
+ _globals->_player._strip = 3;
+ setDelay(10);
+ break;
+ case 4:
+ scene->_area1.display();
+ scene->_area2.display();
+ scene->_area3.display();
+ scene->_area4.display();
+
+ scene->_area3.draw(true);
+ _state = 0;
+ _globals->_events.setCursor(CURSOR_USE);
+
+ while (!_state && !_vm->shouldQuit()) {
+ // Wait for an event
+ Event event;
+ if (!_globals->_events.getEvent(event)) {
+ g_system->updateScreen();
+ g_system->delayMillis(10);
+ continue;
+ }
+
+ if (scene->_area1._bounds.contains(event.mousePos)) {
+ scene->_area1.draw(true);
+ scene->_area3.draw(false);
+ _state = scene->_area1._actionId;
+ }
+ if (scene->_area2._bounds.contains(event.mousePos)) {
+ scene->_area3.draw(false);
+ scene->_area2.draw(true);
+ _state = scene->_area2._actionId;
+ }
+ if (scene->_area3._bounds.contains(event.mousePos)) {
+ scene->_area3.draw(true);
+ _state = scene->_area3._actionId;
+ }
+ }
+
+ scene->_soundHandler.play(161);
+ scene->_area1.restore();
+ scene->_area2.restore();
+ scene->_area3.restore();
+ scene->_area4.restore();
+
+ if (_state == 2320) {
+ setDelay(10);
+ } else {
+ scene->_soundHandler.play(162);
+ scene->_hotspot6.animate(ANIM_MODE_6, this);
+ }
+ break;
+ case 5: {
+ if (_state == 2320)
+ _globals->_player.fixPriority(-1);
+ else
+ _globals->_sceneManager.changeScene(_state);
+
+ Common::Point pt(320, 86);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 6:
+ scene->_soundHandler.play(162);
+ scene->_hotspot6.animate(ANIM_MODE_6, this);
+ break;
+ case 7:
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene2320::Action4::signal() {
+ // Fly Cycle actions
+ Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(3);
+ break;
+ case 1: {
+ Common::Point pt(213, 84);
+ PlayerMover *mover = new PlayerMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 2:
+ case 16:
+ _globals->_player.setVisage(2109);
+ _globals->_player.setStrip(2);
+ _globals->_player.setFrame(1);
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ _globals->_player.animate(ANIM_MODE_6, NULL);
+ setAction(&scene->_action2, this);
+ break;
+ case 4: {
+ scene->_hotspot16.postInit();
+ scene->_hotspot16.setVisage(2331);
+ scene->_hotspot16.setStrip(3);
+ scene->_hotspot16.fixPriority(149);
+ scene->_hotspot16.setPosition(Common::Point(320, 202));
+ scene->_hotspot16.show();
+
+ Common::Point pt(320, 121);
+ NpcMover *mover = new NpcMover();
+ scene->_hotspot16.addMover(mover, &pt, this);
+ break;
+ }
+ case 5: {
+ scene->_hotspot16.fixPriority(200);
+ Common::Point pt(320, 180);
+ NpcMover *mover = new NpcMover();
+ scene->_hotspot16.addMover(mover, &pt, this);
+ break;
+ }
+ case 6: {
+ scene->_hotspot16.fixPriority(-1);
+ _globals->_player.setVisage(0);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+
+ Common::Point pt(233, 176);
+ PlayerMover *mover = new PlayerMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 7: {
+ Common::Point pt(291, 194);
+ PlayerMover *mover = new PlayerMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 8:
+ _globals->_player.setStrip(5);
+ _globals->_player.setFrame(1);
+ setDelay(13);
+ break;
+ case 9:
+ // Quinn sits in the flycycle
+ scene->_hotspot16.hide();
+ _globals->_player.setVisage(2323);
+ _globals->_player.setPosition(Common::Point(303, 176));
+ _globals->_player.setStrip(2);
+ _globals->_player.setFrame(1);
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 10:
+ if (_globals->getFlag(109)) {
+ _globals->_soundHandler.play(40);
+ _globals->_soundHandler.holdAt(true);
+
+ Common::Point pt(303, 240);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ } else {
+ setDelay(3);
+ }
+ break;
+ case 11:
+ if (_globals->getFlag(109)) {
+ _globals->_sceneManager.changeScene(7600);
+ } else {
+ SceneItem::display2(2320, 19);
+ setDelay(3);
+ }
+ break;
+ case 12:
+ _globals->_player.animate(ANIM_MODE_6, this);
+ break;
+ case 13:
+ _globals->_player.setVisage(0);
+ _globals->_player.setPosition(Common::Point(291, 194));
+ _globals->_player.setStrip(5);
+ _globals->_player.setFrame(1);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+
+ scene->_hotspot16.show();
+ setDelay(3);
+ break;
+ case 14: {
+ Common::Point pt(233, 176);
+ PlayerMover *mover = new PlayerMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 15: {
+ Common::Point pt(213, 85);
+ PlayerMover *mover = new PlayerMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 17: {
+ _globals->_player.animate(ANIM_MODE_6, NULL);
+ scene->_hotspot16.fixPriority(160);
+
+ Common::Point pt(320, 121);
+ NpcMover *mover = new NpcMover();
+ scene->_hotspot16.addMover(mover, &pt, this);
+ break;
+ }
+ case 18: {
+ scene->_hotspot16.fixPriority(149);
+ Common::Point pt(320, 202);
+ PlayerMover *mover = new PlayerMover();
+ scene->_hotspot16.addMover(mover, &pt, this);
+ break;
+ }
+ case 19: {
+ scene->_hotspot16.remove();
+ scene->_soundHandler.play(253);
+
+ scene->_hotspot13.show();
+ Common::Point pt(319, 157);
+ NpcMover *mover = new NpcMover();
+ scene->_hotspot13.addMover(mover, &pt, this);
+ break;
+ }
+ case 20:
+ _globals->_player.enableControl();
+ _globals->_player.setVisage(0);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+
+ scene->_hotspot13.fixPriority(1);
+ remove();
+ break;
+ }
+}
+
+void Scene2320::Action5::signal() {
+ Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ ADD_PLAYER_MOVER(163, 126);
+ break;
+ case 1:
+ ADD_PLAYER_MOVER(165, 132);
+ break;
+ case 2:
+ setDelay(2);
+ break;
+ case 3:
+ if (!_globals->getFlag(59))
+ setDelay(10);
+ else
+ scene->_stripManager.start(2323, this);
+ break;
+ case 4:
+ _globals->_player.setVisage(2347);
+ _globals->_player.setStrip(1);
+ _globals->_player.setFrame(1);
+ _globals->_player.fixPriority(137);
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 5:
+ _globals->_player.setStrip(2);
+ _globals->_player.setFrame(1);
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 6:
+ if (_globals->getFlag(72))
+ _globals->_sceneManager.changeScene(7000);
+ else if (_globals->getFlag(59))
+ _globals->_sceneManager.changeScene(5000);
+ else if (!_globals->getFlag(43) || (RING_INVENTORY._ale._sceneNumber != 1))
+ setDelay(10);
+ else {
+ scene->_hotspot11.setAction(NULL);
+ scene->_hotspot11.setVisage(2705);
+ scene->_hotspot11.animate(ANIM_MODE_1, NULL);
+ scene->_hotspot11.setObjectWrapper(new SceneObjectWrapper());
+
+ Common::Point pt(185, 135);
+ NpcMover *mover = new NpcMover();
+ scene->_hotspot11.addMover(mover, &pt, NULL);
+
+ _globals->clearFlag(43);
+ scene->_stripManager.start(2325, this);
+ }
+ break;
+ case 7:
+ setDelay(10);
+ break;
+ case 8:
+ _globals->_sceneManager.changeScene(4000);
+ break;
+ }
+}
+
+void Scene2320::Action6::signal() {
+ Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(30);
+ break;
+ case 1:
+ _globals->_player.animate(ANIM_MODE_6, this);
+ break;
+ case 2:
+ _globals->_player.setStrip(1);
+ _globals->_player.setFrame(1);
+ _globals->_player.animate(ANIM_MODE_6, this);
+ break;
+ case 3:
+ _globals->_player.setVisage(0);
+ _globals->_player.setStrip(3);
+ _globals->_player.fixPriority(-1);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+
+ setDelay(60);
+ break;
+ case 4:
+ if ((_globals->_sceneManager._previousScene != 4000) || _globals->getFlag(43))
+ setDelay(3);
+ else if (_globals->getFlag(35)) {
+ _globals->setFlag(43);
+ scene->_stripManager.start(4200, this);
+ _globals->setFlag(69);
+ } else if (_globals->getFlag(36)) {
+ setDelay(3);
+ } else {
+ _globals->setFlag(43);
+ scene->_stripManager.start(4210, this);
+ break;
+ }
+ break;
+ case 5:
+ if (_globals->_sceneObjects->contains(&scene->_hotspot11)) {
+ scene->_hotspot11.setAction(&scene->_action1);
+
+ if (_globals->_sceneObjects->contains(&scene->_hotspot10)) {
+ ADD_MOVER(scene->_hotspot10, 491, 160);
+ } else {
+ setDelay(60);
+ }
+
+ _globals->_sceneItems.push_front(&scene->_hotspot11);
+ } else {
+ setDelay(3);
+ }
+ break;
+ case 6:
+ _globals->_events.setCursor(CURSOR_WALK);
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene2320::Action7::signal() {
+ Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(30);
+ break;
+ case 1:
+ _globals->_soundHandler.play(162);
+ scene->_hotspot6.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ scene->_hotspot10.fixPriority(-1);
+ ADD_MOVER_NULL(scene->_hotspot10, 321, 94);
+ scene->_hotspot11.fixPriority(-1);
+ ADD_MOVER_NULL(scene->_hotspot11, 346, 85);
+
+ _globals->_player.fixPriority(-1);
+ ADD_MOVER(_globals->_player, 297, 89);
+ break;
+ case 3:
+ ADD_PLAYER_MOVER(462, 182);
+ break;
+ case 4:
+ ADD_MOVER(scene->_hotspot11, 391, 88);
+ break;
+ case 5:
+ ADD_MOVER(scene->_hotspot11, 500, 164);
+ ADD_MOVER(scene->_hotspot10, 382, 93);
+ _globals->_player.setStrip(3);
+ break;
+ case 6:
+ ADD_MOVER_NULL(scene->_hotspot10, 491, 160);
+ ADD_MOVER(_globals->_player, 391, 88);
+ break;
+ case 7:
+ ADD_PLAYER_MOVER(462, 182);
+ break;
+ case 8:
+ _globals->_player.setStrip(7);
+ setDelay(15);
+ break;
+ case 9:
+ scene->_stripManager.start(6020, this);
+ break;
+ case 10:
+ setDelay(6);
+ break;
+ case 11:
+ scene->_stripManager.start(6022, this);
+ break;
+ case 12:
+ _globals->_player.enableControl();
+ RING_INVENTORY._stasisBox._sceneNumber = 2320;
+ break;
+ }
+}
+
+void Scene2320::Action8::signal() {
+ Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(5);
+ break;
+ case 1:
+ ADD_PLAYER_MOVER(462, 182);
+ break;
+ case 2:
+ _globals->_player.setStrip(7);
+ setDelay(5);
+ break;
+ case 3:
+ scene->_speakerGameText.setTextPos(Common::Point(_globals->_sceneManager._scene->_sceneBounds.left + 30, 10));
+ scene->_stripManager.start(_globals->getFlag(75) ? 6030 : 2320, this);
+ break;
+ case 4:
+ if (_globals->getFlag(75))
+ setDelay(3);
+ else
+ _globals->_player.enableControl();
+ break;
+ case 5:
+ RING_INVENTORY._stasisBox._sceneNumber = 2320;
+ scene->_sceneMode = 2326;
+ scene->_speakerGameText.setTextPos(Common::Point(_globals->_sceneManager._scene->_sceneBounds.left + 30, 10));
+ scene->setAction(&scene->_sequenceManager1, scene, 2326, &_globals->_player, &scene->_hotspot11, NULL);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene2320::Hotspot5::doAction(int action) {
+ Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2320, 13);
+ break;
+ case CURSOR_USE:
+ if (_globals->getFlag(70))
+ SceneItem::display2(2320, 33);
+ else if (_globals->getFlag(13))
+ SceneItem::display2(2320, 18);
+ else
+ scene->setAction(&scene->_action5);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2320::Hotspot6::doAction(int action) {
+ Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2320, 2);
+ break;
+ case CURSOR_USE:
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_action3);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2320::Hotspot8::doAction(int action) {
+ Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2320, 23);
+ break;
+ case CURSOR_USE:
+ scene->_sceneMode = 2336;
+ scene->setAction(&scene->_sequenceManager1, scene, 2336, &_globals->_player, this, NULL);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2320::Hotspot10::doAction(int action) {
+ // Seeker
+ Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2320, 26);
+ break;
+ case CURSOR_TALK:
+ _globals->_player.disableControl();
+ scene->_sceneMode = 2329;
+
+ if (_globals->getFlag(13)) {
+ scene->_stripManager.start(2337, scene);
+ } else if (_globals->getFlag(70)) {
+ scene->setAction(&scene->_action8);
+ } else if (_globals->getFlag(109)) {
+ scene->setAction(&scene->_sequenceManager1, scene, 2337, NULL);
+ } else if (!_state) {
+ ++_state;
+ scene->setAction(&scene->_sequenceManager1, scene, 2334, NULL);
+ } else {
+ scene->setAction(&scene->_sequenceManager1, scene, 2335, NULL);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2320::Hotspot11::doAction(int action) {
+ Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2320, 25);
+ break;
+ case CURSOR_TALK:
+ _globals->_player.disableControl();
+ scene->_sceneMode = 2329;
+
+ if (_globals->getFlag(13)) {
+ _globals->_player.disableControl();
+ scene->_sceneMode = 5000;
+ scene->_stripManager.start(2336, scene);
+ } else if (_globals->getFlag(70)) {
+ scene->setAction(&scene->_action8);
+ } else {
+ scene->_sceneMode = 2329;
+
+ if (RING_INVENTORY._ale._sceneNumber == 1) {
+ scene->setAction(&scene->_sequenceManager1, scene, 2329, NULL);
+ } else if (!_globals->getFlag(110)) {
+ _globals->setFlag(110);
+ scene->setAction(&scene->_sequenceManager1, scene, 2330, NULL);
+ } else if (RING_INVENTORY._peg._sceneNumber != 1) {
+ scene->setAction(&scene->_sequenceManager1, scene, 2331, NULL);
+ } else if (!_state) {
+ ++_state;
+ scene->setAction(&scene->_sequenceManager1, scene, 2332, NULL);
+ } else {
+ scene->setAction(&scene->_sequenceManager1, scene, 2333, NULL);
+ }
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2320::Hotspot12::doAction(int action) {
+ Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2320, 5);
+ break;
+ case CURSOR_USE:
+ if (_globals->getFlag(13))
+ SceneItem::display2(2320, 24);
+ else {
+ _globals->_player.disableControl();
+ scene->_sceneMode = 2322;
+ scene->setAction(&scene->_sequenceManager1, scene, 2322, &_globals->_player, NULL);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2320::Hotspot14::doAction(int action) {
+ // Right Console
+ Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2320, 17);
+ break;
+ case CURSOR_USE:
+ if (_globals->getFlag(24)) {
+ _globals->clearFlag(24);
+ _globals->_player.disableControl();
+
+ scene->_hotspot8.postInit();
+ scene->_hotspot8.setVisage(2345);
+ scene->_hotspot8.setPosition(Common::Point(634, 65));
+ scene->_hotspot8.hide();
+
+ _globals->_sceneItems.push_front(&scene->_hotspot8);
+ RING_INVENTORY._waldos._sceneNumber = 2320;
+
+ scene->_hotspot9.postInit();
+ scene->_hotspot9.setVisage(2345);
+ scene->_hotspot9._strip = 6;
+ scene->_hotspot9.setPosition(Common::Point(536, 103));
+ scene->_hotspot9.fixPriority(200);
+ scene->_hotspot9.hide();
+
+ scene->_hotspot16.postInit();
+ scene->_hotspot16.setVisage(2345);
+ scene->_hotspot16.setStrip(8);
+ scene->_hotspot16.setPosition(Common::Point(536, 103));
+ scene->_hotspot16.hide();
+
+ scene->_sceneMode = 2324;
+ scene->setAction(&scene->_sequenceManager1, scene, 2324, &_globals->_player, &scene->_hotspot7,
+ &scene->_hotspot8, &scene->_hotspot9, &scene->_hotspot16, NULL);
+ } else if (_globals->getFlag(13)) {
+ SceneItem::display2(2320, 24);
+ } else if (!_globals->getFlag(76)) {
+ SceneItem::display2(2320, 28);
+ } else if (!RING_INVENTORY._waldos._sceneNumber) {
+ SceneItem::display2(2320, 27);
+ } else {
+ SceneItem::display2(2320, 29);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene2320::Hotspot15::doAction(int action) {
+ // Left console (Flycycle console)
+ Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(2320, 16);
+ break;
+ case CURSOR_USE:
+ if (_globals->getFlag(13))
+ SceneItem::display2(2320, 24);
+ else
+ scene->setAction(&scene->_action4);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+
+/*--------------------------------------------------------------------------*/
+
+Scene2320::Scene2320() :
+ _hotspot1(0, CURSOR_LOOK, 2320, 0, LIST_END),
+ _hotspot2(0, CURSOR_LOOK, 2320, 1, LIST_END),
+ _hotspot3(0, CURSOR_LOOK, 2320, 11, LIST_END),
+ _hotspot4(0, CURSOR_LOOK, 2320, 14, LIST_END),
+ _hotspot13(0, CURSOR_LOOK, 2320, 12, LIST_END)
+{
+ _area1.setup(2153, 2, 1, 2100);
+ _area1._pt = Common::Point(200, 31);
+ _area2.setup(2153, 3, 1, 2150);
+ _area2._pt = Common::Point(200, 50);
+ _area3.setup(2153, 4, 1, 2320);
+ _area3._pt = Common::Point(200, 75);
+ _area4.setup(2153, 1, 1, 10);
+ _area4._pt = Common::Point(237, 77);
+}
+
+void Scene2320::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ setZoomPercents(60, 75, 100, 100);
+
+ _stripManager.addSpeaker(&_speakerMR);
+ _stripManager.addSpeaker(&_speakerML);
+ _stripManager.addSpeaker(&_speakerMText);
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerQL);
+ _stripManager.addSpeaker(&_speakerQR);
+ _stripManager.addSpeaker(&_speakerSR);
+ _stripManager.addSpeaker(&_speakerSL);
+ _stripManager.addSpeaker(&_speakerSAL);
+ _stripManager.addSpeaker(&_speakerSText);
+ _stripManager.addSpeaker(&_speakerGameText);
+
+ _speakerMText._npc = &_hotspot11;
+ _speakerQText._npc = &_globals->_player;
+ _hotspotPtr = &_hotspot10;
+
+ _hotspot6.postInit();
+ _hotspot6.setVisage(2321);
+ _hotspot6.setPosition(Common::Point(320, 67));
+
+ _hotspot7.postInit();
+ _hotspot7.setVisage(2344);
+ _hotspot7.setPosition(Common::Point(604, 92));
+
+ _hotspot13.postInit();
+ _hotspot13.setVisage(2323);
+ _hotspot13.setPosition(Common::Point(319, 157));
+ _hotspot13.fixPriority(1);
+
+ _hotspot12.postInit();
+ _hotspot12.setVisage(2321);
+ _hotspot12._strip = 4;
+ _hotspot12.animate(ANIM_MODE_8, 0, NULL);
+ _hotspot12.setPosition(Common::Point(412, 46));
+
+ if (RING_INVENTORY._waldos._sceneNumber == 2320) {
+ _hotspot8.postInit();
+ _hotspot8.setVisage(2345);
+ _hotspot8.setStrip(5);
+ _hotspot8.setFrame(8);
+ _hotspot8.setPosition(Common::Point(541, 103));
+ _hotspot8.fixPriority(201);
+
+ _globals->_sceneItems.push_back(&_hotspot8);
+ }
+
+ if (_globals->getFlag(43)) {
+ _hotspot11.postInit();
+ _hotspot11.setVisage(2705);
+ _hotspot11._strip = 3;
+ _hotspot11.setPosition(Common::Point(510, 156));
+ _globals->_sceneItems.push_back(&_hotspot11);
+ _hotspot11._state = 0;
+ _hotspot11.setAction(&_action1);
+ }
+
+ _globals->_player.postInit();
+ if (_globals->getFlag(13))
+ _globals->_player.setVisage(2170);
+ else
+ _globals->_player.setVisage(0);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.setPosition(Common::Point(320, 79));
+ _globals->_player.fixPriority(10);
+ _globals->_player.changeZoom(-1);
+ _globals->_player._moveDiff.y = 3;
+ _globals->_player.disableControl();
+
+ if (_globals->getFlag(114)) {
+ _hotspot10.postInit();
+ _hotspot10.setVisage(2806);
+ _hotspot10.setPosition(Common::Point(481, 162));
+ _hotspot10.changeZoom(-1);
+ _hotspot10.setStrip(5);
+ _hotspot10._state = 0;
+
+ _globals->_sceneItems.push_back(&_hotspot10);
+ }
+
+ if (_globals->getFlag(70)) {
+ _hotspot11.postInit();
+ _hotspot11.setVisage(2705);
+ _hotspot11.setPosition(Common::Point(500, 164));
+
+ _hotspot10.postInit();
+ _hotspot10.setVisage(2806);
+ _hotspot10.setPosition(Common::Point(481, 162));
+ _hotspot10.changeZoom(-1);
+ _hotspot10.setStrip(5);
+
+ _globals->_sceneItems.addItems(&_hotspot11, &_hotspot10, NULL);
+ }
+
+ switch (_globals->_sceneManager._previousScene) {
+ case 2120:
+ _globals->_soundHandler.play(160);
+ _globals->_soundHandler.holdAt(true);
+
+ _globals->_player.fixPriority(-1);
+ _globals->_player.setPosition(Common::Point(389, 72));
+ _globals->_player.enableControl();
+ break;
+ case 4000:
+ if (!_globals->getFlag(36) && !_globals->getFlag(43)) {
+ _hotspot11.postInit();
+ _hotspot11.setVisage(2705);
+ _hotspot11.setPosition(Common::Point(178, 118));
+ _hotspot11.animate(ANIM_MODE_1, NULL);
+ }
+ // Deliberate fall-through
+ case 4250:
+ case 5000:
+ case 7000:
+ _globals->_soundHandler.play(160);
+ _globals->_soundHandler.holdAt(true);
+ if ((_globals->_sceneManager._previousScene == 7000) && !_globals->getFlag(80))
+ _globals->setFlag(36);
+
+ _globals->_player.disableControl();
+ _globals->_player.animate(ANIM_MODE_NONE, NULL);
+ _globals->_player.setObjectWrapper(NULL);
+ _globals->_player.setVisage(2347);
+ _globals->_player.setStrip(2);
+ _globals->_player.setFrame(5);
+ _globals->_player.fixPriority(137);
+ _globals->_player.setPosition(Common::Point(165, 132));
+
+ setAction(&_action6);
+ break;
+ case 6100:
+ _globals->_soundHandler.play(160);
+ _globals->_soundHandler.holdAt(true);
+
+ _hotspot8.postInit();
+ _hotspot8.setVisage(2345);
+ _hotspot8.setPosition(Common::Point(634, 65));
+ _hotspot8.hide();
+
+ _sceneMode = 2325;
+ setAction(&_sequenceManager1, this, 2325, &_globals->_player, &_hotspot6, &_hotspot8, &_hotspot7, NULL);
+ break;
+ case 7600:
+ _globals->_soundHandler.play(160);
+ _globals->_soundHandler.holdAt(true);
+ _soundHandler.play(21);
+
+ _globals->_player.setVisage(2323);
+ _globals->_player.setStrip(2);
+ _globals->_player.setFrame(_globals->_player.getFrameCount());
+ _globals->_player.setPosition(Common::Point(303, 176));
+ _globals->_player.fixPriority(-1);
+ _globals->_player.disableControl();
+
+ _hotspot13.setPosition(Common::Point(319, 199));
+
+ _hotspot16.postInit();
+ _hotspot16.setVisage(2331);
+ _hotspot16._strip = 3;
+ _hotspot16.fixPriority(160);
+ _hotspot16.setPosition(Common::Point(320, 202));
+ _hotspot16.hide();
+
+ _sceneMode = 2338;
+ setAction(&_sequenceManager1, this, 2338, &_globals->_player, &_hotspot16, &_hotspot13, NULL);
+ break;
+ default:
+ switch (_globals->_stripNum) {
+ case 2101:
+ _globals->_player.disableControl();
+ _globals->_player.setStrip(3);
+ _globals->_player.setPosition(Common::Point(307, 84));
+
+ _hotspot11.postInit();
+ _hotspot11.setVisage(2705);
+ _hotspot11._strip = 2;
+ _hotspot11.fixPriority(10);
+ _hotspot11.setPosition(Common::Point(322, 80));
+ _hotspot11.setObjectWrapper(new SceneObjectWrapper());
+ _hotspot11.animate(ANIM_MODE_1, NULL);
+
+ _hotspot10.postInit();
+ _hotspot10.setVisage(2806);
+ _hotspot10.setObjectWrapper(new SceneObjectWrapper());
+ _hotspot10.changeZoom(-1);
+ _hotspot10.fixPriority(10);
+ _hotspot10.setPosition(Common::Point(318, 89));
+ _hotspot10._strip = 3;
+ _hotspot10.animate(ANIM_MODE_1, NULL);
+
+ setAction(&_action7);
+ break;
+ case 6100:
+ _hotspot8.postInit();
+ _hotspot8.setVisage(2345);
+ _hotspot8.setPosition(Common::Point(634, 65));
+ _hotspot8.hide();
+
+ _sceneMode = 2325;
+ setAction(&_sequenceManager1, this, 2325, &_globals->_player, &_hotspot6, &_hotspot8, &_hotspot7, NULL);
+ break;
+ default:
+ _globals->_soundHandler.play(160);
+ _globals->_soundHandler.holdAt(true);
+ _sceneMode = 2321;
+
+ _globals->_player.setStrip(3);
+ setAction(&_sequenceManager1, this, 2321, &_globals->_player, &_hotspot6, NULL);
+ break;
+ }
+ }
+
+ _globals->_stripNum = 0;
+ _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position);
+ loadScene(2320);
+
+ _hotspot14._sceneRegionId = 8;
+ _hotspot1.setBounds(Rect(0, 0, 640, 200));
+ _hotspot2.setBounds(Rect(278, 0, 362, 61));
+ _hotspot3.setBounds(Rect(282, 62, 367, 98));
+ _hotspot4.setBounds(Rect(67, 38, 112, 113));
+ _hotspot5.setBounds(Rect(104, 122, 174, 157));
+ _hotspot15.setBounds(Rect(191, 53, 205, 63));
+
+ _globals->_sceneItems.addItems(&_hotspot14, &_hotspot15, &_hotspot5, &_hotspot6, &_hotspot12,
+ &_hotspot13, &_hotspot4, &_hotspot3, &_hotspot2, &_hotspot1, NULL);
+}
+
+void Scene2320::synchronize(Serializer &s) {
+ Scene::synchronize(s);
+ SYNC_POINTER(_hotspotPtr);
+}
+
+void Scene2320::signal() {
+ switch (_sceneMode) {
+ case 2321:
+ case 2327:
+ case 2329:
+ if (_globals->getFlag(43) && !_hotspot11._action)
+ _hotspot11.setAction(&_action1);
+ _globals->_player.enableControl();
+ break;
+ case 2322:
+ _globals->_sceneManager.changeScene(2120);
+ break;
+ case 2323:
+ _globals->_player.disableControl();
+ break;
+ case 2338:
+ case 2324:
+ _hotspot16.remove();
+ _globals->_player.enableControl();
+ break;
+ case 2325:
+ _globals->setFlag(76);
+ _globals->clearFlag(70);
+ _globals->_stripNum = 6100;
+ _globals->_sceneManager.changeScene(2100);
+ break;
+ case 2326:
+ _globals->clearFlag(70);
+ RING_INVENTORY._nullifier._sceneNumber = 1;
+ _globals->_stripNum = 2321;
+ _globals->_sceneManager.changeScene(2100);
+ break;
+ case 2336:
+ _globals->setFlag(77);
+ RING_INVENTORY._waldos._sceneNumber = 1;
+ _hotspot8.remove();
+ break;
+ case 5000:
+ _globals->_player.enableControl();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 2400 - Descending in Lander
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene2400::Action1::signal() {
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(60);
+ break;
+ case 1:
+ ADD_MOVER(_globals->_player, 160, 71);
+ break;
+ case 2:
+ ADD_MOVER(_globals->_player, 160, 360);
+ break;
+ case 3:
+ _globals->_player._moveDiff = Common::Point(1, 1);
+ ADD_MOVER(_globals->_player, 140, 375);
+ break;
+ case 4:
+ ADD_MOVER(_globals->_player, 87, 338);
+ break;
+ case 5:
+ _globals->_player.hide();
+ setDelay(60);
+ break;
+ case 6:
+ _globals->_sceneManager.changeScene(4000);
+ break;
+ }
+}
+
+void Scene2400::Action1::dispatch() {
+ Action::dispatch();
+ if ((_actionIndex == 4) && (_globals->_player._percent > 5))
+ _globals->_player.changeZoom(_globals->_player._percent - 2);
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene2400::postInit(SceneObjectList *OwnerList) {
+ loadScene(2400);
+ Scene::postInit();
+ setZoomPercents(0, 100, 200, 100);
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(2410);
+ _globals->_player.setPosition(Common::Point(340, -10));
+ _globals->_player.animate(ANIM_MODE_2, NULL);
+ _globals->_player.disableControl();
+
+ setAction(&_action1);
+
+ _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y);
+ _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
+ _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+
+ _globals->_soundHandler.play(153);
+}
+
+} // End of namespace tSage
diff --git a/engines/tsage/ringworld/ringworld_scenes3.h b/engines/tsage/ringworld/ringworld_scenes3.h
new file mode 100644
index 0000000000..4f8f559091
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_scenes3.h
@@ -0,0 +1,895 @@
+/* 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_RINGWORLD_SCENES3_H
+#define TSAGE_RINGWORLD_SCENES3_H
+
+#include "common/scummsys.h"
+#include "tsage/core.h"
+#include "tsage/converse.h"
+#include "tsage/ringworld/ringworld_logic.h"
+
+namespace tSage {
+
+class Scene2000 : public Scene {
+ /* 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();
+ };
+ class Action5 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action6 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action7 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action8 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action9 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action10 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action11 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action12 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action13 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action14 : public Action {
+ public:
+ virtual void signal();
+ };
+
+public:
+ SpeakerSL _speakerSL;
+ SpeakerQR _speakerQR;
+ SpeakerMR _speakerMR;
+ SpeakerQText _speakerQText;
+ SpeakerMText _speakerMText;
+ SpeakerSText _speakerSText;
+ SpeakerHText _speakerHText;
+ SpeakerGameText _speakerGameText;
+ 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;
+ Action14 _action14;
+ SceneObject _object1, _object2, _object3, _object4, _object5;
+ SceneObject _object6, _object7, _object8, _object9, _object10;
+ ASound _soundHandler1, _soundHandler2;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void stripCallback(int v);
+};
+
+class Scene2100 : public Scene {
+ /* Actions */
+ class Action1 : public ActionExt {
+ 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();
+ };
+ class Action5 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action6 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action7 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action8 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action9 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action10 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action11 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action12 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action13 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action14 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action15 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action16 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action17 : public Action {
+ public:
+ virtual void signal();
+ };
+
+ /* Hotspots */
+ class Hotspot2 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot3 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot4 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot8 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot10 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot14 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+
+ /* Objects */
+ class Object1 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Object2 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Object3 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ SequenceManager _sequenceManager;
+ ASound _soundHandler;
+ SpeakerMText _speakerMText;
+ SpeakerMR _speakerMR;
+ SpeakerQL _speakerQL;
+ SpeakerQR _speakerQR;
+ SpeakerQText _speakerQText;
+ SpeakerGameText _speakerGameText;
+ SpeakerSText _speakerSText;
+ SpeakerSL _speakerSL;
+ SpeakerSAL _speakerSAL;
+ SpeakerHText _speakerHText;
+
+ DisplayHotspot _hotspot1;
+ Hotspot2 _hotspot2;
+ Hotspot3 _hotspot3;
+ Hotspot4 _hotspot4;
+ DisplayHotspot _hotspot5, _hotspot6, _hotspot7;
+ Hotspot8 _hotspot8;
+ DisplayHotspot _hotspot9;
+ Hotspot10 _hotspot10;
+ DisplayHotspot _hotspot11, _hotspot12, _hotspot13;
+ Hotspot14 _hotspot14;
+ DisplayHotspot _hotspot15;
+
+ Object1 _object1;
+ Object2 _object2;
+ Object3 _object3;
+ SceneObject _object4;
+
+ 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;
+ Action14 _action14;
+ Action15 _action15;
+ Action16 _action16;
+ Action17 _action17;
+ int _sitFl;
+ SceneArea _area1, _area2, _area3, _area4;
+
+ Scene2100();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void stripCallback(int v);
+ virtual void signal();
+ virtual void synchronize(Serializer &s);
+};
+
+class Scene2120 : public Scene {
+ /* Actions */
+ class Entry {
+ public:
+ int _size;
+ int _lineNum;
+ int _visage;
+
+ Entry() { _size = 0; _lineNum = 0; _visage = 0; }
+ Entry(int size, int lineNum, int visage) { _size = size; _lineNum = lineNum; _visage = visage; }
+ };
+
+ class Action1 : public Action {
+ private:
+ Common::Array<Entry> _entries;
+ public:
+ Action1();
+
+ virtual void signal();
+ virtual void dispatch();
+ };
+
+public:
+ ASound _soundHandler;
+ SceneObject _topicArrowHotspot, _arrowHotspot, _visageHotspot;
+ SceneObject _subjectButton, _nextPageButton, _previousPageButton, _exitButton;
+ Action1 _action1;
+ Rect _listRect;
+ int _dbMode, _prevDbMode;
+ bool _visageVisable;
+ int _subjectIndex;
+ int _lineOffset;
+
+ Scene2120();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void synchronize(Serializer &s);
+};
+
+class Scene2150 : public Scene {
+ /* Actions */
+ class Action1 : public ActionExt {
+ public:
+ virtual void signal();
+ };
+ class Action2 : public Action {
+ public:
+ virtual void signal();
+ };
+
+ /* Hotspots */
+ class Hotspot1 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot2 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot4 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot7 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot10 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ ASound _soundHandler;
+ SequenceManager _sequenceManager;
+ SpeakerGameText _speakerGameText;
+
+ Rect _rect1, _rect2;
+ Hotspot1 _hotspot1;
+ Hotspot2 _hotspot2;
+ DisplayHotspot _hotspot3;
+ Hotspot4 _hotspot4;
+ DisplayHotspot _hotspot5, _hotspot6;
+ Hotspot7 _hotspot7;
+ DisplayHotspot _hotspot8, _hotspot9;
+ Hotspot10 _hotspot10;
+ DisplayHotspot _hotspot11;
+ SceneObject _hotspot12, _hotspot13, _hotspot14;
+ SceneArea _area1, _area2, _area3, _area4;
+ Action1 _action1;
+ Action2 _action2;
+
+ Scene2150();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void synchronize(Serializer &s);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene2200 : public Scene {
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action3 : public ActionExt {
+ public:
+ virtual void signal();
+ virtual void process(Event &event);
+ };
+ class Action4 : public Action {
+ public:
+ virtual void signal();
+ };
+
+ /* Hotspots */
+ class Hotspot3 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot5 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot9 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ SequenceManager _sequenceManager;
+ SpeakerMText _speakerMText;
+ SpeakerSText _speakerSText;
+ SpeakerQText _speakerQText;
+ SpeakerSL _speakerSL;
+ SpeakerQR _speakerQR;
+ SpeakerQL _speakerQL;
+ SpeakerMR _speakerMR;
+ SpeakerGameText _speakerGameText;
+ Rect _exitRect;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ DisplayHotspot _hotspot1;
+ Hotspot3 _hotspot3;
+ Hotspot5 _hotspot5;
+ Hotspot9 _hotspot9;
+ DisplayHotspot _hotspot10;
+ SceneObject _hotspot2, _hotspot4;
+ SceneObject _hotspot6, _hotspot7, _hotspot8;
+ ASound _soundHandler1, _soundHandler2;
+
+ Scene2200();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void stripCallback(int v);
+ virtual void synchronize(Serializer &s);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene2222 : public Scene {
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2 : public Action {
+ public:
+ virtual void signal();
+ };
+
+public:
+ ASound _soundHandler;
+ SpeakerSText _speakerSText;
+ SpeakerMText _speakerMText;
+ SpeakerQText _speakerQText;
+ SpeakerML _speakerML;
+ SpeakerSR _speakerSR;
+ Action1 _action1;
+ Action2 _action2;
+ SceneObject _hotspot1, _hotspot2, _hotspot3, _hotspot4, _hotspot5;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+};
+
+class Scene2230 : public Scene {
+ /* 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();
+ };
+ class Action5 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action6 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action7 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action8 : public Action {
+ public:
+ virtual void signal();
+ };
+
+ /* Hotspots */
+ class Hotspot1 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot3 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot4 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot5 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot6 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot7 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot8 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot10 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot11 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot12 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ ASound _soundHandler;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ Action5 _action5;
+ Action6 _action6;
+ Action7 _action7;
+ Action8 _action8;
+ Hotspot1 _hotspot1;
+ Hotspot3 _hotspot3;
+ Hotspot4 _hotspot4;
+ SceneObject _hotspot2;
+ Hotspot5 _hotspot5;
+ Hotspot6 _hotspot6;
+ Hotspot7 _hotspot7;
+ Hotspot8 _hotspot8;
+ DisplayHotspot _hotspot9;
+ Hotspot10 _hotspot10;
+ Hotspot11 _hotspot11;
+ Hotspot12 _hotspot12;
+ Rect _rect1;
+ int _field30A;
+
+ Scene2230();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void synchronize(Serializer &s);
+ virtual void dispatch();
+};
+
+class Scene2280 : public Scene {
+ /* 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 ActionExt {
+ public:
+ virtual void signal();
+ };
+
+ /* Hotspots */
+ class Hotspot1 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot2 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot4 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot7 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot8 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot10 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot12 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot14 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot15 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot16 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot17 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot18 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+
+public:
+ ASound _soundHandler;
+ SequenceManager _sequenceManager;
+ Rect _exitRect;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ Hotspot1 _hotspot1;
+ Hotspot2 _hotspot2;
+ DisplayHotspot _hotspot3;
+ Hotspot4 _hotspot4;
+ DisplayHotspot _hotspot5, _hotspot6;
+ Hotspot7 _hotspot7;
+ Hotspot8 _hotspot8;
+ DisplayHotspot _hotspot9;
+ Hotspot10 _hotspot10;
+ DisplayHotspot _hotspot11;
+ Hotspot12 _hotspot12;
+ DisplayHotspot _hotspot13;
+ Hotspot14 _hotspot14;
+ DisplayHotspot _hotspot15, _hotspot16;
+ Hotspot17 _hotspot17;
+ Hotspot18 _hotspot18;
+
+ Scene2280();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void synchronize(Serializer &s);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene2300 : public Scene {
+ /* 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 ActionExt {
+ public:
+ virtual void signal();
+ };
+
+ /* Hotspots */
+ class Hotspot5 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot7 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ ASound _soundHandler1, _soundHandler2;
+ SpeakerSL _speakerSL;
+ SpeakerMText _speakerMText;
+ SpeakerQText _speakerQText;
+ SpeakerSText _speakerSText;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ SceneObject _hotspot1, _hotspot2, _hotspot3, _hotspot4;
+ Hotspot5 _hotspot5;
+ SceneObject _hotspot6;
+ Hotspot7 _hotspot7;
+ SceneObject _hotspot8, _hotspot9, _hotspot10;
+ DisplayHotspot _hotspot11, _hotspot12, _hotspot13, _hotspot14, _hotspot15;
+
+ Scene2300();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+};
+
+class Scene2310 : public Scene {
+private:
+ int findObject(int objIndex);
+
+ /* Custom classes */
+ class ProtectionEntry {
+ public:
+ int _pageNumber;
+ int _connectionList[5];
+
+ void set(int pageNumber, int v1, int v2, int v3, int v4, int v5) {
+ _pageNumber = pageNumber;
+ _connectionList[0] = v1; _connectionList[1] = v2; _connectionList[2] = v3;
+ _connectionList[3] = v4; _connectionList[4] = v5;
+ }
+ };
+
+public:
+ SequenceManager _sequenceManager;
+ int _wireIndex, _pageIndex;
+ SceneObject _wireList[5];
+ Rect _rectList[5];
+ SceneText _sceneText;
+ ProtectionEntry _pageList[21];
+
+ Scene2310();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void synchronize(Serializer &s);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+};
+
+class Scene2320 : public Scene {
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action3 : public ActionExt {
+ public:
+ virtual void signal();
+ };
+ class Action4 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action5 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action6 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action7 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action8 : public Action {
+ public:
+ virtual void signal();
+ };
+
+ /* Hotspots */
+ class Hotspot5 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot6 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot8 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot10 : public SceneObjectExt {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot11 : public SceneObjectExt {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot12 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot14 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot15 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ ASound _soundHandler;
+ SequenceManager _sequenceManager1, _sequenceManager2;
+ SpeakerMText _speakerMText;
+ SpeakerMR _speakerMR;
+ SpeakerML _speakerML;
+ SpeakerQText _speakerQText;
+ SpeakerQL _speakerQL;
+ SpeakerQR _speakerQR;
+ SpeakerSAL _speakerSAL;
+ SpeakerSL _speakerSL;
+ SpeakerSR _speakerSR;
+ SpeakerSText _speakerSText;
+ SpeakerGameText _speakerGameText;
+ SceneArea _area1, _area2, _area3, _area4;
+ DisplayHotspot _hotspot1, _hotspot2, _hotspot3, _hotspot4;
+ Hotspot5 _hotspot5;
+ Hotspot6 _hotspot6;
+ SceneObject _hotspot7, _hotspot9;
+ Hotspot8 _hotspot8;
+ Hotspot10 _hotspot10;
+ Hotspot11 _hotspot11;
+ Hotspot12 _hotspot12;
+ DisplayHotspot _hotspot13;
+ Hotspot14 _hotspot14;
+ Hotspot15 _hotspot15;
+ SceneObject _hotspot16;
+ SceneItem *_hotspotPtr;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ Action5 _action5;
+ Action6 _action6;
+ Action7 _action7;
+ Action8 _action8;
+
+ Scene2320();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void synchronize(Serializer &s);
+ virtual void signal();
+};
+
+class Scene2400 : public Scene {
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ virtual void dispatch();
+ };
+public:
+ Action1 _action1;
+ SceneObject _object;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+};
+
+} // End of namespace tSage
+
+#endif
diff --git a/engines/tsage/ringworld/ringworld_scenes4.cpp b/engines/tsage/ringworld/ringworld_scenes4.cpp
new file mode 100644
index 0000000000..83dd559a6d
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_scenes4.cpp
@@ -0,0 +1,250 @@
+/* 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 "common/config-manager.h"
+#include "tsage/ringworld/ringworld_scenes4.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+
+namespace tSage {
+
+/*--------------------------------------------------------------------------
+ * Scene 3500 - Ringworld Scan
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene3500::Action1::signal() {
+ Scene3500 *scene = (Scene3500 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(10);
+ break;
+ case 1:
+ scene->_stripManager.start(3500, this);
+ break;
+ case 2:
+ setDelay(3);
+ break;
+ case 3:
+ _globals->_sceneManager.changeScene(9999);
+ break;
+ }
+}
+
+void Scene3500::Action2::signal() {
+ Scene3500 *scene = (Scene3500 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(10);
+ break;
+ case 1:
+ scene->_stripManager.start(3501, this);
+ break;
+ case 2:
+ setDelay(3);
+ break;
+ case 3:
+ _globals->_sceneManager.changeScene(2012);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene3500::postInit(SceneObjectList *OwnerList) {
+ loadScene((_globals->_stripNum == 3600) ? 3600 : 3500);
+ Scene::postInit();
+
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerMText);
+ _stripManager.addSpeaker(&_speakerSText);
+
+ _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
+ _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.top / 160) * 160;
+
+ setAction((_globals->_stripNum == 3600) ? (Action *)&_action2 : (Action *)&_action1);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 3700 - Remote Viewer
+ *
+ *--------------------------------------------------------------------------*/
+
+#define VIEW_FRAME_DELAY 10
+
+Scene3700::Viewer::Viewer() {
+ _images1.setVisage(3705, 1);
+ _images2.setVisage(3705, 2);
+
+ _frameList[0] = 1;
+ for (int idx = 1; idx <= 3; ++idx)
+ _frameList[idx] = _globals->_randomSource.getRandomNumber(4) + 1;
+
+ _active = true;
+ _countdownCtr = 0;
+ _percentList[0] = 120;
+ _percentList[1] = 50;
+ _percentList[2] = 75;
+ _percentList[3] = 114;
+}
+
+void Scene3700::Viewer::synchronize(Serializer &s) {
+ SceneObject::synchronize(s);
+ s.syncAsByte(_active);
+ s.syncAsSint16LE(_countdownCtr);
+ for (int idx = 0; idx < 4; ++idx) {
+ s.syncAsSint16LE(_frameList[idx]);
+ s.syncAsSint16LE(_percentList[idx]);
+ }
+}
+
+void Scene3700::Viewer::dispatch() {
+ if (_active) {
+ if (_countdownCtr-- <= 0) {
+ _countdownCtr = VIEW_FRAME_DELAY;
+
+ for (int idx = 3; idx > 1; --idx)
+ _frameList[idx] = _frameList[idx - 1];
+
+ int newFrame;
+ do {
+ newFrame = _globals->_randomSource.getRandomNumber(4) + 1;
+ } while (newFrame == _frameList[2]);
+
+ _frameList[1] = newFrame;
+ _flags |= OBJFLAG_PANES;
+ }
+ }
+}
+
+void Scene3700::Viewer::reposition() {
+ _bounds = Rect(123, 40, 285, 123);
+}
+
+void Scene3700::Viewer::draw() {
+ Region *priorityRegion = _globals->_sceneManager._scene->_priorities.find(1);
+
+ for (int idx = 0; idx < 4; ++idx) {
+ Visage &v = (idx == 0) ? _images1 : _images2;
+
+ GfxSurface img = v.getFrame(_frameList[idx]);
+ Rect destRect = img.getBounds();
+ destRect.resize(img, (_position.x - _globals->_sceneOffset.x),
+ (_position.y - _globals->_sceneOffset.y - _yDiff), _percentList[idx]);
+
+ destRect.translate(-_globals->_sceneManager._scene->_sceneBounds.left,
+ -_globals->_sceneManager._scene->_sceneBounds.top);
+
+ _globals->gfxManager().copyFrom(img, destRect, priorityRegion);
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene3700::Action1::signal() {
+ Scene3700 *scene = (Scene3700 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(10);
+ break;
+ case 1:
+ scene->_stripManager.start(2162, this);
+ break;
+ case 2:
+ scene->_viewer._active = false;
+ setDelay(90);
+ break;
+ case 3:
+ scene->_soundHandler.play(196);
+ scene->_viewer.hide();
+
+ scene->_hotspot1.postInit();
+ scene->_hotspot1.setVisage(3710);
+ scene->_hotspot1.setStrip(1);
+ scene->_hotspot1.setFrame(1);
+ scene->_hotspot1.setPosition(Common::Point(204, 120));
+
+ setDelay(90);
+ break;
+ case 4:
+ scene->_soundHandler.play(197);
+ scene->_hotspot1.hide();
+
+ scene->_hotspot2.postInit();
+ scene->_hotspot2.setVisage(3710);
+ scene->_hotspot2.setStrip(2);
+ scene->_hotspot2.setFrame(1);
+ scene->_hotspot2.setPosition(Common::Point(204, 120));
+
+ setDelay(30);
+ break;
+ case 5:
+ scene->_soundHandler.play(198);
+ scene->_hotspot2.hide();
+ scene->_hotspot1.show();
+ setDelay(90);
+ break;
+ case 6:
+ scene->_stripManager.start(2166, this);
+ break;
+ case 7:
+ setDelay(60);
+ break;
+ case 8:
+ scene->_hotspot1.remove();
+ scene->_hotspot2.show();
+ _globals->setFlag(59);
+ setDelay(30);
+ break;
+ case 9:
+ _globals->_sceneManager.changeScene(2100);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene3700::postInit(tSage::SceneObjectList *OwnerList) {
+ Scene::postInit();
+ loadScene(3700);
+
+ _stripManager.addSpeaker(&_speakerSText);
+ _stripManager.addSpeaker(&_speakerMText);
+ _stripManager.addSpeaker(&_speakerMR);
+ _speakerSText.setTextPos(Common::Point(20, 15));
+ _speakerMText.setTextPos(Common::Point(20, 15));
+
+ _viewer.postInit();
+ _viewer.setVisage(3705);
+ _viewer.setStrip(1);
+ _viewer.setFrame(2);
+ _viewer.setPosition(Common::Point(195, 83));
+
+ setAction(&_action1);
+ _globals->_soundHandler.play(195);
+}
+
+} // End of namespace tSage
diff --git a/engines/tsage/ringworld/ringworld_scenes4.h b/engines/tsage/ringworld/ringworld_scenes4.h
new file mode 100644
index 0000000000..6c706d2dab
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_scenes4.h
@@ -0,0 +1,92 @@
+/* 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_RINGWORLD_SCENES4_H
+#define TSAGE_RINGWORLD_SCENES4_H
+
+#include "common/scummsys.h"
+#include "tsage/core.h"
+#include "tsage/converse.h"
+#include "tsage/ringworld/ringworld_logic.h"
+
+namespace tSage {
+
+class Scene3500 : public Scene {
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2 : public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ SpeakerSText _speakerSText;
+ SpeakerMText _speakerMText;
+ SpeakerQText _speakerQText;
+ Action1 _action1;
+ Action2 _action2;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+};
+
+class Scene3700 : public Scene {
+ /* Custom classes */
+ class Viewer : public SceneObject {
+ public:
+ Visage _images1;
+ Visage _images2;
+
+ int _frameList[4];
+ int _percentList[4];
+ bool _active;
+ int _countdownCtr;
+
+ Viewer();
+ virtual Common::String getClassName() { return "Viewer"; }
+ virtual void synchronize(Serializer &s);
+ virtual void dispatch();
+ virtual void reposition();
+ virtual void draw();
+ };
+
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+public:
+ Viewer _viewer;
+ Action1 _action1;
+ SceneObject _hotspot1, _hotspot2;
+ SpeakerSText _speakerSText;
+ SpeakerMText _speakerMText;
+ SpeakerMR _speakerMR;
+ ASound _soundHandler;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+};
+
+} // End of namespace tSage
+
+#endif
diff --git a/engines/tsage/ringworld/ringworld_scenes5.cpp b/engines/tsage/ringworld/ringworld_scenes5.cpp
new file mode 100644
index 0000000000..0803a2039a
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_scenes5.cpp
@@ -0,0 +1,4441 @@
+/* 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 "common/config-manager.h"
+#include "tsage/ringworld/ringworld_scenes5.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+
+namespace tSage {
+
+/*--------------------------------------------------------------------------
+ * Scene 4000 - Village
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene4000::Action1::signal() {
+ // Quinn has the peg. Everybody enter the screen.
+ Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ scene->_hotspot5.postInit();
+ scene->_hotspot5.setVisage(2870);
+ scene->_hotspot5.setObjectWrapper(new SceneObjectWrapper());
+ scene->_hotspot5.animate(ANIM_MODE_1, NULL);
+ scene->_hotspot5.setPosition(Common::Point(116, 160));
+
+ Common::Point pt(208, 169);
+ NpcMover *mover = new NpcMover();
+ scene->_hotspot5.addMover(mover, &pt, this);
+
+ RING_INVENTORY._ale._sceneNumber = 0;
+ _globals->clearFlag(42);
+ _globals->clearFlag(36);
+ _globals->clearFlag(43);
+ _globals->clearFlag(37);
+ break;
+ }
+ case 1: {
+ scene->_guardRock.postInit();
+ scene->_guardRock.setVisage(4001);
+ scene->_guardRock.animate(ANIM_MODE_1, NULL);
+ scene->_guardRock.setObjectWrapper(new SceneObjectWrapper());
+ scene->_guardRock.setPosition(Common::Point(314, 132));
+ scene->_guardRock._moveDiff = Common::Point(4, 2);
+
+ ADD_PLAYER_MOVER_NULL(scene->_guardRock, 288, 167);
+
+ scene->_olo.postInit();
+ scene->_olo.setVisage(4006);
+ scene->_olo.animate(ANIM_MODE_1, NULL);
+ scene->_olo.setStrip(1);
+ scene->_olo.setPosition(Common::Point(207, 136));
+
+ ADD_PLAYER_MOVER_NULL(scene->_olo, 220, 151);
+
+ scene->_miranda.postInit();
+ scene->_miranda.setVisage(2701);
+ scene->_miranda.animate(ANIM_MODE_1, NULL);
+ scene->_miranda.setObjectWrapper(new SceneObjectWrapper());
+ scene->_miranda._moveDiff = Common::Point(4, 2);
+ scene->_miranda.setPosition(Common::Point(300, 135));
+
+ ADD_PLAYER_MOVER_THIS(scene->_miranda, 266, 169);
+
+ ADD_PLAYER_MOVER_NULL(_globals->_player, 241, 155);
+ break;
+ }
+ case 2:
+ scene->_stripManager.start(4400, this);
+ break;
+ case 3: {
+ Common::Point pt1(30, 86);
+ PlayerMover *mover1 = new PlayerMover();
+ scene->_miranda.addMover(mover1, &pt1, this);
+
+ ADD_PLAYER_MOVER_NULL(scene->_hotspot5, 3, 86);
+ break;
+ }
+ case 4:
+ ADD_MOVER(scene->_miranda, -30, 86);
+ ADD_MOVER_NULL(scene->_hotspot5, -40, 86);
+ break;
+ case 5:
+ _globals->_soundHandler.play(155);
+ _globals->setFlag(43);
+ _globals->setFlag(114);
+ scene->_stripManager.start(4430, this);
+ break;
+ case 6:
+ ADD_PLAYER_MOVER_THIS(scene->_olo, 277, 175);
+ ADD_PLAYER_MOVER_NULL(_globals->_player, 258, 187);
+ break;
+ case 7:
+ scene->_stripManager.start(4440, this);
+ break;
+ case 8:
+ setDelay(30);
+ break;
+ case 9:
+ _globals->setFlag(96);
+ _globals->_sceneManager.changeScene(4025);
+ break;
+ }
+}
+
+void Scene4000::Action2::signal() {
+ // Quinn, Seeker and Miranda walks down to the village
+ // Then, they talk to Rock, and enter the priest hut
+ Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setAction(&scene->_sequenceManager1, this, 4001, &_globals->_player, NULL);
+
+ scene->_hotspot5.postInit();
+ scene->_hotspot5.setVisage(2801);
+ scene->_hotspot5.animate(ANIM_MODE_1, NULL);
+ scene->_hotspot5.setObjectWrapper(new SceneObjectWrapper());
+ scene->_hotspot5._moveDiff.x = 5;
+ scene->_hotspot5.setPosition(Common::Point(-8, 88));
+
+ scene->_lander.setAction(&scene->_sequenceManager3, NULL, 4003, &scene->_hotspot5, NULL);
+ scene->_miranda.setAction(&scene->_sequenceManager2, NULL, 4002, &scene->_miranda, NULL);
+ break;
+ case 1:
+ _globals->_player.disableControl();
+
+ scene->_lander.remove();
+ ADD_MOVER(scene->_guardRock, scene->_hotspot5._position.x + 30, scene->_hotspot5._position.y - 10);
+ break;
+ case 2:
+ _globals->_player.checkAngle(&scene->_guardRock);
+ scene->_hotspot5.checkAngle(&scene->_guardRock);
+ scene->_miranda.checkAngle(&scene->_guardRock);
+ scene->_stripManager.start(4000, this);
+ break;
+ case 3:
+ scene->_hotspot2.setVisage(4017);
+ scene->_hotspot2.animate(ANIM_MODE_1, NULL);
+ scene->_hotspot2.setStrip(2);
+
+ ADD_MOVER(scene->_hotspot2, 116, 160);
+ ADD_MOVER(scene->_hotspot5, 116, 160);
+
+ _globals->setFlag(37);
+ break;
+ case 4:
+ break;
+ case 5:
+ scene->_stripManager.start(4010, this);
+ break;
+ case 6:
+ ADD_PLAYER_MOVER_NULL(scene->_guardRock, 230, 149);
+ ADD_PLAYER_MOVER(210, 136);
+ ADD_PLAYER_MOVER_NULL(scene->_miranda, 210, 133);
+ break;
+ case 7:
+ _globals->_sceneManager.changeScene(4045);
+ break;
+ }
+}
+
+void Scene4000::Action3::signal() {
+ // The guard walks to the left and exits the screen
+ Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_hotspot8.setVisage(4017);
+ scene->_hotspot8.setFrame2(-1);
+ scene->_hotspot8.animate(ANIM_MODE_1, NULL);
+ scene->_hotspot8.setObjectWrapper(new SceneObjectWrapper());
+ ADD_MOVER(scene->_hotspot8, 118, 145);
+ break;
+ case 1:
+ scene->_hotspot8.remove();
+ remove();
+ break;
+ }
+}
+
+void Scene4000::Action4::signal() {
+ // Quinn ties the rope to the rock
+ Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player._uiEnabled = false;
+ ADD_MOVER(_globals->_player, 257, 57);
+ break;
+ case 1:
+ _globals->_player.setVisage(4008);
+ _globals->_player.setPosition(Common::Point(258, 83));
+ _globals->_player._frame = 1;
+ _globals->_player._strip = 3;
+ _globals->_player.animate(ANIM_MODE_4, 2, 1, this);
+ break;
+ case 2:
+ scene->_rope.postInit();
+ scene->_rope.setVisage(4000);
+ scene->_rope.setStrip(7);
+ scene->_rope.setFrame(3);
+ scene->_rope.setPosition(Common::Point(268, 44));
+
+ RING_INVENTORY._rope._sceneNumber = 4000;
+ _globals->_events.setCursor(CURSOR_USE);
+ _globals->_player.animate(ANIM_MODE_6, this);
+ break;
+ case 3:
+ _globals->_player.setVisage(2602);
+ _globals->_player.setPosition(Common::Point(257, 57));
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player._uiEnabled = true;
+
+ _globals->setFlag(41);
+ remove();
+ break;
+ }
+}
+
+void Scene4000::Action5::signal() {
+ // Chat with Miranda
+ Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(15);
+ break;
+ case 1:
+ scene->_stripManager.start(_globals->_stripNum, this);
+ break;
+ case 2:
+ setDelay(10);
+ break;
+ case 3:
+ scene->_hotspot8.setVisage(4017);
+ scene->_hotspot8.animate(ANIM_MODE_1, NULL);
+ scene->_hotspot8.setFrame2(-1);
+ scene->_hotspot8.setAction(&scene->_action3);
+
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene4000::Action6::signal() {
+ // Quinn and Miranda enter the screen and walk to the village.
+ // Rock comes and notices the alcohol. They all enter his hut.
+ Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(30);
+ break;
+ case 1:
+ setAction(&scene->_sequenceManager1, this, 4001, &_globals->_player, NULL);
+
+ if (!_globals->getFlag(36))
+ scene->_miranda.setAction(&scene->_sequenceManager2, NULL, 4002, &scene->_miranda, NULL);
+ break;
+ case 2:
+ _globals->_player.disableControl();
+ ADD_MOVER(scene->_guardRock, _globals->_player._position.x + 30, _globals->_player._position.y - 5);
+ break;
+ case 3:
+ scene->_stripManager.start(_globals->getFlag(35) ? 4500 : 4502, this);
+ break;
+ case 4:
+ _globals->clearFlag(35);
+ ADD_MOVER_NULL(scene->_guardRock, 292, 138);
+ ADD_PLAYER_MOVER(283, 147);
+
+ if (!_globals->getFlag(36))
+ ADD_PLAYER_MOVER_NULL(scene->_miranda, 280, 150);
+ RING_INVENTORY._ale._sceneNumber = 4100;
+ break;
+ case 5:
+ _globals->_sceneManager.changeScene(4100);
+ break;
+ }
+}
+
+void Scene4000::Action7::signal() {
+ // Climb down left Chimney using a rope
+ Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+
+ scene->_rope.setFrame(1);
+ ADD_MOVER(_globals->_player, 247, 53);
+ break;
+ case 1:
+ _globals->_player.setVisage(4008);
+ _globals->_player.setStrip(4);
+ _globals->_player.setFrame(1);
+ _globals->_player.fixPriority(16);
+ _globals->_player.setPosition(Common::Point(260, 55));
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ _globals->_sceneManager.changeScene(4050);
+ break;
+ }
+}
+
+void Scene4000::Action8::signal() {
+ // Climb down right Chimney using a rope
+ Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ if (_globals->getFlag(41))
+ scene->_rope.setFrame(2);
+
+ ADD_MOVER(_globals->_player, 289, 53);
+ break;
+ case 1:
+ _globals->_player.setVisage(4008);
+ _globals->_player.setStrip(5);
+ _globals->_player.fixPriority(16);
+ _globals->_player.setFrame(1);
+ _globals->_player.setPosition(Common::Point(283, 52));
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ _globals->_player.remove();
+ setDelay(60);
+ break;
+ case 3:
+ _globals->_soundHandler.play(170);
+ scene->_smoke2.setVisage(4000);
+ scene->_smoke2.setStrip(6);
+ scene->_smoke2.animate(ANIM_MODE_2, NULL);
+ setDelay(60);
+ break;
+ case 4:
+ _globals->_soundHandler.play(77, this);
+ break;
+ case 5:
+ _globals->_game->endGame(4000, 15);
+ remove();
+ break;
+ }
+}
+
+void Scene4000::Action9::signal() {
+ // Villager animations
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(_globals->_randomSource.getRandomNumber(119) + 240);
+ break;
+ case 1:
+ static_cast<SceneObject *>(_owner)->animate(ANIM_MODE_8, 1, this);
+ _actionIndex = 0;
+ break;
+ }
+}
+
+void Scene4000::Action10::signal() {
+ // Villager animations
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(_globals->_randomSource.getRandomNumber(119) + 240);
+ break;
+ case 1:
+ static_cast<SceneObject *>(_owner)->animate(ANIM_MODE_8, 1, this);
+ _actionIndex = 0;
+ break;
+ }
+}
+
+void Scene4000::Action11::signal() {
+ Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ ADD_MOVER(scene->_lander, -30, 70);
+ break;
+ case 1:
+ setDelay(60);
+ break;
+ case 2:
+ scene->_hotspot5.postInit();
+ scene->_hotspot5.setVisage(2801);
+ scene->_hotspot5.animate(ANIM_MODE_1, NULL);
+ scene->_hotspot5.setObjectWrapper(new SceneObjectWrapper());
+ scene->_hotspot5._moveDiff.x = 4;
+ scene->_hotspot5.setPosition(Common::Point(-8, 88));
+
+ setAction(&scene->_sequenceManager1, this, 4001, &_globals->_player, NULL);
+
+ scene->_miranda.setPosition(Common::Point(-210, 139));
+ scene->_miranda.setAction(&scene->_sequenceManager2, NULL, 4002, &scene->_miranda, NULL);
+ scene->_lander.setAction(&scene->_sequenceManager3, NULL, 4003, &scene->_hotspot5, NULL);
+ break;
+ case 3:
+ scene->_stripManager.start(8000, this);
+ break;
+ case 4:
+ ADD_MOVER(scene->_olo, 263, 187);
+ scene->_olo.animate(ANIM_MODE_1, NULL);
+ break;
+ case 5:
+ scene->_soundHandler1.stop();
+ scene->_forceField.remove();
+
+ ADD_MOVER(_globals->_player, 340, 163);
+ ADD_MOVER_NULL(scene->_miranda, 340, 169);
+ ADD_MOVER_NULL(scene->_hotspot5, 340, 165);
+ break;
+ case 6:
+ _globals->_sceneManager.changeScene(4250);
+ break;
+ }
+}
+
+void Scene4000::Action12::signal() {
+ // Quinn enter Rock's hut
+ Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(5);
+ break;
+ case 1:
+ _globals->_events.setCursor(CURSOR_WALK);
+ scene->_stripManager.start(4015, this);
+ break;
+ case 2:
+ _globals->setFlag(32);
+ if (scene->_stripManager._field2E8 == 275) {
+ _globals->setFlag(82);
+ ADD_MOVER_NULL(scene->_guardRock, 292, 138);
+ ADD_PLAYER_MOVER(283, 147);
+ } else {
+ setDelay(30);
+ }
+ break;
+ case 3:
+ if (scene->_stripManager._field2E8 == 275) {
+ _globals->_sceneManager.changeScene(4100);
+ } else {
+ ADD_PLAYER_MOVER_THIS(scene->_guardRock, 300, 132);
+ }
+ break;
+ case 4:
+ scene->_guardRock.hide();
+ scene->_stripManager.start(4020, this);
+ break;
+ case 5:
+ _globals->setFlag(35);
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene4000::Action13::signal() {
+ // Lander is landing
+ Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(3);
+ break;
+ case 1:
+ scene->_soundHandler2.play(151);
+ scene->_soundHandler2.holdAt(true);
+ ADD_MOVER(scene->_lander, -30, 70);
+ break;
+ case 2:
+ scene->_soundHandler2.release();
+ _globals->_sceneManager.changeScene(4010);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene4000::Miranda::doAction(int action) {
+ Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case OBJECT_STUNNER:
+ SceneItem::display2(4000, 31);
+ break;
+ case CURSOR_LOOK:
+ SceneItem::display2(4000, 29);
+ break;
+ case CURSOR_TALK:
+ if (_globals->getFlag(31)) {
+ if (!_globals->getFlag(111)) {
+ _globals->setFlag(111);
+ _globals->_stripNum = 4070;
+ } else if (!_globals->getFlag(33))
+ _globals->_stripNum = 4094;
+ else if (!_globals->getFlag(112)) {
+ _globals->setFlag(112);
+ _globals->_stripNum = 4300;
+ } else if (!_globals->getFlag(113)) {
+ _globals->setFlag(113);
+ _globals->_stripNum = 4093;
+ } else
+ _globals->_stripNum = 4094;
+ } else {
+ if (!_globals->getFlag(33))
+ _globals->_stripNum = 4094;
+ else if (!_globals->getFlag(112)) {
+ _globals->setFlag(112);
+ _globals->_stripNum = 4300;
+ } else
+ _globals->_stripNum = 4094;
+ }
+
+ scene->setAction(&scene->_action5);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4000::Hotspot8::doAction(int action) {
+ // Guard
+ Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case OBJECT_STUNNER:
+ SceneItem::display2(4000, 26);
+ break;
+ case CURSOR_LOOK:
+ SceneItem::display2(4000, 25);
+ break;
+ case CURSOR_TALK:
+ if (RING_INVENTORY._peg._sceneNumber == 1)
+ SceneItem::display2(4000, 34);
+ else {
+ switch (_ctr) {
+ case 0:
+ _globals->_stripNum = 4090;
+ break;
+ case 1:
+ _globals->_stripNum = 4091;
+ break;
+ case 2:
+ _globals->_stripNum = 4092;
+ break;
+ default:
+ SceneItem::display2(4000, 34);
+ break;
+ }
+
+ if (_globals->_stripNum) {
+ setAction(NULL);
+ addMover(NULL);
+ ++_ctr;
+ scene->setAction(&scene->_action5);
+ }
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4000::GuardRock::doAction(int action) {
+ switch (action) {
+ case OBJECT_STUNNER:
+ SceneItem::display2(4000, 28);
+ break;
+ case CURSOR_LOOK:
+ SceneItem::display2(4000, 27);
+ break;
+ case CURSOR_TALK:
+ error("*** Do we need dialog.");
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4000::Ladder::doAction(int action) {
+ Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4000, 30);
+ break;
+ case CURSOR_USE:
+ _globals->_player.disableControl();
+ if (_globals->getFlag(40)) {
+ scene->_sceneMode = 4005;
+ scene->setAction(&scene->_sequenceManager1, scene, 4005, &_globals->_player, NULL);
+ } else {
+ scene->_sceneMode = 4004;
+ scene->setAction(&scene->_sequenceManager1, scene, 4004, &_globals->_player, &scene->_ladder, NULL);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4000::TheTech::doAction(int action) {
+ Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4000, 13);
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(4000, 19);
+ break;
+ case OBJECT_STUNNER:
+ SceneItem::display2(4000, 20);
+ break;
+ case CURSOR_USE:
+ if (_globals->getFlag(40))
+ SceneItem::display2(4000, 37);
+ else {
+ _globals->_player.disableControl();
+ if (_globals->_sceneObjects->contains(&scene->_miranda))
+ _globals->clearFlag(96);
+
+ scene->_sceneMode = 4012;
+ scene->setAction(&scene->_sequenceManager1, scene, 4012, &_globals->_player, NULL);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4000::Hotspot13::doAction(int action) {
+ // Rock between the two chimneys
+ Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4000, 21);
+ break;
+ case OBJECT_ROPE:
+ if (_globals->getFlag(40))
+ scene->setAction(&scene->_action4);
+ else
+ SceneItem::display2(4000, 22);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4000::Hotspot::doAction(int action) {
+ // Wall between the two doors
+ Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4000, 16);
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(4000, 17);
+ break;
+ case OBJECT_STUNNER:
+ SceneItem::display2(4000, 18);
+ break;
+ case OBJECT_LADDER: {
+ _globals->_player.disableControl();
+
+ scene->_ladder.postInit();
+ scene->_ladder.setVisage(4000);
+ scene->_ladder.setStrip(5);
+ scene->_ladder.setPosition(Common::Point(245, 147));
+ scene->_ladder.hide();
+ _globals->_sceneItems.push_front(&scene->_ladder);
+
+ if (_globals->_sceneObjects->contains(&scene->_hotspot8)) {
+ scene->_hotspot8.setAction(NULL);
+ Common::Point pt(118, 145);
+ NpcMover *mover = new NpcMover();
+ scene->_hotspot18.addMover(mover, &pt, NULL);
+ }
+
+ scene->_sceneMode = 4004;
+ scene->setAction(&scene->_sequenceManager1, scene, 4011, &_globals->_player, &scene->_ladder, NULL);
+ break;
+ }
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4000::Hotspot17::doAction(int action) {
+ // Left Chimney
+ Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4000, 23);
+ break;
+ case CURSOR_USE:
+ if (_globals->getFlag(40))
+ scene->setAction(&scene->_action7);
+ else
+ SceneItem::display2(4000, 24);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4000::Hotspot18::doAction(int action) {
+ // Right Chimney
+ Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4000, 36);
+ break;
+ case CURSOR_USE:
+ if (_globals->getFlag(40))
+ scene->setAction(&scene->_action8);
+ else
+ SceneItem::display2(4000, 24);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4000::Hotspot23::doAction(int action) {
+ // Door of the temple
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4000, _globals->getFlag(31) ? 10 : 9);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene4000::Scene4000() :
+ _forceField(0, CURSOR_LOOK, 4000, 14, CURSOR_USE, 4000, 32, OBJECT_STUNNER, 4000, 33,
+ OBJECT_SCANNER, 4000, 19, LIST_END),
+ _hotspot19(0, CURSOR_LOOK, 4000, 7, LIST_END),
+ _hotspot20(0, CURSOR_LOOK, 4000, 3, LIST_END),
+ _hotspot21(0, CURSOR_LOOK, 4000, 1, LIST_END),
+ _hotspot22(0, CURSOR_LOOK, 4000, 8, LIST_END),
+ _hotspot24(0, CURSOR_LOOK, 4000, 11, LIST_END),
+ _hotspot25(0, CURSOR_LOOK, 4000, 4, LIST_END),
+ _hotspot26(0, CURSOR_LOOK, 4000, 0, LIST_END) {
+}
+
+void Scene4000::postInit(SceneObjectList *OwnerList) {
+ loadScene(4000);
+ Scene::postInit();
+ setZoomPercents(0, 20, 70, 50);
+
+ _stripManager.addSpeaker(&_speakerQR);
+ _stripManager.addSpeaker(&_speakerML);
+ _stripManager.addSpeaker(&_speakerMR);
+ _stripManager.addSpeaker(&_speakerSR);
+ _stripManager.addSpeaker(&_speakerCHFL);
+ _stripManager.addSpeaker(&_speakerPL);
+ _stripManager.addSpeaker(&_speakerPText);
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerCHFR);
+ _stripManager.addSpeaker(&_speakerQL);
+ _stripManager.addSpeaker(&_speakerCHFText);
+ _stripManager.addSpeaker(&_speakerSText);
+ _stripManager.addSpeaker(&_speakerMText);
+
+ _speakerCHFText._npc = &_guardRock;
+ _speakerSText._npc = &_hotspot5;
+ _speakerMText._npc = &_miranda;
+ _speakerPText._npc = &_olo;
+ _speakerQText._npc = &_globals->_player;
+
+ _hotspot13.setBounds(Rect(263, 41, 278, 55));
+ _hotspot14.setBounds(Rect(96 /*140*/, 177, 140 /*96*/, 204));
+ _hotspot15.setBounds(Rect(227, 101, 264, 143));
+ _hotspot16.setBounds(Rect(306, 100, 319, 148));
+ _hotspot17.setBounds(Rect(231, 53, 254, 60));
+ _hotspot18.setBounds(Rect(285, 51, 310, 60));
+ _hotspot26.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+ _hotspot21.setBounds(Rect(28, 7, 53, 64));
+ _hotspot22.setBounds(Rect(125, 155, 140, 189));
+ _hotspot23.setBounds(Rect(205, 102, 220, 142));
+ _hotspot24.setBounds(Rect(270, 111, 297, 147));
+
+ _hotspot19._sceneRegionId = 16;
+ _hotspot20._sceneRegionId = 18;
+ _hotspot25._sceneRegionId = 17;
+
+ _smoke1.postInit();
+ _smoke1.setVisage(4000);
+ _smoke1.fixPriority(1);
+ _smoke1.setFrame(2);
+ _smoke1.setPosition(Common::Point(242, 59));
+ _smoke1.animate(ANIM_MODE_2, NULL);
+
+ _smoke2.postInit();
+ _smoke2.setVisage(4000);
+ _smoke2.setStrip(2);
+ _smoke2.fixPriority(1);
+ _smoke2.setFrame(2);
+ _smoke2.setPosition(Common::Point(299, 59));
+ _smoke2.animate(ANIM_MODE_2, NULL);
+
+ if (RING_INVENTORY._ladder._sceneNumber != 4000) {
+ // if ladder is not in the scene, activate the hotspot on the wall
+ _hotspot8.postInit();
+ _hotspot8.setVisage(4018);
+ _hotspot8.setObjectWrapper(new SceneObjectWrapper());
+ _hotspot8._strip = 2;
+ _hotspot8._numFrames = 5;
+ _hotspot8.setPosition(Common::Point(306, 154));
+ _hotspot8.setAction(&_action9);
+ }
+
+ _theTech.postInit();
+ _theTech.setVisage(4000);
+ _theTech.setStrip(3);
+ _theTech.setFrame(3);
+ _theTech.fixPriority(200);
+ _theTech.setPosition(Common::Point(281, 176));
+
+ if (_globals->getFlag(34)) {
+ _soundHandler1.play(156);
+
+ _forceField.postInit();
+ _forceField.setVisage(4000);
+ _forceField.setStrip(4);
+ _forceField.setPosition(Common::Point(312, 174));
+ _forceField.fixPriority(200);
+ _forceField.animate(ANIM_MODE_8, 0, NULL);
+
+ _globals->_sceneItems.push_back(&_forceField);
+ }
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(2602);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.setPosition(Common::Point(-28, 86));
+
+ if (!_globals->getFlag(36) && !_globals->getFlag(43)) {
+ _miranda.postInit();
+ _miranda.setVisage(2701);
+ _miranda.animate(ANIM_MODE_1, NULL);
+ _miranda.setObjectWrapper(new SceneObjectWrapper());
+ _miranda._moveDiff = Common::Point(4, 2);
+ _miranda.setPosition(Common::Point(-210, 139));
+
+ _globals->_sceneItems.push_back(&_miranda);
+ }
+
+ _globals->clearFlag(40);
+
+ switch (_globals->_sceneManager._previousScene) {
+ case 2320:
+ _globals->_soundHandler.play(155);
+
+ if (RING_INVENTORY._ale._sceneNumber == 1) {
+ _guardRock.postInit();
+ _guardRock.setVisage(4001);
+ _guardRock.animate(ANIM_MODE_1, NULL);
+ _guardRock.setObjectWrapper(new SceneObjectWrapper());
+ _guardRock.setPosition(Common::Point(314, 132));
+
+ setAction(&_action6);
+ } else {
+ _globals->_player.disableControl();
+ _sceneMode = 4001;
+ setAction(&_sequenceManager1, this, 4001, &_globals->_player, NULL);
+
+ if (!_globals->getFlag(36) && !_globals->getFlag(43))
+ _miranda.setAction(&_sequenceManager2, NULL, 4002, &_miranda, NULL);
+ }
+
+ if (_globals->getFlag(42))
+ _hotspot8.setAction(&_action3);
+ else if (_globals->getFlag(91))
+ _hotspot8.remove();
+ break;
+
+ case 4010:
+ _miranda.setPosition(Common::Point(-210, 139));
+
+ _guardRock.postInit();
+ _guardRock.setVisage(4001);
+ _guardRock.animate(ANIM_MODE_1, NULL);
+ _guardRock.setObjectWrapper(new SceneObjectWrapper());
+ _guardRock.setPosition(Common::Point(314, 132));
+
+ _hotspot2.postInit();
+ _hotspot2.setVisage(4018);
+ _hotspot2._strip = 1;
+ _hotspot2._numFrames = 5;
+ _hotspot2.setPosition(Common::Point(182, 146));
+ _hotspot2.setAction(&_action10);
+
+ setAction(&_action2);
+ break;
+
+ case 4025:
+ if (RING_INVENTORY._ladder._sceneNumber == 4000)
+ _hotspot8.remove();
+
+ _globals->_player.setPosition(Common::Point(260, 185));
+
+ if (!_globals->getFlag(36) && !_globals->getFlag(43))
+ _miranda.setPosition(Common::Point(246, 146));
+
+ if (_globals->getFlag(96)) {
+ _olo.postInit();
+ _olo.setVisage(4006);
+ _olo.animate(ANIM_MODE_1, NULL);
+ _olo.setObjectWrapper(new SceneObjectWrapper());
+ _olo.setPosition(Common::Point(290, 163));
+ }
+
+ if (_globals->_stripNum == 4025) {
+ _soundHandler1.play(182);
+ _forceField.remove();
+
+ _hotspot5.postInit();
+ _hotspot5.setVisage(2801);
+ _hotspot5.animate(ANIM_MODE_1, NULL);
+ _hotspot5.setObjectWrapper(new SceneObjectWrapper());
+ _hotspot5._moveDiff.x = 4;
+ _hotspot5.setPosition(Common::Point(-18, 86));
+
+ _globals->_player.disableControl();
+
+ if (!_globals->getFlag(96)) {
+ _olo.postInit();
+ _olo.setVisage(4006);
+ _olo.animate(ANIM_MODE_1, NULL);
+ _olo.setObjectWrapper(new SceneObjectWrapper());
+ _olo.setPosition(Common::Point(195, 128));
+
+ Common::Point pt(268, 157);
+ PlayerMover *mover = new PlayerMover();
+ _olo.addMover(mover, &pt, NULL);
+ }
+
+ _sceneMode = 4003;
+ setAction(&_sequenceManager1, this, 4003, &_hotspot5, NULL);
+ } else if (_globals->getFlag(96)) {
+ _globals->_player.disableControl();
+ _sceneMode = 4013;
+ setAction(&_sequenceManager1, this, 4013, &_olo, NULL);
+ }
+
+ _globals->clearFlag(96);
+ break;
+
+ case 4045:
+ _globals->_player.enableControl();
+
+ if (RING_INVENTORY._ladder._sceneNumber != 4000) {
+ _hotspot8.setVisage(4017);
+ _hotspot8.animate(ANIM_MODE_1, NULL);
+ _hotspot8.setPosition(Common::Point(199, 188));
+ _hotspot8.setAction(&_action3);
+ }
+
+ _globals->_player.setPosition(Common::Point(208, 153));
+ if (!_globals->getFlag(36) && !_globals->getFlag(43))
+ _miranda.setPosition(Common::Point(246, 146));
+
+ if (_globals->getFlag(39)) {
+ // Ollo follows Quinn and gives explanations on the Tech.
+ _globals->clearFlag(39);
+
+ _olo.postInit();
+ _olo.setVisage(4006);
+ _olo.animate(ANIM_MODE_1, NULL);
+ _olo.setObjectWrapper(new SceneObjectWrapper());
+ _olo.setPosition(Common::Point(219, 150));
+
+ _sceneMode = 4010;
+ _globals->_player.disableControl();
+ // This is the buggy animation where Miranda comments the Tech even
+ // if she's not in the room but in the lander.
+ setAction(&_sequenceManager1, this, 4010, &_globals->_player, &_olo, NULL);
+ }
+
+ if (_globals->_stripNum == 4000) {
+ _globals->_stripNum = 0;
+
+ _guardRock.postInit();
+ _guardRock.setVisage(4001);
+ _guardRock.animate(ANIM_MODE_1, NULL);
+ _guardRock.setObjectWrapper(new SceneObjectWrapper());
+ _guardRock.setPosition(Common::Point(231, 159));
+ _guardRock.setStrip(4);
+
+ setAction(&_action12);
+ }
+ break;
+
+ case 4050:
+ _globals->_soundHandler.play(155);
+ _globals->_player.disableControl();
+
+ if (_globals->_stripNum == 4050) {
+ _globals->_player.setVisage(4008);
+ _globals->_player.setStrip(4);
+ _globals->_player.setFrame(_globals->_player.getFrameCount());
+ _globals->_player.fixPriority(16);
+ _globals->_player.setPosition(Common::Point(260, 55));
+
+ _sceneMode = 4007;
+ setAction(&_sequenceManager1, this, 4007, &_globals->_player, NULL);
+ } else {
+ _globals->_player.setPosition(Common::Point(208, 153));
+ _globals->_player.enableControl();
+ }
+
+ if (RING_INVENTORY._ladder._sceneNumber != 4000)
+ _hotspot8.remove();
+ break;
+
+ case 4100:
+ _globals->_player.enableControl();
+ _globals->_player.setPosition(Common::Point(270, 155));
+
+ if (_globals->getFlag(42) && (RING_INVENTORY._ladder._sceneNumber != 4000)) {
+ _hotspot8.setVisage(4017);
+ _hotspot8.animate(ANIM_MODE_1, NULL);
+ _hotspot8.setPosition(Common::Point(244, 151));
+ _hotspot8.setAction(&_action3);
+ }
+
+ if (!_globals->getFlag(36) && !_globals->getFlag(43))
+ _miranda.setPosition(Common::Point(246, 146));
+ break;
+
+ default:
+ _globals->_soundHandler.play(155);
+
+ _lander.postInit();
+ _lander.setVisage(4002);
+ _lander._moveDiff = Common::Point(10, 10);
+ _lander.setPosition(Common::Point(-100, 80));
+ _lander.changeZoom(-1);
+ _lander.setPosition(Common::Point(130, -1));
+ _lander.animate(ANIM_MODE_2, NULL);
+
+ if (_globals->_stripNum == 9000) {
+ _olo.postInit();
+ _olo.setVisage(4006);
+ _olo.setPosition(Common::Point(235, 153));
+
+ _guardRock.postInit();
+ _guardRock.setVisage(4001);
+ _guardRock.setStrip(3);
+ _guardRock.setPosition(Common::Point(255, 153));
+
+ setAction(&_action11);
+ RING_INVENTORY._ladder._sceneNumber = 4100;
+ RING_INVENTORY._rope._sceneNumber = 4150;
+
+ _soundHandler1.play(156);
+
+ _forceField.postInit();
+ _forceField.setVisage(4000);
+ _forceField.setStrip(4);
+ _forceField.setPosition(Common::Point(312, 174));
+ _forceField.fixPriority(200);
+ _forceField.animate(ANIM_MODE_8, 0, NULL);
+ } else {
+ if (!_globals->getFlag(37)) {
+ _hotspot2.postInit();
+ _hotspot2.setVisage(4018);
+ _hotspot2._strip = 1;
+ _hotspot2._numFrames = 5;
+ _hotspot2.setPosition(Common::Point(182, 146));
+ _hotspot2.setAction(&_action10);
+ }
+ _miranda.setPosition(Common::Point(-210, 139));
+ setAction(&_action13);
+ }
+
+ break;
+ }
+
+ if (RING_INVENTORY._ladder._sceneNumber == 4000) {
+ _ladder.postInit();
+ _ladder.setVisage(4000);
+ _ladder.setStrip(5);
+ _ladder.setPosition(Common::Point(245, 147));
+
+ _globals->_sceneItems.push_back(&_ladder);
+ }
+
+ if (RING_INVENTORY._rope._sceneNumber == 4000) {
+ _rope.postInit();
+ _rope.setVisage(4000);
+ _rope.setStrip(7);
+ _rope.fixPriority(1);
+ _rope.setPosition(Common::Point(268, 44));
+ }
+
+ _globals->_sceneItems.addItems(&_hotspot8, &_hotspot17, &_hotspot18, &_hotspot14, &_hotspot15,
+ &_hotspot16, &_theTech, &_hotspot13, &_hotspot21, &_hotspot20, &_hotspot22, &_hotspot23,
+ &_hotspot24, &_hotspot25, &_hotspot19, &_hotspot26, NULL);
+}
+
+void Scene4000::signal() {
+ switch (_sceneMode) {
+ case 4010:
+ _globals->setFlag(38);
+ _olo.remove();
+ // Deliberate fall-through
+ case 4001:
+ _globals->_player.enableControl();
+ break;
+ case 4002:
+ case 4011:
+ break;
+ case 4003:
+ _sceneMode = 4014;
+ setAction(&_sequenceManager1, this, 4014, &_globals->_player, &_hotspot5, NULL);
+ break;
+ case 4004:
+ RING_INVENTORY._ladder._sceneNumber = 4000;
+ // Deliberate fall-through
+ case 4007:
+ _globals->_player._uiEnabled = true;
+ _globals->_events.setCursor(CURSOR_USE);
+ _globals->setFlag(40);
+ break;
+ case 4005:
+ _globals->_player.enableControl();
+ _globals->_events.setCursor(CURSOR_WALK);
+ _globals->clearFlag(40);
+ break;
+ case 4006:
+ _globals->_sceneManager.changeScene(4045);
+ break;
+ case 4008:
+ _globals->_sceneManager.changeScene(2320);
+ break;
+ case 4009:
+ _globals->_sceneManager.changeScene(2200);
+ break;
+ case 4012:
+ _globals->_player.checkAngle(&_theTech);
+ _globals->_sceneManager.changeScene(4025);
+ break;
+ case 4013:
+ _globals->_player.enableControl();
+ _olo.remove();
+ break;
+ case 4014:
+ _globals->_sceneManager.changeScene(4250);
+ break;
+ case 4015:
+ ADD_MOVER_NULL(_miranda, 0, _miranda._position.y - 5);
+ break;
+ }
+}
+
+void Scene4000::dispatch() {
+ Scene::dispatch();
+
+ if ((_globals->_player.getRegionIndex() == 10) || (_globals->_player.getRegionIndex() == 6))
+ _globals->_player.fixPriority(200);
+ if (_globals->_player.getRegionIndex() == 11)
+ _globals->_player.fixPriority(-1);
+ if (_globals->_player.getRegionIndex() == 5)
+ _globals->_player.fixPriority(94);
+
+ if (_globals->_sceneObjects->contains(&_hotspot5)) {
+ if ((_hotspot5.getRegionIndex() == 10) || (_hotspot5.getRegionIndex() == 6))
+ _hotspot5.fixPriority(200);
+ if (_hotspot5.getRegionIndex() == 11)
+ _hotspot5.fixPriority(-1);
+ if (_hotspot5.getRegionIndex() == 5)
+ _hotspot5.fixPriority(94);
+ }
+
+ if (_globals->_sceneObjects->contains(&_miranda)) {
+ if (!_miranda._mover)
+ _miranda.checkAngle(&_globals->_player);
+ if (!_action && _globals->_player.getRegionIndex() == 23) {
+ ADD_MOVER_NULL(_miranda, 204, 186);
+ }
+
+ if ((_miranda.getRegionIndex() == 10) || (_miranda.getRegionIndex() == 6))
+ _miranda.fixPriority(200);
+ if (_miranda.getRegionIndex() == 11)
+ _miranda.fixPriority(-1);
+ if (_miranda.getRegionIndex() == 5)
+ _miranda.fixPriority(94);
+ }
+
+ if (!_action) {
+ if ((RING_INVENTORY._peg._sceneNumber == 1) && _globals->getFlag(34) &&
+ _globals->getFlag(37) && !_globals->getFlag(40)) {
+ _globals->_player.disableControl();
+ _soundHandler1.play(177);
+ _globals->_soundHandler.play(178);
+
+ setAction(&_action1);
+ }
+
+ if (_globals->_player.getRegionIndex() == 2)
+ _globals->_sceneManager.changeScene(4045);
+ if (_globals->_player.getRegionIndex() == 15)
+ _globals->_sceneManager.changeScene(4100);
+
+ if ((_globals->_player._position.x <= 5) && (_globals->_player._position.y < 100)) {
+ _globals->_player.disableControl();
+
+ if (!_globals->_sceneObjects->contains(&_miranda) || (_miranda._position.y <= 100)) {
+ _sceneMode = 4008;
+ setAction(&_sequenceManager1, this, 4008, &_globals->_player, NULL);
+ } else {
+ _sceneMode = 4015;
+ _globals->_player.addMover(NULL);
+ setAction(&_sequenceManager1, this, 4015, &_globals->_player, &_miranda, NULL);
+ }
+ }
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 4010 - Village - Outside Lander
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene4010::postInit(SceneObjectList *OwnerList) {
+ loadScene(4010);
+ Scene::postInit();
+ setZoomPercents(0, 20, 70, 50);
+
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerSText);
+ _stripManager.addSpeaker(&_speakerMText);
+ _speakerSText._npc = &_hotspot1;
+ _speakerMText._npc = &_hotspot2;
+ _speakerQText._npc = &_globals->_player;
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(0);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.setPosition(Common::Point(-38, 175));
+ _globals->_player.changeZoom(75);
+
+ _hotspot2.postInit();
+ _hotspot2.setVisage(2705);
+ _hotspot2.animate(ANIM_MODE_1, NULL);
+ _hotspot2.setObjectWrapper(new SceneObjectWrapper());
+ _hotspot2._moveDiff = Common::Point(4, 2);
+ _hotspot2.setPosition(Common::Point(-50, 185));
+ _hotspot2.changeZoom(75);
+
+ _hotspot1.postInit();
+ _hotspot1.setVisage(2806);
+ _hotspot1.setPosition(Common::Point(-20, 175));
+ _hotspot1.changeZoom(75);
+ _hotspot1.animate(ANIM_MODE_1, NULL);
+ _hotspot1.setObjectWrapper(new SceneObjectWrapper());
+
+ _globals->_player.disableControl();
+ setAction(&_sequenceManager, this, 4017, &_globals->_player, &_hotspot1, &_hotspot2, NULL);
+}
+
+void Scene4010::signal() {
+ _globals->_sceneManager.changeScene(4000);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 4025 - Village - Puzzle Board
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene4025::Action1::signal() {
+ Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_armHotspot._strip = scene->_pegPtr->_armStrip;
+ scene->_armHotspot._frame = 4;
+ scene->_armHotspot.animate(ANIM_MODE_4, 2, -1, this);
+
+ if (scene->_pegPtr->_armStrip > 3) {
+ if (scene->_hole1._armStrip == scene->_pegPtr->_armStrip)
+ scene->_hole1._pegPtr = NULL;
+ if (scene->_hole2._armStrip == scene->_pegPtr->_armStrip)
+ scene->_hole2._pegPtr = NULL;
+ if (scene->_hole3._armStrip == scene->_pegPtr->_armStrip)
+ scene->_hole3._pegPtr = NULL;
+ if (scene->_hole4._armStrip == scene->_pegPtr->_armStrip)
+ scene->_hole4._pegPtr = NULL;
+ if (scene->_hole5._armStrip == scene->_pegPtr->_armStrip)
+ scene->_hole5._pegPtr = NULL;
+ }
+ break;
+ case 1:
+ scene->_pegPtr->hide();
+
+ if (scene->_pegPtr2) {
+ if (scene->_pegPtr->_armStrip == 3)
+ scene->_pegPtr2->_strip = 2;
+
+ scene->_pegPtr2->setPosition(scene->_pegPtr->_position);
+ scene->_pegPtr2->show();
+ scene->_pegPtr2->_armStrip = scene->_pegPtr->_armStrip;
+ }
+
+ scene->_pegPtr->_armStrip = 0;
+ scene->_pegPtr->setPosition(Common::Point(-10, -10));
+ scene->_pegPtr2 = scene->_pegPtr;
+ scene->_armHotspot.animate(ANIM_MODE_5, this);
+ break;
+
+ case 2:
+ _globals->_player._uiEnabled = true;
+ _globals->_events.setCursor(CURSOR_USE);
+ remove();
+ break;
+ }
+}
+
+void Scene4025::Action2::signal() {
+ Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_armHotspot._strip = scene->_holePtr->_armStrip;
+ scene->_armHotspot.animate(ANIM_MODE_4, 2, -1, this);
+ break;
+ case 1:
+ if (!scene->_pegPtr2) {
+ // Getting a peg from a hole
+ scene->_holePtr->_pegPtr->hide();
+ scene->_pegPtr = scene->_holePtr->_pegPtr;
+ scene->_pegPtr->_armStrip = 0;
+ scene->_pegPtr->setPosition(Common::Point(-10, -10));
+ scene->_pegPtr2 = scene->_holePtr->_pegPtr;
+ scene->_holePtr->_pegPtr = NULL;
+ } else {
+ // Placing a peg into a hole
+ scene->_pegPtr2 = NULL;
+ if (scene->_holePtr->_pegPtr) {
+ scene->_holePtr->_pegPtr->hide();
+ scene->_pegPtr2 = scene->_holePtr->_pegPtr;
+ }
+
+ assert(scene->_pegPtr);
+ scene->_pegPtr->setPosition(scene->_holePtr->_newPosition);
+ scene->_pegPtr->setStrip(1);
+ scene->_pegPtr->show();
+ scene->_pegPtr->_armStrip = scene->_holePtr->_armStrip;
+
+ scene->_holePtr->_pegPtr = scene->_pegPtr;
+ scene->_pegPtr = scene->_pegPtr2;
+ }
+ scene->_armHotspot.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ _globals->_player._uiEnabled = true;
+ _globals->_events.setCursor(CURSOR_USE);
+ remove();
+ break;
+ }
+}
+
+void Scene4025::Action3::signal() {
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ _globals->_scenePalette.addRotation(64, 111, -1);
+ setDelay(120);
+ break;
+ case 1:
+ _globals->clearFlag(34);
+ _globals->_stripNum = 4025;
+ _globals->_sceneManager.changeScene(4000);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene4025::Hole::synchronize(Serializer &s) {
+ SceneObject::synchronize(s);
+ SYNC_POINTER(_pegPtr);
+ s.syncAsSint16LE(_armStrip);
+ s.syncAsSint16LE(_newPosition.x);
+ s.syncAsSint16LE(_newPosition.y);
+}
+
+void Scene4025::Hole::doAction(int action) {
+ Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4025, 3);
+ break;
+ case CURSOR_USE:
+ if (!scene->_pegPtr && !_pegPtr) {
+ setAction(&scene->_sequenceManager, scene, 4028, NULL);
+ } else {
+ _globals->_player.disableControl();
+ scene->_holePtr = this;
+ scene->setAction(&scene->_action2);
+ }
+ break;
+ case OBJECT_PEG:
+ if (!scene->_pegPtr2) {
+ _globals->_player.disableControl();
+ _globals->_events.setCursor(CURSOR_USE);
+ RING_INVENTORY._peg._sceneNumber = 4025;
+
+ scene->_pegPtr = &scene->_peg5;
+ scene->_holePtr = this;
+ scene->_pegPtr->_armStrip = 0;
+ scene->_pegPtr2 = scene->_pegPtr;
+
+ scene->setAction(&scene->_action2);
+ } else {
+ scene->_sceneMode = 4027;
+ scene->setAction(&scene->_sequenceManager, scene, 4027, NULL);
+ }
+ break;
+ }
+}
+
+void Scene4025::Peg::synchronize(Serializer &s) {
+ SceneObject::synchronize(s);
+ s.syncAsSint16LE(_field88);
+ s.syncAsSint16LE(_armStrip);
+}
+
+void Scene4025::Peg::doAction(int action) {
+ Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4025, 1);
+ break;
+ case CURSOR_USE:
+ _globals->_player.disableControl();
+ scene->_pegPtr = this;
+ scene->setAction(&scene->_action1);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene4025::Scene4025() : Scene() {
+ _holePtr = NULL;
+ _pegPtr = _pegPtr2 = NULL;
+}
+
+void Scene4025::postInit(SceneObjectList *OwnerList) {
+ loadScene(4025);
+ Scene::postInit();
+ setZoomPercents(0, 100, 200, 100);
+
+ _globals->_events.setCursor(CURSOR_USE);
+ _pegPtr = _pegPtr2 = NULL;
+
+ _peg1.postInit();
+ _peg1._field88 = 1;
+ _peg1.setVisage(4025);
+ _peg1.setStrip(2);
+ _peg1.setFrame(1);
+ _peg1.setPosition(Common::Point(203, 61));
+
+ _peg2.postInit();
+ _peg2._field88 = 4;
+ _peg2.setVisage(4025);
+ _peg2.setStrip(2);
+ _peg2.setFrame(2);
+ _peg2.setPosition(Common::Point(195, 57));
+
+ _peg3.postInit();
+ _peg3._field88 = 0;
+ _peg3.setVisage(4025);
+ _peg3.setStrip(2);
+ _peg3.setFrame(3);
+ _peg3.setPosition(Common::Point(202, 66));
+
+ _peg4.postInit();
+ _peg4._field88 = 3;
+ _peg4.setVisage(4025);
+ _peg4.setStrip(2);
+ _peg4.setFrame(4);
+ _peg4.setPosition(Common::Point(194, 68));
+
+ _peg5.postInit();
+ _peg5._field88 = 2;
+ _peg5.setVisage(4025);
+ _peg5.setStrip(1);
+ _peg5.setFrame(5);
+ _peg5.hide();
+
+ // Hole N-W
+ _hole1.postInit();
+ _hole1.setVisage(4025);
+ _hole1.setStrip(1);
+ _hole1.setFrame2(6);
+ _hole1.setPosition(Common::Point(123, 51));
+ _hole1._pegPtr = NULL;
+ _hole1._newPosition = Common::Point(123, 44);
+ _hole1._armStrip = 8;
+
+ // Hole N-E
+ _hole2.postInit();
+ _hole2.setVisage(4025);
+ _hole2.setStrip(1);
+ _hole2.setFrame2(7);
+ _hole2.setPosition(Common::Point(167, 51));
+ _hole2._pegPtr = NULL;
+ _hole2._newPosition = Common::Point(166, 44);
+ _hole2._armStrip = 7;
+
+ // Hole Center
+ _hole3.postInit();
+ _hole3.setVisage(4025);
+ _hole3.setStrip(1);
+ _hole3.setFrame2(8);
+ _hole3.setPosition(Common::Point(145, 69));
+ _hole3._pegPtr = NULL;
+ _hole3._newPosition = Common::Point(145, 60);
+ _hole3._armStrip = 6;
+
+ // Hole S-W
+ _hole4.postInit();
+ _hole4.setVisage(4025);
+ _hole4.setStrip(1);
+ _hole4.setFrame2(9);
+ _hole4.setPosition(Common::Point(123, 87));
+ _hole4._pegPtr = NULL;
+ _hole4._newPosition = Common::Point(123, 80);
+ _hole4._armStrip = 5;
+
+ // Hole S-E
+ _hole5.postInit();
+ _hole5.setVisage(4025);
+ _hole5.setStrip(1);
+ _hole5.setFrame2(10);
+ _hole5.setPosition(Common::Point(167, 87));
+ _hole5._pegPtr = NULL;
+ _hole5._newPosition = Common::Point(166, 80);
+ _hole5._armStrip = 4;
+
+ _hole1.fixPriority(1);
+ _hole2.fixPriority(1);
+ _hole3.fixPriority(1);
+ _hole4.fixPriority(1);
+ _hole5.fixPriority(1);
+
+ _armHotspot.postInit();
+ _armHotspot.setVisage(4025);
+ _armHotspot.setPosition(Common::Point(190, 161));
+ _armHotspot.setStrip(3);
+ _armHotspot.setFrame(4);
+
+ _globals->_sceneItems.addItems(&_hole1, &_hole2, &_hole3, &_hole4, &_hole5,
+ &_peg1, &_peg2, &_peg3, &_peg4, &_peg5, NULL);
+
+ _globals->_player._uiEnabled = true;
+ _globals->_player.disableControl();
+ setAction(&_sequenceManager, this, 4026, NULL);
+}
+
+void Scene4025::synchronize(Serializer &s) {
+ Scene::synchronize(s);
+ SYNC_POINTER(_pegPtr);
+ SYNC_POINTER(_pegPtr2);
+ SYNC_POINTER(_holePtr);
+}
+
+void Scene4025::remove() {
+ _globals->_scenePalette.clearListeners();
+ Scene::remove();
+}
+
+void Scene4025::signal() {
+ if (_sceneMode != 4027) {
+ if (_sceneMode != 4028) {
+ _gfxButton.setText(EXIT_MSG);
+ _gfxButton._bounds.center(144, 107);
+ _gfxButton.draw();
+ _gfxButton._bounds.expandPanes();
+ }
+
+ _globals->_player._uiEnabled = true;
+ }
+
+ _globals->_events.setCursor(CURSOR_USE);
+}
+
+void Scene4025::process(Event &event) {
+ Scene::process(event);
+
+ if (_gfxButton.process(event)) {
+ if (RING_INVENTORY._peg._sceneNumber == 4025)
+ RING_INVENTORY._peg._sceneNumber = 1;
+
+ _globals->_sceneManager.changeScene(4000);
+ }
+}
+
+void Scene4025::dispatch() {
+ if (!_action && (_peg1._armStrip == 7) && (_peg2._armStrip == 4) && (_peg3._armStrip == 8) &&
+ (_peg4._armStrip == 5) && (_peg5._armStrip == 6))
+ setAction(&_action3);
+
+ Scene::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 4045 - Village - Temple Antechamber
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene4045::Action1::signal() {
+ Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(60);
+ break;
+ case 1:
+ _globals->_events.setCursor(CURSOR_WALK);
+ scene->_stripManager.start(4040, this, scene);
+ break;
+ case 2:
+ scene->_olloFace.animate(ANIM_MODE_NONE, NULL);
+ scene->_hotspot4.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ setDelay(60);
+ break;
+ case 4:
+ scene->_hotspot4.animate(ANIM_MODE_6, this);
+ break;
+ case 5:
+ ADD_MOVER(_globals->_player, 150, 300);
+ break;
+ case 6:
+ _globals->_stripNum = 4000;
+ _globals->_sceneManager.changeScene(4000);
+ remove();
+ break;
+ }
+}
+
+void Scene4045::Action2::signal() {
+ Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(15);
+ break;
+ case 1:
+ scene->_stripManager.start(_globals->_stripNum, this, scene);
+ break;
+ case 2:
+ scene->_olloFace.animate(ANIM_MODE_NONE, NULL);
+ setDelay(10);
+ break;
+ case 3:
+ if (_globals->getFlag(38)) {
+ _globals->_player.enableControl();
+ remove();
+ } else {
+ ADD_MOVER(_globals->_player, 150, 300);
+ }
+ break;
+ case 4:
+ _globals->setFlag(39);
+ _globals->_sceneManager.changeScene(4000);
+ break;
+ }
+}
+
+void Scene4045::Action3::signal() {
+ Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ scene->_hotspot4.animate(ANIM_MODE_5, this);
+ break;
+ case 1:
+ scene->_stripManager.start(4504, this, scene);
+ break;
+ case 2:
+ scene->_hotspot4.animate(ANIM_MODE_6, NULL);
+ scene->_olloFace.animate(ANIM_MODE_NONE, NULL);
+ ADD_MOVER(_globals->_player, 91, 1264);
+ break;
+ case 3:
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene4045::OlloStand::doAction(int action) {
+ Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case OBJECT_STUNNER:
+ SceneItem::display2(4045, 19);
+ break;
+ case CURSOR_LOOK:
+ SceneItem::display2(4045, (_strip == 1) ? 5 : 14);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(4045, 18);
+ break;
+ case CURSOR_TALK:
+ if (_strip == 5) {
+ setStrip(6);
+ animate(ANIM_MODE_NONE, NULL);
+ }
+ if (_globals->_player._position.y < 135) {
+ scene->_sceneMode = 4046;
+ _numFrames = 10;
+ _globals->_player.disableControl();
+
+ scene->setAction(&scene->_sequenceManager, this, 4046, &_globals->_player, this, NULL);
+ } else {
+ if (!_globals->getFlag(31)) {
+ _globals->setFlag(31);
+ _globals->_stripNum = 4080;
+ } else if (!_globals->getFlag(38))
+ _globals->_stripNum = 4060;
+ else
+ _globals->_stripNum = 4503;
+
+ scene->setAction(&scene->_action2);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4045::Miranda::doAction(int action) {
+ Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4045, 9);
+ break;
+ case CURSOR_TALK:
+ scene->_sceneMode = 4102;
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_sequenceManager, scene, 4104, NULL);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4045::Necklace::doAction(int action) {
+ Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4045, 17);
+ break;
+ case CURSOR_USE:
+ if (_globals->_player._position.y < 135) {
+ SceneItem::display2(4045, 16);
+ RING_INVENTORY._peg._sceneNumber = 1;
+ _globals->_events.setCursor(CURSOR_WALK);
+ remove();
+ } else {
+ scene->_sceneMode = 4047;
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_sequenceManager, scene, 4047, &_globals->_player, &scene->_olloStand, NULL);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene4045::Scene4045() :
+ _flame(0, CURSOR_LOOK, 4045, 1, CURSOR_USE, 4100, 21, LIST_END),
+ _hotspot7(9, CURSOR_LOOK, 4045, 0, CURSOR_USE, 4045, 15, LIST_END),
+ _hotspot8(10, CURSOR_LOOK, 4045, 2, LIST_END),
+ _hotspot9(11, CURSOR_LOOK, 4045, 3, CURSOR_USE, 4045, 15, LIST_END),
+ _hotspot10(12, CURSOR_LOOK, 4045, 4, CURSOR_USE, 4100, 19, LIST_END),
+ _hotspot11(13, CURSOR_LOOK, 4045, 6, CURSOR_USE, 4045, 15, LIST_END),
+ _hotspot12(14, CURSOR_LOOK, 4045, 7, CURSOR_USE, 4150, 29, LIST_END),
+ _hotspot13(15, CURSOR_LOOK, 4045, 8, CURSOR_USE, 4100, 19, LIST_END),
+ _hotspot14(0, CURSOR_LOOK, 4045, 10, LIST_END) {
+
+ _hotspot14.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+}
+
+void Scene4045::postInit(SceneObjectList *OwnerList) {
+ loadScene(4045);
+ Scene::postInit();
+ setZoomPercents(100, 60, 200, 100);
+
+ _stripManager.addSpeaker(&_speakerQR);
+ _stripManager.addSpeaker(&_speakerML);
+ _stripManager.addSpeaker(&_speakerPR);
+ _stripManager.addSpeaker(&_speakerPText);
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerQL);
+ _stripManager.setCallback(this);
+
+ _speakerQText._textPos.y = 140;
+
+ _flame.postInit();
+ _flame.setVisage(4045);
+ _flame.setPosition(Common::Point(47, 111));
+ _flame.animate(ANIM_MODE_2, NULL);
+ _flame.fixPriority(156);
+ _globals->_sceneItems.push_back(&_flame);
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(4200);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player._moveDiff = Common::Point(7, 4);
+
+ _olloStand.postInit();
+ _olloStand.setVisage(4051);
+
+ _olloFace.postInit();
+ _olloFace.setVisage(4051);
+ _olloFace.setStrip(4);
+ _olloFace.fixPriority(152);
+
+ if(_globals->_sceneManager._previousScene == 4050) {
+ _globals->_soundHandler.play(155);
+ _globals->_player.setPosition(Common::Point(72, 128));
+ _globals->_player.enableControl();
+
+ _olloStand.setStrip(5);
+ _olloStand.setPosition(Common::Point(173, 99));
+ _olloStand._numFrames = 1;
+ _olloStand.animate(ANIM_MODE_2, NULL);
+
+ _olloFace.setPosition(Common::Point(177, 40));
+
+ if (RING_INVENTORY._peg._sceneNumber == 4045) {
+ _necklace.postInit();
+ _necklace.setVisage(4045);
+ _necklace.setStrip(2);
+ _necklace.setPosition(Common::Point(108, 82));
+ _globals->_sceneItems.push_back(&_necklace);
+ }
+ } else {
+ _globals->_player.setPosition(Common::Point(108, 192));
+ _globals->_player.setStrip(4);
+
+ if (!_globals->getFlag(36) && !_globals->getFlag(43)) {
+ _miranda.postInit();
+ _miranda.setVisage(4102);
+ _miranda.animate(ANIM_MODE_NONE, NULL);
+ _miranda.setStrip(3);
+ _miranda.setFrame(2);
+ _miranda.changeZoom(-1);
+
+ _miranda.setPosition(Common::Point(66, 209));
+ _globals->_sceneItems.push_back(&_miranda);
+ }
+
+ if (_globals->getFlag(31)) {
+ // Olo asleep
+ _olloStand.setVisage(4051);
+ _olloStand.setStrip(5);
+ _olloStand.setPosition(Common::Point(173, 99));
+ _olloStand._numFrames = 1;
+ _olloStand.animate(ANIM_MODE_2, NULL);
+
+ _olloFace.setPosition(Common::Point(177, 40));
+
+ if (RING_INVENTORY._peg._sceneNumber == 4045) {
+ _necklace.postInit();
+ _necklace.setVisage(4045);
+ _necklace.setStrip(2);
+ _necklace.setPosition(Common::Point(108, 82));
+ _globals->_sceneItems.push_back(&_necklace);
+ }
+ } else {
+ _olloStand.setPosition(Common::Point(186, 149));
+
+ _hotspot4.postInit();
+ _hotspot4.setVisage(4051);
+ _hotspot4.setStrip(2);
+ _hotspot4.fixPriority(152);
+ _hotspot4.setPosition(Common::Point(202, 80));
+
+ _olloFace.setPosition(Common::Point(192, 77));
+ _globals->setFlag(31);
+ setAction(&_action1);
+
+ _globals->_player.disableControl();
+ }
+ }
+
+ _globals->_sceneItems.addItems(&_olloStand, &_hotspot7, &_hotspot8, &_hotspot9, &_hotspot10,
+ &_hotspot13, &_hotspot11, &_hotspot12, &_hotspot14, NULL);
+}
+
+void Scene4045::stripCallback(int v) {
+ switch (v) {
+ case 1:
+ _olloFace.animate(ANIM_MODE_7, 0, NULL);
+ break;
+ case 2:
+ _olloFace.animate(ANIM_MODE_NONE, NULL);
+ break;
+ }
+}
+
+void Scene4045::signal() {
+ switch (_sceneMode) {
+ case 4046:
+ case 4047:
+ _olloFace.animate(ANIM_MODE_NONE, NULL);
+ break;
+ case 4050:
+ _globals->_sceneManager.changeScene(4000);
+ break;
+ case 4102:
+ _globals->_player.enableControl();
+ break;
+ }
+}
+
+void Scene4045::dispatch() {
+ if (!_action) {
+ if (_globals->_player.getRegionIndex() == 8) {
+ _globals->_player.addMover(NULL);
+ if (_olloStand._strip != 1) {
+ _globals->_player.disableControl();
+ _sceneMode = 4046;
+ _olloStand._numFrames = 10;
+ setAction(&_sequenceManager, this, 4046, &_globals->_player, &_olloStand, NULL);
+ } else {
+ setAction(&_action3);
+ }
+ }
+
+ if (_globals->_player.getRegionIndex() == 10)
+ _globals->_sceneManager.changeScene(4050);
+ if (_globals->_player._position.y >= 196) {
+ _sceneMode = 4050;
+ _globals->_player.disableControl();
+ setAction(&_sequenceManager, this, 4105, &_globals->_player, NULL);
+ }
+ }
+
+ Scene::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 4050 - Village - Outside
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene4050::Action1::signal() {
+ // "Map" on the wall
+ Scene4050 *scene = (Scene4050 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(3);
+ break;
+ case 1: {
+ Common::Point pt(204, 152);
+ PlayerMover *mover = new PlayerMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 2:
+ _globals->_player.checkAngle(&scene->_hotspot17);
+
+ scene->_hotspot14.postInit();
+ scene->_hotspot14.setVisage(4050);
+ scene->_hotspot14.setStrip(2);
+ scene->_hotspot14.setPosition(Common::Point(91, 154));
+ scene->_hotspot14.fixPriority(200);
+ setDelay(10);
+ break;
+ case 3:
+ _globals->_events.waitForPress();
+ _globals->setFlag(45);
+ scene->_hotspot14.remove();
+
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene4050::Action2::signal() {
+ // Climb down the rope
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(120);
+ break;
+ case 1:
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ _globals->_player.setVisage(4202);
+ _globals->_player.changeZoom(100);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.setPosition(Common::Point(192, 130));
+
+ ADD_MOVER(_globals->_player, 215, 130);
+ break;
+ case 3:
+ _globals->_player.setVisage(4052);
+ _globals->_player.setStrip(5);
+ _globals->_player.setFrame(1);
+ _globals->_player.setPosition(Common::Point(236, 130));
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 4:
+ _globals->_player.setVisage(4202);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setPosition(Common::Point(210, 185));
+ _globals->_player.fixPriority(-1);
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene4050::Action3::signal() {
+ // Climb up the rope
+ switch (_actionIndex++) {
+ case 0:
+ ADD_PLAYER_MOVER(210, 185);
+ break;
+ case 1:
+ _globals->_player.fixPriority(200);
+ _globals->_player.setVisage(4052);
+ _globals->_player.setStrip(5);
+ _globals->_player.changeZoom(100);
+ _globals->_player.setFrame(_globals->_player.getFrameCount());
+ _globals->_player.setPosition(Common::Point(236, 130));
+ _globals->_player.animate(ANIM_MODE_6, this);
+ break;
+ case 2:
+ _globals->_player.setVisage(4202);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.setPosition(Common::Point(215, 130));
+ ADD_MOVER(_globals->_player, 212, 130);
+ break;
+ case 3:
+ _globals->_stripNum = 4050;
+ _globals->_sceneManager.changeScene(4000);
+ break;
+ }
+}
+
+void Scene4050::Action4::signal() {
+ Scene4050 *scene = (Scene4050 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ ADD_MOVER(_globals->_player, 189, 135);
+ _globals->_player.fixPriority(200);
+ break;
+ case 1:
+ _globals->_player._moveDiff.y = 3;
+ _globals->_player.setStrip2(3);
+ _globals->_player._frame = 1;
+ _globals->_player.setPosition(Common::Point(189, 129));
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ _globals->_player.setVisage(4202);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.setPosition(Common::Point(192, 130));
+ _globals->_player.changeZoom(100);
+ ADD_MOVER(_globals->_player, 215, 130);
+
+ scene->_hotspot16.postInit();
+ scene->_hotspot16.setVisage(4052);
+ scene->_hotspot16.animate(ANIM_MODE_1, NULL);
+ scene->_hotspot16.setStrip2(6);
+ scene->_hotspot16.setPosition(Common::Point(160, 240));
+ ADD_MOVER(scene->_hotspot16, 172, 188);
+ break;
+ case 3:
+ _globals->_player.setVisage(4052);
+ _globals->_player.setStrip(5);
+ _globals->_player.setFrame(1);
+ _globals->_player.setPosition(Common::Point(238, 130));
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 4:
+ _globals->_player.setVisage(4052);
+ _globals->_player.setStrip(2);
+ _globals->_player.setFrame(1);
+ _globals->_player.setPosition(Common::Point(216, 184));
+ _globals->_player.fixPriority(-1);
+ break;
+ case 5:
+ scene->_hotspot16.setStrip2(4);
+ scene->_hotspot16.setFrame(1);
+ scene->_hotspot16.animate(ANIM_MODE_4, 4, 1, this);;
+ break;
+ case 6:
+ scene->_hotspot16.animate(ANIM_MODE_5, NULL);
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 7:
+ _globals->_player.setVisage(4202);
+ _globals->_player.setStrip(6);
+ _globals->_player.setFrame(1);
+
+ scene->_stripManager.start(4051, this);
+ break;
+ case 8:
+ setDelay(15);
+ break;
+ case 9:
+ _globals->_sceneManager.changeScene(4000);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene4050::Hotspot15::doAction(int action) {
+ Scene4050 *scene = (Scene4050 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4050, 14);
+ break;
+ case CURSOR_USE:
+ _globals->_player.disableControl();
+ setAction(&scene->_action3);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4050::Hotspot17::doAction(int action) {
+ Scene4050 *scene = (Scene4050 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ scene->setAction(&scene->_action1);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(4050, 24);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene4050::Scene4050() :
+ _hotspot1(0, CURSOR_LOOK, 4050, 0, LIST_END),
+ _hotspot2(0, CURSOR_LOOK, 4050, 1, CURSOR_USE, 4050, 15, LIST_END),
+ _hotspot3(0, CURSOR_LOOK, 4050, 2, CURSOR_USE, 4050, 16, LIST_END),
+ _hotspot4(0, CURSOR_LOOK, 4050, 4, LIST_END),
+ _hotspot5(0, CURSOR_LOOK, 4050, 5, LIST_END),
+ _hotspot6(0, CURSOR_LOOK, 4050, 5, LIST_END),
+ _hotspot7(0, CURSOR_LOOK, 4050, 6, CURSOR_USE, 4050, 18, LIST_END),
+ _hotspot8(0, CURSOR_LOOK, 4050, 7, CURSOR_USE, 4050, 19, LIST_END),
+ _hotspot9(0, CURSOR_LOOK, 4050, 8, CURSOR_USE, 4050, 20, LIST_END),
+ _hotspot10(0, CURSOR_LOOK, 4050, 9, CURSOR_USE, 4050, 21, LIST_END),
+ _hotspot11(0, CURSOR_LOOK, 4050, 10, CURSOR_USE, 4050, 22, LIST_END),
+ _hotspot12(0, CURSOR_LOOK, 4050, 11, CURSOR_USE, 4050, 23, LIST_END),
+ _hotspot13(0, CURSOR_LOOK, 4050, 3, CURSOR_USE, 4050, 17, LIST_END) {
+}
+
+void Scene4050::postInit(SceneObjectList *OwnerList) {
+ loadScene(4050);
+ Scene::postInit();
+ setZoomPercents(0, 100, 200, 100);
+
+ _stripManager.addSpeaker(&_speakerPText);
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerGameText);
+
+ _globals->_player.postInit();
+
+ switch (_globals->_sceneManager._previousScene) {
+ case 4000:
+ if (_globals->getFlag(41)) {
+ // Using a rope
+ _hotspot15.postInit();
+ _hotspot15.setVisage(4054);
+ _hotspot15.setPosition(Common::Point(206, 103));
+ _globals->_sceneItems.push_back(&_hotspot15);
+
+ _globals->_player.setVisage(4008);
+ _globals->_player.setPosition(Common::Point(206, 62));
+ _globals->_player.changeZoom(130);
+ _globals->_player.fixPriority(200);
+ _globals->_player.setStrip(2);
+
+ setAction(&_action2);
+ _globals->_soundHandler.play(175);
+ } else {
+ // Without the rope
+ _globals->_player.setVisage(5315);
+ _globals->_player.setPosition(Common::Point(189, 83));
+ _globals->_player.changeZoom(130);
+ _globals->_player.setStrip2(2);
+ _globals->_player._moveDiff.y = 10;
+ _globals->_player.animate(ANIM_MODE_2, NULL);
+
+ setAction(&_action4);
+ _globals->_soundHandler.play(176);
+ }
+ break;
+ case 4045:
+ _hotspot15.postInit();
+ _hotspot15.setVisage(4054);
+ _hotspot15.setPosition(Common::Point(206, 103));
+ _globals->_sceneItems.push_back(&_hotspot15);
+
+ _globals->_player.setVisage(4202);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.setPosition(Common::Point(193, 193));
+
+ _globals->_soundHandler.play(175);
+ break;
+ default:
+ break;
+ }
+
+ _hotspot13.postInit();
+ _hotspot13.setVisage(4053);
+ _hotspot13.animate(ANIM_MODE_2, NULL);
+ _hotspot13.setPosition(Common::Point(190, 97));
+
+ _hotspot17.postInit();
+ _hotspot17.setVisage(4050);
+ _hotspot17.setPosition(Common::Point(209, 119));
+ _hotspot17.fixPriority(2);
+
+ _hotspot1.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+ _hotspot2.setBounds(Rect(150, 25, 198, 125));
+ _hotspot3.setBounds(Rect(56, 94, 88, 153));
+ _hotspot4.setBounds(Rect(170, 7, 209, 18));
+ _hotspot5.setBounds(Rect(190, 72, 212, 92));
+ _hotspot6.setBounds(Rect(122, 75, 145, 93));
+ _hotspot7.setBounds(Rect(109, 103, 263, 158));
+ _hotspot8.setBounds(Rect(157, 160, 213, 173));
+ _hotspot9.setBounds(Rect(95, 157, 120, 178));
+ _hotspot10.setBounds(Rect(278, 43, 310, 115));
+ _hotspot11.setBounds(Rect(263, 105, 279, 147));
+ _hotspot12.setBounds(Rect(258, 154, 307, 180));
+
+ _globals->_sceneItems.addItems(&_hotspot17, &_hotspot12, &_hotspot11, &_hotspot10, &_hotspot13,
+ &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5, &_hotspot6, &_hotspot8, &_hotspot9,
+ &_hotspot7, &_hotspot1, NULL);
+}
+
+void Scene4050::signal() {
+ if (_sceneMode == 4050)
+ _globals->_sceneManager.changeScene(4045);
+}
+
+void Scene4050::dispatch() {
+ if (!_action) {
+ if ((_globals->_player._canWalk) && (_globals->_player._position.y > 196)) {
+ _sceneMode = 4050;
+ _globals->_player.disableControl();
+
+ Common::Point pt(160, 275);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ }
+ }
+ Scene::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 4100 - Village - Hut
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene4100::Action1::signal() {
+ Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(10);
+ break;
+ case 1:
+ scene->_stripManager.start(_globals->_stripNum, this);
+ break;
+ case 2:
+ setDelay(30);
+ break;
+ case 3:
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene4100::Action2::signal() {
+ Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_hotspot2.postInit();
+ scene->_hotspot2.changeZoom(95);
+ scene->_hotspot2.setVisage(4120);
+ scene->_hotspot2.animate(ANIM_MODE_1, NULL);
+ scene->_hotspot2.setStrip2(4);
+ scene->_hotspot2.fixPriority(100);
+ scene->_hotspot2.setPosition(Common::Point(214, 119));
+
+ setDelay(3);
+ break;
+ case 1:
+ ADD_MOVER(scene->_hotspot2, 249, 131);
+ break;
+ case 2:
+ scene->_hotspot2.setStrip2(3);
+ scene->_hotspot2.setFrame2(5);
+ scene->_hotspot2.animate(ANIM_MODE_NONE, NULL);
+ setDelay(3);
+ break;
+ case 3:
+ remove();
+ break;
+ }
+}
+
+
+void Scene4100::Action3::signal() {
+ Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->clearFlag(43);
+ _globals->setFlag(36);
+ setDelay(15);
+ break;
+ case 1:
+ scene->_stripManager.start(4505, this);
+ break;
+ case 2:
+ setAction(&scene->_action2, this);
+ break;
+ case 3:
+ scene->_stripManager.start(4510, this);
+ break;
+ case 4:
+ setDelay(15);
+ break;
+ case 5:
+ _globals->_sceneManager.changeScene(4150);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene4100::Action4::signal() {
+ // Rock getting drunk
+ Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(30);
+ break;
+ case 1:
+ scene->_hotspot1.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ scene->_hotspot1.setVisage(4105);
+ scene->_hotspot1.setFrame(1);
+ scene->_hotspot1.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ _globals->clearFlag(43);
+ _globals->setFlag(42);
+ scene->_stripManager.start(4119, this);
+ break;
+ case 4:
+ setDelay(15);
+ break;
+ case 5:
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene4100::Action5::signal() {
+ Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ ADD_PLAYER_MOVER(58, 151);
+ break;
+ case 1:
+ if (RING_INVENTORY._ladder._sceneNumber == 4100) {
+ RING_INVENTORY._ladder._sceneNumber = 1;
+ scene->_ladder.remove();
+ } else {
+ scene->_ladder.postInit();
+ scene->_ladder.setVisage(4101);
+ scene->_ladder.setPosition(Common::Point(49, 144));
+
+ RING_INVENTORY._ladder._sceneNumber = 4100;
+ _globals->_sceneItems.push_front(&scene->_ladder);
+ }
+
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+
+void Scene4100::Action6::signal() {
+ Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ scene->_stripManager.start(4103, this);
+ ADD_PLAYER_MOVER(245, 167);
+ break;
+ case 1:
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene4100::Hotspot1::doAction(int action) {
+ Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case OBJECT_STUNNER:
+ SceneItem::display2(4100, 16);
+ break;
+ case OBJECT_ALE:
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_action3);
+ break;
+ case CURSOR_LOOK:
+ SceneItem::display2(4100, _globals->getFlag(42) ? 24 : 12);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(4100, 22);
+ break;
+ case CURSOR_TALK:
+ if (RING_INVENTORY._peg._sceneNumber == 1) {
+ _globals->_player.disableControl();
+ scene->_sceneMode = 4109;
+ scene->setAction(&scene->_sequenceManager, scene, 4109, NULL);
+ } else if (_globals->getFlag(42)) {
+ scene->_sceneMode = 4102;
+ scene->setAction(&scene->_sequenceManager, scene, 4102, NULL);
+ } else {
+ if (_globals->getFlag(33))
+ _globals->_stripNum = 4077;
+ else if (_globals->getFlag(82)) {
+ _globals->clearFlag(82);
+ _globals->_stripNum = 4100;
+ } else {
+ _globals->_stripNum = 4075;
+ _globals->setFlag(33);
+ }
+
+ scene->setAction(&scene->_action1);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4100::Hotspot2::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ error("*** The Chief's daughter... WOW!");
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4100::Miranda::doAction(int action) {
+ Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4100, 14);
+ break;
+ case CURSOR_TALK:
+ scene->_sceneMode = 4102;
+ scene->setAction(&scene->_sequenceManager, scene, 4104, NULL);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4100::Ladder::doAction(int action) {
+ Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4100, 2);
+ break;
+ case CURSOR_USE:
+ if (_globals->getFlag(42)) {
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_action5);
+ } else {
+ scene->_sceneMode = 4102;
+ scene->setAction(&scene->_sequenceManager, scene, 4103, NULL);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/**
+ Exit hotspot, South
+ */
+void Scene4100::Hotspot14::doAction(int action) {
+ Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4100, 0);
+ break;
+ case OBJECT_LADDER:
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_action5);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+
+/*--------------------------------------------------------------------------*/
+
+Scene4100::Scene4100() :
+ _hotspot3(0, CURSOR_LOOK, 4100, 10, CURSOR_USE, 4100, 21, LIST_END),
+ _hotspot4(0, CURSOR_LOOK, 4100, 8, LIST_END),
+ _hotspot7(0, CURSOR_USE, 4100, 3, CURSOR_USE, 4150, 29, LIST_END),
+ _hotspot8(0, CURSOR_LOOK, 4100, 5, LIST_END),
+ _hotspot9(0, CURSOR_LOOK, 4100, 6, CURSOR_USE, 4100, 20, LIST_END),
+ _hotspot10(0, CURSOR_LOOK, 4100, 7, CURSOR_USE, 4100, 19, LIST_END),
+ _hotspot11(0, CURSOR_LOOK, 4100, 8, CURSOR_USE, 4100, 18, LIST_END),
+ _hotspot12(0, CURSOR_LOOK, 4100, 9, LIST_END),
+ _hotspot13(0, CURSOR_LOOK, 4100, 11, CURSOR_USE, 4100, 17, LIST_END) {
+}
+
+void Scene4100::postInit(SceneObjectList *OwnerList) {
+ loadScene(4100);
+ Scene::postInit();
+ setZoomPercents(135, 80, 190, 100);
+
+ _stripManager.addSpeaker(&_speakerMText);
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerCHFText);
+ _stripManager.addSpeaker(&_speakerCDRText);
+ _stripManager.addSpeaker(&_speakerCDR);
+ _stripManager.addSpeaker(&_speakerML);
+ _stripManager.addSpeaker(&_speakerQR);
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(4200);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setStrip(4);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.setPosition(Common::Point(88, 180));
+ _globals->_player._moveDiff = Common::Point(7, 4);
+
+ _hotspot1.postInit();
+ _hotspot1.setVisage(4102);
+ _hotspot1.fixPriority(129);
+ _hotspot1.setPosition(Common::Point(171, 120));
+
+ _hotspot3.postInit();
+ _hotspot3.setVisage(4130);
+ _hotspot3.animate(ANIM_MODE_2, NULL);
+ _hotspot3.fixPriority(200);
+ _hotspot3.setPosition(Common::Point(272, 110));
+
+ _hotspot4.postInit();
+ _hotspot4.setVisage(4130);
+ _hotspot4.animate(ANIM_MODE_2, NULL);
+ _hotspot4.setStrip2(2);
+ _hotspot4.setPosition(Common::Point(152, 167));
+
+ if (_globals->getFlag(36)) {
+ _hotspot1.setVisage(4105);
+ _hotspot1.setStrip(1);
+ _hotspot1.setFrame(4);
+ } else if (!_globals->getFlag(43)) {
+ _miranda.postInit();
+ _miranda.setVisage(4102);
+ _miranda.setStrip2(3);
+ _miranda.setFrame(2);
+ _miranda.setPosition(Common::Point(65, 188));
+
+ _globals->_sceneItems.push_back(&_miranda);
+ }
+
+ if (RING_INVENTORY._ladder._sceneNumber == 4100) {
+ _ladder.postInit();
+ _ladder.setVisage(4101);
+ _ladder.setPosition(Common::Point(49, 144));
+
+ _globals->_sceneItems.push_back(&_ladder);
+ }
+
+ _hotspot14.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+ _hotspot7._sceneRegionId = 16;
+ _hotspot8.setBounds(Rect(90, 0, 211, 113));
+ _hotspot9.setBounds(Rect(207, 96, 235, 115));
+ _hotspot10.setBounds(Rect(87, 81, 212, 107));
+ _hotspot11.setBounds(Rect(61, 148, 243, 168));
+ _hotspot12.setBounds(Rect(229, 59, 256, 122));
+ _hotspot13.setBounds(Rect(255, 152, 286, 183));
+
+ _globals->_sceneItems.addItems(&_hotspot3, &_hotspot1, &_hotspot13, &_hotspot12, &_hotspot4,
+ &_hotspot11, &_hotspot9, &_hotspot7, &_hotspot10, &_hotspot8, &_hotspot14, NULL);
+
+ if (_globals->_sceneManager._previousScene == 4150) {
+ _globals->_soundHandler.play(155);
+
+ if (!_globals->getFlag(42)) {
+ _hotspot1.setVisage(4104);
+ _hotspot1.setPosition(Common::Point(152, 118));
+ _hotspot1.setStrip2(-1);
+ _hotspot1.setFrame2(-1);
+ _hotspot1.setFrame(1);
+
+ _globals->_player.setStrip(2);
+ _globals->_player.disableControl();
+ setAction(&_action4);
+
+ _globals->clearFlag(43);
+ } else {
+ // Workaround: In the original, the mouse is hidden when Quinn
+ // goes back to scene 4150 then to scene 4100. This enables everything.
+ _globals->_player.enableControl();
+ }
+
+ _globals->_player.setPosition(Common::Point(252, 139));
+ _globals->_player.setStrip(2);
+ } else {
+ if ((RING_INVENTORY._ale._sceneNumber == 4100) && !_globals->getFlag(42)) {
+ _globals->_player.disableControl();
+ setAction(&_action3);
+ }
+ if (_globals->getFlag(35)) {
+ _globals->_player.disableControl();
+ _sceneMode = 4101;
+ setAction(&_sequenceManager, this, 4101, &_globals->_player, NULL);
+ }
+ }
+}
+
+void Scene4100::signal() {
+ switch (_sceneMode) {
+ case 4101:
+ _globals->_sceneManager.changeScene(4000);
+ break;
+ case 4102:
+ case 4103:
+ case 4109:
+ _globals->_player.enableControl();
+ break;
+ }
+}
+
+void Scene4100::dispatch() {
+ if (!_action) {
+ if ((_globals->_player.getRegionIndex() == 15) && !_globals->getFlag(42))
+ setAction(&_action6);
+
+ if (_globals->_player.getRegionIndex() == 8)
+ _globals->_sceneManager.changeScene(4150);
+
+ if (_globals->_player._position.y >= 196) {
+ _globals->_player.disableControl();
+ _sceneMode = 4101;
+ setAction(&_sequenceManager, this, 4105, &_globals->_player, NULL);
+ }
+ }
+
+ Scene::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 4150 - Village - Bedroom
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene4150::Action1::signal() {
+ Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene;
+ byte adjustData[4] = {0, 0, 0, 0};
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(60);
+ break;
+ case 1:
+ scene->_stripManager.start(4520, this);
+ break;
+ case 2:
+ setDelay(15);
+ break;
+ case 3:
+ setAction(&scene->_action2, this);
+ break;
+ case 4: {
+ for (int idx = 100; idx >= 0; idx -= 5) {
+ _globals->_scenePalette.fade(adjustData, false, idx);
+ g_system->updateScreen();
+ g_system->delayMillis(10);
+ }
+
+ scene->_hotspot4.postInit();
+ scene->_hotspot4.setVisage(4150);
+ scene->_hotspot4.setStrip(2);
+ scene->_hotspot4.setPosition(Common::Point(166, 157));
+
+ scene->_hotspot1.postInit();
+ scene->_hotspot1.setVisage(4156);
+ scene->_hotspot1.setStrip(1);
+ scene->_hotspot1.setFrame(1);
+
+ setDelay(120);
+ break;
+ }
+ case 5:
+ _globals->_scenePalette.loadPalette(4150);
+ _globals->_scenePalette.refresh();
+ setDelay(60);
+ break;
+ case 6:
+ scene->_stripManager.start(4522, this);
+ break;
+ case 7:
+ for (int idx = 100; idx >= 0; idx -= 5) {
+ _globals->_scenePalette.fade(adjustData, false, idx);
+ g_system->updateScreen();
+ g_system->delayMillis(10);
+ }
+
+ scene->_hotspot4.remove();
+ scene->_hotspot1.setVisage(4157);
+ scene->_hotspot1.animate(ANIM_MODE_NONE, NULL);
+ scene->_hotspot1.setStrip(1);
+ scene->_hotspot1.setFrame(1);
+ scene->_hotspot1.show();
+
+ _globals->_player.setVisage(4200);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setStrip(3);
+ _globals->_player.setPosition(Common::Point(139, 166));
+ _globals->_player._moveDiff = Common::Point(7, 3);
+ _globals->_player.show();
+
+ setDelay(120);
+ break;
+ case 8:
+ _globals->_scenePalette.loadPalette(4150);
+ _globals->_scenePalette.refresh();
+ setDelay(30);
+ break;
+ case 9:
+ scene->_stripManager.start(4523, this);
+ break;
+ case 10:
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player._moveDiff = Common::Point(7, 4);
+ _globals->_player.setStrip(3);
+ _globals->_player.enableControl();
+
+ remove();
+ break;
+ }
+}
+
+void Scene4150::Action2::signal() {
+ Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(3);
+ break;
+ case 1:
+ scene->_hotspot1.setVisage(4152);
+ scene->_hotspot1.setStrip(1);
+ scene->_hotspot1.setFrame(1);
+ scene->_hotspot1.animate(ANIM_MODE_5, this);
+
+ _globals->_player.animate(ANIM_MODE_5, NULL);
+ break;
+ case 2:
+ _globals->_player.hide();
+ scene->_hotspot1.setVisage(4153);
+ scene->_hotspot1.setStrip(1);
+ scene->_hotspot1.setFrame(1);
+ scene->_hotspot1.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ remove();
+ break;
+ }
+}
+
+void Scene4150::Action3::signal() {
+ Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(15);
+ break;
+ case 1:
+ _globals->_player.checkAngle(&scene->_hotspot3);
+
+ if (RING_INVENTORY._rope._sceneNumber == 1) {
+ scene->_hotspot3.postInit();
+ scene->_hotspot3.setVisage(4150);
+ scene->_hotspot3.setPosition(Common::Point(175, 70));
+
+ RING_INVENTORY._rope._sceneNumber = 4150;
+ _globals->_sceneItems.push_front(&scene->_hotspot3);
+ } else {
+ RING_INVENTORY._rope._sceneNumber = 1;
+ scene->_hotspot3.remove();
+ }
+
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene4150::HotspotGroup1::doAction(int action) {
+ Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4150, 0);
+ break;
+ case OBJECT_ROPE:
+ scene->setAction(&scene->_action3);
+ break;
+ }
+}
+
+void Scene4150::HotspotGroup3::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4150, _globals->getFlag(46) ? 9 : 8);
+ _globals->setFlag(46);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(4150, 30);
+ break;
+ }
+}
+
+void Scene4150::HotspotGroup6::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4150, _globals->getFlag(47) ? 16 : 15);
+ _globals->setFlag(47);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(4150, 31);
+ break;
+ }
+}
+
+void Scene4150::Hotspot3::doAction(int action) {
+ Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4150, 20);
+ break;
+ case CURSOR_USE:
+ scene->setAction(&scene->_action3);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene4150::Scene4150() :
+ _hotspot1(0, CURSOR_LOOK, 4150, 17, CURSOR_USE, 4150, 21, CURSOR_TALK, 4150, 21,
+ OBJECT_SCANNER, 4150, 22, OBJECT_STUNNER, 4150, 23, LIST_END),
+ _hotspot2(0, CURSOR_LOOK, 4150, 4, CURSOR_USE, 4150, 24, LIST_END),
+ _hotspot7(0, CURSOR_LOOK, 4150, 1, CURSOR_USE, 4150, 25, OBJECT_ROPE, 4150, 26, LIST_END),
+ _hotspot8(0, CURSOR_LOOK, 4150, 1, CURSOR_USE, 4150, 25, OBJECT_ROPE, 4150, 26, LIST_END),
+ _hotspot9(0, CURSOR_LOOK, 4150, 2, CURSOR_USE, 4150, 27, OBJECT_SCANNER, 4150, 28,
+ OBJECT_STUNNER, 4150, 32, LIST_END),
+ _hotspot10(0, CURSOR_LOOK, 4150, 5, CURSOR_USE, 4150, 29, LIST_END),
+ _hotspot11(0, CURSOR_LOOK, 4150, 6, CURSOR_USE, 4150, 29, LIST_END),
+ _hotspot12(0, CURSOR_LOOK, 4150, 7, CURSOR_USE, 4150, 29, LIST_END),
+ _hotspot17(0, CURSOR_LOOK, 4150, 10, CURSOR_USE, 4150, 27, OBJECT_STUNNER, 4150, 32, LIST_END),
+ _hotspot18(0, CURSOR_LOOK, 4150, 11, CURSOR_USE, 4150, 27, OBJECT_STUNNER, 4150, 32, LIST_END),
+ _hotspot19(0, CURSOR_LOOK, 4150, 12, CURSOR_USE, 4150, 29, LIST_END),
+ _hotspot20(0, CURSOR_LOOK, 4150, 13, CURSOR_USE, 4150, 29, LIST_END),
+ _hotspot21(0, CURSOR_LOOK, 4150, 13, CURSOR_USE, 4150, 29, LIST_END),
+ _hotspot22(0, CURSOR_LOOK, 4150, 13, CURSOR_USE, 4150, 29, LIST_END),
+ _hotspot23(0, CURSOR_LOOK, 4150, 14, CURSOR_USE, 4150, 27, OBJECT_STUNNER, 4150, 32, LIST_END),
+ _hotspot24(0, CURSOR_LOOK, 4150, 14, CURSOR_USE, 4150, 27, OBJECT_STUNNER, 4150, 32, LIST_END)
+ {
+}
+
+void Scene4150::postInit(SceneObjectList *OwnerList) {
+ loadScene(4150);
+ Scene::postInit();
+ setZoomPercents(60, 85, 200, 100);
+
+ _stripManager.addSpeaker(&_speakerQR);
+ _stripManager.addSpeaker(&_speakerCDL);
+ _stripManager.addSpeaker(&_speakerQText);
+
+ _hotspot2.postInit();
+ _hotspot2.setVisage(4171);
+ _hotspot2.animate(ANIM_MODE_2, NULL);
+ _hotspot2.fixPriority(100);
+ _hotspot2.setPosition(Common::Point(76, 147));
+
+ _hotspot1.postInit();
+ _hotspot1.setPosition(Common::Point(177, 201));
+
+ if (_globals->getFlag(44)) {
+ _globals->_player.postInit();
+ _globals->_player.setVisage(4200);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.setStrip(2);
+ _globals->_player.setPosition(Common::Point(328, 160));
+ _globals->_player._moveDiff = Common::Point(7, 4);
+ _globals->_player.disableControl();
+
+ _sceneMode = 4151;
+ setAction(&_sequenceManager, this, 4151, &_globals->_player, NULL);
+
+ _hotspot1.setVisage(4157);
+ _hotspot1.setPosition(Common::Point(177, 201));
+ } else {
+ _globals->_player.postInit();
+ _globals->_player.setVisage(4154);
+ _globals->_player._canWalk = false;
+ _globals->_player.setPosition(Common::Point(198, 202));
+ _globals->_player.disableControl();
+
+ _hotspot1.setVisage(4152);
+ setAction(&_action1);
+ _globals->setFlag(44);
+ }
+
+ if (RING_INVENTORY._rope._sceneNumber == 4150) {
+ _hotspot3.postInit();
+ _hotspot3.setVisage(4150);
+ _hotspot3.setPosition(Common::Point(175, 70));
+
+ _globals->_sceneItems.push_back(&_hotspot3);
+ }
+
+ _globals->_sceneItems.push_back(&_hotspot1);
+
+ _hotspot5.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+ _hotspot6.setBounds(Rect(28, 121, 80, 148));
+ _hotspot7.setBounds(Rect(27, 17, 127, 100));
+ _hotspot8.setBounds(Rect(62, 11, 117, 22));
+ _hotspot9.setBounds(Rect(48, 78, 104, 94));
+ _hotspot10.setBounds(Rect(32, 107, 58, 119));
+ _hotspot11.setBounds(Rect(1, 130, 17, 163));
+ _hotspot12.setBounds(Rect(1, 158, 78, 197));
+ _hotspot13.setBounds(Rect(253, 11, 274, 188));
+ _hotspot14.setBounds(Rect(4, 15, 29, 153));
+ _hotspot15.setBounds(Rect(127, 22, 146, 133));
+ _hotspot16.setBounds(Rect(165, 22, 181, 141));
+ _hotspot17.setBounds(Rect(186, 31, 217, 52));
+ _hotspot18.setBounds(Rect(200, 31, 251, 86));
+ _hotspot19.setBounds(Rect(183, 81, 234, 111));
+ _hotspot20.setBounds(Rect(188, 120, 219, 142));
+ _hotspot21.setBounds(Rect(235, 122, 249, 145));
+ _hotspot22.setBounds(Rect(283, 125, 320, 146));
+ _hotspot23.setBounds(Rect(284, 27, 306, 160));
+ _hotspot24.setBounds(Rect(257, 72, 284, 99));
+ _hotspot25.setBounds(Rect(183, 155, 316, 190));
+ _hotspot26.setBounds(Rect(98, 169, 238, 198));
+
+ _globals->_sceneItems.addItems(&_hotspot24, &_hotspot23, &_hotspot13, &_hotspot25,
+ &_hotspot26, &_hotspot19, &_hotspot22, &_hotspot20, &_hotspot17, &_hotspot16,
+ &_hotspot15, &_hotspot11, &_hotspot14, &_hotspot18, &_hotspot21, &_hotspot12,
+ &_hotspot10, &_hotspot9, &_hotspot8, &_hotspot7, &_hotspot6, &_hotspot2,
+ &_hotspot5, NULL);
+
+ _globals->_soundHandler.play(165);
+ _soundHandler.play(311);
+}
+
+void Scene4150::signal() {
+ if (_sceneMode == 4151)
+ _globals->_player.enableControl();
+ else if (_sceneMode == 4152)
+ _globals->_sceneManager.changeScene(4100);
+}
+
+void Scene4150::dispatch() {
+ Scene::dispatch();
+
+ if (!_action && (_globals->_player._position.x >= 316)) {
+ _globals->_soundHandler.fadeOut(NULL);
+ _soundHandler.fadeOut(NULL);
+ _globals->_player.disableControl();
+ _sceneMode = 4152;
+ setAction(&_sequenceManager, this, 4152, &_globals->_player, NULL);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 4000 - Village
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene4250::Action1::signal() {
+ Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(3);
+ break;
+ case 1:
+ ADD_MOVER_NULL(_globals->_player, 6, 190);
+ ADD_MOVER_NULL(scene->_hotspot3, 9, 195);
+ ADD_MOVER(scene->_hotspot1, 12, 185);
+ break;
+ case 2:
+ setDelay(30);
+ break;
+ case 3:
+ scene->_stripManager.start(4450, this);
+ break;
+ case 4:
+ case 7:
+ setDelay(15);
+ break;
+ case 5:
+ ADD_PLAYER_MOVER(220, 175);
+ scene->_hotspot1.fixPriority(105);
+ ADD_PLAYER_MOVER_NULL(scene->_hotspot1, 197, 173);
+ break;
+ case 6:
+ scene->_stripManager.start(4470, this);
+ break;
+ case 8:
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene4250::Action2::signal() {
+ Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ ADD_PLAYER_MOVER(247, 182);
+ break;
+ case 1:
+ _globals->_player.setVisage(2670);
+ _globals->_player.changeZoom(50);
+ _globals->_player.setStrip(3);
+ _globals->_player.setFrame(1);
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ if ((_globals->_stripNum == 9000) || (_globals->_stripNum == 4300)) {
+ scene->_stripManager.start(4205, this);
+ } else {
+ scene->_stripManager.start(4490, this);
+ }
+ break;
+ case 3:
+ _globals->_player.animate(ANIM_MODE_6, this);
+ break;
+ case 4:
+ _globals->_player.setVisage(2602);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.changeZoom(70);
+
+ if ((_globals->_stripNum == 9000) || (_globals->_stripNum == 4300)) {
+ _globals->_player.enableControl();
+ remove();
+ } else {
+ ADD_PLAYER_MOVER(6, 180);
+ ADD_PLAYER_MOVER_NULL(scene->_hotspot1, 12, 185);
+ }
+ break;
+ case 5:
+ ADD_PLAYER_MOVER(-16, 180);
+ ADD_PLAYER_MOVER_NULL(scene->_hotspot1, -12, 185);
+ scene->_hotspot3.setStrip2(2);
+ ADD_MOVER_NULL(scene->_hotspot5, -30, 195);
+ break;
+ case 6:
+ _globals->clearFlag(59);
+ _globals->clearFlag(70);
+ _globals->clearFlag(37);
+ _globals->clearFlag(114);
+ _globals->clearFlag(36);
+ _globals->clearFlag(43);
+ _globals->_sceneManager.changeScene(2100);
+ break;
+ }
+}
+
+void Scene4250::Action3::signal() {
+ Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(3);
+ break;
+ case 1:
+ scene->_stripManager.start(4480, this);
+ break;
+ case 2:
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene4250::Action4::signal() {
+ Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(3);
+ break;
+ case 1:
+ _globals->_player.addMover(NULL);
+ scene->_stripManager.start((RING_INVENTORY._helmet._sceneNumber == 4250) ? 4259 : 4256, this);
+ break;
+ case 2:
+ ADD_PLAYER_MOVER(_globals->_player._position.x + 5, _globals->_player._position.y);
+ break;
+ case 3:
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene4250::Action5::signal() {
+ Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(3);
+ break;
+ case 1:
+ scene->_hotspot4.fixPriority(195);
+ scene->_hotspot1.fixPriority(105);
+ ADD_MOVER_NULL(_globals->_player, 6, 185);
+ ADD_MOVER_NULL(scene->_hotspot4, 9, 190);
+ ADD_MOVER(scene->_hotspot1, 12, 180);
+ break;
+ case 2:
+ ADD_PLAYER_MOVER(252, 176);
+ ADD_PLAYER_MOVER_NULL(scene->_hotspot1, 197, 173);
+ ADD_PLAYER_MOVER_NULL(scene->_hotspot4, 239, 195);
+ break;
+ case 3:
+ scene->_hotspot4.fixPriority(-1);
+ scene->_hotspot1.setStrip(5);
+ scene->_hotspot4.setStrip(7);
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene4250::Hotspot1::doAction(int action) {
+ Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4250, (RING_INVENTORY._helmet._sceneNumber == 4250) ? 19 : 14);
+ break;
+ case CURSOR_TALK:
+ _globals->_player.disableControl();
+ if (!_globals->_sceneObjects->contains(&scene->_hotspot4)) {
+ scene->setAction(&scene->_action3);
+ } else {
+ scene->_sceneMode = 4260;
+ if (RING_INVENTORY._helmet._sceneNumber == 4250) {
+ scene->_sceneMode = 4265;
+ scene->setAction(&scene->_sequenceManager, scene, 4265, this, NULL);
+ } else {
+ scene->setAction(&scene->_sequenceManager, scene,
+ _globals->_sceneObjects->contains(&scene->_hotspot6) ? 4260 : 4262, this, NULL);
+ }
+ }
+ break;
+ case OBJECT_SCANNER:
+ if (RING_INVENTORY._helmet._sceneNumber == 4250)
+ SceneItem::display2(4250, 21);
+ else
+ SceneHotspot::doAction(action);
+ break;
+ case OBJECT_STUNNER:
+ if (RING_INVENTORY._helmet._sceneNumber == 4250)
+ SceneItem::display2(4250, 22);
+ else
+ SceneHotspot::doAction(action);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4250::Hotspot2::doAction(int action) {
+ //Ship with stasis field
+ Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ case CURSOR_USE:
+ SceneItem::display2(4250, 16);
+ break;
+ case OBJECT_SCANNER:
+ if ((_globals->_stripNum == 9000) || (_globals->_stripNum == 4300))
+ scene->setAction(&scene->_action2);
+ else if (_globals->getFlag(55))
+ SceneItem::display2(4250, 17);
+ else {
+ _globals->setFlag(55);
+ scene->setAction(&scene->_action2);
+ }
+ break;
+ case OBJECT_STASIS_NEGATOR:
+ _globals->_player.disableControl();
+ scene->_sceneMode = 4252;
+ scene->setAction(&scene->_sequenceManager, scene, 4252, &_globals->_player, this, NULL);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4250::Hotspot4::doAction(int action) {
+ Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4250, (RING_INVENTORY._helmet._sceneNumber == 4250) ? 18 : 5);
+ break;
+ case OBJECT_SCANNER:
+ if (RING_INVENTORY._helmet._sceneNumber == 4250)
+ SceneItem::display2(4250, 21);
+ else
+ SceneHotspot::doAction(action);
+ break;
+ case OBJECT_STUNNER:
+ if (RING_INVENTORY._helmet._sceneNumber == 4250)
+ SceneItem::display2(4250, 22);
+ else
+ SceneHotspot::doAction(action);
+ break;
+ case CURSOR_TALK:
+ _globals->_player.disableControl();
+ if (!_globals->_sceneObjects->contains(&scene->_hotspot6)) {
+ scene->_sceneMode = 4254;
+ scene->setAction(&scene->_sequenceManager, scene, 4263, NULL);
+ } else {
+ scene->_sceneMode = 4254;
+
+ if (RING_INVENTORY._helmet._sceneNumber == 4250) {
+ scene->_sceneMode = 4266;
+ scene->setAction(&scene->_sequenceManager, scene, 4266, this, NULL);
+ } else {
+ scene->setAction(&scene->_sequenceManager, scene,
+ (RING_INVENTORY._concentrator._sceneNumber == 1) ? 4255 : 4254, NULL);
+ }
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4250::Hotspot6::doAction(int action) {
+ Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4250, (RING_INVENTORY._helmet._sceneNumber == 4250) ? 7 : 6);
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(4250, (RING_INVENTORY._helmet._sceneNumber == 4250) ? 1 : 2);
+ break;
+ case OBJECT_STUNNER:
+ SceneItem::display2(4250, (RING_INVENTORY._helmet._sceneNumber == 4250) ? 20 : 3);
+ break;
+ case OBJECT_HELMET:
+ _globals->_soundHandler.play(354);
+ _globals->_player.disableControl();
+ RING_INVENTORY._helmet._sceneNumber = 4250;
+
+ if (RING_INVENTORY._concentrator._sceneNumber == 1) {
+ if (_globals->getFlag(115)) {
+ scene->_sceneMode = 4269;
+ scene->setAction(&scene->_sequenceManager, scene, 4269, this, NULL);
+ } else {
+ _globals->setFlag(115);
+ _globals->_events.setCursor(CURSOR_WALK);
+ scene->_sceneMode = 4256;
+ scene->setAction(&scene->_sequenceManager, scene, 4256, this, NULL);
+ }
+ } else if (RING_INVENTORY._keyDevice._sceneNumber == 1) {
+ scene->_sceneMode = 4267;
+ scene->setAction(&scene->_sequenceManager, scene, 4267, this, NULL);
+ } else if (RING_INVENTORY._keyDevice._sceneNumber == 4300) {
+ scene->_sceneMode = 4268;
+ scene->setAction(&scene->_sequenceManager, scene, 4268, this, NULL);
+ } else {
+ _globals->_events.setCursor(CURSOR_WALK);
+ ADD_MOVER_NULL(scene->_hotspot1, 241, 169);
+ scene->_sceneMode = 4261;
+ scene->setAction(&scene->_sequenceManager, scene, 4261, &_globals->_player, this, NULL);
+ }
+ break;
+ case OBJECT_NULLIFIER:
+ if (RING_INVENTORY._helmet._sceneNumber == 4250) {
+ _globals->_soundHandler.play(353);
+ _globals->_player.disableControl();
+ RING_INVENTORY._helmet._sceneNumber = 1;
+
+ scene->_sceneMode = 4257;
+ scene->setAction(&scene->_sequenceManager, scene, 4257, &_globals->_player, this, NULL);
+ } else {
+ SceneItem::display2(4250, 4);
+ }
+ break;
+ case CURSOR_TALK:
+ if (RING_INVENTORY._helmet._sceneNumber == 4250)
+ doAction(OBJECT_HELMET);
+ else {
+ _globals->_player.disableControl();
+ scene->_sceneMode = 4264;
+ scene->setAction(&scene->_sequenceManager, scene, 4264, this, NULL);
+ }
+ break;
+ case CURSOR_USE:
+ if (RING_INVENTORY._helmet._sceneNumber == 4250)
+ doAction(OBJECT_HELMET);
+ else {
+ _globals->_player.disableControl();
+ if ((RING_INVENTORY._items._sceneNumber != 1) || (RING_INVENTORY._concentrator._sceneNumber != 1)) {
+ scene->_sceneMode = 4258;
+ scene->setAction(&scene->_sequenceManager, scene, 4258, this, NULL);
+ } else {
+ scene->_hotspot2.postInit();
+ scene->_hotspot2.setVisage(4251);
+ scene->_hotspot2.setFrame(scene->_hotspot2.getFrameCount());
+ scene->_hotspot2.setPosition(Common::Point(267, 172));
+ scene->_hotspot2.hide();
+
+ scene->_sceneMode = 4259;
+ scene->setAction(&scene->_sequenceManager, scene, 4259, &_globals->_player, this, &scene->_hotspot2, NULL);
+ }
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4250::Hotspot8::doAction(int action) {
+ Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ case CURSOR_USE:
+ _globals->_sceneManager.changeScene(4300);
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(4250, 24);
+ break;
+ case OBJECT_STUNNER:
+ SceneItem::display2(4250, 25);
+ break;
+ case OBJECT_STASIS_NEGATOR:
+ _globals->_player.disableControl();
+ scene->_sceneMode = 4270;
+ scene->setAction(&scene->_sequenceManager, scene,
+ (RING_INVENTORY._helmet._sceneNumber == 4250) ? 4270 : 4271, NULL);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene4250::Scene4250() :
+ _hotspot7(0, CURSOR_LOOK, 4250, 0, LIST_END) {
+}
+
+void Scene4250::postInit(tSage::SceneObjectList *OwnerList) {
+ loadScene(4250);
+ Scene::postInit();
+ setZoomPercents(160, 90, 185, 100);
+
+ _stripManager.addSpeaker(&_speakerSR);
+ _stripManager.addSpeaker(&_speakerSL);
+ _stripManager.addSpeaker(&_speakerSText);
+ _stripManager.addSpeaker(&_speakerGameText);
+ _stripManager.addSpeaker(&_speakerQL);
+ _stripManager.addSpeaker(&_speakerQR);
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerPText);
+ _stripManager.addSpeaker(&_speakerMText);
+ _stripManager.addSpeaker(&_speakerFLText);
+
+ _speakerSText.setTextPos(Common::Point(40, 40));
+ _speakerPText.setTextPos(Common::Point(40, 100));
+ _hotspot8._sceneRegionId = 16;
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(2602);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.setPosition(Common::Point(-13, 190));
+ _globals->_player.changeZoom(-1);
+ _globals->_player._moveDiff = Common::Point(4, 1);
+
+ _hotspot1.postInit();
+ _hotspot1.setVisage(2801);
+ _hotspot1.animate(ANIM_MODE_1, NULL);
+ _hotspot1.setObjectWrapper(new SceneObjectWrapper());
+ _hotspot1.setPosition(Common::Point(-18, 185));
+ _hotspot1.changeZoom(-1);
+ _hotspot1._moveDiff = Common::Point(4, 1);
+ _globals->_sceneItems.push_back(&_hotspot1);
+
+ if (_globals->_sceneManager._previousScene == 4300) {
+ _hotspot5.postInit();
+ _hotspot5.setVisage(4250);
+ _hotspot5.setPosition(Common::Point(268, 168));
+ _hotspot5.fixPriority(1);
+
+ _hotspot4.postInit();
+ _hotspot4.setVisage(2701);
+ _hotspot4.animate(ANIM_MODE_1, NULL);
+ _hotspot4.setObjectWrapper(new SceneObjectWrapper());
+ _hotspot4.setPosition(Common::Point(272, 175));
+ _hotspot4.setStrip(2);
+ _hotspot4._moveDiff = Common::Point(4, 1);
+ _hotspot4.changeZoom(70);
+ _globals->_sceneItems.push_back(&_hotspot4);
+
+ _hotspot1.setPosition(Common::Point(197, 173));
+ _hotspot1.changeZoom(70);
+
+ _globals->_player.setPosition(Common::Point(252, 176));
+ _globals->_player.changeZoom(70);
+
+ _hotspot6.postInit();
+ _hotspot6.setVisage(4302);
+ _hotspot6.setStrip(4);
+ _hotspot6.setFrame(3);
+ _hotspot6.changeZoom(50);
+ _hotspot6.fixPriority(70);
+ _hotspot6.setPosition(Common::Point(261, 175));
+
+ if (RING_INVENTORY._helmet._sceneNumber == 4250) {
+ _hotspot6.setStrip(6);
+ _hotspot6.setFrame(_hotspot6.getFrameCount());
+ }
+
+ if (_globals->getFlag(98)) {
+ _globals->_sceneItems.push_front(&_hotspot6);
+ } else {
+ _hotspot6.hide();
+ if ((_globals->_stripNum == 4300) || (_globals->_stripNum == 4301)) {
+ _globals->setFlag(98);
+ _globals->_player.setVisage(4302);
+ _globals->_player.setStrip(5);
+ _globals->_player.changeZoom(50);
+ _globals->_player.disableControl();
+
+ _hotspot4.setPosition(Common::Point(239, 195));
+ _sceneMode = 4253;
+ _globals->_sceneItems.push_front(&_hotspot6);
+
+ setAction(&_sequenceManager, this, 4253, &_globals->_player, &_hotspot6, &_hotspot4, NULL);
+ }
+ }
+ } else if (_globals->_stripNum == 9000) {
+ _hotspot4.postInit();
+ _hotspot4.setVisage(2701);
+ _hotspot4.animate(ANIM_MODE_1, NULL);
+ _hotspot4.setObjectWrapper(new SceneObjectWrapper());
+ _hotspot4.setPosition(Common::Point(-15, 195));
+ _hotspot4._moveDiff = Common::Point(4, 1);
+ _globals->_sceneItems.push_back(&_hotspot4);
+
+ setAction(&_action5);
+ } else {
+ _hotspot3.postInit();
+ _hotspot3.setVisage(4006);
+ _hotspot3.animate(ANIM_MODE_1, NULL);
+ _hotspot3.setObjectWrapper(new SceneObjectWrapper());
+ _hotspot3.setPosition(Common::Point(-15, 195));
+ _hotspot3.setStrip2(3);
+ _hotspot3._moveDiff = Common::Point(4, 1);
+
+ setAction(&_action1);
+ _globals->clearFlag(43);
+ _globals->clearFlag(114);
+ _globals->clearFlag(36);
+ }
+
+ if (_globals->getFlag(17)) {
+ _globals->_sceneItems.push_back(&_hotspot8);
+ } else {
+ _hotspot2.postInit();
+ _hotspot2.setVisage(4251);
+ _hotspot2.setStrip2(1);
+ _hotspot2.fixPriority(2);
+ _hotspot2.setFrame(1);
+ _hotspot2.setPosition(Common::Point(267, 172));
+
+ _globals->_sceneItems.push_back(&_hotspot2);
+ }
+
+ _hotspot7.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+ _globals->_sceneItems.push_back(&_hotspot7);
+ _globals->_soundHandler.play(185);
+}
+
+void Scene4250::signal() {
+ switch (_sceneMode) {
+ case 4252:
+ _globals->setFlag(17);
+ _globals->_sceneManager.changeScene(4301);
+ break;
+ case 4253:
+ if (_globals->_stripNum == 4301) {
+ _sceneMode = 4261;
+ ADD_MOVER_NULL(_hotspot1, 241, 169);
+ setAction(&_sequenceManager, this, 4261, &_globals->_player, &_hotspot6, NULL);
+ } else {
+ _globals->_player.enableControl();
+ }
+ break;
+ case 4254:
+ case 4256:
+ case 4257:
+ case 4258:
+ case 4260:
+ case 4264:
+ case 4265:
+ case 4266:
+ case 4267:
+ case 4268:
+ case 4269:
+ case 4270:
+ _globals->_player.enableControl();
+ break;
+ case 4259:
+ _globals->_soundHandler.play(360);
+ _globals->_sceneManager.changeScene(9900);
+ break;
+ case 4261:
+ RING_INVENTORY._keyDevice._sceneNumber = 1;
+ _globals->_player.enableControl();
+ break;
+ case 4255:
+ case 4262:
+ case 4263:
+ default:
+ break;
+ }
+}
+
+void Scene4250::dispatch() {
+ if (_globals->_player.getRegionIndex() == 8)
+ _globals->_player.changeZoom(90 - (_globals->_player._position.y - 153));
+ if (_globals->_player.getRegionIndex() == 12)
+ _globals->_player.changeZoom(70);
+ if (_globals->_player.getRegionIndex() == 15) {
+ _globals->_player.changeZoom(-1);
+ _globals->_player.fixPriority(-1);
+ }
+
+ if (_hotspot1.getRegionIndex() == 8)
+ _hotspot1.changeZoom(90 - (_hotspot1._position.y - 153));
+ if (_hotspot1.getRegionIndex() == 12)
+ _hotspot1.changeZoom(70);
+ if (_hotspot1.getRegionIndex() == 15) {
+ _hotspot1.changeZoom(-1);
+ _hotspot1.fixPriority(-1);
+ }
+
+ if (_hotspot4.getRegionIndex() == 8)
+ _hotspot4.changeZoom(90 - (_hotspot4._position.y - 153));
+ if (_hotspot4.getRegionIndex() == 12)
+ _hotspot4.changeZoom(70);
+ if (_hotspot4.getRegionIndex() == 15) {
+ _hotspot4.changeZoom(-1);
+ _hotspot4.fixPriority(-1);
+ }
+
+ Scene::dispatch();
+
+ if (!_action) {
+ if (!_globals->getFlag(55) && (_globals->_player.getRegionIndex() == 12)) {
+ setAction(&_action4);
+ }
+
+ if (_globals->_sceneObjects->contains(&_hotspot6) && (_globals->_player.getRegionIndex() == 12))
+ setAction(&_action4);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 4300 - Village - Slaver Ship
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene4300::Action1::signal() {
+ Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->setFlag(56);
+ _globals->_scenePalette.addRotation(240, 254, -1);
+ scene->_hotspot7.animate(ANIM_MODE_6, this);
+ _globals->_soundHandler.play(164);
+ break;
+ case 1:
+ _globals->_soundHandler.play(340);
+ scene->_soundHandler1.play(341);
+ scene->_hotspot1.remove();
+ setDelay(3);
+ break;
+ case 2:
+ scene->_soundHandler1.play(341);
+ scene->_hotspot2.remove();
+ setDelay(6);
+ break;
+ case 3:
+ scene->_soundHandler1.play(341);
+ scene->_hotspot3.remove();
+ setDelay(6);
+ break;
+ case 4:
+ scene->_soundHandler1.play(341);
+ scene->_hotspot4.remove();
+ setDelay(12);
+ break;
+ case 5:
+ scene->_soundHandler1.play(341);
+ scene->_hotspot5.remove();
+ setDelay(12);
+ break;
+ case 6:
+ scene->_soundHandler1.play(341);
+ scene->_hotspot6.remove();
+ setDelay(60);
+ break;
+ case 7:
+ scene->_hotspot10.fixPriority(250);
+ scene->_hotspot10.animate(ANIM_MODE_5, this);
+ break;
+ case 8:
+ scene->_hotspot13.show();
+ scene->_stripManager.start(8015, this, scene);
+ break;
+ case 9:
+ _globals->_soundHandler.play(350);
+ _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
+ _globals->_events.setCursor(CURSOR_USE);
+ _globals->_player.enableControl();
+
+ remove();
+ break;
+ }
+}
+
+void Scene4300::Action2::signal() {
+ Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(3);
+ break;
+ case 1:
+ scene->_stripManager.start(8016, this, scene);
+ break;
+ case 2:
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+
+/*--------------------------------------------------------------------------*/
+
+void Scene4300::Hotspot8::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4300, 15);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(4300, 18);
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(4300, 14);
+ break;
+ case OBJECT_STUNNER:
+ SceneItem::display2(4300, 19);
+ break;
+ case OBJECT_KEY_DEVICE:
+ RING_INVENTORY._keyDevice._sceneNumber = 4300;
+ _globals->_scenePalette.addRotation(240, 254, -1);
+ animate(ANIM_MODE_5, NULL);
+
+ _globals->setFlag(99);
+ _globals->_sceneItems.push_back(this);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4300::Hotspot9::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ if ((RING_INVENTORY._stasisBox2._sceneNumber == 4300) ||
+ (RING_INVENTORY._concentrator._sceneNumber == 1))
+ SceneItem::display2(4300, 7);
+ else
+ SceneItem::display2(4300, 1);
+ break;
+ case CURSOR_USE:
+ if ((RING_INVENTORY._stasisBox2._sceneNumber == 4300) ||
+ (RING_INVENTORY._concentrator._sceneNumber == 1))
+ SceneItem::display2(4300, 7);
+ else
+ SceneItem::display2(4300, 3);
+ break;
+ case OBJECT_STUNNER:
+ SceneItem::display2(4300, 24);
+ break;
+ case OBJECT_SCANNER:
+ if ((RING_INVENTORY._stasisBox2._sceneNumber == 4300) ||
+ (RING_INVENTORY._concentrator._sceneNumber != 1))
+ SceneItem::display2(4300, 22);
+ else
+ SceneItem::display2(4300, 23);
+ break;
+ default:
+ NamedHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4300::Hotspot10::doAction(int action) {
+ // Alien
+ Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4300, 2);
+ break;
+ case CURSOR_TALK:
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_action2);
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(4300, 20);
+ break;
+ case OBJECT_STUNNER:
+ SceneItem::display2(4300, 21);
+ break;
+ case CURSOR_USE:
+ case OBJECT_HELMET:
+ _globals->_stripNum = (action == CURSOR_USE) ? 4300 : 4301;
+ _globals->_events.setCursor(CURSOR_NONE);
+ _globals->_sceneManager.changeScene(4250);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4300::Hotspot15::signal() {
+ Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene;
+
+ scene->_soundHandler2.play(345);
+
+ _strip = (_globals->_randomSource.getRandomNumber(6) < 2) ? 2 : 1;
+ if ((RING_INVENTORY._stasisBox2._sceneNumber == 4300) ||
+ (RING_INVENTORY._concentrator._sceneNumber == 1)) {
+ setStrip(1);
+ setFrame(1);
+ animate(ANIM_MODE_NONE, NULL);
+ } else {
+ animate(ANIM_MODE_5, this);
+ }
+}
+
+void Scene4300::Hotspot16::doAction(int action) {
+ Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4300, 8);
+ break;
+ case CURSOR_USE:
+ if ((RING_INVENTORY._stasisBox2._sceneNumber != 4300) &&
+ (RING_INVENTORY._concentrator._sceneNumber != 4300)) {
+ SceneItem::display2(4300, 16);
+ } else {
+ scene->_sceneMode = 4302;
+ scene->setAction(&scene->_sequenceManager, scene, 4302, this, NULL);
+ }
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(4300, 27);
+ break;
+ case OBJECT_STUNNER:
+ SceneItem::display2(4300, 24);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene4300::Hotspot17::doAction(int action) {
+ Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4300, (RING_INVENTORY._stasisBox2._sceneNumber == 4300) ? 17 : 11);
+ break;
+ case CURSOR_USE:
+ if (RING_INVENTORY._stasisBox2._sceneNumber != 4300)
+ SceneItem::display2(4300, 13);
+ else {
+ _globals->_scenePalette.clearListeners();
+ remove();
+
+ SceneItem::display2(4300, 12);
+ RING_INVENTORY._concentrator._sceneNumber = 1;
+ }
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(4300, 25);
+ break;
+ case OBJECT_STUNNER:
+ SceneItem::display2(4300, 26);
+ break;
+ case OBJECT_STASIS_BOX2:
+ scene->_soundHandler1.play(352);
+ _globals->_events.setCursor(CURSOR_USE);
+ scene->_sceneMode = 4303;
+
+ scene->setAction(&scene->_sequenceManager, scene, 4303, this, NULL);
+ break;
+ }
+}
+
+void Scene4300::Hotspot19::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4300, 9);
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(4300, 28);
+ break;
+ case OBJECT_STUNNER:
+ SceneItem::display2(4300, 24);
+ break;
+ case CURSOR_USE:
+ if ((RING_INVENTORY._stasisBox2._sceneNumber != 4300) &&
+ (RING_INVENTORY._concentrator._sceneNumber != 4300))
+ SceneItem::display2(4300, 10);
+ else
+ SceneItem::display2(4300, 29);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene4300::Scene4300() :
+ _hotspot18(0, CURSOR_LOOK, 4300, 0, LIST_END) {
+}
+
+void Scene4300::postInit(SceneObjectList *OwnerList) {
+ loadScene(4300);
+ Scene::postInit();
+ setZoomPercents(0, 100, 200, 100);
+
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerSText);
+ _stripManager.addSpeaker(&_speakerMText);
+ _stripManager.addSpeaker(&_speakerFLText);
+
+ _hotspot11.setup(76, 97, 102, 127, 4300, 5, 6);
+
+ _hotspot7.postInit();
+ _hotspot7.setPosition(Common::Point(90, 128));
+ _hotspot7.setVisage(4303);
+ _hotspot7.fixPriority(250);
+ _globals->_sceneItems.push_back(&_hotspot7);
+
+ _hotspot9.setup(120, 49, 174, 91, 4300, -1, -1);
+
+ _hotspot15.postInit();
+ _hotspot15.setVisage(4300);
+ _hotspot15.setPosition(Common::Point(149, 79));
+ _hotspot15.signal();
+
+ if (!_globals->getFlag(99)) {
+ _hotspot8.postInit();
+ _hotspot8.setVisage(4300);
+ _hotspot8.setStrip(3);
+ _hotspot8.setPosition(Common::Point(196, 47));
+ _globals->_sceneItems.push_back(&_hotspot8);
+ }
+
+ if (RING_INVENTORY._concentrator._sceneNumber == 4300) {
+ _hotspot17.postInit();
+ _hotspot17.setVisage(4300);
+ _hotspot17.setStrip(6);
+ _hotspot17.fixPriority(1);
+ _hotspot17.setPosition(Common::Point(200, 69));
+
+ if (RING_INVENTORY._stasisBox2._sceneNumber == 4300)
+ _hotspot17.setFrame(_hotspot17.getFrameCount());
+
+ _globals->_sceneItems.push_back(&_hotspot17);
+ }
+
+ if (!_globals->getFlag(98)) {
+ _hotspot10.postInit();
+ _hotspot10.setVisage(4302);
+ _hotspot10.setPosition(Common::Point(244, 179));
+ _hotspot10.fixPriority(100);
+ _globals->_sceneItems.push_back(&_hotspot10);
+
+ _hotspot12.postInit();
+ _hotspot12.setVisage(4302);
+ _hotspot12.setStrip2(3);
+ _hotspot12.setPosition(Common::Point(231, 185));
+ _hotspot12.fixPriority(251);
+ _hotspot12.hide();
+
+ _hotspot13.postInit();
+ _hotspot13.hide();
+ _hotspot13.setVisage(4302);
+ _hotspot13.setStrip2(2);
+ _hotspot13.setPosition(Common::Point(256, 168));
+ _hotspot13.fixPriority(251);
+ _hotspot13._numFrames = 1;
+ _hotspot13.animate(ANIM_MODE_8, 0, NULL);
+ }
+
+ if (RING_INVENTORY._items._sceneNumber == 4300) {
+ _hotspot16.postInit();
+ _hotspot16.setVisage(4300);
+ _hotspot16.setPosition(Common::Point(169, 141));
+ _hotspot16.fixPriority(1);
+ _hotspot16.setStrip(4);
+ _globals->_sceneItems.push_back(&_hotspot16);
+ }
+
+ if (_globals->_sceneManager._previousScene == 4301) {
+ _globals->_player.disableControl();
+ _hotspot7.setFrame(_hotspot7.getFrameCount());
+
+ _hotspot1.postInit();
+ _hotspot1.setVisage(4301);
+ _hotspot1.fixPriority(145);
+ _hotspot1.setPosition(Common::Point(160, 64));
+
+ _hotspot2.postInit();
+ _hotspot2.setVisage(4301);
+ _hotspot2.setStrip2(2);
+ _hotspot2.fixPriority(140);
+ _hotspot2.setPosition(Common::Point(166, 90));
+
+ _hotspot3.postInit();
+ _hotspot3.setVisage(4301);
+ _hotspot3.setStrip2(3);
+ _hotspot3.fixPriority(135);
+ _hotspot3.setPosition(Common::Point(173, 114));
+
+ _hotspot4.postInit();
+ _hotspot4.setVisage(4301);
+ _hotspot4.setStrip2(4);
+ _hotspot4.fixPriority(130);
+ _hotspot4.setPosition(Common::Point(187, 141));
+
+ _hotspot5.postInit();
+ _hotspot5.setVisage(4301);
+ _hotspot5.setStrip2(5);
+ _hotspot5.fixPriority(125);
+ _hotspot5.setPosition(Common::Point(201, 164));
+
+ _hotspot6.postInit();
+ _hotspot6.setVisage(4301);
+ _hotspot6.setStrip2(6);
+ _hotspot6.fixPriority(120);
+ _hotspot6.setPosition(Common::Point(219, 186));
+
+ setAction(&_action1);
+ } else {
+ _globals->_player.disableControl();
+ _sceneMode = 4304;
+ setAction(&_sequenceManager, this, 4304, NULL);
+ }
+
+ _hotspot10.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+ _hotspot19._sceneRegionId = 0;
+ _globals->_sceneItems.push_back(&_hotspot19);
+ _globals->_sceneItems.push_back(&_hotspot18);
+}
+
+void Scene4300::stripCallback(int v) {
+ switch (v) {
+ case 1:
+ _hotspot12.show();
+ _hotspot12.animate(ANIM_MODE_7, 0, NULL);
+ break;
+ case 2:
+ _hotspot12.hide();
+ break;
+ }
+}
+
+void Scene4300::remove() {
+ _globals->_scenePalette.clearListeners();
+ Scene::remove();
+}
+
+void Scene4300::signal() {
+ switch (_sceneMode) {
+ case 4302:
+ RING_INVENTORY._items._sceneNumber = 1;
+ _hotspot16.remove();
+ _globals->_player.enableControl();
+ break;
+ case 4303:
+ RING_INVENTORY._stasisBox2._sceneNumber = 4300;
+ _hotspot15.setStrip(1);
+ _hotspot15.setFrame(1);
+ _hotspot15.animate(ANIM_MODE_NONE, NULL);
+ break;
+ case 4304:
+ _hotspot14.postInit();
+ _hotspot14.setVisage(4300);
+ _hotspot14.setStrip(7);
+ _hotspot14.setPosition(Common::Point(60, 199));
+
+ _gfxButton.setText(EXIT_MSG);
+ _gfxButton._bounds.center(60, 193);
+ _gfxButton.draw();
+ _gfxButton._bounds.expandPanes();
+
+ _globals->_player.enableControl();
+ _globals->_scenePalette.addRotation(240, 254, -1);
+ break;
+ }
+}
+
+void Scene4300::dispatch() {
+ if (_action)
+ _action->dispatch();
+}
+
+void Scene4300::process(Event &event) {
+ Scene::process(event);
+ if (_gfxButton.process(event))
+ _globals->_sceneManager.changeScene(4250);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 4301 - Village - Slaver Ship Keypad
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene4301::Action1::synchronize(Serializer &s) {
+ Action::synchronize(s);
+ s.syncAsSint16LE(_field34E);
+ for (int idx = 0; idx < 6; ++idx)
+ s.syncAsSint16LE(_indexList[idx]);
+}
+
+void Scene4301::Action1::remove() {
+ Scene4301 *scene = (Scene4301 *)_globals->_sceneManager._scene;
+ _globals->_player.enableControl();
+
+ for (_state = 0; _state < 6; ++_state)
+ _buttonList[_state].remove();
+
+ scene->_hotspot3.remove();
+ scene->_hotspot2.remove();
+
+ scene->_hotspot1.animate(ANIM_MODE_6, NULL);
+ Action::remove();
+}
+
+void Scene4301::Action1::signal() {
+ Scene4301 *scene = (Scene4301 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ scene->_soundHandler.play(164);
+ scene->_hotspot1.animate(ANIM_MODE_5, this);
+ break;
+ case 1:
+ _globals->_soundHandler.play(335);
+ _globals->_events.setCursor(CURSOR_USE);
+
+ scene->_hotspot2.postInit();
+ scene->_hotspot2.setVisage(4303);
+ scene->_hotspot2.setStrip(2);
+ scene->_hotspot2.setFrame(1);
+ scene->_hotspot2.setPosition(Common::Point(30, 15));
+ scene->_hotspot2.fixPriority(255);
+
+ scene->_hotspot3.postInit();
+ scene->_hotspot3.setVisage(4303);
+ scene->_hotspot3.setStrip(2);
+ scene->_hotspot3.setFrame(2);
+ scene->_hotspot3.setPosition(Common::Point(48, 29));
+ scene->_hotspot3.fixPriority(255);
+ scene->_hotspot3.hide();
+
+ _field34E = 0;
+ _state = 0;
+ _actionIndex = 2;
+ break;
+ case 10:
+ // Puzzle: Wrong code
+ _globals->_events.setCursor(CURSOR_NONE);
+ scene->_soundHandler.play(337);
+ if (scene->_hotspot3._flags & OBJFLAG_HIDE)
+ scene->_hotspot3.show();
+ else
+ scene->_hotspot3.hide();
+ setDelay(20);
+
+ if (_state <= 8)
+ _actionIndex = 10;
+ ++_state;
+ break;
+ case 11:
+ for (_state = 0; _state < 6; ++_state)
+ _buttonList[_state].remove();
+
+ scene->_soundHandler.play(338);
+ scene->_hotspot3.hide();
+
+ _actionIndex = 2;
+ _state = 0;
+ _globals->_events.setCursor(CURSOR_USE);
+ break;
+ case 20:
+ // Puzzle: Correct code
+ _globals->_player.disableControl();
+ scene->_soundHandler.play(339);
+ scene->_hotspot3._frame = 3;
+ if (scene->_hotspot3._flags & OBJFLAG_HIDE)
+ scene->_hotspot3.show();
+ else
+ scene->_hotspot3.hide();
+
+ if (_state <= 8)
+ _actionIndex = 20;
+ ++_state;
+
+ setDelay(20);
+ break;
+ case 21:
+ scene->_field68E = true;
+ remove();
+ break;
+ }
+}
+
+void Scene4301::Action1::process(Event &event) {
+ // Puzzle
+ Scene4301 *scene = (Scene4301 *)_globals->_sceneManager._scene;
+ Rect buttonsRect;
+
+ Action::process(event);
+ if (event.handled || (_actionIndex != 2))
+ return;
+
+ buttonsRect = Rect(14, 35, 112, 100);
+ buttonsRect.translate(30, 15);
+
+ if ((event.eventType == EVENT_BUTTON_DOWN) && buttonsRect.contains(event.mousePos)) {
+ event.handled = true;
+ scene->_soundHandler.play(336);
+
+ int buttonIndex = ((event.mousePos.y - buttonsRect.top) / 33) * 3 +
+ ((event.mousePos.x - buttonsRect.left) / 33);
+
+ _buttonList[_state].postInit();
+ _buttonList[_state].setVisage(4303);
+ _buttonList[_state].setStrip(buttonIndex + 3);
+ _buttonList[_state].setFrame(1);
+ _buttonList[_state].setPosition(Common::Point((_state % 3) * 25 + 55, (_state / 3) * 25 + 121));
+ _buttonList[_state].fixPriority(255);
+ _buttonList[_state]._numFrames = 25;
+ _buttonList[_state].animate(ANIM_MODE_5, NULL);
+
+ _indexList[_state++] = buttonIndex;
+
+ if (_state == 6) {
+ // Six buttons pressed
+ if ((_indexList[0] == 2) && (_indexList[1] == 3) && (_indexList[2] == 0) &&
+ (_indexList[3] == 4) && (_indexList[4] == 1) && (_indexList[5] == 5)) {
+ // Entered the correct full combination
+ _state = 0;
+ _actionIndex = 20;
+ } else {
+ // Incorrect combination entered
+ _state = 0;
+ _actionIndex = 10;
+ }
+
+ signal();
+ }
+ }
+
+ if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE)) {
+ event.handled = true;
+ remove();
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene4301::Hotspot4::doAction(int action) {
+ // Hatch near door
+ Scene4301 *scene = (Scene4301 *)_globals->_sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_action1);
+ } else {
+ NamedHotspot::doAction(action);
+ }
+}
+
+void Scene4301::Hotspot5::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(4300, 0);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(4300, 30);
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(4300, 31);
+ break;
+ case OBJECT_STUNNER:
+ SceneItem::display2(4300, 32);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene4301::postInit(SceneObjectList *OwnerList) {
+ _globals->setFlag(50);
+ loadScene(4301);
+ Scene::postInit();
+ setZoomPercents(0, 100, 200, 100);
+
+ _field68E = false;
+ RING_INVENTORY._stasisBox2._sceneNumber = 1;
+ _hotspot4.setup(97, 76, 127, 102, 4300, 5, 6);
+
+ _hotspot1.postInit();
+ _hotspot1.setPosition(Common::Point(90, 128));
+ _hotspot1.setVisage(4303);
+ _hotspot1._strip = 1;
+ _hotspot1._frame = 1;
+ _hotspot1.fixPriority(250);
+
+ _hotspot5.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+ _globals->_sceneItems.push_back(&_hotspot5);
+
+ _globals->_player.enableControl();
+}
+
+void Scene4301::dispatch() {
+ if (_action) {
+ _action->dispatch();
+ } else if (_field68E) {
+ _field68E = 0;
+ _globals->clearFlag(50);
+ _globals->_sceneManager._fadeMode = FADEMODE_NONE;
+ _globals->_sceneManager.setNewScene(4300);
+ }
+}
+
+} // End of namespace tSage
diff --git a/engines/tsage/ringworld/ringworld_scenes5.h b/engines/tsage/ringworld/ringworld_scenes5.h
new file mode 100644
index 0000000000..d28e809678
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_scenes5.h
@@ -0,0 +1,693 @@
+/* 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_RINGWORLD_SCENES5_H
+#define TSAGE_RINGWORLD_SCENES5_H
+
+#include "common/scummsys.h"
+#include "tsage/core.h"
+#include "tsage/converse.h"
+#include "tsage/ringworld/ringworld_logic.h"
+
+namespace tSage {
+
+class Scene4000 : public Scene {
+ /* 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();
+ };
+ class Action5 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action6 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action7 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action8 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action9 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action10 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action11 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action12 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action13 : public Action {
+ public:
+ virtual void signal();
+ };
+
+ /* Hotspots */
+ class Miranda : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot8 : public SceneObject {
+ private:
+ int _ctr;
+ public:
+ virtual void synchronize(Serializer &s) {
+ SceneObject::synchronize(s);
+ s.syncAsUint16LE(_ctr);
+ }
+ virtual void doAction(int action);
+ };
+ class GuardRock : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Ladder : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class TheTech : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot13 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot17 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot18 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot23 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3;
+ ASound _soundHandler1, _soundHandler2;
+ SpeakerQR _speakerQR;
+ SpeakerML _speakerML;
+ SpeakerMR _speakerMR;
+ SpeakerSR _speakerSR;
+ SpeakerCHFL _speakerCHFL;
+ SpeakerPL _speakerPL;
+ SpeakerPText _speakerPText;
+ SpeakerQText _speakerQText;
+ SpeakerSText _speakerSText;
+ SpeakerMText _speakerMText;
+ SpeakerCHFR _speakerCHFR;
+ SpeakerQL _speakerQL;
+ SpeakerCHFText _speakerCHFText;
+ SceneObject _smoke1, _hotspot2, _lander, _olo, _hotspot5, _rope;
+ Miranda _miranda;
+ Hotspot8 _hotspot8;
+ GuardRock _guardRock;
+ Ladder _ladder;
+ DisplayHotspot _forceField;
+ TheTech _theTech;
+ Hotspot13 _hotspot13;
+ Hotspot _hotspot14, _hotspot15, _hotspot16;
+ Hotspot17 _hotspot17;
+ Hotspot18 _hotspot18;
+ DisplayHotspot _hotspot19, _hotspot20, _hotspot21, _hotspot22;
+ Hotspot23 _hotspot23;
+ DisplayHotspot _hotspot24, _hotspot25, _hotspot26;
+ SceneObject _smoke2;
+ 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;
+
+ Scene4000();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene4010 : public Scene {
+public:
+ SequenceManager _sequenceManager;
+ SpeakerQText _speakerQText;
+ SpeakerSText _speakerSText;
+ SpeakerMText _speakerMText;
+ SceneObject _hotspot1, _hotspot2;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
+
+class Scene4025 : public Scene {
+ /* Custom classes */
+ class Peg;
+
+ class Hole : public SceneObject {
+ public:
+ Peg *_pegPtr;
+ int _armStrip;
+ Common::Point _newPosition;
+
+ virtual void synchronize(Serializer &s);
+ virtual void doAction(int action);
+ };
+ class Peg : public SceneObject {
+ public:
+ int _field88;
+ int _armStrip;
+
+ Peg() : SceneObject() { _field88 = 0; _armStrip = 3; }
+ virtual void synchronize(Serializer &s);
+ virtual void doAction(int action);
+ };
+
+ /* 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();
+ };
+public:
+ SequenceManager _sequenceManager;
+ GfxButton _gfxButton;
+ SceneObject _armHotspot;
+ Hole _hole1, _hole2, _hole3, _hole4, _hole5;
+ Peg _peg1, _peg2, _peg3, _peg4, _peg5;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Peg *_pegPtr, *_pegPtr2;
+ Hole *_holePtr;
+
+ Scene4025();
+ 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 Scene4045 : public Scene {
+ /* 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();
+ };
+
+ /* Hotspots */
+ class OlloStand : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Miranda : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Necklace : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+
+public:
+ SequenceManager _sequenceManager;
+ SpeakerQR _speakerQR;
+ SpeakerML _speakerML;
+ SpeakerPR _speakerPR;
+ SpeakerPText _speakerPText;
+ SpeakerQText _speakerQText;
+ SpeakerQL _speakerQL;
+ OlloStand _olloStand;
+ Miranda _miranda;
+ DisplayHotspot _flame;
+ SceneObject _hotspot4, _olloFace;
+ Necklace _necklace;
+ DisplayHotspot _hotspot7, _hotspot8, _hotspot9, _hotspot10;
+ DisplayHotspot _hotspot11, _hotspot12, _hotspot13, _hotspot14;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+
+ Scene4045();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void stripCallback(int v);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene4050 : public Scene {
+ /* 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();
+ };
+
+ /* Hotspots */
+ class Hotspot15 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot17 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ SpeakerPText _speakerPText;
+ SpeakerQText _speakerQText;
+ SpeakerGameText _speakerGameText;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ DisplayHotspot _hotspot1, _hotspot2, _hotspot3, _hotspot4, _hotspot5;
+ DisplayHotspot _hotspot6, _hotspot7, _hotspot8, _hotspot9, _hotspot10;
+ DisplayHotspot _hotspot11, _hotspot12, _hotspot13;
+ SceneObject _hotspot14;
+ Hotspot15 _hotspot15;
+ SceneObject _hotspot16;
+ Hotspot17 _hotspot17;
+
+ Scene4050();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene4100 : public Scene {
+ /* 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();
+ };
+ class Action5 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action6 : public Action {
+ public:
+ virtual void signal();
+ };
+
+ /* Hotspots */
+ class Hotspot1 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot2 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Miranda : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Ladder : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot14 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ SequenceManager _sequenceManager;
+ SpeakerMText _speakerMText;
+ SpeakerML _speakerML;
+ SpeakerQText _speakerQText;
+ SpeakerQR _speakerQR;
+ SpeakerCHFText _speakerCHFText;
+ SpeakerCDRText _speakerCDRText;
+ SpeakerCDR _speakerCDR;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ Action5 _action5;
+ Action6 _action6;
+ Hotspot1 _hotspot1;
+ Hotspot2 _hotspot2;
+ DisplayHotspot _hotspot3, _hotspot4;
+ Miranda _miranda;
+ Ladder _ladder;
+ DisplayHotspot _hotspot7, _hotspot8, _hotspot9, _hotspot10;
+ DisplayHotspot _hotspot11, _hotspot12, _hotspot13;
+ Hotspot14 _hotspot14;
+
+ Scene4100();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene4150 : public Scene {
+ /* 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();
+ };
+
+ /* Hotspots */
+ class HotspotGroup1 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class HotspotGroup3 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class HotspotGroup6 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+
+ class Hotspot3 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+
+public:
+ SequenceManager _sequenceManager;
+ ASound _soundHandler;
+ SpeakerQText _speakerQText;
+ SpeakerQR _speakerQR;
+ SpeakerCDL _speakerCDL;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ DisplayHotspot _hotspot1, _hotspot2;
+ Hotspot3 _hotspot3;
+ SceneObject _hotspot4;
+ HotspotGroup1 _hotspot5, _hotspot6;
+ DisplayHotspot _hotspot7, _hotspot8, _hotspot9, _hotspot10, _hotspot11, _hotspot12;
+ HotspotGroup3 _hotspot13, _hotspot14, _hotspot15, _hotspot16;
+ DisplayHotspot _hotspot17, _hotspot18, _hotspot19, _hotspot20, _hotspot21;
+ DisplayHotspot _hotspot22, _hotspot23, _hotspot24;
+ HotspotGroup6 _hotspot25, _hotspot26;
+
+ Scene4150();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene4250 : public Scene {
+ /* 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();
+ };
+ class Action5 : public Action {
+ public:
+ virtual void signal();
+ };
+
+ /* Hotspots */
+ class Hotspot1 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot2 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot4 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot6 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot8 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+
+public:
+ SequenceManager _sequenceManager;
+ ASound _soundHandler;
+ SpeakerSR _speakerSR;
+ SpeakerSL _speakerSL;
+ SpeakerSText _speakerSText;
+ SpeakerGameText _speakerGameText;
+ SpeakerQL _speakerQL;
+ SpeakerQR _speakerQR;
+ SpeakerQText _speakerQText;
+ SpeakerPText _speakerPText;
+ SpeakerMText _speakerMText;
+ SpeakerFLText _speakerFLText;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ Action5 _action5;
+ Hotspot1 _hotspot1;
+ Hotspot2 _hotspot2;
+ SceneObject _hotspot3;
+ Hotspot4 _hotspot4;
+ SceneObject _hotspot5;
+ Hotspot6 _hotspot6;
+ DisplayHotspot _hotspot7;
+ Hotspot8 _hotspot8;
+
+ Scene4250();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene4300 : public Scene {
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2 : public Action {
+ public:
+ virtual void signal();
+ };
+
+ /* Hotspots */
+ class Hotspot8 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot9 : public NamedHotspot {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot10 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot15 : public SceneObject {
+ public:
+ virtual void signal();
+ };
+ class Hotspot16 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot17 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot19 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ ASound _soundHandler1, _soundHandler2;
+ SequenceManager _sequenceManager;
+ GfxButton _gfxButton;
+ SpeakerQText _speakerQText;
+ SpeakerSText _speakerSText;
+ SpeakerMText _speakerMText;
+ SpeakerFLText _speakerFLText;
+
+ SceneObject _hotspot1, _hotspot2, _hotspot3, _hotspot4;
+ SceneObject _hotspot5, _hotspot6, _hotspot7;
+ Hotspot8 _hotspot8;
+ Hotspot9 _hotspot9;
+ Hotspot10 _hotspot10;
+ NamedHotspot _hotspot11;
+ SceneObject _hotspot12, _hotspot13, _hotspot14;
+ Hotspot15 _hotspot15;
+ Hotspot16 _hotspot16;
+ Hotspot17 _hotspot17;
+ DisplayHotspot _hotspot18;
+ Hotspot19 _hotspot19;
+ Action1 _action1;
+ Action2 _action2;
+
+ Scene4300();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void stripCallback(int v);
+ virtual void remove();
+ virtual void signal();
+ virtual void dispatch();
+ virtual void process(Event &event);
+};
+
+class Scene4301 : public Scene {
+ /* Actions */
+ class Action1 : public ActionExt {
+ public:
+ SceneObject _buttonList[6];
+ int _field34E;
+ int _indexList[6];
+
+ virtual void synchronize(Serializer &s);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
+ };
+
+ /* Hotspots */
+ class Hotspot4 : public NamedHotspot {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot5 : public NamedHotspot {
+ public:
+ virtual void doAction(int action);
+ };
+
+public:
+ Common::List<int> _list1;
+ SequenceManager _sequenceManager;
+ ASound _soundHandler;
+ Action1 _action1;
+ SceneObject _hotspot1, _hotspot2, _hotspot3;
+ Hotspot4 _hotspot4;
+ Hotspot5 _hotspot5;
+ bool _field68E;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void dispatch();
+ virtual void synchronize(Serializer &s) {
+ Scene::synchronize(s);
+ s.syncAsSint16LE(_field68E);
+ }
+};
+
+
+} // End of namespace tSage
+
+#endif
diff --git a/engines/tsage/ringworld/ringworld_scenes6.cpp b/engines/tsage/ringworld/ringworld_scenes6.cpp
new file mode 100644
index 0000000000..6b335fe7c3
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_scenes6.cpp
@@ -0,0 +1,2200 @@
+/* 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/ringworld/ringworld_scenes6.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+
+namespace tSage {
+
+/*--------------------------------------------------------------------------
+ * Scene 5000 - Caverns - Entrance
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene5000::Action1::signal() {
+ // Ship landing
+ Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(10);
+ break;
+ case 1:
+ scene->_soundHandler.play(190);
+ scene->_soundHandler.holdAt(true);
+ ADD_MOVER(scene->_hotspot1, 283, 12);
+ break;
+ case 2:
+ break;
+ case 3:
+ scene->_hotspot1._moveDiff.y = 1;
+ scene->_hotspot4.setPosition(Common::Point(scene->_hotspot1._position.x,
+ scene->_hotspot1._position.y + 15));
+ scene->_hotspot4.show();
+ setDelay(15);
+ break;
+ case 4:
+ scene->_soundHandler.release();
+ ADD_MOVER(scene->_hotspot1, 233, 80);
+ break;
+ case 5:
+ scene->_hotspot3.animate(ANIM_MODE_8, 0, NULL);
+ scene->_hotspot3.show();
+ ADD_MOVER(scene->_hotspot1, 233, 90);
+ break;
+ case 6:
+ scene->_hotspot3.remove();
+ scene->_hotspot2.setPosition(Common::Point(233, 76));
+ scene->_hotspot2.show();
+ scene->_hotspot2.animate(ANIM_MODE_5, this);
+
+ scene->_hotspot4.remove();
+ break;
+ case 7:
+ setDelay(60);
+ scene->_hotspot2.remove();
+ break;
+ case 8:
+ scene->_hotspot5.show();
+ scene->_hotspot5.animate(ANIM_MODE_5, this);
+ break;
+ case 9:
+ scene->setAction(&scene->_action2);
+ break;
+ }
+}
+
+void Scene5000::Action1::dispatch() {
+ Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene;
+ Action::dispatch();
+
+ if (_actionIndex == 3) {
+ if (scene->_hotspot1._percent % 2 == 0) {
+ ++scene->_hotspot1._position.y;
+ if (scene->_hotspot1._position.x > 233)
+ --scene->_hotspot1._position.x;
+ }
+
+ scene->_hotspot1.changeZoom(++scene->_hotspot1._percent);
+ scene->_hotspot1._flags |= OBJFLAG_PANES;
+
+ if (scene->_hotspot1._percent >= 100)
+ signal();
+ }
+
+ if ((_actionIndex == 5) || (_actionIndex == 6)) {
+ scene->_hotspot4.setPosition(Common::Point(scene->_hotspot1._position.x,
+ scene->_hotspot1._position.y + 15));
+ }
+}
+
+void Scene5000::Action2::signal() {
+ Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.setPosition(Common::Point(217, 76));
+ setDelay(10);
+ break;
+ case 1:
+ _globals->_player.setStrip2(3);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ ADD_MOVER(_globals->_player, 214, 89);
+ break;
+ case 2:
+ if (!_globals->getFlag(59))
+ setAction(&scene->_action3, this);
+ _globals->_player.fixPriority(15);
+ ADD_MOVER(_globals->_player, 208, 100);
+ break;
+ case 3:
+ ADD_MOVER(_globals->_player, 213, 98);
+ break;
+ case 4:
+ _globals->_player.fixPriority(20);
+ ADD_MOVER(_globals->_player, 215, 115);
+ break;
+ case 5:
+ _globals->_player.changeZoom(47);
+ ADD_MOVER(_globals->_player, 220, 125);
+ break;
+ case 6:
+ ADD_MOVER(_globals->_player, 229, 115);
+ break;
+ case 7:
+ _globals->_player.changeZoom(-1);
+ _globals->_player.fixPriority(35);
+ ADD_MOVER(_globals->_player, 201, 166);
+ break;
+ case 8:
+ _globals->_player.updateZoom();
+ ADD_MOVER(_globals->_player, 205, 146);
+ break;
+ case 9:
+ _globals->_player.changeZoom(-1);
+ _globals->_player.fixPriority(50);
+ ADD_MOVER(_globals->_player, 220, 182);
+ break;
+ case 10:
+ _globals->_player.updateZoom();
+ ADD_MOVER(_globals->_player, 208, 163);
+ break;
+ case 11:
+ _globals->_player.changeZoom(-1);
+ _globals->_player.setStrip2(-1);
+ _globals->_player.fixPriority(-1);
+ ADD_MOVER(_globals->_player, 208, 175);
+ break;
+ case 12:
+ _globals->_player.setStrip(8);
+ _globals->_player.setFrame(1);
+ setDelay(10);
+ break;
+ case 13:
+ if (!_globals->_sceneObjects->contains(&scene->_hotspot7))
+ setDelay(10);
+ break;
+ case 14:
+ setDelay(30);
+ break;
+ case 15:
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene5000::Action3::signal() {
+ Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(10);
+ break;
+ case 1:
+ scene->_hotspot7.postInit();
+ scene->_hotspot7.setVisage(2809);
+ scene->_hotspot7.setObjectWrapper(new SceneObjectWrapper());
+ scene->_hotspot7.setPosition(Common::Point(217, 76));
+ scene->_hotspot7.changeZoom(10);
+ scene->_hotspot7.setStrip2(3);
+ scene->_hotspot7.fixPriority(200);
+ scene->_hotspot7._moveDiff.y = 2;
+ scene->_hotspot7.animate(ANIM_MODE_1, NULL);
+ ADD_MOVER(scene->_hotspot7, 214, 89);
+
+ _globals->_sceneItems.push_front(&scene->_hotspot7);
+ break;
+ case 2:
+ scene->_hotspot7.changeZoom(-1);
+ scene->_hotspot7.fixPriority(14);
+ ADD_MOVER(scene->_hotspot7, 208, 100);
+ break;
+ case 3:
+ ADD_MOVER(scene->_hotspot7, 213, 98);
+ break;
+ case 4:
+ scene->_hotspot7.fixPriority(19);
+ ADD_MOVER(scene->_hotspot7, 215, 115);
+ break;
+ case 5:
+ scene->_hotspot7.changeZoom(46);
+ ADD_MOVER(scene->_hotspot7, 220, 125);
+ break;
+ case 6:
+ ADD_MOVER(scene->_hotspot7, 229, 115);
+ break;
+ case 7:
+ scene->_hotspot7.changeZoom(-1);
+ scene->_hotspot7.fixPriority(34);
+ ADD_MOVER(scene->_hotspot7, 201, 166);
+ break;
+ case 8:
+ scene->_hotspot7.updateZoom();
+ ADD_MOVER(scene->_hotspot7, 205, 146);
+ break;
+ case 9:
+ scene->_hotspot7.changeZoom(-1);
+ scene->_hotspot7.fixPriority(49);
+ ADD_MOVER(scene->_hotspot7, 210, 182);
+ break;
+ case 10:
+ scene->_hotspot7.updateZoom();
+ ADD_MOVER(scene->_hotspot7, 208, 163);
+ break;
+ case 11:
+ scene->_hotspot7.changeZoom(-1);
+ scene->_hotspot7.setStrip2(-1);
+ scene->_hotspot7.fixPriority(-1);
+ ADD_MOVER(scene->_hotspot7, 175, 166);
+ break;
+ case 12:
+ ADD_MOVER(scene->_hotspot7, 126, 146);
+ break;
+ case 13:
+ scene->_hotspot7.setStrip(2);
+ remove();
+ break;
+ }
+}
+
+void Scene5000::Action4::signal() {
+ Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(1);
+ break;
+ case 1:
+ _globals->_player.fixPriority(50);
+ _globals->_player.setStrip2(4);
+ ADD_MOVER(_globals->_player, 210, 182);
+ break;
+ case 2:
+ ADD_MOVER(_globals->_player, 205, 146);
+ break;
+ case 3:
+ _globals->_player.fixPriority(35);
+ ADD_MOVER(_globals->_player, 201, 166);
+ break;
+ case 4:
+ ADD_MOVER(_globals->_player, 229, 115);
+ break;
+ case 5:
+ _globals->_player.fixPriority(20);
+ _globals->_player.changeZoom(47);
+ ADD_MOVER(_globals->_player, 220, 125);
+ break;
+ case 6:
+ ADD_MOVER(_globals->_player, 215, 115);
+ break;
+ case 7:
+ _globals->_player.changeZoom(-1);
+ ADD_MOVER(_globals->_player, 213, 98);
+ break;
+ case 8:
+ _globals->_player.fixPriority(15);
+ ADD_MOVER(_globals->_player, 208, 100);
+ break;
+ case 9:
+ ADD_MOVER(_globals->_player, 214, 89);
+ break;
+ case 10:
+ ADD_MOVER(_globals->_player, 217, 76);
+ break;
+ case 11:
+ _globals->_player.hide();
+ setDelay(60);
+ break;
+ case 12:
+ if (!_globals->_sceneObjects->contains(&scene->_hotspot7))
+ _globals->_sceneManager.changeScene(2320);
+ remove();
+ break;
+ }
+}
+
+void Scene5000::Action5::signal() {
+ Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ ADD_MOVER(_globals->_player, 91, 155);
+ break;
+ case 1:
+ _globals->_player.setVisage(2670);
+ _globals->_player._strip = 4;
+ _globals->_player._frame = 1;
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ SceneItem::display2(5000, _globals->_sceneObjects->contains(&scene->_hotspot7) ? 17 : 13);
+ _globals->_player.animate(ANIM_MODE_6, this);
+ break;
+ case 3:
+ _globals->_player.setVisage(0);
+ _globals->_player._strip = 8;
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+
+ _globals->_player.enableControl();
+ remove();
+ }
+}
+
+void Scene5000::Action6::signal() {
+ // Discussion between the hero and Seeker, then the hero goes back to the lander
+ Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(3);
+ break;
+ case 1:
+ _globals->_events.setCursor(CURSOR_WALK);
+ scene->_stripManager.start(2150, this);
+ break;
+ case 2:
+ _globals->_events.setCursor(CURSOR_NONE);
+ scene->setAction(&scene->_sequenceManager, this, 5001, &scene->_hotspot7, NULL);
+ break;
+ case 3:
+ ADD_PLAYER_MOVER(208, 163);
+ break;
+ case 4:
+ _globals->_player.fixPriority(50);
+ _globals->_player.setStrip2(4);
+ ADD_MOVER(_globals->_player, 210, 182);
+ break;
+ case 5:
+ _globals->_sceneManager.changeScene(2100);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene5000::Hotspot7::doAction(int action) {
+ Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(5000, 12);
+ break;
+ case CURSOR_TALK:
+ scene->setAction(&scene->_action6);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene5000::Hotspot8::doAction(int action) {
+ // Cave
+ Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(5000, 10);
+ break;
+ case OBJECT_STUNNER:
+ SceneItem::display2(5000, 14);
+ break;
+ case OBJECT_SCANNER:
+ scene->setAction(&scene->_action5);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene5000::HotspotGroup1::doAction(int action) {
+ Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene;
+
+ if (_globals->_sceneObjects->contains(&scene->_hotspot7))
+ scene->setAction(&scene->_action6);
+ else
+ SceneItem::display2(5000, 11);
+}
+/*--------------------------------------------------------------------------*/
+
+Scene5000::Scene5000() :
+ _hotspot1(0, CURSOR_LOOK, 5000, 3, LIST_END),
+ _hotspot12(0, CURSOR_LOOK, 5000, 6, CURSOR_USE, 5000, 7, OBJECT_STUNNER, 5000, 14,
+ OBJECT_SCANNER, 5000, 16, LIST_END),
+ _hotspot13(0, CURSOR_LOOK, 5000, 8, CURSOR_USE, 5000, 9, OBJECT_STUNNER, 5000, 0,
+ OBJECT_SCANNER, 5000, 16, LIST_END),
+ _hotspot14(0, CURSOR_LOOK, 5000, 8, CURSOR_USE, 5000, 9, OBJECT_STUNNER, 5000, 0,
+ OBJECT_SCANNER, 5000, 16, LIST_END),
+ _hotspot15(0, CURSOR_LOOK, 5000, 2, OBJECT_STUNNER, 5000, 15, LIST_END),
+ _hotspot16(0, CURSOR_LOOK, 5000, 4, CURSOR_USE, 5000, 5, LIST_END),
+ _hotspot17(0, CURSOR_LOOK, 5000, 1, LIST_END),
+ _hotspot18(0, CURSOR_LOOK, 5000, 0, LIST_END) {
+}
+
+
+void Scene5000::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ loadScene(5000);
+
+ _stripManager.addSpeaker(&_speakerSText);
+ _stripManager.addSpeaker(&_speakerQText);
+
+ _globals->_player.postInit();
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.setVisage(0);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player._moveDiff = Common::Point(4, 2);
+ _globals->_player.changeZoom(-1);
+ _globals->_player.disableControl();
+
+ _hotspot1.postInit();
+ _hotspot1.setVisage(5001);
+ _hotspot1.setFrame2(1);
+ _hotspot1._moveDiff = Common::Point(5, 5);
+ _hotspot1.fixPriority(10);
+ _hotspot1.changeZoom(10);
+
+ _hotspot4.postInit();
+ _hotspot4.setVisage(5001);
+ _hotspot4.setStrip2(2);
+ _hotspot4._moveDiff = Common::Point(5, 1);
+ _hotspot4.fixPriority(10);
+ _hotspot4.changeZoom(100);
+ _hotspot4.animate(ANIM_MODE_8, 0, NULL);
+ _hotspot4.hide();
+
+ _hotspot2.postInit();
+ _hotspot2.setVisage(5001);
+ _hotspot2.setStrip2(3);
+ _hotspot2._numFrames = 5;
+ _hotspot2.hide();
+
+ _hotspot3.postInit();
+ _hotspot3.setVisage(5001);
+ _hotspot3.setStrip2(5);
+ _hotspot3._numFrames = 5;
+ _hotspot3.setPosition(Common::Point(233, 76));
+ _hotspot3.hide();
+
+ _hotspot5.postInit();
+ _hotspot5.setVisage(5001);
+ _hotspot5.setStrip2(4);
+ _hotspot5._numFrames = 5;
+ _hotspot5.fixPriority(15);
+ _hotspot5.setPosition(Common::Point(218, 76));
+ _hotspot5.hide();
+
+ _hotspot9.postInit();
+ _hotspot9.setVisage(5002);
+ _hotspot9.fixPriority(80);
+ _hotspot9.setPosition(Common::Point(71, 174));
+
+ _hotspot10.postInit();
+ _hotspot10.setVisage(5002);
+ _hotspot10.setStrip2(2);
+ _hotspot10.setPosition(Common::Point(87, 120));
+
+ _hotspot11.postInit();
+ _hotspot11.setVisage(5002);
+ _hotspot11.setStrip2(2);
+ _hotspot11.setFrame(3);
+ _hotspot10.setPosition(Common::Point(93, 118));
+
+ setZoomPercents(95, 10, 145, 100);
+
+ _hotspot8.setBounds(Rect(0, 73, 87, 144));
+ _hotspot18.setBounds(Rect(54, 0, 319, 85));
+ _hotspot17.setBounds(Rect(184, 0, 199, 79));
+ _hotspot13.setBounds(Rect(0, 164, 135, 200));
+ _hotspot14.setBounds(Rect(0, 0, 105, 140));
+ _hotspot15.setBounds(Rect(266, 70, 291, 85));
+ _hotspot16.setBounds(Rect(0, 86, 319, 200));
+ _hotspot12.setBounds(Rect(230, 143, 244, 150));
+
+ _globals->_sceneItems.addItems(&_hotspot9, &_hotspot10, &_hotspot11, &_hotspot8, &_hotspot13,
+ &_hotspot14, &_hotspot12, &_hotspot15, &_hotspot17, &_hotspot18, &_hotspot16, NULL);
+
+ switch (_globals->_sceneManager._previousScene) {
+ case 1000:
+ case 2100:
+ case 2320:
+ if (_globals->getFlag(59)) {
+ _hotspot1.setPosition(Common::Point(233, 90));
+ _hotspot1.changeZoom(100);
+ _hotspot1.show();
+
+ _hotspot5.setFrame(1);
+ _hotspot5.animate(ANIM_MODE_5, NULL);
+ _hotspot5.setPosition(Common::Point(218, 76));
+ _hotspot5.show();
+
+ _globals->_player.setPosition(Common::Point(217, -10));
+ _globals->_player.disableControl();
+
+ setAction(&_action2);
+ } else {
+ _globals->_player.setPosition(Common::Point(217, -10));
+ _hotspot1.setPosition(Common::Point(320, -10));
+ _globals->_player.disableControl();
+
+ setAction(&_action1);
+ }
+ break;
+ default:
+ _globals->_player.disableControl();
+ _globals->_player.setPosition(Common::Point(0, 146));
+
+ _hotspot1.changeZoom(100);
+ _hotspot1.setPosition(Common::Point(233, 90));
+ _hotspot1.show();
+
+ _hotspot5.setFrame(_hotspot5.getFrameCount());
+ _hotspot5.show();
+
+ _sceneMode = 5004;
+ setAction(&_sequenceManager, this, 5004, &_globals->_player, NULL);
+ break;
+ }
+
+ _globals->_soundHandler.play(190);
+}
+
+void Scene5000::signal() {
+ switch (_sceneMode) {
+ case 5002:
+ case 5003:
+ case 5004:
+ _globals->_player.enableControl();
+ break;
+ case 5005:
+ _globals->_sceneManager.changeScene(5100);
+ break;
+ }
+}
+
+void Scene5000::dispatch() {
+ Scene::dispatch();
+
+ if (!_action) {
+ if (!_globals->_sceneObjects->contains(&_hotspot7) && (_globals->_player.getRegionIndex() == 10)) {
+ _globals->_player.disableControl();
+ _sceneMode = 5005;
+ setAction(&_sequenceManager, this, 5005, &_globals->_player, NULL);
+ }
+
+ if (_globals->_player.getRegionIndex() == 8) {
+ _globals->_player.disableControl();
+
+ if (_globals->_sceneObjects->contains(&_hotspot7)) {
+ _sceneMode = 5003;
+ _globals->_player.addMover(NULL);
+ setAction(&_sequenceManager, this, 5003, &_globals->_player, NULL);
+ } else {
+ setAction(&_action4);
+ }
+ }
+
+ if (_globals->_sceneObjects->contains(&_hotspot7) && (_globals->_player.getRegionIndex() == 15)) {
+ _sceneMode = 5002;
+ _globals->_player.disableControl();
+ _globals->_player.addMover(NULL);
+ setAction(&_sequenceManager, this, 5002, &_globals->_player, NULL);
+ }
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 5100 - Caverns
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene5100::Action1::signal() {
+ // Quinn enters the cave for the first time
+ Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(5);
+ break;
+ case 1:
+ ADD_MOVER(_globals->_player, 1111, 165);
+ break;
+ case 2:
+ _globals->_player.setStrip(6);
+ _globals->_player.setFrame(1);
+ setDelay(60);
+ break;
+ case 3:
+ if (_globals->getFlag(10)) {
+ _globals->_player.enableControl();
+ remove();
+ } else {
+ _globals->setFlag(10);
+ scene->_stripManager.start(5102, this);
+ }
+ break;
+ case 4:
+ scene->_soundHandler.play(206);
+
+ scene->_hotspot5.postInit();
+ scene->_hotspot5.setVisage(5362);
+ scene->_hotspot5.setPosition(Common::Point(1160, 34));
+ scene->_hotspot5.setStrip2(2);
+ scene->_hotspot5.animate(ANIM_MODE_1, NULL);
+ scene->_hotspot5.fixPriority(10);
+
+ _globals->_sceneItems.push_front(&scene->_hotspot5);
+ ADD_MOVER(scene->_hotspot5, 999, 14);
+ break;
+ case 5:
+ scene->_hotspot5.setStrip2(4);
+ scene->_hotspot5._frame = 1;
+ scene->_hotspot5.animate(ANIM_MODE_5, this);
+ break;
+ case 6:
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene5100::Action2::signal() {
+ // Quinn and Seeker exit the cave
+ Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(5);
+ break;
+ case 1:
+ if (scene->_hotspot8._visage == 2806)
+ setDelay(1);
+ else
+ scene->_hotspot8.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ if (scene->_hotspot8._visage != 2806) {
+ scene->_hotspot8.setVisage(2806);
+ scene->_hotspot8.setPosition(Common::Point(548, 193));
+ scene->_hotspot8.animate(ANIM_MODE_1, NULL);
+ scene->_hotspot8._angle = 325;
+ scene->_hotspot8.setObjectWrapper(new SceneObjectWrapper());
+ scene->_hotspot8.setStrip(8);
+ }
+
+ scene->_stripManager.start(5129, this);
+ break;
+ case 3:
+ if (_globals->_player._position.x >= 966) {
+ ADD_PLAYER_MOVER_NULL(scene->_hotspot8, 1215, 155);
+ } else {
+ ADD_PLAYER_MOVER_NULL(scene->_hotspot8, 966, 185);
+ }
+
+ if (_globals->_player._position.x >= 966) {
+ setDelay(1);
+ } else {
+ ADD_PLAYER_MOVER(966, 190);
+ }
+ break;
+ case 4:
+ ADD_PLAYER_MOVER_NULL(scene->_hotspot8, 1215, 155);
+ ADD_PLAYER_MOVER(1215, 155);
+ break;
+ case 5:
+ _globals->_sceneManager.changeScene(2100);
+ break;
+ }
+}
+
+void Scene5100::Action3::signal() {
+ // Quinns shots flesheater
+ Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->setFlag(62);
+ _globals->_player.disableControl();
+ _globals->_player.addMover(NULL);
+
+ scene->_hotspot2.addMover(NULL);
+ scene->_hotspot3.addMover(NULL);
+ _globals->_player.setVisage(2672);
+
+ if (static_cast<SceneObject *>(_owner)->_position.x >= _globals->_player._position.x)
+ _globals->_player._strip = 4;
+ else
+ _globals->_player._strip = 3;
+ _globals->_player._frame = 1;
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 1:
+ _globals->_player.setVisage(2674);
+ _globals->_player.setFrame(1);
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ scene->_soundHandler.play(28);
+ if (static_cast<SceneObject *>(_owner)->_position.x < _globals->_player._position.x) {
+ scene->_hotspot2.setVisage(5130);
+ scene->_hotspot2._strip = 1;
+ scene->_hotspot2._frame = 1;
+ scene->_hotspot2.animate(ANIM_MODE_5, this);
+ scene->_hotspot2.setAction(NULL);
+
+ scene->_hotspot3.setStrip2(1);
+ ADD_PLAYER_MOVER_NULL(scene->_hotspot3, 1200, 100);
+ } else {
+ scene->_hotspot3.setVisage(5130);
+ scene->_hotspot3._strip = 1;
+ scene->_hotspot3._frame = 1;
+ scene->_hotspot3.animate(ANIM_MODE_5, this);
+ scene->_hotspot3.setAction(NULL);
+
+ scene->_hotspot2.setStrip2(2);
+ ADD_PLAYER_MOVER_NULL(scene->_hotspot2, 10, 140);
+
+ }
+
+ _globals->_player.setVisage(2672);
+ _globals->_player._frame = _globals->_player.getFrameCount();
+ _globals->_player.animate(ANIM_MODE_6, this);
+ break;
+ case 3:
+ break;
+ case 4:
+ SceneItem::display2(5100, 38);
+ _globals->_player.enableControl();
+
+ _globals->_player.setVisage(0);
+ _globals->_player._strip = 8;
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ remove();
+ break;
+ }
+}
+
+void Scene5100::Action4::signal() {
+ Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ _globals->_player.disableControl();
+ scene->_soundHandler.play(208);
+ SceneItem::display2(5100, 15);
+
+ ObjectMover3 *mover = new ObjectMover3();
+ scene->_hotspot2.addMover(mover, &_globals->_player, 20, this);
+ break;
+ }
+ case 1:
+ scene->_hotspot1.postInit();
+ scene->_hotspot1.setVisage(5120);
+ scene->_hotspot1.setPosition(Common::Point(795, 161));
+ scene->_hotspot1._strip = 4;
+ scene->_hotspot1.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ setDelay(15);
+ break;
+ case 3:
+ _globals->_sceneManager.changeScene(5200);
+ break;
+ }
+}
+
+void Scene5100::Action5::signal() {
+ // Quinns forgot the statis box in the throne room, and goes back
+ Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(60);
+ break;
+ case 1:
+ scene->_stripManager.start(5128, this);
+ break;
+ case 2:
+ setDelay(15);
+ break;
+ case 3:
+ scene->_sceneMode = 5106;
+ scene->setAction(&scene->_sequenceManager, scene, 5106, &_globals->_player, &scene->_hotspot14, NULL);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene5100::HotspotGroup1::doAction(int action) {
+ // Flesh Eaters
+ Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(5100, _globals->getFlag(62) ? 41 : 26);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(5100, 11);
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(5100, 17);
+ break;
+ case OBJECT_STUNNER:
+ if (_globals->getFlag(62))
+ SceneItem::display2(5100, 42);
+ else
+ setAction(&scene->_action3);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene5100::Hotspot4::doAction(int action) {
+ Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(5100, 31);
+ break;
+ case CURSOR_USE:
+ _globals->_player.disableControl();
+ scene->_sceneMode = 5110;
+ scene->setAction(&scene->_sequenceManager, scene, 5110, &_globals->_player, this, &scene->_hotspot7, NULL);
+ break;
+ case CURSOR_TALK:
+ SceneItem::display2(5100, 34);
+ break;
+ case OBJECT_STUNNER:
+ SceneItem::display2(5100, 36);
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(5100, 37);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene5100::HotspotGroup2::doAction(int action) {
+ // Bat
+ Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(5100, _globals->getFlag(108) ? 47 : 23);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(5100, 29);
+ break;
+ case CURSOR_TALK:
+ if (_position.x >= 600)
+ SceneItem::display2(5100, 28);
+ else {
+ _globals->_player.disableControl();
+ scene->_sceneMode = 5114;
+ scene->setAction(&scene->_sequenceManager, scene, 5114, NULL);
+ }
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(5100, 43);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene5100::Hotspot9::doAction(int action) {
+ // Rope
+ Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(5100, 32);
+ break;
+ case CURSOR_USE:
+ _globals->_player.disableControl();
+ scene->_sceneMode = 5117;
+ scene->setAction(&scene->_sequenceManager, scene, 5117, &_globals->_player, NULL);
+ break;
+ case OBJECT_STUNNER:
+ SceneItem::display2(5100, 35);
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(5100, 44);
+ break;
+ case OBJECT_BONE:
+ _globals->_player.disableControl();
+ scene->_sceneMode = 5116;
+ scene->setAction(&scene->_sequenceManager, scene, 5116, &_globals->_player, this, &scene->_hotspot10,
+ &scene->_hotspot4, NULL);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene5100::Hotspot17::doAction(int action) {
+ // Rock blocking pit entrance
+ Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(5100, 18);
+ break;
+ case CURSOR_USE:
+ if (_globals->getFlag(67))
+ SceneItem::display2(5100, 19);
+ else {
+ _globals->_player.disableControl();
+ scene->_sceneMode = 5101;
+ scene->setAction(&scene->_sequenceManager, scene, 5101, &_globals->_player, this, NULL);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene5100::Hotspot18::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_globals->_sceneManager._previousScene != 5000) {
+ SceneItem::display2(5100, 3);
+ } else {
+ switch (_index1) {
+ case 0:
+ SceneItem::display2(5100, 0);
+ ++_index1;
+ break;
+ case 1:
+ SceneItem::display2(5100, 1);
+ ++_index1;
+ break;
+ default:
+ SceneItem::display2(5100, 2);
+ break;
+ }
+ }
+ break;
+ case CURSOR_USE:
+ switch (_index2) {
+ case 0:
+ SceneItem::display2(5100, 8);
+ ++_index2;
+ break;
+ case 1:
+ SceneItem::display2(5100, 9);
+ ++_index2;
+ break;
+ default:
+ SceneItem::display2(5100, 10);
+ break;
+ }
+ break;
+
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene5100::Hotspot19::doAction(int action) {
+ // Pillar
+ Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(5100, _globals->_sceneObjects->contains(&scene->_hotspot14) ? 27 : 20);
+ break;
+ case CURSOR_USE:
+ _globals->_player.disableControl();
+ scene->_sceneMode = 5106;
+
+ if (_globals->getFlag(66))
+ scene->setAction(&scene->_sequenceManager, scene, 5113, &_globals->_player, NULL);
+ else {
+ _globals->setFlag(66);
+ scene->setAction(&scene->_sequenceManager, scene, 5106, &_globals->_player, &scene->_hotspot14, NULL);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene5100::Hotspot20::doAction(int action) {
+ Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(5100, 21);
+ break;
+ case CURSOR_USE:
+ _globals->_player.disableControl();
+
+ if (_globals->getFlag(67)) {
+ scene->_sceneMode = 5112;
+ scene->setAction(&scene->_sequenceManager, scene, 5112, &_globals->_player, NULL);
+ } else {
+ scene->_sceneMode = 5101;
+ scene->setAction(&scene->_sequenceManager, scene, 5106, &_globals->_player, &scene->_hotspot17, NULL);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene5100::Scene5100() :
+ _hotspot16(0, CURSOR_LOOK, 5100, 48, LIST_END),
+ _hotspot21(0, CURSOR_LOOK, 5100, 4, CURSOR_USE, 5100, 5, LIST_END) {
+}
+
+void Scene5100::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ setZoomPercents(50, 10, 200, 100);
+ _sceneMode = 0;
+
+ _stripManager.addSpeaker(&_speakerMText);
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerSText);
+ _stripManager.addSpeaker(&_speakerGameText);
+ _stripManager.addSpeaker(&_speakerBatText);
+ _speakerQText._npc = &_globals->_player;
+ _speakerMText._npc = &_globals->_player;
+ _speakerSText._npc = &_hotspot8;
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(0);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.disableControl();
+
+ if ((!_globals->getFlag(66)) || (RING_INVENTORY._stasisBox._sceneNumber != 1)) {
+ _hotspot14.postInit();
+ _hotspot14.setVisage(5101);
+ _hotspot14.setPosition(Common::Point(498, 147));
+ _hotspot14.fixPriority(200);
+ _hotspot14._moveDiff.y = 10;
+ }
+
+ _hotspot17.postInit();
+ _hotspot17.setVisage(5101);
+ _hotspot17._strip = 2;
+ _hotspot17.fixPriority(200);
+
+ if (_globals->getFlag(67))
+ _hotspot17.setPosition(Common::Point(554, 192));
+ else
+ _hotspot17.setPosition(Common::Point(539, 179));
+
+ _hotspot19.setBounds(Rect(488, 115, 508, 148));
+ _hotspot21.setBounds(Rect(1150, 85, 1173, 112));
+ _hotspot20.setBounds(Rect(517, 193, 562, 200));
+ _globals->_sceneItems.addItems(&_hotspot19, &_hotspot21, NULL);
+
+ if (_globals->getFlag(67)) {
+ _globals->_sceneItems.addItems(&_hotspot20, &_hotspot17, NULL);
+ } else {
+ _globals->_sceneItems.addItems(&_hotspot17, &_hotspot20, NULL);
+ }
+
+ if (!_globals->getFlag(105)) {
+ _hotspot4.postInit();
+ _hotspot4.setVisage(5363);
+ _hotspot4.setPosition(Common::Point(1025, 65));
+ _hotspot4.setStrip(4);
+ _hotspot4.animate(ANIM_MODE_7, 0, NULL);;
+ _globals->_sceneItems.push_back(&_hotspot4);
+
+ _hotspot9.postInit();
+ _hotspot9.setVisage(5363);
+ _hotspot9.setPosition(Common::Point(966, 120));
+ _globals->_sceneItems.push_back(&_hotspot9);
+
+ _hotspot10.postInit();
+ _hotspot10.setVisage(5363);
+ _hotspot10.setPosition(Common::Point(999, 68));
+ _hotspot10.setStrip(2);
+
+ _hotspot6.postInit();
+ _hotspot6.setVisage(5362);
+ _hotspot6.setPosition(Common::Point(1017, 34));
+ _hotspot6._strip = 4;
+ _hotspot6._frame = _hotspot6.getFrameCount();
+ _globals->_sceneItems.push_back(&_hotspot6);
+ }
+
+ _hotspot16._sceneRegionId = 15;
+ _globals->_sceneItems.push_back(&_hotspot16);
+
+ if (!_globals->getFlag(62)) {
+ _hotspot2.postInit();
+ _hotspot2.setVisage(5110);
+ _hotspot2.animate(ANIM_MODE_1, NULL);
+ _hotspot2._moveDiff.x = 4;
+ _globals->_sceneItems.push_back(&_hotspot2);
+
+ _hotspot3.postInit();
+ _hotspot3.setVisage(5110);
+ _hotspot3.animate(ANIM_MODE_1, NULL);
+ _hotspot3._moveDiff.x = 4;
+ _globals->_sceneItems.push_back(&_hotspot3);
+
+ if (_globals->getFlag(61)) {
+ _hotspot2.setPosition(Common::Point(483, 189));
+ _hotspot3.setPosition(Common::Point(811, 182));
+ } else {
+ _hotspot2.setPosition(Common::Point(610, 170));
+ _hotspot3.setPosition(Common::Point(600, 180));
+ }
+ }
+
+ if (_globals->getFlag(60) && (RING_INVENTORY._stasisBox._sceneNumber == 1) &&
+ _globals->getFlag(107) && _globals->getFlag(67)) {
+ _hotspot8.postInit();
+ _hotspot8.setVisage(2806);
+ _hotspot8.setPosition(Common::Point(557, 178));
+ _hotspot8.animate(ANIM_MODE_1, NULL);
+ _hotspot8.setObjectWrapper(new SceneObjectWrapper());
+
+ _globals->clearFlag(59);
+ }
+
+ switch (_globals->_sceneManager._previousScene) {
+ case 5000:
+ default:
+ _globals->_player.setPosition(Common::Point(1184, 160));
+ setAction(&_action1);
+ break;
+ case 5200:
+ if (_globals->_stripNum == 5200) {
+ _globals->_player.setVisage(5101);
+ _globals->_player.fixPriority(200);
+ _globals->_player.setStrip(5);
+ _globals->_player.setFrame(1);
+ _globals->_player.setPosition(Common::Point(513, 199));
+
+ _sceneMode = 5108;
+ setAction(&_sequenceManager, this, 5108, &_globals->_player, NULL);
+ } else {
+ _globals->_player.setPosition(Common::Point(20, 175));
+
+ _hotspot13.postInit();
+ _hotspot13.setVisage(5110);
+ _hotspot13.setPosition(Common::Point(578, 192));
+ _hotspot13._strip = 2;
+
+ _hotspot11.postInit();
+ _hotspot11.setVisage(5110);
+ _hotspot11.setPosition(Common::Point(5, 162));
+ _hotspot11.setStrip2(1);
+ _hotspot11._moveDiff = Common::Point(4, 2);
+ _hotspot11.animate(ANIM_MODE_1, NULL);
+
+ ObjectMover2 *mover = new ObjectMover2();
+ _hotspot11.addMover(mover, 15, 20, &_globals->_player);
+
+ _hotspot12.postInit();
+ _hotspot12.setVisage(5110);
+ _hotspot12.setPosition(Common::Point(15, 164));
+ _hotspot12.setStrip2(1);
+ _hotspot12._moveDiff = Common::Point(4, 2);
+ _hotspot12.animate(ANIM_MODE_1, NULL);
+
+ ObjectMover2 *mover2 = new ObjectMover2();
+ _hotspot12.addMover(mover2, 25, 50, &_globals->_player);
+
+ _hotspot17.setPosition(Common::Point(554, 182));
+ _globals->_player.disableControl();
+
+ _sceneMode = 5105;
+ setAction(&_sequenceManager, this, 5105, &_globals->_player, NULL);
+ }
+ break;
+ case 5300:
+ switch (_globals->_stripNum) {
+ case 5300:
+ _sceneMode = 5111;
+
+ _globals->_player.setVisage(5101);
+ _globals->_player.setStrip(6);
+ _globals->_player.fixPriority(170);
+ _globals->_player.setPosition(Common::Point(1168, 110));
+
+ setAction(&_sequenceManager, this, 5111, &_globals->_player, NULL);
+ _hotspot8.setPosition(Common::Point(1107, 178));
+ break;
+ case 5302:
+ _globals->_player.setPosition(Common::Point(512, 190));
+
+ if (_globals->_sceneObjects->contains(&_hotspot8))
+ setAction(&_action2);
+ else
+ _globals->_player.enableControl();
+ break;
+ case 5303:
+ _hotspot8.setVisage(5102);
+ _hotspot8.setPosition(Common::Point(533, 172));
+ _globals->_player.setPosition(Common::Point(512, 190));
+ setAction(&_action2);
+ break;
+ }
+
+ if (_globals->getFlag(108)) {
+ _hotspot6.postInit();
+ _hotspot6.setVisage(5362);
+ _hotspot6.setPosition(Common::Point(542, 19));
+ _hotspot6.setStrip(6);
+ _hotspot6.setFrame(1);
+ _globals->_sceneItems.push_back(&_hotspot6);
+ } else if (RING_INVENTORY._vial._sceneNumber != 5100) {
+ _hotspot6.postInit();
+ _hotspot6.setVisage(5362);
+ _hotspot6.setPosition(Common::Point(1152, 70));
+ _hotspot6.fixPriority(170);
+ _hotspot6.setStrip(6);
+ _hotspot6.setFrame(1);
+ _globals->_sceneItems.push_back(&_hotspot6);
+ }
+ break;
+ }
+
+ _hotspot18.setBounds(Rect(0, 0, 1280, 200));
+ _globals->_sceneItems.push_back(&_hotspot18);
+
+ _hotspot15.postInit();
+ _hotspot15.setVisage(5140);
+ _hotspot15.setStrip(3);
+ _hotspot15.setPosition(Common::Point(977, 173));
+ _hotspot15.fixPriority(1);
+
+ _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position);
+ loadScene(5100);
+ _globals->_soundHandler.play(205);
+}
+
+void Scene5100::signal() {
+ switch (_sceneMode) {
+ case 5101:
+ case 5112:
+ _globals->setFlag(67);
+ _globals->_sceneManager.changeScene(5300);
+ break;
+ case 5102:
+ case 5114:
+ _globals->_player.enableControl();
+ break;
+ case 5103:
+ if (_globals->getFlag(61)) {
+ SceneItem::display2(5100, 46);
+ _globals->_sceneManager.changeScene(5300);
+ } else {
+ SceneItem::display2(5100, 45);
+ _globals->_sceneManager.changeScene(5200);
+ }
+ break;
+ case 5105:
+ _globals->_sceneManager.changeScene(5300);
+ break;
+ case 5106:
+ _globals->_stripNum = 5111;
+ _globals->_sceneManager.changeScene(5200);
+ break;
+ case 5108:
+ if (!_globals->getFlag(60))
+ _globals->_player.enableControl();
+ else if (RING_INVENTORY._stasisBox._sceneNumber == 1)
+ setAction(&_action2);
+ else
+ setAction(&_action5);
+ break;
+ case 5110:
+ SceneItem::display2(5100, 30);
+ _globals->_player._angle = 325;
+ _globals->_player.enableControl();
+ break;
+ case 5111:
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.setVisage(0);
+ _globals->_player.setStrip(6);
+ _globals->_player.fixPriority(-1);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+
+ if ((RING_INVENTORY._vial._sceneNumber != 5100) && !_globals->getFlag(108)) {
+ _globals->setFlag(108);
+ _sceneMode = 5130;
+ _globals->_player.disableControl();
+
+ _speakerBatText.setTextPos(Common::Point(_globals->_sceneManager._scene->_sceneBounds.left + 20, 30));
+ setAction(&_sequenceManager, this, 5130, &_globals->_player, &_hotspot6, NULL);
+ } else if (_globals->_sceneObjects->contains(&_hotspot8)) {
+ setAction(&_action2);
+ } else {
+ _globals->_player.enableControl();
+ }
+ break;
+ case 5116:
+ _globals->setFlag(105);
+ RING_INVENTORY._bone._sceneNumber = 0;
+
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.setVisage(0);
+ _globals->_player.setStrip(6);
+ _globals->_player.fixPriority(-1);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ // No break on purpose
+ case 5117:
+ _globals->_player.enableControl();
+ break;
+ case 5130:
+ _hotspot6.setVisage(5362);
+ _hotspot6.setPosition(Common::Point(542, 25));
+ _hotspot6.setStrip(6);
+ _hotspot6.setFrame(1);
+ _globals->_player.enableControl();
+ break;
+ case 5150:
+ _globals->clearFlag(60);
+ _globals->_sceneManager.changeScene(5300);
+ break;
+ }
+}
+
+void Scene5100::dispatch() {
+ // Flesheater trap
+ if (_hotspot15._bounds.contains(_globals->_player._position) && !_globals->_player._visage) {
+ _globals->_player.disableControl();
+ _globals->_player.addMover(NULL);
+
+ _soundHandler.play(207);
+ _sceneMode = 5103;
+ setAction(&_sequenceManager, this, (_globals->_player._position.x >= 966) ? 5104 : 5103,
+ &_globals->_player, &_hotspot15, NULL);
+ }
+
+ if (_globals->getFlag(61) && !_globals->getFlag(62) &&
+ ((_globals->_player._position.x - _hotspot2._position.x) < 160) &&
+ (_globals->_sceneManager._previousScene != 5200) && (_sceneMode != 5150)) {
+ setAction(NULL);
+ _sceneMode = 5150;
+ _soundHandler.play(208);
+
+ if (RING_INVENTORY._vial._sceneNumber == 5100) {
+ _globals->_player.addMover(NULL);
+ _globals->_player.disableControl();
+ SceneItem::display2(5100, 39);
+ }
+
+ _hotspot2.setStrip2(1);
+ _hotspot3.setStrip2(2);
+
+ ObjectMover3 *mover1 = new ObjectMover3();
+ _hotspot2.addMover(mover1, &_globals->_player, 20, this);
+ ObjectMover3 *mover2 = new ObjectMover3();
+ _hotspot3.addMover(mover2, &_globals->_player, 20, this);
+ }
+
+ if (!_action) {
+ if (((_globals->_player._position.x - _hotspot2._position.x) < 130) && !_globals->getFlag(61)) {
+ _globals->_player._canWalk = false;
+ _globals->_player.addMover(NULL);
+
+ Common::Point pt(20, 25);
+ PlayerMover2 *mover = new PlayerMover2();
+ _hotspot3.addMover(mover, &pt, &_globals->_player);
+ setAction(&_action4);
+ }
+
+ if ((_globals->_sceneManager._scene->_backgroundBounds.right - 85) <= _globals->_player._position.x)
+ _globals->_sceneManager.changeScene(5000);
+
+ if (_globals->_player.getRegionIndex() == 8) {
+ _sceneMode = 5114;
+ setAction(&_sequenceManager, this, 5115, &_globals->_player, NULL);
+ }
+ }
+
+ Scene::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 5200 - Caverns - Throne Room
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene5200::Action1::signal() {
+ Scene5200 *scene = (Scene5200 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(_globals->_randomSource.getRandomNumber(59) + 120);
+ break;
+ case 1:
+ scene->_hotspot3.animate(ANIM_MODE_8, 1, this);
+ _actionIndex = 0;
+ break;
+ }
+}
+
+void Scene5200::Action2::signal() {
+ // Quinn obtains the stasis box from the flesheater throne room
+ Scene5200 *scene = (Scene5200 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ ADD_PLAYER_MOVER(92, 52);
+ break;
+ case 1:
+ _globals->_player.setVisage(5202);
+ _globals->_player._strip = 4;
+ _globals->_player._frame = 1;
+ _globals->_player.animate(ANIM_MODE_4, 3, 1, this);
+ break;
+ case 2:
+ scene->_soundHandler.stop();
+ scene->_hotspot14.remove();
+
+ RING_INVENTORY._stasisBox._sceneNumber = 1;
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ _globals->_player.setVisage(0);
+ _globals->_player._strip = 3;
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+
+ scene->_hotspot8.animate(ANIM_MODE_2, NULL);
+ ADD_MOVER(scene->_hotspot8, 141, 77);
+ break;
+ case 4:
+ scene->_soundHandler.play(303);
+
+ scene->_hotspot8._strip = 2;
+ scene->_hotspot8._frame = 1;
+ scene->_hotspot8.animate(ANIM_MODE_5, this);
+ break;
+ case 5:
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene5200::Action3::signal() {
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(5);
+ break;
+ case 1:
+ ADD_PLAYER_MOVER(285, 62);
+ break;
+ case 2:
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene5200::Action4::signal() {
+ Scene5200 *scene = (Scene5200 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(120);
+ break;
+ case 1:
+ _globals->_soundHandler.play(209);
+ scene->_stripManager.start(5202, this, scene);
+ break;
+ case 2:
+ scene->_hotspot6.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ setDelay(10);
+ break;
+ case 4:
+ scene->_stripManager.start(5204, this, scene);
+ break;
+ case 5:
+ setDelay(60);
+ break;
+ case 6:
+ _globals->_sceneManager.changeScene(5100);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene5200::Hotspot9::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ if (!_state) {
+ ++_state;
+ SceneItem::display2(5200, 5);
+ } else {
+ SceneItem::display2(5200, 6);
+ }
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(5200, 14);
+ break;
+ default:
+ SceneItem::doAction(action);
+ break;
+ }
+}
+
+void Scene5200::Hotspot10::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ if (!_state) {
+ ++_state;
+ SceneItem::display2(5200, 7);
+ } else {
+ SceneItem::display2(5200, 8);
+ }
+ break;
+ default:
+ SceneObject::doAction(action);
+ break;
+ }
+}
+
+void Scene5200::Hotspot14::doAction(int action) {
+ Scene5200 *scene = (Scene5200 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(5200, 4);
+ break;
+ case CURSOR_USE:
+ scene->setAction(&scene->_action2);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene5200::Scene5200() :
+ _hotspot11(0, CURSOR_LOOK, 5200, 0, CURSOR_USE, 5200, 13, LIST_END),
+ _hotspot12(10, CURSOR_LOOK, 5200, 9, LIST_END),
+ _hotspot13(8, CURSOR_LOOK, 5200, 0, CURSOR_USE, 5200, 13, LIST_END) {
+}
+
+
+void Scene5200::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ setZoomPercents(0, 150, 199, 150);
+ _fieldA = 5600;
+ _fieldE = 5100;
+
+ _hotspot9._state = 0;
+ _hotspot10._state = 0;
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerGameText);
+ _stripManager.addSpeaker(&_speakerFLText);
+ _stripManager.addSpeaker(&_speakerFLL);
+ _stripManager.addSpeaker(&_speakerQL);
+ _stripManager.setCallback(this);
+
+ _speakerFLText._textPos.x = 160;
+ _speakerQText._textPos.x = 20;
+
+ if (RING_INVENTORY._stasisBox._sceneNumber == 5200) {
+ _soundHandler.play(216);
+ _soundHandler.holdAt(true);
+
+ _hotspot14.postInit();
+ _hotspot14.setVisage(5202);
+ _hotspot14._strip = 3;
+ _hotspot14.setPosition(Common::Point(105, 52));
+ _hotspot14.fixPriority(90);
+
+ _hotspot8.postInit();
+ _hotspot8.setVisage(5202);
+ _hotspot8._strip = 1;
+ _hotspot8.setPosition(Common::Point(96, 53));
+ _hotspot8.fixPriority(90);
+ _globals->_sceneItems.push_back(&_hotspot14);
+ }
+
+ if (_globals->_stripNum == 5111) {
+ // Happens when the player enters the throne room via the secret passage,
+ // after talking with the bat. No NPCs are around and the player can
+ // obtain the stasis box.
+ _globals->_soundHandler.play(205);
+ _globals->_player.disableControl();
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(0);
+ _globals->_player.changeZoom(75);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setStrip(1);
+ _globals->_player.setFrame(3);
+ _globals->_player.setPosition(Common::Point(307, 62));
+
+ setAction(&_action3);
+ } else {
+ // Happens when the player is captured by the flesh eaters the first time.
+ _globals->_player.postInit();
+ _globals->_player.setVisage(2640);
+ _globals->_player._strip = 1;
+ _globals->_player._frame = 4;
+ _globals->_player.setPosition(Common::Point(105, 199));
+
+ _hotspot5.postInit();
+ _hotspot5.setVisage(5210);
+ _hotspot5._frame = 2;
+ _hotspot5.setPosition(Common::Point(189, 167));
+
+ _hotspot6.postInit();
+ _hotspot6.setVisage(5210);
+ _hotspot6._frame = 1;
+ _hotspot6._strip = 2;
+ _hotspot6.setPosition(Common::Point(159, 137));
+
+ _hotspot7.postInit();
+ _hotspot7.setVisage(5210);
+ _hotspot7._frame = 1;
+ _hotspot7._strip = 4;
+ _hotspot7.fixPriority(168);
+ _hotspot7.setPosition(Common::Point(186, 106));
+
+ _hotspot1.postInit();
+ _hotspot1.setVisage(5212);
+ _hotspot1._frame = 1;
+ _hotspot1.setPosition(Common::Point(62, 132));
+
+ _hotspot2.postInit();
+ _hotspot2.setVisage(5212);
+ _hotspot2._strip = 3;
+ _hotspot2.setPosition(Common::Point(148, 141));
+ _hotspot2.fixPriority(90);
+
+ _hotspot3.postInit();
+ _hotspot3.setVisage(5212);
+ _hotspot3._strip = 2;
+ _hotspot3.setPosition(Common::Point(62, 109));
+ _hotspot3.fixPriority(138);
+ _hotspot3.setAction(&_action1);
+
+ _hotspot4.postInit();
+ _hotspot4.setVisage(5212);
+ _hotspot4._strip = 4;
+ _hotspot4.setPosition(Common::Point(146, 110));
+ _hotspot4.fixPriority(90);
+
+ _globals->_player.disableControl();
+ _globals->setFlag(61);
+
+ setAction(&_action4);
+ }
+
+ _hotspot11.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+ _hotspot9._sceneRegionId = 11;
+ _hotspot10._sceneRegionId = 9;
+ _hotspot12._sceneRegionId = 10;
+ _hotspot13._sceneRegionId = 8;
+
+ _globals->_sceneItems.addItems(&_hotspot12, &_hotspot13, &_hotspot9, &_hotspot10, &_hotspot11, NULL);
+ _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position);
+ loadScene(5200);
+}
+
+void Scene5200::stripCallback(int v) {
+ switch (v) {
+ case 1:
+ _hotspot7.animate(ANIM_MODE_2, NULL);
+ break;
+ case 2:
+ _hotspot7.animate(ANIM_MODE_NONE, NULL);
+ break;
+ }
+}
+
+void Scene5200::dispatch() {
+ Scene::dispatch();
+
+ if (!_action && (_globals->_player.getRegionIndex() == 12)) {
+ _globals->_stripNum = 5200;
+ _globals->_sceneManager.changeScene(5100);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 5300 - Caverns - Pit
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene5300::Action1::signal() {
+ // Seeker waking up
+ Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(3);
+ break;
+ case 1:
+ scene->_hotspot2._numFrames = 4;
+ scene->_hotspot2.animate(ANIM_MODE_8, 1, NULL);
+ setDelay(120);
+ break;
+ case 2:
+ scene->_hotspot2.animate(ANIM_MODE_NONE, NULL);
+
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setStrip2(-1);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ ADD_MOVER(_globals->_player, 85, 170);
+ break;
+ case 3:
+ scene->_hotspot2.fixPriority(-1);
+ _globals->_player.checkAngle(&scene->_hotspot2);
+ setAction(&scene->_sequenceManager, this, 5305, &scene->_hotspot2, NULL);
+ break;
+ case 4:
+ scene->_stripManager.start(5316, this);
+ break;
+ case 5:
+ if (!_globals->getFlag(106) || !_globals->getFlag(107) || (RING_INVENTORY._stasisBox._sceneNumber != 1)) {
+ _globals->_player.enableControl();
+ remove();
+ } else {
+ _globals->setFlag(60);
+ scene->_hotspot2._numFrames = 10;
+
+ if (_globals->getFlag(67)) {
+ scene->_sceneMode = 5310;
+ scene->setAction(&scene->_sequenceManager, scene, 5310, &_globals->_player, &scene->_hotspot2, NULL);
+ } else {
+ scene->_sceneMode = 5347;
+ scene->setAction(&scene->_sequenceManager, scene, 5347, NULL);
+ }
+ }
+ break;
+ }
+}
+
+void Scene5300::Action2::signal() {
+ Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(60);
+ break;
+ case 1:
+ _globals->setFlag(60);
+ scene->_stripManager.start(5328, this);
+ break;
+ case 2:
+ if (RING_INVENTORY._stasisBox._sceneNumber == 1) {
+ _globals->_stripNum = 5303;
+ setDelay(5);
+ } else {
+ _globals->_stripNum = 5302;
+ scene->_stripManager.start(5329, this);
+ }
+ break;
+ case 3:
+ _globals->_sceneManager.changeScene(5100);
+ remove();
+ break;
+ }
+}
+
+void Scene5300::Action3::signal() {
+ Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(30);
+ break;
+ case 1:
+ scene->_stripManager.start(_globals->_stripNum, this);
+ break;
+ case 2:
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene5300::Hotspot1::doAction(int action) {
+ Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(5300, 24);
+ break;
+ case CURSOR_TALK:
+ _globals->_stripNum = 5312;
+ scene->setAction(&scene->_action3);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+void Scene5300::Hotspot2::doAction(int action) {
+ // Seeker
+ Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(5300, 23);
+ break;
+ case CURSOR_USE:
+ if (!_globals->getFlag(106)) {
+ _globals->_player.disableControl();
+ scene->_sceneMode = 5302;
+ scene->setAction(&scene->_sequenceManager, scene, 5302, &_globals->_player, NULL);
+ } else {
+ SceneItem::display2(5300, _globals->getFlag(107) ? 25 : 20);
+ }
+ break;
+ case CURSOR_TALK:
+ if (!_globals->getFlag(106)) {
+ _globals->_player.disableControl();
+ scene->_sceneMode = 5302;
+ scene->setAction(&scene->_sequenceManager, scene, 5302, &_globals->_player, NULL);
+ } else if (!_globals->getFlag(107)) {
+ SceneItem::display2(5300, 11);
+ } else {
+ _globals->_player.disableControl();
+
+ if (RING_INVENTORY._stasisBox._sceneNumber != 1) {
+ scene->_sceneMode = 5316;
+ scene->setAction(&scene->_sequenceManager, scene, 5316, NULL);
+ } else {
+ _globals->setFlag(60);
+ if (_globals->getFlag(67)) {
+ scene->_sceneMode = 5315;
+ scene->setAction(&scene->_sequenceManager, scene, 5315, this, NULL);
+ } else {
+ scene->_sceneMode = 5347;
+ scene->setAction(&scene->_sequenceManager, scene, 5347, NULL);
+ }
+ }
+ }
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(5300, _globals->getFlag(107) ? 10 : 9);
+ break;
+ case OBJECT_MEDKIT:
+ if (_globals->getFlag(106))
+ SceneItem::display2(5300, 7);
+ else {
+ _globals->setFlag(106);
+ _globals->_player.disableControl();
+
+ scene->_sceneMode = 5303;
+ scene->setAction(&scene->_sequenceManager, scene, 5303, &_globals->_player, NULL);
+ }
+ break;
+ case OBJECT_VIAL:
+ if (_globals->getFlag(107)) {
+ SceneItem::display2(5300, 8);
+ } else {
+ RING_INVENTORY._vial._sceneNumber = 5300;
+ _globals->setFlag(107);
+ _globals->_player.disableControl();
+ scene->_sceneMode = 5304;
+
+ scene->setAction(&scene->_sequenceManager, scene, 5304, &_globals->_player, NULL);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene5300::Hotspot5::doAction(int action) {
+ // Sharp bone
+ Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(5300, 27);
+ break;
+ case CURSOR_USE:
+ RING_INVENTORY._bone._sceneNumber = 1;
+ _globals->_player.disableControl();
+
+ scene->_sceneMode = 5309;
+ scene->setAction(&scene->_sequenceManager, scene, 5309, &_globals->_player, this, NULL);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene5300::Hotspot6::doAction(int action) {
+ // Left Hole
+ Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ if (!_globals->getFlag(105) || (RING_INVENTORY._vial._sceneNumber == 1))
+ SceneItem::display2(5300, 4);
+ else
+ SceneItem::display2(5300, 26);
+ break;
+ case CURSOR_USE:
+ if (!_globals->getFlag(105) || (RING_INVENTORY._vial._sceneNumber != 5100)) {
+ _globals->_player.disableControl();
+ scene->_sceneMode = 5301;
+ scene->setAction(&scene->_sequenceManager, scene, 5301, &_globals->_player, NULL);
+ } else {
+ _globals->_player.disableControl();
+ scene->_sceneMode = 5307;
+ RING_INVENTORY._vial._sceneNumber = 1;
+
+ scene->setAction(&scene->_sequenceManager, scene, 5307, &scene->_hotspot1, &_globals->_player,
+ &scene->_hotspot4, NULL);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene5300::Hotspot7::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_globals->getFlag(63))
+ SceneItem::display2(5300, 2);
+ else {
+ _globals->setFlag(63);
+ SceneItem::display2(5300, 0);
+ SceneItem::display2(5300, 1);
+ }
+ break;
+ case CURSOR_USE:
+ if (_globals->getFlag(64))
+ SceneItem::display2(5300, 15);
+ else {
+ _globals->setFlag(64);
+ SceneItem::display2(5300, 14);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene5300::Hotspot8::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(5300, _globals->getFlag(65) ? 6 : 5);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(5300, 18);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene5300::Scene5300() :
+ _hotspot3(0, CURSOR_LOOK, 5300, 3, CURSOR_USE, 5300, 16, LIST_END) {
+}
+
+void Scene5300::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ loadScene(5300);
+ setZoomPercents(0, 100, 199, 100);
+
+ _stripManager.addSpeaker(&_speakerQR);
+ _stripManager.addSpeaker(&_speakerQL);
+ _stripManager.addSpeaker(&_speakerBatR);
+ _stripManager.addSpeaker(&_speakerSR);
+ _stripManager.addSpeaker(&_speakerSL);
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerBatText);
+ _stripManager.addSpeaker(&_speakerSText);
+ _stripManager.addSpeaker(&_speakerGameText);
+
+ if (_globals->getFlag(106) && _globals->getFlag(107)) {
+ _hotspot2.postInit();
+ _hotspot2.setVisage(2806);
+ _hotspot2.setObjectWrapper(new SceneObjectWrapper());
+ _hotspot2.setPosition(Common::Point(63, 170));
+ _hotspot2.animate(ANIM_MODE_1, NULL);
+ } else {
+ _hotspot2.postInit();
+ _hotspot2.setVisage(5310);
+ _hotspot2.setPosition(Common::Point(63, 170));
+ _hotspot2.animate(ANIM_MODE_1, NULL);
+ _hotspot2.fixPriority(98);
+ }
+
+ _hotspot1.postInit();
+ _hotspot1.setVisage(5362);
+ _hotspot1.setStrip2(3);
+ _hotspot1.setFrame2(5);
+ _hotspot1.setPosition(Common::Point(76, 48));
+
+ _hotspot4.postInit();
+ _hotspot4.setVisage(5316);
+ _hotspot4.setStrip(2);
+ _hotspot4.setPosition(Common::Point(89, 65));
+ _hotspot4.animate(ANIM_MODE_2, NULL);
+ _hotspot4.hide();
+
+ if (_globals->getFlag(67)) {
+ _globals->_player.postInit();
+ _globals->_player.setVisage(5316);
+ _globals->_player.setPosition(Common::Point(191, 27));
+ _globals->_player.disableControl();
+
+ if (_globals->getFlag(107) && _globals->getFlag(106)) {
+ _hotspot2.setVisage(2806);
+ _hotspot2.postInit();
+ _hotspot2.setObjectWrapper(new SceneObjectWrapper());
+ _hotspot2.animate(ANIM_MODE_1, NULL);
+
+ setAction(&_action2);
+ } else {
+ _globals->_player.setVisage(5315);
+ _globals->_player.setPosition(Common::Point(204, 86));
+ _globals->_player.animate(ANIM_MODE_2, NULL);
+ _globals->_player.setStrip2(1);
+ _globals->_player._moveDiff.y = 12;
+
+ _sceneMode = 5308;
+ setAction(&_sequenceManager, this, 5308, &_globals->_player, NULL);
+ }
+ } else {
+ _hotspot3.postInit();
+ _hotspot3.setVisage(5301);
+ _hotspot3.setPosition(Common::Point(172, 32));
+ _hotspot3.fixPriority(1);
+ _hotspot3.animate(ANIM_MODE_NONE, NULL);
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(5315);
+ _globals->_player.setPosition(Common::Point(204, 86));
+ _globals->_player.animate(ANIM_MODE_2, NULL);
+ _globals->_player.setStrip2(1);
+ _globals->_player._moveDiff.y = 12;
+ _globals->_player.disableControl();
+
+ _sceneMode = 5306;
+ setAction(&_sequenceManager, this, 5306, &_globals->_player, &_hotspot3, NULL);
+ }
+
+ _field1B0A = 1;
+ if (RING_INVENTORY._bone._sceneNumber == 5300) {
+ _hotspot5.postInit();
+ _hotspot5.setVisage(5301);
+ _hotspot5.setStrip(2);
+ _hotspot5.setPosition(Common::Point(190, 147));
+ _globals->_sceneItems.push_back(&_hotspot5);
+ }
+
+ _hotspot6.setBounds(Rect(74, 51, 114, 69));
+ _hotspot7.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+ _hotspot8._sceneRegionId = 8;
+
+ _globals->_sceneItems.addItems(&_hotspot8, &_hotspot2, &_hotspot6, &_hotspot3, &_hotspot7, NULL);
+ _globals->_soundHandler.play(212);
+}
+
+void Scene5300::signal() {
+ switch (_sceneMode) {
+ case 5301:
+ _globals->_stripNum = 5300;
+ _globals->_sceneManager.changeScene(5100);
+ break;
+ case 5307:
+ _soundHandler.fadeOut(NULL);
+ // No break on purpose
+ case 5302:
+ case 5308:
+ case 5316:
+ case 5347:
+ _globals->_player.setStrip2(-1);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.enableControl();
+ break;
+ case 5303:
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.enableControl();
+
+ if (_globals->getFlag(107))
+ setAction(&_action1);
+ else
+ SceneItem::display2(5300, 28);
+ break;
+ case 5304:
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.enableControl();
+
+ if (_globals->getFlag(106))
+ setAction(&_action1);
+ else
+ SceneItem::display2(5300, 28);
+ break;
+ case 5306:
+ _globals->clearFlag(67);
+ _globals->_player.setStrip2(-1);
+
+ if ((RING_INVENTORY._vial._sceneNumber == 1) || (RING_INVENTORY._vial._sceneNumber == 5300))
+ _stripManager.start(5303, this);
+ else
+ _stripManager.start(5302, this);
+ _sceneMode = 5302;
+ break;
+ case 5309:
+ _hotspot5.remove();
+ _globals->_player.enableControl();
+ break;
+ case 5310:
+ _hotspot2.fixPriority(41);
+ _sceneMode = 5315;
+
+ setAction(&_sequenceManager, this, 5315, &_hotspot2, NULL);
+ break;
+ case 5315:
+ _globals->_stripNum = 5302;
+ _globals->_sceneManager.changeScene(5100);
+ break;
+ }
+}
+
+
+} // End of namespace tSage
diff --git a/engines/tsage/ringworld/ringworld_scenes6.h b/engines/tsage/ringworld/ringworld_scenes6.h
new file mode 100644
index 0000000000..db6efd0e18
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_scenes6.h
@@ -0,0 +1,330 @@
+/* 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_RINGWORLD_SCENES6_H
+#define TSAGE_RINGWORLD_SCENES6_H
+
+#include "common/scummsys.h"
+#include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+
+namespace tSage {
+
+class Scene5000 : public Scene {
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ virtual void dispatch();
+ };
+ class Action2 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action3 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action4 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action5 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action6 : public Action {
+ public:
+ virtual void signal();
+ };
+
+ /* Hotspots */
+ class Hotspot7 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot8 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class HotspotGroup1 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ SequenceManager _sequenceManager;
+ ASound _soundHandler;
+ SpeakerSText _speakerSText;
+ SpeakerQText _speakerQText;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ Action5 _action5;
+ Action6 _action6;
+ DisplayHotspot _hotspot1;
+ SceneObject _hotspot2, _hotspot3, _hotspot4, _hotspot5, _hotspot6;
+ Hotspot7 _hotspot7;
+ Hotspot8 _hotspot8;
+ HotspotGroup1 _hotspot9, _hotspot10, _hotspot11;
+ DisplayHotspot _hotspot12, _hotspot13, _hotspot14, _hotspot15;
+ DisplayHotspot _hotspot16, _hotspot17, _hotspot18;
+
+ Scene5000();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene5100 : public Scene {
+ /* 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();
+ };
+ class Action5 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action6 : public Action {
+ public:
+ virtual void signal();
+ };
+
+ /* Hotspots */
+ class HotspotGroup1 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class HotspotGroup2 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot4 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot9 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot17 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot18 : public SceneHotspot {
+ public:
+ int _index1;
+ int _index2;
+
+ virtual void doAction(int action);
+ };
+ class Hotspot19 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot20 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ SequenceManager _sequenceManager;
+ ASound _soundHandler;
+ SpeakerMText _speakerMText;
+ SpeakerQText _speakerQText;
+ SpeakerSText _speakerSText;
+ SpeakerBatText _speakerBatText;
+ SpeakerGameText _speakerGameText;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ Action5 _action5;
+ HotspotGroup1 _hotspot1, _hotspot2, _hotspot3;
+ Hotspot4 _hotspot4;
+ HotspotGroup2 _hotspot5, _hotspot6, _hotspot7;
+ SceneObject _hotspot8;
+ Hotspot9 _hotspot9;
+ SceneObject _hotspot10, _hotspot11, _hotspot12, _hotspot13, _hotspot14, _hotspot15;
+ DisplayHotspot _hotspot16;
+ Hotspot17 _hotspot17;
+ Hotspot18 _hotspot18;
+ Hotspot19 _hotspot19;
+ Hotspot20 _hotspot20;
+ DisplayHotspot _hotspot21;
+
+ Scene5100();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene5200 : public Scene {
+ /* 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();
+ };
+
+ /* Hotspots */
+ class Hotspot9 : public SceneObjectExt {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot10 : public SceneObjectExt {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot14 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ ASound _soundHandler;
+ SpeakerFLL _speakerFLL;
+ SpeakerFLText _speakerFLText;
+ SpeakerQL _speakerQL;
+ SpeakerQText _speakerQText;
+ SpeakerGameText _speakerGameText;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+
+ SceneObject _hotspot1, _hotspot2, _hotspot3, _hotspot4, _hotspot5, _hotspot6, _hotspot7;
+ SceneObject _hotspot8;
+ Hotspot9 _hotspot9;
+ Hotspot10 _hotspot10;
+ DisplayHotspot _hotspot11, _hotspot12, _hotspot13;
+ Hotspot14 _hotspot14;
+
+ Scene5200();
+ virtual void stripCallback(int v);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void dispatch();
+};
+
+class Scene5300 : public Scene {
+ /* 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();
+ };
+
+ /* Hotspots */
+ class Hotspot1 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot2 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot5 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot6 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot7 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot8 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ ASound _soundHandler;
+ SequenceManager _sequenceManager;
+ SpeakerQR _speakerQR;
+ SpeakerQL _speakerQL;
+ SpeakerQText _speakerQText;
+ SpeakerBatR _speakerBatR;
+ SpeakerBatText _speakerBatText;
+ SpeakerSR _speakerSR;
+ SpeakerSL _speakerSL;
+ SpeakerSText _speakerSText;
+ SpeakerGameText _speakerGameText;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Hotspot1 _hotspot1;
+ Hotspot2 _hotspot2;
+ DisplayHotspot _hotspot3;
+ SceneObject _hotspot4;
+ Hotspot5 _hotspot5;
+ Hotspot6 _hotspot6;
+ Hotspot7 _hotspot7;
+ Hotspot8 _hotspot8;
+ int _field1B0A;
+
+ Scene5300();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void synchronize(Serializer &s) {
+ Scene::synchronize(s);
+ s.syncAsSint16LE(_field1B0A);
+ }
+};
+
+
+} // End of namespace tSage
+
+#endif
diff --git a/engines/tsage/ringworld/ringworld_scenes8.cpp b/engines/tsage/ringworld/ringworld_scenes8.cpp
new file mode 100644
index 0000000000..5b01bb2c58
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_scenes8.cpp
@@ -0,0 +1,2545 @@
+/* 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 "graphics/cursorman.h"
+#include "tsage/ringworld/ringworld_scenes8.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+
+namespace tSage {
+
+void NamedHotspotMult::synchronize(Serializer &s) {
+ SceneHotspot::synchronize(s);
+ s.syncAsSint16LE(_useLineNum);
+ s.syncAsSint16LE(_lookLineNum);
+}
+
+void SceneObject7700::synchronize(Serializer &s) {
+ SceneObject::synchronize(s);
+ if (s.getVersion() >= 3) {
+ s.syncAsSint16LE(_lookLineNum);
+ s.syncAsSint16LE(_defltLineNum);
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 7000 - Landing near beach
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene7000::Action1::signal() {
+ // Quinn walks from the lander to the seaside (action6) then discuss with Skeenar
+ Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(3);
+ break;
+ case 1:
+ setAction(&scene->_action6, this);
+ break;
+ case 2:
+ scene->_soundHandler.play(252);
+ scene->_object8.remove();
+ scene->_object1.postInit();
+ scene->_object1.setVisage(7003);
+ scene->_object1.animate(ANIM_MODE_5, this);
+ scene->_object1.setPosition(Common::Point(151, 182));
+ scene->_object1.fixPriority(205);
+ _globals->_sceneItems.push_front(&scene->_object1);
+ break;
+ case 3:
+ scene->_object1._numFrames = 4;
+ scene->_object1.setStrip(2);
+ scene->_object1.animate(ANIM_MODE_8, 0, NULL);
+ scene->_stripManager.start(7005, this);
+ break;
+ case 4:
+ scene->_object1.animate(ANIM_MODE_2, NULL);
+ setDelay(3);
+ break;
+ case 5:
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene7000::Action2::signal() {
+ Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(3);
+ break;
+ case 1:
+ _globals->_player.addMover(NULL);
+ _globals->_player.setVisage(7006);
+ _globals->_player.setStrip(1);
+ _globals->_player.setFrame(1);
+ _globals->_player.setPosition(Common::Point(_globals->_player._position.x, _globals->_player._position.y + 13));
+ _globals->_player.changeZoom(68);
+ _globals->_player.animate(ANIM_MODE_5, this);
+ scene->_object1.remove();
+ break;
+ case 2:
+ _globals->_sceneManager.changeScene(7100);
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene7000::Action3::dispatch() {
+ Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene;
+
+ Action::dispatch();
+ if (_actionIndex == 4)
+ scene->_object4.setPosition(Common::Point(scene->_object3._position.x, scene->_object3._position.y + 15));
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene7000::Action3::signal() {
+ // Lander is landing
+ Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(30);
+ scene->setZoomPercents(10, 10, 62, 100);
+ scene->_object4.postInit();
+ scene->_object4.setVisage(5001);
+ scene->_object4.setStrip2(2);
+ scene->_object4.animate(ANIM_MODE_8, 0, NULL);
+ scene->_object4.setPosition(Common::Point(10, 18));
+ scene->_object4.fixPriority(10);
+ scene->_object4.changeZoom(100);
+ scene->_object4.hide();
+ break;
+ case 1: {
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(107, 65);
+ scene->_object3.addMover(mover, &pt, this);
+ break;
+ }
+ case 2:
+ scene->_object3._moveDiff.y = 1;
+ scene->_object3.fixPriority(10);
+ scene->_object4.setPosition(Common::Point(scene->_object3._position.x, scene->_object3._position.y + 15));
+ scene->_object4.show();
+ setDelay(30);
+ break;
+ case 3: {
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(107, 92);
+ scene->_object3.addMover(mover, &pt, this);
+ break;
+ }
+ case 4:
+ scene->_object4.remove();
+ _globals->_sceneManager.changeScene(2100);
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene7000::Action4::signal() {
+ Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ scene->_object1.animate(ANIM_MODE_6, this);
+ break;
+ case 1:
+ scene->_object1.hide();
+ setDelay(300);
+ break;
+ case 2:
+ _globals->_soundHandler.play(252);
+ scene->_object1.show();
+ scene->_object1.setStrip(3);
+ scene->_object1.setFrame(1);
+ scene->_object1.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ scene->_object1.setStrip(4);
+ scene->_object1.animate(ANIM_MODE_8, 0, NULL);
+ _globals->setFlag(81);
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene7000::Action5::signal() {
+ Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0: {
+ NpcMover *playerMover = new NpcMover();
+ Common::Point pt(88, 121);
+ _globals->_player.addMover(playerMover, &pt, this);
+ break;
+ }
+ case 1:
+ _globals->_player.checkAngle(&scene->_object1);
+ _globals->_soundHandler.play(252);
+ scene->_object1.setStrip(2);
+ scene->_stripManager.start(7015, this);
+ break;
+ case 2:
+ scene->_object1.setStrip(1);
+ scene->_object1.setFrame(4);
+ scene->_object1.animate(ANIM_MODE_6, this);
+ break;
+ case 3: {
+ scene->_object1.remove();
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(31, 94);
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 4: {
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(11, 94);
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 5: {
+ _globals->_player.fixPriority(10);
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(11, 89);
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 6: {
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(41, 89);
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 7:
+ _globals->clearFlag(36);
+ _globals->clearFlag(37);
+ _globals->clearFlag(72);
+ _globals->clearFlag(13);
+ _globals->_sceneManager.changeScene(2100);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene7000::Action6::signal() {
+ // Quinn walks from the lander to the seaside
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(3);
+ break;
+ case 1: {
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(12, 91);
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 2: {
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(8, 91);
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 3: {
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(31, 96);
+ _globals->_player.addMover(mover, &pt, this);
+ _globals->_player.fixPriority(-1);
+ break;
+ }
+ case 4: {
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(83, 117);
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 5: {
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(95, 121);
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 6:
+ _globals->_player.setStrip(3);
+ _globals->_player.setFrame(1);
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene7000::Action7::signal() {
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(3);
+ break;
+ case 1:
+ setDelay(3);
+ break;
+ case 2: {
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(31, 94);
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 3: {
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(11, 94);
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 4: {
+ _globals->_player.fixPriority(10);
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(11, 89);
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 5: {
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(41, 89);
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 6:
+ if (_globals->getFlag(13))
+ _globals->_sceneManager.changeScene(2280);
+ else
+ _globals->_sceneManager.changeScene(2320);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene7000::Hotspot1::doAction(int action) {
+ if (action == CURSOR_LOOK)
+ SceneItem::display2(7000, 2);
+ else
+ SceneHotspot::doAction(action);
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene7000::Object1::doAction(int action) {
+ // Skeenar
+ Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case OBJECT_TRANSLATOR:
+ _globals->_player.disableControl();
+ RING_INVENTORY._translator._sceneNumber = 7000;
+
+ if ((RING_INVENTORY._waldos._sceneNumber != 7000) && (RING_INVENTORY._jar._sceneNumber != 7000)) {
+ scene->_sceneMode = 7004;
+ scene->setAction(&scene->_sequenceManager, scene, 7004, &_globals->_player, this, NULL);
+ } else if (RING_INVENTORY._waldos._sceneNumber != 7000) {
+ scene->_sceneMode = 7011;
+ scene->setAction(&scene->_sequenceManager, scene, 7010, &_globals->_player, &scene->_object1, NULL);
+ } else if (RING_INVENTORY._jar._sceneNumber != 7000) {
+ scene->_sceneMode = 7012;
+ scene->setAction(&scene->_sequenceManager, scene, 7010, &_globals->_player, &scene->_object1, NULL);
+ } else {
+ scene->_sceneMode = 7015;
+ scene->setAction(&scene->_sequenceManager, scene, 7017, &_globals->_player, NULL);
+ }
+ break;
+ case OBJECT_WALDOS:
+ _globals->_player.disableControl();
+ RING_INVENTORY._waldos._sceneNumber = 7000;
+ if (RING_INVENTORY._translator._sceneNumber == 7000) {
+ if (RING_INVENTORY._jar._sceneNumber == 7000) {
+ scene->_sceneMode = 7015;
+ scene->setAction(&scene->_sequenceManager, scene, 7015, &_globals->_player, NULL);
+ } else {
+ scene->_sceneMode = 7006;
+ scene->setAction(&scene->_sequenceManager, scene, 7006, &_globals->_player, NULL);
+ }
+ } else {
+ scene->_sceneMode = 7009;
+ scene->setAction(&scene->_sequenceManager, scene, 7009, &_globals->_player, NULL);
+ }
+ break;
+ case OBJECT_JAR:
+ _globals->_player.disableControl();
+ RING_INVENTORY._jar._sceneNumber = 7000;
+
+ if (RING_INVENTORY._translator._sceneNumber == 7000) {
+ if (RING_INVENTORY._waldos._sceneNumber != 7000) {
+ scene->_sceneMode = 7007;
+ scene->setAction(&scene->_sequenceManager, scene, 7007, &_globals->_player, &scene->_object1, NULL);
+ } else {
+ scene->_sceneMode = 7015;
+ scene->setAction(&scene->_sequenceManager, scene, 7016, &_globals->_player, NULL);
+ }
+ } else {
+ scene->_sceneMode = 7008;
+ scene->setAction(&scene->_sequenceManager, scene, 7008, &_globals->_player, NULL);
+ }
+ break;
+ case CURSOR_LOOK:
+ if (_globals->getFlag(81))
+ SceneItem::display2(7000, 1);
+ else
+ SceneItem::display2(7000, 0);
+ break;
+ case CURSOR_USE:
+ if (_globals->getFlag(81)) {
+ RING_INVENTORY._stasisBox2._sceneNumber = 1;
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_action5);
+ } else {
+ SceneItem::display2(7000, 5);
+ }
+ break;
+ case CURSOR_TALK:
+ if (_globals->getFlag(81)) {
+ RING_INVENTORY._stasisBox2._sceneNumber = 1;
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_action5);
+ } else if (_globals->getFlag(52)) {
+ scene->_sceneMode = 7005;
+ scene->setAction(&scene->_sequenceManager, scene, 7013, NULL);
+ } else if (_globals->getFlag(13)) {
+ scene->_sceneMode = 7002;
+ scene->setAction(&scene->_sequenceManager, scene, 7014, NULL);
+ } else {
+ scene->_sceneMode = 7002;
+ scene->setAction(&scene->_sequenceManager, scene, 7002, NULL);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene7000::dispatch() {
+ Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene;
+
+ if (!_action) {
+ if (_globals->_sceneRegions.indexOf(_globals->_player._position) == 8) {
+ if (!_globals->getFlag(13)) {
+ _globals->_player.disableControl();
+ _globals->_player.addMover(NULL);
+ SceneItem::display2(7000, 3);
+ _sceneMode = 7001;
+ setAction(&scene->_sequenceManager, this, 7001, &_globals->_player, NULL);
+ } else if (!_globals->getFlag(52)) {
+ setAction(&_action2);
+ } else {
+ _globals->_player.disableControl();
+ _sceneMode = 7003;
+ setAction(&scene->_sequenceManager, this, 7003, &_globals->_player, NULL);
+ }
+ }
+ if (_globals->_sceneRegions.indexOf(_globals->_player._position) == 9)
+ scene->setAction(&scene->_action7);
+ }
+ Scene::dispatch();
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene7000::postInit(SceneObjectList *OwnerList) {
+ loadScene(7000);
+ Scene::postInit();
+ setZoomPercents(93, 25, 119, 55);
+ _stripManager.addSpeaker(&_speakerSKText);
+ _stripManager.addSpeaker(&_speakerSKL);
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerQL);
+ _stripManager.addSpeaker(&_speakerQR);
+
+ _speakerSKText._npc = &_object1;
+ _speakerQText._npc = &_globals->_player;
+
+ _object5.postInit();
+ _object5.setVisage(7001);
+ _object5.setStrip2(1);
+ _object5.animate(ANIM_MODE_2, NULL);
+ _object5.setPosition(Common::Point(49, 147));
+ _object5.fixPriority(1);
+
+ _object6.postInit();
+ _object6.setVisage(7001);
+ _object6.setStrip2(2);
+ _object6.animate(ANIM_MODE_2, NULL);
+ _object6.setPosition(Common::Point(160, 139));
+ _object6.fixPriority(1);
+
+ _object7.postInit();
+ _object7.setVisage(7001);
+ _object7.setStrip2(3);
+ _object7.animate(ANIM_MODE_2, NULL);
+ _object7.setPosition(Common::Point(272, 129));
+ _object7.fixPriority(1);
+
+ _object8.postInit();
+ _object8.setVisage(7001);
+ _object8.setStrip2(4);
+ _object8.animate(ANIM_MODE_2, NULL);
+ _object8.setPosition(Common::Point(176, 175));
+ _object8.fixPriority(1);
+
+ if (_globals->getFlag(72)) {
+ _object3.postInit();
+ _object3.setVisage(5001);
+ _object3.setStrip2(1);
+ _object3.setPosition(Common::Point(107, 92));
+ _object3.changeZoom(100);
+ _object3.fixPriority(10);
+
+ _object1.postInit();
+ _object1.setVisage(7003);
+ if (_globals->getFlag(81))
+ _object1.setStrip(4);
+ else
+ _object1.setStrip(2);
+ _object1.setPosition(Common::Point(87, 129));
+ _object1._numFrames = 4;
+ _object1.changeZoom(45);
+ _object1.animate(ANIM_MODE_8, 0, NULL);
+ _globals->_sceneItems.push_back(&_object1);
+ }
+ _soundHandler.play(251);
+ if (_globals->_sceneManager._previousScene == 2100) {
+ if (_globals->getFlag(72)) {
+ _globals->_player.postInit();
+ _globals->_player.setVisage(0);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ SceneObjectWrapper *wrapper = new SceneObjectWrapper();
+ _globals->_player.setObjectWrapper(wrapper);
+ _globals->_player.setPosition(Common::Point(57, 94));
+ _globals->_player.changeZoom(-1);
+ _globals->_player.fixPriority(10);
+ if (_globals->getFlag(81)) {
+ setAction(&_action4);
+ } else {
+ _object1.setPosition(Common::Point(151, 182));
+ _object1.changeZoom(100);
+ setAction(&_action1);
+ }
+ } else {
+ _globals->_soundHandler.play(250);
+ _globals->setFlag(72);
+
+ _object3.postInit();
+ _object3.setVisage(5001);
+ _object3.setStrip2(1);
+ _object3.animate(ANIM_MODE_1, NULL);
+ _object3.setPosition(Common::Point(307, 0));
+ _object3.changeZoom(-1);
+ setAction(&_action3);
+ }
+ } else if (_globals->_sceneManager._previousScene == 2280) {
+ _globals->_player.postInit();
+ _globals->_player.setVisage(2170);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.setPosition(Common::Point(57, 94));
+ _globals->_player.changeZoom(-1);
+ _globals->_player.fixPriority(10);
+ _globals->_player.disableControl();
+ _sceneMode = 7001;
+ setAction(&_action6, this);
+ if (!_globals->getFlag(81)) {
+ _object1.setPosition(Common::Point(151, 182));
+ _object1.changeZoom(100);
+ }
+ _object8.remove();
+ _object9.remove();
+ } else if (_globals->_sceneManager._previousScene == 2320) {
+ _globals->_player.postInit();
+ _globals->_player.setVisage(0);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ SceneObjectWrapper *wrapper = new SceneObjectWrapper();
+ _globals->_player.setObjectWrapper(wrapper);
+ _globals->_player.setPosition(Common::Point(57, 94));
+ _globals->_player.changeZoom(-1);
+ _globals->_player.fixPriority(10);
+ _sceneMode = 7001;
+ setAction(&_action6, this);
+ } else {
+ _globals->setFlag(72);
+
+ _object3.postInit();
+ _object3.setVisage(5001);
+ _object3.setStrip2(1);
+ _object3.setPosition(Common::Point(307, 0));
+ _soundHandler.play(151);
+ _soundHandler.holdAt(true);
+ _globals->_soundHandler.play(250);
+ setAction(&_action3);
+ }
+
+ _hotspot1.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+ _globals->_sceneItems.push_back(&_hotspot1);
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene7000::signal() {
+ Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene;
+ switch (_sceneMode) {
+ case 7001:
+ case 7002:
+ case 7004:
+ case 7005:
+ case 7006:
+ case 7007:
+ case 7008:
+ case 7009:
+ _globals->_player.enableControl();
+ break;
+ case 7003:
+ _sceneMode = 7001;
+ setAction(&scene->_sequenceManager, this, 7001, &_globals->_player, NULL);
+ break;
+ case 7011:
+ _sceneMode = 7005;
+ setAction(&scene->_sequenceManager, this, 7005, &_globals->_player, NULL);
+ break;
+ case 7012:
+ _sceneMode = 7005;
+ setAction(&scene->_sequenceManager, this, 7012, &_globals->_player, NULL);
+ break;
+ case 7015:
+ setAction(&_action4);
+ break;
+ }
+}
+
+
+/*--------------------------------------------------------------------------
+ * Scene 7100 - Underwater: swimming
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene7100::Action3::signal() {
+ Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(1);
+ break;
+ case 1: {
+ Common::Point pt(433, 308);
+ NpcMover *mover = new NpcMover();
+ scene->_object4.addMover(mover, &pt, this);
+ break;
+ }
+ case 2:
+ scene->_object4.remove();
+ remove();
+ break;
+ }
+}
+
+void Scene7100::Action4::signal() {
+ Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(_globals->_randomSource.getRandomNumber(1) + 1);
+ break;
+ case 1: {
+ scene->_object5.setStrip(3);
+ Common::Point pt(85, 52);
+ NpcMover *mover = new NpcMover();
+ scene->_object5.addMover(mover, &pt, this);
+ break;
+ }
+ case 2: {
+ scene->_object5.setStrip(4);
+ Common::Point pt(20, 52);
+ NpcMover *mover = new NpcMover();
+ scene->_object5.addMover(mover, &pt, this);
+ break;
+ }
+ case 3:
+ _actionIndex = 0;
+ setDelay(1);
+ break;
+ }
+}
+
+void Scene7100::Action5::signal() {
+ Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(1);
+ break;
+ case 1: {
+ Common::Point pt(59, 151);
+ NpcMover *mover = new NpcMover();
+ scene->_object9.addMover(mover, &pt, this);
+ break;
+ }
+ case 2: {
+ scene->_object9.setStrip2(1);
+ Common::Point pt(127, 144);
+ NpcMover *mover = new NpcMover();
+ scene->_object9.addMover(mover, &pt, this);
+ break;
+ }
+ case 3: {
+ scene->_object9.setStrip2(2);
+ scene->_object9.fixPriority(180);
+ Common::Point pt(8, 181);
+ NpcMover *mover = new NpcMover();
+ scene->_object9.addMover(mover, &pt, this);
+ break;
+ }
+ case 4: {
+ scene->_object9.remove();
+ remove();
+ }
+ }
+}
+
+void Scene7100::Action6::signal() {
+ Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(1);
+ scene->_object10.fixPriority(8);
+ scene->_object10.setPosition(Common::Point(155, 187));
+
+ scene->_object11.fixPriority(8);
+ scene->_object11.setPosition(Common::Point(155, 190));
+
+ scene->_object12.fixPriority(8);
+ scene->_object12.setPosition(Common::Point(151, 193));
+ break;
+ case 1: {
+ Common::Point pt1(167, 187);
+ NpcMover *mover1 = new NpcMover();
+ scene->_object10.addMover(mover1, &pt1, this);
+
+ Common::Point pt2(165, 185);
+ NpcMover *mover2 = new NpcMover();
+ scene->_object11.addMover(mover2, &pt2, NULL);
+
+ Common::Point pt3(163, 183);
+ NpcMover *mover3 = new NpcMover();
+ scene->_object12.addMover(mover3, &pt3, NULL);
+ break;
+ }
+ case 2: {
+ scene->_object10.setStrip2(6);
+ Common::Point pt1(91, 187);
+ NpcMover *mover1 = new NpcMover();
+ scene->_object10.addMover(mover1, &pt1, this);
+
+ scene->_object11.setStrip2(6);
+ scene->_object11.fixPriority(50);
+ Common::Point pt2(89, 185);
+ NpcMover *mover2 = new NpcMover();
+ scene->_object11.addMover(mover2, &pt2, NULL);
+
+ scene->_object12.setStrip2(6);
+ scene->_object12.fixPriority(50);
+ Common::Point pt3(87, 183);
+ NpcMover *mover3 = new NpcMover();
+ scene->_object12.addMover(mover3, &pt3, NULL);
+ break;
+ }
+ case 3:
+ _actionIndex = 0;
+ setDelay(1);
+ break;
+ }
+}
+
+void Scene7100::Action7::signal() {
+ Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(1);
+ break;
+ case 1: {
+ scene->_object13.setStrip2(8);
+ Common::Point pt(324, 87);
+ NpcMover *mover = new NpcMover();
+ scene->_object13.addMover(mover, &pt, this);
+ break;
+ }
+ case 2: {
+ scene->_object13.setStrip2(2);
+ Common::Point pt(524, 104);
+ NpcMover *mover = new NpcMover();
+ scene->_object13.addMover(mover, &pt, NULL);
+ break;
+ }
+ case 3:
+ _actionIndex = 0;
+ setDelay(1);
+ break;
+ }
+}
+
+void Scene7100::Action8::signal() {
+ Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(1);
+ break;
+ case 1: {
+ scene->_object17.setStrip2(4);
+ scene->_object18.setStrip2(4);
+ scene->_object19.setStrip2(4);
+
+ Common::Point pt1(482, 153);
+ NpcMover *mover1 = new NpcMover();
+ scene->_object17.addMover(mover1, &pt1, this);
+
+ Common::Point pt2(480, 146);
+ NpcMover *mover2 = new NpcMover();
+ scene->_object18.addMover(mover2, &pt2, NULL);
+
+ Common::Point pt3(470, 153);
+ NpcMover *mover3 = new NpcMover();
+ scene->_object19.addMover(mover3, &pt3, NULL);
+ break;
+ }
+ case 2: {
+ scene->_object17.setStrip2(3);
+ scene->_object18.setStrip2(3);
+ scene->_object19.setStrip2(3);
+
+ Common::Point pt1(506, 186);
+ NpcMover *mover1 = new NpcMover();
+ scene->_object17.addMover(mover1, &pt1, this);
+
+ Common::Point pt2(502, 179);
+ NpcMover *mover2 = new NpcMover();
+ scene->_object18.addMover(mover2, &pt2, NULL);
+
+ Common::Point pt3(495, 184);
+ NpcMover *mover3 = new NpcMover();
+ scene->_object19.addMover(mover3, &pt3, NULL);
+ break;
+ }
+ case 3: {
+ scene->_object17.setStrip2(4);
+ scene->_object18.setStrip2(4);
+ scene->_object19.setStrip2(4);
+
+ Common::Point pt1(386, 167);
+ NpcMover *mover1 = new NpcMover();
+ scene->_object17.addMover(mover1, &pt1, this);
+
+ Common::Point pt2(379, 161);
+ NpcMover *mover2 = new NpcMover();
+ scene->_object18.addMover(mover2, &pt2, NULL);
+
+ Common::Point pt3(373, 167);
+ NpcMover *mover3 = new NpcMover();
+ scene->_object19.addMover(mover3, &pt3, NULL);
+ break;
+ }
+ case 4: {
+ scene->_object17.setStrip2(3);
+ scene->_object18.setStrip2(3);
+ scene->_object19.setStrip2(3);
+
+ Common::Point pt1(479, 193);
+ NpcMover *mover1 = new NpcMover();
+ scene->_object17.addMover(mover1, &pt1, this);
+
+ Common::Point pt2(473, 187);
+ NpcMover *mover2 = new NpcMover();
+ scene->_object18.addMover(mover2, &pt2, NULL);
+
+ Common::Point pt3(466, 192);
+ NpcMover *mover3 = new NpcMover();
+ scene->_object19.addMover(mover3, &pt3, NULL);
+ break;
+ }
+ case 5: {
+ Common::Point pt1(552, 183);
+ NpcMover *mover1 = new NpcMover();
+ scene->_object17.addMover(mover1, &pt1, this);
+
+ Common::Point pt2(552, 178);
+ NpcMover *mover2 = new NpcMover();
+ scene->_object18.addMover(mover2, &pt2, NULL);
+
+ Common::Point pt3(541, 183);
+ NpcMover *mover3 = new NpcMover();
+ scene->_object19.addMover(mover3, &pt3, NULL);
+
+ _actionIndex = 0;
+ break;
+ }
+ }
+}
+
+void Scene7100::Action9::signal() {
+ Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(1);
+ break;
+ case 1: {
+ scene->_object24.setStrip2(1);
+ Common::Point pt(64, 159);
+ NpcMover *mover = new NpcMover();
+ scene->_object24.addMover(mover, &pt, this);
+ break;
+ }
+ case 2: {
+ scene->_object24.setStrip2(2);
+ scene->_object24.fixPriority(160);
+ Common::Point pt(34, 159);
+ NpcMover *mover = new NpcMover();
+ scene->_object24.addMover(mover, &pt, this);
+ break;
+ }
+ case 3: {
+ scene->_object24.setStrip2(1);
+ Common::Point pt(64, 159);
+ NpcMover *mover = new NpcMover();
+ scene->_object24.addMover(mover, &pt, this);
+ break;
+ }
+ case 4: {
+ scene->_object24.setStrip2(2);
+ scene->_object24.fixPriority(180);
+ Common::Point pt(-12, 182);
+ NpcMover *mover = new NpcMover();
+ scene->_object24.addMover(mover, &pt, this);
+ break;
+ }
+ case 5: {
+ _actionIndex = 0;
+ setDelay(1);
+ break;
+ }
+ }
+}
+
+void Scene7100::Action10::signal() {
+ Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(1000);
+ break;
+ case 1: {
+ Common::Point pt(610, -60);
+ NpcMover *mover = new NpcMover();
+ scene->_object25.addMover(mover, &pt, this);
+ break;
+ }
+ case 2:
+ scene->_object25.remove();
+ remove();
+ break;
+ }
+}
+
+void Scene7100::Action11::signal() {
+ Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(30);
+ break;
+ case 1: {
+ Common::Point pt(154, 175);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ ObjectMover2 *mover2 = new ObjectMover2();
+ scene->_object1.addMover(mover2, 25, 35, &_globals->_player);
+ break;
+ }
+ case 2: {
+ Common::Point pt(700, 155);
+ NpcMover *mover = new NpcMover();
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 3:
+ _globals->_sceneManager.changeScene(7200);
+ remove();
+ break;
+ }
+}
+
+void Scene7100::postInit(SceneObjectList *OwnerList) {
+ loadScene(7100);
+ Scene::postInit();
+ setZoomPercents(60, 85, 200, 100);
+
+ _object2.postInit();
+ _object2.setVisage(7161);
+ _object2.animate(ANIM_MODE_2, NULL);
+ _object2.setPosition(Common::Point(10, 140));
+ _object2._numFrames = 1;
+ _object2.fixPriority(180);
+ _object2.setAction(&_action1, NULL);
+
+ _object3.postInit();
+ _object3.setVisage(7161);
+ _object3.animate(ANIM_MODE_2, NULL);
+ _object3.setPosition(Common::Point(34, 115));
+ _object3._numFrames = 1;
+ _object3.fixPriority(180);
+ _object3.setAction(&_action2, NULL);
+
+ _object4.postInit();
+ _object4.setVisage(7164);
+ _object4.animate(ANIM_MODE_2, NULL);
+ _object4.setPosition(Common::Point(-10, 159));
+ _object4._numFrames = 2;
+ _object4.fixPriority(250);
+ _object4.setAction(&_action3, NULL);
+
+ _object5.postInit();
+ _object5.setVisage(7162);
+ _object5.setStrip(3);
+ _object5.animate(ANIM_MODE_2, NULL);
+ _object5.setPosition(Common::Point(20, 52));
+ _object5.setAction(&_action4, NULL);
+
+ _object9.postInit();
+ _object9.setVisage(7160);
+ _object5.setStrip(2);
+ _object9.animate(ANIM_MODE_2, NULL);
+ _object9.setPosition(Common::Point(110, 168));
+ _object9._numFrames = 2;
+ _object9.fixPriority(16);
+ _object9.setAction(&_action5, NULL);
+
+ _object13.postInit();
+ _object13.setVisage(7161);
+ _object13.setStrip(8);
+ _object13.animate(ANIM_MODE_2, NULL);
+ _object13.setPosition(Common::Point(524, 104));
+ _object13._numFrames = 5;
+ _object13.fixPriority(250);
+ _object13.setAction(&_action7, NULL);
+
+ _object17.postInit();
+ _object17.setVisage(7160);
+ _object17.setStrip(3);
+ _object17.animate(ANIM_MODE_2, NULL);
+ _object17.setPosition(Common::Point(552, 183));
+ _object17._numFrames = 4;
+ _object17._moveDiff.x = 12;
+ _object17._moveDiff.y = 12;
+ _object17.setAction(&_action8, NULL);
+
+ _object18.postInit();
+ _object18.setVisage(7160);
+ _object18.setStrip(3);
+ _object18.animate(ANIM_MODE_2, NULL);
+ _object18.setPosition(Common::Point(552, 178));
+ _object18._numFrames = 4;
+ _object18._moveDiff.x = 12;
+ _object18._moveDiff.y = 12;
+
+ _object19.postInit();
+ _object19.setVisage(7160);
+ _object19.setStrip(3);
+ _object19.animate(ANIM_MODE_2, NULL);
+ _object19.setPosition(Common::Point(541, 183));
+ _object19._numFrames = 4;
+ _object19._moveDiff.x = 12;
+ _object19._moveDiff.y = 12;
+
+ _object24.postInit();
+ _object24.setVisage(7162);
+ _object24.setStrip(1);
+ _object24.animate(ANIM_MODE_2, NULL);
+ _object24.setPosition(Common::Point(-12, 182));
+ _object24._numFrames = 4;
+ _object24.fixPriority(180);
+ _object24.setAction(&_action9, NULL);
+
+ _object25.postInit();
+ _object25.setVisage(7163);
+ _object25.animate(ANIM_MODE_2, NULL);
+ _object25.setPosition(Common::Point(551, 145));
+ _object25._numFrames = 5;
+ _object25.fixPriority(160);
+ _object25.setAction(&_action10, NULL);
+
+ // Swimmer 1
+ _globals->_player.postInit();
+ _globals->_player.setVisage(7101);
+ _globals->_player.animate(ANIM_MODE_2, NULL);
+ _globals->_player._moveDiff.x = 4;
+ _globals->_player._moveDiff.y = 2;
+ _globals->_player.setPosition(Common::Point(135, 135));
+ _globals->_player.fixPriority(200);
+ _globals->_player.disableControl();
+
+ // Swimmer 2
+ _object1.postInit();
+ _object1.setVisage(7110);
+ _object1.animate(ANIM_MODE_1, NULL);
+ _object1._moveDiff.x = 4;
+ _object1._moveDiff.y = 2;
+ _object1.setPosition(Common::Point(100, 100));
+
+ setAction(&_action11);
+ _soundHandler1.play(270);
+ _soundHandler2.play(275);
+ _globals->_soundHandler.play(270);
+}
+/*--------------------------------------------------------------------------
+ * Scene 7200 - Underwater: Entering the cave
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene7200::Action1::signal() {
+ Scene7200 *scene = (Scene7200 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(15);
+ break;
+ case 1: {
+ PlayerMover *mover1 = new PlayerMover();
+ Common::Point pt1(165, 147);
+ scene->_swimmer.addMover(mover1, &pt1, this);
+ Common::Point pt2(207, 138);
+ PlayerMover *mover2 = new PlayerMover();
+ _globals->_player.addMover(mover2, &pt2, this);
+ break;
+ }
+ case 2:
+ break;
+ case 3:
+ _globals->_sceneManager.changeScene(7300);
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene7200::Action2::signal() {
+ Scene7200 *scene = (Scene7200 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(3);
+ break;
+ case 1: {
+ scene->_object2.fixPriority(25);
+ scene->_object3.fixPriority(25);
+ scene->_object4.fixPriority(25);
+ scene->_object2.setStrip(1);
+ scene->_object3.setStrip(1);
+ scene->_object4.setStrip(1);
+ NpcMover *mover1 = new NpcMover();
+ Common::Point pt1(54, 90);
+ scene->_object2.addMover(mover1, &pt1, this);
+ NpcMover *mover2 = new NpcMover();
+ Common::Point pt2(56, 85);
+ scene->_object3.addMover(mover2, &pt2, NULL);
+ NpcMover *mover3 = new NpcMover();
+ Common::Point pt3(54, 80);
+ scene->_object4.addMover(mover3, &pt3, NULL);
+ break;
+ }
+ case 2: {
+ scene->_object2.fixPriority(160);
+ scene->_object3.fixPriority(160);
+ scene->_object4.fixPriority(160);
+ scene->_object2.setStrip(2);
+ scene->_object3.setStrip(2);
+ scene->_object4.setStrip(2);
+ NpcMover *mover1 = new NpcMover();
+ Common::Point pt1(10, 89);
+ scene->_object2.addMover(mover1, &pt1, this);
+ NpcMover *mover2 = new NpcMover();
+ Common::Point pt2(12, 84);
+ scene->_object3.addMover(mover2, &pt2, NULL);
+ NpcMover *mover3 = new NpcMover();
+ Common::Point pt3(10, 79);
+ scene->_object4.addMover(mover3, &pt3, NULL);
+ break;
+ }
+ case 3:
+ _actionIndex = 0;
+ setDelay(1);
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene7200::postInit(SceneObjectList *OwnerList) {
+ loadScene(7200);
+ Scene::postInit();
+ _object2.postInit();
+ _object2.setVisage(7160);
+ _object2.animate(ANIM_MODE_2, NULL);
+ _object2.setZoom(10);
+ _object2.setPosition(Common::Point(53, 88));
+ _object2.setAction(&_action2);
+
+ _object3.postInit();
+ _object3.setVisage(7160);
+ _object3.animate(ANIM_MODE_2, NULL);
+ _object3.setZoom(10);
+ _object3.setPosition(Common::Point(55, 83));
+
+ _object4.postInit();
+ _object4.setVisage(7160);
+ _object4.animate(ANIM_MODE_2, NULL);
+ _object4.setZoom(10);
+ _object4.setPosition(Common::Point(57, 78));
+
+ _object5.postInit();
+ _object5.setVisage(7201);
+ _object5.setPosition(Common::Point(300, 172));
+ _object5.setPriority(172);
+ _object5.animate(ANIM_MODE_2, NULL);
+ _object5._numFrames = 3;
+
+ _object6.postInit();
+ _object6.setVisage(7201);
+ _object6.setStrip2(3);
+ _object6.setPosition(Common::Point(144, 97));
+ _object6.setPriority(199);
+ _object6.animate(ANIM_MODE_2, NULL);
+ _object6._numFrames = 3;
+
+ _object7.postInit();
+ _object7.setVisage(7201);
+ _object7.setStrip2(4);
+ _object7.setPosition(Common::Point(115, 123));
+ _object7.setPriority(199);
+ _object7.animate(ANIM_MODE_2, NULL);
+ _object7._numFrames = 3;
+
+ _object8.postInit();
+ _object8.setVisage(7201);
+ _object8.setStrip2(6);
+ _object8.setPosition(Common::Point(140, 173));
+ _object8.setPriority(199);
+ _object8.animate(ANIM_MODE_2, NULL);
+ _object8._numFrames = 3;
+
+ _object9.postInit();
+ _object9.setVisage(7201);
+ _object9.setStrip2(7);
+ _object9.setPosition(Common::Point(215, 196));
+ _object9.setPriority(199);
+ _object9.animate(ANIM_MODE_2, NULL);
+ _object9._numFrames = 3;
+
+ // Orange swimmer
+ _globals->_player.postInit();
+ _globals->_player.setVisage(7110);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.setZoom(50);
+ _globals->_player.setPosition(Common::Point(-18, 16));
+ _globals->_player.disableControl();
+
+ _swimmer.postInit();
+ _swimmer.setVisage(7101);
+ _swimmer.animate(ANIM_MODE_1, NULL);
+ _swimmer.setObjectWrapper(new SceneObjectWrapper());
+ _swimmer.setZoom(50);
+ _swimmer.setPosition(Common::Point(-8, 16));
+
+ setAction(&_action1);
+ _soundHandler.play(271);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 7300 - Underwater: Lord Poria
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene7300::Action1::signal() {
+ Scene7300 *scene = (Scene7300 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ case 1:
+ case 3:
+ setDelay(30);
+ break;
+ case 2:
+ scene->_stripManager.start(7300, this);
+ break;
+ case 4: {
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(102, 122);
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 5:
+ _globals->_player.setStrip(2);
+ _globals->_player.setFrame(1);
+ _globals->_player.animate(ANIM_MODE_5, this);
+ break;
+ case 6:
+ _globals->_player.setStrip(3);
+ _globals->_player._numFrames = 5;
+ _globals->_player.animate(ANIM_MODE_2, this);
+ if (RING_INVENTORY._translator._sceneNumber == 1)
+ scene->_stripManager.start(7310, this);
+ else
+ scene->_stripManager.start(7305, this);
+ break;
+ case 7:
+ setDelay(3);
+ _globals->_soundHandler.fadeOut(NULL);
+ break;
+ case 8:
+ _globals->_sceneManager.changeScene(2280);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene7300::Action2::signal() {
+ Scene7300 *scene = (Scene7300 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(5);
+ break;
+ case 1:
+ NpcMover *mover1 = new NpcMover();
+ Common::Point pt(_globals->_randomSource.getRandomNumber(3) + 203, _globals->_randomSource.getRandomNumber(3) + 96);
+ scene->_object3.addMover(mover1, &pt, this);
+ _actionIndex = 0;
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene7300::Action3::signal() {
+ Scene7300 *scene = (Scene7300 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(5);
+ break;
+ case 1:
+ NpcMover *mover1 = new NpcMover();
+ Common::Point pt(_globals->_randomSource.getRandomNumber(5) + 76, _globals->_randomSource.getRandomNumber(5) + 78);
+ scene->_object1.addMover(mover1, &pt, this);
+ _actionIndex = 0;
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene7300::Action4::signal() {
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(5);
+ break;
+ case 1:
+ _actionIndex = 0;
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene7300::dispatch() {
+ Scene7300 *scene = (Scene7300 *)_globals->_sceneManager._scene;
+ scene->_object4.setPosition(Common::Point(scene->_object3._position.x + 15, scene->_object3._position.y + 61));
+ scene->_object2.setPosition(Common::Point(scene->_object1._position.x + 1, scene->_object1._position.y - 31));
+
+ Scene::dispatch();
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene7300::postInit(SceneObjectList *OwnerList) {
+ loadScene(7300);
+
+ Scene::postInit();
+ setZoomPercents(60, 85, 200, 100);
+
+ _globals->setFlag(52);
+ _globals->setFlag(24);
+ _globals->setFlag(109);
+
+ _stripManager.addSpeaker(&_speakerPOR);
+ _stripManager.addSpeaker(&_speakerPOText);
+ _stripManager.addSpeaker(&_speakerSKText);
+ _stripManager.addSpeaker(&_speakerQU);
+
+ _speakerSKText.setTextPos(Common::Point(100, 20));
+ _speakerPOText.setTextPos(Common::Point(100, 160));
+
+ _object4.postInit();
+ _object4.setVisage(7311);
+ _object4.setStrip(1);
+ _object4.setFrame(1);
+ _object4.setPosition(Common::Point(218, 157));
+
+ _object3.postInit();
+ _object3.setVisage(7311);
+ _object3.setStrip(2);
+ _object3.setFrame(1);
+ _object3.setPosition(Common::Point(203, 96));
+ _object3._numFrames = 2;
+ _object3._moveDiff = Common::Point(1, 1);
+ _object3.animate(ANIM_MODE_8, 0, NULL);
+ _object3._moveRate = 2;
+ _object3.setAction(&_action2);
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(7305);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setPosition(Common::Point(-100, 100));
+ _globals->_player.disableControl();
+
+ _object1.postInit();
+ _object1.setVisage(7312);
+ _object1.animate(ANIM_MODE_1, NULL);
+ _object1._moveDiff = Common::Point(1, 1);
+ _object1.setPosition(Common::Point(76, 78));
+ _object1._moveRate = 1;
+ _object1.setAction(&_action3);
+
+ _object2.postInit();
+ _object2.setVisage(7312);
+ _object2.setStrip(2);
+ _object2.animate(ANIM_MODE_2, NULL);
+ _object2.setPosition(Common::Point(77, 47));
+ _object2.fixPriority(190);
+
+ _object5.postInit();
+ _object5.setVisage(7300);
+ _object5.setPosition(Common::Point(106, 45));
+ _object5.animate(ANIM_MODE_2, NULL);
+ _object5._numFrames = 5;
+
+ _object6.postInit();
+ _object6.setVisage(7300);
+ _object6.setStrip2(2);
+ _object6.setPosition(Common::Point(283, 193));
+ _object6.animate(ANIM_MODE_2, NULL);
+ _object6._numFrames = 3;
+
+ _object7.postInit();
+ _object7.setVisage(7300);
+ _object7.setStrip(4);
+ _object7.setPosition(Common::Point(295, 77));
+ _object7.animate(ANIM_MODE_2, NULL);
+ _object7._numFrames = 3;
+
+ _object8.postInit();
+ _object8.setVisage(7300);
+ _object8.setStrip(5);
+ _object8.setPosition(Common::Point(1, 147));
+ _object8.animate(ANIM_MODE_2, NULL);
+ _object8._numFrames = 2;
+
+ setAction(&_action1);
+ _globals->_soundHandler.play(272);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 7600 - Floating Buildings: Outside
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene7600::Action1::signal() {
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(120);
+ break;
+ case 1: {
+ PlayerMover *mover = new PlayerMover();
+ Common::Point pt(389, 57);
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 2:
+ _globals->_sceneManager.changeScene(7700);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene7600::Action2::signal() {
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(30);
+ break;
+ case 1: {
+ NpcMover *mover = new NpcMover();
+ Common::Point pt(-30, 195);
+ _globals->_player.addMover(mover, &pt, this);
+ break;
+ }
+ case 2:
+ _globals->_sceneManager.changeScene(2320);
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene7600::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ setZoomPercents(100, 0, 200, 100);
+
+ _object2.postInit();
+ _object2.setVisage(7601);
+ _object2.setStrip(1);
+ _object2.animate(ANIM_MODE_2, NULL);
+ _object2.setPosition(Common::Point(48, 135));
+ _object2.fixPriority(1);
+
+ _object3.postInit();
+ _object3.setVisage(7601);
+ _object3.setStrip(2);
+ _object3.animate(ANIM_MODE_2, NULL);
+ _object3.setPosition(Common::Point(158, 136));
+ _object3.fixPriority(1);
+
+ _object4.postInit();
+ _object4.setVisage(7601);
+ _object4.setStrip(3);
+ _object4.animate(ANIM_MODE_2, NULL);
+ _object4.setPosition(Common::Point(293, 141));
+ _object4.fixPriority(1);
+
+ _object5.postInit();
+ _object5.setVisage(7601);
+ _object5.setStrip(4);
+ _object5.animate(ANIM_MODE_2, NULL);
+ _object5.setPosition(Common::Point(405, 143));
+ _object5.fixPriority(1);
+
+ _object6.postInit();
+ _object6.setVisage(7601);
+ _object6.setStrip(5);
+ _object6.animate(ANIM_MODE_2, NULL);
+ _object6.setPosition(Common::Point(379, 191));
+ _object6.fixPriority(1);
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(2333);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ _globals->_player.setStrip(1);
+ _globals->_player._moveDiff = Common::Point(16, 16);
+ _globals->_player.changeZoom(-1);
+ _globals->_player.disableControl();
+
+ if (_globals->_sceneManager._previousScene == 7700) {
+ _globals->_player.setPosition(Common::Point(389, 57));
+ setAction(&_action2);
+ } else {
+ _globals->_player.setPosition(Common::Point(-50, 195));
+ setAction(&_action1);
+ }
+ _sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y);
+ loadScene(7600);
+ _soundHandler2.play(255);
+ _soundHandler1.play(251);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 7700 - Floating Buildings: In the lab
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene7700::Action1::signal() {
+ SceneObjectExt *fmtObj = (SceneObjectExt *) _endHandler;
+ switch (_actionIndex++) {
+ case 0: {
+ PlayerMover *mover1 = new PlayerMover();
+ Common::Point pt = Common::Point(fmtObj->_position.x, fmtObj->_position.y + 30);
+ _globals->_player.addMover(mover1, &pt, this);
+ break;
+ }
+ case 1:
+ _globals->_player.checkAngle(fmtObj);
+ if (fmtObj->_state == 0)
+ fmtObj->animate(ANIM_MODE_5, this);
+ else
+ fmtObj->animate(ANIM_MODE_6, this);
+ break;
+ case 2:
+ remove();
+ break;
+ }
+}
+
+void Scene7700::Action2::signal() {
+ Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ switch (_actionIndex++) {
+ case 0:
+ case 2:
+ setDelay(_globals->_randomSource.getRandomNumber(60) + 60);
+ break;
+ case 1:
+ scene->_prof.animate(ANIM_MODE_7, 0, NULL);
+ setDelay(20);
+ break;
+ case 3:
+ scene->_prof.animate(ANIM_MODE_6, this);
+ _actionIndex = 0;
+ break;
+ }
+}
+
+void Scene7700::Action3::signal() {
+ Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ switch (_actionIndex++) {
+ case 0:
+ scene->_object15.animate(ANIM_MODE_5, this);
+ break;
+ case 1:
+ scene->_sceneItem10.remove();
+ scene->_object15.remove();
+ scene->_sceneHotspot8.remove();
+ scene->_sceneHotspot9.remove();
+ scene->_object19.remove();
+ setDelay(60);
+ // No break on purpose!
+ case 2:
+ scene->_soundHandler.play(260);
+ scene->_object8.setVisage(7703);
+ scene->_object8.setPosition(Common::Point(177, 97));
+ scene->_object8.setStrip2(3);
+ scene->_object8.animate(ANIM_MODE_5, this);
+ scene->_object8._numFrames = 3;
+ break;
+ case 3:
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene7700::Action4::signal() {
+ Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ switch (_actionIndex++) {
+ case 2:
+ scene->_object13.remove();
+ // No break on purpose!
+ case 0:
+ setDelay(3);
+ break;
+ case 1:
+ CursorMan.showMouse(false);
+ scene->_object13.postInit();
+ scene->_object13.setVisage(7700);
+ scene->_object13.setStrip2(7);
+ scene->_object13.setPosition(Common::Point(151, 33));
+ scene->_object13.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ CursorMan.showMouse(true);
+ SceneItem::display2(7700, 11);
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+void Scene7700::Action5::signal() {
+ Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(_globals->_randomSource.getRandomNumber(240));
+ break;
+ case 1: {
+ scene->_cloud.setFrame(_globals->_randomSource.getRandomNumber(1) + 1);
+ scene->_cloud.setPosition(Common::Point(133, 145 + _globals->_randomSource.getRandomNumber(54)));
+
+ Common::Point pt(360, scene->_cloud._position.y);
+ NpcMover *mover = new NpcMover();
+ scene->_cloud.addMover(mover, &pt, this);
+ _actionIndex = 0;
+ break;
+ }
+ }
+}
+
+void Scene7700::Action6::signal() {
+ Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(5);
+ break;
+ case 1: {
+ Common::Point pt(2, 66);
+ NpcMover *mover = new NpcMover();
+ scene->_easterEgg1.addMover(mover, &pt, this);
+ break;
+ }
+ case 2:
+ scene->_easterEgg1.setStrip(2);
+ scene->_easterEgg1.setPosition(Common::Point(43, 65));
+
+ scene->_easterEgg2.postInit();
+ scene->_easterEgg2.setVisage(7708);
+ scene->_easterEgg2.setStrip(3);
+ scene->_easterEgg2.setPosition(Common::Point(116, 54));
+ scene->_easterEgg2.animate(ANIM_MODE_2, NULL);
+
+ setDelay(120);
+ break;
+ case 3:
+ scene->_easterEgg1.remove();
+ scene->_easterEgg2.remove();
+ remove();
+ break;
+ }
+}
+
+void Scene7700::SceneHotspot1::doAction(int action) {
+ if (action == CURSOR_LOOK)
+ SceneItem::display2(7700, 4);
+ else
+ SceneHotspot::doAction(action);
+}
+
+void Scene7700::SceneHotspot2::doAction(int action) {
+ if (action == CURSOR_LOOK)
+ SceneItem::display2(7700, 6);
+ else
+ SceneHotspot::doAction(action);
+}
+
+void Scene7700::SceneHotspot3::doAction(int action) {
+ Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case OBJECT_KEY:
+ SceneItem::display2(7702, 3);
+ RING_INVENTORY._key._sceneNumber = 7700;
+ break;
+ case CURSOR_LOOK:
+ if (RING_INVENTORY._key._sceneNumber == 7700)
+ scene->setAction(&scene->_action4, NULL);
+ else
+ SceneItem::display2(7700, 53);
+ break;
+ case CURSOR_USE:
+ if (!_globals->getFlag(78)) {
+ scene->_sceneMode = 7712;
+ scene->setAction(&scene->_sequenceManager, scene, 7715, NULL);
+ } else if (RING_INVENTORY._key._sceneNumber == 7700) {
+ _globals->_player.disableControl();
+ scene->_sceneMode = 7705;
+ scene->setAction(&scene->_sequenceManager, scene, 7705, &_globals->_player, NULL);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene7700::SceneHotspot4::doAction(int action) {
+ Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(7700, 12);
+ break;
+ case CURSOR_USE:
+ if (!_globals->getFlag(78)) {
+ scene->_sceneMode = 7712;
+ scene->setAction(&scene->_sequenceManager, scene, 7715, NULL);
+ } else {
+ SceneItem::display2(7700, 12);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene7700::SceneHotspot5::doAction(int action) {
+ Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(7700, 28);
+ break;
+ case CURSOR_USE:
+ if (_globals->getFlag(78)) {
+ if (RING_INVENTORY._paper._sceneNumber == 7700) {
+ _globals->_player.disableControl();
+ scene->_sceneMode = 7708;
+ scene->setAction(&scene->_sequenceManager, scene, 7708, &_globals->_player, NULL);
+ }
+ } else {
+ scene->_sceneMode = 7712;
+ scene->setAction(&scene->_sequenceManager, scene, 7715, NULL);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene7700::SceneHotspot6::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(7700, 43);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(7700, 56);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene7700::SceneItem7::doAction(int action) {
+ if (action == CURSOR_LOOK)
+ SceneItem::display2(7700, 51);
+}
+
+void Scene7700::SceneHotspot8::doAction(int action) {
+ Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(7700, 48);
+ break;
+ case CURSOR_USE:
+ scene->_sceneMode = 7709;
+ 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++;
+ } else {
+ scene->_field97B = 0;
+ scene->_field979 = 0;
+ scene->_field977 = 0;
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene7700::SceneHotspot9::doAction(int action) {
+ Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(7700, 48);
+ break;
+ case CURSOR_USE:
+ scene->_sceneMode = 7709;
+ 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->_field979 != 0) {
+ if (scene->_field979 != 4) {
+ scene->_field97B = 0;
+ scene->_field979 = 0;
+ scene->_field977 = 0;
+ } else {
+ scene->_field97B++;
+ if (scene->_field97B == 3) {
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_action3);
+ }
+ }
+ } else {
+ scene->_field977++;
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene7700::SceneItem10::doAction(int action) {
+}
+
+void Scene7700::Object1::doAction(int action) {
+ Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+
+ if (action == CURSOR_LOOK) {
+ SceneItem::display2(7700, _lookLineNum);
+ } else if (action == CURSOR_USE) {
+ if (_globals->getFlag(78)) {
+ _globals->_player.disableControl();
+ scene->setAction(&scene->_action1, this);
+ } else {
+ scene->_sceneMode = 7712;
+ scene->setAction(&scene->_sequenceManager, scene, 7715, NULL);
+ }
+ } else {
+ SceneHotspot::doAction(action);
+ }
+}
+
+void Scene7700::SceneHotspot11::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(7700, _lookLineNum);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(7701, _useLineNum);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene7700::Object1::signal() {
+ if (_state == 0) {
+ _state = 1;
+ SceneItem::display2(7701, _defltLineNum);
+ } else {
+ _state = 0;
+ }
+ _globals->_player.enableControl();
+}
+
+void Scene7700::Object3::doAction(int action) {
+ Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+
+ if (action == CURSOR_LOOK) {
+ SceneItem::display2(7700, 34);
+ } else if (action == CURSOR_USE) {
+ if (_globals->getFlag(78)) {
+ if (scene->_object3._frame == 1) {
+ _globals->_player.disableControl();
+ scene->_sceneMode = 7707;
+ scene->setAction(&scene->_sequenceManager, scene, 7707, &_globals->_player, this, NULL);
+ } else {
+ SceneItem::display2(7700, 60);
+ }
+ } else {
+ scene->_sceneMode = 7712;
+ scene->setAction(&scene->_sequenceManager, scene, 7715, NULL);
+ }
+ } else {
+ SceneHotspot::doAction(action);
+ }
+}
+
+void Scene7700::Object7::doAction(int action) {
+ Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_globals->getFlag(78))
+ SceneItem::display2(7700, 45);
+ else
+ SceneItem::display2(7700, 44);
+ break;
+ case CURSOR_USE:
+ if (_globals->getFlag(78)) {
+ SceneItem::display2(7701, 41);
+ } else {
+ scene->_sceneMode = 7712;
+ scene->setAction(&scene->_sequenceManager, scene, 7714, NULL);
+ }
+ break;
+ case CURSOR_TALK:
+ if (_globals->getFlag(78)) {
+ SceneItem::display2(7702, 1);
+ } else {
+ _globals->_player.disableControl();
+ if (_state == 0) {
+ _state = 1;
+ scene->_sceneMode = 7703;
+ scene->setAction(&scene->_sequenceManager, scene, 7703, NULL);
+ } else {
+ scene->_sceneMode = 7712;
+ scene->setAction(&scene->_sequenceManager, scene, 7712, NULL);
+ }
+ }
+ break;
+ case OBJECT_STUNNER:
+ if (!_globals->getFlag(78)) {
+ _globals->_soundHandler.stop();
+ _globals->setFlag(78);
+ setAction(NULL);
+ _globals->_player.disableControl();
+ scene->_sceneMode = 7704;
+ scene->setAction(&scene->_sequenceManager, scene, 7704, &_globals->_player, this, NULL);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene7700::Object8::doAction(int action) {
+ Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+
+ if ((action == CURSOR_LOOK) || (action == CURSOR_USE)) {
+ if (_strip == 3) {
+ scene->_object9.postInit();
+ scene->_object9.setVisage(7701);
+ scene->_object9.setStrip2(3);
+ scene->_object9.setPosition(Common::Point(91, 166));
+ scene->_object9.fixPriority(200);
+
+ scene->_object14.postInit();
+ scene->_object14.setVisage(7701);
+ scene->_object14.setStrip(2);
+ scene->_object14.fixPriority(250);
+ scene->_object14.setPosition(Common::Point(139, 151));
+
+ scene->_gfxButton.setText(EXIT_MSG);
+ scene->_gfxButton._bounds.center(140, 189);
+ scene->_gfxButton.draw();
+
+ _globals->_sceneItems.push_front(&scene->_sceneItem10);
+ _globals->_sceneItems.push_front(&scene->_object9);
+ _globals->_player._canWalk = false;
+ } else if (_globals->getFlag(78)) {
+ scene->_object15.postInit();
+ scene->_object15.setVisage(7701);
+ scene->_object15.setPosition(Common::Point(140, 165));
+ scene->_object15.fixPriority(200);
+
+ scene->_gfxButton.setText(EXIT_MSG);
+ scene->_gfxButton._bounds.center(140, 186);
+ scene->_gfxButton.draw();
+ scene->_gfxButton._bounds.expandPanes();
+
+ scene->_object19.postInit();
+ scene->_object19.setVisage(7700);
+ scene->_object19.setStrip(6);
+ scene->_object19.setPosition(Common::Point(140, 192));
+
+ _globals->_sceneItems.push_front(&scene->_sceneItem10);
+ _globals->_sceneItems.push_front(&scene->_sceneHotspot8);
+ _globals->_sceneItems.push_front(&scene->_sceneHotspot9);
+ _globals->_events.setCursor(CURSOR_WALK);
+ _globals->_player._canWalk = false;
+ } else {
+ scene->setAction(&scene->_sequenceManager, scene, 7715, NULL);
+ }
+ } else {
+ SceneHotspot::doAction(action);
+ }
+}
+
+void Scene7700::Object9::doAction(int action) {
+ Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(7700, 49);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(7701, 42);
+ break;
+ case CURSOR_TALK:
+ SceneItem::display2(7702, 4);
+ break;
+ case OBJECT_KEY:
+ if (_frame == 1) {
+ if (!_globals->getFlag(80)) {
+ scene->_object10.postInit();
+ scene->_object10.setVisage(7701);
+ scene->_object10.setStrip(4);
+ scene->_object10.setPosition(Common::Point(159, 136));
+ _globals->_sceneItems.push_front(&scene->_object10);
+ scene->_object10.fixPriority(240);
+ }
+
+ scene->_soundHandler.play(262);
+ scene->_object14.animate(ANIM_MODE_5, NULL);
+ }
+ _globals->_events.setCursor(CURSOR_WALK);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ }
+}
+
+void Scene7700::Object10::doAction(int action) {
+ Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+
+ if (action == CURSOR_LOOK) {
+ SceneItem::display2(7700, 50);
+ } else if (action == CURSOR_USE) {
+ _globals->_player._canWalk = true;
+ RING_INVENTORY._translator._sceneNumber = 1;
+ _globals->setFlag(80);
+ scene->_sceneItem10.remove();
+ scene->_gfxButton._bounds.expandPanes();
+ scene->_object14.remove();
+ scene->_object9.remove();
+ remove();
+ } else {
+ SceneHotspot::doAction(action);
+ }
+}
+
+void Scene7700::Object11::doAction(int action) {
+ Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case OBJECT_SCANNER:
+ if (_frame != 1)
+ SceneItem::display2(7701, 44);
+ else
+ SceneItem::doAction(action);
+ break;
+ case CURSOR_LOOK:
+ if (_frame != 1)
+ SceneItem::display2(7700, 9);
+ else
+ SceneItem::display2(7700, 52);
+ break;
+ case CURSOR_USE:
+ if (_frame != 1) {
+ SceneItem::display2(7701, 8);
+ } else {
+ _globals->setFlag(49);
+ _globals->_player.disableControl();
+ scene->_sceneMode = 7706;
+ scene->setAction(&scene->_sequenceManager, scene, 7706, &_globals->_player, this, NULL);
+ }
+ break;
+ case OBJECT_EMPTY_JAR:
+ RING_INVENTORY._emptyJar._sceneNumber = 0;
+ RING_INVENTORY._jar._sceneNumber = 1;
+ _globals->_player.disableControl();
+ scene->_sceneMode = 7710;
+ scene->setAction(&scene->_sequenceManager, scene, 7710, &_globals->_player, NULL);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ }
+}
+
+void Scene7700::Object12::doAction(int action) {
+ Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene;
+
+ if (action == CURSOR_LOOK) {
+ SceneItem::display2(7700, 15);
+ } else if (action == CURSOR_USE) {
+ if (_globals->getFlag(78)) {
+ scene->_sceneMode = 7713;
+ scene->setAction(&scene->_sequenceManager, scene, 7713, &_globals->_player, NULL);
+ } else {
+ scene->_sceneMode = 7712;
+ scene->setAction(&scene->_sequenceManager, scene, 7715, NULL);
+ }
+ } else {
+ SceneHotspot::doAction(action);
+ }
+}
+
+void Scene7700::signal() {
+ switch (_sceneMode) {
+ case 7701:
+ _globals->_player.fixPriority(-1);
+ _globals->_player.setStrip2(-1);
+ if (_globals->getFlag(78)) {
+ _globals->_player.enableControl();
+ } else {
+ _sceneMode = 7711;
+ setAction(&_sequenceManager, this, 7711, NULL);
+ }
+ break;
+ case 7702:
+ _globals->_soundHandler.fadeOut(NULL);
+ _globals->_sceneManager.changeScene(7600);
+ break;
+ case 7703:
+ case 7706:
+ case 7707:
+ case 7711:
+ case 7712:
+ _globals->_player.enableControl();
+ break;
+ case 7704:
+ _globals->_soundHandler.play(256);
+ _prof.setStrip2(4);
+ _prof.setFrame2(1);
+ _prof.setPosition(Common::Point(159, 87));
+ _globals->_player.enableControl();
+ break;
+ case 7705:
+ RING_INVENTORY._key._sceneNumber = 1;
+ _globals->_player.enableControl();
+ break;
+ case 7708:
+ RING_INVENTORY._paper._sceneNumber = 1;
+ _globals->_player.enableControl();
+ break;
+ case 7709:
+ _globals->_events.setCursor(CURSOR_USE);
+ break;
+ case 7710:
+ _globals->_player.enableControl();
+ SceneItem::display2(7700, 62);
+ break;
+ case 7713:
+ _emptyJar.remove();
+ RING_INVENTORY._emptyJar._sceneNumber = 1;
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene7700::process(Event &event) {
+ Scene::process(event);
+
+ if (contains<SceneItem *>(_globals->_sceneItems, &_sceneItem10)) {
+ if (_gfxButton.process(event)) {
+ _sceneItem10.remove();
+ _object15.remove();
+ _object9.remove();
+ if (_globals->_sceneObjects->contains(&_object10))
+ _object10.remove();
+ if (_globals->_sceneObjects->contains(&_object14))
+ _object14.remove();
+ _object19.remove();
+ _gfxButton._bounds.expandPanes();
+ _globals->_player._canWalk = true;
+ }
+ }
+ if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_p)) {
+ event.handled = true;
+ if (!_globals->_sceneObjects->contains(&_easterEgg1)) {
+ _easterEgg1.postInit();
+ _easterEgg1.setVisage(7708);
+ _easterEgg1.setPosition(Common::Point(163, 50));
+ _easterEgg1.fixPriority(1);
+ _easterEgg1.animate(ANIM_MODE_2, NULL);
+ _easterEgg1.setAction(&_action6);
+ }
+ }
+}
+
+void Scene7700::dispatch() {
+ if ((_globals->_sceneRegions.indexOf(_globals->_player._position) == 6) || (_globals->_player._position.x < 10))
+ _globals->_player.changeZoom(100 - ((_globals->_player._position.y - 68) / 2));
+ else
+ _globals->_player.changeZoom(-1);
+
+ if ((_action == 0) && (_globals->_sceneRegions.indexOf(_globals->_player._position) == 30)) {
+ _globals->_player.disableControl();
+ _sceneMode = 7702;
+ setAction(&_sequenceManager, this, 7702, &_globals->_player, NULL);
+ }
+ Scene::dispatch();
+}
+
+void Scene7700::postInit(SceneObjectList *OwnerList) {
+ loadScene(7700);
+ Scene::postInit();
+ setZoomPercents(100, 80, 200, 100);
+ _globals->setFlag(53);
+ _field97B = 0;
+ _field979 = 0;
+ _field977 = 0;
+
+ _stripManager.addSpeaker(&_speakerEText);
+ _stripManager.addSpeaker(&_speakerQText);
+ _speakerQText._npc = &_globals->_player;
+ _speakerEText._npc = &_prof;
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(4201);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ SceneObjectWrapper *wrapper = new SceneObjectWrapper();
+ _globals->_player.setObjectWrapper(wrapper);
+ _globals->_player.setPosition(Common::Point(-19, 68));
+ _globals->_player.setStrip2(7);
+ _globals->_player.fixPriority(95);
+ _globals->_player.changeZoom(80);
+ _globals->_player._moveDiff.x = 6;
+ _globals->_player._moveDiff.y = 3;
+ _globals->_player.disableControl();
+
+ _prof.postInit();
+ _prof.setVisage(7706);
+
+ if (_globals->getFlag(78)) {
+ _prof.setStrip2(4);
+ _prof.fixPriority(80);
+ _prof.setPosition(Common::Point(159, 87));
+ } else {
+ _prof.setPosition(Common::Point(203, 87));
+ _prof.setStrip2(2);
+ _prof._numFrames = 6;
+ _prof.setAction(&_action2);
+ }
+
+ _cloud.postInit();
+ _cloud.setVisage(7700);
+ _cloud.setStrip2(5);
+ _cloud.fixPriority(1);
+ _cloud.setPosition(Common::Point(133, 160));
+ _cloud._moveDiff.x = 1;
+ _cloud._moveRate = 7;
+ _cloud.setAction(&_action5);
+
+ _object1.postInit();
+ _object1.setVisage(7700);
+ _object1.setPosition(Common::Point(184, 61));
+ _object1._lookLineNum = 18;
+ _object1._defltLineNum = 16;
+
+ _object2.postInit();
+ _object2.setVisage(7700);
+ _object2.setPosition(Common::Point(184, 70));
+ _object2.fixPriority(60);
+ _object2._lookLineNum = 19;
+ _object2._defltLineNum = 17;
+
+ _object3.postInit();
+ _object3.setVisage(7703);
+ _object3.setPosition(Common::Point(288, 36));
+ _object3.setStrip(2);
+
+ _object4.postInit();
+ _object4.setVisage(7700);
+ _object4.setPosition(Common::Point(268, 59));
+ _object4.setStrip(2);
+ _object4._lookLineNum = 37;
+ _object4._defltLineNum = 35;
+
+ _object5.postInit();
+ _object5.setVisage(7700);
+ _object5.setPosition(Common::Point(268, 67));
+ _object5.fixPriority(58);
+ _object5.setStrip2(3);
+ _object5._lookLineNum = 38;
+ _object5._defltLineNum = 36;
+
+ _object6.postInit();
+ _object6.setVisage(7700);
+ _object6.setPosition(Common::Point(268, 75));
+ _object6.fixPriority(57);
+ _object6.setStrip2(4);
+ _object6._lookLineNum = 40;
+ _object6._defltLineNum = 43;
+
+ _object8.postInit();
+ _object8.setVisage(7703);
+ _object8.setPosition(Common::Point(203, 91));
+ _object8.setStrip2(4);
+ _object8.fixPriority(86);
+
+ _sceneHotspot8.setBounds(82, 141, 161, 92);
+ _sceneHotspot9.setBounds(82, 187, 161, 141);
+
+ _cork.postInit();
+ _cork.setVisage(7703);
+ _cork.setPosition(Common::Point(32, 128));
+
+ if (_globals->getFlag(49))
+ _cork.setFrame(_cork.getFrameCount());
+
+ if (RING_INVENTORY._emptyJar._sceneNumber == 7700) {
+ _emptyJar.postInit();
+ _emptyJar.setVisage(7700);
+ _emptyJar.setStrip(8);
+ _emptyJar.setPosition(Common::Point(189, 48));
+ _globals->_sceneItems.addItems(&_emptyJar, NULL);
+ }
+ _sceneHotspot1._sceneRegionId = 28;
+ _sceneHotspot2._sceneRegionId = 6;
+ _sceneHotspot3._sceneRegionId = 10;
+ _sceneHotspot4._sceneRegionId = 11;
+ _sceneHotspot5._sceneRegionId = 9;
+ _sceneHotspot6._sceneRegionId = 7;
+
+ _sceneItem7.setBounds(0, 320, 200, 0);
+ _sceneItem10.setBounds(0, 320, 200, 0);
+
+ _sceneHotspot11._sceneRegionId = 57;
+ _sceneHotspot11._useLineNum = 0;
+ _sceneHotspot11._lookLineNum = 0;
+ _sceneHotspot12._sceneRegionId = 2;
+ _sceneHotspot12._useLineNum = 2;
+ _sceneHotspot12._lookLineNum = 2;
+ _sceneHotspot13._sceneRegionId = 12;
+ _sceneHotspot13._useLineNum = 3;
+ _sceneHotspot13._lookLineNum = 3;
+ _sceneHotspot14._sceneRegionId = 18;
+ _sceneHotspot14._useLineNum = 4;
+ _sceneHotspot14._lookLineNum = 5;
+ _sceneHotspot15.setBounds(0, 55, 50, 8);
+ _sceneHotspot15._useLineNum = 6;
+ _sceneHotspot15._lookLineNum = 7;
+ _sceneHotspot16.setBounds(0, 130, 34, 103);
+ _sceneHotspot16._useLineNum = 7;
+ _sceneHotspot16._lookLineNum = 8;
+ _sceneHotspot17.setBounds(41, 180, 46, 170);
+ _sceneHotspot17._useLineNum = 11;
+ _sceneHotspot17._lookLineNum = 13;
+ _sceneHotspot18.setBounds(38, 187, 46, 180);
+ _sceneHotspot18._useLineNum = 12;
+ _sceneHotspot18._lookLineNum = 14;
+ _sceneHotspot19._sceneRegionId = 3;
+ _sceneHotspot19._useLineNum = 14;
+ _sceneHotspot19._lookLineNum = 16;
+ _sceneHotspot20._sceneRegionId = 14;
+ _sceneHotspot20._useLineNum = 15;
+ _sceneHotspot20._lookLineNum = 17;
+ _sceneHotspot21.setBounds(9, 215, 26, 210);
+ _sceneHotspot21._useLineNum = 18;
+ _sceneHotspot21._lookLineNum = 20;
+ _sceneHotspot22.setBounds(10, 221, 26, 215);
+ _sceneHotspot22._useLineNum = 19;
+ _sceneHotspot22._lookLineNum = 21;
+ _sceneHotspot23.setBounds(6, 230, 26, 225);
+ _sceneHotspot23._useLineNum = 20;
+ _sceneHotspot23._lookLineNum = 22;
+ _sceneHotspot24._sceneRegionId = 13;
+ _sceneHotspot24._useLineNum = 21;
+ _sceneHotspot24._lookLineNum = 23;
+ _sceneHotspot25._sceneRegionId = 21;
+ _sceneHotspot25._useLineNum = 22;
+ _sceneHotspot25._lookLineNum = 24;
+ _sceneHotspot26._sceneRegionId = 19;
+ _sceneHotspot26._useLineNum = 23;
+ _sceneHotspot26._lookLineNum = 25;
+ _sceneHotspot27._sceneRegionId = 27;
+ _sceneHotspot27._useLineNum = 24;
+ _sceneHotspot27._lookLineNum = 26;
+ _sceneHotspot28._sceneRegionId = 15;
+ _sceneHotspot28._useLineNum = 25;
+ _sceneHotspot28._lookLineNum = 27;
+ _sceneHotspot29._sceneRegionId = 26;
+ _sceneHotspot29._useLineNum = 27;
+ _sceneHotspot29._lookLineNum = 29;
+ _sceneHotspot30.setBounds(0, 317, 34, 310);
+ _sceneHotspot30._useLineNum = 28;
+ _sceneHotspot30._lookLineNum = 30;
+ _sceneHotspot31._sceneRegionId = 17;
+ _sceneHotspot31._useLineNum = 29;
+ _sceneHotspot31._lookLineNum = 31;
+ _sceneHotspot32._sceneRegionId = 25;
+ _sceneHotspot32._useLineNum = 30;
+ _sceneHotspot32._lookLineNum = 32;
+ _sceneHotspot33._sceneRegionId = 5;
+ _sceneHotspot33._useLineNum = 31;
+ _sceneHotspot33._lookLineNum = 33;
+ _sceneHotspot34.setBounds(42, 292, 48, 281);
+ _sceneHotspot34._useLineNum = 32;
+ _sceneHotspot34._lookLineNum = 35;
+ _sceneHotspot35._sceneRegionId = 24;
+ _sceneHotspot35._useLineNum = 38;
+ _sceneHotspot35._lookLineNum = 41;
+ _sceneHotspot36._sceneRegionId = 1;
+ _sceneHotspot36._useLineNum = 39;
+ _sceneHotspot36._lookLineNum = 42;
+
+ _globals->_sceneItems.addItems(&_prof, &_sceneHotspot35, &_object8, &_sceneHotspot34, &_sceneHotspot33, &_sceneHotspot32, NULL);
+ _globals->_sceneItems.addItems(&_sceneHotspot31, &_sceneHotspot30, &_sceneHotspot29, &_sceneHotspot5, &_sceneHotspot28, &_sceneHotspot27, NULL);
+ _globals->_sceneItems.addItems(&_sceneHotspot26, &_sceneHotspot25, &_sceneHotspot24, &_sceneHotspot23, &_sceneHotspot22, &_sceneHotspot21, NULL);
+ _globals->_sceneItems.addItems(&_sceneHotspot20, &_sceneHotspot19, &_sceneHotspot18, &_sceneHotspot17, &_sceneHotspot4, &_sceneHotspot3, NULL);
+ _globals->_sceneItems.addItems(&_sceneHotspot16, &_sceneHotspot15, &_sceneHotspot2, &_sceneHotspot14, &_cork, &_sceneHotspot1, NULL);
+ _globals->_sceneItems.addItems(&_sceneHotspot13, &_sceneHotspot12, &_sceneHotspot11, &_object2, &_object1, &_object3, NULL);
+ _globals->_sceneItems.addItems(&_object6, &_object5, &_object4, &_sceneHotspot6, &_sceneHotspot36, &_sceneItem7, NULL);
+
+ _sceneMode = 7701;
+ setAction(&_sequenceManager, this, 7701, &_globals->_player, NULL);
+ _soundHandler.play(256);
+}
+
+Scene7700::Scene7700() {
+ _object1._state = 0;
+ _object2._state = 0;
+ _object4._state = 0;
+ _object5._state = 0;
+ _object6._state = 0;
+ _prof._state = 0;
+}
+
+void Scene7700::synchronize(Serializer &s) {
+ Scene::synchronize(s);
+ if (s.getVersion() >= 3) {
+ s.syncAsSint16LE(_field977);
+ s.syncAsSint16LE(_field979);
+ s.syncAsSint16LE(_field97B);
+ }
+}
+
+} // End of namespace tSage
diff --git a/engines/tsage/ringworld/ringworld_scenes8.h b/engines/tsage/ringworld/ringworld_scenes8.h
new file mode 100644
index 0000000000..e4f82fc164
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_scenes8.h
@@ -0,0 +1,490 @@
+/* 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_RINGWORLD_SCENES8_H
+#define TSAGE_RINGWORLD_SCENES8_H
+
+#include "common/scummsys.h"
+#include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+
+namespace tSage {
+
+class NamedHotspotMult : public SceneHotspot {
+public:
+ int _useLineNum, _lookLineNum;
+ NamedHotspotMult() : SceneHotspot() {}
+
+ virtual Common::String getClassName() { return "NamedHotspotMult"; }
+ virtual void synchronize(Serializer &s);
+};
+
+class SceneObject7700 : public SceneObjectExt {
+public:
+ int _lookLineNum, _defltLineNum;
+
+ virtual void synchronize(Serializer &s);
+ virtual Common::String getClassName() { return "SceneObject7700"; }
+};
+
+class Scene7000 : public Scene {
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action3 : public Action {
+ public:
+ virtual void dispatch();
+ virtual void signal();
+ };
+ class Action4 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action5 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action6 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action7 : public Action {
+ public:
+ virtual void signal();
+ };
+
+ /* Objects */
+ class Object1 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+
+ /* Items */
+ class Hotspot1 : public SceneHotspot {
+ public:
+ virtual void doAction(int action);
+ };
+
+public:
+ ASound _soundHandler;
+ SequenceManager _sequenceManager;
+ SpeakerSKText _speakerSKText;
+ SpeakerSKL _speakerSKL;
+ SpeakerQL _speakerQL;
+ SpeakerQR _speakerQR;
+ SpeakerQText _speakerQText;
+ Object1 _object1;
+ SceneObject _object2;
+ SceneObject _object3;
+ SceneObject _object4;
+ SceneObject _object5;
+ SceneObject _object6;
+ SceneObject _object7;
+ SceneObject _object8;
+ SceneObject _object9;
+ SceneObject _object10;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ Action5 _action5;
+ Action6 _action6;
+ Action7 _action7;
+ Hotspot1 _hotspot1;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class Scene7100 : public Scene {
+ /* Actions */
+ class Action3 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action4 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action5 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action6 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action7 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action8 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action9 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action10 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action11 : public Action {
+ public:
+ virtual void signal();
+ };
+
+public:
+ ASound _soundHandler1;
+ ASound _soundHandler2;
+ SceneObject _object1;
+ SceneObject _object2;
+ SceneObject _object3;
+ SceneObject _object4;
+ SceneObject _object5;
+ SceneObject _object6;
+ SceneObject _object7;
+ SceneObject _object8;
+ SceneObject _object9;
+ SceneObject _object10;
+ SceneObject _object11;
+ SceneObject _object12;
+ SceneObject _object13;
+ SceneObject _object14;
+ SceneObject _object15;
+ SceneObject _object16;
+ SceneObject _object17;
+ SceneObject _object18;
+ SceneObject _object19;
+ SceneObject _object20;
+ SceneObject _object21;
+ SceneObject _object22;
+ SceneObject _object23;
+ SceneObject _object24;
+ SceneObject _object25;
+ Action _action1;
+ Action _action2;
+ Action3 _action3;
+ Action4 _action4;
+ Action5 _action5;
+ Action6 _action6;
+ Action7 _action7;
+ Action8 _action8;
+ Action9 _action9;
+ Action10 _action10;
+ Action11 _action11;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+};
+
+class Scene7200 : public Scene {
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2 : public Action {
+ public:
+ virtual void signal();
+ };
+
+public:
+ Action1 _action1;
+ Action2 _action2;
+ SceneObject _swimmer;
+ SceneObject _object2;
+ SceneObject _object3;
+ SceneObject _object4;
+ SceneObject _object5;
+ SceneObject _object6;
+ SceneObject _object7;
+ SceneObject _object8;
+ SceneObject _object9;
+ ASound _soundHandler;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+};
+
+class Scene7300 : public Scene {
+ /* 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();
+ };
+
+public:
+ SpeakerPOR _speakerPOR;
+ SpeakerPOText _speakerPOText;
+ SpeakerSKText _speakerSKText;
+ SpeakerQU _speakerQU;
+ SceneObject _object1;
+ SceneObject _object2;
+ SceneObject _object3;
+ SceneObject _object4;
+ SceneObject _object5;
+ SceneObject _object6;
+ SceneObject _object7;
+ SceneObject _object8;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void dispatch();
+};
+
+class Scene7600 : public Scene {
+ /* Actions */
+ class Action1 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2 : public Action {
+ public:
+ virtual void signal();
+ };
+
+public:
+ Action1 _action1;
+ Action2 _action2;
+ SceneObject _object1;
+ SceneObject _object2;
+ SceneObject _object3;
+ SceneObject _object4;
+ SceneObject _object5;
+ SceneObject _object6;
+ ASound _soundHandler1;
+ ASound _soundHandler2;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+};
+
+class Scene7700 : public Scene {
+ /* 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();
+ };
+ class Action5 : public Action {
+ public:
+ virtual void signal();
+ };
+ class Action6 : public Action {
+ public:
+ virtual void signal();
+ };
+
+ class Object1 : public SceneObject7700 {
+ public:
+ virtual void signal();
+ virtual void doAction(int action);
+ };
+ class Object3 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Object7 : public SceneObjectExt {
+ public:
+ virtual void doAction(int action);
+ };
+ class Object8 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Object9 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Object10 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Object11 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Object12 : public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+
+ /* Items */
+ class SceneHotspot1 : public SceneHotspot {
+ public:
+ virtual void doAction(int action);
+ };
+ class SceneHotspot2 : public SceneHotspot {
+ public:
+ virtual void doAction(int action);
+ };
+ class SceneHotspot3 : public SceneHotspot {
+ public:
+ virtual void doAction(int action);
+ };
+ class SceneHotspot4 : public SceneHotspot {
+ public:
+ virtual void doAction(int action);
+ };
+ class SceneHotspot5 : public SceneHotspot {
+ public:
+ virtual void doAction(int action);
+ };
+ class SceneHotspot6 : public SceneHotspot {
+ public:
+ virtual void doAction(int action);
+ };
+ class SceneItem7 : public SceneItem {
+ public:
+ virtual void doAction(int action);
+ };
+ class SceneHotspot8 : public SceneHotspot {
+ public:
+ virtual void doAction(int action);
+ };
+ class SceneHotspot9 : public SceneHotspot {
+ public:
+ virtual void doAction(int action);
+ };
+ class SceneItem10 : public SceneItem {
+ public:
+ virtual void doAction(int action);
+ };
+ class SceneHotspot11 : public NamedHotspotMult {
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ ASound _soundHandler;
+ SequenceManager _sequenceManager;
+ GfxButton _gfxButton;
+ SpeakerEText _speakerEText;
+ SpeakerQText _speakerQText;
+ Object1 _object1;
+ Object1 _object2;
+ Object3 _object3;
+ Object1 _object4;
+ Object1 _object5;
+ Object1 _object6;
+ Object7 _prof;
+ Object8 _object8;
+ Object9 _object9;
+ Object10 _object10;
+ Object11 _cork;
+ Object12 _emptyJar;
+ SceneObject _object13;
+ SceneObject _object14;
+ SceneObject _object15;
+ SceneObject _cloud;
+ SceneObject _easterEgg1;
+ SceneObject _easterEgg2;
+ SceneObject _object19;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Action4 _action4;
+ Action5 _action5;
+ Action6 _action6;
+ SceneHotspot1 _sceneHotspot1;
+ SceneHotspot2 _sceneHotspot2;
+ SceneHotspot3 _sceneHotspot3;
+ SceneHotspot4 _sceneHotspot4;
+ SceneHotspot5 _sceneHotspot5;
+ SceneHotspot6 _sceneHotspot6;
+ SceneItem7 _sceneItem7;
+ SceneHotspot8 _sceneHotspot8;
+ SceneHotspot9 _sceneHotspot9;
+ SceneItem10 _sceneItem10;
+ SceneHotspot11 _sceneHotspot11;
+ SceneHotspot11 _sceneHotspot12;
+ SceneHotspot11 _sceneHotspot13;
+ SceneHotspot11 _sceneHotspot14;
+ SceneHotspot11 _sceneHotspot15;
+ SceneHotspot11 _sceneHotspot16;
+ SceneHotspot11 _sceneHotspot17;
+ SceneHotspot11 _sceneHotspot18;
+ SceneHotspot11 _sceneHotspot19;
+ SceneHotspot11 _sceneHotspot20;
+ SceneHotspot11 _sceneHotspot21;
+ SceneHotspot11 _sceneHotspot22;
+ SceneHotspot11 _sceneHotspot23;
+ SceneHotspot11 _sceneHotspot24;
+ SceneHotspot11 _sceneHotspot25;
+ SceneHotspot11 _sceneHotspot26;
+ SceneHotspot11 _sceneHotspot27;
+ SceneHotspot11 _sceneHotspot28;
+ SceneHotspot11 _sceneHotspot29;
+ SceneHotspot11 _sceneHotspot30;
+ SceneHotspot11 _sceneHotspot31;
+ SceneHotspot11 _sceneHotspot32;
+ SceneHotspot11 _sceneHotspot33;
+ SceneHotspot11 _sceneHotspot34;
+ SceneHotspot11 _sceneHotspot35;
+ SceneHotspot11 _sceneHotspot36;
+ int _field977, _field979, _field97B;
+
+ Scene7700();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void process(Event &event);
+ virtual void dispatch();
+ virtual void synchronize(Serializer &s);
+};
+
+} // End of namespace tSage
+
+#endif