/* 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 { namespace Ringworld { /*-------------------------------------------------------------------------- * Scene 5000 - Caverns - Entrance * *--------------------------------------------------------------------------*/ void Scene5000::Action1::signal() { // Ship landing Scene5000 *scene = (Scene5000 *)g_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 *)g_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 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: g_globals->_player.setPosition(Common::Point(217, 76)); setDelay(10); break; case 1: g_globals->_player.setStrip2(3); g_globals->_player.animate(ANIM_MODE_1, NULL); ADD_MOVER(g_globals->_player, 214, 89); break; case 2: if (!g_globals->getFlag(59)) setAction(&scene->_action3, this); g_globals->_player.fixPriority(15); ADD_MOVER(g_globals->_player, 208, 100); break; case 3: ADD_MOVER(g_globals->_player, 213, 98); break; case 4: g_globals->_player.fixPriority(20); ADD_MOVER(g_globals->_player, 215, 115); break; case 5: g_globals->_player.changeZoom(47); ADD_MOVER(g_globals->_player, 220, 125); break; case 6: ADD_MOVER(g_globals->_player, 229, 115); break; case 7: g_globals->_player.changeZoom(-1); g_globals->_player.fixPriority(35); ADD_MOVER(g_globals->_player, 201, 166); break; case 8: g_globals->_player.updateZoom(); ADD_MOVER(g_globals->_player, 205, 146); break; case 9: g_globals->_player.changeZoom(-1); g_globals->_player.fixPriority(50); ADD_MOVER(g_globals->_player, 220, 182); break; case 10: g_globals->_player.updateZoom(); ADD_MOVER(g_globals->_player, 208, 163); break; case 11: g_globals->_player.changeZoom(-1); g_globals->_player.setStrip2(-1); g_globals->_player.fixPriority(-1); ADD_MOVER(g_globals->_player, 208, 175); break; case 12: g_globals->_player.setStrip(8); g_globals->_player.setFrame(1); setDelay(10); break; case 13: if (!g_globals->_sceneObjects->contains(&scene->_hotspot7)) setDelay(10); break; case 14: setDelay(30); break; case 15: g_globals->_player.enableControl(); remove(); break; } } void Scene5000::Action3::signal() { Scene5000 *scene = (Scene5000 *)g_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); g_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 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(1); break; case 1: g_globals->_player.fixPriority(50); g_globals->_player.setStrip2(4); ADD_MOVER(g_globals->_player, 210, 182); break; case 2: ADD_MOVER(g_globals->_player, 205, 146); break; case 3: g_globals->_player.fixPriority(35); ADD_MOVER(g_globals->_player, 201, 166); break; case 4: ADD_MOVER(g_globals->_player, 229, 115); break; case 5: g_globals->_player.fixPriority(20); g_globals->_player.changeZoom(47); ADD_MOVER(g_globals->_player, 220, 125); break; case 6: ADD_MOVER(g_globals->_player, 215, 115); break; case 7: g_globals->_player.changeZoom(-1); ADD_MOVER(g_globals->_player, 213, 98); break; case 8: g_globals->_player.fixPriority(15); ADD_MOVER(g_globals->_player, 208, 100); break; case 9: ADD_MOVER(g_globals->_player, 214, 89); break; case 10: ADD_MOVER(g_globals->_player, 217, 76); break; case 11: g_globals->_player.hide(); setDelay(60); break; case 12: if (!g_globals->_sceneObjects->contains(&scene->_hotspot7)) g_globals->_sceneManager.changeScene(2320); remove(); break; } } void Scene5000::Action5::signal() { Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: g_globals->_player.disableControl(); ADD_MOVER(g_globals->_player, 91, 155); break; case 1: g_globals->_player.setVisage(2670); g_globals->_player._strip = 4; g_globals->_player._frame = 1; g_globals->_player.animate(ANIM_MODE_5, this); break; case 2: SceneItem::display2(5000, g_globals->_sceneObjects->contains(&scene->_hotspot7) ? 17 : 13); g_globals->_player.animate(ANIM_MODE_6, this); break; case 3: g_globals->_player.setVisage(0); g_globals->_player._strip = 8; g_globals->_player.animate(ANIM_MODE_1, NULL); g_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 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: g_globals->_player.disableControl(); setDelay(3); break; case 1: g_globals->_events.setCursor(CURSOR_WALK); scene->_stripManager.start(2150, this); break; case 2: g_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: g_globals->_player.fixPriority(50); g_globals->_player.setStrip2(4); ADD_MOVER(g_globals->_player, 210, 182); break; case 5: g_globals->_sceneManager.changeScene(2100); break; } } /*--------------------------------------------------------------------------*/ void Scene5000::Hotspot7::doAction(int action) { Scene5000 *scene = (Scene5000 *)g_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 *)g_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 *)g_globals->_sceneManager._scene; if (g_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); g_globals->_player.postInit(); g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); g_globals->_player.setVisage(0); g_globals->_player.animate(ANIM_MODE_1, NULL); g_globals->_player._moveDiff = Common::Point(4, 2); g_globals->_player.changeZoom(-1); g_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)); g_globals->_sceneItems.addItems(&_hotspot9, &_hotspot10, &_hotspot11, &_hotspot8, &_hotspot13, &_hotspot14, &_hotspot12, &_hotspot15, &_hotspot17, &_hotspot18, &_hotspot16, NULL); switch (g_globals->_sceneManager._previousScene) { case 1000: case 2100: case 2320: if (g_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(); g_globals->_player.setPosition(Common::Point(217, -10)); g_globals->_player.disableControl(); setAction(&_action2); } else { g_globals->_player.setPosition(Common::Point(217, -10)); _hotspot1.setPosition(Common::Point(320, -10)); g_globals->_player.disableControl(); setAction(&_action1); } break; default: g_globals->_player.disableControl(); g_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, &g_globals->_player, NULL); break; } g_globals->_soundHandler.play(190); } void Scene5000::signal() { switch (_sceneMode) { case 5002: case 5003: case 5004: g_globals->_player.enableControl(); break; case 5005: g_globals->_sceneManager.changeScene(5100); break; } } void Scene5000::dispatch() { Scene::dispatch(); if (!_action) { if (!g_globals->_sceneObjects->contains(&_hotspot7) && (g_globals->_player.getRegionIndex() == 10)) { g_globals->_player.disableControl(); _sceneMode = 5005; setAction(&_sequenceManager, this, 5005, &g_globals->_player, NULL); } if (g_globals->_player.getRegionIndex() == 8) { g_globals->_player.disableControl(); if (g_globals->_sceneObjects->contains(&_hotspot7)) { _sceneMode = 5003; g_globals->_player.addMover(NULL); setAction(&_sequenceManager, this, 5003, &g_globals->_player, NULL); } else { setAction(&_action4); } } if (g_globals->_sceneObjects->contains(&_hotspot7) && (g_globals->_player.getRegionIndex() == 15)) { _sceneMode = 5002; g_globals->_player.disableControl(); g_globals->_player.addMover(NULL); setAction(&_sequenceManager, this, 5002, &g_globals->_player, NULL); } } } /*-------------------------------------------------------------------------- * Scene 5100 - Caverns * *--------------------------------------------------------------------------*/ void Scene5100::Action1::signal() { // Quinn enters the cave for the first time Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(5); break; case 1: ADD_MOVER(g_globals->_player, 1111, 165); break; case 2: g_globals->_player.setStrip(6); g_globals->_player.setFrame(1); setDelay(60); break; case 3: if (g_globals->getFlag(10)) { g_globals->_player.enableControl(); remove(); } else { g_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); g_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: g_globals->_player.enableControl(); remove(); break; } } void Scene5100::Action2::signal() { // Quinn and Seeker exit the cave Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: g_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 (g_globals->_player._position.x >= 966) { ADD_PLAYER_MOVER_NULL(scene->_hotspot8, 1215, 155); } else { ADD_PLAYER_MOVER_NULL(scene->_hotspot8, 966, 185); } if (g_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: g_globals->_sceneManager.changeScene(2100); break; } } void Scene5100::Action3::signal() { // Quinns shots flesheater Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: g_globals->setFlag(62); g_globals->_player.disableControl(); g_globals->_player.addMover(NULL); scene->_hotspot2.addMover(NULL); scene->_hotspot3.addMover(NULL); g_globals->_player.setVisage(2672); if (static_cast(_owner)->_position.x >= g_globals->_player._position.x) g_globals->_player._strip = 4; else g_globals->_player._strip = 3; g_globals->_player._frame = 1; g_globals->_player.animate(ANIM_MODE_5, this); break; case 1: g_globals->_player.setVisage(2674); g_globals->_player.setFrame(1); g_globals->_player.animate(ANIM_MODE_5, this); break; case 2: scene->_soundHandler.play(28); if (static_cast(_owner)->_position.x < g_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); } g_globals->_player.setVisage(2672); g_globals->_player._frame = g_globals->_player.getFrameCount(); g_globals->_player.animate(ANIM_MODE_6, this); break; case 3: break; case 4: SceneItem::display2(5100, 38); g_globals->_player.enableControl(); g_globals->_player.setVisage(0); g_globals->_player._strip = 8; g_globals->_player.animate(ANIM_MODE_1, NULL); remove(); break; } } void Scene5100::Action4::signal() { Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { g_globals->_player.disableControl(); scene->_soundHandler.play(208); SceneItem::display2(5100, 15); ObjectMover3 *mover = new ObjectMover3(); scene->_hotspot2.addMover(mover, &g_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: g_globals->_sceneManager.changeScene(5200); break; } } void Scene5100::Action5::signal() { // Quinns forgot the statis box in the throne room, and goes back Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: g_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, &g_globals->_player, &scene->_hotspot14, NULL); break; } } /*--------------------------------------------------------------------------*/ void Scene5100::HotspotGroup1::doAction(int action) { // Flesh Eaters Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(5100, g_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 (g_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 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(5100, 31); break; case CURSOR_USE: g_globals->_player.disableControl(); scene->_sceneMode = 5110; scene->setAction(&scene->_sequenceManager, scene, 5110, &g_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 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(5100, g_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 { g_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 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(5100, 32); break; case CURSOR_USE: g_globals->_player.disableControl(); scene->_sceneMode = 5117; scene->setAction(&scene->_sequenceManager, scene, 5117, &g_globals->_player, NULL); break; case OBJECT_STUNNER: SceneItem::display2(5100, 35); break; case OBJECT_SCANNER: SceneItem::display2(5100, 44); break; case OBJECT_BONE: g_globals->_player.disableControl(); scene->_sceneMode = 5116; scene->setAction(&scene->_sequenceManager, scene, 5116, &g_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 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(5100, 18); break; case CURSOR_USE: if (g_globals->getFlag(67)) SceneItem::display2(5100, 19); else { g_globals->_player.disableControl(); scene->_sceneMode = 5101; scene->setAction(&scene->_sequenceManager, scene, 5101, &g_globals->_player, this, NULL); } break; default: SceneHotspot::doAction(action); break; } } void Scene5100::Hotspot18::doAction(int action) { switch (action) { case CURSOR_LOOK: if (g_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 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(5100, g_globals->_sceneObjects->contains(&scene->_hotspot14) ? 27 : 20); break; case CURSOR_USE: g_globals->_player.disableControl(); scene->_sceneMode = 5106; if (g_globals->getFlag(66)) scene->setAction(&scene->_sequenceManager, scene, 5113, &g_globals->_player, NULL); else { g_globals->setFlag(66); scene->setAction(&scene->_sequenceManager, scene, 5106, &g_globals->_player, &scene->_hotspot14, NULL); } break; default: SceneHotspot::doAction(action); break; } } void Scene5100::Hotspot20::doAction(int action) { Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(5100, 21); break; case CURSOR_USE: g_globals->_player.disableControl(); if (g_globals->getFlag(67)) { scene->_sceneMode = 5112; scene->setAction(&scene->_sequenceManager, scene, 5112, &g_globals->_player, NULL); } else { scene->_sceneMode = 5101; scene->setAction(&scene->_sequenceManager, scene, 5106, &g_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 = &g_globals->_player; _speakerMText._npc = &g_globals->_player; _speakerSText._npc = &_hotspot8; g_globals->_player.postInit(); g_globals->_player.setVisage(0); g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); g_globals->_player.animate(ANIM_MODE_1, NULL); g_globals->_player.disableControl(); if ((!g_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 (g_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)); g_globals->_sceneItems.addItems(&_hotspot19, &_hotspot21, NULL); if (g_globals->getFlag(67)) { g_globals->_sceneItems.addItems(&_hotspot20, &_hotspot17, NULL); } else { g_globals->_sceneItems.addItems(&_hotspot17, &_hotspot20, NULL); } if (!g_globals->getFlag(105)) { _hotspot4.postInit(); _hotspot4.setVisage(5363); _hotspot4.setPosition(Common::Point(1025, 65)); _hotspot4.setStrip(4); _hotspot4.animate(ANIM_MODE_7, 0, NULL); g_globals->_sceneItems.push_back(&_hotspot4); _hotspot9.postInit(); _hotspot9.setVisage(5363); _hotspot9.setPosition(Common::Point(966, 120)); g_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(); g_globals->_sceneItems.push_back(&_hotspot6); } _hotspot16._sceneRegionId = 15; g_globals->_sceneItems.push_back(&_hotspot16); if (!g_globals->getFlag(62)) { _hotspot2.postInit(); _hotspot2.setVisage(5110); _hotspot2.animate(ANIM_MODE_1, NULL); _hotspot2._moveDiff.x = 4; g_globals->_sceneItems.push_back(&_hotspot2); _hotspot3.postInit(); _hotspot3.setVisage(5110); _hotspot3.animate(ANIM_MODE_1, NULL); _hotspot3._moveDiff.x = 4; g_globals->_sceneItems.push_back(&_hotspot3); if (g_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 (g_globals->getFlag(60) && (RING_INVENTORY._stasisBox._sceneNumber == 1) && g_globals->getFlag(107) && g_globals->getFlag(67)) { _hotspot8.postInit(); _hotspot8.setVisage(2806); _hotspot8.setPosition(Common::Point(557, 178)); _hotspot8.animate(ANIM_MODE_1, NULL); _hotspot8.setObjectWrapper(new SceneObjectWrapper()); g_globals->clearFlag(59); } switch (g_globals->_sceneManager._previousScene) { case 5000: default: g_globals->_player.setPosition(Common::Point(1184, 160)); setAction(&_action1); break; case 5200: if (g_globals->_stripNum == 5200) { g_globals->_player.setVisage(5101); g_globals->_player.fixPriority(200); g_globals->_player.setStrip(5); g_globals->_player.setFrame(1); g_globals->_player.setPosition(Common::Point(513, 199)); _sceneMode = 5108; setAction(&_sequenceManager, this, 5108, &g_globals->_player, NULL); } else { g_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, &g_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, &g_globals->_player); _hotspot17.setPosition(Common::Point(554, 182)); g_globals->_player.disableControl(); _sceneMode = 5105; setAction(&_sequenceManager, this, 5105, &g_globals->_player, NULL); } break; case 5300: switch (g_globals->_stripNum) { case 5300: _sceneMode = 5111; g_globals->_player.setVisage(5101); g_globals->_player.setStrip(6); g_globals->_player.fixPriority(170); g_globals->_player.setPosition(Common::Point(1168, 110)); setAction(&_sequenceManager, this, 5111, &g_globals->_player, NULL); _hotspot8.setPosition(Common::Point(1107, 178)); break; case 5302: g_globals->_player.setPosition(Common::Point(512, 190)); if (g_globals->_sceneObjects->contains(&_hotspot8)) setAction(&_action2); else g_globals->_player.enableControl(); break; case 5303: _hotspot8.setVisage(5102); _hotspot8.setPosition(Common::Point(533, 172)); g_globals->_player.setPosition(Common::Point(512, 190)); setAction(&_action2); break; } if (g_globals->getFlag(108)) { _hotspot6.postInit(); _hotspot6.setVisage(5362); _hotspot6.setPosition(Common::Point(542, 19)); _hotspot6.setStrip(6); _hotspot6.setFrame(1); g_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); g_globals->_sceneItems.push_back(&_hotspot6); } break; } _hotspot18.setBounds(Rect(0, 0, 1280, 200)); g_globals->_sceneItems.push_back(&_hotspot18); _hotspot15.postInit(); _hotspot15.setVisage(5140); _hotspot15.setStrip(3); _hotspot15.setPosition(Common::Point(977, 173)); _hotspot15.fixPriority(1); g_globals->_sceneManager._scene->_sceneBounds.center(g_globals->_player._position); loadScene(5100); g_globals->_soundHandler.play(205); } void Scene5100::signal() { switch (_sceneMode) { case 5101: case 5112: g_globals->setFlag(67); g_globals->_sceneManager.changeScene(5300); break; case 5102: case 5114: g_globals->_player.enableControl(); break; case 5103: if (g_globals->getFlag(61)) { SceneItem::display2(5100, 46); g_globals->_sceneManager.changeScene(5300); } else { SceneItem::display2(5100, 45); g_globals->_sceneManager.changeScene(5200); } break; case 5105: g_globals->_sceneManager.changeScene(5300); break; case 5106: g_globals->_stripNum = 5111; g_globals->_sceneManager.changeScene(5200); break; case 5108: if (!g_globals->getFlag(60)) g_globals->_player.enableControl(); else if (RING_INVENTORY._stasisBox._sceneNumber == 1) setAction(&_action2); else setAction(&_action5); break; case 5110: SceneItem::display2(5100, 30); g_globals->_player._angle = 325; g_globals->_player.enableControl(); break; case 5111: g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); g_globals->_player.setVisage(0); g_globals->_player.setStrip(6); g_globals->_player.fixPriority(-1); g_globals->_player.animate(ANIM_MODE_1, NULL); if ((RING_INVENTORY._vial._sceneNumber != 5100) && !g_globals->getFlag(108)) { g_globals->setFlag(108); _sceneMode = 5130; g_globals->_player.disableControl(); _speakerBatText.setTextPos(Common::Point(g_globals->_sceneManager._scene->_sceneBounds.left + 20, 30)); setAction(&_sequenceManager, this, 5130, &g_globals->_player, &_hotspot6, NULL); } else if (g_globals->_sceneObjects->contains(&_hotspot8)) { setAction(&_action2); } else { g_globals->_player.enableControl(); } break; case 5116: g_globals->setFlag(105); RING_INVENTORY._bone._sceneNumber = 0; g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); g_globals->_player.setVisage(0); g_globals->_player.setStrip(6); g_globals->_player.fixPriority(-1); g_globals->_player.animate(ANIM_MODE_1, NULL); // fall through case 5117: g_globals->_player.enableControl(); break; case 5130: _hotspot6.setVisage(5362); _hotspot6.setPosition(Common::Point(542, 25)); _hotspot6.setStrip(6); _hotspot6.setFrame(1); g_globals->_player.enableControl(); break; case 5150: g_globals->clearFlag(60); g_globals->_sceneManager.changeScene(5300); break; } } void Scene5100::dispatch() { // Flesheater trap if (_hotspot15._bounds.contains(g_globals->_player._position) && !g_globals->_player._visage) { g_globals->_player.disableControl(); g_globals->_player.addMover(NULL); _soundHandler.play(207); _sceneMode = 5103; setAction(&_sequenceManager, this, (g_globals->_player._position.x >= 966) ? 5104 : 5103, &g_globals->_player, &_hotspot15, NULL); } if (g_globals->getFlag(61) && !g_globals->getFlag(62) && ((g_globals->_player._position.x - _hotspot2._position.x) < 160) && (g_globals->_sceneManager._previousScene != 5200) && (_sceneMode != 5150)) { setAction(NULL); _sceneMode = 5150; _soundHandler.play(208); if (RING_INVENTORY._vial._sceneNumber == 5100) { g_globals->_player.addMover(NULL); g_globals->_player.disableControl(); SceneItem::display2(5100, 39); } _hotspot2.setStrip2(1); _hotspot3.setStrip2(2); ObjectMover3 *mover1 = new ObjectMover3(); _hotspot2.addMover(mover1, &g_globals->_player, 20, this); ObjectMover3 *mover2 = new ObjectMover3(); _hotspot3.addMover(mover2, &g_globals->_player, 20, this); } if (!_action) { if (((g_globals->_player._position.x - _hotspot2._position.x) < 130) && !g_globals->getFlag(61)) { g_globals->_player._canWalk = false; g_globals->_player.addMover(NULL); Common::Point pt(20, 25); PlayerMover2 *mover = new PlayerMover2(); _hotspot3.addMover(mover, &pt, &g_globals->_player); setAction(&_action4); } if ((g_globals->_sceneManager._scene->_backgroundBounds.right - 85) <= g_globals->_player._position.x) g_globals->_sceneManager.changeScene(5000); if (g_globals->_player.getRegionIndex() == 8) { _sceneMode = 5114; setAction(&_sequenceManager, this, 5115, &g_globals->_player, NULL); } } Scene::dispatch(); } /*-------------------------------------------------------------------------- * Scene 5200 - Caverns - Throne Room * *--------------------------------------------------------------------------*/ void Scene5200::Action1::signal() { Scene5200 *scene = (Scene5200 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(g_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 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: g_globals->_player.disableControl(); ADD_PLAYER_MOVER(92, 52); break; case 1: g_globals->_player.setVisage(5202); g_globals->_player._strip = 4; g_globals->_player._frame = 1; g_globals->_player.animate(ANIM_MODE_4, 3, 1, this); break; case 2: scene->_soundHandler.stop(); scene->_hotspot14.remove(); RING_INVENTORY._stasisBox._sceneNumber = 1; g_globals->_player.animate(ANIM_MODE_5, this); break; case 3: g_globals->_player.setVisage(0); g_globals->_player._strip = 3; g_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: g_globals->_player.enableControl(); remove(); break; } } void Scene5200::Action3::signal() { switch (_actionIndex++) { case 0: g_globals->_player.disableControl(); setDelay(5); break; case 1: ADD_PLAYER_MOVER(285, 62); break; case 2: g_globals->_player.enableControl(); remove(); break; } } void Scene5200::Action4::signal() { Scene5200 *scene = (Scene5200 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(120); break; case 1: g_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: g_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: SceneHotspot::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 *)g_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); _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); g_globals->_sceneItems.push_back(&_hotspot14); } if (g_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. g_globals->_soundHandler.play(205); g_globals->_player.disableControl(); g_globals->_player.postInit(); g_globals->_player.setVisage(0); g_globals->_player.changeZoom(75); g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); g_globals->_player.animate(ANIM_MODE_1, NULL); g_globals->_player.setStrip(1); g_globals->_player.setFrame(3); g_globals->_player.setPosition(Common::Point(307, 62)); setAction(&_action3); } else { // Happens when the player is captured by the flesh eaters the first time. g_globals->_player.postInit(); g_globals->_player.setVisage(2640); g_globals->_player._strip = 1; g_globals->_player._frame = 4; g_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); g_globals->_player.disableControl(); g_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; g_globals->_sceneItems.addItems(&_hotspot12, &_hotspot13, &_hotspot9, &_hotspot10, &_hotspot11, NULL); g_globals->_sceneManager._scene->_sceneBounds.center(g_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 && (g_globals->_player.getRegionIndex() == 12)) { g_globals->_stripNum = 5200; g_globals->_sceneManager.changeScene(5100); } } /*-------------------------------------------------------------------------- * Scene 5300 - Caverns - Pit * *--------------------------------------------------------------------------*/ void Scene5300::Action1::signal() { // Seeker waking up Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: g_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); g_globals->_player.animate(ANIM_MODE_1, NULL); g_globals->_player.setStrip2(-1); g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); ADD_MOVER(g_globals->_player, 85, 170); break; case 3: scene->_hotspot2.fixPriority(-1); g_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 (!g_globals->getFlag(106) || !g_globals->getFlag(107) || (RING_INVENTORY._stasisBox._sceneNumber != 1)) { g_globals->_player.enableControl(); remove(); } else { g_globals->setFlag(60); scene->_hotspot2._numFrames = 10; if (g_globals->getFlag(67)) { scene->_sceneMode = 5310; scene->setAction(&scene->_sequenceManager, scene, 5310, &g_globals->_player, &scene->_hotspot2, NULL); } else { scene->_sceneMode = 5347; scene->setAction(&scene->_sequenceManager, scene, 5347, NULL); } } break; } } void Scene5300::Action2::signal() { Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: g_globals->_player.disableControl(); setDelay(60); break; case 1: g_globals->setFlag(60); scene->_stripManager.start(5328, this); break; case 2: if (RING_INVENTORY._stasisBox._sceneNumber == 1) { g_globals->_stripNum = 5303; setDelay(5); } else { g_globals->_stripNum = 5302; scene->_stripManager.start(5329, this); } break; case 3: g_globals->_sceneManager.changeScene(5100); remove(); break; } } void Scene5300::Action3::signal() { Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: g_globals->_player.disableControl(); setDelay(30); break; case 1: scene->_stripManager.start(g_globals->_stripNum, this); break; case 2: g_globals->_player.enableControl(); remove(); break; } } /*--------------------------------------------------------------------------*/ void Scene5300::Hotspot1::doAction(int action) { Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(5300, 24); break; case CURSOR_TALK: g_globals->_stripNum = 5312; scene->setAction(&scene->_action3); break; default: SceneHotspot::doAction(action); break; } } void Scene5300::Hotspot2::doAction(int action) { // Seeker Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(5300, 23); break; case CURSOR_USE: if (!g_globals->getFlag(106)) { g_globals->_player.disableControl(); scene->_sceneMode = 5302; scene->setAction(&scene->_sequenceManager, scene, 5302, &g_globals->_player, NULL); } else { SceneItem::display2(5300, g_globals->getFlag(107) ? 25 : 20); } break; case CURSOR_TALK: if (!g_globals->getFlag(106)) { g_globals->_player.disableControl(); scene->_sceneMode = 5302; scene->setAction(&scene->_sequenceManager, scene, 5302, &g_globals->_player, NULL); } else if (!g_globals->getFlag(107)) { SceneItem::display2(5300, 11); } else { g_globals->_player.disableControl(); if (RING_INVENTORY._stasisBox._sceneNumber != 1) { scene->_sceneMode = 5316; scene->setAction(&scene->_sequenceManager, scene, 5316, NULL); } else { g_globals->setFlag(60); if (g_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, g_globals->getFlag(107) ? 10 : 9); break; case OBJECT_MEDKIT: if (g_globals->getFlag(106)) SceneItem::display2(5300, 7); else { g_globals->setFlag(106); g_globals->_player.disableControl(); scene->_sceneMode = 5303; scene->setAction(&scene->_sequenceManager, scene, 5303, &g_globals->_player, NULL); } break; case OBJECT_VIAL: if (g_globals->getFlag(107)) { SceneItem::display2(5300, 8); } else { RING_INVENTORY._vial._sceneNumber = 5300; g_globals->setFlag(107); g_globals->_player.disableControl(); scene->_sceneMode = 5304; scene->setAction(&scene->_sequenceManager, scene, 5304, &g_globals->_player, NULL); } break; default: SceneHotspot::doAction(action); break; } } void Scene5300::Hotspot5::doAction(int action) { // Sharp bone Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(5300, 27); break; case CURSOR_USE: RING_INVENTORY._bone._sceneNumber = 1; g_globals->_player.disableControl(); scene->_sceneMode = 5309; scene->setAction(&scene->_sequenceManager, scene, 5309, &g_globals->_player, this, NULL); break; default: SceneHotspot::doAction(action); break; } } void Scene5300::Hotspot6::doAction(int action) { // Left Hole Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: if (!g_globals->getFlag(105) || (RING_INVENTORY._vial._sceneNumber == 1)) SceneItem::display2(5300, 4); else SceneItem::display2(5300, 26); break; case CURSOR_USE: if (!g_globals->getFlag(105) || (RING_INVENTORY._vial._sceneNumber != 5100)) { g_globals->_player.disableControl(); scene->_sceneMode = 5301; scene->setAction(&scene->_sequenceManager, scene, 5301, &g_globals->_player, NULL); } else { g_globals->_player.disableControl(); scene->_sceneMode = 5307; RING_INVENTORY._vial._sceneNumber = 1; scene->setAction(&scene->_sequenceManager, scene, 5307, &scene->_hotspot1, &g_globals->_player, &scene->_hotspot4, NULL); } break; default: SceneHotspot::doAction(action); break; } } void Scene5300::Hotspot7::doAction(int action) { switch (action) { case CURSOR_LOOK: if (g_globals->getFlag(63)) SceneItem::display2(5300, 2); else { g_globals->setFlag(63); SceneItem::display2(5300, 0); SceneItem::display2(5300, 1); } break; case CURSOR_USE: if (g_globals->getFlag(64)) SceneItem::display2(5300, 15); else { g_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, g_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::synchronize(Serializer &s) { Scene::synchronize(s); if (s.getVersion() < 11) { int useless = 0; s.syncAsSint16LE(useless); } } 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 (g_globals->getFlag(106) && g_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 (g_globals->getFlag(67)) { g_globals->_player.postInit(); g_globals->_player.setVisage(5316); g_globals->_player.setPosition(Common::Point(191, 27)); g_globals->_player.disableControl(); if (g_globals->getFlag(107) && g_globals->getFlag(106)) { _hotspot2.setVisage(2806); _hotspot2.postInit(); _hotspot2.setObjectWrapper(new SceneObjectWrapper()); _hotspot2.animate(ANIM_MODE_1, NULL); setAction(&_action2); } else { g_globals->_player.setVisage(5315); g_globals->_player.setPosition(Common::Point(204, 86)); g_globals->_player.animate(ANIM_MODE_2, NULL); g_globals->_player.setStrip2(1); g_globals->_player._moveDiff.y = 12; _sceneMode = 5308; setAction(&_sequenceManager, this, 5308, &g_globals->_player, NULL); } } else { _hotspot3.postInit(); _hotspot3.setVisage(5301); _hotspot3.setPosition(Common::Point(172, 32)); _hotspot3.fixPriority(1); _hotspot3.animate(ANIM_MODE_NONE, NULL); g_globals->_player.postInit(); g_globals->_player.setVisage(5315); g_globals->_player.setPosition(Common::Point(204, 86)); g_globals->_player.animate(ANIM_MODE_2, NULL); g_globals->_player.setStrip2(1); g_globals->_player._moveDiff.y = 12; g_globals->_player.disableControl(); _sceneMode = 5306; setAction(&_sequenceManager, this, 5306, &g_globals->_player, &_hotspot3, NULL); } if (RING_INVENTORY._bone._sceneNumber == 5300) { _hotspot5.postInit(); _hotspot5.setVisage(5301); _hotspot5.setStrip(2); _hotspot5.setPosition(Common::Point(190, 147)); g_globals->_sceneItems.push_back(&_hotspot5); } _hotspot6.setBounds(Rect(74, 51, 114, 69)); _hotspot7.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); _hotspot8._sceneRegionId = 8; g_globals->_sceneItems.addItems(&_hotspot8, &_hotspot2, &_hotspot6, &_hotspot3, &_hotspot7, NULL); g_globals->_soundHandler.play(212); } void Scene5300::signal() { switch (_sceneMode) { case 5301: g_globals->_stripNum = 5300; g_globals->_sceneManager.changeScene(5100); break; case 5307: _soundHandler.fadeOut(NULL); // fall through case 5302: case 5308: case 5316: case 5347: g_globals->_player.setStrip2(-1); g_globals->_player.animate(ANIM_MODE_1, NULL); g_globals->_player.enableControl(); break; case 5303: g_globals->_player.animate(ANIM_MODE_1, NULL); g_globals->_player.enableControl(); if (g_globals->getFlag(107)) setAction(&_action1); else SceneItem::display2(5300, 28); break; case 5304: g_globals->_player.animate(ANIM_MODE_1, NULL); g_globals->_player.enableControl(); if (g_globals->getFlag(106)) setAction(&_action1); else SceneItem::display2(5300, 28); break; case 5306: g_globals->clearFlag(67); g_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(); g_globals->_player.enableControl(); break; case 5310: _hotspot2.fixPriority(41); _sceneMode = 5315; setAction(&_sequenceManager, this, 5315, &_hotspot2, NULL); break; case 5315: g_globals->_stripNum = 5302; g_globals->_sceneManager.changeScene(5100); break; } } } // End of namespace Ringworld } // End of namespace TsAGE