From c878731937a39f56cc63ef56d2190d2e02caa2d7 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Thu, 16 Oct 2014 07:55:54 +0200 Subject: TSAGE: Move Air Duct and Vampire lair mazes in separate source files --- engines/tsage/module.mk | 4 +- engines/tsage/ringworld2/ringworld2_airduct.cpp | 914 ++ engines/tsage/ringworld2/ringworld2_airduct.h | 90 + engines/tsage/ringworld2/ringworld2_logic.cpp | 2 + engines/tsage/ringworld2/ringworld2_scenes1.cpp | 13520 +++++++++------------- engines/tsage/ringworld2/ringworld2_scenes1.h | 184 - engines/tsage/ringworld2/ringworld2_vampire.cpp | 1821 +++ engines/tsage/ringworld2/ringworld2_vampire.h | 180 + 8 files changed, 8435 insertions(+), 8280 deletions(-) create mode 100644 engines/tsage/ringworld2/ringworld2_airduct.cpp create mode 100644 engines/tsage/ringworld2/ringworld2_airduct.h create mode 100644 engines/tsage/ringworld2/ringworld2_vampire.cpp create mode 100644 engines/tsage/ringworld2/ringworld2_vampire.h (limited to 'engines/tsage') diff --git a/engines/tsage/module.mk b/engines/tsage/module.mk index 3fc30f9f8f..d62f398c20 100644 --- a/engines/tsage/module.mk +++ b/engines/tsage/module.mk @@ -35,14 +35,16 @@ MODULE_OBJS := \ ringworld/ringworld_scenes8.o \ ringworld/ringworld_scenes10.o \ ringworld/ringworld_speakers.o \ + ringworld2/ringworld2_airduct.o \ ringworld2/ringworld2_dialogs.o \ ringworld2/ringworld2_logic.o \ + ringworld2/ringworld2_outpost.o \ ringworld2/ringworld2_scenes0.o \ ringworld2/ringworld2_scenes1.o \ ringworld2/ringworld2_scenes2.o \ ringworld2/ringworld2_scenes3.o \ - ringworld2/ringworld2_outpost.o \ ringworld2/ringworld2_speakers.o \ + ringworld2/ringworld2_vampire.o \ saveload.o \ scenes.o \ sound.o \ diff --git a/engines/tsage/ringworld2/ringworld2_airduct.cpp b/engines/tsage/ringworld2/ringworld2_airduct.cpp new file mode 100644 index 0000000000..dc43dba1ae --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_airduct.cpp @@ -0,0 +1,914 @@ +/* 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/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" +#include "tsage/ringworld2/ringworld2_airduct.h" + +namespace TsAGE { + +namespace Ringworld2 { + +/*-------------------------------------------------------------------------- + * Scene 1200 - Air Ducts Maze + * + *--------------------------------------------------------------------------*/ + +Scene1200::Scene1200() { + _nextCrawlDirection = 0; + _field414 = 0; + _field416 = 0; + _field418 = 0; + _field41A = 0; + _fixupMaze = false; +} + +void Scene1200::synchronize(Serializer &s) { + SceneExt::synchronize(s); + + s.syncAsSint16LE(_nextCrawlDirection); + s.syncAsSint16LE(_field414); + s.syncAsSint16LE(_field416); + s.syncAsSint16LE(_field418); + s.syncAsSint16LE(_field41A); + s.syncAsSint16LE(_fixupMaze); +} + +Scene1200::LaserPanel::LaserPanel() { +} + +void Scene1200::LaserPanel::Jumper::init(int state) { + _state = state; + + SceneActor::postInit(); + setup(1003, 1, 1); + fixPriority(255); + + switch (_state) { + case 1: + switch (R2_GLOBALS._ductMazePanel1State) { + case 1: + setFrame2(2); + setPosition(Common::Point(129, 101)); + break; + case 2: + setFrame2(3); + setPosition(Common::Point(135, 95)); + break; + default: + break; + } + break; + case 2: + switch (R2_GLOBALS._ductMazePanel2State) { + case 1: + setFrame2(2); + setPosition(Common::Point(152, 101)); + break; + case 2: + setFrame2(3); + setPosition(Common::Point(158, 122)); + break; + case 3: + setFrame2(3); + setPosition(Common::Point(135, 122)); + break; + default: + break; + } + break; + case 3: + switch (R2_GLOBALS._ductMazePanel3State) { + case 1: + setFrame2(3); + setPosition(Common::Point(158, 95)); + break; + case 2: + setFrame2(2); + setPosition(Common::Point(175, 101)); + break; + default: + break; + } + break; + default: + break; + } + + setDetails(1200, 12, -1, -1, 2, (SceneItem *) NULL); +} + +bool Scene1200::LaserPanel::Jumper::startAction(CursorType action, Event &event) { + if (action != CURSOR_USE) + return SceneActor::startAction(action, event); + + R2_GLOBALS._sound2.play(260); + switch (_state) { + case 1: + if (R2_GLOBALS._ductMazePanel1State == 1) { + R2_GLOBALS._ductMazePanel1State = 2; + setFrame2(3); + setPosition(Common::Point(135, 95)); + } else { + R2_GLOBALS._ductMazePanel1State = 1; + setFrame2(2); + setPosition(Common::Point(129, 101)); + } + break; + case 2: + ++R2_GLOBALS._ductMazePanel2State; + if (R2_GLOBALS._ductMazePanel2State == 4) + R2_GLOBALS._ductMazePanel2State = 1; + + switch (R2_GLOBALS._ductMazePanel2State) { + case 1: + setFrame2(2); + setPosition(Common::Point(152, 101)); + break; + case 2: + setFrame2(3); + setPosition(Common::Point(158, 122)); + break; + case 3: + setFrame2(3); + setPosition(Common::Point(135, 122)); + break; + default: + break; + } + break; + case 3: + if (R2_GLOBALS._ductMazePanel3State == 1) { + R2_GLOBALS._ductMazePanel3State = 2; + setFrame2(2); + setPosition(Common::Point(175, 101)); + } else { + R2_GLOBALS._ductMazePanel3State = 1; + setFrame2(3); + setPosition(Common::Point(158, 95)); + } + break; + default: + break; + } + + Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene; + scene->_field418 = 0; + + if ((R2_GLOBALS._ductMazePanel1State == 1) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1)) + scene->_field418 = 1; + else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1)) + scene->_field418 = 2; + else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 2)) + scene->_field418 = 3; + else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 3) && (R2_GLOBALS._ductMazePanel3State == 1)) + scene->_field418 = 4; + + return true; +} + +void Scene1200::LaserPanel::postInit(SceneObjectList *OwnerList) { + Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene; + + scene->_field41A = 1; + R2_GLOBALS._events.setCursor(CURSOR_USE); + setup2(1003, 1, 1, 100, 40); + setup3(1200, 11, -1, -1); + R2_GLOBALS._sound2.play(259); + _jumper1.init(1); + _jumper2.init(2); + _jumper3.init(3); + + R2_GLOBALS._player._canWalk = false; +} + +void Scene1200::LaserPanel::remove() { + Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene; + + scene->_field41A = 0; + scene->_sceneAreas.remove(&_jumper1); + scene->_sceneAreas.remove(&_jumper2); + scene->_sceneAreas.remove(&_jumper3); + _jumper1.remove(); + _jumper2.remove(); + _jumper3.remove(); + + ModalWindow::remove(); + R2_GLOBALS._player._canWalk = true; +} + +void Scene1200::postInit(SceneObjectList *OwnerList) { + loadScene(1200); + SceneExt::postInit(); + + if (R2_GLOBALS._sceneManager._previousScene < 3200) + R2_GLOBALS._sound1.play(257); + + _nextCrawlDirection = CRAWL_EAST; + _field414 = 0; + _field416 = 0; + _field418 = 0; + _field41A = 0; + + if ((R2_GLOBALS._ductMazePanel1State == 1) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1)) + _field418 = 1; + else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1)) + _field418 = 2; + else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 2)) + _field418 = 3; + else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 3) && (R2_GLOBALS._ductMazePanel3State == 1)) + _field418 = 4; + + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._player.setup(3156, 1, 6); + R2_GLOBALS._player.setPosition(Common::Point(160, 70)); + R2_GLOBALS._player._numFrames = 10; + R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 1200; + + _actor1.postInit(); + _actor1.hide(); + + _mazeUI.setDisplayBounds(Rect(110, 20, 210, 120)); + + _mazeUI.postInit(); + _mazeUI.load(1); + _mazeUI.setMazePosition(R2_GLOBALS._ventCellPos); + + R2_GLOBALS._player.enableControl(); + _item1.setDetails(Rect(0, 0, 320, 200), 1200, 0, 1, 2, 1, NULL); +} + +void Scene1200::signal() { + switch (_sceneMode++) { + case 1: + // No break on purpose + case 1200: + // No break on purpose + case 1201: + // No break on purpose + case 1202: + // No break on purpose + case 1203: + R2_GLOBALS._player.enableControl(); + // CHECKME: The original is calling _eventManager.waitEvent(); + _sceneMode = 2; + break; + case 10: + _field416 = 1; + _field414 = 6; + R2_GLOBALS._player._numFrames = 5; + R2_GLOBALS._player.setStrip(1); + R2_GLOBALS._player.setFrame(5); + R2_GLOBALS._player.animate(ANIM_MODE_6, this); + break; + case 11: + // No break on purpose + case 21: + // No break on purpose + case 31: + // No break on purpose + case 41: + _field416 = 0; + break; + case 12: + _field414 = 14; + R2_GLOBALS._player._numFrames = 10; + R2_GLOBALS._player.setup(3155, 1, 4); + R2_GLOBALS._player.setPosition(Common::Point(160, 70)); + R2_GLOBALS._player.animate(ANIM_MODE_2, NULL); + break; + case 13: + // No break on purpose + case 16: + // No break on purpose + case 23: + // No break on purpose + case 26: + // No break on purpose + case 33: + // No break on purpose + case 36: + // No break on purpose + case 43: + // No break on purpose + case 46: + R2_GLOBALS._player.setFrame(4); + _sceneMode = 1; + setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); + break; + case 15: + // No break on purpose + case 25: + // No break on purpose + case 35: + // No break on purpose + case 45: + _field414 = 20; + R2_GLOBALS._player.animate(ANIM_MODE_2, NULL); + break; + case 20: + _field416 = 1; + _field414 = 6; + R2_GLOBALS._player._numFrames = 5; + R2_GLOBALS._player.setStrip(2); + R2_GLOBALS._player.setFrame(5); + R2_GLOBALS._player.animate(ANIM_MODE_6, this); + break; + case 22: + _field414 = 14; + R2_GLOBALS._player._numFrames = 10; + R2_GLOBALS._player.setup(3155, 2, 4); + R2_GLOBALS._player.setPosition(Common::Point(160, 70)); + R2_GLOBALS._player.animate(ANIM_MODE_2, NULL); + break; + case 30: + _field416 = 1; + _field414 = 6; + R2_GLOBALS._player._numFrames = 5; + R2_GLOBALS._player.setStrip(3); + R2_GLOBALS._player.setFrame(5); + R2_GLOBALS._player.animate(ANIM_MODE_6, this); + break; + case 32: + _field414 = 14; + R2_GLOBALS._player._numFrames = 10; + R2_GLOBALS._player.setup(3155, 3, 4); + R2_GLOBALS._player.setPosition(Common::Point(160, 70)); + R2_GLOBALS._player.animate(ANIM_MODE_2, NULL); + break; + case 40: + _field416 = 1; + _field414 = 6; + R2_GLOBALS._player._numFrames = 5; + R2_GLOBALS._player.setStrip(4); + R2_GLOBALS._player.setFrame(5); + R2_GLOBALS._player.animate(ANIM_MODE_6, this); + break; + case 42: + _field414 = 14; + R2_GLOBALS._player._numFrames = 10; + R2_GLOBALS._player.setup(3155, 4, 4); + R2_GLOBALS._player.setPosition(Common::Point(160, 70)); + R2_GLOBALS._player.animate(ANIM_MODE_2, NULL); + break; + case 50: + // No break on purpose + case 55: + // No break on purpose + case 60: + R2_GLOBALS._player.setup(3156, 5, 1); + R2_GLOBALS._player._numFrames = 5; + R2_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 51: + // No break on purpose + case 56: + // No break on purpose + case 117: + R2_GLOBALS._player.setup(3157, 1, 1); + R2_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 52: + // No break on purpose + case 82: + // No break on purpose + case 118: + R2_GLOBALS._player.setup(3156, 3, 6); + _sceneMode = 1; + setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); + break; + case 57: + // No break on purpose + case 91: + // No break on purpose + case 96: + R2_GLOBALS._player.setup(3157, 2, 1); + R2_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 58: + // No break on purpose + case 92: + // No break on purpose + case 122: + R2_GLOBALS._player.setup(3156, 2, 6); + _sceneMode = 1; + setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); + break; + case 61: + R2_GLOBALS._player.setup(3157, 4, 5); + R2_GLOBALS._player.animate(ANIM_MODE_6, this); + break; + case 62: + // No break on purpose + case 72: + // No break on purpose + case 98: + R2_GLOBALS._player.setup(3156, 4, 6); + _sceneMode = 1; + setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); + break; + case 70: + // No break on purpose + case 75: + // No break on purpose + case 80: + R2_GLOBALS._player.setup(3156, 6, 1); + R2_GLOBALS._player._numFrames = 5; + R2_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 71: + // No break on purpose + case 76: + // No break on purpose + case 97: + R2_GLOBALS._player.setup(3157, 3, 1); + R2_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 77: + // No break on purpose + case 111: + // No break on purpose + case 116: + R2_GLOBALS._player.setup(3157, 4, 1); + R2_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 78: + // No break on purpose + case 102: + // No break on purpose + case 112: + R2_GLOBALS._player.setup(3156, 1, 6); + _sceneMode = 1; + setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); + break; + case 81: + R2_GLOBALS._player.setup(3157, 2, 5); + R2_GLOBALS._player.animate(ANIM_MODE_6, this); + break; + case 90: + // No break on purpose + case 95: + // No break on purpose + case 100: + R2_GLOBALS._player.setup(3156, 7, 1); + R2_GLOBALS._player._numFrames = 5; + R2_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 101: + R2_GLOBALS._player.setup(3157, 1, 5); + R2_GLOBALS._player.animate(ANIM_MODE_6, this); + break; + case 110: + // No break on purpose + case 115: + // No break on purpose + case 120: + R2_GLOBALS._player.setup(3156, 8, 1); + R2_GLOBALS._player._numFrames = 5; + R2_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 121: + R2_GLOBALS._player.setup(3157, 3, 5); + R2_GLOBALS._player.animate(ANIM_MODE_6, this); + break; + default: + // CHECKME: The original is walling _eventManager.waitEvent(); + _sceneMode = 2; + break; + } +} + +void Scene1200::process(Event &event) { + if (_field414 != 0) + return; + + Scene::process(event); + + if (!R2_GLOBALS._player._canWalk) + return; + + if (event.eventType == EVENT_BUTTON_DOWN) { + Common::Point cellPos = R2_GLOBALS._ventCellPos; + _mazeUI.pixelToCellXY(cellPos); + + int cellId = _mazeUI.getCellFromPixelXY(event.mousePos); + switch (R2_GLOBALS._events.getCursor()) { + case CURSOR_WALK: + event.handled = true; + if ((event.mousePos.x > 179) && (event.mousePos.x < 210) && (event.mousePos.y > 50) && (event.mousePos.y < 89)) + startCrawling(CRAWL_EAST); + + if ((event.mousePos.x > 109) && (event.mousePos.x < 140) && (event.mousePos.y > 50) && (event.mousePos.y < 89)) + startCrawling(CRAWL_WEST); + + if ((event.mousePos.x > 140) && (event.mousePos.x < 179) && (event.mousePos.y > 89) && (event.mousePos.y < 120)) + startCrawling(CRAWL_SOUTH); + + if ((event.mousePos.x > 140) && (event.mousePos.x < 179) && (event.mousePos.y > 19) && (event.mousePos.y < 50)) + startCrawling(CRAWL_NORTH); + break; + case CURSOR_USE: + if (cellId > 36) { + if ( ((cellPos.x == 3) && (cellPos.y == 33)) + || ((cellPos.x == 7) && (cellPos.y == 33)) + || ((cellPos.x == 33) && (cellPos.y == 41)) + || ((cellPos.x == 5) && (cellPos.y == 5)) + || ((cellPos.x == 13) && (cellPos.y == 21)) + || ((cellPos.x == 17) && (cellPos.y == 21)) + || ((cellPos.x == 17) && (cellPos.y == 5)) + || ((cellPos.x == 17) && (cellPos.y == 9)) + || ((cellPos.x == 29) && (cellPos.y == 17)) + || ((cellPos.x == 33) && (cellPos.y == 17)) + || ((cellPos.x == 35) && (cellPos.y == 17)) + || ((cellPos.x == 41) && (cellPos.y == 21)) ) { + _laserPanel.postInit(); + event.handled = true; + } + } + + if ((cellId == 1) || (cellId == 4) || (cellId == 11) || (cellId == 14)) { + if ( ((cellPos.x == 3) && (cellPos.y == 9)) + || ((cellPos.x == 11) && (cellPos.y == 27)) + || ((cellPos.x == 17) && (cellPos.y == 7)) + || ((cellPos.x == 17) && (cellPos.y == 27)) + || ((cellPos.x == 17) && (cellPos.y == 33)) + || (cellPos.x == 33) ) { + switch (cellPos.x) { + case 3: + R2_GLOBALS._sceneManager.changeScene(3150); + break; + case 33: + if (R2_GLOBALS._scientistConvIndex >= 4) + R2_GLOBALS._sceneManager.changeScene(3250); + else + SceneItem::display(1200, 6, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END); + break; + default: + SceneItem::display(1200, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END); + break; + } + event.handled = true; + } + } + break; + case CURSOR_LOOK: + if ((cellId == 1) || (cellId == 4) || (cellId == 11) || (cellId == 14)) { + event.handled = true; + switch (cellPos.x) { + case 3: + // It was your cell. + SceneItem::display(1200, 8, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + break; + case 9: + R2_GLOBALS._sceneManager.changeScene(3240); + break; + case 11: + if (cellPos.y == 27) + R2_GLOBALS._sceneManager.changeScene(3210); + else + // A vent grill + SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + break; + case 17: + switch (cellPos.y) { + case 5: + R2_GLOBALS._sceneManager.changeScene(3230); + break; + case 21: + R2_GLOBALS._sceneManager.changeScene(3220); + break; + case 33: + R2_GLOBALS._sceneManager.changeScene(3200); + break; + default: + // A vent grill + SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + break; + } + break; + case 33: + R2_GLOBALS._sceneManager.changeScene(3245); + break; + default: + SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + break; + } + } + if (cellId > 36) { + // "An anti-pest laser" + event.handled = true; + SceneItem::display(1200, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + } + break; + case CURSOR_TALK: + event.handled = true; + break; + default: + return; + } + } else if (event.eventType == EVENT_KEYPRESS) { + if (_field414) { + event.handled = false; + return; + } + + switch (event.kbd.keycode) { + case Common::KEYCODE_KP8: + case Common::KEYCODE_UP: + startCrawling(CRAWL_NORTH); + break; + case Common::KEYCODE_KP4: + case Common::KEYCODE_LEFT: + startCrawling(CRAWL_WEST); + break; + case Common::KEYCODE_KP6: + case Common::KEYCODE_RIGHT: + startCrawling(CRAWL_EAST); + break; + case Common::KEYCODE_KP2: + case Common::KEYCODE_DOWN: + startCrawling(CRAWL_SOUTH); + break; + default: + event.handled = false; + return; + break; + } + } else + return; +} + +void Scene1200::dispatch() { + Rect tmpRect; + Scene::dispatch(); + + if (_fixupMaze) { + _mazeUI.setMazePosition(R2_GLOBALS._ventCellPos); + //_mazeUI.draw(); + _fixupMaze = false; + } + + if (_field414 != 0) { + tmpRect.set(110, 20, 210, 120); + _field414--; + + switch (_nextCrawlDirection) { + case CRAWL_EAST: + R2_GLOBALS._ventCellPos.x += 2; + break; + case CRAWL_WEST: + R2_GLOBALS._ventCellPos.x -= 2; + break; + case CRAWL_SOUTH: + R2_GLOBALS._ventCellPos.y += 2; + break; + case CRAWL_NORTH: + R2_GLOBALS._ventCellPos.y -= 2; + break; + default: + break; + } + + _mazeUI.setMazePosition(R2_GLOBALS._ventCellPos); + //_mazeUI.draw(); + + if (_field416 != 0) { + switch(_nextCrawlDirection) { + case CRAWL_EAST: + R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x - 2, R2_GLOBALS._player._position.y)); + break; + case CRAWL_WEST: + R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x + 2, R2_GLOBALS._player._position.y)); + break; + case CRAWL_SOUTH: + R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y - 2)); + break; + case CRAWL_NORTH: + R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y + 2)); + break; + default: + break; + } + } + if (_field414 == 0) { + if (_field416 == 0) + R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL); + signal(); + } + } +} + +void Scene1200::saveCharacter(int characterIndex) { + R2_GLOBALS._sound1.fadeOut2(NULL); + SceneExt::saveCharacter(characterIndex); +} + +void Scene1200::startCrawling(CrawlDirection dir) { + Common::Point cellPos = R2_GLOBALS._ventCellPos; + _mazeUI.pixelToCellXY(cellPos); + + switch (dir) { + case CRAWL_EAST: + if ( ((_mazeUI.getCellFromPixelXY(Common::Point(200, 50)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(200, 88)) > 36)) + && ( ((cellPos.x == 3) && (cellPos.y == 33) && (_field418 != 4)) + || ((cellPos.x == 13) && (cellPos.y == 21) && (_field418 != 2)) + || ((cellPos.x == 29) && (cellPos.y == 17) && (_field418 != 1)) + || ((cellPos.x == 33) && (cellPos.y == 41)) ) + ) { + R2_GLOBALS._player.disableControl(); + _sceneMode = 1200; + setAction(&_sequenceManager, this, 1200, &_actor1, NULL); + } else if (_mazeUI.getCellFromPixelXY(Common::Point(200, 69)) == 36) { + switch (_nextCrawlDirection) { + case CRAWL_EAST: + if (R2_GLOBALS._player._visage == 3155) + _sceneMode = 15; + else + _sceneMode = 10; + break; + case CRAWL_WEST: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 76; + else + _sceneMode = 75; + break; + case CRAWL_SOUTH: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 101; + else + _sceneMode = 100; + break; + case CRAWL_NORTH: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 111; + else + _sceneMode = 110; + break; + default: + break; + } + R2_GLOBALS._player.disableControl(); + _nextCrawlDirection = 1; + signal(); + } + break; + case CRAWL_WEST: + if ( ((_mazeUI.getCellFromPixelXY(Common::Point(120, 50)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(120, 88)) > 36)) + && ( ((cellPos.x == 7) && (cellPos.y == 33) && (_field418 != 4)) + || ((cellPos.x == 17) && (cellPos.y == 21) && (_field418 != 2)) + || ((cellPos.x == 33) && (cellPos.y == 17) && (_field418 != 1)) + || ((cellPos.x == 5) && (cellPos.y == 5)) ) + ) { + R2_GLOBALS._player.disableControl(); + _sceneMode = 1201; + setAction(&_sequenceManager, this, 1201, &_actor1, NULL); + } else if (_mazeUI.getCellFromPixelXY(Common::Point(120, 69)) == 36) { + switch (_nextCrawlDirection) { + case CRAWL_EAST: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 56; + else + _sceneMode = 55; + break; + case CRAWL_WEST: + if (R2_GLOBALS._player._visage == 3155) + _sceneMode = 25; + else + _sceneMode = 20; + break; + case CRAWL_SOUTH: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 91; + else + _sceneMode = 90; + break; + case CRAWL_NORTH: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 121; + else + _sceneMode = 120; + break; + default: + break; + } + R2_GLOBALS._player.disableControl(); + _nextCrawlDirection = 2; + signal(); + } + break; + case CRAWL_SOUTH: + if ( ((_mazeUI.getCellFromPixelXY(Common::Point(140, 110)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(178, 110)) > 36)) + && ( ((cellPos.x == 17) && (cellPos.y == 5) && (_field418 != 3)) + || ((cellPos.x == 41) && (cellPos.y == 21)) ) + ) { + R2_GLOBALS._player.disableControl(); + _sceneMode = 1203; + setAction(&_sequenceManager, this, 1203, &_actor1, NULL); + } else if (_mazeUI.getCellFromPixelXY(Common::Point(160, 110)) == 36) { + switch (_nextCrawlDirection) { + case CRAWL_EAST: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 51; + else + _sceneMode = 50; + break; + case CRAWL_WEST: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 81; + else + _sceneMode = 80; + break; + case CRAWL_SOUTH: + if (R2_GLOBALS._player._visage == 3155) + _sceneMode = 35; + else + _sceneMode = 30; + break; + case CRAWL_NORTH: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 116; + else + _sceneMode = 115; + break; + default: + break; + } + R2_GLOBALS._player.disableControl(); + _nextCrawlDirection = 3; + signal(); + } + break; + case CRAWL_NORTH: + if ( ((_mazeUI.getCellFromPixelXY(Common::Point(140, 30)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(178, 30)) > 36)) + && ( ((cellPos.x == 17) && (cellPos.y == 9) && (_field418 != 3)) + || ((cellPos.x == 35) && (cellPos.y == 17)) ) + ) { + R2_GLOBALS._player.disableControl(); + _sceneMode = 1202; + setAction(&_sequenceManager, this, 1202, &_actor1, NULL); + } else if (_mazeUI.getCellFromPixelXY(Common::Point(160, 30)) == 36) { + switch (_nextCrawlDirection) { + case CRAWL_EAST: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 61; + else + _sceneMode = 60; + break; + case CRAWL_WEST: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 71; + else + _sceneMode = 70; + break; + case CRAWL_SOUTH: + if (R2_GLOBALS._player._visage == 3156) + _sceneMode = 96; + else + _sceneMode = 95; + break; + case CRAWL_NORTH: + if (R2_GLOBALS._player._visage == 3155) + _sceneMode = 45; + else + _sceneMode = 40; + break; + default: + _sceneMode = 1; + R2_GLOBALS._player.setup(3156, 4, 6); + break; + } + R2_GLOBALS._player.disableControl(); + _nextCrawlDirection = 4; + signal(); + } + break; + default: + break; + } +} + +} // End of namespace Ringworld2 +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld2/ringworld2_airduct.h b/engines/tsage/ringworld2/ringworld2_airduct.h new file mode 100644 index 0000000000..4a89f58c96 --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_airduct.h @@ -0,0 +1,90 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef TSAGE_RINGWORLD2_AIRDUCT_H +#define TSAGE_RINGWORLD2_AIRDUCT_H + +#include "tsage/converse.h" +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" +#include "tsage/sound.h" +#include "tsage/ringworld2/ringworld2_logic.h" + +namespace TsAGE { + +namespace Ringworld2 { + +using namespace TsAGE; + +class Scene1200 : public SceneExt { + enum CrawlDirection { CRAWL_EAST = 1, CRAWL_WEST = 2, CRAWL_SOUTH = 3, CRAWL_NORTH = 4 }; + + class LaserPanel: public ModalWindow { + public: + class Jumper : public SceneActorExt { + public: + void init(int state); + virtual bool startAction(CursorType action, Event &event); + }; + + Jumper _jumper1; + Jumper _jumper2; + Jumper _jumper3; + + LaserPanel(); + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + }; + +public: + NamedHotspot _item1; + SceneActor _actor1; + LaserPanel _laserPanel; + MazeUI _mazeUI; + SequenceManager _sequenceManager; + + int _nextCrawlDirection; + int _field414; + int _field416; + int _field418; + int _field41A; + bool _fixupMaze; + + Scene1200(); + void synchronize(Serializer &s); + + void startCrawling(CrawlDirection dir); + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); + virtual void saveCharacter(int characterIndex); +}; + +} // End of namespace Ringworld2 +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/ringworld2/ringworld2_logic.cpp b/engines/tsage/ringworld2/ringworld2_logic.cpp index a04fd56917..d24541932f 100644 --- a/engines/tsage/ringworld2/ringworld2_logic.cpp +++ b/engines/tsage/ringworld2/ringworld2_logic.cpp @@ -32,7 +32,9 @@ #include "tsage/ringworld2/ringworld2_scenes1.h" #include "tsage/ringworld2/ringworld2_scenes2.h" #include "tsage/ringworld2/ringworld2_scenes3.h" +#include "tsage/ringworld2/ringworld2_airduct.h" #include "tsage/ringworld2/ringworld2_outpost.h" +#include "tsage/ringworld2/ringworld2_vampire.h" namespace TsAGE { diff --git a/engines/tsage/ringworld2/ringworld2_scenes1.cpp b/engines/tsage/ringworld2/ringworld2_scenes1.cpp index 51879f1eed..81dc05e2a4 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes1.cpp +++ b/engines/tsage/ringworld2/ringworld2_scenes1.cpp @@ -1321,1249 +1321,827 @@ void Scene1100::saveCharacter(int characterIndex) { } /*-------------------------------------------------------------------------- - * Scene 1200 - Air Ducts Maze + * Scene 1500 - Cutscene: Ship landing * *--------------------------------------------------------------------------*/ -Scene1200::Scene1200() { - _nextCrawlDirection = 0; - _field414 = 0; - _field416 = 0; - _field418 = 0; - _field41A = 0; - _fixupMaze = false; -} +void Scene1500::postInit(SceneObjectList *OwnerList) { + loadScene(1500); + R2_GLOBALS._uiElements._active = false; + setZoomPercents(170, 13, 240, 100); + SceneExt::postInit(); + R2_GLOBALS._interfaceY = SCREEN_HEIGHT; -void Scene1200::synchronize(Serializer &s) { - SceneExt::synchronize(s); + scalePalette(65, 65, 65); - s.syncAsSint16LE(_nextCrawlDirection); - s.syncAsSint16LE(_field414); - s.syncAsSint16LE(_field416); - s.syncAsSint16LE(_field418); - s.syncAsSint16LE(_field41A); - s.syncAsSint16LE(_fixupMaze); -} + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.hide(); + R2_GLOBALS._player.disableControl(); + + _starshipShadow.postInit(); + _starshipShadow.setup(1401, 1, 1); + _starshipShadow._effect = EFFECT_SHADOW_MAP; + _starshipShadow.fixPriority(10); + _starshipShadow._shadowMap = _shadowPaletteMap; + + _starship.postInit(); + _starship.setup(1400, 1, 1); + _starship._moveDiff = Common::Point(1, 1); + _starship._linkedActor = &_starshipShadow; + + if (R2_GLOBALS._sceneManager._previousScene != 1010) { + _smallShipShadow.postInit(); + _smallShipShadow.setup(1401, 2, 1); + _smallShipShadow._effect = EFFECT_SHADOW_MAP; + _smallShipShadow.fixPriority(10); + _smallShipShadow._shadowMap = _shadowPaletteMap; + + _smallShip.postInit(); + _smallShip._moveRate = 30; + _smallShip._moveDiff = Common::Point(1, 1); + _smallShip._linkedActor = &_smallShipShadow; + } + + if (R2_GLOBALS._sceneManager._previousScene == 300) { + _starship.setPosition(Common::Point(189, 139), 5); + + _smallShip.setup(1400, 1, 2); + _smallShip.setPosition(Common::Point(148, 108), 0); + + _sceneMode = 20; + R2_GLOBALS._sound1.play(110); + } else if (R2_GLOBALS._sceneManager._previousScene == 1550) { + _starship.setPosition(Common::Point(189, 139), 5); + + _smallShip.setup(1400, 2, 1); + _smallShip.changeZoom(-1); + _smallShip.setPosition(Common::Point(298, 258), 5); + + _sceneMode = 10; + R2_GLOBALS._sound1.play(106); + } else { + _starship.setPosition(Common::Point(289, 239), -30); + _sceneMode = 0; + R2_GLOBALS._sound1.play(102); + } -Scene1200::LaserPanel::LaserPanel() { + signal(); } -void Scene1200::LaserPanel::Jumper::init(int state) { - _state = state; +void Scene1500::remove() { + R2_GLOBALS._uiElements._active = true; + R2_GLOBALS._uiElements._visible = true; - SceneActor::postInit(); - setup(1003, 1, 1); - fixPriority(255); + SceneExt::remove(); +} - switch (_state) { +void Scene1500::signal() { + switch(_sceneMode++) { + case 0: + R2_GLOBALS.setFlag(25); + setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); + // No break on purpose case 1: - switch (R2_GLOBALS._ductMazePanel1State) { - case 1: - setFrame2(2); - setPosition(Common::Point(129, 101)); - break; - case 2: - setFrame2(3); - setPosition(Common::Point(135, 95)); - break; - default: - break; + if (_starship._yDiff < 50) { + _starship.setPosition(Common::Point(289, 239), _starship._yDiff + 1); + _sceneMode = 1; } + setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); break; - case 2: - switch (R2_GLOBALS._ductMazePanel2State) { - case 1: - setFrame2(2); - setPosition(Common::Point(152, 101)); - break; - case 2: - setFrame2(3); - setPosition(Common::Point(158, 122)); - break; - case 3: - setFrame2(3); - setPosition(Common::Point(135, 122)); - break; - default: - break; + case 2: { + Common::Point pt(189, 139); + NpcMover *mover = new NpcMover(); + _starship.addMover(mover, &pt, this); } break; case 3: - switch (R2_GLOBALS._ductMazePanel3State) { - case 1: - setFrame2(3); - setPosition(Common::Point(158, 95)); - break; - case 2: - setFrame2(2); - setPosition(Common::Point(175, 101)); - break; - default: - break; + if (_starship._yDiff > 5) { + _starship.setPosition(Common::Point(189, 139), _starship._yDiff - 1); + _sceneMode = 3; } + setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); break; - default: + case 13: + R2_GLOBALS._player._characterIndex = R2_MIRANDA; + // No break on purpose + case 4: + R2_GLOBALS._sceneManager.changeScene(300); break; - } - - setDetails(1200, 12, -1, -1, 2, (SceneItem *) NULL); -} - -bool Scene1200::LaserPanel::Jumper::startAction(CursorType action, Event &event) { - if (action != CURSOR_USE) - return SceneActor::startAction(action, event); - - R2_GLOBALS._sound2.play(260); - switch (_state) { - case 1: - if (R2_GLOBALS._ductMazePanel1State == 1) { - R2_GLOBALS._ductMazePanel1State = 2; - setFrame2(3); - setPosition(Common::Point(135, 95)); - } else { - R2_GLOBALS._ductMazePanel1State = 1; - setFrame2(2); - setPosition(Common::Point(129, 101)); + case 10: + // No break on purpose + case 20: + setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); + break; + case 11: { + Common::Point pt(148, 108); + NpcMover *mover = new NpcMover(); + _smallShip.addMover(mover, &pt, this); } break; - case 2: - ++R2_GLOBALS._ductMazePanel2State; - if (R2_GLOBALS._ductMazePanel2State == 4) - R2_GLOBALS._ductMazePanel2State = 1; - - switch (R2_GLOBALS._ductMazePanel2State) { - case 1: - setFrame2(2); - setPosition(Common::Point(152, 101)); - break; - case 2: - setFrame2(3); - setPosition(Common::Point(158, 122)); - break; - case 3: - setFrame2(3); - setPosition(Common::Point(135, 122)); - break; - default: - break; + case 12: + setAction(&_sequenceManager, this, 2, &R2_GLOBALS._player, NULL); + break; + case 21: { + Common::Point pt(-2, -42); + NpcMover *mover = new NpcMover(); + _smallShip.addMover(mover, &pt, NULL); + signal(); } break; - case 3: - if (R2_GLOBALS._ductMazePanel3State == 1) { - R2_GLOBALS._ductMazePanel3State = 2; - setFrame2(2); - setPosition(Common::Point(175, 101)); - } else { - R2_GLOBALS._ductMazePanel3State = 1; - setFrame2(3); - setPosition(Common::Point(158, 95)); + case 22: + if (_starship._yDiff < 50) { + _starship.setPosition(Common::Point(189, 139), _starship._yDiff + 1); + _sceneMode = 22; + } + setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); + break; + case 23: { + Common::Point pt(-13, -61); + NpcMover *mover = new NpcMover(); + _starship.addMover(mover, &pt, this); } break; + case 24: + R2_GLOBALS._sceneManager.changeScene(1550); + break; default: break; } - - Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene; - scene->_field418 = 0; - - if ((R2_GLOBALS._ductMazePanel1State == 1) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1)) - scene->_field418 = 1; - else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1)) - scene->_field418 = 2; - else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 2)) - scene->_field418 = 3; - else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 3) && (R2_GLOBALS._ductMazePanel3State == 1)) - scene->_field418 = 4; - - return true; } -void Scene1200::LaserPanel::postInit(SceneObjectList *OwnerList) { - Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene; - - scene->_field41A = 1; - R2_GLOBALS._events.setCursor(CURSOR_USE); - setup2(1003, 1, 1, 100, 40); - setup3(1200, 11, -1, -1); - R2_GLOBALS._sound2.play(259); - _jumper1.init(1); - _jumper2.init(2); - _jumper3.init(3); +void Scene1500::dispatch() { + if (_sceneMode > 10) { + float yDiff = sqrt((float) (_smallShip._position.x * _smallShip._position.x) + (_smallShip._position.y * _smallShip._position.y)); + if (yDiff > 6) + _smallShip.setPosition(_smallShip._position, (int) yDiff); + } - R2_GLOBALS._player._canWalk = false; + Scene::dispatch(); } -void Scene1200::LaserPanel::remove() { - Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene; - - scene->_field41A = 0; - scene->_sceneAreas.remove(&_jumper1); - scene->_sceneAreas.remove(&_jumper2); - scene->_sceneAreas.remove(&_jumper3); - _jumper1.remove(); - _jumper2.remove(); - _jumper3.remove(); - - ModalWindow::remove(); - R2_GLOBALS._player._canWalk = true; -} +/*-------------------------------------------------------------------------- + * Scene 1525 - Cutscene - Ship + * + *--------------------------------------------------------------------------*/ -void Scene1200::postInit(SceneObjectList *OwnerList) { - loadScene(1200); +void Scene1525::postInit(SceneObjectList *OwnerList) { + loadScene(1525); + R2_GLOBALS._uiElements._active = false; SceneExt::postInit(); - if (R2_GLOBALS._sceneManager._previousScene < 3200) - R2_GLOBALS._sound1.play(257); - - _nextCrawlDirection = CRAWL_EAST; - _field414 = 0; - _field416 = 0; - _field418 = 0; - _field41A = 0; - - if ((R2_GLOBALS._ductMazePanel1State == 1) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1)) - _field418 = 1; - else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1)) - _field418 = 2; - else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 2)) - _field418 = 3; - else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 3) && (R2_GLOBALS._ductMazePanel3State == 1)) - _field418 = 4; - R2_GLOBALS._player.postInit(); + if (R2_GLOBALS._sceneManager._previousScene == 525) + R2_GLOBALS._player.setup(1525, 1, 1); + else + R2_GLOBALS._player.setup(1525, 1, 16); + R2_GLOBALS._player.setPosition(Common::Point(244, 148)); R2_GLOBALS._player.disableControl(); - R2_GLOBALS._player.setup(3156, 1, 6); - R2_GLOBALS._player.setPosition(Common::Point(160, 70)); - R2_GLOBALS._player._numFrames = 10; - R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 1200; - - _actor1.postInit(); - _actor1.hide(); - - _mazeUI.setDisplayBounds(Rect(110, 20, 210, 120)); - _mazeUI.postInit(); - _mazeUI.load(1); - _mazeUI.setMazePosition(R2_GLOBALS._ventCellPos); - - R2_GLOBALS._player.enableControl(); - _item1.setDetails(Rect(0, 0, 320, 200), 1200, 0, 1, 2, 1, NULL); + _sceneMode = 0; + setAction(&_sequenceManager, this, 2, &R2_GLOBALS._player, NULL); } -void Scene1200::signal() { +void Scene1525::signal() { switch (_sceneMode++) { - case 1: - // No break on purpose - case 1200: - // No break on purpose - case 1201: - // No break on purpose - case 1202: - // No break on purpose - case 1203: - R2_GLOBALS._player.enableControl(); - // CHECKME: The original is calling _eventManager.waitEvent(); - _sceneMode = 2; - break; - case 10: - _field416 = 1; - _field414 = 6; - R2_GLOBALS._player._numFrames = 5; - R2_GLOBALS._player.setStrip(1); - R2_GLOBALS._player.setFrame(5); - R2_GLOBALS._player.animate(ANIM_MODE_6, this); + case 0: + if (R2_GLOBALS._sceneManager._previousScene == 525) + setAction(&_sequenceManager, this, 1525, &R2_GLOBALS._player, NULL); + else + setAction(&_sequenceManager, this, 1526, &R2_GLOBALS._player, NULL); break; - case 11: - // No break on purpose - case 21: - // No break on purpose - case 31: - // No break on purpose - case 41: - _field416 = 0; + case 1: + setAction(&_sequenceManager, this, 2, &R2_GLOBALS._player, NULL); break; - case 12: - _field414 = 14; - R2_GLOBALS._player._numFrames = 10; - R2_GLOBALS._player.setup(3155, 1, 4); - R2_GLOBALS._player.setPosition(Common::Point(160, 70)); - R2_GLOBALS._player.animate(ANIM_MODE_2, NULL); - break; - case 13: - // No break on purpose - case 16: - // No break on purpose - case 23: - // No break on purpose - case 26: - // No break on purpose - case 33: - // No break on purpose - case 36: - // No break on purpose - case 43: - // No break on purpose - case 46: - R2_GLOBALS._player.setFrame(4); - _sceneMode = 1; - setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); - break; - case 15: - // No break on purpose - case 25: - // No break on purpose - case 35: - // No break on purpose - case 45: - _field414 = 20; - R2_GLOBALS._player.animate(ANIM_MODE_2, NULL); - break; - case 20: - _field416 = 1; - _field414 = 6; - R2_GLOBALS._player._numFrames = 5; - R2_GLOBALS._player.setStrip(2); - R2_GLOBALS._player.setFrame(5); - R2_GLOBALS._player.animate(ANIM_MODE_6, this); - break; - case 22: - _field414 = 14; - R2_GLOBALS._player._numFrames = 10; - R2_GLOBALS._player.setup(3155, 2, 4); - R2_GLOBALS._player.setPosition(Common::Point(160, 70)); - R2_GLOBALS._player.animate(ANIM_MODE_2, NULL); - break; - case 30: - _field416 = 1; - _field414 = 6; - R2_GLOBALS._player._numFrames = 5; - R2_GLOBALS._player.setStrip(3); - R2_GLOBALS._player.setFrame(5); - R2_GLOBALS._player.animate(ANIM_MODE_6, this); - break; - case 32: - _field414 = 14; - R2_GLOBALS._player._numFrames = 10; - R2_GLOBALS._player.setup(3155, 3, 4); - R2_GLOBALS._player.setPosition(Common::Point(160, 70)); - R2_GLOBALS._player.animate(ANIM_MODE_2, NULL); - break; - case 40: - _field416 = 1; - _field414 = 6; - R2_GLOBALS._player._numFrames = 5; - R2_GLOBALS._player.setStrip(4); - R2_GLOBALS._player.setFrame(5); - R2_GLOBALS._player.animate(ANIM_MODE_6, this); - break; - case 42: - _field414 = 14; - R2_GLOBALS._player._numFrames = 10; - R2_GLOBALS._player.setup(3155, 4, 4); - R2_GLOBALS._player.setPosition(Common::Point(160, 70)); - R2_GLOBALS._player.animate(ANIM_MODE_2, NULL); - break; - case 50: - // No break on purpose - case 55: - // No break on purpose - case 60: - R2_GLOBALS._player.setup(3156, 5, 1); - R2_GLOBALS._player._numFrames = 5; - R2_GLOBALS._player.animate(ANIM_MODE_5, this); - break; - case 51: - // No break on purpose - case 56: - // No break on purpose - case 117: - R2_GLOBALS._player.setup(3157, 1, 1); - R2_GLOBALS._player.animate(ANIM_MODE_5, this); - break; - case 52: - // No break on purpose - case 82: - // No break on purpose - case 118: - R2_GLOBALS._player.setup(3156, 3, 6); - _sceneMode = 1; - setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); - break; - case 57: - // No break on purpose - case 91: - // No break on purpose - case 96: - R2_GLOBALS._player.setup(3157, 2, 1); - R2_GLOBALS._player.animate(ANIM_MODE_5, this); - break; - case 58: - // No break on purpose - case 92: - // No break on purpose - case 122: - R2_GLOBALS._player.setup(3156, 2, 6); - _sceneMode = 1; - setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); - break; - case 61: - R2_GLOBALS._player.setup(3157, 4, 5); - R2_GLOBALS._player.animate(ANIM_MODE_6, this); - break; - case 62: - // No break on purpose - case 72: - // No break on purpose - case 98: - R2_GLOBALS._player.setup(3156, 4, 6); - _sceneMode = 1; - setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); - break; - case 70: - // No break on purpose - case 75: - // No break on purpose - case 80: - R2_GLOBALS._player.setup(3156, 6, 1); - R2_GLOBALS._player._numFrames = 5; - R2_GLOBALS._player.animate(ANIM_MODE_5, this); - break; - case 71: - // No break on purpose - case 76: - // No break on purpose - case 97: - R2_GLOBALS._player.setup(3157, 3, 1); - R2_GLOBALS._player.animate(ANIM_MODE_5, this); - break; - case 77: - // No break on purpose - case 111: - // No break on purpose - case 116: - R2_GLOBALS._player.setup(3157, 4, 1); - R2_GLOBALS._player.animate(ANIM_MODE_5, this); - break; - case 78: - // No break on purpose - case 102: - // No break on purpose - case 112: - R2_GLOBALS._player.setup(3156, 1, 6); - _sceneMode = 1; - setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); - break; - case 81: - R2_GLOBALS._player.setup(3157, 2, 5); - R2_GLOBALS._player.animate(ANIM_MODE_6, this); - break; - case 90: - // No break on purpose - case 95: - // No break on purpose - case 100: - R2_GLOBALS._player.setup(3156, 7, 1); - R2_GLOBALS._player._numFrames = 5; - R2_GLOBALS._player.animate(ANIM_MODE_5, this); - break; - case 101: - R2_GLOBALS._player.setup(3157, 1, 5); - R2_GLOBALS._player.animate(ANIM_MODE_6, this); - break; - case 110: - // No break on purpose - case 115: - // No break on purpose - case 120: - R2_GLOBALS._player.setup(3156, 8, 1); - R2_GLOBALS._player._numFrames = 5; - R2_GLOBALS._player.animate(ANIM_MODE_5, this); - break; - case 121: - R2_GLOBALS._player.setup(3157, 3, 5); - R2_GLOBALS._player.animate(ANIM_MODE_6, this); - break; - default: - // CHECKME: The original is walling _eventManager.waitEvent(); - _sceneMode = 2; + case 2: + if (R2_GLOBALS._sceneManager._previousScene == 1530) + R2_GLOBALS._sceneManager.changeScene(1550); + else + R2_GLOBALS._sceneManager.changeScene(1530); + default: break; } } -void Scene1200::process(Event &event) { - if (_field414 != 0) - return; +/*-------------------------------------------------------------------------- + * Scene 1530 - Cutscene - Crashing on Rimwall + * + *--------------------------------------------------------------------------*/ - Scene::process(event); +void Scene1530::postInit(SceneObjectList *OwnerList) { + if (R2_GLOBALS._sceneManager._previousScene == 1000) + loadScene(1650); + else if (R2_GLOBALS._sceneManager._previousScene == 1580) + loadScene(1550); + else + loadScene(1530); - if (!R2_GLOBALS._player._canWalk) - return; + R2_GLOBALS._uiElements._active = false; + SceneExt::postInit(); + R2_GLOBALS._interfaceY = SCREEN_HEIGHT; - if (event.eventType == EVENT_BUTTON_DOWN) { - Common::Point cellPos = R2_GLOBALS._ventCellPos; - _mazeUI.pixelToCellXY(cellPos); + _stripManager.addSpeaker(&_quinnSpeaker); + _stripManager.addSpeaker(&_seekerSpeaker); - int cellId = _mazeUI.getCellFromPixelXY(event.mousePos); - switch (R2_GLOBALS._events.getCursor()) { - case CURSOR_WALK: - event.handled = true; - if ((event.mousePos.x > 179) && (event.mousePos.x < 210) && (event.mousePos.y > 50) && (event.mousePos.y < 89)) - startCrawling(CRAWL_EAST); + if (R2_GLOBALS._sceneManager._previousScene == 1000) { + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.hide(); + R2_GLOBALS._player.disableControl(); - if ((event.mousePos.x > 109) && (event.mousePos.x < 140) && (event.mousePos.y > 50) && (event.mousePos.y < 89)) - startCrawling(CRAWL_WEST); + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _stripManager.start(538, this); + R2_GLOBALS._sound1.play(114); - if ((event.mousePos.x > 140) && (event.mousePos.x < 179) && (event.mousePos.y > 89) && (event.mousePos.y < 120)) - startCrawling(CRAWL_SOUTH); + _sceneMode = 3; + } else if (R2_GLOBALS._sceneManager._previousScene == 1580) { + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player._characterIndex = R2_QUINN; + R2_GLOBALS._player.setObjectWrapper(NULL); + R2_GLOBALS._player.setup(1516, 6, 1); + R2_GLOBALS._player.setPosition(Common::Point(160, 125)); + R2_GLOBALS._player._moveRate = 30; + R2_GLOBALS._player._moveDiff = Common::Point(4, 1); - if ((event.mousePos.x > 140) && (event.mousePos.x < 179) && (event.mousePos.y > 19) && (event.mousePos.y < 50)) - startCrawling(CRAWL_NORTH); - break; - case CURSOR_USE: - if (cellId > 36) { - if ( ((cellPos.x == 3) && (cellPos.y == 33)) - || ((cellPos.x == 7) && (cellPos.y == 33)) - || ((cellPos.x == 33) && (cellPos.y == 41)) - || ((cellPos.x == 5) && (cellPos.y == 5)) - || ((cellPos.x == 13) && (cellPos.y == 21)) - || ((cellPos.x == 17) && (cellPos.y == 21)) - || ((cellPos.x == 17) && (cellPos.y == 5)) - || ((cellPos.x == 17) && (cellPos.y == 9)) - || ((cellPos.x == 29) && (cellPos.y == 17)) - || ((cellPos.x == 33) && (cellPos.y == 17)) - || ((cellPos.x == 35) && (cellPos.y == 17)) - || ((cellPos.x == 41) && (cellPos.y == 21)) ) { - _laserPanel.postInit(); - event.handled = true; - } - } + _leftReactor.postInit(); + _leftReactor.setup(1516, 7, 1); + _leftReactor.setPosition(Common::Point(121, 41)); + _leftReactor.animate(ANIM_MODE_2, NULL); - if ((cellId == 1) || (cellId == 4) || (cellId == 11) || (cellId == 14)) { - if ( ((cellPos.x == 3) && (cellPos.y == 9)) - || ((cellPos.x == 11) && (cellPos.y == 27)) - || ((cellPos.x == 17) && (cellPos.y == 7)) - || ((cellPos.x == 17) && (cellPos.y == 27)) - || ((cellPos.x == 17) && (cellPos.y == 33)) - || (cellPos.x == 33) ) { - switch (cellPos.x) { - case 3: - R2_GLOBALS._sceneManager.changeScene(3150); - break; - case 33: - if (R2_GLOBALS._scientistConvIndex >= 4) - R2_GLOBALS._sceneManager.changeScene(3250); - else - SceneItem::display(1200, 6, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END); - break; - default: - SceneItem::display(1200, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END); - break; - } - event.handled = true; - } - } - break; - case CURSOR_LOOK: - if ((cellId == 1) || (cellId == 4) || (cellId == 11) || (cellId == 14)) { - event.handled = true; - switch (cellPos.x) { - case 3: - // It was your cell. - SceneItem::display(1200, 8, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - break; - case 9: - R2_GLOBALS._sceneManager.changeScene(3240); - break; - case 11: - if (cellPos.y == 27) - R2_GLOBALS._sceneManager.changeScene(3210); - else - // A vent grill - SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - break; - case 17: - switch (cellPos.y) { - case 5: - R2_GLOBALS._sceneManager.changeScene(3230); - break; - case 21: - R2_GLOBALS._sceneManager.changeScene(3220); - break; - case 33: - R2_GLOBALS._sceneManager.changeScene(3200); - break; - default: - // A vent grill - SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - break; - } - break; - case 33: - R2_GLOBALS._sceneManager.changeScene(3245); - break; - default: - SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - break; - } - } - if (cellId > 36) { - // "An anti-pest laser" - event.handled = true; - SceneItem::display(1200, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - } - break; - case CURSOR_TALK: - event.handled = true; - break; - default: - return; - } - } else if (event.eventType == EVENT_KEYPRESS) { - if (_field414) { - event.handled = false; - return; - } + _rightReactor.postInit(); + _rightReactor.setup(1516, 8, 1); + _rightReactor.setPosition(Common::Point(107, 116)); + _rightReactor.animate(ANIM_MODE_2, NULL); - switch (event.kbd.keycode) { - case Common::KEYCODE_KP8: - case Common::KEYCODE_UP: - startCrawling(CRAWL_NORTH); - break; - case Common::KEYCODE_KP4: - case Common::KEYCODE_LEFT: - startCrawling(CRAWL_WEST); - break; - case Common::KEYCODE_KP6: - case Common::KEYCODE_RIGHT: - startCrawling(CRAWL_EAST); - break; - case Common::KEYCODE_KP2: - case Common::KEYCODE_DOWN: - startCrawling(CRAWL_SOUTH); - break; - default: - event.handled = false; - return; - break; - } - } else - return; -} + R2_GLOBALS._player.disableControl(); + Common::Point pt(480, 75); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + R2_GLOBALS._sound1.play(111); -void Scene1200::dispatch() { - Rect tmpRect; - Scene::dispatch(); + _sceneMode = 1; + } else { + _seeker.postInit(); + _seeker._effect = EFFECT_SHADED; - if (_fixupMaze) { - _mazeUI.setMazePosition(R2_GLOBALS._ventCellPos); - //_mazeUI.draw(); - _fixupMaze = false; - } + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + R2_GLOBALS._player.disableControl(); - if (_field414 != 0) { - tmpRect.set(110, 20, 210, 120); - _field414--; + setAction(&_sequenceManager, this, 1530, &R2_GLOBALS._player, &_seeker, NULL); - switch (_nextCrawlDirection) { - case CRAWL_EAST: - R2_GLOBALS._ventCellPos.x += 2; - break; - case CRAWL_WEST: - R2_GLOBALS._ventCellPos.x -= 2; - break; - case CRAWL_SOUTH: - R2_GLOBALS._ventCellPos.y += 2; - break; - case CRAWL_NORTH: - R2_GLOBALS._ventCellPos.y -= 2; - break; - default: - break; - } + _sceneMode = 2; + } - _mazeUI.setMazePosition(R2_GLOBALS._ventCellPos); - //_mazeUI.draw(); +} - if (_field416 != 0) { - switch(_nextCrawlDirection) { - case CRAWL_EAST: - R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x - 2, R2_GLOBALS._player._position.y)); - break; - case CRAWL_WEST: - R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x + 2, R2_GLOBALS._player._position.y)); - break; - case CRAWL_SOUTH: - R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y - 2)); - break; - case CRAWL_NORTH: - R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y + 2)); - break; - default: - break; - } - } - if (_field414 == 0) { - if (_field416 == 0) - R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL); - signal(); - } +void Scene1530::signal() { + switch (_sceneMode - 1) { + case 0: + R2_GLOBALS._sceneManager.changeScene(1000); + break; + case 1: + R2_GLOBALS._sceneManager.changeScene(1525); + break; + case 2: + R2_GLOBALS._player.disableControl(); + _sceneMode = 4; + R2_GLOBALS._player.show(); + setAction(&_sequenceManager, this, 1650, &R2_GLOBALS._player, NULL); + break; + case 3: + R2_GLOBALS._sceneManager.changeScene(1700); + break; + default: + break; } } -void Scene1200::saveCharacter(int characterIndex) { - R2_GLOBALS._sound1.fadeOut2(NULL); - SceneExt::saveCharacter(characterIndex); +void Scene1530::dispatch() { + int16 x = R2_GLOBALS._player._position.x; + int16 y = R2_GLOBALS._player._position.y; + + _leftReactor.setPosition(Common::Point(x - 39, y - 85)); + _rightReactor.setPosition(Common::Point(x - 53, y - 9)); + + Scene::dispatch(); } -void Scene1200::startCrawling(CrawlDirection dir) { - Common::Point cellPos = R2_GLOBALS._ventCellPos; - _mazeUI.pixelToCellXY(cellPos); +/*-------------------------------------------------------------------------- + * Scene 1550 - Spaceport + * + *--------------------------------------------------------------------------*/ - switch (dir) { - case CRAWL_EAST: - if ( ((_mazeUI.getCellFromPixelXY(Common::Point(200, 50)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(200, 88)) > 36)) - && ( ((cellPos.x == 3) && (cellPos.y == 33) && (_field418 != 4)) - || ((cellPos.x == 13) && (cellPos.y == 21) && (_field418 != 2)) - || ((cellPos.x == 29) && (cellPos.y == 17) && (_field418 != 1)) - || ((cellPos.x == 33) && (cellPos.y == 41)) ) - ) { - R2_GLOBALS._player.disableControl(); - _sceneMode = 1200; - setAction(&_sequenceManager, this, 1200, &_actor1, NULL); - } else if (_mazeUI.getCellFromPixelXY(Common::Point(200, 69)) == 36) { - switch (_nextCrawlDirection) { - case CRAWL_EAST: - if (R2_GLOBALS._player._visage == 3155) - _sceneMode = 15; - else - _sceneMode = 10; - break; - case CRAWL_WEST: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 76; - else - _sceneMode = 75; - break; - case CRAWL_SOUTH: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 101; - else - _sceneMode = 100; - break; - case CRAWL_NORTH: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 111; - else - _sceneMode = 110; - break; - default: - break; - } - R2_GLOBALS._player.disableControl(); - _nextCrawlDirection = 1; - signal(); - } - break; - case CRAWL_WEST: - if ( ((_mazeUI.getCellFromPixelXY(Common::Point(120, 50)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(120, 88)) > 36)) - && ( ((cellPos.x == 7) && (cellPos.y == 33) && (_field418 != 4)) - || ((cellPos.x == 17) && (cellPos.y == 21) && (_field418 != 2)) - || ((cellPos.x == 33) && (cellPos.y == 17) && (_field418 != 1)) - || ((cellPos.x == 5) && (cellPos.y == 5)) ) - ) { - R2_GLOBALS._player.disableControl(); - _sceneMode = 1201; - setAction(&_sequenceManager, this, 1201, &_actor1, NULL); - } else if (_mazeUI.getCellFromPixelXY(Common::Point(120, 69)) == 36) { - switch (_nextCrawlDirection) { - case CRAWL_EAST: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 56; - else - _sceneMode = 55; - break; - case CRAWL_WEST: - if (R2_GLOBALS._player._visage == 3155) - _sceneMode = 25; - else - _sceneMode = 20; - break; - case CRAWL_SOUTH: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 91; - else - _sceneMode = 90; - break; - case CRAWL_NORTH: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 121; - else - _sceneMode = 120; - break; - default: - break; - } +Scene1550::Junk::Junk() { + _junkNumber = 0; +} + +void Scene1550::Junk::synchronize(Serializer &s) { + SceneActor::synchronize(s); + + s.syncAsSint16LE(_junkNumber); +} + +bool Scene1550::Junk::startAction(CursorType action, Event &event) { + Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (_visage == 1561) { R2_GLOBALS._player.disableControl(); - _nextCrawlDirection = 2; - signal(); + scene->_sceneMode = 40; + Common::Point pt(_position.x + 5, _position.y + 20); + PlayerMover *mover = new PlayerMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); + return true; } + return SceneActor::startAction(action, event); break; - case CRAWL_SOUTH: - if ( ((_mazeUI.getCellFromPixelXY(Common::Point(140, 110)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(178, 110)) > 36)) - && ( ((cellPos.x == 17) && (cellPos.y == 5) && (_field418 != 3)) - || ((cellPos.x == 41) && (cellPos.y == 21)) ) - ) { - R2_GLOBALS._player.disableControl(); - _sceneMode = 1203; - setAction(&_sequenceManager, this, 1203, &_actor1, NULL); - } else if (_mazeUI.getCellFromPixelXY(Common::Point(160, 110)) == 36) { - switch (_nextCrawlDirection) { - case CRAWL_EAST: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 51; - else - _sceneMode = 50; - break; - case CRAWL_WEST: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 81; - else - _sceneMode = 80; + case CURSOR_LOOK: + if (_visage == 1561) { + switch (_frame) { + case 2: + SceneItem::display(1550, 23, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); break; - case CRAWL_SOUTH: - if (R2_GLOBALS._player._visage == 3155) - _sceneMode = 35; - else - _sceneMode = 30; + case 3: + SceneItem::display(1550, 26, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); break; - case CRAWL_NORTH: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 116; - else - _sceneMode = 115; + case 4: + SceneItem::display(1550, 35, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); break; default: break; } - R2_GLOBALS._player.disableControl(); - _nextCrawlDirection = 3; - signal(); - } - break; - case CRAWL_NORTH: - if ( ((_mazeUI.getCellFromPixelXY(Common::Point(140, 30)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(178, 30)) > 36)) - && ( ((cellPos.x == 17) && (cellPos.y == 9) && (_field418 != 3)) - || ((cellPos.x == 35) && (cellPos.y == 17)) ) - ) { - R2_GLOBALS._player.disableControl(); - _sceneMode = 1202; - setAction(&_sequenceManager, this, 1202, &_actor1, NULL); - } else if (_mazeUI.getCellFromPixelXY(Common::Point(160, 30)) == 36) { - switch (_nextCrawlDirection) { - case CRAWL_EAST: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 61; - else - _sceneMode = 60; - break; - case CRAWL_WEST: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 71; - else - _sceneMode = 70; + } else { + switch ((((_strip - 1) * 5) + _frame) % 3) { + case 0: + SceneItem::display(1550, 62, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); break; - case CRAWL_SOUTH: - if (R2_GLOBALS._player._visage == 3156) - _sceneMode = 96; - else - _sceneMode = 95; + case 1: + SceneItem::display(1550, 53, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); break; - case CRAWL_NORTH: - if (R2_GLOBALS._player._visage == 3155) - _sceneMode = 45; - else - _sceneMode = 40; + case 2: + SceneItem::display(1550, 76, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); break; default: - _sceneMode = 1; - R2_GLOBALS._player.setup(3156, 4, 6); break; } - R2_GLOBALS._player.disableControl(); - _nextCrawlDirection = 4; - signal(); } + return true; break; default: + return SceneActor::startAction(action, event); break; } } -/*-------------------------------------------------------------------------- - * Scene 1500 - Cutscene: Ship landing - * - *--------------------------------------------------------------------------*/ - -void Scene1500::postInit(SceneObjectList *OwnerList) { - loadScene(1500); - R2_GLOBALS._uiElements._active = false; - setZoomPercents(170, 13, 240, 100); - SceneExt::postInit(); - R2_GLOBALS._interfaceY = SCREEN_HEIGHT; - - scalePalette(65, 65, 65); - - R2_GLOBALS._player.postInit(); - R2_GLOBALS._player.hide(); - R2_GLOBALS._player.disableControl(); - - _starshipShadow.postInit(); - _starshipShadow.setup(1401, 1, 1); - _starshipShadow._effect = EFFECT_SHADOW_MAP; - _starshipShadow.fixPriority(10); - _starshipShadow._shadowMap = _shadowPaletteMap; - - _starship.postInit(); - _starship.setup(1400, 1, 1); - _starship._moveDiff = Common::Point(1, 1); - _starship._linkedActor = &_starshipShadow; - - if (R2_GLOBALS._sceneManager._previousScene != 1010) { - _smallShipShadow.postInit(); - _smallShipShadow.setup(1401, 2, 1); - _smallShipShadow._effect = EFFECT_SHADOW_MAP; - _smallShipShadow.fixPriority(10); - _smallShipShadow._shadowMap = _shadowPaletteMap; - - _smallShip.postInit(); - _smallShip._moveRate = 30; - _smallShip._moveDiff = Common::Point(1, 1); - _smallShip._linkedActor = &_smallShipShadow; - } - - if (R2_GLOBALS._sceneManager._previousScene == 300) { - _starship.setPosition(Common::Point(189, 139), 5); - - _smallShip.setup(1400, 1, 2); - _smallShip.setPosition(Common::Point(148, 108), 0); - - _sceneMode = 20; - R2_GLOBALS._sound1.play(110); - } else if (R2_GLOBALS._sceneManager._previousScene == 1550) { - _starship.setPosition(Common::Point(189, 139), 5); - - _smallShip.setup(1400, 2, 1); - _smallShip.changeZoom(-1); - _smallShip.setPosition(Common::Point(298, 258), 5); - - _sceneMode = 10; - R2_GLOBALS._sound1.play(106); - } else { - _starship.setPosition(Common::Point(289, 239), -30); - _sceneMode = 0; - R2_GLOBALS._sound1.play(102); - } - - signal(); +Scene1550::ShipComponent::ShipComponent() { + _componentId = 0; } -void Scene1500::remove() { - R2_GLOBALS._uiElements._active = true; - R2_GLOBALS._uiElements._visible = true; +void Scene1550::ShipComponent::synchronize(Serializer &s) { + SceneActor::synchronize(s); - SceneExt::remove(); + s.syncAsSint16LE(_componentId); } -void Scene1500::signal() { - switch(_sceneMode++) { - case 0: - R2_GLOBALS.setFlag(25); - setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); - // No break on purpose - case 1: - if (_starship._yDiff < 50) { - _starship.setPosition(Common::Point(289, 239), _starship._yDiff + 1); - _sceneMode = 1; - } - setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); - break; - case 2: { - Common::Point pt(189, 139); - NpcMover *mover = new NpcMover(); - _starship.addMover(mover, &pt, this); - } - break; - case 3: - if (_starship._yDiff > 5) { - _starship.setPosition(Common::Point(189, 139), _starship._yDiff - 1); - _sceneMode = 3; +bool Scene1550::ShipComponent::startAction(CursorType action, Event &event) { + Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (_componentId == 8) { + scene->_dontExit = true; + R2_GLOBALS._player.disableControl(); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + scene->_sceneMode = 1576; + else + scene->_sceneMode = 1584; + // strcpy(scene->_shipComponents[7]._actorName, 'hatch'); + scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[7], NULL); + return true; } - setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); - break; - case 13: - R2_GLOBALS._player._characterIndex = R2_MIRANDA; - // No break on purpose - case 4: - R2_GLOBALS._sceneManager.changeScene(300); + return SceneActor::startAction(action, event); break; - case 10: - // No break on purpose - case 20: - setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); + case CURSOR_LOOK: + if (_componentId == 8) + SceneItem::display(1550, 75, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + else if (_frame == 1) + SceneItem::display(1550, 70, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + else + SceneItem::display(1550, 71, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + return true; break; - case 11: { - Common::Point pt(148, 108); - NpcMover *mover = new NpcMover(); - _smallShip.addMover(mover, &pt, this); + case R2_FUEL_CELL: + scene->_dontExit = true; + if (_componentId == 6) { + R2_GLOBALS._player.disableControl(); + scene->_wreckage2.postInit(); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + scene->_sceneMode = 1574; + else + scene->_sceneMode = 1582; + scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[5], &scene->_wreckage2, NULL); + return true; } + return SceneActor::startAction(action, event); break; - case 12: - setAction(&_sequenceManager, this, 2, &R2_GLOBALS._player, NULL); - break; - case 21: { - Common::Point pt(-2, -42); - NpcMover *mover = new NpcMover(); - _smallShip.addMover(mover, &pt, NULL); - signal(); + case R2_GYROSCOPE: + scene->_dontExit = true; + if (_componentId == 3) { + R2_GLOBALS._player.disableControl(); + scene->_wreckage2.postInit(); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + scene->_sceneMode = 1571; + else + scene->_sceneMode = 1581; + scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[2], &scene->_wreckage2, NULL); + return true; } + return SceneActor::startAction(action, event); break; - case 22: - if (_starship._yDiff < 50) { - _starship.setPosition(Common::Point(189, 139), _starship._yDiff + 1); - _sceneMode = 22; + case R2_GUIDANCE_MODULE: + scene->_dontExit = true; + if (_componentId == 1) { + R2_GLOBALS._player.disableControl(); + scene->_wreckage2.postInit(); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + scene->_sceneMode = 1569; + else + scene->_sceneMode = 1579; + scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[0], &scene->_wreckage2, NULL); + return true; } - setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); + return SceneActor::startAction(action, event); break; - case 23: { - Common::Point pt(-13, -61); - NpcMover *mover = new NpcMover(); - _starship.addMover(mover, &pt, this); + case R2_THRUSTER_VALVE: + scene->_dontExit = true; + if (_componentId == 4) { + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 1572; + scene->_wreckage2.postInit(); + scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[3], &scene->_wreckage2, NULL); + return true; } + return SceneActor::startAction(action, event); break; - case 24: - R2_GLOBALS._sceneManager.changeScene(1550); + case R2_RADAR_MECHANISM: + scene->_dontExit = true; + if (_componentId == 2) { + R2_GLOBALS._player.disableControl(); + scene->_wreckage2.postInit(); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + scene->_sceneMode = 1570; + else + scene->_sceneMode = 1580; + scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[1], &scene->_wreckage2, NULL); + return true; + } + return SceneActor::startAction(action, event); + break; + case R2_IGNITOR: + scene->_dontExit = true; + if (_componentId == 5) { + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 1573; + scene->_wreckage2.postInit(); + scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[4], &scene->_wreckage2, NULL); + return true; + } + return SceneActor::startAction(action, event); + break; + case R2_BATTERY: + scene->_dontExit = true; + if (_componentId == 7) { + R2_GLOBALS._player.disableControl(); + scene->_wreckage2.postInit(); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + scene->_sceneMode = 1575; + else + scene->_sceneMode = 1583; + scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[6], &scene->_wreckage2, NULL); + return true; + } + return SceneActor::startAction(action, event); break; default: + return SceneActor::startAction(action, event); break; } } -void Scene1500::dispatch() { - if (_sceneMode > 10) { - float yDiff = sqrt((float) (_smallShip._position.x * _smallShip._position.x) + (_smallShip._position.y * _smallShip._position.y)); - if (yDiff > 6) - _smallShip.setPosition(_smallShip._position, (int) yDiff); +void Scene1550::ShipComponent::setupShipComponent(int componentId) { + _componentId = componentId; + postInit(); + setup(1517, _componentId, 1); + + switch (_componentId) { + case 1: + if (R2_INVENTORY.getObjectScene(R2_GUIDANCE_MODULE) == 0) + setFrame(5); + setPosition(Common::Point(287, 85)); + break; + case 2: + if (R2_INVENTORY.getObjectScene(R2_RADAR_MECHANISM) == 0) + setFrame(5); + setPosition(Common::Point(248, 100)); + break; + case 3: + if (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) == 0) + setFrame(5); + setPosition(Common::Point(217, 85)); + break; + case 4: + if (R2_INVENTORY.getObjectScene(R2_THRUSTER_VALVE) == 0) + setFrame(5); + setPosition(Common::Point(161, 121)); + break; + case 5: + if (R2_INVENTORY.getObjectScene(R2_IGNITOR) == 0) + setFrame(5); + setPosition(Common::Point(117, 121)); + break; + case 6: + if (R2_INVENTORY.getObjectScene(R2_FUEL_CELL) == 0) + setFrame(5); + setPosition(Common::Point(111, 85)); + break; + case 7: + if (R2_INVENTORY.getObjectScene(R2_BATTERY) == 0) + setFrame(5); + setPosition(Common::Point(95, 84)); + break; + case 8: { + setup(1516, 1, 1); + setPosition(Common::Point(201, 45)); + Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; + if ((scene->_sceneMode == 1577) || (scene->_sceneMode == 1578)) + hide(); + fixPriority(92); + setDetails(1550, 70, -1, -1, 2, (SceneItem *) NULL); + } + break; + default: + break; } - Scene::dispatch(); + fixPriority(92); + setDetails(1550, 70, -1, -1, 2, (SceneItem *)NULL); } -/*-------------------------------------------------------------------------- - * Scene 1525 - Cutscene - Ship - * - *--------------------------------------------------------------------------*/ - -void Scene1525::postInit(SceneObjectList *OwnerList) { - loadScene(1525); - R2_GLOBALS._uiElements._active = false; - SceneExt::postInit(); +Scene1550::DishControlsWindow::DishControl::DishControl() { + _controlId = 0; +} - R2_GLOBALS._player.postInit(); - if (R2_GLOBALS._sceneManager._previousScene == 525) - R2_GLOBALS._player.setup(1525, 1, 1); - else - R2_GLOBALS._player.setup(1525, 1, 16); - R2_GLOBALS._player.setPosition(Common::Point(244, 148)); - R2_GLOBALS._player.disableControl(); +void Scene1550::DishControlsWindow::DishControl::synchronize(Serializer &s) { + SceneActor::synchronize(s); - _sceneMode = 0; - setAction(&_sequenceManager, this, 2, &R2_GLOBALS._player, NULL); + s.syncAsSint16LE(_controlId); } -void Scene1525::signal() { - switch (_sceneMode++) { - case 0: - if (R2_GLOBALS._sceneManager._previousScene == 525) - setAction(&_sequenceManager, this, 1525, &R2_GLOBALS._player, NULL); - else - setAction(&_sequenceManager, this, 1526, &R2_GLOBALS._player, NULL); - break; +bool Scene1550::DishControlsWindow::DishControl::startAction(CursorType action, Event &event) { + if (action != CURSOR_USE) + return SceneActor::startAction(action, event); + + Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; + + switch (_controlId) { case 1: - setAction(&_sequenceManager, this, 2, &R2_GLOBALS._player, NULL); + // Button control + if (scene->_dish._frame == 5) { + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 25; + if (scene->_walkway._frame == 1) { + scene->setAction(&scene->_sequenceManager1, scene, 1560, &scene->_walkway, NULL); + R2_GLOBALS.setFlag(20); + setFrame(2); + } else { + scene->setAction(&scene->_sequenceManager1, scene, 1561, &scene->_walkway, NULL); + R2_GLOBALS.clearFlag(20); + setFrame(1); + } + scene->_dishControlsWindow.remove(); + } break; case 2: - if (R2_GLOBALS._sceneManager._previousScene == 1530) - R2_GLOBALS._sceneManager.changeScene(1550); - else - R2_GLOBALS._sceneManager.changeScene(1530); + // Lever control + R2_GLOBALS._player.disableControl(); + if (scene->_dish._frame == 1) { + scene->_sceneMode = 23; + scene->setAction(&scene->_sequenceManager1, scene, 1560, this, NULL); + } else { + if (scene->_walkway._frame == 1) + scene->_sceneMode = 24; + else + scene->_sceneMode = 22; + scene->setAction(&scene->_sequenceManager1, scene, 1561, this, NULL); + } + break; default: break; } + return true; } -/*-------------------------------------------------------------------------- - * Scene 1530 - Cutscene - Crashing on Rimwall - * - *--------------------------------------------------------------------------*/ +void Scene1550::DishControlsWindow::remove() { + Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; -void Scene1530::postInit(SceneObjectList *OwnerList) { - if (R2_GLOBALS._sceneManager._previousScene == 1000) - loadScene(1650); - else if (R2_GLOBALS._sceneManager._previousScene == 1580) - loadScene(1550); - else - loadScene(1530); + _button.remove(); + _lever.remove(); - R2_GLOBALS._uiElements._active = false; - SceneExt::postInit(); - R2_GLOBALS._interfaceY = SCREEN_HEIGHT; + ModalWindow::remove(); - _stripManager.addSpeaker(&_quinnSpeaker); - _stripManager.addSpeaker(&_seekerSpeaker); + if ((scene->_sceneMode >= 20) && (scene->_sceneMode <= 29)) + return; - if (R2_GLOBALS._sceneManager._previousScene == 1000) { - R2_GLOBALS._player.postInit(); - R2_GLOBALS._player.hide(); - R2_GLOBALS._player.disableControl(); + R2_GLOBALS._player.disableControl(); + if (scene->_walkway._frame == 1) { + scene->_sceneMode = 1559; + scene->setAction(&scene->_sequenceManager1, scene, 1559, &R2_GLOBALS._player, NULL); + } else { + scene->_sceneMode = 1562; + scene->setAction(&scene->_sequenceManager1, scene, 1562, &R2_GLOBALS._player, NULL); + } +} - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - _stripManager.start(538, this); - R2_GLOBALS._sound1.play(114); +void Scene1550::DishControlsWindow::setup2(int visage, int stripFrameNum, int frameNum, + int posX, int posY) { + // Call inherited setup + ModalWindow::setup2(visage, stripFrameNum, frameNum, posX, posY); - _sceneMode = 3; - } else if (R2_GLOBALS._sceneManager._previousScene == 1580) { - R2_GLOBALS._player.postInit(); - R2_GLOBALS._player._characterIndex = R2_QUINN; - R2_GLOBALS._player.setObjectWrapper(NULL); - R2_GLOBALS._player.setup(1516, 6, 1); - R2_GLOBALS._player.setPosition(Common::Point(160, 125)); - R2_GLOBALS._player._moveRate = 30; - R2_GLOBALS._player._moveDiff = Common::Point(4, 1); + // Further setup + Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; + setup3(1550, 67, -1, -1); + _button.postInit(); + _button._controlId = 1; + if (scene->_walkway._frame == 1) + _button.setup(1559, 3, 1); + else + _button.setup(1559, 3, 2); + _button.setPosition(Common::Point(142, 79)); + _button.fixPriority(251); + _button.setDetails(1550, 68, -1, -1, 2, (SceneItem *) NULL); - _leftReactor.postInit(); - _leftReactor.setup(1516, 7, 1); - _leftReactor.setPosition(Common::Point(121, 41)); - _leftReactor.animate(ANIM_MODE_2, NULL); + _lever.postInit(); + _lever._numFrames = 5; + _lever._controlId = 2; + if (scene->_dish._frame == 1) + _lever.setup(1559, 2, 1); + else + _lever.setup(1559, 2, 5); + _lever.setPosition(Common::Point(156, 103)); + _lever.fixPriority(251); + _lever.setDetails(1550, 69, -1, -1, 2, (SceneItem *) NULL); +} - _rightReactor.postInit(); - _rightReactor.setup(1516, 8, 1); - _rightReactor.setPosition(Common::Point(107, 116)); - _rightReactor.animate(ANIM_MODE_2, NULL); +bool Scene1550::WorkingShip::startAction(CursorType action, Event &event) { + return SceneHotspot::startAction(action, event); +} - R2_GLOBALS._player.disableControl(); - Common::Point pt(480, 75); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - R2_GLOBALS._sound1.play(111); +bool Scene1550::Wreckage::startAction(CursorType action, Event &event) { + return SceneActor::startAction(action, event); +} - _sceneMode = 1; - } else { - _seeker.postInit(); - _seeker._effect = EFFECT_SHADED; +bool Scene1550::Companion::startAction(CursorType action, Event &event) { + if (action != CURSOR_TALK) + return SceneActor::startAction(action, event); - R2_GLOBALS._player.postInit(); - R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); - R2_GLOBALS._player.disableControl(); + Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; + scene->_sceneMode = 80; + scene->signal(); - setAction(&_sequenceManager, this, 1530, &R2_GLOBALS._player, &_seeker, NULL); + return true; +} - _sceneMode = 2; - } +bool Scene1550::AirBag::startAction(CursorType action, Event &event) { + if (action != CURSOR_USE) + return SceneActor::startAction(action, event); + + R2_GLOBALS._player.disableControl(); + Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; + scene->_dontExit = true; + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + scene->_sceneMode = 1552; + else + scene->_sceneMode = 1588; + scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_airbag, NULL); + return true; } -void Scene1530::signal() { - switch (_sceneMode - 1) { - case 0: - R2_GLOBALS._sceneManager.changeScene(1000); - break; - case 1: - R2_GLOBALS._sceneManager.changeScene(1525); - break; - case 2: +bool Scene1550::Joystick::startAction(CursorType action, Event &event) { + Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + scene->_sceneMode = 50; R2_GLOBALS._player.disableControl(); - _sceneMode = 4; - R2_GLOBALS._player.show(); - setAction(&_sequenceManager, this, 1650, &R2_GLOBALS._player, NULL); + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + scene->_stripManager.start(518, scene); + else + scene->_stripManager.start(520, scene); + return true; break; - case 3: - R2_GLOBALS._sceneManager.changeScene(1700); + case CURSOR_LOOK: + SceneItem::display(1550, 41, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + return true; break; default: - break; + return SceneActor::startAction(action, event); } } -void Scene1530::dispatch() { - int16 x = R2_GLOBALS._player._position.x; - int16 y = R2_GLOBALS._player._position.y; +bool Scene1550::Gyroscope::startAction(CursorType action, Event &event) { + if (action != CURSOR_USE) + return SceneActor::startAction(action, event); - _leftReactor.setPosition(Common::Point(x - 39, y - 85)); - _rightReactor.setPosition(Common::Point(x - 53, y - 9)); + Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; + R2_GLOBALS._player.disableControl(); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + scene->_sceneMode = 1555; + else + scene->_sceneMode = 1589; - Scene::dispatch(); + scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, + &scene->_gyroscope, NULL); + return true; } -/*-------------------------------------------------------------------------- - * Scene 1550 - Spaceport - * - *--------------------------------------------------------------------------*/ +bool Scene1550::DiagnosticsDisplay::startAction(CursorType action, Event &event) { + if (action != CURSOR_USE) + return SceneActor::startAction(action, event); -Scene1550::Junk::Junk() { - _junkNumber = 0; + Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; + R2_GLOBALS._player.disableControl(); + scene->_dontExit = true; + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + scene->_sceneMode = 1586; + else + scene->_sceneMode = 1587; + + scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, + &scene->_diagnosticsDisplay, NULL); + return true; } -void Scene1550::Junk::synchronize(Serializer &s) { - SceneActor::synchronize(s); +bool Scene1550::DishTower::startAction(CursorType action, Event &event) { + if (action != CURSOR_USE) + return SceneActor::startAction(action, event); + + Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; + + if (R2_GLOBALS._player._characterIndex == R2_SEEKER) { + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 1585; + scene->setAction(&scene->_sequenceManager1, scene, 1585, &R2_GLOBALS._player, NULL); + } else { + R2_GLOBALS._player.disableControl(); + switch(scene->_dishMode) { + case 0: + scene->_dish.fixPriority(168); + scene->_walkway.fixPriority(125); + scene->_sceneMode = 1558; + scene->setAction(&scene->_sequenceManager1, scene, 1558, &R2_GLOBALS._player, NULL); + break; + case 1: + return SceneActor::startAction(action, event); + break; + case 2: + scene->_dishMode = 1; + scene->_sceneMode = 1563; + scene->setAction(&scene->_sequenceManager1, scene, 1563, &R2_GLOBALS._player, &scene->_walkway, NULL); + break; + default: + break; + } + } + return true; - s.syncAsSint16LE(_junkNumber); } -bool Scene1550::Junk::startAction(CursorType action, Event &event) { +bool Scene1550::Dish::startAction(CursorType action, Event &event) { Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; switch (action) { case CURSOR_USE: - if (_visage == 1561) { + if (scene->_dishMode != 2) + return SceneActor::startAction(action, event); + + if (R2_INVENTORY.getObjectScene(R2_BATTERY) == 1550) { R2_GLOBALS._player.disableControl(); - scene->_sceneMode = 40; - Common::Point pt(_position.x + 5, _position.y + 20); - PlayerMover *mover = new PlayerMover(); - R2_GLOBALS._player.addMover(mover, &pt, scene); - return true; - } - return SceneActor::startAction(action, event); + scene->_sceneMode = 1564; + scene->setAction(&scene->_sequenceManager1, scene, 1564, &R2_GLOBALS._player, NULL); + } else + SceneItem::display(1550, 64, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + return true; break; case CURSOR_LOOK: - if (_visage == 1561) { - switch (_frame) { - case 2: - SceneItem::display(1550, 23, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - break; - case 3: - SceneItem::display(1550, 26, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - break; - case 4: - SceneItem::display(1550, 35, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - break; - default: - break; - } - } else { - switch ((((_strip - 1) * 5) + _frame) % 3) { - case 0: - SceneItem::display(1550, 62, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - break; - case 1: - SceneItem::display(1550, 53, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - break; - case 2: - SceneItem::display(1550, 76, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - break; - default: - break; - } - } + if (scene->_dishMode != 2) + return SceneActor::startAction(action, event); + + if (R2_INVENTORY.getObjectScene(R2_BATTERY) == 1550) { + SceneItem::display(1550, 74, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + } else + SceneItem::display(1550, 64, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); return true; break; default: @@ -2572,758 +2150,301 @@ bool Scene1550::Junk::startAction(CursorType action, Event &event) { } } -Scene1550::ShipComponent::ShipComponent() { - _componentId = 0; +/*--------------------------------------------------------------------------*/ + +Scene1550::Scene1550() { + _dontExit = false; + _wallType = 0; + _dishMode = 0; + _sceneResourceId = 0; + _walkRegionsId = 0; } -void Scene1550::ShipComponent::synchronize(Serializer &s) { - SceneActor::synchronize(s); +void Scene1550::synchronize(Serializer &s) { + SceneExt::synchronize(s); - s.syncAsSint16LE(_componentId); + s.syncAsSint16LE(_dontExit); + s.syncAsByte(_wallType); + s.syncAsSint16LE(_dishMode); + s.syncAsSint16LE(_sceneResourceId); + s.syncAsSint16LE(_walkRegionsId); } -bool Scene1550::ShipComponent::startAction(CursorType action, Event &event) { - Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; - - switch (action) { - case CURSOR_USE: - if (_componentId == 8) { - scene->_dontExit = true; - R2_GLOBALS._player.disableControl(); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - scene->_sceneMode = 1576; - else - scene->_sceneMode = 1584; - // strcpy(scene->_shipComponents[7]._actorName, 'hatch'); - scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[7], NULL); - return true; - } - return SceneActor::startAction(action, event); - break; - case CURSOR_LOOK: - if (_componentId == 8) - SceneItem::display(1550, 75, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - else if (_frame == 1) - SceneItem::display(1550, 70, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - else - SceneItem::display(1550, 71, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - return true; - break; - case R2_FUEL_CELL: - scene->_dontExit = true; - if (_componentId == 6) { - R2_GLOBALS._player.disableControl(); - scene->_wreckage2.postInit(); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - scene->_sceneMode = 1574; - else - scene->_sceneMode = 1582; - scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[5], &scene->_wreckage2, NULL); - return true; - } - return SceneActor::startAction(action, event); - break; - case R2_GYROSCOPE: - scene->_dontExit = true; - if (_componentId == 3) { - R2_GLOBALS._player.disableControl(); - scene->_wreckage2.postInit(); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - scene->_sceneMode = 1571; - else - scene->_sceneMode = 1581; - scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[2], &scene->_wreckage2, NULL); - return true; - } - return SceneActor::startAction(action, event); - break; - case R2_GUIDANCE_MODULE: - scene->_dontExit = true; - if (_componentId == 1) { - R2_GLOBALS._player.disableControl(); - scene->_wreckage2.postInit(); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - scene->_sceneMode = 1569; - else - scene->_sceneMode = 1579; - scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[0], &scene->_wreckage2, NULL); - return true; - } - return SceneActor::startAction(action, event); - break; - case R2_THRUSTER_VALVE: - scene->_dontExit = true; - if (_componentId == 4) { - R2_GLOBALS._player.disableControl(); - scene->_sceneMode = 1572; - scene->_wreckage2.postInit(); - scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[3], &scene->_wreckage2, NULL); - return true; - } - return SceneActor::startAction(action, event); - break; - case R2_RADAR_MECHANISM: - scene->_dontExit = true; - if (_componentId == 2) { - R2_GLOBALS._player.disableControl(); - scene->_wreckage2.postInit(); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - scene->_sceneMode = 1570; - else - scene->_sceneMode = 1580; - scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[1], &scene->_wreckage2, NULL); - return true; - } - return SceneActor::startAction(action, event); - break; - case R2_IGNITOR: - scene->_dontExit = true; - if (_componentId == 5) { - R2_GLOBALS._player.disableControl(); - scene->_sceneMode = 1573; - scene->_wreckage2.postInit(); - scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[4], &scene->_wreckage2, NULL); - return true; - } - return SceneActor::startAction(action, event); +void Scene1550::postInit(SceneObjectList *OwnerList) { + if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) && + (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11)) + // Exiting the intact spaceship + loadScene(1234); + else + // Normal scene entry + loadScene(1550); + SceneExt::postInit(); + + scalePalette(65, 65, 65); + setZoomPercents(30, 75, 170, 100); + _sceneResourceId = 1550; + _walkRegionsId = 0; + + if (R2_GLOBALS._sceneManager._previousScene == -1) + R2_GLOBALS.setFlag(16); + + if ((R2_GLOBALS._player._characterScene[R2_QUINN] != 1550) && (R2_GLOBALS._player._characterScene[R2_QUINN] != 1580)) { + R2_GLOBALS._player._characterScene[R2_QUINN] = 1550; + R2_GLOBALS._player._characterScene[R2_SEEKER] = 1550; + } + + _stripManager.setColors(60, 255); + _stripManager.setFontNumber(3); + _stripManager.addSpeaker(&_quinnSpeaker); + _stripManager.addSpeaker(&_seekerSpeaker); + + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player._effect = EFFECT_SHADED2; + + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + R2_GLOBALS._player.setup(1500, 3, 1); + else + R2_GLOBALS._player.setup(1505, 3, 1); + + R2_GLOBALS._player._moveDiff = Common::Point(5, 3); + + if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) && + (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11)) + R2_GLOBALS._player.setPosition(Common::Point(157, 135)); + else + R2_GLOBALS._player.setPosition(Common::Point(160, 100)); + + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + R2_GLOBALS._player.disableControl(); + + _wallType = 0; + _companion.changeZoom(-1); + R2_GLOBALS._player.changeZoom(-1); + + switch (R2_GLOBALS._sceneManager._previousScene) { + case 1530: + R2_GLOBALS._stripModifier = 0; + // No break on purpose + case 300: + // No break on purpose + case 1500: + // No break on purpose + case 3150: + R2_GLOBALS._sound1.play(105); break; - case R2_BATTERY: - scene->_dontExit = true; - if (_componentId == 7) { + case 1580: + // Leaving intact ship + if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1580) { R2_GLOBALS._player.disableControl(); - scene->_wreckage2.postInit(); + R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL); + + _dontExit = true; + + _wreckage2.postInit(); + _shipComponents[7].setupShipComponent(8); + _shipComponents[7].hide(); if (R2_GLOBALS._player._characterIndex == R2_QUINN) - scene->_sceneMode = 1575; + _sceneMode = 1577; else - scene->_sceneMode = 1583; - scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[6], &scene->_wreckage2, NULL); - return true; + _sceneMode = 1578; + + setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_wreckage2, &_shipComponents[7], NULL); + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 1550; + } else { + R2_GLOBALS._player.enableControl(); } - return SceneActor::startAction(action, event); break; default: - return SceneActor::startAction(action, event); break; } -} -void Scene1550::ShipComponent::setupShipComponent(int componentId) { - _componentId = componentId; - postInit(); - setup(1517, _componentId, 1); + enterArea(); - switch (_componentId) { + _intactHull1.setDetails(16, 1550, 10, -1, -1); + _intactHull2.setDetails(24, 1550, 10, -1, -1); + _background.setDetails(Rect(0, 0, 320, 200), 1550, 0, 1, -1, 1, NULL); + + if ((R2_GLOBALS._sceneManager._previousScene == 1500) && (R2_GLOBALS.getFlag(16))) { + _sceneMode = 70; + if (!R2_GLOBALS._sceneObjects->contains(&_companion)) + _companion.postInit(); + + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + _companion.setVisage(1505); + else + _companion.setVisage(1500); + + _companion.changeZoom(77); + _companion.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL); + + assert(_walkRegionsId >= 1550); + R2_GLOBALS._walkRegions.disableRegion(k5A750[_walkRegionsId - 1550]); + + setAction(&_sequenceManager1, this, 1590, &_companion, NULL); + } else if ((_sceneMode != 1577) && (_sceneMode != 1578)) + R2_GLOBALS._player.enableControl(); +} + +void Scene1550::signal() { + switch (_sceneMode) { case 1: - if (R2_INVENTORY.getObjectScene(R2_GUIDANCE_MODULE) == 0) - setFrame(5); - setPosition(Common::Point(287, 85)); - break; - case 2: - if (R2_INVENTORY.getObjectScene(R2_RADAR_MECHANISM) == 0) - setFrame(5); - setPosition(Common::Point(248, 100)); - break; + // No break on purpose case 3: - if (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) == 0) - setFrame(5); - setPosition(Common::Point(217, 85)); - break; - case 4: - if (R2_INVENTORY.getObjectScene(R2_THRUSTER_VALVE) == 0) - setFrame(5); - setPosition(Common::Point(161, 121)); - break; + // No break on purpose case 5: - if (R2_INVENTORY.getObjectScene(R2_IGNITOR) == 0) - setFrame(5); - setPosition(Common::Point(117, 121)); - break; - case 6: - if (R2_INVENTORY.getObjectScene(R2_FUEL_CELL) == 0) - setFrame(5); - setPosition(Common::Point(111, 85)); - break; + // No break on purpose case 7: - if (R2_INVENTORY.getObjectScene(R2_BATTERY) == 0) - setFrame(5); - setPosition(Common::Point(95, 84)); - break; - case 8: { - setup(1516, 1, 1); - setPosition(Common::Point(201, 45)); - Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; - if ((scene->_sceneMode == 1577) || (scene->_sceneMode == 1578)) - hide(); - fixPriority(92); - setDetails(1550, 70, -1, -1, 2, (SceneItem *) NULL); - } + _dontExit = false; + R2_GLOBALS._player.enableControl(CURSOR_WALK); break; - default: + case 20: + // No break on purpose + case 21: + // No break on purpose + case 25: + // No break on purpose + case 1563: + // Show the communication dish controls window + R2_GLOBALS.clearFlag(20); + _dishControlsWindow.setup2(1559, 1, 1, 160, 125); + R2_GLOBALS._player.enableControl(); + _sceneMode = 0; break; - } - - fixPriority(92); - setDetails(1550, 70, -1, -1, 2, (SceneItem *)NULL); -} - -Scene1550::DishControlsWindow::DishControl::DishControl() { - _controlId = 0; -} - -void Scene1550::DishControlsWindow::DishControl::synchronize(Serializer &s) { - SceneActor::synchronize(s); - - s.syncAsSint16LE(_controlId); -} - -bool Scene1550::DishControlsWindow::DishControl::startAction(CursorType action, Event &event) { - if (action != CURSOR_USE) - return SceneActor::startAction(action, event); - - Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; - - switch (_controlId) { - case 1: - // Button control - if (scene->_dish._frame == 5) { - R2_GLOBALS._player.disableControl(); - scene->_sceneMode = 25; - if (scene->_walkway._frame == 1) { - scene->setAction(&scene->_sequenceManager1, scene, 1560, &scene->_walkway, NULL); - R2_GLOBALS.setFlag(20); - setFrame(2); - } else { - scene->setAction(&scene->_sequenceManager1, scene, 1561, &scene->_walkway, NULL); - R2_GLOBALS.clearFlag(20); - setFrame(1); - } - scene->_dishControlsWindow.remove(); + case 22: + _dishControlsWindow.remove(); + _sceneMode = 24; + setAction(&_sequenceManager1, this, 1561, &_walkway, NULL); + R2_GLOBALS.clearFlag(20); + break; + case 23: + _dishControlsWindow.remove(); + _sceneMode = 20; + setAction(&_sequenceManager1, this, 1566, &_dish, &_dishTowerShadow, NULL); + R2_GLOBALS.setFlag(19); + break; + case 24: + _dishControlsWindow.remove(); + _sceneMode = 21; + setAction(&_sequenceManager1, this, 1567, &_dish, &_dishTowerShadow, NULL); + R2_GLOBALS.clearFlag(19); + break; + case 30: + // No break on purpose + case 1556: + // No break on purpose + case 1557: + // Nothing on purpose + break; + case 40: { + _sceneMode = 41; + Common::Point pt(_junk[0]._position.x, _junk[0]._position.y + 20); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); } break; - case 2: - // Lever control - R2_GLOBALS._player.disableControl(); - if (scene->_dish._frame == 1) { - scene->_sceneMode = 23; - scene->setAction(&scene->_sequenceManager1, scene, 1560, this, NULL); + case 41: + _sceneMode = 42; + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + R2_GLOBALS._player.setup(1502, 8, 1); } else { - if (scene->_walkway._frame == 1) - scene->_sceneMode = 24; - else - scene->_sceneMode = 22; - scene->setAction(&scene->_sequenceManager1, scene, 1561, this, NULL); + R2_GLOBALS._player.changeZoom(R2_GLOBALS._player._percent + 14); + R2_GLOBALS._player.setup(1516, 4, 1); } - break; - default: + R2_GLOBALS._player.animate(ANIM_MODE_5, this); break; - } - return true; -} - -void Scene1550::DishControlsWindow::remove() { - Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; - - _button.remove(); - _lever.remove(); - ModalWindow::remove(); + case 42: { + _sceneMode = 43; + int junkRegionIndex = R2_GLOBALS._scene1550JunkLocations[_junk[0]._junkNumber + 3]; + R2_GLOBALS._walkRegions.enableRegion(scene1550JunkRegions[junkRegionIndex]); - if ((scene->_sceneMode >= 20) && (scene->_sceneMode <= 29)) - return; + switch (_junk[0]._frame) { + case 1: + R2_INVENTORY.setObjectScene(R2_JOYSTICK, R2_GLOBALS._player._characterIndex); + break; + case 2: + R2_INVENTORY.setObjectScene(R2_FUEL_CELL, R2_GLOBALS._player._characterIndex); + break; + case 3: + R2_INVENTORY.setObjectScene(R2_GUIDANCE_MODULE, R2_GLOBALS._player._characterIndex); + break; + case 4: + R2_INVENTORY.setObjectScene(R2_RADAR_MECHANISM, R2_GLOBALS._player._characterIndex); + break; + case 5: + R2_INVENTORY.setObjectScene(R2_BATTERY, R2_GLOBALS._player._characterIndex); + break; + case 6: + R2_INVENTORY.setObjectScene(R2_DIAGNOSTICS_DISPLAY, R2_GLOBALS._player._characterIndex); + break; + default: + break; + } - R2_GLOBALS._player.disableControl(); - if (scene->_walkway._frame == 1) { - scene->_sceneMode = 1559; - scene->setAction(&scene->_sequenceManager1, scene, 1559, &R2_GLOBALS._player, NULL); - } else { - scene->_sceneMode = 1562; - scene->setAction(&scene->_sequenceManager1, scene, 1562, &R2_GLOBALS._player, NULL); + _junk[0].remove(); + R2_GLOBALS._player.animate(ANIM_MODE_6, this); + break; } -} - -void Scene1550::DishControlsWindow::setup2(int visage, int stripFrameNum, int frameNum, - int posX, int posY) { - // Call inherited setup - ModalWindow::setup2(visage, stripFrameNum, frameNum, posX, posY); - - // Further setup - Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; - setup3(1550, 67, -1, -1); - _button.postInit(); - _button._controlId = 1; - if (scene->_walkway._frame == 1) - _button.setup(1559, 3, 1); - else - _button.setup(1559, 3, 2); - _button.setPosition(Common::Point(142, 79)); - _button.fixPriority(251); - _button.setDetails(1550, 68, -1, -1, 2, (SceneItem *) NULL); - - _lever.postInit(); - _lever._numFrames = 5; - _lever._controlId = 2; - if (scene->_dish._frame == 1) - _lever.setup(1559, 2, 1); - else - _lever.setup(1559, 2, 5); - _lever.setPosition(Common::Point(156, 103)); - _lever.fixPriority(251); - _lever.setDetails(1550, 69, -1, -1, 2, (SceneItem *) NULL); -} - -bool Scene1550::WorkingShip::startAction(CursorType action, Event &event) { - return SceneHotspot::startAction(action, event); -} - -bool Scene1550::Wreckage::startAction(CursorType action, Event &event) { - return SceneActor::startAction(action, event); -} - -bool Scene1550::Companion::startAction(CursorType action, Event &event) { - if (action != CURSOR_TALK) - return SceneActor::startAction(action, event); - - Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; - scene->_sceneMode = 80; - scene->signal(); - - return true; -} - -bool Scene1550::AirBag::startAction(CursorType action, Event &event) { - if (action != CURSOR_USE) - return SceneActor::startAction(action, event); - - R2_GLOBALS._player.disableControl(); - Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; - scene->_dontExit = true; - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - scene->_sceneMode = 1552; - else - scene->_sceneMode = 1588; - - scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_airbag, NULL); - return true; -} - -bool Scene1550::Joystick::startAction(CursorType action, Event &event) { - Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; - - switch (action) { - case CURSOR_USE: - scene->_sceneMode = 50; - R2_GLOBALS._player.disableControl(); - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + case 43: + R2_GLOBALS._scene1550JunkLocations[_junk[0]._junkNumber + 2] = 0; if (R2_GLOBALS._player._characterIndex == R2_QUINN) - scene->_stripManager.start(518, scene); - else - scene->_stripManager.start(520, scene); - return true; - break; - case CURSOR_LOOK: - SceneItem::display(1550, 41, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - return true; + R2_GLOBALS._player.setVisage(1500); + else { + R2_GLOBALS._player.changeZoom(-1); + R2_GLOBALS._player.setVisage(1505); + } + R2_GLOBALS._player.animate(ANIM_MODE_1, this); + R2_GLOBALS._player.setStrip(8); + R2_GLOBALS._player.enableControl(); break; - default: - return SceneActor::startAction(action, event); - } -} - -bool Scene1550::Gyroscope::startAction(CursorType action, Event &event) { - if (action != CURSOR_USE) - return SceneActor::startAction(action, event); - - Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; - R2_GLOBALS._player.disableControl(); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - scene->_sceneMode = 1555; - else - scene->_sceneMode = 1589; - - scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, - &scene->_gyroscope, NULL); - return true; -} - -bool Scene1550::DiagnosticsDisplay::startAction(CursorType action, Event &event) { - if (action != CURSOR_USE) - return SceneActor::startAction(action, event); - - Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; - R2_GLOBALS._player.disableControl(); - scene->_dontExit = true; - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - scene->_sceneMode = 1586; - else - scene->_sceneMode = 1587; - - scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, - &scene->_diagnosticsDisplay, NULL); - return true; -} - -bool Scene1550::DishTower::startAction(CursorType action, Event &event) { - if (action != CURSOR_USE) - return SceneActor::startAction(action, event); - - Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; - - if (R2_GLOBALS._player._characterIndex == R2_SEEKER) { - R2_GLOBALS._player.disableControl(); - scene->_sceneMode = 1585; - scene->setAction(&scene->_sequenceManager1, scene, 1585, &R2_GLOBALS._player, NULL); - } else { - R2_GLOBALS._player.disableControl(); - switch(scene->_dishMode) { - case 0: - scene->_dish.fixPriority(168); - scene->_walkway.fixPriority(125); - scene->_sceneMode = 1558; - scene->setAction(&scene->_sequenceManager1, scene, 1558, &R2_GLOBALS._player, NULL); - break; - case 1: - return SceneActor::startAction(action, event); - break; - case 2: - scene->_dishMode = 1; - scene->_sceneMode = 1563; - scene->setAction(&scene->_sequenceManager1, scene, 1563, &R2_GLOBALS._player, &scene->_walkway, NULL); - break; - default: - break; + case 50: + // Removed (useless ?) call to sub_1D227 + ++_sceneMode; + setAction(&_sequenceManager1, this, 1591, &R2_GLOBALS._player, NULL); + if (g_globals->_sceneObjects->contains(&_companion)) + signal(); + else { + _companion.postInit(); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + _companion.setVisage(1505); + else + _companion.setVisage(1500); + _companion.changeZoom(77); + _companion.setAction(&_sequenceManager2, this, 1590, &_companion, NULL); + _companion.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL); } - } - return true; - -} - -bool Scene1550::Dish::startAction(CursorType action, Event &event) { - Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; - - switch (action) { - case CURSOR_USE: - if (scene->_dishMode != 2) - return SceneActor::startAction(action, event); - - if (R2_INVENTORY.getObjectScene(R2_BATTERY) == 1550) { - R2_GLOBALS._player.disableControl(); - scene->_sceneMode = 1564; - scene->setAction(&scene->_sequenceManager1, scene, 1564, &R2_GLOBALS._player, NULL); - } else - SceneItem::display(1550, 64, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - return true; break; - case CURSOR_LOOK: - if (scene->_dishMode != 2) - return SceneActor::startAction(action, event); - - if (R2_INVENTORY.getObjectScene(R2_BATTERY) == 1550) { - SceneItem::display(1550, 74, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - } else - SceneItem::display(1550, 64, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - return true; + case 51: + ++_sceneMode; break; - default: - return SceneActor::startAction(action, event); + case 52: + _companion.changeZoom(-1); + _sceneMode = 1592; + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + setAction(&_sequenceManager1, this, 1592, &R2_GLOBALS._player, &_companion, + &_junk[0], &_joystick, NULL); + else + setAction(&_sequenceManager1, this, 1593, &R2_GLOBALS._player, &_companion, + &_junk[0], &_joystick, NULL); break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene1550::Scene1550() { - _dontExit = false; - _wallType = 0; - _dishMode = 0; - _sceneResourceId = 0; - _walkRegionsId = 0; -} - -void Scene1550::synchronize(Serializer &s) { - SceneExt::synchronize(s); - - s.syncAsSint16LE(_dontExit); - s.syncAsByte(_wallType); - s.syncAsSint16LE(_dishMode); - s.syncAsSint16LE(_sceneResourceId); - s.syncAsSint16LE(_walkRegionsId); -} - -void Scene1550::postInit(SceneObjectList *OwnerList) { - if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) && - (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11)) - // Exiting the intact spaceship - loadScene(1234); - else - // Normal scene entry - loadScene(1550); - SceneExt::postInit(); - - scalePalette(65, 65, 65); - setZoomPercents(30, 75, 170, 100); - _sceneResourceId = 1550; - _walkRegionsId = 0; - - if (R2_GLOBALS._sceneManager._previousScene == -1) - R2_GLOBALS.setFlag(16); - - if ((R2_GLOBALS._player._characterScene[R2_QUINN] != 1550) && (R2_GLOBALS._player._characterScene[R2_QUINN] != 1580)) { - R2_GLOBALS._player._characterScene[R2_QUINN] = 1550; - R2_GLOBALS._player._characterScene[R2_SEEKER] = 1550; - } - - _stripManager.setColors(60, 255); - _stripManager.setFontNumber(3); - _stripManager.addSpeaker(&_quinnSpeaker); - _stripManager.addSpeaker(&_seekerSpeaker); - - R2_GLOBALS._player.postInit(); - R2_GLOBALS._player._effect = EFFECT_SHADED2; - - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - R2_GLOBALS._player.setup(1500, 3, 1); - else - R2_GLOBALS._player.setup(1505, 3, 1); - - R2_GLOBALS._player._moveDiff = Common::Point(5, 3); - - if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) && - (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11)) - R2_GLOBALS._player.setPosition(Common::Point(157, 135)); - else - R2_GLOBALS._player.setPosition(Common::Point(160, 100)); - - R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); - R2_GLOBALS._player.disableControl(); - - _wallType = 0; - _companion.changeZoom(-1); - R2_GLOBALS._player.changeZoom(-1); - - switch (R2_GLOBALS._sceneManager._previousScene) { - case 1530: - R2_GLOBALS._stripModifier = 0; - // No break on purpose - case 300: - // No break on purpose - case 1500: - // No break on purpose - case 3150: - R2_GLOBALS._sound1.play(105); + case 61: + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = false; + _dishMode = 2; break; - case 1580: - // Leaving intact ship - if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1580) { - R2_GLOBALS._player.disableControl(); - R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL); - - _dontExit = true; - - _wreckage2.postInit(); - _shipComponents[7].setupShipComponent(8); - _shipComponents[7].hide(); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - _sceneMode = 1577; - else - _sceneMode = 1578; - - setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_wreckage2, &_shipComponents[7], NULL); - R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 1550; - } else { - R2_GLOBALS._player.enableControl(); + case 62: + R2_GLOBALS._player.enableControl(CURSOR_TALK); + if (_dishMode == 2) { + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = false; } break; - default: - break; - } - - enterArea(); - - _intactHull1.setDetails(16, 1550, 10, -1, -1); - _intactHull2.setDetails(24, 1550, 10, -1, -1); - _background.setDetails(Rect(0, 0, 320, 200), 1550, 0, 1, -1, 1, NULL); - - if ((R2_GLOBALS._sceneManager._previousScene == 1500) && (R2_GLOBALS.getFlag(16))) { - _sceneMode = 70; - if (!R2_GLOBALS._sceneObjects->contains(&_companion)) - _companion.postInit(); - - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - _companion.setVisage(1505); - else - _companion.setVisage(1500); - - _companion.changeZoom(77); - _companion.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL); - - assert(_walkRegionsId >= 1550); - R2_GLOBALS._walkRegions.disableRegion(k5A750[_walkRegionsId - 1550]); - - setAction(&_sequenceManager1, this, 1590, &_companion, NULL); - } else if ((_sceneMode != 1577) && (_sceneMode != 1578)) - R2_GLOBALS._player.enableControl(); -} - -void Scene1550::signal() { - switch (_sceneMode) { - case 1: - // No break on purpose - case 3: - // No break on purpose - case 5: - // No break on purpose - case 7: - _dontExit = false; - R2_GLOBALS._player.enableControl(CURSOR_WALK); - break; - case 20: - // No break on purpose - case 21: - // No break on purpose - case 25: - // No break on purpose - case 1563: - // Show the communication dish controls window - R2_GLOBALS.clearFlag(20); - _dishControlsWindow.setup2(1559, 1, 1, 160, 125); - R2_GLOBALS._player.enableControl(); - _sceneMode = 0; - break; - case 22: - _dishControlsWindow.remove(); - _sceneMode = 24; - setAction(&_sequenceManager1, this, 1561, &_walkway, NULL); - R2_GLOBALS.clearFlag(20); - break; - case 23: - _dishControlsWindow.remove(); - _sceneMode = 20; - setAction(&_sequenceManager1, this, 1566, &_dish, &_dishTowerShadow, NULL); - R2_GLOBALS.setFlag(19); - break; - case 24: - _dishControlsWindow.remove(); - _sceneMode = 21; - setAction(&_sequenceManager1, this, 1567, &_dish, &_dishTowerShadow, NULL); - R2_GLOBALS.clearFlag(19); - break; - case 30: - // No break on purpose - case 1556: - // No break on purpose - case 1557: - // Nothing on purpose - break; - case 40: { - _sceneMode = 41; - Common::Point pt(_junk[0]._position.x, _junk[0]._position.y + 20); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } - break; - case 41: - _sceneMode = 42; - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - R2_GLOBALS._player.setup(1502, 8, 1); - } else { - R2_GLOBALS._player.changeZoom(R2_GLOBALS._player._percent + 14); - R2_GLOBALS._player.setup(1516, 4, 1); - } - R2_GLOBALS._player.animate(ANIM_MODE_5, this); - break; - - case 42: { - _sceneMode = 43; - int junkRegionIndex = R2_GLOBALS._scene1550JunkLocations[_junk[0]._junkNumber + 3]; - R2_GLOBALS._walkRegions.enableRegion(scene1550JunkRegions[junkRegionIndex]); - - switch (_junk[0]._frame) { - case 1: - R2_INVENTORY.setObjectScene(R2_JOYSTICK, R2_GLOBALS._player._characterIndex); - break; - case 2: - R2_INVENTORY.setObjectScene(R2_FUEL_CELL, R2_GLOBALS._player._characterIndex); - break; - case 3: - R2_INVENTORY.setObjectScene(R2_GUIDANCE_MODULE, R2_GLOBALS._player._characterIndex); - break; - case 4: - R2_INVENTORY.setObjectScene(R2_RADAR_MECHANISM, R2_GLOBALS._player._characterIndex); - break; - case 5: - R2_INVENTORY.setObjectScene(R2_BATTERY, R2_GLOBALS._player._characterIndex); - break; - case 6: - R2_INVENTORY.setObjectScene(R2_DIAGNOSTICS_DISPLAY, R2_GLOBALS._player._characterIndex); - break; - default: - break; - } - - _junk[0].remove(); - R2_GLOBALS._player.animate(ANIM_MODE_6, this); - break; - } - case 43: - R2_GLOBALS._scene1550JunkLocations[_junk[0]._junkNumber + 2] = 0; - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - R2_GLOBALS._player.setVisage(1500); - else { - R2_GLOBALS._player.changeZoom(-1); - R2_GLOBALS._player.setVisage(1505); - } - R2_GLOBALS._player.animate(ANIM_MODE_1, this); - R2_GLOBALS._player.setStrip(8); - R2_GLOBALS._player.enableControl(); - break; - case 50: - // Removed (useless ?) call to sub_1D227 - ++_sceneMode; - setAction(&_sequenceManager1, this, 1591, &R2_GLOBALS._player, NULL); - if (g_globals->_sceneObjects->contains(&_companion)) - signal(); - else { - _companion.postInit(); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - _companion.setVisage(1505); - else - _companion.setVisage(1500); - _companion.changeZoom(77); - _companion.setAction(&_sequenceManager2, this, 1590, &_companion, NULL); - _companion.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL); - } - break; - case 51: - ++_sceneMode; - break; - case 52: - _companion.changeZoom(-1); - _sceneMode = 1592; - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - setAction(&_sequenceManager1, this, 1592, &R2_GLOBALS._player, &_companion, - &_junk[0], &_joystick, NULL); - else - setAction(&_sequenceManager1, this, 1593, &R2_GLOBALS._player, &_companion, - &_junk[0], &_joystick, NULL); - break; - case 61: - R2_GLOBALS._player.enableControl(CURSOR_USE); - R2_GLOBALS._player._canWalk = false; - _dishMode = 2; - break; - case 62: - R2_GLOBALS._player.enableControl(CURSOR_TALK); - if (_dishMode == 2) { - R2_GLOBALS._player.enableControl(CURSOR_USE); - R2_GLOBALS._player._canWalk = false; - } - break; - case 70: - R2_GLOBALS._s1550PlayerArea[R2_SEEKER] = R2_GLOBALS._s1550PlayerArea[R2_QUINN]; - //R2_GLOBALS._s1550PlayerAreas[0] = 1; - _sceneMode = 60; - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - _stripManager.start(500, this); + case 70: + R2_GLOBALS._s1550PlayerArea[R2_SEEKER] = R2_GLOBALS._s1550PlayerArea[R2_QUINN]; + //R2_GLOBALS._s1550PlayerAreas[0] = 1; + _sceneMode = 60; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _stripManager.start(500, this); break; case 80: if (R2_GLOBALS.getFlag(16)) { @@ -3453,7191 +2574,5400 @@ void Scene1550::signal() { // No break on purpose case 1582: _dontExit = false; - _wreckage2.remove(); - R2_INVENTORY.setObjectScene(R2_FUEL_CELL, 0); - R2_GLOBALS._player.enableControl(); - break; - case 1575: - // No break on purpose - case 1583: - _dontExit = false; - _wreckage2.remove(); - R2_INVENTORY.setObjectScene(R2_BATTERY, 0); - R2_GLOBALS._player.enableControl(); - break; - case 1576: - // No break on purpose - case 1584: - R2_GLOBALS._sceneManager.changeScene(1580); - R2_GLOBALS._player.enableControl(); - break; - case 1577: - // No break on purpose - case 1578: - _sceneMode = 0; - _wreckage2.remove(); - _dontExit = false; - R2_GLOBALS._player.fixPriority(-1); - R2_GLOBALS._player.enableControl(); - break; - case 1585: - SceneItem::display(1550, 66, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - R2_GLOBALS._player.enableControl(); - break; - case 1586: - // No break on purpose - case 1587: - R2_INVENTORY.setObjectScene(R2_DIAGNOSTICS_DISPLAY, R2_GLOBALS._player._characterIndex); - _diagnosticsDisplay.remove(); - _dontExit = false; - R2_GLOBALS._player.enableControl(); - break; - case 1592: - _joystick.remove(); - R2_INVENTORY.setObjectScene(R2_JOYSTICK, 1); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - R2_GLOBALS._s1550PlayerArea[R2_SEEKER] = R2_GLOBALS._s1550PlayerArea[R2_QUINN]; - } else { - R2_GLOBALS._s1550PlayerArea[R2_QUINN] = R2_GLOBALS._s1550PlayerArea[R2_SEEKER]; - } - R2_GLOBALS._player.enableControl(CURSOR_WALK); - break; - default: - _sceneMode = 62; - setAction(&_sequenceManager1, this, 1, &R2_GLOBALS._player, NULL); - break; - } -} - -void Scene1550::process(Event &event) { - if ((!R2_GLOBALS._player._canWalk) && (R2_GLOBALS._events.getCursor() == R2_NEGATOR_GUN) && (event.eventType == EVENT_BUTTON_DOWN) && (this->_screenNumber == 1234)) { - int curReg = R2_GLOBALS._sceneRegions.indexOf(event.mousePos); - if (curReg == 0) - _dontExit = true; - else if (((R2_GLOBALS._player._position.y < 90) && (event.mousePos.y > 90)) || ((R2_GLOBALS._player._position.y > 90) && (event.mousePos.y < 90))) - _dontExit = true; - else - _dontExit = false; - - if ((curReg == 13) || (curReg == 14)) - _dontExit = false; - } - - Scene::process(event); -} - -void Scene1550::dispatch() { - Scene::dispatch(); - - // Arrays related to this scene are all hacky in the origina: they are based on the impossibility to use Miranda - assert ((R2_GLOBALS._player._characterIndex == R2_QUINN) || (R2_GLOBALS._player._characterIndex == R2_SEEKER)); - - if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 15) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 16)) { - R2_GLOBALS._player._shade = 0; - - // NOTE: Original game contains a switch based on an uninitialized variable. - // We're leaving this code here, but ifdef'ed out, in case we can ever figure out - // what the original programmers intended the value to come from -#if 0 - int missingVariable = 0; - switch (missingVariable) { - case 144: - // No break on purpose - case 146: - _dish._frame = 5; - R2_GLOBALS._player._shade = 3; - break; - case 148: - // No break on purpose - case 149: - _dish._frame = 1; - // No break on purpose - case 147: - // No break on purpose - case 150: - R2_GLOBALS._player._shade = 3; - break; - default: - break; - } -#endif - } - - if (_dontExit) - return; - - switch (R2_GLOBALS._player.getRegionIndex() - 11) { - case 0: - // No break on purpose - case 5: - // Exiting the top of the screen - R2_GLOBALS._player.disableControl(); - _sceneMode = 1; - _dontExit = true; - --R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y; - - enterArea(); - - R2_GLOBALS._player.setPosition(Common::Point( 160 - (((((160 - R2_GLOBALS._player._position.x) * 100) / 108) * 172) / 100), 145)); - if (R2_GLOBALS._player._position.x < 160) { - Common::Point pt(R2_GLOBALS._player._position.x + 5, 135); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } else if (R2_GLOBALS._player._position.x <= 160) { // the check is really in the original... - Common::Point pt(R2_GLOBALS._player._position.x, 135); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } else { - Common::Point pt(R2_GLOBALS._player._position.x - 5, 135); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } - break; - case 1: - // Exiting the bottom of the screen - R2_GLOBALS._player.disableControl(); - _sceneMode = 3; - _dontExit = true; - ++R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y; - - enterArea(); - - R2_GLOBALS._player.setPosition(Common::Point( 160 - (((((160 - R2_GLOBALS._player._position.x) * 100) / 172) * 108) / 100), 19)); - if (R2_GLOBALS._player._position.x < 160) { - Common::Point pt(R2_GLOBALS._player._position.x + 5, 29); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } else if (R2_GLOBALS._player._position.x <= 160) { // the check is really in the original... - Common::Point pt(R2_GLOBALS._player._position.x, 29); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } else { - Common::Point pt(R2_GLOBALS._player._position.x - 5, 29); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } - break; - case 2: - // Exiting the right of the screen - R2_GLOBALS._player.disableControl(); - _sceneMode = 5; - _dontExit = true; - ++R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x; - - enterArea(); - - if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11) && (R2_GLOBALS._player._position.y > 50) && (R2_GLOBALS._player._position.y < 135)) { - if (R2_GLOBALS._player._position.y >= 85) { - R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y + 10)); - Common::Point pt(R2_GLOBALS._player._position.x + 30, R2_GLOBALS._player._position.y + 20); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } else { - R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y - 10)); - Common::Point pt(R2_GLOBALS._player._position.x + 30, R2_GLOBALS._player._position.y - 20); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } - } else { - R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y)); - Common::Point pt(R2_GLOBALS._player._position.x + 10, R2_GLOBALS._player._position.y); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } - break; - case 3: - // Exiting to the left of the screen - R2_GLOBALS._player.disableControl(); - _sceneMode = 7; - _dontExit = true; - --R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x; - - enterArea(); - - if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 24) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11)) { - R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y / 2)); - Common::Point pt(265, 29); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } else if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11) && (R2_GLOBALS._player._position.y > 50) && (R2_GLOBALS._player._position.y < 135)) { - if (R2_GLOBALS._player._position.y >= 85) { - R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y + 10)); - Common::Point pt(R2_GLOBALS._player._position.x - 30, R2_GLOBALS._player._position.y + 20); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } else { - R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y - 10)); - Common::Point pt(R2_GLOBALS._player._position.x - 30, R2_GLOBALS._player._position.y - 20); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } - } else { - R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y)); - Common::Point pt(R2_GLOBALS._player._position.x - 10, R2_GLOBALS._player._position.y); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } - break; - default: - break; - } -} - -void Scene1550::saveCharacter(int characterIndex) { - if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) - R2_GLOBALS._sound1.fadeOut2(NULL); - - SceneExt::saveCharacter(characterIndex); -} - -void Scene1550::Wall::setupWall(int frameNumber, int strip) { - Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; - - postInit(); - if (scene->_wallType == 2) - setup(1551, strip, frameNumber); - else - setup(1554, strip, frameNumber); - - switch (strip) { - case 0: - switch (frameNumber - 1) { - case 0: - setup(1551, 1, 1); - setPosition(Common::Point(30, 67)); - break; - case 1: - setup(1560, 1, 5); - setPosition(Common::Point(141, 54)); - break; - case 2: - setup(1560, 2, 5); - setPosition(Common::Point(178, 54)); - break; - case 3: - setup(1560, 2, 1); - setPosition(Common::Point(289, 67)); - break; - case 4: - setup(1560, 2, 2); - setPosition(Common::Point(298, 132)); - break; - case 5: - setup(1560, 1, 2); - setPosition(Common::Point(21, 132)); - break; - case 6: - setup(1560, 2, 4); - setPosition(Common::Point(285, 123)); - break; - case 7: - setup(1560, 1, 3); - setPosition(Common::Point(30, 111)); - break; - case 8: - setup(1560, 2, 3); - setPosition(Common::Point(289, 111)); - break; - case 9: - setup(1560, 1, 4); - setPosition(Common::Point(34, 123)); - break; - default: - break; - } - fixPriority(1); - break; - case 1: - if (frameNumber == 3) { - setup(1553, 3, 1); - setPosition(Common::Point(48, 44)); - fixPriority(2); - } else { - fixPriority(1); - setPosition(Common::Point(32, 17)); - } - - switch (frameNumber) { - case 2: - setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL); - break; - case 3: - setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL); - break; - default: - setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL); - break; - } - break; - case 2: - fixPriority(1); - switch (frameNumber) { - case 4: - setup(1553, 4, 1); - setPosition(Common::Point(48, 168)); - break; - case 5: - setup(1553, 3, 2); - setPosition(Common::Point(20, 168)); - fixPriority(250); - break; - default: - setPosition(Common::Point(28, 116)); - break; - } - - switch (frameNumber) { - case 2: - setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL); - break; - case 4: - setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL); - break; - case 5: - setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL); - break; - default: - setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL); - break; - } - break; - case 3: - switch (frameNumber) { - case 2: - fixPriority(2); - if (scene->_wallType == 2) - setup(1553, 2, 1); - else - setup(1556, 2, 1); - setPosition(Common::Point(160, 44)); - break; - case 3: - fixPriority(2); - setup(1553, 5, 1); - setPosition(Common::Point(178, 44)); - break; - default: - fixPriority(1); - setPosition(Common::Point(160, 17)); - break; - } - - if (frameNumber == 1) - setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL); - else - setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL); - break; - case 4: - if (frameNumber == 2) { - fixPriority(250); - if (scene->_wallType == 2) - setup(1553, 1, 1); - else - setup(1556, 1, 1); - } else { - fixPriority(2); - } - - if (frameNumber != 1) - setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL); - - setPosition(Common::Point(160, 168)); - break; - case 5: - fixPriority(1); - setPosition(Common::Point(287, 17)); - - switch (frameNumber) { - case 2: - setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL); - break; - case 3: - setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL); - break; - default: - setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL); - break; - } - break; - case 6: - fixPriority(1); - setPosition(Common::Point(291, 116)); - - if (frameNumber == 2) - setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL); - else - setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL); - break; - default: - break; - } - -} - -void Scene1550::enterArea() { - _walkRegionsId = 0; - _dishMode = 0; - - _wallCorner1.remove(); - _westWall.remove(); - _northWall.remove(); - _southWall.remove(); - _wallCorner2.remove(); - _eastWall.remove(); - - for (int i = 0; i < 8; ++i) - _junk[i].remove(); - - _wreckage.remove(); - - for (int i = 0; i < 8; ++i) - _shipComponents[i].remove(); - - _airbag.remove(); - _joystick.remove(); - _gyroscope.remove(); - _wreckage4.remove(); - _diagnosticsDisplay.remove(); - - if ((_sceneMode != 1577) && (_sceneMode != 1578)) - _wreckage2.remove(); - - _wreckage3.remove(); - _companion.remove(); - _dish.remove(); - _dishTowerShadow.remove(); - _dishTower.remove(); - _walkway.remove(); - - // Set up of special walk regions for certain areas - switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y) { - case 0: - switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) { - case 3: - R2_GLOBALS._walkRegions.load(1554); - _walkRegionsId = 1554; - break; - case 4: - R2_GLOBALS._walkRegions.load(1553); - _walkRegionsId = 1553; - break; - default: - break; - } - break; - case 3: - // No break on purpose - case 4: - if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 23) || (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x)) { - if (!R2_GLOBALS.getFlag(16)) { - R2_GLOBALS._walkRegions.load(1559); - _walkRegionsId = 1559; - } - } - break; - case 7: - switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) { - case 10: - R2_GLOBALS._walkRegions.load(1555); - _walkRegionsId = 1555; - break; - case 11: - R2_GLOBALS._walkRegions.load(1556); - _walkRegionsId = 1556; - break; - default: - break; - } - break; - case 11: - switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) { - case 24: - R2_GLOBALS._walkRegions.load(1558); - _walkRegionsId = 1558; - break; - case 25: - R2_GLOBALS._walkRegions.load(1557); - _walkRegionsId = 1557; - break; - default: - break; - } - break; - case 16: - switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) { - case 2: - R2_GLOBALS._walkRegions.load(1552); - _walkRegionsId = 1552; - break; - case 3: - R2_GLOBALS._walkRegions.load(1551); - _walkRegionsId = 1551; - break; - case 15: - R2_GLOBALS._walkRegions.load(1575); - _walkRegionsId = 1575; - default: - break; - } - break; - default: - break; - } - - int varA = 0; - - // This section handles checks if the ARM spacecraft have not yet seized - // control of Lance of Truth. - if (!R2_GLOBALS.getFlag(16)) { - switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y - 2) { - case 0: - switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x - 22) { - case 0: - varA = 1553; - _northWall.setupWall(6, 0); - break; - case 1: - // No break on purpose - case 2: - // No break on purpose - case 3: - // No break on purpose - case 4: - varA = 1553; - break; - case 5: - varA = 1553; - _northWall.setupWall(6, 0); - break; - default: - break; - } - break; - case 1: - // No break on purpose - case 2: - switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x - 21) { - case 0: - varA = 1550; - _northWall.setupWall(9, 0); - break; - case 1: - varA = 1552; - _northWall.setupWall(10, 0); - break; - case 2: - // No break on purpose - case 3: - // No break on purpose - case 4: - // No break on purpose - case 5: - varA = 1552; - break; - case 6: - varA = 1552; - _northWall.setupWall(7, 0); - break; - case 7: - varA = 1550; - _northWall.setupWall(8, 0); - break; - default: - break; - } - break; - case 3: - switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x - 21) { - case 0: - varA = 1550; - _northWall.setupWall(4, 0); - break; - case 1: - varA = 1550; - _northWall.setupWall(3, 0); - break; - case 2: - // No break on purpose - case 3: - // No break on purpose - case 4: - // No break on purpose - case 5: - varA = 1551; - break; - case 6: - varA = 1550; - _northWall.setupWall(2, 0); - break; - case 7: - varA = 1550; - _northWall.setupWall(1, 0); - break; - default: - break; - } - break; - default: - break; - } - if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y > 0) && - (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x <= 29) && - ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x < 20) || - (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y > 7))) { - // In an area where the cutscene can be triggered, so start it - R2_GLOBALS.setFlag(16); - R2_GLOBALS._sceneManager.changeScene(1500); - } - } - - if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) && - (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11)) { - if (_screenNumber != 1234) { - R2_GLOBALS._sceneManager._fadeMode = FADEMODE_IMMEDIATE; - loadScene(1234); - R2_GLOBALS._sceneManager._hasPalette = false; - _wallType = 0; - } - } else if (_screenNumber == 1234) { - R2_GLOBALS._sceneManager._fadeMode = FADEMODE_IMMEDIATE; - loadScene(1550); - R2_GLOBALS._sceneManager._hasPalette = false; - } - - if (_screenNumber == 1234) - _walkRegionsId = 1576; - - if (_wallType == 0) { - _wallType = 1; - } else { - if (_wallType == 2) { - _wallType = 3; - } else { - _wallType = 2; - } - - if (R2_GLOBALS._sceneManager._sceneNumber == 1550){ -#if 0 - warning("Mouse_hideIfNeeded()"); - warning("gfx_set_pane_p"); - for (int i = 3; i != 168; ++i) { - warning("sub294D2(4, i, 312, var14C)"); - warning("missing for loop, to be implemented"); - warning("gfx_draw_slice"); - } - warning("gfx_flip_screen()"); - warning("gfx_set_pane_p()"); -#endif - R2_GLOBALS._sceneManager._fadeMode = FADEMODE_IMMEDIATE; - - if (varA == 0) { - if (_sceneResourceId != 1550) { - g_globals->_scenePalette.loadPalette(1550); - R2_GLOBALS._sceneManager._hasPalette = true; - } - } else { - g_globals->_scenePalette.loadPalette(varA); - R2_GLOBALS._sceneManager._hasPalette = true; - } - - if (R2_GLOBALS._sceneManager._hasPalette) - _sceneResourceId = varA; - -// warning("sub_2C429()"); - } - } - - // Scene setup dependent on the type of cell specified in the scene map - switch (scene1550AreaMap[(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y * 30) + - R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x]) { - case 0: - // Standard cell - if (_walkRegionsId == 0) { - R2_GLOBALS._walkRegions.load(1550); - _walkRegionsId = 1550; - } - break; - case 1: - // North end of the spaceport - if (_walkRegionsId == 0) { - R2_GLOBALS._walkRegions.load(1560); - _walkRegionsId = 1560; - } - _wallCorner1.setupWall(2, 1); - _northWall.setupWall(1, 3); - _wallCorner2.setupWall(2, 5); - break; - case 2: - R2_GLOBALS._walkRegions.load(1561); - _walkRegionsId = 1561; - _wallCorner1.setupWall(2, 1); - _westWall.setupWall(2, 2); - _northWall.setupWall(1, 3); - _wallCorner2.setupWall(2, 5); - break; - case 3: - R2_GLOBALS._walkRegions.load(1562); - _walkRegionsId = 1562; - _wallCorner1.setupWall(2, 1); - _northWall.setupWall(1, 3); - _wallCorner2.setupWall(2, 5); - _eastWall.setupWall(2, 6); - break; - case 4: - R2_GLOBALS._walkRegions.load(1563); - _walkRegionsId = 1563; - _northWall.setupWall(2, 3); - break; - case 5: - R2_GLOBALS._walkRegions.load(1564); - _walkRegionsId = 1564; - _southWall.setupWall(2, 4); - break; - case 6: - R2_GLOBALS._walkRegions.load(1565); - _walkRegionsId = 1565; - _wallCorner1.setupWall(1, 1); - _westWall.setupWall(1, 2); - _northWall.setupWall(3, 3); - break; - case 7: - R2_GLOBALS._walkRegions.load(1566); - _walkRegionsId = 1566; - _wallCorner1.setupWall(1, 1); - _westWall.setupWall(1, 2); - _northWall.setupWall(2, 4); - break; - case 8: - R2_GLOBALS._walkRegions.load(1567); - _walkRegionsId = 1567; - _westWall.setupWall(5, 2); - break; - case 9: - R2_GLOBALS._walkRegions.load(1568); - _walkRegionsId = 1568; - _westWall.setupWall(4, 2); - break; - case 10: - R2_GLOBALS._walkRegions.load(1569); - _walkRegionsId = 1569; - _wallCorner1.setupWall(3, 1); - break; - case 11: - R2_GLOBALS._walkRegions.load(1570); - _walkRegionsId = 1570; - _wallCorner1.setupWall(1, 1); - _westWall.setupWall(1, 2); - break; - case 12: - R2_GLOBALS._walkRegions.load(1571); - _walkRegionsId = 1571; - _wallCorner2.setupWall(1, 5); - _eastWall.setupWall(1, 6); - break; - case 13: - R2_GLOBALS._walkRegions.load(1572); - _walkRegionsId = 1572; - _wallCorner1.setupWall(1, 1); - _westWall.setupWall(1, 2); - _southWall.setupWall(1, 4); - break; - case 14: - R2_GLOBALS._walkRegions.load(1573); - _walkRegionsId = 1573; - _southWall.setupWall(1, 4); - _wallCorner2.setupWall(1, 5); - _eastWall.setupWall(1, 6); - break; - case 15: - // South wall - R2_GLOBALS._walkRegions.load(1574); - _walkRegionsId = 1574; - _southWall.setupWall(1, 4); - break; - case 16: - R2_GLOBALS._walkRegions.load(1570); - _walkRegionsId = 1570; - _wallCorner1.setupWall(2, 1); - _westWall.setupWall(2, 2); - break; - case 17: - R2_GLOBALS._walkRegions.load(1570); - _walkRegionsId = 1570; - _wallCorner1.setupWall(2, 1); - _westWall.setupWall(3, 2); - break; - case 18: - R2_GLOBALS._walkRegions.load(1571); - _walkRegionsId = 1571; - _wallCorner2.setupWall(2, 5); - _eastWall.setupWall(2, 6); - break; - case 19: - R2_GLOBALS._walkRegions.load(1571); - _walkRegionsId = 1571; - _wallCorner2.setupWall(2, 5); - _eastWall.setupWall(3, 6); - break; - default: - break; - } - - int di = 0; - int tmpIdx = 0; - for (int i = 0; i < 127 * 4; i += 4) { - if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == R2_GLOBALS._scene1550JunkLocations[i]) && - (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == R2_GLOBALS._scene1550JunkLocations[i + 1]) && - (R2_GLOBALS._scene1550JunkLocations[i + 2] != 0)) { - tmpIdx = R2_GLOBALS._scene1550JunkLocations[i + 3]; - _junk[di].postInit(); - _junk[di]._effect = EFFECT_SHADED2; - _junk[di]._shade = 0; - //_junk[di]._junkState = tmpIdx; - _junk[di]._junkNumber = i; - _junk[di].setDetails(1550, 62, -1, 63, 2, (SceneItem *) NULL); - if (R2_GLOBALS._scene1550JunkLocations[i + 2] == 41) { - _junk[di].changeZoom(-1); - _junk[di].setPosition(Common::Point(150, 70)); - _junk[di].setup(1562, 1, 1); - - R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[2]); - R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[3]); - R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[6]); - R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[7]); - - if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) == 1550) { - _joystick.postInit(); - _joystick.setup(1562, 3, 1); - _joystick.setPosition(Common::Point(150, 70)); - _joystick.fixPriority(10); - _joystick.setDetails(1550, 41, -1, 42, 2, (SceneItem *) NULL); - } - } else { - if (R2_GLOBALS._scene1550JunkLocations[i + 2] > 40) { - _junk[di].changeZoom(100); - _junk[di].setup(1561, 1, R2_GLOBALS._scene1550JunkLocations[i + 2] - 40); - } else { - _junk[di].changeZoom(-1); - _junk[di].setup(1552, ((R2_GLOBALS._scene1550JunkLocations[i + 2] - 1) / 5) + 1, ((R2_GLOBALS._scene1550JunkLocations[i + 2] - 1) % 5) + 1); - } - _junk[di].setPosition(Common::Point(scene1550JunkX[tmpIdx], scene1550JunkY[tmpIdx])); - if (scene1550JunkRegions[tmpIdx] != 0) - R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[tmpIdx]); - di++; - } - } - } - - // Loop for detecting and setting up certain special areas within the map - for (int i = 0; i < 15 * 3; i += 3) { - if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == scene1550SpecialAreas[i]) - && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == scene1550SpecialAreas[i + 1])) { - int areaType = scene1550SpecialAreas[i + 2]; - switch (areaType) { - case 1: - if (!R2_GLOBALS.getFlag(16)) { - _wreckage2.postInit(); - if (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 3) - _wreckage2.setup(1555, 2, 1); - else - _wreckage2.setup(1555, 1, 1); - _wreckage2.setPosition(Common::Point(150, 100)); - _wreckage2.fixPriority(92); - _wreckage2.setDetails(1550, 73, -1, -1, 2, (SceneItem *) NULL); - } - break; - case 2: - _dish.postInit(); - if (R2_GLOBALS.getFlag(19)) - _dish.setup(1556, 3, 5); - else - _dish.setup(1556, 3, 1); - _dish.changeZoom(95); - _dish.setPosition(Common::Point(165, 83)); - _dish.fixPriority(168); - _dish.setDetails(1550, 17, -1, 19, 2, (SceneItem *) NULL); - - _dishTower.postInit(); - _dishTower.setup(1556, 4, 1); - _dishTower.setPosition(Common::Point(191, 123)); - _dishTower.changeZoom(95); - _dishTower.setDetails(1550, 65, -1, 66, 2, (SceneItem *) NULL); - - _dishTowerShadow.postInit(); - _dishTowerShadow._numFrames = 5; - if (R2_GLOBALS.getFlag(19)) - _dishTowerShadow.setup(1556, 8, 5); - else - _dishTowerShadow.setup(1556, 8, 1); - - _dishTowerShadow.setPosition(Common::Point(156, 151)); - _dishTowerShadow.fixPriority(10); - - _walkway.postInit(); - if (R2_GLOBALS.getFlag(20)) - _walkway.setup(1558, 3, 10); - else - _walkway.setup(1558, 3, 1); - - _walkway.setPosition(Common::Point(172, 48)); - _walkway.fixPriority(169); - R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[15]); - break; - case 3: - _wreckage.postInit(); - _wreckage.setup(1550, 1, 1); - _wreckage.setPosition(Common::Point(259, 55)); - _wreckage.fixPriority(133); - _wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL); - - _wreckage2.postInit(); - _wreckage2.setup(1550, 1, 2); - _wreckage2.setPosition(Common::Point(259, 133)); - _wreckage2.fixPriority(105); - _wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL); - if (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) == 1550) { - _gyroscope.postInit(); - _gyroscope.setup(1550, 7, 2); - _gyroscope.setPosition(Common::Point(227, 30)); - _gyroscope.fixPriority(130); - _gyroscope.setDetails(1550, 29, -1, 63, 2, (SceneItem *) NULL); - } - break; - case 4: - _wreckage.postInit(); - _wreckage.setup(1550, 1, 4); - _wreckage.setPosition(Common::Point(76, 131)); - _wreckage.fixPriority(10); - _wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL); - - _wreckage2.postInit(); - _wreckage2.setup(1550, 1, 3); - _wreckage2.setPosition(Common::Point(76, 64)); - _wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL); - if (R2_INVENTORY.getObjectScene(R2_DIAGNOSTICS_DISPLAY) == 1550) { - _diagnosticsDisplay.postInit(); - _diagnosticsDisplay.setup(1504, 4, 1); - _diagnosticsDisplay.setPosition(Common::Point(49, 35)); - _diagnosticsDisplay.animate(ANIM_MODE_2, NULL); - _diagnosticsDisplay._numFrames = 4; - _diagnosticsDisplay.fixPriority(65); - _diagnosticsDisplay.setDetails(1550, 14, 15, 63, 2, (SceneItem *) NULL); - } - if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1550) { - _airbag.postInit(); - _airbag.setup(1550, 7, 1); - _airbag.setPosition(Common::Point(45, 44)); - _airbag.fixPriority(150); - _airbag.setDetails(1550, 44, -1, 63, 2, (SceneItem *) NULL); - } - break; - case 5: - _wreckage.postInit(); - _wreckage.setup(1550, 2, 4); - _wreckage.setPosition(Common::Point(243, 131)); - _wreckage.fixPriority(10); - _wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL); - - _wreckage2.postInit(); - _wreckage2.setup(1550, 2, 3); - _wreckage2.setPosition(Common::Point(243, 64)); - _wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL); - break; - case 6: - _wreckage.postInit(); - _wreckage.setup(1550, 2, 1); - _wreckage.setPosition(Common::Point(60, 55)); - _wreckage.fixPriority(133); - _wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL); - - _wreckage2.postInit(); - _wreckage2.setup(1550, 2, 2); - _wreckage2.setPosition(Common::Point(60, 133)); - _wreckage2.fixPriority(106); - _wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL); - break; - case 7: - _wreckage.postInit(); - _wreckage.setup(1550, 3, 1); - _wreckage.setPosition(Common::Point(281, 132)); - _wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL); - break; - case 8: - _wreckage.postInit(); - _wreckage.setup(1550, 3, 2); - _wreckage.setPosition(Common::Point(57, 96)); - _wreckage.fixPriority(70); - _wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL); - - _wreckage2.postInit(); - _wreckage2.setup(1550, 3, 3); - _wreckage2.setPosition(Common::Point(145, 88)); - _wreckage2.fixPriority(55); - _wreckage2.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL); - - _wreckage3.postInit(); - _wreckage3.setup(1550, 3, 4); - _wreckage3.setPosition(Common::Point(64, 137)); - _wreckage3.fixPriority(115); - _wreckage3.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL); - - _wreckage4.postInit(); - _wreckage4.setup(1550, 5, 1); - _wreckage4.setPosition(Common::Point(60, 90)); - _wreckage4.fixPriority(45); - break; - case 9: - _wreckage.postInit(); - _wreckage.setup(1550, 4, 2); - _wreckage.setPosition(Common::Point(262, 96)); - _wreckage.fixPriority(70); - _wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL); - - _wreckage2.postInit(); - _wreckage2.setup(1550, 4, 3); - _wreckage2.setPosition(Common::Point(174, 88)); - _wreckage2.fixPriority(55); - _wreckage2.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL); - - _wreckage3.postInit(); - _wreckage3.setup(1550, 4, 4); - _wreckage3.setPosition(Common::Point(255, 137)); - _wreckage3.fixPriority(115); - _wreckage3.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL); - - _wreckage4.postInit(); - _wreckage4.setup(1550, 6, 1); - _wreckage4.setPosition(Common::Point(259, 90)); - _wreckage4.fixPriority(45); - break; - case 10: - _wreckage.postInit(); - _wreckage.setup(1550, 4, 1); - _wreckage.setPosition(Common::Point(38, 132)); - _wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL); - break; - case 12: - // Intact ship - _shipComponents[7].setupShipComponent(8); - _shipComponents[0].setupShipComponent(1); - _shipComponents[1].setupShipComponent(2); - _shipComponents[2].setupShipComponent(3); - _shipComponents[3].setupShipComponent(4); - _shipComponents[4].setupShipComponent(5); - _shipComponents[5].setupShipComponent(6); - _shipComponents[6].setupShipComponent(7); - break; - default: - break; - } - } - } - - if (R2_GLOBALS._s1550PlayerArea[R2_QUINN] == R2_GLOBALS._s1550PlayerArea[R2_SEEKER]) { - _companion.postInit(); - _companion._effect = EFFECT_SHADED2; - _companion.changeZoom(-1); - - assert((_walkRegionsId >= 1550) && (_walkRegionsId <= 2008)); - R2_GLOBALS._walkRegions.disableRegion(k5A750[_walkRegionsId - 1550]); - _companion.setPosition(Common::Point(scene1550JunkX[k5A76D[_walkRegionsId - 1550]], scene1550JunkY[k5A76D[_walkRegionsId - 1550]] + 8)); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - if (R2_GLOBALS._player._characterScene[R2_SEEKER] == 1580) { - _companion.setup(1516, 3, 17); - _companion.setPosition(Common::Point(272, 94)); - _companion.fixPriority(91); - _companion.changeZoom(100); - _companion.setDetails(1550, -1, -1, -1, 5, &_shipComponents[7]); - } else { - _companion.setup(1505, 6, 1); - _companion.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL); - } - } else { - if (R2_GLOBALS._player._characterScene[R2_QUINN] == 1580) { - _companion.setup(1516, 2, 14); - _companion.setPosition(Common::Point(276, 97)); - _companion.fixPriority(91); - _companion.changeZoom(100); - _companion.setDetails(1550, -1, -1, -1, 5, &_shipComponents[7]); - } else { - _companion.setup(1500, 6, 1); - _companion.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL); - } - } - } - R2_GLOBALS._uiElements.updateInventory(); -} - -/*-------------------------------------------------------------------------- - * Scene 1575 - Spaceport - unused ship scene - * - *--------------------------------------------------------------------------*/ - -Scene1575::Button::Button() { - _buttonId = 0; - _pressed = false; -} - -void Scene1575::Button::synchronize(Serializer &s) { - NamedHotspot::synchronize(s); - - s.syncAsSint16LE(_buttonId); - s.syncAsSint16LE(_pressed); -} - -void Scene1575::Button::process(Event &event) { - Scene1575 *scene = (Scene1575 *)R2_GLOBALS._sceneManager._scene; - bool isInBounds = _bounds.contains(event.mousePos); - CursorType cursor = R2_GLOBALS._events.getCursor(); - - if ((event.eventType == EVENT_BUTTON_DOWN && cursor == CURSOR_USE && isInBounds) || - (_pressed && _buttonId != 1 && event.eventType == EVENT_BUTTON_UP && isInBounds)) { - // Button pressed - _pressed = true; - Common::Point pos = scene->_actor1._position; - event.handled = true; - - if (!R2_GLOBALS.getFlag(18) || _buttonId <= 1 || _buttonId >= 6) { - switch (_buttonId) { - case 1: - if (R2_GLOBALS.getFlag(18)) { - scene->_actor14.hide(); - scene->_actor15.hide(); - R2_GLOBALS.clearFlag(18); - } else if ((scene->_actor12._position.x == 85) && (scene->_actor12._position.y == 123)) { - scene->_actor14.show(); - scene->_actor15.show(); - R2_GLOBALS.setFlag(18); - } else { - SceneItem::display("That's probably not a good thing, ya know!"); - } - break; - case 2: - if (scene->_field41A < 780) { - if (pos.x > 54) - pos.x -= 65; - pos.x += 2; - scene->_field41A += 2; - - for (int i = 0; i < 17; i++) - scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x + 2, scene->_arrActor[i]._position.y)); - - scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x + 2, scene->_actor13._position.y)); - scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x + 2, scene->_actor12._position.y)); - scene->_actor1.setPosition(Common::Point(pos.x, pos.y)); - scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y)); - scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y)); - } - break; - case 3: - if (scene->_field41A > 0) { - if (pos.x < -8) - pos.x += 65; - - pos.x -= 2; - scene->_field41A -= 2; - for (int i = 0; i < 17; i++) - scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x - 2, scene->_arrActor[i]._position.y)); - - scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x - 2, scene->_actor13._position.y)); - scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x - 2, scene->_actor12._position.y)); - scene->_actor1.setPosition(Common::Point(pos.x, pos.y)); - scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y)); - scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y)); - } - break; - case 4: { - if (pos.y < 176) { - ++pos.y; - for (int i = 0; i < 17; ++i) - scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x, scene->_arrActor[i]._position.y + 1)); - - scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x, scene->_actor13._position.y + 1)); - scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x, scene->_actor12._position.y + 1)); - scene->_actor1.setPosition(Common::Point(pos.x, pos.y)); - scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y)); - scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y)); - } - } - break; - case 5: { - if (pos.y > 145) { - --pos.y; - for (int i = 0; i < 17; ++i) - scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x, scene->_arrActor[i]._position.y - 1)); - - scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x, scene->_actor13._position.y - 1)); - scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x, scene->_actor12._position.y - 1)); - scene->_actor1.setPosition(Common::Point(pos.x, pos.y)); - scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y)); - scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y)); - } - } - break; - case 6: - R2_GLOBALS._sceneManager.changeScene(1550); - break; - default: - break; - } - - int j = 0; - for (int i = 0; i < 17; i++) { - if (scene->_arrActor[i]._bounds.contains(85, 116)) - j = i; - } - - if (scene->_actor13._bounds.contains(85, 116)) - j = 18; - - if (scene->_actor12._bounds.contains(85, 116)) - j = 19; - - if (j) - scene->_actor11.show(); - else - scene->_actor11.hide(); - } else { - SceneItem::display("Better not move the laser while it's firing!"); - } - } else { - _pressed = false; - } -} - -bool Scene1575::Button::startAction(CursorType action, Event &event) { - if (action == CURSOR_USE) - return false; - return SceneHotspot::startAction(action, event); -} - -void Scene1575::Button::initButton(int buttonId) { - _buttonId = buttonId; - _pressed = false; - EventHandler::postInit(); - - switch (_buttonId) { - case 1: - setDetails(Rect(53, 165, 117, 190), -1, -1, -1, 2, 1, NULL); - break; - case 2: - setDetails(Rect(151, 142, 189, 161), -1, -1, -1, 2, 1, NULL); - break; - case 3: - setDetails(Rect(225, 142, 263, 161), -1, -1, -1, 2, 1, NULL); - break; - case 4: - setDetails(Rect(188, 122, 226, 140), -1, -1, -1, 2, 1, NULL); - break; - case 5: - setDetails(Rect(188, 162, 226, 180), -1, -1, -1, 2, 1, NULL); - break; - case 6: - setDetails(Rect(269, 169, 301, 185), -1, -1, -1, 2, 1, NULL); - break; - default: - break; - } -} - -/*--------------------------------------------------------------------------*/ - -Scene1575::Scene1575() { - _field412 = 0; - _field414 = 390; - _field416 = 0; - _field418 = 0; - _field41A = 0; -} - -void Scene1575::synchronize(Serializer &s) { - SceneExt::synchronize(s); - - s.syncAsSint16LE(_field412); - s.syncAsSint16LE(_field414); - s.syncAsSint16LE(_field416); - s.syncAsSint16LE(_field418); - s.syncAsSint16LE(_field41A); -} - -double hypotenuse(double v1, double v2) { - return sqrt(v1 * v1 + v2 * v2); -} - -void Scene1575::postInit(SceneObjectList *OwnerList) { - loadScene(1575); - R2_GLOBALS._uiElements._active = false; - SceneExt::postInit(); - R2_GLOBALS._interfaceY = SCREEN_HEIGHT; - - _actor1.postInit(); - _actor1.setup(1575, 1, 1); - _actor1.setPosition(Common::Point(54, 161)); - _actor1.fixPriority(5); - - _actor2.postInit(); - _actor2.setup(1575, 1, 1); - _actor2.setPosition(Common::Point(119, 161)); - _actor2.fixPriority(5); - - _actor3.postInit(); - _actor3.setup(1575, 1, 1); - _actor3.setPosition(Common::Point(184, 161)); - _actor3.fixPriority(5); - - for (int i = 0; i < 17; i++) { - _arrActor[i].postInit(); - _arrActor[i].setup(1575, 2, k5A7F6[3 * i + 2]); - - double v1 = hypotenuse(2.0, 3 - k5A7F6[3 * i]); - v1 += hypotenuse(2.0, 3 - k5A7F6[3 * i + 1]); - int yp = (int)(sqrt(v1) * 75.0 / 17.0 - 161.0); - - int angle = R2_GLOBALS._gfxManagerInstance.getAngle( - Common::Point(3, 16), Common::Point(k5A7F6[3 * i], k5A7F6[3 * i + 1])); - int xp = angle * 78 / 9 - 319; - - _arrActor[i].setPosition(Common::Point(xp, yp)); - _arrActor[i].fixPriority(6); - } - - _actor4.postInit(); - _actor4.setup(1575, 3, 1); - _actor4.setPosition(Common::Point(48, 81)); - - _actor5.postInit(); - _actor5.setup(1575, 3,1); - _actor5.setPosition(Common::Point(121, 81)); - - _actor6.postInit(); - _actor6.setup(1575, 3, 2); - _actor6.setPosition(Common::Point(203, 80)); - - _actor7.postInit(); - _actor7.setup(1575, 3, 2); - _actor7.setPosition(Common::Point(217, 80)); - - _actor8.postInit(); - _actor8.setup(1575, 3, 2); - _actor8.setPosition(Common::Point(231, 80)); - - _actor9.postInit(); - _actor9.setup(1575, 3, 2); - _actor9.setPosition(Common::Point(273, 91)); - - _actor10.postInit(); - _actor10.setup(1575, 3, 2); - _actor10.setPosition(Common::Point(287, 91)); - - // Initialize buttons - _button1.initButton(1); - _button2.initButton(2); - _button3.initButton(3); - _button4.initButton(4); - _button5.initButton(5); - _button6.initButton(6); - - _actor11.postInit(); - _actor11.setup(1575, 4, 2); - _actor11.setPosition(Common::Point(84, 116)); - _actor11.hide(); - - R2_GLOBALS._player.postInit(); - R2_GLOBALS._player.hide(); - R2_GLOBALS._player.enableControl(); - - do { - _field412 = R2_GLOBALS._randomSource.getRandomNumber(20) - 10; - _field414 = R2_GLOBALS._randomSource.getRandomNumber(20) - 10; - } while ((_field412) && (_field414)); - - if (_field412 < 0) - _actor4.hide(); - - if (_field414 < 0) - _actor5.hide(); - - _field416 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1; - _field418 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1; - - _actor13.postInit(); - _actor13.setup(1575, 2, 4); - - // TODO - warning("TODO: another immense pile of floating operations"); - - _actor12.postInit(); - _actor12.fixPriority(12); - - if (R2_GLOBALS.getFlag(17)) { - _actor13.setPosition(Common::Point(_actor13._position.x + 5, _actor13._position.y)); - _actor12.setPosition(Common::Point(_actor12._position.x + 5, _actor12._position.y)); - } - - _actor14.postInit(); - _actor14.setup(1575, 5, 1); - _actor14.setPosition(Common::Point(85, 176)); - _actor14.fixPriority(7); - _actor14.hide(); - - _actor15.postInit(); - _actor15.setup(1575, 5, 2); - _actor15.setPosition(Common::Point(85, 147)); - _actor15.fixPriority(7); - _actor15.hide(); -} - -void Scene1575::remove() { - SceneExt::remove(); - R2_GLOBALS._uiElements._active = true; -} - -void Scene1575::signal() { - R2_GLOBALS._player.enableControl(); -} - -void Scene1575::process(Event &event) { - Scene::process(event); - - g_globals->_sceneObjects->recurse(SceneHandler::dispatchObject); -} - -void Scene1575::dispatch() { - if (_field412 <= 0) { - ++_field412; - if (_field412 == 0) { - _actor4.show(); - _field412 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1; - } - } else { - _field412--; - if (_field412 ==0) { - _actor4.hide(); - _field412 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1; - } - } - - if (_field414 <= 0) { - ++_field414; - if (_field414 == 0) { - _actor5.show(); - _field414 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1; - } - } else { - _field414--; - if (_field414 == 0) { - _actor5.hide(); - _field414 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1; - } - } - - if (_field416 == 0) { - switch(R2_GLOBALS._randomSource.getRandomNumber(3)) { - case 0: - _actor6.hide(); - _actor7.hide(); - _actor8.hide(); - break; - case 1: - _actor6.show(); - _actor7.hide(); - _actor8.hide(); - break; - case 2: - _actor6.show(); - _actor7.show(); - _actor8.hide(); - break; - case 3: - _actor6.show(); - _actor7.show(); - _actor8.show(); - break; - default: - break; - } - _field416 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1; - } else { - --_field416; - } - - if (_field418 == 0) { - switch(R2_GLOBALS._randomSource.getRandomNumber(2)) { - case 0: - _actor9.hide(); - _actor10.hide(); - break; - case 1: - _actor9.show(); - _actor10.hide(); - break; - case 2: - _actor9.show(); - _actor10.show(); - break; - default: - break; + _wreckage2.remove(); + R2_INVENTORY.setObjectScene(R2_FUEL_CELL, 0); + R2_GLOBALS._player.enableControl(); + break; + case 1575: + // No break on purpose + case 1583: + _dontExit = false; + _wreckage2.remove(); + R2_INVENTORY.setObjectScene(R2_BATTERY, 0); + R2_GLOBALS._player.enableControl(); + break; + case 1576: + // No break on purpose + case 1584: + R2_GLOBALS._sceneManager.changeScene(1580); + R2_GLOBALS._player.enableControl(); + break; + case 1577: + // No break on purpose + case 1578: + _sceneMode = 0; + _wreckage2.remove(); + _dontExit = false; + R2_GLOBALS._player.fixPriority(-1); + R2_GLOBALS._player.enableControl(); + break; + case 1585: + SceneItem::display(1550, 66, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + R2_GLOBALS._player.enableControl(); + break; + case 1586: + // No break on purpose + case 1587: + R2_INVENTORY.setObjectScene(R2_DIAGNOSTICS_DISPLAY, R2_GLOBALS._player._characterIndex); + _diagnosticsDisplay.remove(); + _dontExit = false; + R2_GLOBALS._player.enableControl(); + break; + case 1592: + _joystick.remove(); + R2_INVENTORY.setObjectScene(R2_JOYSTICK, 1); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + R2_GLOBALS._s1550PlayerArea[R2_SEEKER] = R2_GLOBALS._s1550PlayerArea[R2_QUINN]; + } else { + R2_GLOBALS._s1550PlayerArea[R2_QUINN] = R2_GLOBALS._s1550PlayerArea[R2_SEEKER]; } - _field418 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1; - } else { - _field418--; - } - Scene::dispatch(); -} - -/*-------------------------------------------------------------------------- - * Scene 1580 - Inside wreck - * - *--------------------------------------------------------------------------*/ - -Scene1580::Scene1580() { -} - -void Scene1580::synchronize(Serializer &s) { - SceneExt::synchronize(s); -} - -bool Scene1580::JoystickPlug::startAction(CursorType action, Event &event) { - if (action == R2_JOYSTICK) { - Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene; - - R2_INVENTORY.setObjectScene(R2_JOYSTICK, 1580); - R2_GLOBALS._sceneItems.remove(&scene->_joystickPlug); - scene->_joystick.postInit(); - scene->_joystick.setup(1580, 1, 4); - scene->_joystick.setPosition(Common::Point(159, 163)); - scene->_joystick.setDetails(1550, 78, -1, -1, 2, (SceneItem *) NULL); - - scene->_arrActor[5].remove(); - - return true; + R2_GLOBALS._player.enableControl(CURSOR_WALK); + break; + default: + _sceneMode = 62; + setAction(&_sequenceManager1, this, 1, &R2_GLOBALS._player, NULL); + break; } - - return SceneHotspot::startAction(action, event); } -bool Scene1580::ScreenSlot::startAction(CursorType action, Event &event) { - if (action == R2_DIAGNOSTICS_DISPLAY) { - Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene; - - R2_INVENTORY.setObjectScene(R2_DIAGNOSTICS_DISPLAY, 1580); - R2_GLOBALS._player.disableControl(); - R2_GLOBALS._sceneItems.remove(&scene->_screenSlot); - - scene->_screen.postInit(); - scene->_screen.setup(1580, 1, 1); - scene->_screen.setPosition(Common::Point(124, 108)); - scene->_screen.fixPriority(10); - - if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) == 1580) - scene->_screen.setDetails(1550, 14, -1, -1, 5, &scene->_joystick); +void Scene1550::process(Event &event) { + if ((!R2_GLOBALS._player._canWalk) && (R2_GLOBALS._events.getCursor() == R2_NEGATOR_GUN) && (event.eventType == EVENT_BUTTON_DOWN) && (this->_screenNumber == 1234)) { + int curReg = R2_GLOBALS._sceneRegions.indexOf(event.mousePos); + if (curReg == 0) + _dontExit = true; + else if (((R2_GLOBALS._player._position.y < 90) && (event.mousePos.y > 90)) || ((R2_GLOBALS._player._position.y > 90) && (event.mousePos.y < 90))) + _dontExit = true; else - scene->_screen.setDetails(1550, 14, -1, -1, 2, (SceneItem *)NULL); - - scene->_screenDisplay.postInit(); - scene->_screenDisplay.setup(1580, 3, 1); - scene->_screenDisplay.setPosition(Common::Point(124, 109)); - scene->_screenDisplay.fixPriority(20); - //scene->_field412 = 1; - scene->_sceneMode = 10; - scene->setAction(&scene->_sequenceManager, scene, 1, &R2_GLOBALS._player, NULL); + _dontExit = false; - return true; + if ((curReg == 13) || (curReg == 14)) + _dontExit = false; } - return SceneHotspot::startAction(action, event); + Scene::process(event); } -bool Scene1580::Joystick::startAction(CursorType action, Event &event) { - if ( (action == CURSOR_USE) && (R2_INVENTORY.getObjectScene(R2_DIAGNOSTICS_DISPLAY) == 1580) - && (R2_INVENTORY.getObjectScene(R2_FUEL_CELL) == 0) && (R2_INVENTORY.getObjectScene(R2_GUIDANCE_MODULE) == 0) - && (R2_INVENTORY.getObjectScene(R2_RADAR_MECHANISM) == 0) && (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) == 0) - && (R2_INVENTORY.getObjectScene(R2_THRUSTER_VALVE) == 0) && (R2_INVENTORY.getObjectScene(R2_IGNITOR) == 0)) { - Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene; - scene->_sceneMode = 31; - R2_GLOBALS._player.disableControl(); - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - scene->_stripManager.start(536, scene); - else - scene->_stripManager.start(537, scene); - - return true; - } +void Scene1550::dispatch() { + Scene::dispatch(); - return SceneActor::startAction(action, event); -} + // Arrays related to this scene are all hacky in the origina: they are based on the impossibility to use Miranda + assert ((R2_GLOBALS._player._characterIndex == R2_QUINN) || (R2_GLOBALS._player._characterIndex == R2_SEEKER)); -bool Scene1580::Screen::startAction(CursorType action, Event &event) { - if ((action == CURSOR_USE) && (R2_INVENTORY.getObjectScene(R2_BROKEN_DISPLAY) == 1580)) { - Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene; + if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 15) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 16)) { + R2_GLOBALS._player._shade = 0; - R2_INVENTORY.setObjectScene(R2_BROKEN_DISPLAY, R2_GLOBALS._player._characterIndex); - scene->_screenSlot.setDetails(Rect(69, 29, 177, 108), 1550, 82, -1, -1, 2, NULL); - scene->_screenDisplay.remove(); - remove(); - return true; + // NOTE: Original game contains a switch based on an uninitialized variable. + // We're leaving this code here, but ifdef'ed out, in case we can ever figure out + // what the original programmers intended the value to come from +#if 0 + int missingVariable = 0; + switch (missingVariable) { + case 144: + // No break on purpose + case 146: + _dish._frame = 5; + R2_GLOBALS._player._shade = 3; + break; + case 148: + // No break on purpose + case 149: + _dish._frame = 1; + // No break on purpose + case 147: + // No break on purpose + case 150: + R2_GLOBALS._player._shade = 3; + break; + default: + break; + } +#endif } - return SceneActor::startAction(action, event); -} - -bool Scene1580::StorageCompartment::startAction(CursorType action, Event &event) { - if (action != CURSOR_USE) - return SceneActor::startAction(action, event); - - Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene; - - R2_GLOBALS._player.disableControl(); - R2_GLOBALS._sceneItems.remove(&scene->_storageCompartment); - scene->_sceneMode = 0; - animate(ANIM_MODE_5, scene); - - return true; -} - -bool Scene1580::HatchButton::startAction(CursorType action, Event &event) { - if (action != CURSOR_USE) - return SceneActor::startAction(action, event); - - Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene; - - R2_GLOBALS._player.disableControl(); - setFrame(2); - scene->_sceneMode = 20; - scene->setAction(&scene->_sequenceManager, scene, 2, &R2_GLOBALS._player, NULL); + if (_dontExit) + return; - return true; -} + switch (R2_GLOBALS._player.getRegionIndex() - 11) { + case 0: + // No break on purpose + case 5: + // Exiting the top of the screen + R2_GLOBALS._player.disableControl(); + _sceneMode = 1; + _dontExit = true; + --R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y; -bool Scene1580::ThrusterValve::startAction(CursorType action, Event &event) { - Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene; + enterArea(); - switch (action) { - case CURSOR_USE: - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - R2_INVENTORY.setObjectScene(R2_THRUSTER_VALVE, 1); - remove(); - return true; - } - break; - case R2_COM_SCANNER: - scene->_sceneMode = 30; - R2_GLOBALS._player.disableControl(); - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - scene->_stripManager.start(529, scene); - return true; - break; - case R2_COM_SCANNER_2: - scene->_sceneMode = 30; - R2_GLOBALS._player.disableControl(); - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - scene->_stripManager.start(527, scene); - return true; - break; - default: + R2_GLOBALS._player.setPosition(Common::Point( 160 - (((((160 - R2_GLOBALS._player._position.x) * 100) / 108) * 172) / 100), 145)); + if (R2_GLOBALS._player._position.x < 160) { + Common::Point pt(R2_GLOBALS._player._position.x + 5, 135); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } else if (R2_GLOBALS._player._position.x <= 160) { // the check is really in the original... + Common::Point pt(R2_GLOBALS._player._position.x, 135); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } else { + Common::Point pt(R2_GLOBALS._player._position.x - 5, 135); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } break; - } - - return SceneActor::startAction(action, event); -} + case 1: + // Exiting the bottom of the screen + R2_GLOBALS._player.disableControl(); + _sceneMode = 3; + _dontExit = true; + ++R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y; -bool Scene1580::Ignitor::startAction(CursorType action, Event &event) { - Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene; + enterArea(); - switch (action) { - case CURSOR_USE: - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - R2_INVENTORY.setObjectScene(R2_IGNITOR, 1); - remove(); - return true; + R2_GLOBALS._player.setPosition(Common::Point( 160 - (((((160 - R2_GLOBALS._player._position.x) * 100) / 172) * 108) / 100), 19)); + if (R2_GLOBALS._player._position.x < 160) { + Common::Point pt(R2_GLOBALS._player._position.x + 5, 29); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } else if (R2_GLOBALS._player._position.x <= 160) { // the check is really in the original... + Common::Point pt(R2_GLOBALS._player._position.x, 29); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } else { + Common::Point pt(R2_GLOBALS._player._position.x - 5, 29); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); } break; - case R2_COM_SCANNER: - scene->_sceneMode = 30; + case 2: + // Exiting the right of the screen R2_GLOBALS._player.disableControl(); - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - scene->_stripManager.start(529, scene); - return true; + _sceneMode = 5; + _dontExit = true; + ++R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x; + + enterArea(); + + if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11) && (R2_GLOBALS._player._position.y > 50) && (R2_GLOBALS._player._position.y < 135)) { + if (R2_GLOBALS._player._position.y >= 85) { + R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y + 10)); + Common::Point pt(R2_GLOBALS._player._position.x + 30, R2_GLOBALS._player._position.y + 20); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } else { + R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y - 10)); + Common::Point pt(R2_GLOBALS._player._position.x + 30, R2_GLOBALS._player._position.y - 20); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } + } else { + R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y)); + Common::Point pt(R2_GLOBALS._player._position.x + 10, R2_GLOBALS._player._position.y); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } break; - case R2_COM_SCANNER_2: - scene->_sceneMode = 30; + case 3: + // Exiting to the left of the screen R2_GLOBALS._player.disableControl(); - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - scene->_stripManager.start(527, scene); - return true; + _sceneMode = 7; + _dontExit = true; + --R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x; + + enterArea(); + + if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 24) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11)) { + R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y / 2)); + Common::Point pt(265, 29); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } else if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11) && (R2_GLOBALS._player._position.y > 50) && (R2_GLOBALS._player._position.y < 135)) { + if (R2_GLOBALS._player._position.y >= 85) { + R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y + 10)); + Common::Point pt(R2_GLOBALS._player._position.x - 30, R2_GLOBALS._player._position.y + 20); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } else { + R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y - 10)); + Common::Point pt(R2_GLOBALS._player._position.x - 30, R2_GLOBALS._player._position.y - 20); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } + } else { + R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y)); + Common::Point pt(R2_GLOBALS._player._position.x - 10, R2_GLOBALS._player._position.y); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } break; default: break; } - - return SceneActor::startAction(action, event); } -void Scene1580::postInit(SceneObjectList *OwnerList) { - loadScene(1580); - R2_GLOBALS._sceneManager._fadeMode = FADEMODE_GRADUAL; - SceneExt::postInit(); - - _stripManager.setColors(60, 255); - _stripManager.setFontNumber(3); - _stripManager.addSpeaker(&_quinnSpeaker); - _stripManager.addSpeaker(&_seekerSpeaker); - - _sceneMode = 0; - - R2_GLOBALS._player.disableControl(); - if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) == 1580) { - _joystick.postInit(); - _joystick.setup(1580, 1, 4); - _joystick.setPosition(Common::Point(159, 163)); - _joystick.setDetails(1550, 78, -1, -1, 1, (SceneItem *) NULL); - } else { - _joystickPlug.setDetails(Rect(141, 148, 179, 167), 1550, 79, -1, -1, 1, NULL); - } - - if (R2_INVENTORY.getObjectScene(R2_BROKEN_DISPLAY) == 1580) { - _screen.postInit(); - _screen.setup(1580, 1, 1); - _screen.setPosition(Common::Point(124, 108)); - _screen.fixPriority(10); - _screen.setDetails(1550, 13, -1, -1, 1, (SceneItem *) NULL); - - _screenDisplay.postInit(); - _screenDisplay.setup(1580, 1, 3); - _screenDisplay.setPosition(Common::Point(124, 96)); - _screenDisplay.fixPriority(20); - } else if (R2_INVENTORY.getObjectScene(R2_DIAGNOSTICS_DISPLAY) == 1580) { - _screen.postInit(); - _screen.setup(1580, 1, 1); - _screen.setPosition(Common::Point(124, 108)); - _screen.fixPriority(10); - _screen.setDetails(1550, 14, -1, -1, 1, (SceneItem *) NULL); - - _screenDisplay.postInit(); - _screenDisplay.setup(1580, 3, 1); - _screenDisplay.setPosition(Common::Point(124, 109)); - _screenDisplay.fixPriority(20); - - _sceneMode = 10; - } else { - _screenSlot.setDetails(Rect(69, 29, 177, 108), 1550, 82, -1, -1, 1, NULL); - } - - _storageCompartment.postInit(); - if (R2_GLOBALS.getFlag(58) == 0) { - _storageCompartment.setup(1580, 5, 1); - _storageCompartment.setDetails(1550, 80, -1, -1, 1, (SceneItem *) NULL); - } else { - _storageCompartment.setup(1580, 5, 6); - } - - _storageCompartment.setPosition(Common::Point(216, 108)); - _storageCompartment.fixPriority(100); - - _hatchButton.postInit(); - _hatchButton.setup(1580, 4, 1); - _hatchButton.setPosition(Common::Point(291, 147)); - _hatchButton.fixPriority(100); - _hatchButton.setDetails(1550, 81, -1, -1, 1, (SceneItem *) NULL); - - if (R2_INVENTORY.getObjectScene(R2_THRUSTER_VALVE) == 1580) { - _thrusterValve.postInit(); - _thrusterValve.setup(1580, 6, 2); - _thrusterValve.setPosition(Common::Point(222, 108)); - _thrusterValve.fixPriority(50); - _thrusterValve.setDetails(1550, 32, -1, 34, 1, (SceneItem *) NULL); - } - - if (R2_INVENTORY.getObjectScene(R2_IGNITOR) == 1580) { - _ignitor.postInit(); - _ignitor.setup(1580, 6, 1); - _ignitor.setPosition(Common::Point(195, 108)); - _ignitor.fixPriority(50); - _ignitor.setDetails(1550, 38, -1, 34, 1, (SceneItem *) NULL); - } +void Scene1550::saveCharacter(int characterIndex) { + if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) + R2_GLOBALS._sound1.fadeOut2(NULL); - R2_GLOBALS._player.postInit(); - R2_GLOBALS._player.hide(); - setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); - _background.setDetails(Rect(0, 0, 320, 200), 1550, 50, -1, -1, 1, NULL); + SceneExt::saveCharacter(characterIndex); } -void Scene1580::signal() { - switch (_sceneMode++) { - case 10: - _screenDisplay.animate(ANIM_MODE_5, this); - break; - case 11: - _screenDisplay.setup(1580, 1, 2); - _screenDisplay.setPosition(Common::Point(124, 94)); +void Scene1550::Wall::setupWall(int frameNumber, int strip) { + Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene; - if (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) != 0) { - _arrActor[0].postInit(); - _arrActor[0].setup(1580, 2, 1); - _arrActor[0].setPosition(Common::Point(138, 56)); + postInit(); + if (scene->_wallType == 2) + setup(1551, strip, frameNumber); + else + setup(1554, strip, frameNumber); + + switch (strip) { + case 0: + switch (frameNumber - 1) { + case 0: + setup(1551, 1, 1); + setPosition(Common::Point(30, 67)); + break; + case 1: + setup(1560, 1, 5); + setPosition(Common::Point(141, 54)); + break; + case 2: + setup(1560, 2, 5); + setPosition(Common::Point(178, 54)); + break; + case 3: + setup(1560, 2, 1); + setPosition(Common::Point(289, 67)); + break; + case 4: + setup(1560, 2, 2); + setPosition(Common::Point(298, 132)); + break; + case 5: + setup(1560, 1, 2); + setPosition(Common::Point(21, 132)); + break; + case 6: + setup(1560, 2, 4); + setPosition(Common::Point(285, 123)); + break; + case 7: + setup(1560, 1, 3); + setPosition(Common::Point(30, 111)); + break; + case 8: + setup(1560, 2, 3); + setPosition(Common::Point(289, 111)); + break; + case 9: + setup(1560, 1, 4); + setPosition(Common::Point(34, 123)); + break; + default: + break; } - - if (R2_INVENTORY.getObjectScene(R2_RADAR_MECHANISM) != 0) { - _arrActor[1].postInit(); - _arrActor[1].setup(1580, 2, 2); - _arrActor[1].setPosition(Common::Point(140, 66)); + fixPriority(1); + break; + case 1: + if (frameNumber == 3) { + setup(1553, 3, 1); + setPosition(Common::Point(48, 44)); + fixPriority(2); + } else { + fixPriority(1); + setPosition(Common::Point(32, 17)); } - if (R2_INVENTORY.getObjectScene(R2_IGNITOR) != 0) { - _arrActor[2].postInit(); - _arrActor[2].setup(1580, 2, 3); - _arrActor[2].setPosition(Common::Point(142, 85)); + switch (frameNumber) { + case 2: + setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL); + break; + case 3: + setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL); + break; + default: + setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL); + break; } - - if (R2_INVENTORY.getObjectScene(R2_THRUSTER_VALVE) != 0) { - _arrActor[3].postInit(); - _arrActor[3].setup(1580, 2, 4); - _arrActor[3].setPosition(Common::Point(142, 92)); + break; + case 2: + fixPriority(1); + switch (frameNumber) { + case 4: + setup(1553, 4, 1); + setPosition(Common::Point(48, 168)); + break; + case 5: + setup(1553, 3, 2); + setPosition(Common::Point(20, 168)); + fixPriority(250); + break; + default: + setPosition(Common::Point(28, 116)); + break; } - if (R2_INVENTORY.getObjectScene(R2_GUIDANCE_MODULE) != 0) { - _arrActor[4].postInit(); - _arrActor[4].setup(1580, 2, 5); - _arrActor[4].setPosition(Common::Point(108, 54)); + switch (frameNumber) { + case 2: + setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL); + break; + case 4: + setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL); + break; + case 5: + setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL); + break; + default: + setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL); + break; } - - if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) != 1580) { - _arrActor[5].postInit(); - _arrActor[5].setup(1580, 2, 6); - _arrActor[5].setPosition(Common::Point(110, 64)); + break; + case 3: + switch (frameNumber) { + case 2: + fixPriority(2); + if (scene->_wallType == 2) + setup(1553, 2, 1); + else + setup(1556, 2, 1); + setPosition(Common::Point(160, 44)); + break; + case 3: + fixPriority(2); + setup(1553, 5, 1); + setPosition(Common::Point(178, 44)); + break; + default: + fixPriority(1); + setPosition(Common::Point(160, 17)); + break; } - if (R2_INVENTORY.getObjectScene(R2_BATTERY) != 0) { - _arrActor[6].postInit(); - _arrActor[6].setup(1580, 2, 7); - _arrActor[6].setPosition(Common::Point(108, 80)); + if (frameNumber == 1) + setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL); + else + setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL); + break; + case 4: + if (frameNumber == 2) { + fixPriority(250); + if (scene->_wallType == 2) + setup(1553, 1, 1); + else + setup(1556, 1, 1); + } else { + fixPriority(2); } - if (R2_INVENTORY.getObjectScene(R2_FUEL_CELL) != 0) { - _arrActor[7].postInit(); - _arrActor[7].setup(1580, 2, 8); - _arrActor[7].setPosition(Common::Point(111, 92)); - } + if (frameNumber != 1) + setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL); - R2_GLOBALS._player.enableControl(CURSOR_USE); - R2_GLOBALS._player._canWalk = false; + setPosition(Common::Point(160, 168)); break; - case 20: - R2_GLOBALS._sceneManager.changeScene(1550); + case 5: + fixPriority(1); + setPosition(Common::Point(287, 17)); + + switch (frameNumber) { + case 2: + setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL); + break; + case 3: + setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL); + break; + default: + setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL); + break; + } break; - case 31: - R2_GLOBALS._sceneManager.changeScene(1530); + case 6: + fixPriority(1); + setPosition(Common::Point(291, 116)); + + if (frameNumber == 2) + setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL); + else + setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL); break; default: - R2_GLOBALS._player.enableControl(CURSOR_USE); - R2_GLOBALS._player._canWalk = false; break; } -} - -/*-------------------------------------------------------------------------- - * Scene 1625 - Miranda being questioned - * - *--------------------------------------------------------------------------*/ - -bool Scene1625::Wire::startAction(CursorType action, Event &event) { - if (action != CURSOR_USE) - return SceneActor::startAction(action, event); - - Scene1625 *scene = (Scene1625 *)R2_GLOBALS._sceneManager._scene; - R2_GLOBALS._player.disableControl(); - - scene->_sceneMode = 1631; - scene->_mirandaMouth.postInit(); - scene->setAction(&scene->_sequenceManager, scene, 1631, &scene->_mirandaMouth, &scene->_wire, NULL); - return true; -} - -Scene1625::Scene1625() { -} -void Scene1625::synchronize(Serializer &s) { - SceneExt::synchronize(s); } -void Scene1625::postInit(SceneObjectList *OwnerList) { - loadScene(1625); - R2_GLOBALS._player._characterIndex = R2_MIRANDA; - SceneExt::postInit(); - - _stripManager.addSpeaker(&_mirandaSpeaker); - _stripManager.addSpeaker(&_tealSpeaker); - _stripManager.addSpeaker(&_soldierSpeaker); - - R2_GLOBALS._player.postInit(); - R2_GLOBALS._player.hide(); - - _wire.postInit(); - _wire.setup(1626, 2, 1); - _wire.setPosition(Common::Point(206, 133)); - _wire.setDetails(1625, 0, -1, -1, 1, (SceneItem *) NULL); - - _wristRestraints.postInit(); - _wristRestraints.setup(1625, 8, 1); - _wristRestraints.setPosition(Common::Point(190, 131)); - _wristRestraints.setDetails(1625, 6, -1, 2, 1, (SceneItem *) NULL); +void Scene1550::enterArea() { + _walkRegionsId = 0; + _dishMode = 0; - if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 1625) { - if (!R2_GLOBALS.getFlag(83)) { - _glass.postInit(); - _glass.setup(1626, 4, 1); - _glass.setPosition(Common::Point(96, 166)); - _glass.setDetails(1625, -1, -1, -1, 1, (SceneItem *) NULL); - } - R2_GLOBALS._player.enableControl(); - R2_GLOBALS._player._canWalk = false; - } else { - _teal.postInit(); - _teal.fixPriority(10); + _wallCorner1.remove(); + _westWall.remove(); + _northWall.remove(); + _southWall.remove(); + _wallCorner2.remove(); + _eastWall.remove(); - _tealRightArm.postInit(); + for (int i = 0; i < 8; ++i) + _junk[i].remove(); - R2_GLOBALS._player.disableControl(); - _sceneMode = 1625; - setAction(&_sequenceManager, this, 1625, &_teal, &_tealRightArm, NULL); - } + _wreckage.remove(); - R2_GLOBALS._sound1.play(245); - _background.setDetails(Rect(0, 0, 320, 200), 1625, 12, -1, -1, 1, NULL); - R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 1625; - R2_GLOBALS._player._characterScene[R2_MIRANDA] = 1625; -} + for (int i = 0; i < 8; ++i) + _shipComponents[i].remove(); -void Scene1625::remove() { - R2_GLOBALS._sound1.fadeOut2(NULL); - SceneExt::remove(); -} + _airbag.remove(); + _joystick.remove(); + _gyroscope.remove(); + _wreckage4.remove(); + _diagnosticsDisplay.remove(); -void Scene1625::signal() { - switch (_sceneMode) { - case 10: - R2_GLOBALS._player.disableControl(); - _glass.postInit(); - _glass.setDetails(1625, -1, -1, -1, 2, (SceneItem *) NULL); - _sceneMode = 1626; - setAction(&_sequenceManager, this, 1626, &_tealHead, &_glass, NULL); - break; - case 12: - MessageDialog::show(DONE_MSG, OK_BTN_STRING); + if ((_sceneMode != 1577) && (_sceneMode != 1578)) + _wreckage2.remove(); + + _wreckage3.remove(); + _companion.remove(); + _dish.remove(); + _dishTowerShadow.remove(); + _dishTower.remove(); + _walkway.remove(); + + // Set up of special walk regions for certain areas + switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y) { + case 0: + switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) { + case 3: + R2_GLOBALS._walkRegions.load(1554); + _walkRegionsId = 1554; + break; + case 4: + R2_GLOBALS._walkRegions.load(1553); + _walkRegionsId = 1553; + break; + default: + break; + } break; - case 14: - _tealHead.postInit(); - _tealHead.setup(1627, 1, 1); - _tealHead.setPosition(Common::Point(68, 68)); - _sceneMode = 99; - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - _stripManager.start(831, this); + case 3: + // No break on purpose + case 4: + if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 23) || (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x)) { + if (!R2_GLOBALS.getFlag(16)) { + R2_GLOBALS._walkRegions.load(1559); + _walkRegionsId = 1559; + } + } break; - case 99: - R2_GLOBALS._player.disableControl(); - switch (_stripManager._exitMode) { - case 1: - _sceneMode = 1627; - setAction(&_sequenceManager, this, 1627, &_mirandaMouth, &_glass, NULL); - break; - case 2: - _sceneMode = 1629; - setAction(&_sequenceManager, this, 1629, &_tealHead, &_wristRestraints, NULL); + case 7: + switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) { + case 10: + R2_GLOBALS._walkRegions.load(1555); + _walkRegionsId = 1555; break; - case 4: - R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3150; - R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3150; - R2_GLOBALS._player._characterIndex = R2_QUINN; - R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._player._characterScene[R2_QUINN]); + case 11: + R2_GLOBALS._walkRegions.load(1556); + _walkRegionsId = 1556; break; - case 5: - _sceneMode = 1628; - _tealHead.remove(); - setAction(&_sequenceManager, this, 1628, &_mirandaMouth, &_glass, NULL); + default: break; - case 6: - _glass.postInit(); - _glass.setDetails(1625, -1, -1, -1, 2, (SceneItem *) NULL); - _sceneMode = 1632; - setAction(&_sequenceManager, this, 1632, &_glass, NULL); + } + break; + case 11: + switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) { + case 24: + R2_GLOBALS._walkRegions.load(1558); + _walkRegionsId = 1558; break; - case 7: - _sceneMode = 1633; - setAction(&_sequenceManager, this, 1633, &_glass, NULL); + case 25: + R2_GLOBALS._walkRegions.load(1557); + _walkRegionsId = 1557; break; - case 8: - _sceneMode = 1635; - setAction(&_sequenceManager, this, 1635, &_mirandaMouth, &_wristRestraints, NULL); + default: break; - case 9: - _glass.postInit(); - _glass.setDetails(1625, -1, -1, -1, 2, (SceneItem *) NULL); - _sceneMode = 1634; - setAction(&_sequenceManager, this, 1634, &_mirandaMouth, &_wristRestraints, NULL); + } + break; + case 16: + switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) { + case 2: + R2_GLOBALS._walkRegions.load(1552); + _walkRegionsId = 1552; break; case 3: - // No break on purpose + R2_GLOBALS._walkRegions.load(1551); + _walkRegionsId = 1551; + break; + case 15: + R2_GLOBALS._walkRegions.load(1575); + _walkRegionsId = 1575; default: - _sceneMode = 1630; - _tealHead.remove(); - setAction(&_sequenceManager, this, 1630, &_teal, &_tealRightArm, NULL); break; } - //_field412 = _stripManager._field2E8; - _stripManager._currObj44Id = 0; - break; - case 1625: - _tealHead.postInit(); - _tealHead.setup(1627, 1, 1); - _tealHead.setPosition(Common::Point(68, 68)); - _sceneMode = 10; - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - _stripManager.start(800, this); break; - case 1626: - _tealHead.setup(1627, 1, 1); - _tealHead.setPosition(Common::Point(68, 68)); - _tealHead.show(); - - _mirandaMouth.postInit(); - _mirandaMouth.setup(1627, 3, 1); - _mirandaMouth.setPosition(Common::Point(196, 65)); - - _sceneMode = 99; - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - _stripManager.start(832, this); + default: break; - case 1627: - _mirandaMouth.setup(1627, 3, 1); - _mirandaMouth.setPosition(Common::Point(196, 65)); - _mirandaMouth.show(); + } - _sceneMode = 99; - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - _stripManager.start(833, this); - break; - case 1628: - R2_GLOBALS.setFlag(83); - _tealHead.postInit(); - _tealHead.setup(1627, 1, 1); - _tealHead.setPosition(Common::Point(68, 68)); + int varA = 0; - _mirandaMouth.setup(1627, 3, 1); - _mirandaMouth.setPosition(Common::Point(196, 65)); - _mirandaMouth.show(); + // This section handles checks if the ARM spacecraft have not yet seized + // control of Lance of Truth. + if (!R2_GLOBALS.getFlag(16)) { + switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y - 2) { + case 0: + switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x - 22) { + case 0: + varA = 1553; + _northWall.setupWall(6, 0); + break; + case 1: + // No break on purpose + case 2: + // No break on purpose + case 3: + // No break on purpose + case 4: + varA = 1553; + break; + case 5: + varA = 1553; + _northWall.setupWall(6, 0); + break; + default: + break; + } + break; + case 1: + // No break on purpose + case 2: + switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x - 21) { + case 0: + varA = 1550; + _northWall.setupWall(9, 0); + break; + case 1: + varA = 1552; + _northWall.setupWall(10, 0); + break; + case 2: + // No break on purpose + case 3: + // No break on purpose + case 4: + // No break on purpose + case 5: + varA = 1552; + break; + case 6: + varA = 1552; + _northWall.setupWall(7, 0); + break; + case 7: + varA = 1550; + _northWall.setupWall(8, 0); + break; + default: + break; + } + break; + case 3: + switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x - 21) { + case 0: + varA = 1550; + _northWall.setupWall(4, 0); + break; + case 1: + varA = 1550; + _northWall.setupWall(3, 0); + break; + case 2: + // No break on purpose + case 3: + // No break on purpose + case 4: + // No break on purpose + case 5: + varA = 1551; + break; + case 6: + varA = 1550; + _northWall.setupWall(2, 0); + break; + case 7: + varA = 1550; + _northWall.setupWall(1, 0); + break; + default: + break; + } + break; + default: + break; + } + if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y > 0) && + (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x <= 29) && + ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x < 20) || + (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y > 7))) { + // In an area where the cutscene can be triggered, so start it + R2_GLOBALS.setFlag(16); + R2_GLOBALS._sceneManager.changeScene(1500); + } + } - _sceneMode = 99; - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - _stripManager.start(834, this); - break; - case 1629: - _tealHead.setup(1627, 1, 1); - _tealHead.setPosition(Common::Point(68, 68)); - _tealHead.show(); + if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) && + (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11)) { + if (_screenNumber != 1234) { + R2_GLOBALS._sceneManager._fadeMode = FADEMODE_IMMEDIATE; + loadScene(1234); + R2_GLOBALS._sceneManager._hasPalette = false; + _wallType = 0; + } + } else if (_screenNumber == 1234) { + R2_GLOBALS._sceneManager._fadeMode = FADEMODE_IMMEDIATE; + loadScene(1550); + R2_GLOBALS._sceneManager._hasPalette = false; + } - _sceneMode = 99; - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - _stripManager.start(805, this); - break; - case 1630: - R2_GLOBALS._player.enableControl(CURSOR_USE); - R2_GLOBALS._player._canWalk = true; - break; - case 1631: - _mirandaMouth.setup(1627, 3, 1); - _mirandaMouth.setPosition(Common::Point(196, 65)); - _mirandaMouth.show(); + if (_screenNumber == 1234) + _walkRegionsId = 1576; - _wire.remove(); + if (_wallType == 0) { + _wallType = 1; + } else { + if (_wallType == 2) { + _wallType = 3; + } else { + _wallType = 2; + } - _teal.postInit(); - _teal.fixPriority(10); + if (R2_GLOBALS._sceneManager._sceneNumber == 1550){ +#if 0 + warning("Mouse_hideIfNeeded()"); + warning("gfx_set_pane_p"); + for (int i = 3; i != 168; ++i) { + warning("sub294D2(4, i, 312, var14C)"); + warning("missing for loop, to be implemented"); + warning("gfx_draw_slice"); + } + warning("gfx_flip_screen()"); + warning("gfx_set_pane_p()"); +#endif + R2_GLOBALS._sceneManager._fadeMode = FADEMODE_IMMEDIATE; - _tealRightArm.postInit(); + if (varA == 0) { + if (_sceneResourceId != 1550) { + g_globals->_scenePalette.loadPalette(1550); + R2_GLOBALS._sceneManager._hasPalette = true; + } + } else { + g_globals->_scenePalette.loadPalette(varA); + R2_GLOBALS._sceneManager._hasPalette = true; + } - R2_INVENTORY.setObjectScene(R2_SUPERCONDUCTOR_WIRE, 3); - _sceneMode = 14; + if (R2_GLOBALS._sceneManager._hasPalette) + _sceneResourceId = varA; - setAction(&_sequenceManager, this, 1625, &_teal, &_tealRightArm, NULL); - break; - case 1632: - _tealHead.setup(1627, 1, 1); - _tealHead.setPosition(Common::Point(68, 68)); - _tealHead.show(); +// warning("sub_2C429()"); + } + } - _sceneMode = 99; - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - _stripManager.start(835, this); - break; - case 1633: - _glass.remove(); - _sceneMode = 99; - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - _stripManager.start(818, this); + // Scene setup dependent on the type of cell specified in the scene map + switch (scene1550AreaMap[(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y * 30) + + R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x]) { + case 0: + // Standard cell + if (_walkRegionsId == 0) { + R2_GLOBALS._walkRegions.load(1550); + _walkRegionsId = 1550; + } break; - case 1634: - _sceneMode = 99; - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - _stripManager.start(836, this); + case 1: + // North end of the spaceport + if (_walkRegionsId == 0) { + R2_GLOBALS._walkRegions.load(1560); + _walkRegionsId = 1560; + } + _wallCorner1.setupWall(2, 1); + _northWall.setupWall(1, 3); + _wallCorner2.setupWall(2, 5); break; - case 1635: - _mirandaMouth.setup(1627, 3, 1); - _mirandaMouth.setPosition(Common::Point(196, 65)); - _mirandaMouth.show(); - - _sceneMode = 99; - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - _stripManager.start(818, this); + case 2: + R2_GLOBALS._walkRegions.load(1561); + _walkRegionsId = 1561; + _wallCorner1.setupWall(2, 1); + _westWall.setupWall(2, 2); + _northWall.setupWall(1, 3); + _wallCorner2.setupWall(2, 5); break; - default: + case 3: + R2_GLOBALS._walkRegions.load(1562); + _walkRegionsId = 1562; + _wallCorner1.setupWall(2, 1); + _northWall.setupWall(1, 3); + _wallCorner2.setupWall(2, 5); + _eastWall.setupWall(2, 6); + break; + case 4: + R2_GLOBALS._walkRegions.load(1563); + _walkRegionsId = 1563; + _northWall.setupWall(2, 3); + break; + case 5: + R2_GLOBALS._walkRegions.load(1564); + _walkRegionsId = 1564; + _southWall.setupWall(2, 4); + break; + case 6: + R2_GLOBALS._walkRegions.load(1565); + _walkRegionsId = 1565; + _wallCorner1.setupWall(1, 1); + _westWall.setupWall(1, 2); + _northWall.setupWall(3, 3); + break; + case 7: + R2_GLOBALS._walkRegions.load(1566); + _walkRegionsId = 1566; + _wallCorner1.setupWall(1, 1); + _westWall.setupWall(1, 2); + _northWall.setupWall(2, 4); + break; + case 8: + R2_GLOBALS._walkRegions.load(1567); + _walkRegionsId = 1567; + _westWall.setupWall(5, 2); + break; + case 9: + R2_GLOBALS._walkRegions.load(1568); + _walkRegionsId = 1568; + _westWall.setupWall(4, 2); + break; + case 10: + R2_GLOBALS._walkRegions.load(1569); + _walkRegionsId = 1569; + _wallCorner1.setupWall(3, 1); + break; + case 11: + R2_GLOBALS._walkRegions.load(1570); + _walkRegionsId = 1570; + _wallCorner1.setupWall(1, 1); + _westWall.setupWall(1, 2); + break; + case 12: + R2_GLOBALS._walkRegions.load(1571); + _walkRegionsId = 1571; + _wallCorner2.setupWall(1, 5); + _eastWall.setupWall(1, 6); + break; + case 13: + R2_GLOBALS._walkRegions.load(1572); + _walkRegionsId = 1572; + _wallCorner1.setupWall(1, 1); + _westWall.setupWall(1, 2); + _southWall.setupWall(1, 4); + break; + case 14: + R2_GLOBALS._walkRegions.load(1573); + _walkRegionsId = 1573; + _southWall.setupWall(1, 4); + _wallCorner2.setupWall(1, 5); + _eastWall.setupWall(1, 6); + break; + case 15: + // South wall + R2_GLOBALS._walkRegions.load(1574); + _walkRegionsId = 1574; + _southWall.setupWall(1, 4); + break; + case 16: + R2_GLOBALS._walkRegions.load(1570); + _walkRegionsId = 1570; + _wallCorner1.setupWall(2, 1); + _westWall.setupWall(2, 2); + break; + case 17: + R2_GLOBALS._walkRegions.load(1570); + _walkRegionsId = 1570; + _wallCorner1.setupWall(2, 1); + _westWall.setupWall(3, 2); + break; + case 18: + R2_GLOBALS._walkRegions.load(1571); + _walkRegionsId = 1571; + _wallCorner2.setupWall(2, 5); + _eastWall.setupWall(2, 6); + break; + case 19: + R2_GLOBALS._walkRegions.load(1571); + _walkRegionsId = 1571; + _wallCorner2.setupWall(2, 5); + _eastWall.setupWall(3, 6); + break; + default: break; } -} - -void Scene1625::process(Event &event) { - if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE)) - event.handled = true; - else - Scene::process(event); -} - -/*-------------------------------------------------------------------------- - * Scene 1700 - Rim - * - *--------------------------------------------------------------------------*/ - -Scene1700::Scene1700() { - _walkFlag = 0; -} - -void Scene1700::synchronize(Serializer &s) { - SceneExt::synchronize(s); - - s.syncAsSint16LE(_walkFlag); -} - -bool Scene1700::RimTransport::startAction(CursorType action, Event &event) { - if (action != CURSOR_USE) - return SceneActor::startAction(action, event); - - Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene; - - R2_GLOBALS._player.disableControl(); - scene->_sceneMode = 4; - - Common::Point pt(271, 90); - PlayerMover *mover = new PlayerMover(); - R2_GLOBALS._player.addMover(mover, &pt, scene); - - return true; -} - -bool Scene1700::Companion::startAction(CursorType action, Event &event) { - if (action != CURSOR_TALK) - return SceneActor::startAction(action, event); - - Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene; - scene->_sceneMode = 30; - scene->signal(); - - return true; -} - -void Scene1700::NorthExit::changeScene() { - Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene; - - R2_GLOBALS._player.disableControl(); - _moving = false; - scene->_sceneMode = 1; - - Common::Point pt(R2_GLOBALS._player._position.x, 0); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, scene); -} - -void Scene1700::SouthExit::changeScene() { - Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene; - - R2_GLOBALS._player.disableControl(); - _moving = false; - scene->_sceneMode = 2; - - Common::Point pt(R2_GLOBALS._player._position.x, 170); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, scene); -} - -void Scene1700::WestExit::changeScene() { - Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene; - - R2_GLOBALS._player.disableControl(); - _moving = false; - scene->_sceneMode = 6; - - Common::Point pt(0, R2_GLOBALS._player._position.y); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, scene); -} - -void Scene1700::enterArea() { - Rect tmpRect; - R2_GLOBALS._walkRegions.load(1700); - - _slabWest.remove(); - _slabEast.remove(); - _slabShadowWest.remove(); - _slabShadowEast.remove(); - _westPlatform.remove(); - _rimTransportDoor.remove(); - _rimTransport.remove(); - - if (_sceneMode != 40) { - _ledgeHopper.remove(); - _hatch.remove(); - } - - // The original had manual code here to redraw the background manually when - // changing areas within the scene. Which seems to be totally redundant. - - if (_sceneMode != 40 && R2_GLOBALS._rimLocation == 0) { - // Crashed ledge hopper - _ledgeHopper.postInit(); - _ledgeHopper.setup(1701, 1, 1); - _ledgeHopper.setPosition(Common::Point(220, 137)); - _ledgeHopper.setDetails(1700, 6, -1, -1, 2, (SceneItem *) NULL); - R2_GLOBALS._walkRegions.disableRegion(2); - R2_GLOBALS._walkRegions.disableRegion(12); - } - - if ((R2_GLOBALS._rimLocation + 2) % 4 == 0) { - // The slabs forming the bottom of the regular rings the rim transport travels through - _slabWest.postInit(); - _slabWest.setup(1700, 1, 1); - _slabWest.setPosition(Common::Point(222, 82)); - _slabWest.setDetails(100, -1, -1, -1, 2, (SceneItem *) NULL); - - _slabShadowWest.postInit(); - _slabShadowWest.setup(1700, 2, 1); - _slabShadowWest.setPosition(Common::Point(177, 82)); - _slabShadowWest.fixPriority(0); - - _slabShadowEast.postInit(); - _slabShadowEast.setup(1700, 2, 2); - _slabShadowEast.setPosition(Common::Point(332, 96)); - _slabShadowEast.fixPriority(0); - - _slabEast.postInit(); - _slabEast.setup(1700, 1, 2); - _slabEast.setPosition(Common::Point(424, 84)); - R2_GLOBALS._walkRegions.disableRegion(11); - } + int di = 0; + int tmpIdx = 0; + for (int i = 0; i < 127 * 4; i += 4) { + if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == R2_GLOBALS._scene1550JunkLocations[i]) && + (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == R2_GLOBALS._scene1550JunkLocations[i + 1]) && + (R2_GLOBALS._scene1550JunkLocations[i + 2] != 0)) { + tmpIdx = R2_GLOBALS._scene1550JunkLocations[i + 3]; + _junk[di].postInit(); + _junk[di]._effect = EFFECT_SHADED2; + _junk[di]._shade = 0; + //_junk[di]._junkState = tmpIdx; + _junk[di]._junkNumber = i; + _junk[di].setDetails(1550, 62, -1, 63, 2, (SceneItem *) NULL); + if (R2_GLOBALS._scene1550JunkLocations[i + 2] == 41) { + _junk[di].changeZoom(-1); + _junk[di].setPosition(Common::Point(150, 70)); + _junk[di].setup(1562, 1, 1); - if ((R2_GLOBALS._rimLocation + 399) % 800 == 0) { - // Enable west exit to lift - _westPlatform.postInit(); - _westPlatform.setup(1700, 3, 2); - _westPlatform.setPosition(Common::Point(51, 141)); - _westPlatform.fixPriority(0); - _westPlatform.setDetails(100, -1, -1, -1, 2, (SceneItem *) NULL); + R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[2]); + R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[3]); + R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[6]); + R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[7]); - _westExit._enabled = true; - } else { - R2_GLOBALS._walkRegions.disableRegion(1); - _westExit._enabled = false; + if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) == 1550) { + _joystick.postInit(); + _joystick.setup(1562, 3, 1); + _joystick.setPosition(Common::Point(150, 70)); + _joystick.fixPriority(10); + _joystick.setDetails(1550, 41, -1, 42, 2, (SceneItem *) NULL); + } + } else { + if (R2_GLOBALS._scene1550JunkLocations[i + 2] > 40) { + _junk[di].changeZoom(100); + _junk[di].setup(1561, 1, R2_GLOBALS._scene1550JunkLocations[i + 2] - 40); + } else { + _junk[di].changeZoom(-1); + _junk[di].setup(1552, ((R2_GLOBALS._scene1550JunkLocations[i + 2] - 1) / 5) + 1, ((R2_GLOBALS._scene1550JunkLocations[i + 2] - 1) % 5) + 1); + } + _junk[di].setPosition(Common::Point(scene1550JunkX[tmpIdx], scene1550JunkY[tmpIdx])); + if (scene1550JunkRegions[tmpIdx] != 0) + R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[tmpIdx]); + di++; + } + } } - if ( ((!R2_GLOBALS.getFlag(15)) && ((R2_GLOBALS._rimLocation == 25) || (R2_GLOBALS._rimLocation == -3))) - || ((R2_GLOBALS.getFlag(15)) && (R2_GLOBALS._rimLocation == R2_GLOBALS._rimTransportLocation)) - ) { - // Rim transport vechile located - R2_GLOBALS._rimTransportLocation = R2_GLOBALS._rimLocation; - if (!R2_GLOBALS.getFlag(15)) - _walkFlag = true; - - _rimTransport.postInit(); - _rimTransport.setup(1700, 3, 1); - _rimTransport.setPosition(Common::Point(338, 150)); - _rimTransport.setDetails(1700, 9, -1, -1, 2, (SceneItem *) NULL); - _rimTransport.fixPriority(15); - - _rimTransportDoor.postInit(); - _rimTransportDoor.setup(1700, 4, 1); - _rimTransportDoor.setPosition(Common::Point(312, 106)); - _rimTransportDoor.fixPriority(130); - } -} + // Loop for detecting and setting up certain special areas within the map + for (int i = 0; i < 15 * 3; i += 3) { + if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == scene1550SpecialAreas[i]) + && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == scene1550SpecialAreas[i + 1])) { + int areaType = scene1550SpecialAreas[i + 2]; + switch (areaType) { + case 1: + if (!R2_GLOBALS.getFlag(16)) { + _wreckage2.postInit(); + if (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 3) + _wreckage2.setup(1555, 2, 1); + else + _wreckage2.setup(1555, 1, 1); + _wreckage2.setPosition(Common::Point(150, 100)); + _wreckage2.fixPriority(92); + _wreckage2.setDetails(1550, 73, -1, -1, 2, (SceneItem *) NULL); + } + break; + case 2: + _dish.postInit(); + if (R2_GLOBALS.getFlag(19)) + _dish.setup(1556, 3, 5); + else + _dish.setup(1556, 3, 1); + _dish.changeZoom(95); + _dish.setPosition(Common::Point(165, 83)); + _dish.fixPriority(168); + _dish.setDetails(1550, 17, -1, 19, 2, (SceneItem *) NULL); -void Scene1700::postInit(SceneObjectList *OwnerList) { - loadScene(1700); - SceneExt::postInit(); - if (R2_GLOBALS._sceneManager._previousScene == -1) - R2_GLOBALS._sceneManager._previousScene = 1530; + _dishTower.postInit(); + _dishTower.setup(1556, 4, 1); + _dishTower.setPosition(Common::Point(191, 123)); + _dishTower.changeZoom(95); + _dishTower.setDetails(1550, 65, -1, 66, 2, (SceneItem *) NULL); - scalePalette(65, 65, 65); - _stripManager.addSpeaker(&_quinnSpeaker); - _stripManager.addSpeaker(&_seekerSpeaker); + _dishTowerShadow.postInit(); + _dishTowerShadow._numFrames = 5; + if (R2_GLOBALS.getFlag(19)) + _dishTowerShadow.setup(1556, 8, 5); + else + _dishTowerShadow.setup(1556, 8, 1); - _northExit.setDetails(Rect(94, 0, 319, 12), EXITCURSOR_N, 1700); - _southExit.setDetails(Rect(0, 161, 319, 168), EXITCURSOR_S, 1700); - _westExit.setDetails(Rect(0, 0, 12, 138), EXITCURSOR_W, 1800); + _dishTowerShadow.setPosition(Common::Point(156, 151)); + _dishTowerShadow.fixPriority(10); - R2_GLOBALS._player.postInit(); - R2_GLOBALS._player.setPosition(Common::Point(0, 0)); - R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - R2_GLOBALS._player.setVisage(1501); - R2_GLOBALS._player._moveDiff = Common::Point(2, 1); - } else { - R2_GLOBALS._player.setVisage(1506); - R2_GLOBALS._player._moveDiff = Common::Point(3, 1); - } + _walkway.postInit(); + if (R2_GLOBALS.getFlag(20)) + _walkway.setup(1558, 3, 10); + else + _walkway.setup(1558, 3, 1); - _companion.postInit(); - _companion.animate(ANIM_MODE_1, NULL); - _companion.setObjectWrapper(new SceneObjectWrapper()); + _walkway.setPosition(Common::Point(172, 48)); + _walkway.fixPriority(169); + R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[15]); + break; + case 3: + _wreckage.postInit(); + _wreckage.setup(1550, 1, 1); + _wreckage.setPosition(Common::Point(259, 55)); + _wreckage.fixPriority(133); + _wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - _companion.setVisage(1506); - _companion._moveDiff = Common::Point(3, 1); - _companion.setDetails(9002, 1, -1, -1, 1, (SceneItem *) NULL); - } else { - _companion.setVisage(1501); - _companion._moveDiff = Common::Point(2, 1); - _companion.setDetails(9001, 1, -1, -1, 1, (SceneItem *) NULL); - } + _wreckage2.postInit(); + _wreckage2.setup(1550, 1, 2); + _wreckage2.setPosition(Common::Point(259, 133)); + _wreckage2.fixPriority(105); + _wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL); + if (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) == 1550) { + _gyroscope.postInit(); + _gyroscope.setup(1550, 7, 2); + _gyroscope.setPosition(Common::Point(227, 30)); + _gyroscope.fixPriority(130); + _gyroscope.setDetails(1550, 29, -1, 63, 2, (SceneItem *) NULL); + } + break; + case 4: + _wreckage.postInit(); + _wreckage.setup(1550, 1, 4); + _wreckage.setPosition(Common::Point(76, 131)); + _wreckage.fixPriority(10); + _wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL); - R2_GLOBALS._sound1.play(134); + _wreckage2.postInit(); + _wreckage2.setup(1550, 1, 3); + _wreckage2.setPosition(Common::Point(76, 64)); + _wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL); + if (R2_INVENTORY.getObjectScene(R2_DIAGNOSTICS_DISPLAY) == 1550) { + _diagnosticsDisplay.postInit(); + _diagnosticsDisplay.setup(1504, 4, 1); + _diagnosticsDisplay.setPosition(Common::Point(49, 35)); + _diagnosticsDisplay.animate(ANIM_MODE_2, NULL); + _diagnosticsDisplay._numFrames = 4; + _diagnosticsDisplay.fixPriority(65); + _diagnosticsDisplay.setDetails(1550, 14, 15, 63, 2, (SceneItem *) NULL); + } + if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1550) { + _airbag.postInit(); + _airbag.setup(1550, 7, 1); + _airbag.setPosition(Common::Point(45, 44)); + _airbag.fixPriority(150); + _airbag.setDetails(1550, 44, -1, 63, 2, (SceneItem *) NULL); + } + break; + case 5: + _wreckage.postInit(); + _wreckage.setup(1550, 2, 4); + _wreckage.setPosition(Common::Point(243, 131)); + _wreckage.fixPriority(10); + _wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL); - _playerShadow.postInit(); - _playerShadow.fixPriority(10); + _wreckage2.postInit(); + _wreckage2.setup(1550, 2, 3); + _wreckage2.setPosition(Common::Point(243, 64)); + _wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL); + break; + case 6: + _wreckage.postInit(); + _wreckage.setup(1550, 2, 1); + _wreckage.setPosition(Common::Point(60, 55)); + _wreckage.fixPriority(133); + _wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - _playerShadow.setVisage(1112); - else - _playerShadow.setVisage(1111); + _wreckage2.postInit(); + _wreckage2.setup(1550, 2, 2); + _wreckage2.setPosition(Common::Point(60, 133)); + _wreckage2.fixPriority(106); + _wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL); + break; + case 7: + _wreckage.postInit(); + _wreckage.setup(1550, 3, 1); + _wreckage.setPosition(Common::Point(281, 132)); + _wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL); + break; + case 8: + _wreckage.postInit(); + _wreckage.setup(1550, 3, 2); + _wreckage.setPosition(Common::Point(57, 96)); + _wreckage.fixPriority(70); + _wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL); - _playerShadow._effect = EFFECT_SHADOW_MAP; - _playerShadow._shadowMap = _shadowPaletteMap; - R2_GLOBALS._player._linkedActor = &_playerShadow; + _wreckage2.postInit(); + _wreckage2.setup(1550, 3, 3); + _wreckage2.setPosition(Common::Point(145, 88)); + _wreckage2.fixPriority(55); + _wreckage2.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL); - _companionShadow.postInit(); - _companionShadow.fixPriority(10); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - _companionShadow.setVisage(1111); - else - _companionShadow.setVisage(1112); + _wreckage3.postInit(); + _wreckage3.setup(1550, 3, 4); + _wreckage3.setPosition(Common::Point(64, 137)); + _wreckage3.fixPriority(115); + _wreckage3.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL); - _companionShadow._effect = EFFECT_SHADOW_MAP; - _companionShadow._shadowMap = _shadowPaletteMap; - _companion._linkedActor = &_companionShadow; + _wreckage4.postInit(); + _wreckage4.setup(1550, 5, 1); + _wreckage4.setPosition(Common::Point(60, 90)); + _wreckage4.fixPriority(45); + break; + case 9: + _wreckage.postInit(); + _wreckage.setup(1550, 4, 2); + _wreckage.setPosition(Common::Point(262, 96)); + _wreckage.fixPriority(70); + _wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL); - R2_GLOBALS._sound1.play(134); + _wreckage2.postInit(); + _wreckage2.setup(1550, 4, 3); + _wreckage2.setPosition(Common::Point(174, 88)); + _wreckage2.fixPriority(55); + _wreckage2.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL); - switch (R2_GLOBALS._sceneManager._previousScene) { - case 1530: - R2_GLOBALS._player._characterIndex = R2_QUINN; - R2_GLOBALS._player.disableControl(); - R2_GLOBALS._player.hide(); - _companion.hide(); + _wreckage3.postInit(); + _wreckage3.setup(1550, 4, 4); + _wreckage3.setPosition(Common::Point(255, 137)); + _wreckage3.fixPriority(115); + _wreckage3.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL); - _hatch.postInit(); - _hatch.hide(); + _wreckage4.postInit(); + _wreckage4.setup(1550, 6, 1); + _wreckage4.setPosition(Common::Point(259, 90)); + _wreckage4.fixPriority(45); + break; + case 10: + _wreckage.postInit(); + _wreckage.setup(1550, 4, 1); + _wreckage.setPosition(Common::Point(38, 132)); + _wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL); + break; + case 12: + // Intact ship + _shipComponents[7].setupShipComponent(8); + _shipComponents[0].setupShipComponent(1); + _shipComponents[1].setupShipComponent(2); + _shipComponents[2].setupShipComponent(3); + _shipComponents[3].setupShipComponent(4); + _shipComponents[4].setupShipComponent(5); + _shipComponents[5].setupShipComponent(6); + _shipComponents[6].setupShipComponent(7); + break; + default: + break; + } + } + } - _ledgeHopper.postInit(); - _ledgeHopper.setup(1701, 1, 1); - _ledgeHopper.setPosition(Common::Point(220, 137)); - _ledgeHopper.setDetails(1700, 6, -1, -1, 1, (SceneItem *) NULL); + if (R2_GLOBALS._s1550PlayerArea[R2_QUINN] == R2_GLOBALS._s1550PlayerArea[R2_SEEKER]) { + _companion.postInit(); + _companion._effect = EFFECT_SHADED2; + _companion.changeZoom(-1); - _playerShadow.hide(); - _companionShadow.hide(); - R2_GLOBALS._events.setCursor(CURSOR_WALK); - _stripManager.start(539, this); - _sceneMode = 40; - break; - case 1750: { - R2_GLOBALS._player.setPosition(Common::Point(282, 121)); - _companion.setPosition(Common::Point(282, 139)); - _sceneMode = 8; - Common::Point pt(262, 101); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - Common::Point pt2(262, 119); - NpcMover *mover2 = new NpcMover(); - _companion.addMover(mover2, &pt2, this); - } - break; - case 1800: { - R2_GLOBALS._player.disableControl(); - R2_GLOBALS._player.setPosition(Common::Point(0, 86)); - _companion.setPosition(Common::Point(0, 64)); - _sceneMode = 7; - R2_GLOBALS._player.setObjectWrapper(NULL); - R2_GLOBALS._player._strip = 1; - Common::Point pt(64, 86); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - _companion.setObjectWrapper(NULL); - _companion._strip = 1; - Common::Point pt2(77, 64); - NpcMover *mover2 = new NpcMover(); - _companion.addMover(mover2, &pt2, NULL); - } - break; - default: + assert((_walkRegionsId >= 1550) && (_walkRegionsId <= 2008)); + R2_GLOBALS._walkRegions.disableRegion(k5A750[_walkRegionsId - 1550]); + _companion.setPosition(Common::Point(scene1550JunkX[k5A76D[_walkRegionsId - 1550]], scene1550JunkY[k5A76D[_walkRegionsId - 1550]] + 8)); if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - R2_GLOBALS._player.setPosition(Common::Point(109, 160)); - _companion.setPosition(Common::Point(156, 160)); - R2_GLOBALS._walkRegions.disableRegion(15); + if (R2_GLOBALS._player._characterScene[R2_SEEKER] == 1580) { + _companion.setup(1516, 3, 17); + _companion.setPosition(Common::Point(272, 94)); + _companion.fixPriority(91); + _companion.changeZoom(100); + _companion.setDetails(1550, -1, -1, -1, 5, &_shipComponents[7]); + } else { + _companion.setup(1505, 6, 1); + _companion.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL); + } } else { - R2_GLOBALS._player.setPosition(Common::Point(156, 160)); - _companion.setPosition(Common::Point(109, 160)); - R2_GLOBALS._walkRegions.disableRegion(17); + if (R2_GLOBALS._player._characterScene[R2_QUINN] == 1580) { + _companion.setup(1516, 2, 14); + _companion.setPosition(Common::Point(276, 97)); + _companion.fixPriority(91); + _companion.changeZoom(100); + _companion.setDetails(1550, -1, -1, -1, 5, &_shipComponents[7]); + } else { + _companion.setup(1500, 6, 1); + _companion.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL); + } } - _sceneMode = 50; - setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); - break; } - R2_GLOBALS._player._characterScene[R2_QUINN] = 1700; - R2_GLOBALS._player._characterScene[R2_SEEKER] = 1700; - R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1700; - R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1700; + R2_GLOBALS._uiElements.updateInventory(); +} - enterArea(); +/*-------------------------------------------------------------------------- + * Scene 1575 - Spaceport - unused ship scene + * + *--------------------------------------------------------------------------*/ - _surface.setDetails(1, 1700, 3, -1, -1); - _background.setDetails(Rect(0, 0, 480, 200), 1700, 0, -1, -1, 1, NULL); +Scene1575::Button::Button() { + _buttonId = 0; + _pressed = false; } -void Scene1700::remove() { - R2_GLOBALS._sound1.fadeOut2(NULL); - SceneExt::remove(); +void Scene1575::Button::synchronize(Serializer &s) { + NamedHotspot::synchronize(s); + + s.syncAsSint16LE(_buttonId); + s.syncAsSint16LE(_pressed); } -void Scene1700::signal() { - switch (_sceneMode) { - case 1: { - _sceneMode = 3; - if (R2_GLOBALS._rimLocation < 2400) - ++R2_GLOBALS._rimLocation; - enterArea(); - R2_GLOBALS._player.setPosition(Common::Point(235 - (((((235 - R2_GLOBALS._player._position.x) * 100) / 103) * 167) / 100), 170)); - Common::Point pt(R2_GLOBALS._player._position.x, 160); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); +void Scene1575::Button::process(Event &event) { + Scene1575 *scene = (Scene1575 *)R2_GLOBALS._sceneManager._scene; + bool isInBounds = _bounds.contains(event.mousePos); + CursorType cursor = R2_GLOBALS._events.getCursor(); - if (R2_GLOBALS._player._position.x < 132) { - _companion.setPosition(Common::Point(156, 170)); - Common::Point pt2(156, 160); - NpcMover *mover2 = new NpcMover(); - _companion.addMover(mover2, &pt2, NULL); - R2_GLOBALS._walkRegions.disableRegion(15); - } else { - _companion.setPosition(Common::Point(109, 170)); - Common::Point pt3(109, 160); - NpcMover *mover3 = new NpcMover(); - _companion.addMover(mover3, &pt3, NULL); - R2_GLOBALS._walkRegions.disableRegion(17); - } - } - break; - case 2: { - _sceneMode = 3; - if (R2_GLOBALS._rimLocation > -2400) - --R2_GLOBALS._rimLocation; - enterArea(); - R2_GLOBALS._player.setPosition(Common::Point(235 - (((((235 - R2_GLOBALS._player._position.x) * 100) / 167) * 103) / 100), 0)); - Common::Point pt(R2_GLOBALS._player._position.x, 10); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); + if ((event.eventType == EVENT_BUTTON_DOWN && cursor == CURSOR_USE && isInBounds) || + (_pressed && _buttonId != 1 && event.eventType == EVENT_BUTTON_UP && isInBounds)) { + // Button pressed + _pressed = true; + Common::Point pos = scene->_actor1._position; + event.handled = true; - if (R2_GLOBALS._player._position.x >= 171) { - _companion.setPosition(Common::Point(155, 0)); - Common::Point pt2(155, 10); - NpcMover *mover2 = new NpcMover(); - _companion.addMover(mover2, &pt2, NULL); - R2_GLOBALS._walkRegions.disableRegion(15); - } else { - _companion.setPosition(Common::Point(188, 0)); - Common::Point pt3(188, 10); - NpcMover *mover3 = new NpcMover(); - _companion.addMover(mover3, &pt3, NULL); - R2_GLOBALS._walkRegions.disableRegion(17); - } - } - break; - case 3: - if (!_walkFlag) { - R2_GLOBALS._player.enableControl(CURSOR_WALK); - } else { - R2_GLOBALS.setFlag(15); - _walkFlag = false; - _sceneMode = 31; - R2_GLOBALS._events.setCursor(CURSOR_WALK); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - _stripManager.start(542, this); - else - _stripManager.start(543, this); - } - break; - case 4: { - _sceneMode = 5; - Common::Point pt(271, 90); - PlayerMover *mover = new PlayerMover(); - _companion.addMover(mover, &pt, NULL); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - setAction(&_sequenceManager, this, 1700, &R2_GLOBALS._player, &_rimTransportDoor, NULL); - else - setAction(&_sequenceManager, this, 1701, &R2_GLOBALS._player, &_rimTransportDoor, NULL); - } - break; - case 5: - R2_GLOBALS._sceneManager.changeScene(1750); - break; - case 6: - R2_GLOBALS._sceneManager.changeScene(1800); - break; - case 7: - R2_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); - R2_GLOBALS._player._strip = 1; - _companion.setObjectWrapper(new SceneObjectWrapper()); - _companion._strip = 1; - R2_GLOBALS._player.enableControl(CURSOR_WALK); - R2_GLOBALS._walkRegions.disableRegion(14); - break; - case 8: - R2_GLOBALS._player._strip = 2; - _companion._strip = 1; - R2_GLOBALS._player.enableControl(CURSOR_WALK); - R2_GLOBALS._walkRegions.disableRegion(12); - break; - case 30: - _sceneMode = 31; - R2_GLOBALS._player.disableControl(); - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - _stripManager.start(540, this); - else - _stripManager.start(541, this); - break; - case 31: - R2_GLOBALS._player.enableControl(CURSOR_TALK); - break; - case 40: - R2_GLOBALS._player.disableControl(); - _sceneMode = 1704; - setAction(&_sequenceManager, this, 1704, &R2_GLOBALS._player, &_companion, - &_hatch, &_ledgeHopper, &_playerShadow, &_companionShadow, NULL); - break; - case 50: - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - R2_GLOBALS._walkRegions.disableRegion(15); - else - R2_GLOBALS._walkRegions.disableRegion(17); + if (!R2_GLOBALS.getFlag(18) || _buttonId <= 1 || _buttonId >= 6) { + switch (_buttonId) { + case 1: + if (R2_GLOBALS.getFlag(18)) { + scene->_actor14.hide(); + scene->_actor15.hide(); + R2_GLOBALS.clearFlag(18); + } else if ((scene->_actor12._position.x == 85) && (scene->_actor12._position.y == 123)) { + scene->_actor14.show(); + scene->_actor15.show(); + R2_GLOBALS.setFlag(18); + } else { + SceneItem::display("That's probably not a good thing, ya know!"); + } + break; + case 2: + if (scene->_field41A < 780) { + if (pos.x > 54) + pos.x -= 65; + pos.x += 2; + scene->_field41A += 2; - R2_GLOBALS._player.enableControl(); - break; - case 1704: - R2_GLOBALS._sound1.play(134); - R2_GLOBALS._walkRegions.disableRegion(15); - R2_GLOBALS._walkRegions.disableRegion(2); - R2_GLOBALS._walkRegions.disableRegion(12); - R2_GLOBALS._player.fixPriority(-1); - R2_GLOBALS._player.enableControl(CURSOR_WALK); - break; - default: - R2_GLOBALS._player.enableControl(); - break; - } -} + for (int i = 0; i < 17; i++) + scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x + 2, scene->_arrActor[i]._position.y)); -/*-------------------------------------------------------------------------- - * Scene 1750 - Maintaiance Vechile - * - *--------------------------------------------------------------------------*/ + scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x + 2, scene->_actor13._position.y)); + scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x + 2, scene->_actor12._position.y)); + scene->_actor1.setPosition(Common::Point(pos.x, pos.y)); + scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y)); + scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y)); + } + break; + case 3: + if (scene->_field41A > 0) { + if (pos.x < -8) + pos.x += 65; + + pos.x -= 2; + scene->_field41A -= 2; + for (int i = 0; i < 17; i++) + scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x - 2, scene->_arrActor[i]._position.y)); + + scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x - 2, scene->_actor13._position.y)); + scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x - 2, scene->_actor12._position.y)); + scene->_actor1.setPosition(Common::Point(pos.x, pos.y)); + scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y)); + scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y)); + } + break; + case 4: { + if (pos.y < 176) { + ++pos.y; + for (int i = 0; i < 17; ++i) + scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x, scene->_arrActor[i]._position.y + 1)); + + scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x, scene->_actor13._position.y + 1)); + scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x, scene->_actor12._position.y + 1)); + scene->_actor1.setPosition(Common::Point(pos.x, pos.y)); + scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y)); + scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y)); + } + } + break; + case 5: { + if (pos.y > 145) { + --pos.y; + for (int i = 0; i < 17; ++i) + scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x, scene->_arrActor[i]._position.y - 1)); + + scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x, scene->_actor13._position.y - 1)); + scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x, scene->_actor12._position.y - 1)); + scene->_actor1.setPosition(Common::Point(pos.x, pos.y)); + scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y)); + scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y)); + } + } + break; + case 6: + R2_GLOBALS._sceneManager.changeScene(1550); + break; + default: + break; + } -Scene1750::Button::Button() { - _buttonId = 0; -} + int j = 0; + for (int i = 0; i < 17; i++) { + if (scene->_arrActor[i]._bounds.contains(85, 116)) + j = i; + } -void Scene1750::Button::synchronize(Serializer &s) { - SceneActor::synchronize(s); + if (scene->_actor13._bounds.contains(85, 116)) + j = 18; - s.syncAsSint16LE(_buttonId); + if (scene->_actor12._bounds.contains(85, 116)) + j = 19; + + if (j) + scene->_actor11.show(); + else + scene->_actor11.hide(); + } else { + SceneItem::display("Better not move the laser while it's firing!"); + } + } else { + _pressed = false; + } } -bool Scene1750::Button::startAction(CursorType action, Event &event) { - if (action != CURSOR_USE) - return SceneActor::startAction(action, event); +bool Scene1575::Button::startAction(CursorType action, Event &event) { + if (action == CURSOR_USE) + return false; + return SceneHotspot::startAction(action, event); +} - Scene1750 *scene = (Scene1750 *)R2_GLOBALS._sceneManager._scene; +void Scene1575::Button::initButton(int buttonId) { + _buttonId = buttonId; + _pressed = false; + EventHandler::postInit(); switch (_buttonId) { case 1: - // Forward button - show(); - scene->_backwardButton.hide(); - if (scene->_speed < 0) - scene->_speed = -scene->_speed; - scene->_direction = 1; + setDetails(Rect(53, 165, 117, 190), -1, -1, -1, 2, 1, NULL); break; case 2: - // Backwards button - show(); - scene->_forwardButton.hide(); - if (scene->_speed > 0) - scene->_speed = -scene->_speed; - scene->_direction = -1; + setDetails(Rect(151, 142, 189, 161), -1, -1, -1, 2, 1, NULL); break; case 3: - // Exit button - if (scene->_rotation->_idxChange == 0) { - show(); - R2_GLOBALS._sceneManager.changeScene(1700); - } else { - scene->_speed = 0; - scene->_speedSlider._moveRate = 20; - scene->_forwardButton._moveDiff.y = 1; - Common::Point pt(286, 143); - NpcMover *mover = new NpcMover(); - scene->_speedSlider.addMover(mover, &pt, NULL); - } + setDetails(Rect(225, 142, 263, 161), -1, -1, -1, 2, 1, NULL); + break; + case 4: + setDetails(Rect(188, 122, 226, 140), -1, -1, -1, 2, 1, NULL); + break; + case 5: + setDetails(Rect(188, 162, 226, 180), -1, -1, -1, 2, 1, NULL); + break; + case 6: + setDetails(Rect(269, 169, 301, 185), -1, -1, -1, 2, 1, NULL); + break; default: break; } - - return true; -} - -/*------------------------------------------------------------------------*/ - -Scene1750::SpeedSlider::SpeedSlider() { - _incrAmount = 0; - _xp = 0; - _ys = 0; - _height = 0; - _thumbHeight = 0; - _mouseDown = false; } -void Scene1750::SpeedSlider::synchronize(Serializer &s) { - SceneActor::synchronize(s); +/*--------------------------------------------------------------------------*/ - s.syncAsSint16LE(_incrAmount); - s.syncAsSint16LE(_xp); - s.syncAsSint16LE(_ys); - s.syncAsSint16LE(_height); - s.syncAsSint16LE(_thumbHeight); - s.syncAsSint16LE(_mouseDown); +Scene1575::Scene1575() { + _field412 = 0; + _field414 = 390; + _field416 = 0; + _field418 = 0; + _field41A = 0; } -void Scene1750::SpeedSlider::setupSlider(int incrAmount, int xp, int ys, int height, int thumbHeight) { - _mouseDown = false; - _incrAmount = incrAmount; - _xp = xp; - _ys = ys; - _height = height; - _thumbHeight = thumbHeight; +void Scene1575::synchronize(Serializer &s) { + SceneExt::synchronize(s); - postInit(); - setup(1750, 1, 1); - fixPriority(255); - setPosition(Common::Point(_xp, _ys + ((_height * (incrAmount - 1)) / (_thumbHeight - 1)))); + s.syncAsSint16LE(_field412); + s.syncAsSint16LE(_field414); + s.syncAsSint16LE(_field416); + s.syncAsSint16LE(_field418); + s.syncAsSint16LE(_field41A); } -void Scene1750::SpeedSlider::calculateSlider() { - Scene1750 *scene = (Scene1750 *)R2_GLOBALS._sceneManager._scene; - - int tmpVar = (_height / (_thumbHeight - 1)) / 2; - int tmpVar2 = ((_position.y - _ys + tmpVar) * _thumbHeight) / (_height + 2 * tmpVar); - - setPosition(Common::Point(_xp, _ys + ((_height * tmpVar2) / (_thumbHeight - 1)))); - scene->_speed = scene->_direction * tmpVar2; +double hypotenuse(double v1, double v2) { + return sqrt(v1 * v1 + v2 * v2); } -void Scene1750::SpeedSlider::process(Event &event) { - if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE) && - (_bounds.contains(event.mousePos))) { - _mouseDown = true; - event.eventType = EVENT_NONE; - } - - if ((event.eventType == EVENT_BUTTON_UP) && _mouseDown) { - _mouseDown = false; - event.handled = true; - addMover(NULL); - calculateSlider(); - } - - if (_mouseDown) { - event.handled = true; - if (event.mousePos.y >= _ys) { - if (_ys + _height >= event.mousePos.y) - setPosition(Common::Point(_xp, event.mousePos.y)); - else - setPosition(Common::Point(_xp, _ys + _height)); - } else { - setPosition(Common::Point(_xp, _ys)); - } - } -} +void Scene1575::postInit(SceneObjectList *OwnerList) { + loadScene(1575); + R2_GLOBALS._uiElements._active = false; + SceneExt::postInit(); + R2_GLOBALS._interfaceY = SCREEN_HEIGHT; -bool Scene1750::SpeedSlider::startAction(CursorType action, Event &event) { - if (action == CURSOR_USE) - return SceneActor::startAction(action, event); + _actor1.postInit(); + _actor1.setup(1575, 1, 1); + _actor1.setPosition(Common::Point(54, 161)); + _actor1.fixPriority(5); - return false; -} + _actor2.postInit(); + _actor2.setup(1575, 1, 1); + _actor2.setPosition(Common::Point(119, 161)); + _actor2.fixPriority(5); -/*------------------------------------------------------------------------*/ + _actor3.postInit(); + _actor3.setup(1575, 1, 1); + _actor3.setPosition(Common::Point(184, 161)); + _actor3.fixPriority(5); -Scene1750::Scene1750() { - _direction = 0; - _speedCurrent = 0; - _speed = 0; - _speedDelta = 0; - _rotationSegment = 0; - _rotationSegCurrent = 0; - _newRotation = 0; + for (int i = 0; i < 17; i++) { + _arrActor[i].postInit(); + _arrActor[i].setup(1575, 2, k5A7F6[3 * i + 2]); - _rotation = nullptr; -} + double v1 = hypotenuse(2.0, 3 - k5A7F6[3 * i]); + v1 += hypotenuse(2.0, 3 - k5A7F6[3 * i + 1]); + int yp = (int)(sqrt(v1) * 75.0 / 17.0 - 161.0); -void Scene1750::synchronize(Serializer &s) { - SceneExt::synchronize(s); - SYNC_POINTER(_rotation); + int angle = R2_GLOBALS._gfxManagerInstance.getAngle( + Common::Point(3, 16), Common::Point(k5A7F6[3 * i], k5A7F6[3 * i + 1])); + int xp = angle * 78 / 9 - 319; - s.syncAsSint16LE(_direction); - s.syncAsSint16LE(_speedCurrent); - s.syncAsSint16LE(_speed); - s.syncAsSint16LE(_speedDelta); - s.syncAsSint16LE(_rotationSegment); - s.syncAsSint16LE(_rotationSegCurrent); - s.syncAsSint16LE(_newRotation); -} + _arrActor[i].setPosition(Common::Point(xp, yp)); + _arrActor[i].fixPriority(6); + } -void Scene1750::postInit(SceneObjectList *OwnerList) { - loadScene(1750); - R2_GLOBALS._sound1.play(115); - R2_GLOBALS._uiElements._active = false; + _actor4.postInit(); + _actor4.setup(1575, 3, 1); + _actor4.setPosition(Common::Point(48, 81)); - SceneExt::postInit(); - R2_GLOBALS._interfaceY = SCREEN_HEIGHT; + _actor5.postInit(); + _actor5.setup(1575, 3,1); + _actor5.setPosition(Common::Point(121, 81)); - R2_GLOBALS._player._characterScene[R2_QUINN] = 1750; - R2_GLOBALS._player._characterScene[R2_SEEKER] = 1750; - R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1750; - R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1750; + _actor6.postInit(); + _actor6.setup(1575, 3, 2); + _actor6.setPosition(Common::Point(203, 80)); - _rotation = R2_GLOBALS._scenePalette.addRotation(224, 254, 1); - _rotation->setDelay(0); - _rotation->_idxChange = 0; - _rotation->_countdown = 2; + _actor7.postInit(); + _actor7.setup(1575, 3, 2); + _actor7.setPosition(Common::Point(217, 80)); - switch ((R2_GLOBALS._rimLocation + 2) % 4) { - case 0: - _rotation->_currIndex = 247; - break; - case 1: - _rotation->_currIndex = 235; - break; - case 2: - _rotation->_currIndex = 239; - break; - case 3: - _rotation->_currIndex = 243; - break; - default: - break; - } + _actor8.postInit(); + _actor8.setup(1575, 3, 2); + _actor8.setPosition(Common::Point(231, 80)); - byte tmpPal[768]; + _actor9.postInit(); + _actor9.setup(1575, 3, 2); + _actor9.setPosition(Common::Point(273, 91)); - for (int i = 224; i < 255; i++) { - int tmpIndex = _rotation->_currIndex - 224; - if (tmpIndex > 254) - tmpIndex -= 31; - tmpPal[3 * i] = R2_GLOBALS._scenePalette._palette[3 * tmpIndex]; - tmpPal[(3 * i) + 1] = R2_GLOBALS._scenePalette._palette[(3 * tmpIndex) + 1]; - tmpPal[(3 * i) + 2] = R2_GLOBALS._scenePalette._palette[(3 * tmpIndex) + 2]; - } + _actor10.postInit(); + _actor10.setup(1575, 3, 2); + _actor10.setPosition(Common::Point(287, 91)); - for (int i = 224; i < 255; i++) { - R2_GLOBALS._scenePalette._palette[3 * i] = tmpPal[3 * i]; - R2_GLOBALS._scenePalette._palette[(3 * i) + 1] = tmpPal[(3 * i) + 1]; - R2_GLOBALS._scenePalette._palette[(3 * i) + 2] = tmpPal[(3 * i) + 2]; - } + // Initialize buttons + _button1.initButton(1); + _button2.initButton(2); + _button3.initButton(3); + _button4.initButton(4); + _button5.initButton(5); + _button6.initButton(6); + + _actor11.postInit(); + _actor11.setup(1575, 4, 2); + _actor11.setPosition(Common::Point(84, 116)); + _actor11.hide(); R2_GLOBALS._player.postInit(); R2_GLOBALS._player.hide(); R2_GLOBALS._player.enableControl(); - _radarSweep.postInit(); - _radarSweep.setup(1750, 3, 1); - _radarSweep.setPosition(Common::Point(49, 185)); - _radarSweep.fixPriority(7); - _radarSweep.setDetails(1750, 30, -1, -1, 1, (SceneItem *) NULL); - - _scannerIcon.postInit(); - _scannerIcon.setup(1750, 2, 1); - _scannerIcon.setPosition(Common::Point(35, ((_rotation->_currIndex - 218) % 4) + ((R2_GLOBALS._rimLocation % 800) * 4) - 1440)); - _scannerIcon.fixPriority(8); + do { + _field412 = R2_GLOBALS._randomSource.getRandomNumber(20) - 10; + _field414 = R2_GLOBALS._randomSource.getRandomNumber(20) - 10; + } while ((_field412) && (_field414)); - _redLights.postInit(); - _redLights.setup(1750, 1, 4); + if (_field412 < 0) + _actor4.hide(); - int tmpVar = ABS(_scannerIcon._position.y - 158) / 100; + if (_field414 < 0) + _actor5.hide(); - if (tmpVar >= 8) - _redLights.hide(); - else if (_scannerIcon._position.y <= 158) - _redLights.setPosition(Common::Point(137, (tmpVar * 7) + 122)); - else - _redLights.setPosition(Common::Point(148, (tmpVar * 7) + 122)); + _field416 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1; + _field418 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1; - _speedSlider.setupSlider(1, 286, 143, 41, 15); - _speedSlider.setDetails(1750, 24, 1, -1, 1, (SceneItem *) NULL); + _actor13.postInit(); + _actor13.setup(1575, 2, 4); - _forwardButton.postInit(); - _forwardButton._buttonId = 1; - _forwardButton.setup(1750, 1, 2); - _forwardButton.setPosition(Common::Point(192, 140)); - _forwardButton.setDetails(1750, 18, 1, -1, 1, (SceneItem *) NULL); + // TODO + warning("TODO: another immense pile of floating operations"); - _backwardButton.postInit(); - _backwardButton._buttonId = 2; - _backwardButton.setup(1750, 1, 3); - _backwardButton.setPosition(Common::Point(192, 163)); - _backwardButton.setDetails(1750, 18, 1, -1, 1, (SceneItem *) NULL); - _backwardButton.hide(); + _actor12.postInit(); + _actor12.fixPriority(12); - _exitButton.postInit(); - _exitButton._buttonId = 3; - _exitButton.setup(1750, 1, 5); - _exitButton.setPosition(Common::Point(230, 183)); - _exitButton.setDetails(1750, 27, 1, -1, 1, (SceneItem *) NULL); + if (R2_GLOBALS.getFlag(17)) { + _actor13.setPosition(Common::Point(_actor13._position.x + 5, _actor13._position.y)); + _actor12.setPosition(Common::Point(_actor12._position.x + 5, _actor12._position.y)); + } - _direction = 1; // Forward by default - _speedDelta = 0; - _speedCurrent = 0; - _speed = 0; - _rotationSegment = ((_rotation->_currIndex - 218) / 4) % 4; + _actor14.postInit(); + _actor14.setup(1575, 5, 1); + _actor14.setPosition(Common::Point(85, 176)); + _actor14.fixPriority(7); + _actor14.hide(); - _redLightsDescr.setDetails(Rect(129, 112, 155, 175), 1750, 21, -1, -1, 1, NULL); - _greenLights.setDetails(Rect(93, 122, 126, 172), 1750, 15, -1, -1, 1, NULL); - _frontView.setDetails(Rect(3, 3, 157, 99), 1750, 9, -1, -1, 1, NULL); - _rearView.setDetails(Rect(162, 3, 316, 99), 1750, 12, -1, -1, 1, NULL); - _background.setDetails(Rect(0, 0, 320, 200), 1750, 6, 1, -1, 1, NULL); + _actor15.postInit(); + _actor15.setup(1575, 5, 2); + _actor15.setPosition(Common::Point(85, 147)); + _actor15.fixPriority(7); + _actor15.hide(); } -void Scene1750::remove() { - if (R2_GLOBALS._rimLocation == 2400) - R2_GLOBALS._rimLocation = 2399; - - if (R2_GLOBALS._rimLocation == -2400) - R2_GLOBALS._rimLocation = -2399; - - R2_GLOBALS._rimTransportLocation = R2_GLOBALS._rimLocation; - +void Scene1575::remove() { SceneExt::remove(); - R2_GLOBALS._sound1.fadeOut2(NULL); R2_GLOBALS._uiElements._active = true; } -void Scene1750::signal() { +void Scene1575::signal() { R2_GLOBALS._player.enableControl(); } -void Scene1750::process(Event &event) { +void Scene1575::process(Event &event) { Scene::process(event); - if (!event.handled) - _speedSlider.process(event); -} -void Scene1750::dispatch() { - if (_rotation) { - if (!_speedDelta && (_speed != _speedCurrent)) { - if (_speedCurrent >= _speed) - --_speedCurrent; - else - ++_speedCurrent; + g_globals->_sceneObjects->recurse(SceneHandler::dispatchObject); +} - _speedDelta = 21 - ABS(_speedCurrent); +void Scene1575::dispatch() { + if (_field412 <= 0) { + ++_field412; + if (_field412 == 0) { + _actor4.show(); + _field412 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1; } - - if (_speedDelta == 1) { - if (_speedCurrent == 0) { - _radarSweep.show(); - _rotation->_idxChange = 0; - } else { - if (_rotation->_idxChange == 0) - _radarSweep.hide(); - - if (_speedCurrent < -12) { - _rotation->setDelay(15 - ABS(_speedCurrent)); - _rotation->_idxChange = -2; - } else if (_speedCurrent < 0) { - _rotation->setDelay(10 - ABS(_speedCurrent)); - _rotation->_idxChange = -1; - } else if (_speedCurrent < 11) { - _rotation->setDelay(10 - _speedCurrent); - _rotation->_idxChange = 1; - } else { - _rotation->setDelay(15 - _speedCurrent); - _rotation->_idxChange = 2; - } - } + } else { + _field412--; + if (_field412 ==0) { + _actor4.hide(); + _field412 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1; } + } - if (_speedDelta) - --_speedDelta; - - _rotationSegCurrent = _rotationSegment; - _rotationSegment = ((_rotation->_currIndex - 218) / 4) % 4; - - if ((_rotationSegCurrent + 1) == _rotationSegment || (_rotationSegCurrent - 3) == _rotationSegment) { - if (R2_GLOBALS._rimLocation < 2400) { - ++R2_GLOBALS._rimLocation; - } + if (_field414 <= 0) { + ++_field414; + if (_field414 == 0) { + _actor5.show(); + _field414 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1; } - - if ((_rotationSegCurrent - 1) == _rotationSegment || (_rotationSegCurrent + 3) == _rotationSegment) { - if (R2_GLOBALS._rimLocation > -2400) { - --R2_GLOBALS._rimLocation; - } + } else { + _field414--; + if (_field414 == 0) { + _actor5.hide(); + _field414 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1; } + } - if (_rotation->_currIndex != _newRotation) { - // Handle setting the position of the lift icon in the scanner display - _newRotation = _rotation->_currIndex; - _scannerIcon.setPosition(Common::Point(35, ((_rotation->_currIndex - 218) % 4) + - ((R2_GLOBALS._rimLocation % 800) * 4) - 1440)); + if (_field416 == 0) { + switch(R2_GLOBALS._randomSource.getRandomNumber(3)) { + case 0: + _actor6.hide(); + _actor7.hide(); + _actor8.hide(); + break; + case 1: + _actor6.show(); + _actor7.hide(); + _actor8.hide(); + break; + case 2: + _actor6.show(); + _actor7.show(); + _actor8.hide(); + break; + case 3: + _actor6.show(); + _actor7.show(); + _actor8.show(); + break; + default: + break; } + _field416 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1; + } else { + --_field416; } - int v = ABS(_scannerIcon._position.y - 158) / 100; - if (v < 8) { - // Show how close the user is to the lift on the second column of lights - _redLights.show(); - _redLights.setPosition(Common::Point((_scannerIcon._position.y <= 158) ? 137 : 148, - v * 7 + 122)); + if (_field418 == 0) { + switch(R2_GLOBALS._randomSource.getRandomNumber(2)) { + case 0: + _actor9.hide(); + _actor10.hide(); + break; + case 1: + _actor9.show(); + _actor10.hide(); + break; + case 2: + _actor9.show(); + _actor10.show(); + break; + default: + break; + } + _field418 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1; } else { - _redLights.hide(); + _field418--; } + Scene::dispatch(); } /*-------------------------------------------------------------------------- - * Scene 1800 - Rim Lift Exterior + * Scene 1580 - Inside wreck * *--------------------------------------------------------------------------*/ -Scene1800::Scene1800() { - _locationMode = 0; +Scene1580::Scene1580() { } -void Scene1800::synchronize(Serializer &s) { +void Scene1580::synchronize(Serializer &s) { SceneExt::synchronize(s); +} - s.syncAsSint16LE(_locationMode); +bool Scene1580::JoystickPlug::startAction(CursorType action, Event &event) { + if (action == R2_JOYSTICK) { + Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene; + + R2_INVENTORY.setObjectScene(R2_JOYSTICK, 1580); + R2_GLOBALS._sceneItems.remove(&scene->_joystickPlug); + scene->_joystick.postInit(); + scene->_joystick.setup(1580, 1, 4); + scene->_joystick.setPosition(Common::Point(159, 163)); + scene->_joystick.setDetails(1550, 78, -1, -1, 2, (SceneItem *) NULL); + + scene->_arrActor[5].remove(); + + return true; + } + + return SceneHotspot::startAction(action, event); } -bool Scene1800::Background::startAction(CursorType action, Event &event) { - if ((action != R2_COM_SCANNER) && (action != R2_COM_SCANNER_2)) - return false; +bool Scene1580::ScreenSlot::startAction(CursorType action, Event &event) { + if (action == R2_DIAGNOSTICS_DISPLAY) { + Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene; - Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene; + R2_INVENTORY.setObjectScene(R2_DIAGNOSTICS_DISPLAY, 1580); + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._sceneItems.remove(&scene->_screenSlot); - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + scene->_screen.postInit(); + scene->_screen.setup(1580, 1, 1); + scene->_screen.setPosition(Common::Point(124, 108)); + scene->_screen.fixPriority(10); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - if (R2_GLOBALS._rimLocation == 1201) { - scene->_stripManager.start(548, this); - } else if (R2_GLOBALS.getFlag(66)) { - return false; - } else { - scene->_stripManager.start(546, this); - } - } else { - if (R2_GLOBALS._rimLocation == 1201) { - scene->_stripManager.start(549, this); - } else if (R2_GLOBALS.getFlag(66)) { - return false; - } else { - scene->_stripManager.start(547, this); - } + if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) == 1580) + scene->_screen.setDetails(1550, 14, -1, -1, 5, &scene->_joystick); + else + scene->_screen.setDetails(1550, 14, -1, -1, 2, (SceneItem *)NULL); + + scene->_screenDisplay.postInit(); + scene->_screenDisplay.setup(1580, 3, 1); + scene->_screenDisplay.setPosition(Common::Point(124, 109)); + scene->_screenDisplay.fixPriority(20); + //scene->_field412 = 1; + scene->_sceneMode = 10; + scene->setAction(&scene->_sequenceManager, scene, 1, &R2_GLOBALS._player, NULL); + + return true; } - R2_GLOBALS.setFlag(66); - return true; + return SceneHotspot::startAction(action, event); } -bool Scene1800::Lever::startAction(CursorType action, Event &event) { - if (action != CURSOR_USE) - return SceneActor::startAction(action, event); +bool Scene1580::Joystick::startAction(CursorType action, Event &event) { + if ( (action == CURSOR_USE) && (R2_INVENTORY.getObjectScene(R2_DIAGNOSTICS_DISPLAY) == 1580) + && (R2_INVENTORY.getObjectScene(R2_FUEL_CELL) == 0) && (R2_INVENTORY.getObjectScene(R2_GUIDANCE_MODULE) == 0) + && (R2_INVENTORY.getObjectScene(R2_RADAR_MECHANISM) == 0) && (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) == 0) + && (R2_INVENTORY.getObjectScene(R2_THRUSTER_VALVE) == 0) && (R2_INVENTORY.getObjectScene(R2_IGNITOR) == 0)) { + Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene; + scene->_sceneMode = 31; + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + scene->_stripManager.start(536, scene); + else + scene->_stripManager.start(537, scene); - if (!R2_GLOBALS.getFlag(14)) - return false; + return true; + } - if (R2_GLOBALS._player._characterIndex != R2_QUINN) - return SceneActor::startAction(action, event); + return SceneActor::startAction(action, event); +} - Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene; - R2_GLOBALS._player.disableControl(); +bool Scene1580::Screen::startAction(CursorType action, Event &event) { + if ((action == CURSOR_USE) && (R2_INVENTORY.getObjectScene(R2_BROKEN_DISPLAY) == 1580)) { + Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene; - if (_frame == 1) { - R2_GLOBALS.setFlag(64); - scene->_sceneMode = 1810; - scene->setAction(&scene->_sequenceManager, scene, 1810, &R2_GLOBALS._player, &scene->_lever, &scene->_leftStaircase, &scene->_rightStaircase, NULL); - } else { - R2_GLOBALS.clearFlag(64); - scene->_sceneMode = 1811; - scene->setAction(&scene->_sequenceManager, scene, 1811, &R2_GLOBALS._player, &scene->_lever, &scene->_leftStaircase, &scene->_rightStaircase, NULL); + R2_INVENTORY.setObjectScene(R2_BROKEN_DISPLAY, R2_GLOBALS._player._characterIndex); + scene->_screenSlot.setDetails(Rect(69, 29, 177, 108), 1550, 82, -1, -1, 2, NULL); + scene->_screenDisplay.remove(); + remove(); + return true; } - return true; + + return SceneActor::startAction(action, event); } -bool Scene1800::Doors::startAction(CursorType action, Event &event) { +bool Scene1580::StorageCompartment::startAction(CursorType action, Event &event) { if (action != CURSOR_USE) return SceneActor::startAction(action, event); - Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene; + Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene; - if (R2_GLOBALS._player._characterIndex == R2_SEEKER) { - // Seeker trying to force open the door - R2_GLOBALS._player.disableControl(); - if (scene->_locationMode >= 2) { - if (R2_GLOBALS.getFlag(14)) { - // Allow door to close - scene->_sceneMode = 1809; - scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_doors, NULL); - R2_GLOBALS.clearFlag(14); - } else { - // Force open door - scene->_sceneMode = 1808; - scene->setAction(&scene->_sequenceManager, scene, 1808, &R2_GLOBALS._player, &scene->_doors, NULL); - R2_GLOBALS.setFlag(14); - } - } else { - // Seeker failing to force open doors - scene->_sceneMode = 1813; - // Original was using 1813 in setAction too, but it somewhat broken. - // Seeker goes 2 pixels to high, hiding behind the door - scene->setAction(&scene->_sequenceManager, scene, 1808, &R2_GLOBALS._player, &scene->_doors, NULL); - } - } else if (R2_GLOBALS.getFlag(14)) { - return SceneActor::startAction(action, event); - } else { - // Quinn trying to force open doors - R2_GLOBALS._player.disableControl(); - scene->_sceneMode = 1812; - scene->setAction(&scene->_sequenceManager, scene, 1812, &R2_GLOBALS._player, NULL); - } + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._sceneItems.remove(&scene->_storageCompartment); + scene->_sceneMode = 0; + animate(ANIM_MODE_5, scene); return true; } -bool Scene1800::PassengerDoor::startAction(CursorType action, Event &event) { +bool Scene1580::HatchButton::startAction(CursorType action, Event &event) { if (action != CURSOR_USE) return SceneActor::startAction(action, event); - Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene; + Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene; - if (_position.x < 160) { - if (scene->_leftStaircase._frame == 1) { - return SceneActor::startAction(action, event); - } else { - R2_GLOBALS.setFlag(29); - R2_GLOBALS._player.disableControl(); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - if (R2_GLOBALS.getFlag(14)) { - scene->_sceneMode = 1; - scene->setAction(&scene->_sequenceManager, scene, 1809, &scene->_companion, &scene->_doors, NULL); - R2_GLOBALS.clearFlag(14); - } else { - scene->_sceneMode = 1804; - scene->setAction(&scene->_sequenceManager, scene, 1804, &R2_GLOBALS._player, &scene->_companion, &scene->_leftDoor, NULL); - } - } else { - if (R2_GLOBALS.getFlag(14)) { - scene->_sceneMode = 1; - scene->setAction(&scene->_sequenceManager, scene, 1809, &scene->_doors, NULL); - R2_GLOBALS.clearFlag(14); - } else { - scene->_sceneMode = 1805; - scene->setAction(&scene->_sequenceManager, scene, 1805, &R2_GLOBALS._player, &scene->_companion, &scene->_leftDoor, NULL); - } - } - } - } else if (scene->_leftStaircase._frame == 1) { - return SceneActor::startAction(action, event); - } else { - R2_GLOBALS.clearFlag(29); - R2_GLOBALS._player.disableControl(); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - if (R2_GLOBALS.getFlag(14)) { - scene->_sceneMode = 2; - scene->setAction(&scene->_sequenceManager, scene, 1809, &scene->_companion, &scene->_doors, NULL); - R2_GLOBALS.clearFlag(14); - } else { - scene->_sceneMode = 1806; - scene->setAction(&scene->_sequenceManager, scene, 1806, &R2_GLOBALS._player, &scene->_companion, &scene->_rightDoor, NULL); - } - } else { - if (R2_GLOBALS.getFlag(14)) { - scene->_sceneMode = 2; - scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_doors, NULL); - R2_GLOBALS.clearFlag(14); - } else { - scene->_sceneMode = 1807; - scene->setAction(&scene->_sequenceManager, scene, 1807, &R2_GLOBALS._player, &scene->_companion, &scene->_rightDoor, NULL); - } - } - } + R2_GLOBALS._player.disableControl(); + setFrame(2); + scene->_sceneMode = 20; + scene->setAction(&scene->_sequenceManager, scene, 2, &R2_GLOBALS._player, NULL); return true; } -void Scene1800::SouthExit::changeScene() { - Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene; +bool Scene1580::ThrusterValve::startAction(CursorType action, Event &event) { + Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene; - _enabled = false; - R2_GLOBALS._events.setCursor(CURSOR_WALK); - R2_GLOBALS._player.disableControl(); - if (R2_GLOBALS.getFlag(14)) { - scene->_sceneMode = 3; - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - scene->setAction(&scene->_sequenceManager, scene, 1809, &scene->_companion, &scene->_doors, NULL); - else - scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_doors, NULL); - R2_GLOBALS.clearFlag(14); - } else { - scene->_sceneMode = 1802; - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - scene->setAction(&scene->_sequenceManager, scene, 1802, &R2_GLOBALS._player, &scene->_companion, NULL); - else - scene->setAction(&scene->_sequenceManager, scene, 1803, &R2_GLOBALS._player, &scene->_companion, NULL); + switch (action) { + case CURSOR_USE: + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + R2_INVENTORY.setObjectScene(R2_THRUSTER_VALVE, 1); + remove(); + return true; + } + break; + case R2_COM_SCANNER: + scene->_sceneMode = 30; + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + scene->_stripManager.start(529, scene); + return true; + break; + case R2_COM_SCANNER_2: + scene->_sceneMode = 30; + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + scene->_stripManager.start(527, scene); + return true; + break; + default: + break; } -} - -void Scene1800::postInit(SceneObjectList *OwnerList) { - loadScene(1800); - SceneExt::postInit(); - R2_GLOBALS._sound1.play(116); - _stripManager.addSpeaker(&_quinnSpeaker); - _stripManager.addSpeaker(&_seekerSpeaker); - if (R2_GLOBALS._sceneManager._previousScene == -1) - R2_GLOBALS._rimLocation = 1201; - - // Set the mode based on whether this is the "correct" lift or not - if (R2_GLOBALS._rimLocation == 1201) - _locationMode = 2; - else - _locationMode = 0; - - scalePalette(65, 65, 65); - _southExit.setDetails(Rect(0, 160, 319, 168), EXITCURSOR_S, 1800); - _background.setDetails(Rect(0, 0, 320, 200), -1, -1, -1, -1, 1, NULL); + return SceneActor::startAction(action, event); +} - _lever.postInit(); - _lever.setup(1801, 4, 1); - _lever.setPosition(Common::Point(170, 124)); - _lever.setDetails(1800, 13, 14, 15, 1, (SceneItem *) NULL); +bool Scene1580::Ignitor::startAction(CursorType action, Event &event) { + Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene; - _doors.postInit(); - _doors.setup(1801, 3, 1); - _doors.setPosition(Common::Point(160, 139)); - _doors.setDetails(1800, 6, -1, -1, 1, (SceneItem *) NULL); + switch (action) { + case CURSOR_USE: + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + R2_INVENTORY.setObjectScene(R2_IGNITOR, 1); + remove(); + return true; + } + break; + case R2_COM_SCANNER: + scene->_sceneMode = 30; + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + scene->_stripManager.start(529, scene); + return true; + break; + case R2_COM_SCANNER_2: + scene->_sceneMode = 30; + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + scene->_stripManager.start(527, scene); + return true; + break; + default: + break; + } - _leftDoor.postInit(); - _leftDoor.setup(1800, 1, 1); - _leftDoor.setPosition(Common::Point(110, 78)); - _leftDoor.fixPriority(135); - _leftDoor.setDetails(1800, 20, -1, -1, 1, (SceneItem *) NULL); + return SceneActor::startAction(action, event); +} - _rightDoor.postInit(); - _rightDoor.setup(1800, 2, 1); - _rightDoor.setPosition(Common::Point(209, 78)); - _rightDoor.fixPriority(135); - _rightDoor.setDetails(1800, 20, -1, -1, 1, (SceneItem *) NULL); +void Scene1580::postInit(SceneObjectList *OwnerList) { + loadScene(1580); + R2_GLOBALS._sceneManager._fadeMode = FADEMODE_GRADUAL; + SceneExt::postInit(); - _leftStaircase.postInit(); - if ((_locationMode != 1) && (_locationMode != 3) && (!R2_GLOBALS.getFlag(64))) - _leftStaircase.setup(1801, 2, 1); - else - _leftStaircase.setup(1801, 2, 10); - _leftStaircase.setPosition(Common::Point(76, 142)); - _leftStaircase.setDetails(1800, 3, -1, -1, 1, (SceneItem *) NULL); + _stripManager.setColors(60, 255); + _stripManager.setFontNumber(3); + _stripManager.addSpeaker(&_quinnSpeaker); + _stripManager.addSpeaker(&_seekerSpeaker); - _rightStaircase.postInit(); - if ((_locationMode != 1) && (_locationMode != 3) && (!R2_GLOBALS.getFlag(64))) - _rightStaircase.setup(1801, 1, 1); - else - _rightStaircase.setup(1801, 1, 10); - _rightStaircase.setPosition(Common::Point(243, 142)); - _rightStaircase.setDetails(1800, 3, -1, -1, 1, (SceneItem *) NULL); + _sceneMode = 0; - R2_GLOBALS._player.postInit(); - R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - // Standard Quinn setup - R2_GLOBALS._player.setVisage(1503); - R2_GLOBALS._player._moveDiff = Common::Point(2, 2); + R2_GLOBALS._player.disableControl(); + if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) == 1580) { + _joystick.postInit(); + _joystick.setup(1580, 1, 4); + _joystick.setPosition(Common::Point(159, 163)); + _joystick.setDetails(1550, 78, -1, -1, 1, (SceneItem *) NULL); } else { - // Seeker setup dependent on whether he's holding the doors or not - if (R2_GLOBALS.getFlag(14)) { - R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL); - R2_GLOBALS._player.setObjectWrapper(NULL); - R2_GLOBALS._player.setup(1801, 5, 12); - R2_GLOBALS._player.setPosition(Common::Point(160, 139)); - R2_GLOBALS._walkRegions.disableRegion(9); - _doors.hide(); - } else { - R2_GLOBALS._player.setVisage(1507); - } - R2_GLOBALS._player._moveDiff = Common::Point(4, 2); + _joystickPlug.setDetails(Rect(141, 148, 179, 167), 1550, 79, -1, -1, 1, NULL); } - _companion.postInit(); - _companion.animate(ANIM_MODE_1, NULL); - _companion.setObjectWrapper(new SceneObjectWrapper()); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - if (R2_GLOBALS.getFlag(14)) { - _companion.animate(ANIM_MODE_NONE, NULL); - _companion.setObjectWrapper(NULL); - _companion.setup(1801, 5, 12); + if (R2_INVENTORY.getObjectScene(R2_BROKEN_DISPLAY) == 1580) { + _screen.postInit(); + _screen.setup(1580, 1, 1); + _screen.setPosition(Common::Point(124, 108)); + _screen.fixPriority(10); + _screen.setDetails(1550, 13, -1, -1, 1, (SceneItem *) NULL); - R2_GLOBALS._walkRegions.disableRegion(9); - _doors.hide(); - } else { - _companion.setup(1507, 1, 1); - _companion.setPosition(Common::Point(180, 160)); - } - _companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *) NULL); - _companion._moveDiff = Common::Point(4, 2); + _screenDisplay.postInit(); + _screenDisplay.setup(1580, 1, 3); + _screenDisplay.setPosition(Common::Point(124, 96)); + _screenDisplay.fixPriority(20); + } else if (R2_INVENTORY.getObjectScene(R2_DIAGNOSTICS_DISPLAY) == 1580) { + _screen.postInit(); + _screen.setup(1580, 1, 1); + _screen.setPosition(Common::Point(124, 108)); + _screen.fixPriority(10); + _screen.setDetails(1550, 14, -1, -1, 1, (SceneItem *) NULL); + + _screenDisplay.postInit(); + _screenDisplay.setup(1580, 3, 1); + _screenDisplay.setPosition(Common::Point(124, 109)); + _screenDisplay.fixPriority(20); + + _sceneMode = 10; } else { - _companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *) NULL); - _companion.setVisage(1503); - _companion._moveDiff = Common::Point(2, 2); + _screenSlot.setDetails(Rect(69, 29, 177, 108), 1550, 82, -1, -1, 1, NULL); } - if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1800) { - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - R2_GLOBALS._player.setPosition(Common::Point(114, 150)); - R2_GLOBALS._player.setStrip(5); - if (R2_GLOBALS.getFlag(14)) { - _companion.setPosition(Common::Point(160, 139)); - R2_GLOBALS._walkRegions.disableRegion(8); - } else { - _companion.setPosition(Common::Point(209, 150)); - _companion.setStrip(6); - R2_GLOBALS._walkRegions.disableRegion(8); - } - } else { - if (R2_GLOBALS.getFlag(14)) { - R2_GLOBALS._player.setup(1801, 5, 12); - R2_GLOBALS._player.setPosition(Common::Point(160, 139)); - } else { - R2_GLOBALS._player.setPosition(Common::Point(209, 150)); - R2_GLOBALS._player.setStrip(6); - } - _companion.setPosition(Common::Point(114, 150)); - _companion.setStrip(5); - R2_GLOBALS._walkRegions.disableRegion(10); - R2_GLOBALS._walkRegions.disableRegion(11); - } - } else if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - R2_GLOBALS._player.setPosition(Common::Point(140, 160)); - _companion.setPosition(Common::Point(180, 160)); + _storageCompartment.postInit(); + if (R2_GLOBALS.getFlag(58) == 0) { + _storageCompartment.setup(1580, 5, 1); + _storageCompartment.setDetails(1550, 80, -1, -1, 1, (SceneItem *) NULL); } else { - R2_GLOBALS._player.setPosition(Common::Point(180, 160)); - _companion.setPosition(Common::Point(140, 160)); + _storageCompartment.setup(1580, 5, 6); } - _playerShadow.postInit(); - _playerShadow.fixPriority(10); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - _playerShadow.setVisage(1111); - else - _playerShadow.setVisage(1110); - - _playerShadow._effect = EFFECT_SHADOW_MAP; - _playerShadow._shadowMap = _shadowPaletteMap; - - R2_GLOBALS._player._linkedActor = &_playerShadow; + _storageCompartment.setPosition(Common::Point(216, 108)); + _storageCompartment.fixPriority(100); - _companionShadow.postInit(); - _companionShadow.fixPriority(10); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - _companionShadow.setVisage(1110); - else - _companionShadow.setVisage(1111); + _hatchButton.postInit(); + _hatchButton.setup(1580, 4, 1); + _hatchButton.setPosition(Common::Point(291, 147)); + _hatchButton.fixPriority(100); + _hatchButton.setDetails(1550, 81, -1, -1, 1, (SceneItem *) NULL); - _companionShadow._effect = EFFECT_SHADOW_MAP; - _companionShadow._shadowMap = _shadowPaletteMap; + if (R2_INVENTORY.getObjectScene(R2_THRUSTER_VALVE) == 1580) { + _thrusterValve.postInit(); + _thrusterValve.setup(1580, 6, 2); + _thrusterValve.setPosition(Common::Point(222, 108)); + _thrusterValve.fixPriority(50); + _thrusterValve.setDetails(1550, 32, -1, 34, 1, (SceneItem *) NULL); + } - _companion._linkedActor = &_companionShadow; + if (R2_INVENTORY.getObjectScene(R2_IGNITOR) == 1580) { + _ignitor.postInit(); + _ignitor.setup(1580, 6, 1); + _ignitor.setPosition(Common::Point(195, 108)); + _ignitor.fixPriority(50); + _ignitor.setDetails(1550, 38, -1, 34, 1, (SceneItem *) NULL); + } - R2_GLOBALS._player._characterScene[R2_QUINN] = 1800; - R2_GLOBALS._player._characterScene[R2_SEEKER] = 1800; + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.hide(); + setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); + _background.setDetails(Rect(0, 0, 320, 200), 1550, 50, -1, -1, 1, NULL); +} - _elevatorContents.setDetails(Rect(128, 95, 190, 135), 1800, 10, -1, -1, 1, NULL); - _elevator.setDetails(Rect(95, 3, 223, 135), 1800, 0, -1, -1, 1, NULL); +void Scene1580::signal() { + switch (_sceneMode++) { + case 10: + _screenDisplay.animate(ANIM_MODE_5, this); + break; + case 11: + _screenDisplay.setup(1580, 1, 2); + _screenDisplay.setPosition(Common::Point(124, 94)); - // Original was calling _item3.setDetails(Rect(1800, 11, 24, 23), 25, -1, -1, -1, 1, NULL); - // This is *wrong*. The following statement is a wild guess based on good common sense - _surface.setDetails(11, 1800, 23, 24, 25); - _secBackground.setDetails(Rect(0, 0, 320, 200), 1800, 17, -1, 19, 1, NULL); + if (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) != 0) { + _arrActor[0].postInit(); + _arrActor[0].setup(1580, 2, 1); + _arrActor[0].setPosition(Common::Point(138, 56)); + } - R2_GLOBALS._player.disableControl(); - if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1800) { - if ((R2_GLOBALS.getFlag(14)) && (R2_GLOBALS._player._characterIndex == R2_SEEKER)) { - R2_GLOBALS._player.enableControl(CURSOR_USE); - R2_GLOBALS._player._canWalk = false; - } else { - R2_GLOBALS._player.enableControl(CURSOR_WALK); + if (R2_INVENTORY.getObjectScene(R2_RADAR_MECHANISM) != 0) { + _arrActor[1].postInit(); + _arrActor[1].setup(1580, 2, 2); + _arrActor[1].setPosition(Common::Point(140, 66)); } - } else if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1850) { - if (R2_GLOBALS.getFlag(29)) { - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - _sceneMode = 1814; - setAction(&_sequenceManager, this, 1814, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL); - } else { - _sceneMode = 1815; - setAction(&_sequenceManager, this, 1815, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL); - } - } else if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - _sceneMode = 1816; - setAction(&_sequenceManager, this, 1816, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL); - } else { - _sceneMode = 1817; - setAction(&_sequenceManager, this, 1817, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL); + + if (R2_INVENTORY.getObjectScene(R2_IGNITOR) != 0) { + _arrActor[2].postInit(); + _arrActor[2].setup(1580, 2, 3); + _arrActor[2].setPosition(Common::Point(142, 85)); } - } else if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - _sceneMode = 1800; - setAction(&_sequenceManager, this, 1800, &R2_GLOBALS._player, &_companion, NULL); - } else { - _sceneMode = 1801; - setAction(&_sequenceManager, this, 1801, &R2_GLOBALS._player, &_companion, NULL); - } - R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1800; - R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1800; -} + if (R2_INVENTORY.getObjectScene(R2_THRUSTER_VALVE) != 0) { + _arrActor[3].postInit(); + _arrActor[3].setup(1580, 2, 4); + _arrActor[3].setPosition(Common::Point(142, 92)); + } -void Scene1800::signal() { - switch (_sceneMode) { - case 1: - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - _sceneMode = 1804; - setAction(&_sequenceManager, this, 1804, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL); - } else { - _sceneMode = 1805; - setAction(&_sequenceManager, this, 1805, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL); + if (R2_INVENTORY.getObjectScene(R2_GUIDANCE_MODULE) != 0) { + _arrActor[4].postInit(); + _arrActor[4].setup(1580, 2, 5); + _arrActor[4].setPosition(Common::Point(108, 54)); } - break; - case 2: - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - _sceneMode = 1806; - setAction(&_sequenceManager, this, 1806, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL); - } else { - _sceneMode = 1807; - setAction(&_sequenceManager, this, 1807, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL); + + if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) != 1580) { + _arrActor[5].postInit(); + _arrActor[5].setup(1580, 2, 6); + _arrActor[5].setPosition(Common::Point(110, 64)); } - break; - case 3: - _sceneMode = 1802; - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - setAction(&_sequenceManager, this, 1802, &R2_GLOBALS._player, &_companion, NULL); - else - setAction(&_sequenceManager, this, 1803, &R2_GLOBALS._player, &_companion, NULL); - break; - case 10: - // No break on purpose - case 11: - R2_GLOBALS._player.enableControl(CURSOR_TALK); - break; - case 12: - R2_GLOBALS._player.enableControl(CURSOR_TALK); - R2_GLOBALS._player._canWalk = false; - break; - case 13: - _sceneMode = 14; - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - R2_GLOBALS._player.setup(1801, 7, 1); - R2_GLOBALS._player.animate(ANIM_MODE_8, 0, NULL); - _stripManager.start(550, this); - break; - case 14: - _sceneMode = 15; - R2_GLOBALS._player.disableControl(); - R2_GLOBALS._player.setup(1801, 6, 1); - R2_GLOBALS._player.animate(ANIM_MODE_6, this); - break; - case 15: - R2_GLOBALS._player.setup(1503, 4, 1); - R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); - R2_GLOBALS._player.enableControl(CURSOR_USE); - break; - // Cases 23 and 24 have been added to fix missing hardcoded logic in the original, - // when Seeker tries to open the door - case 23: - _sceneMode = 24; - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - R2_GLOBALS._player.setup(1801, 5, 1); - R2_GLOBALS._player.animate(ANIM_MODE_8, 0, NULL); - _stripManager.start(550, this); - break; - case 24: - R2_GLOBALS._player.disableControl(); - R2_GLOBALS._player.setup(1507, 4, 1); - R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); - R2_GLOBALS._player.enableControl(CURSOR_USE); - _doors.setup(1801, 3, 1); - _doors.setPosition(Common::Point(160, 139)); - _doors.setDetails(1800, 6, -1, -1, 1, (SceneItem *) NULL); - _doors.show(); + if (R2_INVENTORY.getObjectScene(R2_BATTERY) != 0) { + _arrActor[6].postInit(); + _arrActor[6].setup(1580, 2, 7); + _arrActor[6].setPosition(Common::Point(108, 80)); + } - R2_GLOBALS._player._position.y += 2; - R2_GLOBALS._player.show(); - break; - case 1800: - R2_GLOBALS._walkRegions.disableRegion(8); - if (R2_GLOBALS.getFlag(63)) - R2_GLOBALS._player.enableControl(CURSOR_USE); - else { - _sceneMode = 10; - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - _stripManager.start(544, this); + if (R2_INVENTORY.getObjectScene(R2_FUEL_CELL) != 0) { + _arrActor[7].postInit(); + _arrActor[7].setup(1580, 2, 8); + _arrActor[7].setPosition(Common::Point(111, 92)); } + + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = false; break; - case 1801: - R2_GLOBALS._walkRegions.disableRegion(10); - R2_GLOBALS._walkRegions.disableRegion(11); - R2_GLOBALS.setFlag(63); - R2_GLOBALS._player.enableControl(CURSOR_WALK); - break; - case 1802: - R2_GLOBALS.clearFlag(14); - R2_GLOBALS._sceneManager.changeScene(1700); - break; - case 1804: - // No break on purpose - case 1805: - // No break on purpose - case 1806: - // No break on purpose - case 1807: - R2_GLOBALS.clearFlag(14); - R2_GLOBALS._sceneManager.changeScene(1850); - break; - case 1808: - _sceneMode = 12; - R2_GLOBALS._events.setCursor(CURSOR_WALK); - _stripManager.start(553, this); - break; - case 1812: - _sceneMode = 13; - R2_GLOBALS._player.animate(ANIM_MODE_5, this); - break; - // Case 1813 has been added to fix Seeker missing animation in the original game - case 1813: - _sceneMode = 23; - R2_GLOBALS._player.animate(ANIM_MODE_5, this); - break; - case 1814: - // No break on purpose - case 1815: - R2_GLOBALS._walkRegions.disableRegion(10); - R2_GLOBALS._walkRegions.disableRegion(11); - R2_GLOBALS._player.enableControl(); + case 20: + R2_GLOBALS._sceneManager.changeScene(1550); break; - case 1816: - // No break on purpose - case 1817: - R2_GLOBALS._walkRegions.disableRegion(8); - R2_GLOBALS._player.enableControl(); + case 31: + R2_GLOBALS._sceneManager.changeScene(1530); break; default: - R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = false; break; } } -void Scene1800::saveCharacter(int characterIndex) { - if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) - R2_GLOBALS._sound1.fadeOut2(NULL); - - SceneExt::saveCharacter(characterIndex); -} - /*-------------------------------------------------------------------------- - * Scene 1850 - Rim Lift Interior + * Scene 1625 - Miranda being questioned * *--------------------------------------------------------------------------*/ -bool Scene1850::Button::startAction(CursorType action, Event &event) { +bool Scene1625::Wire::startAction(CursorType action, Event &event) { if (action != CURSOR_USE) - return SceneHotspot::startAction(action, event); - - Scene1850 *scene = (Scene1850 *)R2_GLOBALS._sceneManager._scene; + return SceneActor::startAction(action, event); + Scene1625 *scene = (Scene1625 *)R2_GLOBALS._sceneManager._scene; R2_GLOBALS._player.disableControl(); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - scene->_sceneMode = 1852; - if (R2_GLOBALS.getFlag(32)) - scene->setAction(&scene->_sequenceManager1, scene, 1871, &R2_GLOBALS._player, NULL); - else - scene->setAction(&scene->_sequenceManager1, scene, 1852, &R2_GLOBALS._player, NULL); - } else if (R2_GLOBALS.getFlag(30)) { - scene->_seqNumber = 1; - scene->_sceneMode = 1860; - if (R2_GLOBALS.getFlag(32)) - scene->setAction(&scene->_sequenceManager1, scene, 1860, &R2_GLOBALS._player, &scene->_robot, NULL); - else - scene->setAction(&scene->_sequenceManager1, scene, 1859, &R2_GLOBALS._player, &scene->_robot, NULL); + scene->_sceneMode = 1631; + scene->_mirandaMouth.postInit(); + scene->setAction(&scene->_sequenceManager, scene, 1631, &scene->_mirandaMouth, &scene->_wire, NULL); + return true; +} + +Scene1625::Scene1625() { +} + +void Scene1625::synchronize(Serializer &s) { + SceneExt::synchronize(s); +} + +void Scene1625::postInit(SceneObjectList *OwnerList) { + loadScene(1625); + R2_GLOBALS._player._characterIndex = R2_MIRANDA; + SceneExt::postInit(); + + _stripManager.addSpeaker(&_mirandaSpeaker); + _stripManager.addSpeaker(&_tealSpeaker); + _stripManager.addSpeaker(&_soldierSpeaker); - R2_GLOBALS.clearFlag(30); + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.hide(); + + _wire.postInit(); + _wire.setup(1626, 2, 1); + _wire.setPosition(Common::Point(206, 133)); + _wire.setDetails(1625, 0, -1, -1, 1, (SceneItem *) NULL); + + _wristRestraints.postInit(); + _wristRestraints.setup(1625, 8, 1); + _wristRestraints.setPosition(Common::Point(190, 131)); + _wristRestraints.setDetails(1625, 6, -1, 2, 1, (SceneItem *) NULL); + + if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 1625) { + if (!R2_GLOBALS.getFlag(83)) { + _glass.postInit(); + _glass.setup(1626, 4, 1); + _glass.setPosition(Common::Point(96, 166)); + _glass.setDetails(1625, -1, -1, -1, 1, (SceneItem *) NULL); + } + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player._canWalk = false; } else { - scene->_sceneMode = 1853; + _teal.postInit(); + _teal.fixPriority(10); - if (R2_GLOBALS.getFlag(32)) - scene->setAction(&scene->_sequenceManager1, scene, 1872, &R2_GLOBALS._player, NULL); - else - scene->setAction(&scene->_sequenceManager1, scene, 1853, &R2_GLOBALS._player, NULL); + _tealRightArm.postInit(); + + R2_GLOBALS._player.disableControl(); + _sceneMode = 1625; + setAction(&_sequenceManager, this, 1625, &_teal, &_tealRightArm, NULL); } - return true; + R2_GLOBALS._sound1.play(245); + _background.setDetails(Rect(0, 0, 320, 200), 1625, 12, -1, -1, 1, NULL); + R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 1625; + R2_GLOBALS._player._characterScene[R2_MIRANDA] = 1625; } -bool Scene1850::Robot::startAction(CursorType action, Event &event) { - Scene1850 *scene = (Scene1850 *)R2_GLOBALS._sceneManager._scene; - - switch (action) { - case CURSOR_USE: - if ((R2_GLOBALS._player._characterIndex != R2_SEEKER) || R2_GLOBALS.getFlag(33) || R2_GLOBALS.getFlag(30)) - return SceneActor::startAction(action, event); +void Scene1625::remove() { + R2_GLOBALS._sound1.fadeOut2(NULL); + SceneExt::remove(); +} +void Scene1625::signal() { + switch (_sceneMode) { + case 10: R2_GLOBALS._player.disableControl(); - scene->_sceneMode = 1857; + _glass.postInit(); + _glass.setDetails(1625, -1, -1, -1, 2, (SceneItem *) NULL); + _sceneMode = 1626; + setAction(&_sequenceManager, this, 1626, &_tealHead, &_glass, NULL); + break; + case 12: + MessageDialog::show(DONE_MSG, OK_BTN_STRING); + break; + case 14: + _tealHead.postInit(); + _tealHead.setup(1627, 1, 1); + _tealHead.setPosition(Common::Point(68, 68)); + _sceneMode = 99; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _stripManager.start(831, this); + break; + case 99: + R2_GLOBALS._player.disableControl(); + switch (_stripManager._exitMode) { + case 1: + _sceneMode = 1627; + setAction(&_sequenceManager, this, 1627, &_mirandaMouth, &_glass, NULL); + break; + case 2: + _sceneMode = 1629; + setAction(&_sequenceManager, this, 1629, &_tealHead, &_wristRestraints, NULL); + break; + case 4: + R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3150; + R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3150; + R2_GLOBALS._player._characterIndex = R2_QUINN; + R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._player._characterScene[R2_QUINN]); + break; + case 5: + _sceneMode = 1628; + _tealHead.remove(); + setAction(&_sequenceManager, this, 1628, &_mirandaMouth, &_glass, NULL); + break; + case 6: + _glass.postInit(); + _glass.setDetails(1625, -1, -1, -1, 2, (SceneItem *) NULL); + _sceneMode = 1632; + setAction(&_sequenceManager, this, 1632, &_glass, NULL); + break; + case 7: + _sceneMode = 1633; + setAction(&_sequenceManager, this, 1633, &_glass, NULL); + break; + case 8: + _sceneMode = 1635; + setAction(&_sequenceManager, this, 1635, &_mirandaMouth, &_wristRestraints, NULL); + break; + case 9: + _glass.postInit(); + _glass.setDetails(1625, -1, -1, -1, 2, (SceneItem *) NULL); + _sceneMode = 1634; + setAction(&_sequenceManager, this, 1634, &_mirandaMouth, &_wristRestraints, NULL); + break; + case 3: + // No break on purpose + default: + _sceneMode = 1630; + _tealHead.remove(); + setAction(&_sequenceManager, this, 1630, &_teal, &_tealRightArm, NULL); + break; + } + //_field412 = _stripManager._field2E8; + _stripManager._currObj44Id = 0; + break; + case 1625: + _tealHead.postInit(); + _tealHead.setup(1627, 1, 1); + _tealHead.setPosition(Common::Point(68, 68)); + _sceneMode = 10; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _stripManager.start(800, this); + break; + case 1626: + _tealHead.setup(1627, 1, 1); + _tealHead.setPosition(Common::Point(68, 68)); + _tealHead.show(); - if (R2_GLOBALS.getFlag(32)) - scene->setAction(&scene->_sequenceManager1, scene, 1858, &R2_GLOBALS._player, &scene->_robot, NULL); - else - scene->setAction(&scene->_sequenceManager1, scene, 1857, &R2_GLOBALS._player, &scene->_robot, NULL); + _mirandaMouth.postInit(); + _mirandaMouth.setup(1627, 3, 1); + _mirandaMouth.setPosition(Common::Point(196, 65)); - R2_GLOBALS.setFlag(30); - return true; + _sceneMode = 99; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _stripManager.start(832, this); break; - case CURSOR_LOOK: - if (R2_GLOBALS.getFlag(34)) - SceneItem::display(1850, 2, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - else - SceneItem::display(1850, 1, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + case 1627: + _mirandaMouth.setup(1627, 3, 1); + _mirandaMouth.setPosition(Common::Point(196, 65)); + _mirandaMouth.show(); - return true; + _sceneMode = 99; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _stripManager.start(833, this); break; - case R2_AIRBAG: - if (R2_GLOBALS._player._characterIndex == R2_SEEKER) { - if (R2_GLOBALS.getFlag(70)) { - R2_GLOBALS._player.disableControl(); - scene->_sceneMode = 30; + case 1628: + R2_GLOBALS.setFlag(83); + _tealHead.postInit(); + _tealHead.setup(1627, 1, 1); + _tealHead.setPosition(Common::Point(68, 68)); - R2_GLOBALS._events.setCursor(CURSOR_WALK); - scene->_stripManager.start(558, scene); + _mirandaMouth.setup(1627, 3, 1); + _mirandaMouth.setPosition(Common::Point(196, 65)); + _mirandaMouth.show(); - return true; - } else { - return SceneActor::startAction(action, event); - } - } else if (R2_GLOBALS.getFlag(30)) { - R2_GLOBALS._player.disableControl(); - scene->_sceneMode = 1875; - scene->_airbag.postInit(); + _sceneMode = 99; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _stripManager.start(834, this); + break; + case 1629: + _tealHead.setup(1627, 1, 1); + _tealHead.setPosition(Common::Point(68, 68)); + _tealHead.show(); - if (R2_GLOBALS.getFlag(32)) - scene->setAction(&scene->_sequenceManager1, scene, 1876, - &R2_GLOBALS._player, &scene->_airbag, NULL); - else - scene->setAction(&scene->_sequenceManager1, scene, 1875, - &R2_GLOBALS._player, &scene->_airbag, NULL); + _sceneMode = 99; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _stripManager.start(805, this); + break; + case 1630: + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = true; + break; + case 1631: + _mirandaMouth.setup(1627, 3, 1); + _mirandaMouth.setPosition(Common::Point(196, 65)); + _mirandaMouth.show(); - return true; - } else if (R2_GLOBALS.getFlag(70)) { - R2_GLOBALS._player.disableControl(); - scene->_sceneMode = 20; - R2_GLOBALS._events.setCursor(CURSOR_WALK); - scene->_stripManager.start(557, scene); - R2_GLOBALS.setFlag(69); + _wire.remove(); - return true; - } else { - return SceneActor::startAction(action, event); - } + _teal.postInit(); + _teal.fixPriority(10); + + _tealRightArm.postInit(); + + R2_INVENTORY.setObjectScene(R2_SUPERCONDUCTOR_WIRE, 3); + _sceneMode = 14; + + setAction(&_sequenceManager, this, 1625, &_teal, &_tealRightArm, NULL); + break; + case 1632: + _tealHead.setup(1627, 1, 1); + _tealHead.setPosition(Common::Point(68, 68)); + _tealHead.show(); + + _sceneMode = 99; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _stripManager.start(835, this); + break; + case 1633: + _glass.remove(); + _sceneMode = 99; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _stripManager.start(818, this); + break; + case 1634: + _sceneMode = 99; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _stripManager.start(836, this); break; - case R2_REBREATHER_TANK: - if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1850) { - if (R2_GLOBALS.getFlag(30)) - return SceneActor::startAction(action, event); - - R2_GLOBALS._player.disableControl(); - scene->_sceneMode = 1878; - scene->setAction(&scene->_sequenceManager1, scene, 1878, &R2_GLOBALS._player, - &scene->_robot, &scene->_airbag, NULL); - } + case 1635: + _mirandaMouth.setup(1627, 3, 1); + _mirandaMouth.setPosition(Common::Point(196, 65)); + _mirandaMouth.show(); - return true; + _sceneMode = 99; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _stripManager.start(818, this); break; default: - return SceneActor::startAction(action, event); break; } } -bool Scene1850::Door::startAction(CursorType action, Event &event) { - if (action != CURSOR_USE) - return SceneHotspot::startAction(action, event); - - if (R2_GLOBALS.getFlag(32)) { - SceneItem::display(3240, 4, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - return true; - } - - Scene1850 *scene = (Scene1850 *)R2_GLOBALS._sceneManager._scene; - - R2_GLOBALS._player.disableControl(); - if (scene->_sceneMode == 1851) - R2_GLOBALS._player._effect = EFFECT_SHADED; - - if (_position.x >= 160) - R2_GLOBALS.setFlag(29); +void Scene1625::process(Event &event) { + if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE)) + event.handled = true; else - R2_GLOBALS.clearFlag(29); + Scene::process(event); +} - if ((R2_GLOBALS._player._characterIndex == R2_SEEKER) && (R2_GLOBALS.getFlag(30))) { - if (_position.x >= 160) - scene->_seqNumber = 3; - else - scene->_seqNumber = 2; +/*-------------------------------------------------------------------------- + * Scene 1700 - Rim + * + *--------------------------------------------------------------------------*/ - scene->_sceneMode = 1860; +Scene1700::Scene1700() { + _walkFlag = 0; +} - if (R2_GLOBALS.getFlag(32)) { - scene->setAction(&scene->_sequenceManager1, scene, 1860, &R2_GLOBALS._player, &scene->_robot, NULL); - } else { - scene->setAction(&scene->_sequenceManager1, scene, 1859, &R2_GLOBALS._player, &scene->_robot, NULL); - } - } else { - scene->_sceneMode = 11; - if (_position.x >= 160) { - scene->setAction(&scene->_sequenceManager1, scene, 1866, &R2_GLOBALS._player, &scene->_rightDoor, NULL); - } else { - scene->setAction(&scene->_sequenceManager1, scene, 1865, &R2_GLOBALS._player, &scene->_leftDoor, NULL); - } - } +void Scene1700::synchronize(Serializer &s) { + SceneExt::synchronize(s); - return true; + s.syncAsSint16LE(_walkFlag); } -bool Scene1850::DisplayScreen::startAction(CursorType action, Event &event) { - if ((action != CURSOR_USE) || (_position.y != 120)) - return SceneHotspot::startAction(action, event); +bool Scene1700::RimTransport::startAction(CursorType action, Event &event) { + if (action != CURSOR_USE) + return SceneActor::startAction(action, event); - Scene1850 *scene = (Scene1850 *)R2_GLOBALS._sceneManager._scene; + Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene; R2_GLOBALS._player.disableControl(); - scene->_sceneMode = 1881; + scene->_sceneMode = 4; - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - scene->setAction(&scene->_sequenceManager1, scene, 1881, &R2_GLOBALS._player, NULL); - } else { - scene->setAction(&scene->_sequenceManager1, scene, 1880, &R2_GLOBALS._player, NULL); - } + Common::Point pt(271, 90); + PlayerMover *mover = new PlayerMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); return true; } -/*------------------------------------------------------------------------*/ - -Scene1850::Scene1850() { - _sceneMode = 0; - _shadeCountdown = 0; - _shadeDirection = 0; - _shadeChanging = false; - _seqNumber = 0; -} +bool Scene1700::Companion::startAction(CursorType action, Event &event) { + if (action != CURSOR_TALK) + return SceneActor::startAction(action, event); -void Scene1850::synchronize(Serializer &s) { - SceneExt::synchronize(s); + Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene; + scene->_sceneMode = 30; + scene->signal(); - s.syncAsSint16LE(_sceneMode); - s.syncAsSint16LE(_shadeCountdown); - s.syncAsSint16LE(_shadeDirection); - s.syncAsSint16LE(_shadeChanging); - s.syncAsSint16LE(_seqNumber); - s.syncAsSint16LE(_playerDest.x); - s.syncAsSint16LE(_playerDest.y); + return true; } -void Scene1850::postInit(SceneObjectList *OwnerList) { - loadScene(1850); - - if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] != 1850) - R2_GLOBALS.clearFlag(31); - - _palette1.loadPalette(0); - - if (R2_GLOBALS.getFlag(31)) { - _sceneMode = 1850; - g_globals->_scenePalette.loadPalette(1850); - } else { - _sceneMode = 1851; - g_globals->_scenePalette.loadPalette(1851); - } +void Scene1700::NorthExit::changeScene() { + Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene; - SceneExt::postInit(); + R2_GLOBALS._player.disableControl(); + _moving = false; + scene->_sceneMode = 1; - if (R2_GLOBALS._sceneManager._previousScene == 3150) - R2_GLOBALS._sound1.play(116); + Common::Point pt(R2_GLOBALS._player._position.x, 0); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); +} - _stripManager.addSpeaker(&_quinnSpeaker); - _stripManager.addSpeaker(&_seekerSpeaker); +void Scene1700::SouthExit::changeScene() { + Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene; - _shadeChanging = false; - _seqNumber = 0; - _playerDest = Common::Point(0, 0); + R2_GLOBALS._player.disableControl(); + _moving = false; + scene->_sceneMode = 2; - R2_GLOBALS._player._characterScene[R2_QUINN] = 1850; - R2_GLOBALS._player._characterScene[R2_SEEKER] = 1850; + Common::Point pt(R2_GLOBALS._player._position.x, 170); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); +} - _button.setDetails(Rect(101, 56, 111, 63), 1850, 19, -1, -1, 1, NULL); +void Scene1700::WestExit::changeScene() { + Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene; - _leftDoor.postInit(); - _leftDoor.setup(1850, 3, 1); - _leftDoor.setPosition(Common::Point(66, 102)); - _leftDoor.setDetails(1850, 22, -1, -1, 1, (SceneItem *) NULL); + R2_GLOBALS._player.disableControl(); + _moving = false; + scene->_sceneMode = 6; - _rightDoor.postInit(); - _rightDoor.setup(1850, 2, 1); - _rightDoor.setPosition(Common::Point(253, 102)); - _rightDoor.setDetails(1850, 22, -1, -1, 1, (SceneItem *) NULL); + Common::Point pt(0, R2_GLOBALS._player._position.y); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); +} - R2_GLOBALS._walkRegions.disableRegion(1); +void Scene1700::enterArea() { + Rect tmpRect; + R2_GLOBALS._walkRegions.load(1700); - _robot.postInit(); + _slabWest.remove(); + _slabEast.remove(); + _slabShadowWest.remove(); + _slabShadowEast.remove(); + _westPlatform.remove(); + _rimTransportDoor.remove(); + _rimTransport.remove(); - if (R2_GLOBALS.getFlag(34)) { - R2_GLOBALS._walkRegions.disableRegion(2); - _robot.setup(1851, 4, 3); - } else if (R2_GLOBALS.getFlag(30)) { - _robot.setup(1851, 2, 2); - } else { - R2_GLOBALS._walkRegions.disableRegion(5); - if (R2_GLOBALS.getFlag(33)) { - R2_GLOBALS._walkRegions.disableRegion(2); - _robot.setup(1851, 1, 3); - } else { - _robot.setup(1851, 2, 1); - } + if (_sceneMode != 40) { + _ledgeHopper.remove(); + _hatch.remove(); } - _robot.setPosition(Common::Point(219, 130)); - _robot.fixPriority(114); - _robot.setDetails(1850, -1, -1, -1, 1, (SceneItem *) NULL); - - R2_GLOBALS._player.postInit(); + // The original had manual code here to redraw the background manually when + // changing areas within the scene. Which seems to be totally redundant. - _companion.postInit(); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - _companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *) NULL); - } else { - _companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *) NULL); + if (_sceneMode != 40 && R2_GLOBALS._rimLocation == 0) { + // Crashed ledge hopper + _ledgeHopper.postInit(); + _ledgeHopper.setup(1701, 1, 1); + _ledgeHopper.setPosition(Common::Point(220, 137)); + _ledgeHopper.setDetails(1700, 6, -1, -1, 2, (SceneItem *) NULL); + R2_GLOBALS._walkRegions.disableRegion(2); + R2_GLOBALS._walkRegions.disableRegion(12); } - if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1850) { - R2_GLOBALS._player._effect = EFFECT_SHADED2; - _companion._effect = EFFECT_SHADED2; - if (R2_GLOBALS.getFlag(31)) { - R2_GLOBALS._player._shade = 0; - _companion._shade = 0; - } else { - R2_GLOBALS._player._shade = 6; - _companion._shade = 6; - } - - if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1850) { - _airbag.postInit(); - if (R2_GLOBALS.getFlag(34)) { - _airbag.setup(1851, 4, 2); - _airbag.fixPriority(114); - } else { - _airbag.setup(1851, 4, 1); - } - - _airbag.setPosition(Common::Point(179, 113)); - - if ((_robot._strip == 1) && (_robot._frame == 3)){ - _airbag.hide(); - } - - _airbag.setDetails(1850, 6, -1, -1, 1, (SceneItem *) NULL); - } - - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - if (R2_GLOBALS.getFlag(32)) { - R2_GLOBALS._player.setVisage(1511); - _companion.setVisage(1508); + if ((R2_GLOBALS._rimLocation + 2) % 4 == 0) { + // The slabs forming the bottom of the regular rings the rim transport travels through + _slabWest.postInit(); + _slabWest.setup(1700, 1, 1); + _slabWest.setPosition(Common::Point(222, 82)); + _slabWest.setDetails(100, -1, -1, -1, 2, (SceneItem *) NULL); - _screen.postInit(); - _screen.setup(1853, 3, 1); - _screen.setPosition(Common::Point(122, 113)); - _screen.fixPriority(114); - _screen._effect = EFFECT_SHADED2; - _screen.setDetails(1850, 28, -1, -1, 2, (SceneItem *) NULL); + _slabShadowWest.postInit(); + _slabShadowWest.setup(1700, 2, 1); + _slabShadowWest.setPosition(Common::Point(177, 82)); + _slabShadowWest.fixPriority(0); - _helmet.postInit(); - _helmet.setup(1853, 3, 2); - _helmet.setPosition(Common::Point(139, 111)); - _helmet.fixPriority(114); - _helmet._effect = EFFECT_SHADED2; - _helmet.setDetails(1850, 29, -1, -1, 2, (SceneItem *) NULL); + _slabShadowEast.postInit(); + _slabShadowEast.setup(1700, 2, 2); + _slabShadowEast.setPosition(Common::Point(332, 96)); + _slabShadowEast.fixPriority(0); - if (R2_GLOBALS.getFlag(31)) { - _screen._shade = 0; - _helmet._shade = 0; - } else { - _screen._shade = 6; - _helmet._shade = 6; - } - } else { - R2_GLOBALS._player.setVisage(1500); - _companion.setVisage(1505); - } - } else if (R2_GLOBALS.getFlag(32)) { - // Not Quinn, flag 32 - R2_GLOBALS._player.setVisage(1508); - _companion.setVisage(1511); + _slabEast.postInit(); + _slabEast.setup(1700, 1, 2); + _slabEast.setPosition(Common::Point(424, 84)); - _screen.postInit(); - _screen.setup(1853, 3, 1); - _screen.setPosition(Common::Point(122, 113)); - _screen.fixPriority(114); - _screen._effect = EFFECT_SHADED2; - _screen.setDetails(1850, 30, -1, -1, 2, (SceneItem *) NULL); + R2_GLOBALS._walkRegions.disableRegion(11); + } - _helmet.postInit(); - _helmet.setup(1853, 3, 2); - _helmet.setPosition(Common::Point(139, 111)); - _helmet.fixPriority(114); - _helmet._effect = EFFECT_SHADED2; - _helmet.setDetails(1850, 28, -1, -1, 1, (SceneItem *) NULL); + if ((R2_GLOBALS._rimLocation + 399) % 800 == 0) { + // Enable west exit to lift + _westPlatform.postInit(); + _westPlatform.setup(1700, 3, 2); + _westPlatform.setPosition(Common::Point(51, 141)); + _westPlatform.fixPriority(0); + _westPlatform.setDetails(100, -1, -1, -1, 2, (SceneItem *) NULL); - if (R2_GLOBALS.getFlag(31)) { - _screen._shade = 0; - _helmet._shade = 0; - } else { - _screen._shade = 6; - _helmet._shade = 6; - } - } else { - // Not Quinn, nor flag 32 - R2_GLOBALS._player.setVisage(1505); - _companion.setVisage(1500); - } + _westExit._enabled = true; + } else { + R2_GLOBALS._walkRegions.disableRegion(1); + _westExit._enabled = false; + } - R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); - R2_GLOBALS._player.setStrip(3); - R2_GLOBALS._player.setPosition(Common::Point(80, 114)); + if ( ((!R2_GLOBALS.getFlag(15)) && ((R2_GLOBALS._rimLocation == 25) || (R2_GLOBALS._rimLocation == -3))) + || ((R2_GLOBALS.getFlag(15)) && (R2_GLOBALS._rimLocation == R2_GLOBALS._rimTransportLocation)) + ) { + // Rim transport vechile located + R2_GLOBALS._rimTransportLocation = R2_GLOBALS._rimLocation; + if (!R2_GLOBALS.getFlag(15)) + _walkFlag = true; - _companion.animate(ANIM_MODE_1, NULL); - _companion.setObjectWrapper(new SceneObjectWrapper()); - _companion.setStrip(3); - _companion.setPosition(Common::Point(180, 96)); + _rimTransport.postInit(); + _rimTransport.setup(1700, 3, 1); + _rimTransport.setPosition(Common::Point(338, 150)); + _rimTransport.setDetails(1700, 9, -1, -1, 2, (SceneItem *) NULL); + _rimTransport.fixPriority(15); - if (R2_GLOBALS.getFlag(30)) { - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - _companion.animate(ANIM_MODE_NONE, NULL); - _companion.setObjectWrapper(NULL); - if (R2_GLOBALS.getFlag(32)) { - _companion.setup(1854, 1, 3); - } else { - _companion.setup(1854, 2, 3); - } + _rimTransportDoor.postInit(); + _rimTransportDoor.setup(1700, 4, 1); + _rimTransportDoor.setPosition(Common::Point(312, 106)); + _rimTransportDoor.fixPriority(130); + } +} - _companion.setPosition(Common::Point(164, 106)); - } else { - _companion.animate(ANIM_MODE_NONE, NULL); - _companion.setObjectWrapper(NULL); - if (R2_GLOBALS.getFlag(32)) { - R2_GLOBALS._player.setup(1854, 1, 3); - } else { - R2_GLOBALS._player.setup(1854, 2, 3); - } +void Scene1700::postInit(SceneObjectList *OwnerList) { + loadScene(1700); + SceneExt::postInit(); + if (R2_GLOBALS._sceneManager._previousScene == -1) + R2_GLOBALS._sceneManager._previousScene = 1530; - R2_GLOBALS._player.setPosition(Common::Point(164, 106)); - } - } + scalePalette(65, 65, 65); + _stripManager.addSpeaker(&_quinnSpeaker); + _stripManager.addSpeaker(&_seekerSpeaker); - R2_GLOBALS._player.enableControl(); - } else { // R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] != 1850 - R2_GLOBALS._player._effect = EFFECT_SHADED; - _companion._effect = EFFECT_SHADED; - R2_GLOBALS._player.disableControl(); - _sceneMode = 10; - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - if (R2_GLOBALS.getFlag(29)) { - setAction(&_sequenceManager1, this, 1863, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL); - } else { - setAction(&_sequenceManager1, this, 1861, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL); - } - } else { - if (R2_GLOBALS.getFlag(29)) { - setAction(&_sequenceManager1, this, 1864, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL); - } else { - setAction(&_sequenceManager1, this, 1862, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL); - } - } - } + _northExit.setDetails(Rect(94, 0, 319, 12), EXITCURSOR_N, 1700); + _southExit.setDetails(Rect(0, 161, 319, 168), EXITCURSOR_S, 1700); + _westExit.setDetails(Rect(0, 0, 12, 138), EXITCURSOR_W, 1800); + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.setPosition(Common::Point(0, 0)); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - R2_GLOBALS._player._moveDiff = Common::Point(3, 2); - _companion._moveDiff = Common::Point(5, 3); + R2_GLOBALS._player.setVisage(1501); + R2_GLOBALS._player._moveDiff = Common::Point(2, 1); } else { - R2_GLOBALS._player._moveDiff = Common::Point(5, 3); - _companion._moveDiff = Common::Point(3, 2); + R2_GLOBALS._player.setVisage(1506); + R2_GLOBALS._player._moveDiff = Common::Point(3, 1); } - _displayScreen.postInit(); - _displayScreen.setup(1850, 1, 1); + _companion.postInit(); + _companion.animate(ANIM_MODE_1, NULL); + _companion.setObjectWrapper(new SceneObjectWrapper()); - if (R2_GLOBALS.getFlag(62)) { - _displayScreen.setPosition(Common::Point(159, 120)); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + _companion.setVisage(1506); + _companion._moveDiff = Common::Point(3, 1); + _companion.setDetails(9002, 1, -1, -1, 1, (SceneItem *) NULL); } else { - _displayScreen.setPosition(Common::Point(159, 184)); + _companion.setVisage(1501); + _companion._moveDiff = Common::Point(2, 1); + _companion.setDetails(9001, 1, -1, -1, 1, (SceneItem *) NULL); } - _displayScreen.fixPriority(113); + R2_GLOBALS._sound1.play(134); - if (R2_GLOBALS.getFlag(34)) { - _displayScreen.setDetails(1850, 25, -1, -1, 4, &_robot); - } else { - _displayScreen.setDetails(1850, 25, -1, -1, 2, (SceneItem *) NULL); - } + _playerShadow.postInit(); + _playerShadow.fixPriority(10); - if (!R2_GLOBALS.getFlag(62)) { - _displayScreen.hide(); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + _playerShadow.setVisage(1112); + else + _playerShadow.setVisage(1111); + + _playerShadow._effect = EFFECT_SHADOW_MAP; + _playerShadow._shadowMap = _shadowPaletteMap; + R2_GLOBALS._player._linkedActor = &_playerShadow; + + _companionShadow.postInit(); + _companionShadow.fixPriority(10); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + _companionShadow.setVisage(1111); + else + _companionShadow.setVisage(1112); + + _companionShadow._effect = EFFECT_SHADOW_MAP; + _companionShadow._shadowMap = _shadowPaletteMap; + _companion._linkedActor = &_companionShadow; + + R2_GLOBALS._sound1.play(134); + + switch (R2_GLOBALS._sceneManager._previousScene) { + case 1530: + R2_GLOBALS._player._characterIndex = R2_QUINN; + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._player.hide(); + _companion.hide(); + + _hatch.postInit(); + _hatch.hide(); + + _ledgeHopper.postInit(); + _ledgeHopper.setup(1701, 1, 1); + _ledgeHopper.setPosition(Common::Point(220, 137)); + _ledgeHopper.setDetails(1700, 6, -1, -1, 1, (SceneItem *) NULL); + + _playerShadow.hide(); + _companionShadow.hide(); + R2_GLOBALS._events.setCursor(CURSOR_WALK); + _stripManager.start(539, this); + _sceneMode = 40; + break; + case 1750: { + R2_GLOBALS._player.setPosition(Common::Point(282, 121)); + _companion.setPosition(Common::Point(282, 139)); + _sceneMode = 8; + Common::Point pt(262, 101); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + Common::Point pt2(262, 119); + NpcMover *mover2 = new NpcMover(); + _companion.addMover(mover2, &pt2, this); + } + break; + case 1800: { + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._player.setPosition(Common::Point(0, 86)); + _companion.setPosition(Common::Point(0, 64)); + _sceneMode = 7; + R2_GLOBALS._player.setObjectWrapper(NULL); + R2_GLOBALS._player._strip = 1; + Common::Point pt(64, 86); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + _companion.setObjectWrapper(NULL); + _companion._strip = 1; + Common::Point pt2(77, 64); + NpcMover *mover2 = new NpcMover(); + _companion.addMover(mover2, &pt2, NULL); + } + break; + default: + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + R2_GLOBALS._player.setPosition(Common::Point(109, 160)); + _companion.setPosition(Common::Point(156, 160)); + R2_GLOBALS._walkRegions.disableRegion(15); + } else { + R2_GLOBALS._player.setPosition(Common::Point(156, 160)); + _companion.setPosition(Common::Point(109, 160)); + R2_GLOBALS._walkRegions.disableRegion(17); + } + _sceneMode = 50; + setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL); + break; } + R2_GLOBALS._player._characterScene[R2_QUINN] = 1700; + R2_GLOBALS._player._characterScene[R2_SEEKER] = 1700; + R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1700; + R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1700; - _background.setDetails(Rect(0, 0, 320, 200), 1850, 16, -1, -1, 1, NULL); + enterArea(); - R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1850; - R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1850; + _surface.setDetails(1, 1700, 3, -1, -1); + _background.setDetails(Rect(0, 0, 480, 200), 1700, 0, -1, -1, 1, NULL); } -void Scene1850::remove() { - g_globals->_scenePalette.loadPalette(0); - - R2_GLOBALS._scenePalette._palette[765] = 255; - R2_GLOBALS._scenePalette._palette[766] = 255; - R2_GLOBALS._scenePalette._palette[767] = 255; - +void Scene1700::remove() { + R2_GLOBALS._sound1.fadeOut2(NULL); SceneExt::remove(); } -void Scene1850::signal() { +void Scene1700::signal() { switch (_sceneMode) { - case 10: - R2_GLOBALS._player._effect = EFFECT_SHADED2; - R2_GLOBALS._player._shade = 6; - - _companion._effect = EFFECT_SHADED2; - _companion._shade = 6; + case 1: { + _sceneMode = 3; + if (R2_GLOBALS._rimLocation < 2400) + ++R2_GLOBALS._rimLocation; + enterArea(); + R2_GLOBALS._player.setPosition(Common::Point(235 - (((((235 - R2_GLOBALS._player._position.x) * 100) / 103) * 167) / 100), 170)); + Common::Point pt(R2_GLOBALS._player._position.x, 160); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); - R2_GLOBALS._walkRegions.disableRegion(5); + if (R2_GLOBALS._player._position.x < 132) { + _companion.setPosition(Common::Point(156, 170)); + Common::Point pt2(156, 160); + NpcMover *mover2 = new NpcMover(); + _companion.addMover(mover2, &pt2, NULL); + R2_GLOBALS._walkRegions.disableRegion(15); + } else { + _companion.setPosition(Common::Point(109, 170)); + Common::Point pt3(109, 160); + NpcMover *mover3 = new NpcMover(); + _companion.addMover(mover3, &pt3, NULL); + R2_GLOBALS._walkRegions.disableRegion(17); + } + } + break; + case 2: { + _sceneMode = 3; + if (R2_GLOBALS._rimLocation > -2400) + --R2_GLOBALS._rimLocation; + enterArea(); + R2_GLOBALS._player.setPosition(Common::Point(235 - (((((235 - R2_GLOBALS._player._position.x) * 100) / 167) * 103) / 100), 0)); + Common::Point pt(R2_GLOBALS._player._position.x, 10); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); - if (R2_GLOBALS.getFlag(68)) { - R2_GLOBALS._player.enableControl(); + if (R2_GLOBALS._player._position.x >= 171) { + _companion.setPosition(Common::Point(155, 0)); + Common::Point pt2(155, 10); + NpcMover *mover2 = new NpcMover(); + _companion.addMover(mover2, &pt2, NULL); + R2_GLOBALS._walkRegions.disableRegion(15); } else { - R2_GLOBALS.setFlag(68); - _sceneMode = 20; - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - _stripManager.start(554, this); + _companion.setPosition(Common::Point(188, 0)); + Common::Point pt3(188, 10); + NpcMover *mover3 = new NpcMover(); + _companion.addMover(mover3, &pt3, NULL); + R2_GLOBALS._walkRegions.disableRegion(17); + } } break; - case 11: - R2_GLOBALS.clearFlag(30); + case 3: + if (!_walkFlag) { + R2_GLOBALS._player.enableControl(CURSOR_WALK); + } else { + R2_GLOBALS.setFlag(15); + _walkFlag = false; + _sceneMode = 31; + R2_GLOBALS._events.setCursor(CURSOR_WALK); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + _stripManager.start(542, this); + else + _stripManager.start(543, this); + } + break; + case 4: { + _sceneMode = 5; + Common::Point pt(271, 90); + PlayerMover *mover = new PlayerMover(); + _companion.addMover(mover, &pt, NULL); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + setAction(&_sequenceManager, this, 1700, &R2_GLOBALS._player, &_rimTransportDoor, NULL); + else + setAction(&_sequenceManager, this, 1701, &R2_GLOBALS._player, &_rimTransportDoor, NULL); + } + break; + case 5: + R2_GLOBALS._sceneManager.changeScene(1750); + break; + case 6: R2_GLOBALS._sceneManager.changeScene(1800); break; - case 15: - _sceneMode = 16; + case 7: + R2_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + R2_GLOBALS._player._strip = 1; + _companion.setObjectWrapper(new SceneObjectWrapper()); + _companion._strip = 1; + R2_GLOBALS._player.enableControl(CURSOR_WALK); + R2_GLOBALS._walkRegions.disableRegion(14); break; - case 16: - _sceneMode = 1870; - setAction(&_sequenceManager1, this, 1870, &R2_GLOBALS._player, &_companion, - &_screen, &_helmet, NULL); + case 8: + R2_GLOBALS._player._strip = 2; + _companion._strip = 1; + R2_GLOBALS._player.enableControl(CURSOR_WALK); + R2_GLOBALS._walkRegions.disableRegion(12); break; - case 20: + case 30: + _sceneMode = 31; + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + _stripManager.start(540, this); + else + _stripManager.start(541, this); + break; + case 31: R2_GLOBALS._player.enableControl(CURSOR_TALK); break; - case 21: + case 40: R2_GLOBALS._player.disableControl(); - _sceneMode = 1877; - setAction(&_sequenceManager1, this, 1877, &R2_GLOBALS._player, &_companion, - &_robot, NULL); + _sceneMode = 1704; + setAction(&_sequenceManager, this, 1704, &R2_GLOBALS._player, &_companion, + &_hatch, &_ledgeHopper, &_playerShadow, &_companionShadow, NULL); break; - case 30: - R2_GLOBALS._player.disableControl(); - _sceneMode = 1882; - setAction(&_sequenceManager1, this, 1882, &R2_GLOBALS._player, NULL); + case 50: + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + R2_GLOBALS._walkRegions.disableRegion(15); + else + R2_GLOBALS._walkRegions.disableRegion(17); + + R2_GLOBALS._player.enableControl(); break; - case 1852: - // No break on purpose: - case 1853: - if (_sceneMode == 1851) { // At this point, SceneMode can't be equal to 1851 => dead code - R2_GLOBALS.setFlag(31); - _palette1.loadPalette(1850); - _sceneMode = 1850; + case 1704: + R2_GLOBALS._sound1.play(134); + R2_GLOBALS._walkRegions.disableRegion(15); + R2_GLOBALS._walkRegions.disableRegion(2); + R2_GLOBALS._walkRegions.disableRegion(12); + R2_GLOBALS._player.fixPriority(-1); + R2_GLOBALS._player.enableControl(CURSOR_WALK); + break; + default: + R2_GLOBALS._player.enableControl(); + break; + } +} + +/*-------------------------------------------------------------------------- + * Scene 1750 - Maintaiance Vechile + * + *--------------------------------------------------------------------------*/ + +Scene1750::Button::Button() { + _buttonId = 0; +} + +void Scene1750::Button::synchronize(Serializer &s) { + SceneActor::synchronize(s); + + s.syncAsSint16LE(_buttonId); +} + +bool Scene1750::Button::startAction(CursorType action, Event &event) { + if (action != CURSOR_USE) + return SceneActor::startAction(action, event); + + Scene1750 *scene = (Scene1750 *)R2_GLOBALS._sceneManager._scene; + + switch (_buttonId) { + case 1: + // Forward button + show(); + scene->_backwardButton.hide(); + if (scene->_speed < 0) + scene->_speed = -scene->_speed; + scene->_direction = 1; + break; + case 2: + // Backwards button + show(); + scene->_forwardButton.hide(); + if (scene->_speed > 0) + scene->_speed = -scene->_speed; + scene->_direction = -1; + break; + case 3: + // Exit button + if (scene->_rotation->_idxChange == 0) { + show(); + R2_GLOBALS._sceneManager.changeScene(1700); } else { - R2_GLOBALS.clearFlag(31); - _palette1.loadPalette(1851); - _sceneMode = 1851; + scene->_speed = 0; + scene->_speedSlider._moveRate = 20; + scene->_forwardButton._moveDiff.y = 1; + Common::Point pt(286, 143); + NpcMover *mover = new NpcMover(); + scene->_speedSlider.addMover(mover, &pt, NULL); } + default: + break; + } - _shadeChanging = true; - if (R2_GLOBALS.getFlag(30)) { - _displayScreen.setAction(&_sequenceManager2, NULL, 1867, &_displayScreen, NULL); - } else if (R2_GLOBALS.getFlag(34)) { - if (R2_GLOBALS.getFlag(62)) { - R2_GLOBALS.clearFlag(62); - _displayScreen.setAction(&_sequenceManager2, this, 1851, &_displayScreen, NULL); - } else { - R2_GLOBALS.setFlag(62); - _displayScreen.setAction(&_sequenceManager2, this, 1850, &_displayScreen, NULL); - } - } else if (R2_GLOBALS.getFlag(33)) { - R2_GLOBALS.setFlag(62); - R2_GLOBALS.setFlag(34); - R2_GLOBALS._walkRegions.disableRegion(2); + return true; +} - _airbag.postInit(); - _airbag.setDetails(1850, 6, -1, -1, 5, &_robot); +/*------------------------------------------------------------------------*/ - _sceneMode = 1879; +Scene1750::SpeedSlider::SpeedSlider() { + _incrAmount = 0; + _xp = 0; + _ys = 0; + _height = 0; + _thumbHeight = 0; + _mouseDown = false; +} - _displayScreen.setAction(&_sequenceManager2, this, 1879, &_robot, - &_displayScreen, &_airbag, NULL); - } else { - _displayScreen.setAction(&_sequenceManager2, NULL, 1867, &_displayScreen, NULL); - } +void Scene1750::SpeedSlider::synchronize(Serializer &s) { + SceneActor::synchronize(s); - if (R2_GLOBALS.getFlag(34)) - R2_GLOBALS._scenePalette.addFader(_palette1._palette, 256, 5, NULL); - else - R2_GLOBALS._scenePalette.addFader(_palette1._palette, 256, 5, this); + s.syncAsSint16LE(_incrAmount); + s.syncAsSint16LE(_xp); + s.syncAsSint16LE(_ys); + s.syncAsSint16LE(_height); + s.syncAsSint16LE(_thumbHeight); + s.syncAsSint16LE(_mouseDown); +} - if (_sceneMode == 1851) - _shadeDirection = -20; - else - _shadeDirection = 20; +void Scene1750::SpeedSlider::setupSlider(int incrAmount, int xp, int ys, int height, int thumbHeight) { + _mouseDown = false; + _incrAmount = incrAmount; + _xp = xp; + _ys = ys; + _height = height; + _thumbHeight = thumbHeight; - _shadeCountdown = 20; + postInit(); + setup(1750, 1, 1); + fixPriority(255); + setPosition(Common::Point(_xp, _ys + ((_height * (incrAmount - 1)) / (_thumbHeight - 1)))); +} - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - if (_sceneMode == 1879) - _sceneMode = 1854; +void Scene1750::SpeedSlider::calculateSlider() { + Scene1750 *scene = (Scene1750 *)R2_GLOBALS._sceneManager._scene; - if (R2_GLOBALS.getFlag(32)) { - setAction(&_sequenceManager1, NULL, 1873, &R2_GLOBALS._player, NULL); - } else { - setAction(&_sequenceManager1, NULL, 1854, &R2_GLOBALS._player, NULL); - } - } else { - if (_sceneMode == 1879) - _sceneMode = 1855; + int tmpVar = (_height / (_thumbHeight - 1)) / 2; + int tmpVar2 = ((_position.y - _ys + tmpVar) * _thumbHeight) / (_height + 2 * tmpVar); - if (R2_GLOBALS.getFlag(32)) { - setAction(&_sequenceManager1, NULL, 1874, &R2_GLOBALS._player, NULL); - } else { - setAction(&_sequenceManager1, NULL, 1855, &R2_GLOBALS._player, NULL); - } - } - break; - case 1857: - if (R2_GLOBALS.getFlag(69)) { - R2_GLOBALS._player.enableControl(); - R2_GLOBALS._player._canWalk = false; + setPosition(Common::Point(_xp, _ys + ((_height * tmpVar2) / (_thumbHeight - 1)))); + scene->_speed = scene->_direction * tmpVar2; +} + +void Scene1750::SpeedSlider::process(Event &event) { + if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE) && + (_bounds.contains(event.mousePos))) { + _mouseDown = true; + event.eventType = EVENT_NONE; + } + + if ((event.eventType == EVENT_BUTTON_UP) && _mouseDown) { + _mouseDown = false; + event.handled = true; + addMover(NULL); + calculateSlider(); + } + + if (_mouseDown) { + event.handled = true; + if (event.mousePos.y >= _ys) { + if (_ys + _height >= event.mousePos.y) + setPosition(Common::Point(_xp, event.mousePos.y)); + else + setPosition(Common::Point(_xp, _ys + _height)); } else { - _sceneMode = 1858; - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - _stripManager.start(555, this); - R2_GLOBALS.setFlag(69); + setPosition(Common::Point(_xp, _ys)); } - break; - case 1858: - R2_GLOBALS._player.disableControl(); - _sceneMode = 1859; - setAction(&_sequenceManager1, this, 1859, &R2_GLOBALS._player, &_robot, NULL); - R2_GLOBALS.clearFlag(30); - break; - case 1859: - R2_GLOBALS.setFlag(70); - _sceneMode = 20; - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - _stripManager.start(575, this); - break; - case 1860: - if (_playerDest.x != 0) { - R2_GLOBALS._player.enableControl(); + } +} - PlayerMover *mover = new PlayerMover(); - R2_GLOBALS._player.addMover(mover, &_playerDest, this); +bool Scene1750::SpeedSlider::startAction(CursorType action, Event &event) { + if (action == CURSOR_USE) + return SceneActor::startAction(action, event); - _playerDest = Common::Point(0, 0); - } + return false; +} - switch (_seqNumber) { - case 1: - _sceneMode = 1853; - if (R2_GLOBALS.getFlag(32)) { - setAction(&_sequenceManager1, this, 1872, &R2_GLOBALS._player, NULL); - } else { - setAction(&_sequenceManager1, this, 1853, &R2_GLOBALS._player, NULL); - } - break; - case 2: - _sceneMode = 11; - setAction(&_sequenceManager1, this, 1865, &R2_GLOBALS._player, &_leftDoor, NULL); - break; - case 3: - _sceneMode = 11; - setAction(&_sequenceManager1, this, 1866, &R2_GLOBALS._player, &_rightDoor, NULL); - break; - default: - break; - } +/*------------------------------------------------------------------------*/ - _seqNumber = 0; - break; - case 1870: - R2_GLOBALS._walkRegions.disableRegion(5); - R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 1); - R2_GLOBALS.setFlag(32); - R2_GLOBALS._player.enableControl(CURSOR_WALK); - break; - case 1875: - R2_INVENTORY.setObjectScene(R2_AIRBAG, 1850); - _sceneMode = 21; - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - _stripManager.start(561, this); - break; - case 1877: - _screen.postInit(); - _screen._effect = EFFECT_SHADED2; +Scene1750::Scene1750() { + _direction = 0; + _speedCurrent = 0; + _speed = 0; + _speedDelta = 0; + _rotationSegment = 0; + _rotationSegCurrent = 0; + _newRotation = 0; - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - _screen.setDetails(1850, 28, -1, -1, 2, (SceneItem *)NULL); - } else { - _screen.setDetails(1850, 30, -1, -1, 2, (SceneItem *)NULL); - } + _rotation = nullptr; +} - _helmet.postInit(); - _helmet._effect = EFFECT_SHADED2; +void Scene1750::synchronize(Serializer &s) { + SceneExt::synchronize(s); + SYNC_POINTER(_rotation); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - _helmet.setDetails(1850, 29, -1, -1, 2, (SceneItem *)NULL); - } else { - _helmet.setDetails(1850, 28, -1, -1, 2, (SceneItem *)NULL); - } + s.syncAsSint16LE(_direction); + s.syncAsSint16LE(_speedCurrent); + s.syncAsSint16LE(_speed); + s.syncAsSint16LE(_speedDelta); + s.syncAsSint16LE(_rotationSegment); + s.syncAsSint16LE(_rotationSegCurrent); + s.syncAsSint16LE(_newRotation); +} - if (R2_GLOBALS.getFlag(31)) { - _screen._shade = 0; - _helmet._shade = 0; - } else { - _screen._shade = 6; - _helmet._shade = 6; - } +void Scene1750::postInit(SceneObjectList *OwnerList) { + loadScene(1750); + R2_GLOBALS._sound1.play(115); + R2_GLOBALS._uiElements._active = false; - R2_GLOBALS.clearFlag(30); - _sceneMode = 15; - setAction(&_sequenceManager1, this, 1869, &R2_GLOBALS._player, &_screen, NULL); - _companion.setAction(&_sequenceManager2, this, 1868, &_companion, &_helmet, NULL); - break; - case 1878: - R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 1850); - R2_GLOBALS.setFlag(33); - R2_GLOBALS._walkRegions.disableRegion(2); - R2_GLOBALS._player.enableControl(); + SceneExt::postInit(); + R2_GLOBALS._interfaceY = SCREEN_HEIGHT; + + R2_GLOBALS._player._characterScene[R2_QUINN] = 1750; + R2_GLOBALS._player._characterScene[R2_SEEKER] = 1750; + R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1750; + R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1750; + + _rotation = R2_GLOBALS._scenePalette.addRotation(224, 254, 1); + _rotation->setDelay(0); + _rotation->_idxChange = 0; + _rotation->_countdown = 2; + + switch ((R2_GLOBALS._rimLocation + 2) % 4) { + case 0: + _rotation->_currIndex = 247; break; - case 1879: - R2_GLOBALS._player.enableControl(); + case 1: + _rotation->_currIndex = 235; break; - case 1881: - R2_GLOBALS._sceneManager.changeScene(1875); + case 2: + _rotation->_currIndex = 239; break; - case 1882: - R2_INVENTORY.setObjectScene(R2_AIRBAG, 1); - R2_GLOBALS._player.enableControl(); + case 3: + _rotation->_currIndex = 243; break; default: - R2_GLOBALS._player.enableControl(); break; } -} -void Scene1850::process(Event &event) { - if ( (event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_WALK) - && (R2_GLOBALS._player._characterIndex == R2_SEEKER) && (R2_GLOBALS.getFlag(30))) { - _playerDest = event.mousePos; - R2_GLOBALS._player.disableControl(); - _sceneMode = 1860; - if (R2_GLOBALS.getFlag(32)) { - setAction(&_sequenceManager1, this, 1860, &R2_GLOBALS._player, &_robot, NULL); - } else { - setAction(&_sequenceManager1, this, 1859, &R2_GLOBALS._player, &_robot, NULL); - } - R2_GLOBALS.clearFlag(30); - event.handled = true; + byte tmpPal[768]; + + for (int i = 224; i < 255; i++) { + int tmpIndex = _rotation->_currIndex - 224; + if (tmpIndex > 254) + tmpIndex -= 31; + tmpPal[3 * i] = R2_GLOBALS._scenePalette._palette[3 * tmpIndex]; + tmpPal[(3 * i) + 1] = R2_GLOBALS._scenePalette._palette[(3 * tmpIndex) + 1]; + tmpPal[(3 * i) + 2] = R2_GLOBALS._scenePalette._palette[(3 * tmpIndex) + 2]; } - Scene::process(event); -} + for (int i = 224; i < 255; i++) { + R2_GLOBALS._scenePalette._palette[3 * i] = tmpPal[3 * i]; + R2_GLOBALS._scenePalette._palette[(3 * i) + 1] = tmpPal[(3 * i) + 1]; + R2_GLOBALS._scenePalette._palette[(3 * i) + 2] = tmpPal[(3 * i) + 2]; + } -void Scene1850::dispatch() { - if (_shadeChanging) { - _shadeCountdown--; - if (_shadeCountdown == 0) - _shadeChanging = false; + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.hide(); + R2_GLOBALS._player.enableControl(); - if (_shadeDirection >= 0) { - R2_GLOBALS._player._shade = (_shadeCountdown * 6) / _shadeDirection; - } else { - R2_GLOBALS._player._shade = ((_shadeCountdown * 6) / _shadeDirection) + 6; - } - R2_GLOBALS._player._flags |= OBJFLAG_PANES; + _radarSweep.postInit(); + _radarSweep.setup(1750, 3, 1); + _radarSweep.setPosition(Common::Point(49, 185)); + _radarSweep.fixPriority(7); + _radarSweep.setDetails(1750, 30, -1, -1, 1, (SceneItem *) NULL); - _companion._shade = R2_GLOBALS._player._shade; - _companion._flags |= OBJFLAG_PANES; + _scannerIcon.postInit(); + _scannerIcon.setup(1750, 2, 1); + _scannerIcon.setPosition(Common::Point(35, ((_rotation->_currIndex - 218) % 4) + ((R2_GLOBALS._rimLocation % 800) * 4) - 1440)); + _scannerIcon.fixPriority(8); - _screen._shade = R2_GLOBALS._player._shade; - _screen._flags |= OBJFLAG_PANES; + _redLights.postInit(); + _redLights.setup(1750, 1, 4); - _helmet._shade = R2_GLOBALS._player._shade; - _helmet._flags |= OBJFLAG_PANES; - } + int tmpVar = ABS(_scannerIcon._position.y - 158) / 100; - if (R2_GLOBALS.getFlag(32)) { - _screen.setPosition(Common::Point(_displayScreen._position.x - 37, _displayScreen._position.y - 71)); - _helmet.setPosition(Common::Point(_displayScreen._position.x - 20, _displayScreen._position.y - 73)); - } + if (tmpVar >= 8) + _redLights.hide(); + else if (_scannerIcon._position.y <= 158) + _redLights.setPosition(Common::Point(137, (tmpVar * 7) + 122)); + else + _redLights.setPosition(Common::Point(148, (tmpVar * 7) + 122)); - if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1850) { - _airbag.setPosition(Common::Point(_displayScreen._position.x + 20, _displayScreen._position.y - 71)); - } + _speedSlider.setupSlider(1, 286, 143, 41, 15); + _speedSlider.setDetails(1750, 24, 1, -1, 1, (SceneItem *) NULL); - Scene::dispatch(); -} + _forwardButton.postInit(); + _forwardButton._buttonId = 1; + _forwardButton.setup(1750, 1, 2); + _forwardButton.setPosition(Common::Point(192, 140)); + _forwardButton.setDetails(1750, 18, 1, -1, 1, (SceneItem *) NULL); -/*-------------------------------------------------------------------------- - * Scene 1875 - Rim Lift Computer - * - *--------------------------------------------------------------------------*/ + _backwardButton.postInit(); + _backwardButton._buttonId = 2; + _backwardButton.setup(1750, 1, 3); + _backwardButton.setPosition(Common::Point(192, 163)); + _backwardButton.setDetails(1750, 18, 1, -1, 1, (SceneItem *) NULL); + _backwardButton.hide(); -Scene1875::Button::Button() { - _buttonId = 0; - _buttonDown = false; + _exitButton.postInit(); + _exitButton._buttonId = 3; + _exitButton.setup(1750, 1, 5); + _exitButton.setPosition(Common::Point(230, 183)); + _exitButton.setDetails(1750, 27, 1, -1, 1, (SceneItem *) NULL); + + _direction = 1; // Forward by default + _speedDelta = 0; + _speedCurrent = 0; + _speed = 0; + _rotationSegment = ((_rotation->_currIndex - 218) / 4) % 4; + + _redLightsDescr.setDetails(Rect(129, 112, 155, 175), 1750, 21, -1, -1, 1, NULL); + _greenLights.setDetails(Rect(93, 122, 126, 172), 1750, 15, -1, -1, 1, NULL); + _frontView.setDetails(Rect(3, 3, 157, 99), 1750, 9, -1, -1, 1, NULL); + _rearView.setDetails(Rect(162, 3, 316, 99), 1750, 12, -1, -1, 1, NULL); + _background.setDetails(Rect(0, 0, 320, 200), 1750, 6, 1, -1, 1, NULL); } -void Scene1875::Button::synchronize(Serializer &s) { - SceneActor::synchronize(s); +void Scene1750::remove() { + if (R2_GLOBALS._rimLocation == 2400) + R2_GLOBALS._rimLocation = 2399; - s.syncAsSint16LE(_buttonId); - s.syncAsSint16LE(_buttonDown); + if (R2_GLOBALS._rimLocation == -2400) + R2_GLOBALS._rimLocation = -2399; + + R2_GLOBALS._rimTransportLocation = R2_GLOBALS._rimLocation; + + SceneExt::remove(); + R2_GLOBALS._sound1.fadeOut2(NULL); + R2_GLOBALS._uiElements._active = true; } -void Scene1875::Button::doButtonPress() { - Scene1875 *scene = (Scene1875 *)R2_GLOBALS._sceneManager._scene; +void Scene1750::signal() { + R2_GLOBALS._player.enableControl(); +} - R2_GLOBALS._sound1.play(227); +void Scene1750::process(Event &event) { + Scene::process(event); + if (!event.handled) + _speedSlider.process(event); +} - int newFrameNumber; - switch (_buttonId) { - case 3: - if ((scene->_map._frame == 1) && (scene->_button1._strip == 2)) { - R2_GLOBALS._player.disableControl(); - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - scene->_sceneMode = 10; - scene->_stripManager.start(576, scene); - } else { - R2_GLOBALS._player.disableControl(); - scene->_sceneMode = 1890; - scene->_rimPosition.postInit(); - scene->setAction(&scene->_sequenceManager, scene, 1890, &scene->_rimPosition, NULL); +void Scene1750::dispatch() { + if (_rotation) { + if (!_speedDelta && (_speed != _speedCurrent)) { + if (_speedCurrent >= _speed) + --_speedCurrent; + else + ++_speedCurrent; + + _speedDelta = 21 - ABS(_speedCurrent); } - break; - case 4: - newFrameNumber = scene->_map._frame + 1; - if (newFrameNumber > 6) - newFrameNumber = 1; - scene->_map.setFrame(newFrameNumber); - break; - case 5: - newFrameNumber = scene->_map._frame - 1; - if (newFrameNumber < 1) - newFrameNumber = 6; - scene->_map.setFrame(newFrameNumber); - break; - default: - break; - } -} -void Scene1875::Button::initButton(int buttonId) { - postInit(); - _buttonId = buttonId; - _buttonDown = false; - setVisage(1855); + if (_speedDelta == 1) { + if (_speedCurrent == 0) { + _radarSweep.show(); + _rotation->_idxChange = 0; + } else { + if (_rotation->_idxChange == 0) + _radarSweep.hide(); - if (_buttonId == 1) - setStrip(2); - else - setStrip(1); + if (_speedCurrent < -12) { + _rotation->setDelay(15 - ABS(_speedCurrent)); + _rotation->_idxChange = -2; + } else if (_speedCurrent < 0) { + _rotation->setDelay(10 - ABS(_speedCurrent)); + _rotation->_idxChange = -1; + } else if (_speedCurrent < 11) { + _rotation->setDelay(10 - _speedCurrent); + _rotation->_idxChange = 1; + } else { + _rotation->setDelay(15 - _speedCurrent); + _rotation->_idxChange = 2; + } + } + } - setFrame(_buttonId); - switch (_buttonId) { - case 1: - setPosition(Common::Point(20, 144)); - break; - case 2: - setPosition(Common::Point(82, 144)); - break; - case 3: - setPosition(Common::Point(136, 144)); - break; - case 4: - setPosition(Common::Point(237, 144)); - break; - case 5: - setPosition(Common::Point(299, 144)); - break; - default: - break; - } + if (_speedDelta) + --_speedDelta; - setDetails(1875, 6, 1, -1, 2, (SceneItem *) NULL); -} + _rotationSegCurrent = _rotationSegment; + _rotationSegment = ((_rotation->_currIndex - 218) / 4) % 4; -void Scene1875::Button::process(Event &event) { - if (!R2_GLOBALS._player._uiEnabled || event.handled) - return; + if ((_rotationSegCurrent + 1) == _rotationSegment || (_rotationSegCurrent - 3) == _rotationSegment) { + if (R2_GLOBALS._rimLocation < 2400) { + ++R2_GLOBALS._rimLocation; + } + } - Scene1875 *scene = (Scene1875 *)R2_GLOBALS._sceneManager._scene; + if ((_rotationSegCurrent - 1) == _rotationSegment || (_rotationSegCurrent + 3) == _rotationSegment) { + if (R2_GLOBALS._rimLocation > -2400) { + --R2_GLOBALS._rimLocation; + } + } - if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE) - && (_bounds.contains(event.mousePos)) && !_buttonDown) { - setStrip(2); - switch (_buttonId) { - case 1: - R2_GLOBALS._sound2.play(227); - scene->_button2.setStrip(1); - break; - case 2: - R2_GLOBALS._sound2.play(227); - scene->_button1.setStrip(1); - break; - default: - break; + if (_rotation->_currIndex != _newRotation) { + // Handle setting the position of the lift icon in the scanner display + _newRotation = _rotation->_currIndex; + _scannerIcon.setPosition(Common::Point(35, ((_rotation->_currIndex - 218) % 4) + + ((R2_GLOBALS._rimLocation % 800) * 4) - 1440)); } - _buttonDown = true; - event.handled = true; } - if ((event.eventType == EVENT_BUTTON_UP) && _buttonDown) { - if ((_buttonId == 3) || (_buttonId == 4) || (_buttonId == 5)) { - setStrip(1); - doButtonPress(); - } - _buttonDown = false; - event.handled = true; + int v = ABS(_scannerIcon._position.y - 158) / 100; + if (v < 8) { + // Show how close the user is to the lift on the second column of lights + _redLights.show(); + _redLights.setPosition(Common::Point((_scannerIcon._position.y <= 158) ? 137 : 148, + v * 7 + 122)); + } else { + _redLights.hide(); } } -void Scene1875::postInit(SceneObjectList *OwnerList) { - loadScene(1875); - SceneExt::postInit(); +/*-------------------------------------------------------------------------- + * Scene 1800 - Rim Lift Exterior + * + *--------------------------------------------------------------------------*/ - R2_GLOBALS._player._characterScene[R2_QUINN] = 1875; - R2_GLOBALS._player._characterScene[R2_SEEKER] = 1875; +Scene1800::Scene1800() { + _locationMode = 0; +} - _stripManager.addSpeaker(&_quinnSpeaker); - _stripManager.addSpeaker(&_seekerSpeaker); +void Scene1800::synchronize(Serializer &s) { + SceneExt::synchronize(s); - _button1.initButton(1); - _button2.initButton(2); - _button3.initButton(3); - _button4.initButton(4); - _button5.initButton(5); + s.syncAsSint16LE(_locationMode); +} - _map.postInit(); - _map.setup(1855, 4, 1); - _map.setPosition(Common::Point(160, 116)); +bool Scene1800::Background::startAction(CursorType action, Event &event) { + if ((action != R2_COM_SCANNER) && (action != R2_COM_SCANNER_2)) + return false; - R2_GLOBALS._player.postInit(); - R2_GLOBALS._player.hide(); + Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene; - if (R2_GLOBALS._sceneManager._previousScene == 1625) { - R2_GLOBALS._sound1.play(122); - R2_GLOBALS._player.disableControl(); - _sceneMode = 11; - _rimPosition.postInit(); - setAction(&_sequenceManager, this, 1892, &_rimPosition, NULL); + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + if (R2_GLOBALS._rimLocation == 1201) { + scene->_stripManager.start(548, this); + } else if (R2_GLOBALS.getFlag(66)) { + return false; + } else { + scene->_stripManager.start(546, this); + } } else { - if (R2_GLOBALS._sceneManager._previousScene == 3150) { - R2_GLOBALS._sound1.play(116); + if (R2_GLOBALS._rimLocation == 1201) { + scene->_stripManager.start(549, this); + } else if (R2_GLOBALS.getFlag(66)) { + return false; + } else { + scene->_stripManager.start(547, this); } - - R2_GLOBALS._player.enableControl(); - R2_GLOBALS._player._canWalk = false; } - _screen.setDetails(Rect(43, 14, 275, 122), 1875, 9, 1, -1, 1, NULL); - _background.setDetails(Rect(0, 0, 320, 200), 1875, 3, -1, -1, 1, NULL); + R2_GLOBALS.setFlag(66); + return true; +} - R2_GLOBALS._player._characterScene[R2_QUINN] = 1875; - R2_GLOBALS._player._characterScene[R2_SEEKER] = 1875; - R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1875; - R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1875; +bool Scene1800::Lever::startAction(CursorType action, Event &event) { + if (action != CURSOR_USE) + return SceneActor::startAction(action, event); + + if (!R2_GLOBALS.getFlag(14)) + return false; + + if (R2_GLOBALS._player._characterIndex != R2_QUINN) + return SceneActor::startAction(action, event); + + Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene; + R2_GLOBALS._player.disableControl(); + + if (_frame == 1) { + R2_GLOBALS.setFlag(64); + scene->_sceneMode = 1810; + scene->setAction(&scene->_sequenceManager, scene, 1810, &R2_GLOBALS._player, &scene->_lever, &scene->_leftStaircase, &scene->_rightStaircase, NULL); + } else { + R2_GLOBALS.clearFlag(64); + scene->_sceneMode = 1811; + scene->setAction(&scene->_sequenceManager, scene, 1811, &R2_GLOBALS._player, &scene->_lever, &scene->_leftStaircase, &scene->_rightStaircase, NULL); + } + return true; } -void Scene1875::signal() { - switch (_sceneMode) { - case 10: +bool Scene1800::Doors::startAction(CursorType action, Event &event) { + if (action != CURSOR_USE) + return SceneActor::startAction(action, event); + + Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene; + + if (R2_GLOBALS._player._characterIndex == R2_SEEKER) { + // Seeker trying to force open the door R2_GLOBALS._player.disableControl(); - _sceneMode = 1891; - _rimPosition.postInit(); - setAction(&_sequenceManager, this, 1891, &_rimPosition, NULL); - break; - case 11: - R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); - _sceneMode = 1892; - _stripManager.start(577, this); - break; - case 1890: - _rimPosition.remove(); - R2_GLOBALS._player.enableControl(); - R2_GLOBALS._player._canWalk = false; - break; - case 1891: + if (scene->_locationMode >= 2) { + if (R2_GLOBALS.getFlag(14)) { + // Allow door to close + scene->_sceneMode = 1809; + scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_doors, NULL); + R2_GLOBALS.clearFlag(14); + } else { + // Force open door + scene->_sceneMode = 1808; + scene->setAction(&scene->_sequenceManager, scene, 1808, &R2_GLOBALS._player, &scene->_doors, NULL); + R2_GLOBALS.setFlag(14); + } + } else { + // Seeker failing to force open doors + scene->_sceneMode = 1813; + // Original was using 1813 in setAction too, but it somewhat broken. + // Seeker goes 2 pixels to high, hiding behind the door + scene->setAction(&scene->_sequenceManager, scene, 1808, &R2_GLOBALS._player, &scene->_doors, NULL); + } + } else if (R2_GLOBALS.getFlag(14)) { + return SceneActor::startAction(action, event); + } else { + // Quinn trying to force open doors R2_GLOBALS._player.disableControl(); - R2_GLOBALS._sceneManager.changeScene(1625); - break; - case 1892: + scene->_sceneMode = 1812; + scene->setAction(&scene->_sequenceManager, scene, 1812, &R2_GLOBALS._player, NULL); + } + + return true; +} + +bool Scene1800::PassengerDoor::startAction(CursorType action, Event &event) { + if (action != CURSOR_USE) + return SceneActor::startAction(action, event); + + Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene; + + if (_position.x < 160) { + if (scene->_leftStaircase._frame == 1) { + return SceneActor::startAction(action, event); + } else { + R2_GLOBALS.setFlag(29); + R2_GLOBALS._player.disableControl(); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + if (R2_GLOBALS.getFlag(14)) { + scene->_sceneMode = 1; + scene->setAction(&scene->_sequenceManager, scene, 1809, &scene->_companion, &scene->_doors, NULL); + R2_GLOBALS.clearFlag(14); + } else { + scene->_sceneMode = 1804; + scene->setAction(&scene->_sequenceManager, scene, 1804, &R2_GLOBALS._player, &scene->_companion, &scene->_leftDoor, NULL); + } + } else { + if (R2_GLOBALS.getFlag(14)) { + scene->_sceneMode = 1; + scene->setAction(&scene->_sequenceManager, scene, 1809, &scene->_doors, NULL); + R2_GLOBALS.clearFlag(14); + } else { + scene->_sceneMode = 1805; + scene->setAction(&scene->_sequenceManager, scene, 1805, &R2_GLOBALS._player, &scene->_companion, &scene->_leftDoor, NULL); + } + } + } + } else if (scene->_leftStaircase._frame == 1) { + return SceneActor::startAction(action, event); + } else { + R2_GLOBALS.clearFlag(29); R2_GLOBALS._player.disableControl(); - R2_GLOBALS._sceneManager.changeScene(1900); - break; - default: - R2_GLOBALS._player.enableControl(); - R2_GLOBALS._player._canWalk = false; - break; + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + if (R2_GLOBALS.getFlag(14)) { + scene->_sceneMode = 2; + scene->setAction(&scene->_sequenceManager, scene, 1809, &scene->_companion, &scene->_doors, NULL); + R2_GLOBALS.clearFlag(14); + } else { + scene->_sceneMode = 1806; + scene->setAction(&scene->_sequenceManager, scene, 1806, &R2_GLOBALS._player, &scene->_companion, &scene->_rightDoor, NULL); + } + } else { + if (R2_GLOBALS.getFlag(14)) { + scene->_sceneMode = 2; + scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_doors, NULL); + R2_GLOBALS.clearFlag(14); + } else { + scene->_sceneMode = 1807; + scene->setAction(&scene->_sequenceManager, scene, 1807, &R2_GLOBALS._player, &scene->_companion, &scene->_rightDoor, NULL); + } + } } -} - -void Scene1875::process(Event &event) { - Scene::process(event); - _button1.process(event); - _button2.process(event); - _button3.process(event); - _button4.process(event); - _button5.process(event); + return true; } -/*-------------------------------------------------------------------------- - * Scene 1900 - Spill Mountains Elevator Exit - * - *--------------------------------------------------------------------------*/ - -bool Scene1900::LiftDoor::startAction(CursorType action, Event &event) { - if (action != CURSOR_USE) - return SceneActor::startAction(action, event); +void Scene1800::SouthExit::changeScene() { + Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene; - if ((_frame != 1) || (R2_GLOBALS._player._characterIndex != R2_SEEKER)) { + _enabled = false; + R2_GLOBALS._events.setCursor(CURSOR_WALK); + R2_GLOBALS._player.disableControl(); + if (R2_GLOBALS.getFlag(14)) { + scene->_sceneMode = 3; if (R2_GLOBALS._player._characterIndex == R2_QUINN) - return SceneActor::startAction(action, event); + scene->setAction(&scene->_sequenceManager, scene, 1809, &scene->_companion, &scene->_doors, NULL); else - return true; - } - - Scene1900 *scene = (Scene1900 *)R2_GLOBALS._sceneManager._scene; - - R2_GLOBALS._player.enableControl(CURSOR_USE); - - if (_position.x >= 160) { - scene->_sceneMode = 1905; - scene->setAction(&scene->_sequenceManager1, scene, 1905, &R2_GLOBALS._player, &scene->_rightDoor, NULL); + scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_doors, NULL); + R2_GLOBALS.clearFlag(14); } else { - R2_GLOBALS.setFlag(29); - scene->_sceneMode = 1904; - scene->setAction(&scene->_sequenceManager1, scene, 1904, &R2_GLOBALS._player, &scene->_leftDoor, NULL); + scene->_sceneMode = 1802; + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + scene->setAction(&scene->_sequenceManager, scene, 1802, &R2_GLOBALS._player, &scene->_companion, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 1803, &R2_GLOBALS._player, &scene->_companion, NULL); } - - return true; } -void Scene1900::WestExit::changeScene() { - Scene1900 *scene = (Scene1900 *)R2_GLOBALS._sceneManager._scene; +void Scene1800::postInit(SceneObjectList *OwnerList) { + loadScene(1800); + SceneExt::postInit(); + R2_GLOBALS._sound1.play(116); + _stripManager.addSpeaker(&_quinnSpeaker); + _stripManager.addSpeaker(&_seekerSpeaker); - R2_GLOBALS._player.disableControl(CURSOR_WALK); - scene->_sceneMode = 10; + if (R2_GLOBALS._sceneManager._previousScene == -1) + R2_GLOBALS._rimLocation = 1201; - Common::Point pt(-10, 135); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, scene); -} + // Set the mode based on whether this is the "correct" lift or not + if (R2_GLOBALS._rimLocation == 1201) + _locationMode = 2; + else + _locationMode = 0; -void Scene1900::EastExit::changeScene() { - Scene1900 *scene = (Scene1900 *)R2_GLOBALS._sceneManager._scene; + scalePalette(65, 65, 65); + _southExit.setDetails(Rect(0, 160, 319, 168), EXITCURSOR_S, 1800); + _background.setDetails(Rect(0, 0, 320, 200), -1, -1, -1, -1, 1, NULL); - R2_GLOBALS._player.disableControl(CURSOR_WALK); - scene->_sceneMode = 11; + _lever.postInit(); + _lever.setup(1801, 4, 1); + _lever.setPosition(Common::Point(170, 124)); + _lever.setDetails(1800, 13, 14, 15, 1, (SceneItem *) NULL); - Common::Point pt(330, 135); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, scene); -} + _doors.postInit(); + _doors.setup(1801, 3, 1); + _doors.setPosition(Common::Point(160, 139)); + _doors.setDetails(1800, 6, -1, -1, 1, (SceneItem *) NULL); -void Scene1900::postInit(SceneObjectList *OwnerList) { - loadScene(1900); - SceneExt::postInit(); + _leftDoor.postInit(); + _leftDoor.setup(1800, 1, 1); + _leftDoor.setPosition(Common::Point(110, 78)); + _leftDoor.fixPriority(135); + _leftDoor.setDetails(1800, 20, -1, -1, 1, (SceneItem *) NULL); - // Debug message, skipped + _rightDoor.postInit(); + _rightDoor.setup(1800, 2, 1); + _rightDoor.setPosition(Common::Point(209, 78)); + _rightDoor.fixPriority(135); + _rightDoor.setDetails(1800, 20, -1, -1, 1, (SceneItem *) NULL); - if (R2_GLOBALS._sceneManager._previousScene == -1) { - R2_GLOBALS._sceneManager._previousScene = 1925; - R2_GLOBALS._player._characterIndex = R2_SEEKER; - R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1925; - } + _leftStaircase.postInit(); + if ((_locationMode != 1) && (_locationMode != 3) && (!R2_GLOBALS.getFlag(64))) + _leftStaircase.setup(1801, 2, 1); + else + _leftStaircase.setup(1801, 2, 10); + _leftStaircase.setPosition(Common::Point(76, 142)); + _leftStaircase.setDetails(1800, 3, -1, -1, 1, (SceneItem *) NULL); - if (R2_GLOBALS._sceneManager._previousScene != 1875) - R2_GLOBALS._sound1.play(200); + _rightStaircase.postInit(); + if ((_locationMode != 1) && (_locationMode != 3) && (!R2_GLOBALS.getFlag(64))) + _rightStaircase.setup(1801, 1, 1); + else + _rightStaircase.setup(1801, 1, 10); + _rightStaircase.setPosition(Common::Point(243, 142)); + _rightStaircase.setDetails(1800, 3, -1, -1, 1, (SceneItem *) NULL); - _stripManager.setColors(60, 255); - _stripManager.setFontNumber(3); - _stripManager.addSpeaker(&_seekerSpeaker); + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + // Standard Quinn setup + R2_GLOBALS._player.setVisage(1503); + R2_GLOBALS._player._moveDiff = Common::Point(2, 2); + } else { + // Seeker setup dependent on whether he's holding the doors or not + if (R2_GLOBALS.getFlag(14)) { + R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL); + R2_GLOBALS._player.setObjectWrapper(NULL); + R2_GLOBALS._player.setup(1801, 5, 12); + R2_GLOBALS._player.setPosition(Common::Point(160, 139)); + R2_GLOBALS._walkRegions.disableRegion(9); + _doors.hide(); + } else { + R2_GLOBALS._player.setVisage(1507); + } + R2_GLOBALS._player._moveDiff = Common::Point(4, 2); + } - _westExit.setDetails(Rect(0, 105, 14, 145), EXITCURSOR_W, 2000); - _westExit.setDest(Common::Point(14, 135)); + _companion.postInit(); + _companion.animate(ANIM_MODE_1, NULL); + _companion.setObjectWrapper(new SceneObjectWrapper()); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + if (R2_GLOBALS.getFlag(14)) { + _companion.animate(ANIM_MODE_NONE, NULL); + _companion.setObjectWrapper(NULL); + _companion.setup(1801, 5, 12); - _eastExit.setDetails(Rect(305, 105, 320, 145), EXITCURSOR_E, 2000); - _eastExit.setDest(Common::Point(315, 135)); + R2_GLOBALS._walkRegions.disableRegion(9); + _doors.hide(); + } else { + _companion.setup(1507, 1, 1); + _companion.setPosition(Common::Point(180, 160)); + } + _companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *) NULL); + _companion._moveDiff = Common::Point(4, 2); + } else { + _companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *) NULL); + _companion.setVisage(1503); + _companion._moveDiff = Common::Point(2, 2); + } - R2_GLOBALS._player.postInit(); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - R2_GLOBALS._player.setup(2008, 3, 1); - else - R2_GLOBALS._player.setup(20, 3, 1); - R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1800) { + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + R2_GLOBALS._player.setPosition(Common::Point(114, 150)); + R2_GLOBALS._player.setStrip(5); + if (R2_GLOBALS.getFlag(14)) { + _companion.setPosition(Common::Point(160, 139)); + R2_GLOBALS._walkRegions.disableRegion(8); + } else { + _companion.setPosition(Common::Point(209, 150)); + _companion.setStrip(6); + R2_GLOBALS._walkRegions.disableRegion(8); + } + } else { + if (R2_GLOBALS.getFlag(14)) { + R2_GLOBALS._player.setup(1801, 5, 12); + R2_GLOBALS._player.setPosition(Common::Point(160, 139)); + } else { + R2_GLOBALS._player.setPosition(Common::Point(209, 150)); + R2_GLOBALS._player.setStrip(6); + } + _companion.setPosition(Common::Point(114, 150)); + _companion.setStrip(5); + R2_GLOBALS._walkRegions.disableRegion(10); + R2_GLOBALS._walkRegions.disableRegion(11); + } + } else if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + R2_GLOBALS._player.setPosition(Common::Point(140, 160)); + _companion.setPosition(Common::Point(180, 160)); + } else { + R2_GLOBALS._player.setPosition(Common::Point(180, 160)); + _companion.setPosition(Common::Point(140, 160)); + } + + _playerShadow.postInit(); + _playerShadow.fixPriority(10); if (R2_GLOBALS._player._characterIndex == R2_QUINN) - R2_GLOBALS._player._moveDiff = Common::Point(3, 2); + _playerShadow.setVisage(1111); else - R2_GLOBALS._player._moveDiff = Common::Point(5, 3); - R2_GLOBALS._player.disableControl(); + _playerShadow.setVisage(1110); - if (R2_GLOBALS._sceneManager._previousScene != 1925) - R2_GLOBALS.clearFlag(29); + _playerShadow._effect = EFFECT_SHADOW_MAP; + _playerShadow._shadowMap = _shadowPaletteMap; - _leftDoor.postInit(); - _leftDoor.setup(1901, 1, 1); - _leftDoor.setPosition(Common::Point(95, 109)); - _leftDoor.fixPriority(100); + R2_GLOBALS._player._linkedActor = &_playerShadow; + _companionShadow.postInit(); + _companionShadow.fixPriority(10); if (R2_GLOBALS._player._characterIndex == R2_QUINN) - _leftDoor.setDetails(1900, 0, 1, 2, 1, (SceneItem *) NULL); + _companionShadow.setVisage(1110); else - _leftDoor.setDetails(1900, 0, 1, -1, 1, (SceneItem *) NULL); + _companionShadow.setVisage(1111); - _rightDoor.postInit(); - _rightDoor.setup(1901, 2, 1); - _rightDoor.setPosition(Common::Point(225, 109)); - _rightDoor.fixPriority(100); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) - _rightDoor.setDetails(1900, 0, 1, 2, 1, (SceneItem *) NULL); - else - _rightDoor.setDetails(1900, 0, 1, -1, 1, (SceneItem *) NULL); + _companionShadow._effect = EFFECT_SHADOW_MAP; + _companionShadow._shadowMap = _shadowPaletteMap; - if (R2_GLOBALS._sceneManager._previousScene != 1875) { - _leftDoorFrame.postInit(); - _leftDoorFrame.setup(1945, 6, 1); - _leftDoorFrame.setPosition(Common::Point(96, 109)); - _leftDoorFrame.fixPriority(80); + _companion._linkedActor = &_companionShadow; - _rightDoorFrame.postInit(); - _rightDoorFrame.setup(1945, 6, 2); - _rightDoorFrame.setPosition(Common::Point(223, 109)); - _rightDoorFrame.fixPriority(80); - } + R2_GLOBALS._player._characterScene[R2_QUINN] = 1800; + R2_GLOBALS._player._characterScene[R2_SEEKER] = 1800; - if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1875) { - R2_GLOBALS._player._characterIndex = R2_QUINN; - _companion.postInit(); - _sceneMode = 20; - R2_GLOBALS._player.setAction(&_sequenceManager1, NULL, 1901, &R2_GLOBALS._player, &_leftDoor, NULL); - _companion.setAction(&_sequenceManager2, this, 1900, &_companion, &_rightDoor, NULL); - } else if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1925) { - if (R2_GLOBALS.getFlag(29)) { - R2_GLOBALS.clearFlag(29); - _leftDoor.hide(); + _elevatorContents.setDetails(Rect(128, 95, 190, 135), 1800, 10, -1, -1, 1, NULL); + _elevator.setDetails(Rect(95, 3, 223, 135), 1800, 0, -1, -1, 1, NULL); - R2_GLOBALS._player.setStrip(6); - R2_GLOBALS._player.setPosition(Common::Point(90, 106)); - _sceneMode = 1906; - setAction(&_sequenceManager1, this, 1906, &R2_GLOBALS._player, &_leftDoor, NULL); - } else { - _rightDoor.hide(); - R2_GLOBALS._player.setStrip(5); - R2_GLOBALS._player.setPosition(Common::Point(230, 106)); - _sceneMode = 1907; - setAction(&_sequenceManager1, this, 1907, &R2_GLOBALS._player, &_rightDoor, NULL); - } + // Original was calling _item3.setDetails(Rect(1800, 11, 24, 23), 25, -1, -1, -1, 1, NULL); + // This is *wrong*. The following statement is a wild guess based on good common sense + _surface.setDetails(11, 1800, 23, 24, 25); + _secBackground.setDetails(Rect(0, 0, 320, 200), 1800, 17, -1, 19, 1, NULL); - if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) { - _companion.postInit(); - _companion.setPosition(Common::Point(30, 110)); - R2_GLOBALS._walkRegions.disableRegion(1); - _companion.setup(2008, 3, 1); - _companion.setDetails(9001, 0, -1, -1, 1, (SceneItem *) NULL); - } - R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 1900; - } else { - if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) { - _companion.postInit(); - _companion.setPosition(Common::Point(30, 110)); - R2_GLOBALS._walkRegions.disableRegion(1); - if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - _companion.setup(20, 3, 1); - _companion.setDetails(9002, 1, -1, -1, 1, (SceneItem *) NULL); - } else { - _companion.setup(2008, 3, 1); - _companion.setDetails(9001, 0, -1, -1, 1, (SceneItem *) NULL); - } + R2_GLOBALS._player.disableControl(); + if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1800) { + if ((R2_GLOBALS.getFlag(14)) && (R2_GLOBALS._player._characterIndex == R2_SEEKER)) { + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = false; + } else { + R2_GLOBALS._player.enableControl(CURSOR_WALK); } - - if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) { + } else if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1850) { + if (R2_GLOBALS.getFlag(29)) { if (R2_GLOBALS._player._characterIndex == R2_QUINN) { - if (R2_GLOBALS._spillLocation[R2_QUINN] == 5) { - _sceneMode = 1902; - setAction(&_sequenceManager1, this, 1902, &R2_GLOBALS._player, NULL); - } else { - _sceneMode = 1903; - setAction(&_sequenceManager1, this, 1903, &R2_GLOBALS._player, NULL); - } + _sceneMode = 1814; + setAction(&_sequenceManager, this, 1814, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL); } else { - if (R2_GLOBALS._spillLocation[R2_SEEKER] == 5) { - _sceneMode = 1908; - setAction(&_sequenceManager1, this, 1908, &R2_GLOBALS._player, NULL); - } else { - _sceneMode = 1909; - setAction(&_sequenceManager1, this, 1909, &R2_GLOBALS._player, NULL); - } + _sceneMode = 1815; + setAction(&_sequenceManager, this, 1815, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL); } + } else if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + _sceneMode = 1816; + setAction(&_sequenceManager, this, 1816, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL); } else { - R2_GLOBALS._player.setPosition(Common::Point(160, 135)); - R2_GLOBALS._player.enableControl(); + _sceneMode = 1817; + setAction(&_sequenceManager, this, 1817, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL); } - R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 1900; + } else if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + _sceneMode = 1800; + setAction(&_sequenceManager, this, 1800, &R2_GLOBALS._player, &_companion, NULL); + } else { + _sceneMode = 1801; + setAction(&_sequenceManager, this, 1801, &R2_GLOBALS._player, &_companion, NULL); } - _elevator.setDetails(Rect(77, 2, 240, 103), 1900, 6, -1, -1, 1, NULL); - _background.setDetails(Rect(0, 0, 320, 200), 1900, 3, -1, -1, 1, NULL); -} - -void Scene1900::remove() { - R2_GLOBALS._sound1.fadeOut(NULL); - SceneExt::remove(); + R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1800; + R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1800; } -void Scene1900::signal() { +void Scene1800::signal() { switch (_sceneMode) { - case 10: - R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] = 5; - R2_GLOBALS._sceneManager.changeScene(2000); + case 1: + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + _sceneMode = 1804; + setAction(&_sequenceManager, this, 1804, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL); + } else { + _sceneMode = 1805; + setAction(&_sequenceManager, this, 1805, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL); + } + break; + case 2: + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + _sceneMode = 1806; + setAction(&_sequenceManager, this, 1806, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL); + } else { + _sceneMode = 1807; + setAction(&_sequenceManager, this, 1807, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL); + } break; + case 3: + _sceneMode = 1802; + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + setAction(&_sequenceManager, this, 1802, &R2_GLOBALS._player, &_companion, NULL); + else + setAction(&_sequenceManager, this, 1803, &R2_GLOBALS._player, &_companion, NULL); + break; + case 10: + // No break on purpose case 11: - R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] = 6; - R2_GLOBALS._sceneManager.changeScene(2000); + R2_GLOBALS._player.enableControl(CURSOR_TALK); break; - case 20: - ++_sceneMode; - R2_GLOBALS._events.setCursor(CURSOR_WALK); - _stripManager.start(1300, this); + case 12: + R2_GLOBALS._player.enableControl(CURSOR_TALK); + R2_GLOBALS._player._canWalk = false; break; - case 21: - ++_sceneMode; + case 13: + _sceneMode = 14; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + R2_GLOBALS._player.setup(1801, 7, 1); + R2_GLOBALS._player.animate(ANIM_MODE_8, 0, NULL); + _stripManager.start(550, this); + break; + case 14: + _sceneMode = 15; R2_GLOBALS._player.disableControl(); - if (R2_GLOBALS._player._action) - R2_GLOBALS._player._action->_endHandler = this; - else - signal(); + R2_GLOBALS._player.setup(1801, 6, 1); + R2_GLOBALS._player.animate(ANIM_MODE_6, this); break; - case 22: - _sceneMode = 1910; - _companion.setAction(&_sequenceManager2, this, 1910, &_companion, NULL); + case 15: + R2_GLOBALS._player.setup(1503, 4, 1); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + R2_GLOBALS._player.enableControl(CURSOR_USE); break; - case 1904: - R2_GLOBALS._scene1925CurrLevel = -3; + // Cases 23 and 24 have been added to fix missing hardcoded logic in the original, + // when Seeker tries to open the door + case 23: + _sceneMode = 24; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + R2_GLOBALS._player.setup(1801, 5, 1); + R2_GLOBALS._player.animate(ANIM_MODE_8, 0, NULL); + _stripManager.start(550, this); + break; + case 24: + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._player.setup(1507, 4, 1); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + R2_GLOBALS._player.enableControl(CURSOR_USE); + + _doors.setup(1801, 3, 1); + _doors.setPosition(Common::Point(160, 139)); + _doors.setDetails(1800, 6, -1, -1, 1, (SceneItem *) NULL); + _doors.show(); + + R2_GLOBALS._player._position.y += 2; + R2_GLOBALS._player.show(); + break; + case 1800: + R2_GLOBALS._walkRegions.disableRegion(8); + if (R2_GLOBALS.getFlag(63)) + R2_GLOBALS._player.enableControl(CURSOR_USE); + else { + _sceneMode = 10; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _stripManager.start(544, this); + } + break; + case 1801: + R2_GLOBALS._walkRegions.disableRegion(10); + R2_GLOBALS._walkRegions.disableRegion(11); + R2_GLOBALS.setFlag(63); + R2_GLOBALS._player.enableControl(CURSOR_WALK); + break; + case 1802: + R2_GLOBALS.clearFlag(14); + R2_GLOBALS._sceneManager.changeScene(1700); + break; + case 1804: // No break on purpose - case 1905: - R2_GLOBALS._player.disableControl(CURSOR_WALK); - R2_GLOBALS._sceneManager.changeScene(1925); + case 1805: + // No break on purpose + case 1806: + // No break on purpose + case 1807: + R2_GLOBALS.clearFlag(14); + R2_GLOBALS._sceneManager.changeScene(1850); break; - case 1910: - R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 2535); - R2_GLOBALS._player.disableControl(CURSOR_WALK); - R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1900; - R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1900; - R2_GLOBALS._sceneManager.changeScene(2450); + case 1808: + _sceneMode = 12; + R2_GLOBALS._events.setCursor(CURSOR_WALK); + _stripManager.start(553, this); break; - case 1906: - R2_GLOBALS._scene1925CurrLevel = -3; + case 1812: + _sceneMode = 13; + R2_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + // Case 1813 has been added to fix Seeker missing animation in the original game + case 1813: + _sceneMode = 23; + R2_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 1814: + // No break on purpose + case 1815: + R2_GLOBALS._walkRegions.disableRegion(10); + R2_GLOBALS._walkRegions.disableRegion(11); + R2_GLOBALS._player.enableControl(); + break; + case 1816: // No break on purpose + case 1817: + R2_GLOBALS._walkRegions.disableRegion(8); + R2_GLOBALS._player.enableControl(); + break; default: R2_GLOBALS._player.enableControl(); break; } } -/*-------------------------------------------------------------------------- - * Scene 1925 - Spill Mountains Elevator Shaft - * - *--------------------------------------------------------------------------*/ +void Scene1800::saveCharacter(int characterIndex) { + if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) + R2_GLOBALS._sound1.fadeOut2(NULL); -Scene1925::Scene1925() { - _newSceneMode = 0; - for (int i = 0; i < 5; i++) - _levelResNum[i] = 0; + SceneExt::saveCharacter(characterIndex); } -void Scene1925::synchronize(Serializer &s) { - SceneExt::synchronize(s); - - s.syncAsSint16LE(_newSceneMode); - for (int i = 0; i < 5; i++) - s.syncAsSint16LE(_levelResNum[i]); -} +/*-------------------------------------------------------------------------- + * Scene 1850 - Rim Lift Interior + * + *--------------------------------------------------------------------------*/ -bool Scene1925::Button::startAction(CursorType action, Event &event) { +bool Scene1850::Button::startAction(CursorType action, Event &event) { if (action != CURSOR_USE) return SceneHotspot::startAction(action, event); - if ((R2_GLOBALS._player._position.x == 110) && (R2_GLOBALS._player._position.y == 100)) - return SceneHotspot::startAction(action, event); + Scene1850 *scene = (Scene1850 *)R2_GLOBALS._sceneManager._scene; - Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene; + R2_GLOBALS._player.disableControl(); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + scene->_sceneMode = 1852; + if (R2_GLOBALS.getFlag(32)) + scene->setAction(&scene->_sequenceManager1, scene, 1871, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager1, scene, 1852, &R2_GLOBALS._player, NULL); + } else if (R2_GLOBALS.getFlag(30)) { + scene->_seqNumber = 1; + scene->_sceneMode = 1860; - if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 20)) - scene->_sceneMode = 1928; - else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 200)) - scene->_sceneMode = 1929; - else - scene->_sceneMode = 1930; + if (R2_GLOBALS.getFlag(32)) + scene->setAction(&scene->_sequenceManager1, scene, 1860, &R2_GLOBALS._player, &scene->_robot, NULL); + else + scene->setAction(&scene->_sequenceManager1, scene, 1859, &R2_GLOBALS._player, &scene->_robot, NULL); + + R2_GLOBALS.clearFlag(30); + } else { + scene->_sceneMode = 1853; + + if (R2_GLOBALS.getFlag(32)) + scene->setAction(&scene->_sequenceManager1, scene, 1872, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager1, scene, 1853, &R2_GLOBALS._player, NULL); + } - R2_GLOBALS._player.disableControl(CURSOR_WALK); - scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, - &scene->_door, NULL); return true; } -bool Scene1925::Ladder::startAction(CursorType action, Event &event) { - if ((!R2_GLOBALS.getFlag(29)) || (action != CURSOR_USE)) - return SceneHotspot::startAction(action, event); +bool Scene1850::Robot::startAction(CursorType action, Event &event) { + Scene1850 *scene = (Scene1850 *)R2_GLOBALS._sceneManager._scene; - Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene; + switch (action) { + case CURSOR_USE: + if ((R2_GLOBALS._player._characterIndex != R2_SEEKER) || R2_GLOBALS.getFlag(33) || R2_GLOBALS.getFlag(30)) + return SceneActor::startAction(action, event); - R2_GLOBALS._player.disableControl(CURSOR_USE); - scene->_sceneMode = 0; + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 1857; - if ((R2_GLOBALS._player._position.x == 110) && (R2_GLOBALS._player._position.y == 100)) { - scene->_westExit._enabled = false; - scene->_sceneMode = 1925; - scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, - &R2_GLOBALS._player, &scene->_door, NULL); + if (R2_GLOBALS.getFlag(32)) + scene->setAction(&scene->_sequenceManager1, scene, 1858, &R2_GLOBALS._player, &scene->_robot, NULL); + else + scene->setAction(&scene->_sequenceManager1, scene, 1857, &R2_GLOBALS._player, &scene->_robot, NULL); + + R2_GLOBALS.setFlag(30); return true; - } + break; + case CURSOR_LOOK: + if (R2_GLOBALS.getFlag(34)) + SceneItem::display(1850, 2, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + else + SceneItem::display(1850, 1, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 20) && (event.mousePos.y >= 30)) { - scene->_sceneMode = 1931; - } else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 200) && (event.mousePos.y < 140)) { - scene->_sceneMode = 1932; - } else if ( ( ((R2_GLOBALS._player._position.x == 112) && (R2_GLOBALS._player._position.y == 101)) - || ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 110)) - ) && (event.mousePos.y >= 100)) { - scene->_sceneMode = 1926; - } else if ( ( ((R2_GLOBALS._player._position.x == 112) && (R2_GLOBALS._player._position.y == 101)) - || ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 110)) - ) && (event.mousePos.y < 60)) { - scene->_sceneMode = 1927; - } else { - R2_GLOBALS._player.enableControl(CURSOR_USE); - R2_GLOBALS._player._canWalk = false; - } + return true; + break; + case R2_AIRBAG: + if (R2_GLOBALS._player._characterIndex == R2_SEEKER) { + if (R2_GLOBALS.getFlag(70)) { + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 30; - if (scene->_sceneMode != 0) - scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL); + R2_GLOBALS._events.setCursor(CURSOR_WALK); + scene->_stripManager.start(558, scene); - return true; -} + return true; + } else { + return SceneActor::startAction(action, event); + } + } else if (R2_GLOBALS.getFlag(30)) { + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 1875; + scene->_airbag.postInit(); -void Scene1925::ExitUp::changeScene() { - Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene; + if (R2_GLOBALS.getFlag(32)) + scene->setAction(&scene->_sequenceManager1, scene, 1876, + &R2_GLOBALS._player, &scene->_airbag, NULL); + else + scene->setAction(&scene->_sequenceManager1, scene, 1875, + &R2_GLOBALS._player, &scene->_airbag, NULL); - _moving = false; - R2_GLOBALS._player.disableControl(CURSOR_USE); - scene->_sceneMode = 0; + return true; + } else if (R2_GLOBALS.getFlag(70)) { + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 20; + R2_GLOBALS._events.setCursor(CURSOR_WALK); + scene->_stripManager.start(557, scene); + R2_GLOBALS.setFlag(69); - if ((R2_GLOBALS._player._position.x == 110) && (R2_GLOBALS._player._position.y == 100)) { - scene->_westExit._enabled = false; - scene->_newSceneMode = 1927; - scene->_sceneMode = 1925; - scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, - &R2_GLOBALS._player, &scene->_door, NULL); - return; + return true; + } else { + return SceneActor::startAction(action, event); + } + break; + case R2_REBREATHER_TANK: + if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1850) { + if (R2_GLOBALS.getFlag(30)) + return SceneActor::startAction(action, event); + + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 1878; + scene->setAction(&scene->_sequenceManager1, scene, 1878, &R2_GLOBALS._player, + &scene->_robot, &scene->_airbag, NULL); + } + + return true; + break; + default: + return SceneActor::startAction(action, event); + break; } +} - if ( ((R2_GLOBALS._player._position.x == 112) && (R2_GLOBALS._player._position.y == 101)) - || ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 110))) { - scene->_sceneMode = 1927; - } else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 200)) { - scene->_sceneMode = 1932; +bool Scene1850::Door::startAction(CursorType action, Event &event) { + if (action != CURSOR_USE) + return SceneHotspot::startAction(action, event); + + if (R2_GLOBALS.getFlag(32)) { + SceneItem::display(3240, 4, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + return true; } - if (scene->_sceneMode != 0) - scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL); - else { - scene->_sceneMode = 1932; - scene->signal(); + Scene1850 *scene = (Scene1850 *)R2_GLOBALS._sceneManager._scene; + + R2_GLOBALS._player.disableControl(); + if (scene->_sceneMode == 1851) + R2_GLOBALS._player._effect = EFFECT_SHADED; + + if (_position.x >= 160) + R2_GLOBALS.setFlag(29); + else + R2_GLOBALS.clearFlag(29); + + if ((R2_GLOBALS._player._characterIndex == R2_SEEKER) && (R2_GLOBALS.getFlag(30))) { + if (_position.x >= 160) + scene->_seqNumber = 3; + else + scene->_seqNumber = 2; + + scene->_sceneMode = 1860; + + if (R2_GLOBALS.getFlag(32)) { + scene->setAction(&scene->_sequenceManager1, scene, 1860, &R2_GLOBALS._player, &scene->_robot, NULL); + } else { + scene->setAction(&scene->_sequenceManager1, scene, 1859, &R2_GLOBALS._player, &scene->_robot, NULL); + } + } else { + scene->_sceneMode = 11; + if (_position.x >= 160) { + scene->setAction(&scene->_sequenceManager1, scene, 1866, &R2_GLOBALS._player, &scene->_rightDoor, NULL); + } else { + scene->setAction(&scene->_sequenceManager1, scene, 1865, &R2_GLOBALS._player, &scene->_leftDoor, NULL); + } } + + return true; } -void Scene1925::ExitDown::changeScene() { - Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene; +bool Scene1850::DisplayScreen::startAction(CursorType action, Event &event) { + if ((action != CURSOR_USE) || (_position.y != 120)) + return SceneHotspot::startAction(action, event); - _moving = false; - R2_GLOBALS._player.disableControl(CURSOR_USE); - scene->_sceneMode = 0; + Scene1850 *scene = (Scene1850 *)R2_GLOBALS._sceneManager._scene; - if ((R2_GLOBALS._player._position.x == 110) && (R2_GLOBALS._player._position.y == 100)) { - scene->_westExit._enabled = false; - scene->_newSceneMode = 1926; - scene->_sceneMode = 1925; - scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, - &R2_GLOBALS._player, &scene->_door, NULL); - return; - } + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 1881; - if ( ((R2_GLOBALS._player._position.x == 112) && (R2_GLOBALS._player._position.y == 101)) - || ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 110))) { - scene->_sceneMode = 1926; - } else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 20)) { - scene->_sceneMode = 1931; + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + scene->setAction(&scene->_sequenceManager1, scene, 1881, &R2_GLOBALS._player, NULL); + } else { + scene->setAction(&scene->_sequenceManager1, scene, 1880, &R2_GLOBALS._player, NULL); } - if (scene->_sceneMode == 0) { - scene->_sceneMode = 1931; - scene->signal(); - } else - scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL); + return true; } -void Scene1925::WestExit::changeScene() { - Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene; +/*------------------------------------------------------------------------*/ - _moving = false; - R2_GLOBALS._player.disableControl(CURSOR_WALK); - scene->_sceneMode = 1921; - scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL); +Scene1850::Scene1850() { + _sceneMode = 0; + _shadeCountdown = 0; + _shadeDirection = 0; + _shadeChanging = false; + _seqNumber = 0; } -void Scene1925::EastExit::changeScene() { - Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene; +void Scene1850::synchronize(Serializer &s) { + SceneExt::synchronize(s); - _moving = false; - R2_GLOBALS._player.disableControl(CURSOR_WALK); - scene->_sceneMode = 1920; - scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL); + s.syncAsSint16LE(_sceneMode); + s.syncAsSint16LE(_shadeCountdown); + s.syncAsSint16LE(_shadeDirection); + s.syncAsSint16LE(_shadeChanging); + s.syncAsSint16LE(_seqNumber); + s.syncAsSint16LE(_playerDest.x); + s.syncAsSint16LE(_playerDest.y); } -void Scene1925::changeLevel(bool upFlag) { - if (R2_GLOBALS._scene1925CurrLevel < 0) - R2_GLOBALS._scene1925CurrLevel = 3; +void Scene1850::postInit(SceneObjectList *OwnerList) { + loadScene(1850); - if (upFlag) { - R2_GLOBALS._player.setup(1925, 1, 1); - R2_GLOBALS._player.setPosition(Common::Point(154, 200)); - ++R2_GLOBALS._scene1925CurrLevel; + if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] != 1850) + R2_GLOBALS.clearFlag(31); + + _palette1.loadPalette(0); + + if (R2_GLOBALS.getFlag(31)) { + _sceneMode = 1850; + g_globals->_scenePalette.loadPalette(1850); } else { - R2_GLOBALS._player.setup(1925, 1, 1); - R2_GLOBALS._player.setPosition(Common::Point(154, 20)); - R2_GLOBALS._scene1925CurrLevel--; + _sceneMode = 1851; + g_globals->_scenePalette.loadPalette(1851); } - switch (R2_GLOBALS._scene1925CurrLevel) { - case -1: - R2_GLOBALS._sceneManager.changeScene(1945); - return; - break; - case 3: - loadScene(_levelResNum[4]); - _button.setDetails(Rect(133, 68, 140, 77), 1925, 3, -1, 5, 2, NULL); - _door.setDetails(1925, 0, 1, 2, 2, (SceneItem *) NULL); - _door.show(); - break; - case 512: - R2_GLOBALS._scene1925CurrLevel = 508; - // No break on purpose - default: - loadScene(_levelResNum[(R2_GLOBALS._scene1925CurrLevel % 4)]); - R2_GLOBALS._sceneItems.remove(&_button); - R2_GLOBALS._sceneItems.remove(&_door); - _door.hide(); - break; - } + SceneExt::postInit(); - R2_GLOBALS._player.enableControl(CURSOR_USE); - R2_GLOBALS._player._canWalk = false; -} + if (R2_GLOBALS._sceneManager._previousScene == 3150) + R2_GLOBALS._sound1.play(116); -void Scene1925::postInit(SceneObjectList *OwnerList) { - _levelResNum[0] = 1930; - _levelResNum[1] = 1935; - _levelResNum[2] = 1940; - _levelResNum[3] = 1935; - _levelResNum[4] = 1925; + _stripManager.addSpeaker(&_quinnSpeaker); + _stripManager.addSpeaker(&_seekerSpeaker); - if (R2_GLOBALS.getFlag(29)) { - if ((R2_GLOBALS._scene1925CurrLevel == -3) || (R2_GLOBALS._scene1925CurrLevel == 3)) - loadScene(_levelResNum[4]); - else - loadScene(_levelResNum[R2_GLOBALS._scene1925CurrLevel % 4]); - } else { - R2_GLOBALS._scene1925CurrLevel = -2; - loadScene(1920); - } - SceneExt::postInit(); - R2_GLOBALS._sound1.play(220); - R2_GLOBALS._player.postInit(); - R2_GLOBALS._player.disableControl(); - R2_GLOBALS._player._characterScene[R2_SEEKER] = 1925; - R2_GLOBALS._player._characterIndex = R2_SEEKER; + _shadeChanging = false; + _seqNumber = 0; + _playerDest = Common::Point(0, 0); - switch (R2_GLOBALS._scene1925CurrLevel) { - case -2: - _eastExit.setDetails(Rect(203, 44, 247, 111), EXITCURSOR_E, 1925); - _ladder.setDetails(Rect(31, 3, 45, 167), 1925, 6, -1, 8, 1, NULL); - break; - case 3: - _door.setDetails(1925, 0, 1, 2, 1, (SceneItem *) NULL); - _button.setDetails(Rect(133, 68, 140, 77), 1925, 3, -1, 5, 1, NULL); - // No break on purpose - case -3: - _westExit.setDetails(Rect(83, 38, 128, 101), EXITCURSOR_W, 1925); - // No break on purpose - default: - _exitUp.setDetails(Rect(128, 0, 186, 10), EXITCURSOR_N, 1925); - _exitDown.setDetails(Rect(128, 160, 190, 167), EXITCURSOR_S, 1925); - _ladder.setDetails(Rect(141, 11, 167, 159), 1925, 6, -1, -1, 1, NULL); - break; - } + R2_GLOBALS._player._characterScene[R2_QUINN] = 1850; + R2_GLOBALS._player._characterScene[R2_SEEKER] = 1850; - _door.postInit(); - _door.setup(1925, 5, 1); - _door.setPosition(Common::Point(128, 35)); - _door.hide(); + _button.setDetails(Rect(101, 56, 111, 63), 1850, 19, -1, -1, 1, NULL); - if (R2_GLOBALS._scene1925CurrLevel == 3) - _door.show(); + _leftDoor.postInit(); + _leftDoor.setup(1850, 3, 1); + _leftDoor.setPosition(Common::Point(66, 102)); + _leftDoor.setDetails(1850, 22, -1, -1, 1, (SceneItem *) NULL); - R2_GLOBALS._player.enableControl(CURSOR_USE); - switch (R2_GLOBALS._scene1925CurrLevel) { - case -2: - R2_GLOBALS._player.setup(20, 6, 1); - R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); - R2_GLOBALS._player.setPosition(Common::Point(224, 109)); - break; - case -3: - _door.hide(); - R2_GLOBALS._player.setup(20, 5, 1); - R2_GLOBALS._player.setPosition(Common::Point(110, 100)); - break; - case 0: - R2_GLOBALS._player.setup(1925, 1, 1); - R2_GLOBALS._player.setPosition(Common::Point(154, 200)); - break; - default: - R2_GLOBALS._player.setup(1925, 1, 3); - R2_GLOBALS._player.setPosition(Common::Point(154, 110)); - break; + _rightDoor.postInit(); + _rightDoor.setup(1850, 2, 1); + _rightDoor.setPosition(Common::Point(253, 102)); + _rightDoor.setDetails(1850, 22, -1, -1, 1, (SceneItem *) NULL); + + R2_GLOBALS._walkRegions.disableRegion(1); + + _robot.postInit(); + + if (R2_GLOBALS.getFlag(34)) { + R2_GLOBALS._walkRegions.disableRegion(2); + _robot.setup(1851, 4, 3); + } else if (R2_GLOBALS.getFlag(30)) { + _robot.setup(1851, 2, 2); + } else { + R2_GLOBALS._walkRegions.disableRegion(5); + if (R2_GLOBALS.getFlag(33)) { + R2_GLOBALS._walkRegions.disableRegion(2); + _robot.setup(1851, 1, 3); + } else { + _robot.setup(1851, 2, 1); + } } - R2_GLOBALS._player._canWalk = false; - _newSceneMode = 0; - R2_GLOBALS._sceneManager._previousScene = 1925; - _background.setDetails(Rect(27, 0, 292, 200), 1925, 9, -1, -1, 1, NULL); -} + _robot.setPosition(Common::Point(219, 130)); + _robot.fixPriority(114); + _robot.setDetails(1850, -1, -1, -1, 1, (SceneItem *) NULL); -void Scene1925::remove() { - R2_GLOBALS._sound1.fadeOut2(NULL); - R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1925; - SceneExt::remove(); -} + R2_GLOBALS._player.postInit(); -void Scene1925::signal() { - switch (_sceneMode) { - case 1920: - // No break on purpose - case 1921: - // No break on purpose - case 1928: - // No break on purpose - case 1929: - // No break on purpose - case 1930: - R2_GLOBALS._scene1925CurrLevel = -3; - R2_GLOBALS._sceneManager.changeScene(1900); - break; - case 1926: - // No break on purpose - case 1931: - // Change level, down - changeLevel(false); - break; - case 1927: - // No break on purpose - case 1932: - // Change level, up - changeLevel(true); - break; - case 1925: - _westExit._enabled = false; - if (_newSceneMode != 0) { - _sceneMode = _newSceneMode; - _newSceneMode = 0; - setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL); + _companion.postInit(); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + _companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *) NULL); + } else { + _companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *) NULL); + } + + if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1850) { + R2_GLOBALS._player._effect = EFFECT_SHADED2; + _companion._effect = EFFECT_SHADED2; + if (R2_GLOBALS.getFlag(31)) { + R2_GLOBALS._player._shade = 0; + _companion._shade = 0; + } else { + R2_GLOBALS._player._shade = 6; + _companion._shade = 6; + } + + if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1850) { + _airbag.postInit(); + if (R2_GLOBALS.getFlag(34)) { + _airbag.setup(1851, 4, 2); + _airbag.fixPriority(114); + } else { + _airbag.setup(1851, 4, 1); + } + + _airbag.setPosition(Common::Point(179, 113)); + + if ((_robot._strip == 1) && (_robot._frame == 3)){ + _airbag.hide(); + } + + _airbag.setDetails(1850, 6, -1, -1, 1, (SceneItem *) NULL); } - // No break on purpose - default: - R2_GLOBALS._player.enableControl(CURSOR_USE); - break; - } - R2_GLOBALS._player._canWalk = false; -} + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + if (R2_GLOBALS.getFlag(32)) { + R2_GLOBALS._player.setVisage(1511); + _companion.setVisage(1508); -/*-------------------------------------------------------------------------- - * Scene 1945 - Spill Mountains Shaft Bottom - * - *--------------------------------------------------------------------------*/ + _screen.postInit(); + _screen.setup(1853, 3, 1); + _screen.setPosition(Common::Point(122, 113)); + _screen.fixPriority(114); + _screen._effect = EFFECT_SHADED2; + _screen.setDetails(1850, 28, -1, -1, 2, (SceneItem *) NULL); -Scene1945::Scene1945() { - _nextSceneMode1 = 0; - _nextSceneMode2 = 0; - _lampUsed = CURSOR_NONE; -} + _helmet.postInit(); + _helmet.setup(1853, 3, 2); + _helmet.setPosition(Common::Point(139, 111)); + _helmet.fixPriority(114); + _helmet._effect = EFFECT_SHADED2; + _helmet.setDetails(1850, 29, -1, -1, 2, (SceneItem *) NULL); -void Scene1945::synchronize(Serializer &s) { - SceneExt::synchronize(s); + if (R2_GLOBALS.getFlag(31)) { + _screen._shade = 0; + _helmet._shade = 0; + } else { + _screen._shade = 6; + _helmet._shade = 6; + } + } else { + R2_GLOBALS._player.setVisage(1500); + _companion.setVisage(1505); + } + } else if (R2_GLOBALS.getFlag(32)) { + // Not Quinn, flag 32 + R2_GLOBALS._player.setVisage(1508); + _companion.setVisage(1511); - s.syncAsSint16LE(_nextSceneMode1); - s.syncAsSint16LE(_nextSceneMode2); - s.syncAsSint16LE(_lampUsed); -} + _screen.postInit(); + _screen.setup(1853, 3, 1); + _screen.setPosition(Common::Point(122, 113)); + _screen.fixPriority(114); + _screen._effect = EFFECT_SHADED2; + _screen.setDetails(1850, 30, -1, -1, 2, (SceneItem *) NULL); -bool Scene1945::Ice::startAction(CursorType action, Event &event) { - Scene1945 *scene = (Scene1945 *)R2_GLOBALS._sceneManager._scene; + _helmet.postInit(); + _helmet.setup(1853, 3, 2); + _helmet.setPosition(Common::Point(139, 111)); + _helmet.fixPriority(114); + _helmet._effect = EFFECT_SHADED2; + _helmet.setDetails(1850, 28, -1, -1, 1, (SceneItem *) NULL); - switch (action) { - case R2_GUNPOWDER: - R2_GLOBALS._player.disableControl(); - scene->_sceneMode = 0; - if ((R2_GLOBALS._player._position.x == 191) && (R2_GLOBALS._player._position.y == 142)) - scene->_sceneMode = 1942; - else { - scene->_sceneMode = 1940; - scene->_nextSceneMode1 = 1942; - } - // At this point the original check if _sceneMode != 0. Skipped. - scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_gunpowder, NULL); - return true; - break; - case CURSOR_USE: - R2_GLOBALS._player.disableControl(CURSOR_USE); - scene->_sceneMode = 0; - if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 50) && (event.mousePos.x >= 130)) { - scene->_sceneMode = 1940; - // At this point the original check if _sceneMode != 0. Skipped. - scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL); - return true; + if (R2_GLOBALS.getFlag(31)) { + _screen._shade = 0; + _helmet._shade = 0; + } else { + _screen._shade = 6; + _helmet._shade = 6; + } } else { - R2_GLOBALS._player.enableControl(CURSOR_USE); - R2_GLOBALS._player._canWalk = false; - if (event.mousePos.x > 130) - scene->_ice.setDetails(1945, 3, -1, -1, 3, (SceneItem *) NULL); - else - scene->_ice.setDetails(1945, 3, -1, 5, 3, (SceneItem *) NULL); + // Not Quinn, nor flag 32 + R2_GLOBALS._player.setVisage(1505); + _companion.setVisage(1500); } - // No break on purpose - default: - return SceneHotspot::startAction(action, event); - break; - } -} - -bool Scene1945::Ladder::startAction(CursorType action, Event &event) { - if (action != CURSOR_USE) - return SceneHotspot::startAction(action, event); - - Scene1945 *scene = (Scene1945 *)R2_GLOBALS._sceneManager._scene; - R2_GLOBALS._player.disableControl(CURSOR_USE); - scene->_sceneMode = 0; + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + R2_GLOBALS._player.setStrip(3); + R2_GLOBALS._player.setPosition(Common::Point(80, 114)); - if ((R2_GLOBALS._player._position.x == 221) && (R2_GLOBALS._player._position.y == 142)) { - scene->_sceneMode = 1949; - scene->_nextSceneMode1 = 1947; - } else if ( ((R2_GLOBALS._player._position.x == 197) && (R2_GLOBALS._player._position.y == 158)) - || ((R2_GLOBALS._player._position.x == 191) && (R2_GLOBALS._player._position.y == 142)) ) { - scene->_sceneMode = 1947; - } else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 50) - && (event.mousePos.y >= 30)) { - scene->_sceneMode = 1940; - } else { - R2_GLOBALS._player.enableControl(CURSOR_USE); - R2_GLOBALS._player._canWalk = false; - } + _companion.animate(ANIM_MODE_1, NULL); + _companion.setObjectWrapper(new SceneObjectWrapper()); + _companion.setStrip(3); + _companion.setPosition(Common::Point(180, 96)); - if (scene->_sceneMode != 0) - scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL); + if (R2_GLOBALS.getFlag(30)) { + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + _companion.animate(ANIM_MODE_NONE, NULL); + _companion.setObjectWrapper(NULL); + if (R2_GLOBALS.getFlag(32)) { + _companion.setup(1854, 1, 3); + } else { + _companion.setup(1854, 2, 3); + } - return true; -} + _companion.setPosition(Common::Point(164, 106)); + } else { + _companion.animate(ANIM_MODE_NONE, NULL); + _companion.setObjectWrapper(NULL); + if (R2_GLOBALS.getFlag(32)) { + R2_GLOBALS._player.setup(1854, 1, 3); + } else { + R2_GLOBALS._player.setup(1854, 2, 3); + } -bool Scene1945::Gunpowder::startAction(CursorType action, Event &event) { - if ((action == R2_ALCOHOL_LAMP_3) || (action == R2_ALCOHOL_LAMP_2)) { - Scene1945 *scene = (Scene1945 *)R2_GLOBALS._sceneManager._scene; + R2_GLOBALS._player.setPosition(Common::Point(164, 106)); + } + } - scene->_lampUsed = action; + R2_GLOBALS._player.enableControl(); + } else { // R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] != 1850 + R2_GLOBALS._player._effect = EFFECT_SHADED; + _companion._effect = EFFECT_SHADED; R2_GLOBALS._player.disableControl(); - scene->_sceneMode = 0; - if ((R2_GLOBALS._player._position.x == 191) && (R2_GLOBALS._player._position.y == 142)) { - scene->_sceneMode= 1947; - scene->_nextSceneMode1 = 1943; - } else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 50)) { - scene->_sceneMode = 1940; - scene->_nextSceneMode1 = 1943; + _sceneMode = 10; + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + if (R2_GLOBALS.getFlag(29)) { + setAction(&_sequenceManager1, this, 1863, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL); + } else { + setAction(&_sequenceManager1, this, 1861, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL); + } } else { - scene->_sceneMode = 1949; - scene->_nextSceneMode1 = 1947; - scene->_nextSceneMode2 = 1943; + if (R2_GLOBALS.getFlag(29)) { + setAction(&_sequenceManager1, this, 1864, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL); + } else { + setAction(&_sequenceManager1, this, 1862, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL); + } } - // At this point the original check if _sceneMode != 0. Skipped. - scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL); - return true; - } else { - return SceneActor::startAction(action, event); } -} - -void Scene1945::ExitUp::changeScene() { - Scene1945 *scene = (Scene1945 *)R2_GLOBALS._sceneManager._scene; - - _moving = false; - R2_GLOBALS._player.disableControl(CURSOR_USE); - scene->_sceneMode = 0; - if ((R2_GLOBALS._player._position.x == 221) && (R2_GLOBALS._player._position.y == 142)) { - scene->_sceneMode = 1949; - scene->_nextSceneMode1 = 1947; - } else if ( ((R2_GLOBALS._player._position.x == 197) && (R2_GLOBALS._player._position.y == 158)) - || ((R2_GLOBALS._player._position.x == 191) && (R2_GLOBALS._player._position.y == 142)) ) { - scene->_sceneMode = 1947; + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + R2_GLOBALS._player._moveDiff = Common::Point(3, 2); + _companion._moveDiff = Common::Point(5, 3); + } else { + R2_GLOBALS._player._moveDiff = Common::Point(5, 3); + _companion._moveDiff = Common::Point(3, 2); } - if (scene->_sceneMode == 0) { - scene->_sceneMode = 1941; - signal(); + _displayScreen.postInit(); + _displayScreen.setup(1850, 1, 1); + + if (R2_GLOBALS.getFlag(62)) { + _displayScreen.setPosition(Common::Point(159, 120)); } else { - scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL); + _displayScreen.setPosition(Common::Point(159, 184)); } -} -void Scene1945::CorridorExit::changeScene() { - Scene1945 *scene = (Scene1945 *)R2_GLOBALS._sceneManager._scene; - - _moving = false; - R2_GLOBALS._player.disableControl(CURSOR_USE); - scene->_sceneMode = 0; + _displayScreen.fixPriority(113); - if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 50)) { - scene->_sceneMode = 1940; - scene->_nextSceneMode1 = 1945; - } else if ( ((R2_GLOBALS._player._position.x == 197) && (R2_GLOBALS._player._position.y == 158)) - || ((R2_GLOBALS._player._position.x == 191) && (R2_GLOBALS._player._position.y == 142)) ) { - scene->_sceneMode = 1945; + if (R2_GLOBALS.getFlag(34)) { + _displayScreen.setDetails(1850, 25, -1, -1, 4, &_robot); + } else { + _displayScreen.setDetails(1850, 25, -1, -1, 2, (SceneItem *) NULL); } - if (scene->_sceneMode != 0) - scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL); -} + if (!R2_GLOBALS.getFlag(62)) { + _displayScreen.hide(); + } -void Scene1945::postInit(SceneObjectList *OwnerList) { - loadScene(1945); - SceneExt::postInit(); - R2_GLOBALS._sound1.play(220); + _background.setDetails(Rect(0, 0, 320, 200), 1850, 16, -1, -1, 1, NULL); - R2_GLOBALS._player.postInit(); - R2_GLOBALS._player.enableControl(CURSOR_USE); - R2_GLOBALS._player._canWalk = false; - R2_GLOBALS._player._characterScene[R2_SEEKER] = 1945; - R2_GLOBALS._player._characterIndex = R2_SEEKER; + R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1850; + R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1850; +} - _exitUp.setDetails(Rect(128, 0, 186, 10), EXITCURSOR_N, 1945); - _corridorExit.setDetails(Rect(238, 144, 274, 167), EXITCURSOR_E, 1945); +void Scene1850::remove() { + g_globals->_scenePalette.loadPalette(0); - _ladder.setDetails(Rect(141, 3, 167, 126), 1945, 9, -1, -1, 1, NULL); + R2_GLOBALS._scenePalette._palette[765] = 255; + R2_GLOBALS._scenePalette._palette[766] = 255; + R2_GLOBALS._scenePalette._palette[767] = 255; - if (!R2_GLOBALS.getFlag(43)) { - _corridorExit._enabled = false; - _gunpowder.postInit(); - _gunpowder.setup(1945, 4, 1); - _gunpowder.setPosition(Common::Point(253, 169)); - _gunpowder.fixPriority(150); + SceneExt::remove(); +} - if (R2_GLOBALS.getFlag(42)) - _gunpowder.setDetails(1945, 15, -1, -1, 1, (SceneItem *) NULL); - else - _gunpowder.hide(); +void Scene1850::signal() { + switch (_sceneMode) { + case 10: + R2_GLOBALS._player._effect = EFFECT_SHADED2; + R2_GLOBALS._player._shade = 6; - _coveringIce.postInit(); - _coveringIce.setup(1945, 8, 1); - _coveringIce.setPosition(Common::Point(253, 169)); - _coveringIce.fixPriority(130); + _companion._effect = EFFECT_SHADED2; + _companion._shade = 6; - _alcoholLamp.postInit(); - _alcoholLamp.setup(1945, 3, 1); - _alcoholLamp.hide(); - } else { - _corridorExit._enabled = true; - } + R2_GLOBALS._walkRegions.disableRegion(5); - switch (R2_GLOBALS._sceneManager._previousScene) { - case 1925: - R2_GLOBALS._scene1925CurrLevel = 0; - R2_GLOBALS.clearFlag(29); - R2_GLOBALS._player.setup(1925, 1, 10); - R2_GLOBALS._player.setPosition(Common::Point(154, 50)); + if (R2_GLOBALS.getFlag(68)) { + R2_GLOBALS._player.enableControl(); + } else { + R2_GLOBALS.setFlag(68); + _sceneMode = 20; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _stripManager.start(554, this); + } break; - case 1950: - _sceneMode = 1944; - setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL); - R2_GLOBALS._player.disableControl(CURSOR_USE); + case 11: + R2_GLOBALS.clearFlag(30); + R2_GLOBALS._sceneManager.changeScene(1800); break; - default: - R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); - R2_GLOBALS._player.setup(20, 5, 1); - R2_GLOBALS._player.setPosition(Common::Point(191, 142)); + case 15: + _sceneMode = 16; break; - } + case 16: + _sceneMode = 1870; + setAction(&_sequenceManager1, this, 1870, &R2_GLOBALS._player, &_companion, + &_screen, &_helmet, NULL); + break; + case 20: + R2_GLOBALS._player.enableControl(CURSOR_TALK); + break; + case 21: + R2_GLOBALS._player.disableControl(); + _sceneMode = 1877; + setAction(&_sequenceManager1, this, 1877, &R2_GLOBALS._player, &_companion, + &_robot, NULL); + break; + case 30: + R2_GLOBALS._player.disableControl(); + _sceneMode = 1882; + setAction(&_sequenceManager1, this, 1882, &R2_GLOBALS._player, NULL); + break; + case 1852: + // No break on purpose: + case 1853: + if (_sceneMode == 1851) { // At this point, SceneMode can't be equal to 1851 => dead code + R2_GLOBALS.setFlag(31); + _palette1.loadPalette(1850); + _sceneMode = 1850; + } else { + R2_GLOBALS.clearFlag(31); + _palette1.loadPalette(1851); + _sceneMode = 1851; + } - R2_GLOBALS._player._canWalk = false; - _nextSceneMode1 = 0; - _nextSceneMode2 = 0; + _shadeChanging = true; + if (R2_GLOBALS.getFlag(30)) { + _displayScreen.setAction(&_sequenceManager2, NULL, 1867, &_displayScreen, NULL); + } else if (R2_GLOBALS.getFlag(34)) { + if (R2_GLOBALS.getFlag(62)) { + R2_GLOBALS.clearFlag(62); + _displayScreen.setAction(&_sequenceManager2, this, 1851, &_displayScreen, NULL); + } else { + R2_GLOBALS.setFlag(62); + _displayScreen.setAction(&_sequenceManager2, this, 1850, &_displayScreen, NULL); + } + } else if (R2_GLOBALS.getFlag(33)) { + R2_GLOBALS.setFlag(62); + R2_GLOBALS.setFlag(34); + R2_GLOBALS._walkRegions.disableRegion(2); - _ice.setDetails(11, 1945, 3, -1, 5); - _hole.setDetails(Rect(238, 144, 274, 167), 1945, 0, -1, 2, 1, NULL); - _ice2.setDetails(Rect(27, 3, 292, 167), 1945, 3, -1, -1, 1, NULL); -} + _airbag.postInit(); + _airbag.setDetails(1850, 6, -1, -1, 5, &_robot); -void Scene1945::remove() { - R2_GLOBALS._sound1.fadeOut2(NULL); - SceneExt::remove(); -} + _sceneMode = 1879; -void Scene1945::signal() { - switch (_sceneMode) { - case 1940: - if (_nextSceneMode1 == 1943) { - _sceneMode = _nextSceneMode1; - setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_alcoholLamp, NULL); + _displayScreen.setAction(&_sequenceManager2, this, 1879, &_robot, + &_displayScreen, &_airbag, NULL); } else { - _sceneMode = 1946; - setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL); + _displayScreen.setAction(&_sequenceManager2, NULL, 1867, &_displayScreen, NULL); + } + + if (R2_GLOBALS.getFlag(34)) + R2_GLOBALS._scenePalette.addFader(_palette1._palette, 256, 5, NULL); + else + R2_GLOBALS._scenePalette.addFader(_palette1._palette, 256, 5, this); + + if (_sceneMode == 1851) + _shadeDirection = -20; + else + _shadeDirection = 20; + + _shadeCountdown = 20; + + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + if (_sceneMode == 1879) + _sceneMode = 1854; + + if (R2_GLOBALS.getFlag(32)) { + setAction(&_sequenceManager1, NULL, 1873, &R2_GLOBALS._player, NULL); + } else { + setAction(&_sequenceManager1, NULL, 1854, &R2_GLOBALS._player, NULL); + } + } else { + if (_sceneMode == 1879) + _sceneMode = 1855; + + if (R2_GLOBALS.getFlag(32)) { + setAction(&_sequenceManager1, NULL, 1874, &R2_GLOBALS._player, NULL); + } else { + setAction(&_sequenceManager1, NULL, 1855, &R2_GLOBALS._player, NULL); + } } - return; break; - case 1941: - if (_nextSceneMode1 == 0) { - R2_GLOBALS._scene1925CurrLevel = 0; - R2_GLOBALS.setFlag(29); - R2_GLOBALS._sceneManager.changeScene(1925); + case 1857: + if (R2_GLOBALS.getFlag(69)) { + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player._canWalk = false; } else { - _sceneMode = _nextSceneMode1; - _nextSceneMode1 = 0; - setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL); + _sceneMode = 1858; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _stripManager.start(555, this); + R2_GLOBALS.setFlag(69); } - return; - case 1942: - R2_INVENTORY.setObjectScene(R2_GUNPOWDER, 0); - _gunpowder.setDetails(1945, 15, -1, -1, 2, (SceneItem *) NULL); - R2_GLOBALS.setFlag(42); break; - case 1943: - R2_GLOBALS._sound1.fadeOut2(NULL); - R2_INVENTORY.setObjectScene(_lampUsed, 0); - _sceneMode = 1948; - setAction(&_sequenceManager1, this, _sceneMode, &_gunpowder, &_alcoholLamp, &_coveringIce, NULL); - R2_GLOBALS._player.setAction(&_sequenceManager2, NULL, 1941, &R2_GLOBALS._player, NULL); - return; - case 1944: + case 1858: + R2_GLOBALS._player.disableControl(); + _sceneMode = 1859; + setAction(&_sequenceManager1, this, 1859, &R2_GLOBALS._player, &_robot, NULL); + R2_GLOBALS.clearFlag(30); + break; + case 1859: + R2_GLOBALS.setFlag(70); + _sceneMode = 20; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _stripManager.start(575, this); + break; + case 1860: + if (_playerDest.x != 0) { + R2_GLOBALS._player.enableControl(); + + PlayerMover *mover = new PlayerMover(); + R2_GLOBALS._player.addMover(mover, &_playerDest, this); + + _playerDest = Common::Point(0, 0); + } + + switch (_seqNumber) { + case 1: + _sceneMode = 1853; + if (R2_GLOBALS.getFlag(32)) { + setAction(&_sequenceManager1, this, 1872, &R2_GLOBALS._player, NULL); + } else { + setAction(&_sequenceManager1, this, 1853, &R2_GLOBALS._player, NULL); + } + break; + case 2: + _sceneMode = 11; + setAction(&_sequenceManager1, this, 1865, &R2_GLOBALS._player, &_leftDoor, NULL); + break; + case 3: + _sceneMode = 11; + setAction(&_sequenceManager1, this, 1866, &R2_GLOBALS._player, &_rightDoor, NULL); + break; + default: + break; + } + + _seqNumber = 0; + break; + case 1870: + R2_GLOBALS._walkRegions.disableRegion(5); + R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 1); + R2_GLOBALS.setFlag(32); + R2_GLOBALS._player.enableControl(CURSOR_WALK); break; - case 1945: - R2_GLOBALS._sceneManager.changeScene(1950); - return; - case 1946: - if (_nextSceneMode1 == 1942) { - _sceneMode = _nextSceneMode1; - _nextSceneMode1 = 0; - setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_gunpowder, NULL); - return; - } - _sceneMode = 0; + case 1875: + R2_INVENTORY.setObjectScene(R2_AIRBAG, 1850); + _sceneMode = 21; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _stripManager.start(561, this); break; - case 1947: - if (_nextSceneMode1 == 1943) { - _sceneMode = _nextSceneMode1; - _nextSceneMode1 = 1948; - setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_alcoholLamp, NULL); + case 1877: + _screen.postInit(); + _screen._effect = EFFECT_SHADED2; + + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + _screen.setDetails(1850, 28, -1, -1, 2, (SceneItem *)NULL); } else { - _sceneMode = 1941; - setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL); + _screen.setDetails(1850, 30, -1, -1, 2, (SceneItem *)NULL); } - return; - case 1948: - R2_GLOBALS._sound1.play(220); - _corridorExit._enabled = true; - R2_GLOBALS._sceneItems.remove(&_gunpowder); - R2_GLOBALS.clearFlag(42); - R2_GLOBALS.setFlag(43); - _nextSceneMode1 = 1940; - // No break on purpose - case 1949: - _sceneMode = _nextSceneMode1; - if (_nextSceneMode2 == 1943) { - _nextSceneMode1 = _nextSceneMode2; - _nextSceneMode2 = 0; - setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_alcoholLamp, NULL); + + _helmet.postInit(); + _helmet._effect = EFFECT_SHADED2; + + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + _helmet.setDetails(1850, 29, -1, -1, 2, (SceneItem *)NULL); } else { - _nextSceneMode1 = 0; - setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL); + _helmet.setDetails(1850, 28, -1, -1, 2, (SceneItem *)NULL); } - return; + + if (R2_GLOBALS.getFlag(31)) { + _screen._shade = 0; + _helmet._shade = 0; + } else { + _screen._shade = 6; + _helmet._shade = 6; + } + + R2_GLOBALS.clearFlag(30); + _sceneMode = 15; + setAction(&_sequenceManager1, this, 1869, &R2_GLOBALS._player, &_screen, NULL); + _companion.setAction(&_sequenceManager2, this, 1868, &_companion, &_helmet, NULL); + break; + case 1878: + R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 1850); + R2_GLOBALS.setFlag(33); + R2_GLOBALS._walkRegions.disableRegion(2); + R2_GLOBALS._player.enableControl(); + break; + case 1879: + R2_GLOBALS._player.enableControl(); + break; + case 1881: + R2_GLOBALS._sceneManager.changeScene(1875); + break; + case 1882: + R2_INVENTORY.setObjectScene(R2_AIRBAG, 1); + R2_GLOBALS._player.enableControl(); + break; default: + R2_GLOBALS._player.enableControl(); break; } - - R2_GLOBALS._player.enableControl(CURSOR_USE); - R2_GLOBALS._player._canWalk = false; -} - -/*-------------------------------------------------------------------------- - * Scene 1950 - Flup Tube Corridor Maze - * - *--------------------------------------------------------------------------*/ - -Scene1950::KeypadWindow::KeypadWindow() { - _buttonIndex = 0; } -void Scene1950::KeypadWindow::synchronize(Serializer &s) { - SceneArea::synchronize(s); - - s.syncAsSint16LE(_buttonIndex); -} +void Scene1850::process(Event &event) { + if ( (event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_WALK) + && (R2_GLOBALS._player._characterIndex == R2_SEEKER) && (R2_GLOBALS.getFlag(30))) { + _playerDest = event.mousePos; + R2_GLOBALS._player.disableControl(); + _sceneMode = 1860; + if (R2_GLOBALS.getFlag(32)) { + setAction(&_sequenceManager1, this, 1860, &R2_GLOBALS._player, &_robot, NULL); + } else { + setAction(&_sequenceManager1, this, 1859, &R2_GLOBALS._player, &_robot, NULL); + } + R2_GLOBALS.clearFlag(30); + event.handled = true; + } -Scene1950::KeypadWindow::KeypadButton::KeypadButton() { - _buttonIndex = 0; - _pressed = false; - _toggled = false; + Scene::process(event); } -void Scene1950::KeypadWindow::KeypadButton::synchronize(Serializer &s) { - SceneActor::synchronize(s); +void Scene1850::dispatch() { + if (_shadeChanging) { + _shadeCountdown--; + if (_shadeCountdown == 0) + _shadeChanging = false; - s.syncAsSint16LE(_buttonIndex); - s.syncAsSint16LE(_pressed); - s.syncAsSint16LE(_toggled); -} + if (_shadeDirection >= 0) { + R2_GLOBALS._player._shade = (_shadeCountdown * 6) / _shadeDirection; + } else { + R2_GLOBALS._player._shade = ((_shadeCountdown * 6) / _shadeDirection) + 6; + } + R2_GLOBALS._player._flags |= OBJFLAG_PANES; -void Scene1950::KeypadWindow::KeypadButton::init(int indx) { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + _companion._shade = R2_GLOBALS._player._shade; + _companion._flags |= OBJFLAG_PANES; - _buttonIndex = indx; - _pressed = false; - _toggled = false; + _screen._shade = R2_GLOBALS._player._shade; + _screen._flags |= OBJFLAG_PANES; - postInit(); - setup(1971, 2, 1); - fixPriority(249); - setPosition(Common::Point(((_buttonIndex % 4) * 22) + 127, ((_buttonIndex / 4) * 19) + 71)); - scene->_sceneAreas.push_front(this); -} + _helmet._shade = R2_GLOBALS._player._shade; + _helmet._flags |= OBJFLAG_PANES; + } -void Scene1950::KeypadWindow::KeypadButton::process(Event &event) { - if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE) - && (_bounds.contains(event.mousePos)) && !_pressed) { - R2_GLOBALS._sound2.play(227); - if (!_toggled) { - setFrame(2); - _toggled = true; - } else { - setFrame(1); - _toggled = false; - } - _pressed = true; - event.handled = true; + if (R2_GLOBALS.getFlag(32)) { + _screen.setPosition(Common::Point(_displayScreen._position.x - 37, _displayScreen._position.y - 71)); + _helmet.setPosition(Common::Point(_displayScreen._position.x - 20, _displayScreen._position.y - 73)); } - if ((event.eventType == EVENT_BUTTON_UP) && _pressed) { - _pressed = false; - event.handled = true; - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - scene->doButtonPress(_buttonIndex); + if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1850) { + _airbag.setPosition(Common::Point(_displayScreen._position.x + 20, _displayScreen._position.y - 71)); } + + Scene::dispatch(); } -bool Scene1950::KeypadWindow::KeypadButton::startAction(CursorType action, Event &event) { - if (action == CURSOR_USE) - return false; - return SceneActor::startAction(action, event); +/*-------------------------------------------------------------------------- + * Scene 1875 - Rim Lift Computer + * + *--------------------------------------------------------------------------*/ + +Scene1875::Button::Button() { + _buttonId = 0; + _buttonDown = false; } -void Scene1950::KeypadWindow::remove() { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - for (_buttonIndex = 0; _buttonIndex < 16; ++_buttonIndex) { - scene->_sceneAreas.remove(&_buttons[_buttonIndex]); - _buttons[_buttonIndex].remove(); - } +void Scene1875::Button::synchronize(Serializer &s) { + SceneActor::synchronize(s); - ModalWindow::remove(); + s.syncAsSint16LE(_buttonId); + s.syncAsSint16LE(_buttonDown); +} - if (!R2_GLOBALS.getFlag(37)) - R2_GLOBALS._sound2.play(278); +void Scene1875::Button::doButtonPress() { + Scene1875 *scene = (Scene1875 *)R2_GLOBALS._sceneManager._scene; - R2_GLOBALS._player.disableControl(CURSOR_WALK); - scene->_eastExit._enabled = true; + R2_GLOBALS._sound1.play(227); - if (!R2_GLOBALS.getFlag(37)) { - if (R2_GLOBALS.getFlag(36)) { - scene->_sceneMode = 1964; - scene->setAction(&scene->_sequenceManager, scene, 1964, &R2_GLOBALS._player, NULL); + int newFrameNumber; + switch (_buttonId) { + case 3: + if ((scene->_map._frame == 1) && (scene->_button1._strip == 2)) { + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + scene->_sceneMode = 10; + scene->_stripManager.start(576, scene); } else { - scene->_sceneMode = 1965; - scene->setAction(&scene->_sequenceManager, scene, 1965, &R2_GLOBALS._player, NULL); + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 1890; + scene->_rimPosition.postInit(); + scene->setAction(&scene->_sequenceManager, scene, 1890, &scene->_rimPosition, NULL); } + break; + case 4: + newFrameNumber = scene->_map._frame + 1; + if (newFrameNumber > 6) + newFrameNumber = 1; + scene->_map.setFrame(newFrameNumber); + break; + case 5: + newFrameNumber = scene->_map._frame - 1; + if (newFrameNumber < 1) + newFrameNumber = 6; + scene->_map.setFrame(newFrameNumber); + break; + default: + break; } } -void Scene1950::KeypadWindow::setup2(int visage, int stripFrameNum, int frameNum, int posX, int posY) { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - - if (R2_GLOBALS._player._mover) - R2_GLOBALS._player.addMover(NULL); - R2_GLOBALS._player._canWalk = false; - - ModalWindow::setup2(visage, stripFrameNum, frameNum, posX, posY); - - _object1.fixPriority(248); - scene->_eastExit._enabled = false; - setup3(1950, 27, 28, 27); - - for (_buttonIndex = 0; _buttonIndex < 16; _buttonIndex++) - _buttons[_buttonIndex].init(_buttonIndex); -} - -void Scene1950::KeypadWindow::setup3(int resNum, int lookLineNum, int talkLineNum, int useLineNum) { - // Copy of Scene1200::LaserPanel::proc13() - _areaActor.setDetails(resNum, lookLineNum, talkLineNum, useLineNum, 2, (SceneItem *) NULL); -} - -/*--------------------------------------------------------------------------*/ - -bool Scene1950::Keypad::startAction(CursorType action, Event &event) { - if ((action != CURSOR_USE) || (R2_GLOBALS.getFlag(37))) - return SceneHotspot::startAction(action, event); +void Scene1875::Button::initButton(int buttonId) { + postInit(); + _buttonId = buttonId; + _buttonDown = false; + setVisage(1855); - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + if (_buttonId == 1) + setStrip(2); + else + setStrip(1); - R2_GLOBALS._player.disableControl(); - if (R2_GLOBALS.getFlag(36)) { - scene->_sceneMode = 1962; - scene->setAction(&scene->_sequenceManager, scene, 1962, &R2_GLOBALS._player, NULL); - } else { - scene->_sceneMode = 1963; - scene->setAction(&scene->_sequenceManager, scene, 1963, &R2_GLOBALS._player, NULL); + setFrame(_buttonId); + switch (_buttonId) { + case 1: + setPosition(Common::Point(20, 144)); + break; + case 2: + setPosition(Common::Point(82, 144)); + break; + case 3: + setPosition(Common::Point(136, 144)); + break; + case 4: + setPosition(Common::Point(237, 144)); + break; + case 5: + setPosition(Common::Point(299, 144)); + break; + default: + break; } - return true; -} - -bool Scene1950::Door::startAction(CursorType action, Event &event) { - if (action != R2_SCRITH_KEY) - return SceneActor::startAction(action, event); - - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - - R2_GLOBALS._player.disableControl(); - R2_INVENTORY.setObjectScene(R2_SCRITH_KEY, 0); - scene->_sceneMode = 1958; - scene->setAction(&scene->_sequenceManager, scene, 1958, &R2_GLOBALS._player, &scene->_door, NULL); - return true; -} - -bool Scene1950::Scrolls::startAction(CursorType action, Event &event) { - if ((action != CURSOR_USE) || (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) != 1950)) - return SceneActor::startAction(action, event); - - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - R2_GLOBALS._player.disableControl(); - scene->_sceneMode = 1968; - scene->setAction(&scene->_sequenceManager, scene, 1968, &R2_GLOBALS._player, NULL); - - return true; + setDetails(1875, 6, 1, -1, 2, (SceneItem *) NULL); } -bool Scene1950::Gem::startAction(CursorType action, Event &event) { - if ((action != CURSOR_USE) || (!R2_GLOBALS.getFlag(37))) - return SceneActor::startAction(action, event); +void Scene1875::Button::process(Event &event) { + if (!R2_GLOBALS._player._uiEnabled || event.handled) + return; - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + Scene1875 *scene = (Scene1875 *)R2_GLOBALS._sceneManager._scene; - R2_GLOBALS._player.disableControl(); - scene->_sceneMode = 1967; - scene->setAction(&scene->_sequenceManager, scene, 1967, &R2_GLOBALS._player, NULL); + if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE) + && (_bounds.contains(event.mousePos)) && !_buttonDown) { + setStrip(2); + switch (_buttonId) { + case 1: + R2_GLOBALS._sound2.play(227); + scene->_button2.setStrip(1); + break; + case 2: + R2_GLOBALS._sound2.play(227); + scene->_button1.setStrip(1); + break; + default: + break; + } + _buttonDown = true; + event.handled = true; + } - return true; + if ((event.eventType == EVENT_BUTTON_UP) && _buttonDown) { + if ((_buttonId == 3) || (_buttonId == 4) || (_buttonId == 5)) { + setStrip(1); + doButtonPress(); + } + _buttonDown = false; + event.handled = true; + } } -/*--------------------------------------------------------------------------*/ +void Scene1875::postInit(SceneObjectList *OwnerList) { + loadScene(1875); + SceneExt::postInit(); -Scene1950::Vampire::Vampire() { - _deadPosition = Common::Point(0, 0); - _deltaX = 0; - _deltaY = 0; - _vampireMode = 0; -} + R2_GLOBALS._player._characterScene[R2_QUINN] = 1875; + R2_GLOBALS._player._characterScene[R2_SEEKER] = 1875; -void Scene1950::Vampire::synchronize(Serializer &s) { - SceneActor::synchronize(s); + _stripManager.addSpeaker(&_quinnSpeaker); + _stripManager.addSpeaker(&_seekerSpeaker); - s.syncAsSint16LE(_deadPosition.x); - s.syncAsSint16LE(_deadPosition.y); - s.syncAsSint16LE(_deltaX); - s.syncAsSint16LE(_deltaY); - s.syncAsSint16LE(_vampireMode); -} + _button1.initButton(1); + _button2.initButton(2); + _button3.initButton(3); + _button4.initButton(4); + _button5.initButton(5); -void Scene1950::Vampire::signal() { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + _map.postInit(); + _map.setup(1855, 4, 1); + _map.setPosition(Common::Point(160, 116)); - switch (_vampireMode) { - case 19: { - _vampireMode = 0; - setVisage(1960); - if (R2_GLOBALS._flubMazeEntryDirection == 3) - setStrip(2); - else - setStrip(1); + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.hide(); - NpcMover *mover = new NpcMover(); - addMover(mover, &scene->_vampireDestPos, scene); + if (R2_GLOBALS._sceneManager._previousScene == 1625) { + R2_GLOBALS._sound1.play(122); + R2_GLOBALS._player.disableControl(); + _sceneMode = 11; + _rimPosition.postInit(); + setAction(&_sequenceManager, this, 1892, &_rimPosition, NULL); + } else { + if (R2_GLOBALS._sceneManager._previousScene == 3150) { + R2_GLOBALS._sound1.play(116); } - break; - case 20: { - // Non fatal shot - _vampireMode = 19; - R2_GLOBALS._player.setVisage(22); - if (R2_GLOBALS._flubMazeEntryDirection == 3) - R2_GLOBALS._player.setStrip(1); - else - R2_GLOBALS._player.setStrip(2); - R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); - R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._shotsRequired--; - - if (R2_GLOBALS._flubMazeEntryDirection == 3) - _deadPosition.x = _position.x + 10; - else - _deadPosition.x = _position.x - 10; - _deadPosition.y = _position.y - 4; - - setVisage(1961); - - if (R2_GLOBALS._flubMazeEntryDirection == 3) - setStrip(2); - else - setStrip(1); - - animate(ANIM_MODE_2, NULL); - Common::Point pt = _deadPosition; - PlayerMover *mover = new PlayerMover(); - addMover(mover, &pt, this); R2_GLOBALS._player.enableControl(); - } - break; - case 21: { - // Fatal shot - R2_GLOBALS._player.setVisage(22); - if (R2_GLOBALS._flubMazeEntryDirection == 3) - R2_GLOBALS._player.setStrip(1); - else - R2_GLOBALS._player.setStrip(2); - R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + R2_GLOBALS._player._canWalk = false; + } - setVisage(1961); - if (R2_GLOBALS._flubMazeEntryDirection == 3) - setStrip(4); - else - setStrip(3); - setDetails(1950, 15, -1, 17, 2, (SceneItem *) NULL); - addMover(NULL); - _numFrames = 8; - R2_GLOBALS._sound2.play(226); - animate(ANIM_MODE_5, NULL); - fixPriority(10); - - R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._isAlive = false; - R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._shotsRequired--; - R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._position = _position; - _deltaX = (_position.x - R2_GLOBALS._player._position.x) / 2; - _deltaY = (_position.y - R2_GLOBALS._player._position.y) / 2; - - byte vampireCount = 0; - for (byte i = 0; i < 18; ++i) { - if (!R2_GLOBALS._vampireData[i]._isAlive) - ++vampireCount; - } - - if (vampireCount == 18) { - R2_GLOBALS.setFlag(36); - _vampireMode = 23; - Common::Point pt(R2_GLOBALS._player._position.x + _deltaX, R2_GLOBALS._player._position.y + _deltaY); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } else if (vampireCount == 1) { - _vampireMode = 22; - Common::Point pt(R2_GLOBALS._player._position.x + _deltaX, R2_GLOBALS._player._position.y + _deltaY); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } else { - R2_GLOBALS._player.enableControl(CURSOR_WALK); - } + _screen.setDetails(Rect(43, 14, 275, 122), 1875, 9, 1, -1, 1, NULL); + _background.setDetails(Rect(0, 0, 320, 200), 1875, 3, -1, -1, 1, NULL); - if (R2_GLOBALS._flubMazeEntryDirection == 3) - scene->_eastExit._enabled = true; - else - scene->_westExit._enabled = true; + R2_GLOBALS._player._characterScene[R2_QUINN] = 1875; + R2_GLOBALS._player._characterScene[R2_SEEKER] = 1875; + R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1875; + R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1875; +} - scene->_vampireActive = false; - } +void Scene1875::signal() { + switch (_sceneMode) { + case 10: + R2_GLOBALS._player.disableControl(); + _sceneMode = 1891; + _rimPosition.postInit(); + setAction(&_sequenceManager, this, 1891, &_rimPosition, NULL); break; - case 22: - SceneItem::display(1950, 18, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - R2_GLOBALS._player.enableControl(CURSOR_WALK); + case 11: + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _sceneMode = 1892; + _stripManager.start(577, this); break; - case 23: - SceneItem::display(1950, 25, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - scene->_sceneMode = R2_GLOBALS._flubMazeEntryDirection; - scene->setAction(&scene->_sequenceManager, scene, 1960, &R2_GLOBALS._player, NULL); + case 1890: + _rimPosition.remove(); + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player._canWalk = false; + break; + case 1891: + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._sceneManager.changeScene(1625); + break; + case 1892: + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._sceneManager.changeScene(1900); break; default: + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player._canWalk = false; break; } } -bool Scene1950::Vampire::startAction(CursorType action, Event &event) { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - - if (!R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._isAlive || - (action != R2_PHOTON_STUNNER)) - return SceneActor::startAction(action, event); +void Scene1875::process(Event &event) { + Scene::process(event); - R2_GLOBALS._player.disableControl(); + _button1.process(event); + _button2.process(event); + _button3.process(event); + _button4.process(event); + _button5.process(event); +} - if (R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._shotsRequired <= 1) - _vampireMode = 21; - else - _vampireMode = 20; +/*-------------------------------------------------------------------------- + * Scene 1900 - Spill Mountains Elevator Exit + * + *--------------------------------------------------------------------------*/ - R2_GLOBALS._player.setVisage(25); - if (R2_GLOBALS._flubMazeEntryDirection == 3) - R2_GLOBALS._player.setStrip(2); - else - R2_GLOBALS._player.setStrip(1); - R2_GLOBALS._player.animate(ANIM_MODE_5, this); - R2_GLOBALS._sound3.play(99); +bool Scene1900::LiftDoor::startAction(CursorType action, Event &event) { + if (action != CURSOR_USE) + return SceneActor::startAction(action, event); - return true; -} + if ((_frame != 1) || (R2_GLOBALS._player._characterIndex != R2_SEEKER)) { + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + return SceneActor::startAction(action, event); + else + return true; + } -/*--------------------------------------------------------------------------*/ + Scene1900 *scene = (Scene1900 *)R2_GLOBALS._sceneManager._scene; -void Scene1950::NorthExit::changeScene() { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + R2_GLOBALS._player.enableControl(CURSOR_USE); - _enabled = false; - R2_GLOBALS._player.disableControl(CURSOR_WALK); - R2_GLOBALS._flubMazeEntryDirection = 1; - scene->_sceneMode = 11; + if (_position.x >= 160) { + scene->_sceneMode = 1905; + scene->setAction(&scene->_sequenceManager1, scene, 1905, &R2_GLOBALS._player, &scene->_rightDoor, NULL); + } else { + R2_GLOBALS.setFlag(29); + scene->_sceneMode = 1904; + scene->setAction(&scene->_sequenceManager1, scene, 1904, &R2_GLOBALS._player, &scene->_leftDoor, NULL); + } - Common::Point pt(160, 127); - PlayerMover *mover = new PlayerMover(); - R2_GLOBALS._player.addMover(mover, &pt, scene); + return true; } -void Scene1950::UpExit::changeScene() { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; +void Scene1900::WestExit::changeScene() { + Scene1900 *scene = (Scene1900 *)R2_GLOBALS._sceneManager._scene; - _enabled = false; R2_GLOBALS._player.disableControl(CURSOR_WALK); - R2_GLOBALS._flubMazeEntryDirection = 2; - scene->_sceneMode = 12; + scene->_sceneMode = 10; - if (!scene->_upExitStyle) { - if (R2_GLOBALS.getFlag(36)) - scene->setAction(&scene->_sequenceManager, scene, 1953, &R2_GLOBALS._player, NULL); - else - scene->setAction(&scene->_sequenceManager, scene, 1970, &R2_GLOBALS._player, NULL); - } else { - if (R2_GLOBALS.getFlag(36)) - scene->setAction(&scene->_sequenceManager, scene, 1952, &R2_GLOBALS._player, NULL); - else - scene->setAction(&scene->_sequenceManager, scene, 1969, &R2_GLOBALS._player, NULL); - } + Common::Point pt(-10, 135); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); } -void Scene1950::EastExit::changeScene() { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; +void Scene1900::EastExit::changeScene() { + Scene1900 *scene = (Scene1900 *)R2_GLOBALS._sceneManager._scene; - _enabled = false; R2_GLOBALS._player.disableControl(CURSOR_WALK); - R2_GLOBALS._flubMazeEntryDirection = 3; - scene->_sceneMode = 13; - - if (scene->_vampireActive) - R2_GLOBALS._player.animate(ANIM_MODE_9); + scene->_sceneMode = 11; - Common::Point pt(340, 160); + Common::Point pt(330, 135); NpcMover *mover = new NpcMover(); R2_GLOBALS._player.addMover(mover, &pt, scene); } -void Scene1950::DownExit::changeScene() { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; +void Scene1900::postInit(SceneObjectList *OwnerList) { + loadScene(1900); + SceneExt::postInit(); - _enabled = false; - R2_GLOBALS._player.disableControl(CURSOR_WALK); - R2_GLOBALS._flubMazeEntryDirection = 4; - scene->_sceneMode = 14; + // Debug message, skipped - if (R2_GLOBALS.getFlag(36)) - scene->setAction(&scene->_sequenceManager, scene, 1956, &R2_GLOBALS._player, NULL); - else - scene->setAction(&scene->_sequenceManager, scene, 1973, &R2_GLOBALS._player, NULL); -} + if (R2_GLOBALS._sceneManager._previousScene == -1) { + R2_GLOBALS._sceneManager._previousScene = 1925; + R2_GLOBALS._player._characterIndex = R2_SEEKER; + R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1925; + } -void Scene1950::SouthExit::changeScene() { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + if (R2_GLOBALS._sceneManager._previousScene != 1875) + R2_GLOBALS._sound1.play(200); - _enabled = false; - R2_GLOBALS._player.disableControl(CURSOR_WALK); - R2_GLOBALS._flubMazeEntryDirection = 5; - scene->_sceneMode = 15; + _stripManager.setColors(60, 255); + _stripManager.setFontNumber(3); + _stripManager.addSpeaker(&_seekerSpeaker); - Common::Point pt(160, 213); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, scene); -} + _westExit.setDetails(Rect(0, 105, 14, 145), EXITCURSOR_W, 2000); + _westExit.setDest(Common::Point(14, 135)); -void Scene1950::WestExit::changeScene() { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + _eastExit.setDetails(Rect(305, 105, 320, 145), EXITCURSOR_E, 2000); + _eastExit.setDest(Common::Point(315, 135)); - _enabled = false; - R2_GLOBALS._player.disableControl(CURSOR_WALK); - R2_GLOBALS._flubMazeEntryDirection = 6; + R2_GLOBALS._player.postInit(); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + R2_GLOBALS._player.setup(2008, 3, 1); + else + R2_GLOBALS._player.setup(20, 3, 1); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + R2_GLOBALS._player._moveDiff = Common::Point(3, 2); + else + R2_GLOBALS._player._moveDiff = Common::Point(5, 3); + R2_GLOBALS._player.disableControl(); - if (R2_GLOBALS._flubMazeArea == 2) { - // In the very first corridor area after the Scrith Door - if ((R2_GLOBALS.getFlag(36)) && (R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 2) && (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 2)) { - scene->_sceneMode = 1961; - Common::Point pt(-20, 160); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, scene); - } else { - if (!R2_GLOBALS.getFlag(36)) - SceneItem::display(1950, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - if ((R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 1950) || (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 1950)) - SceneItem::display(1950, 34, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - scene->_sceneMode = 0; - Common::Point pt(30, 160); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, scene); - } - } else { - if (scene->_vampireActive) - R2_GLOBALS._player.animate(ANIM_MODE_9); + if (R2_GLOBALS._sceneManager._previousScene != 1925) + R2_GLOBALS.clearFlag(29); - scene->_sceneMode = 16; - Common::Point pt(-20, 160); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, scene); - } -} + _leftDoor.postInit(); + _leftDoor.setup(1901, 1, 1); + _leftDoor.setPosition(Common::Point(95, 109)); + _leftDoor.fixPriority(100); -void Scene1950::ShaftExit::changeScene() { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + _leftDoor.setDetails(1900, 0, 1, 2, 1, (SceneItem *) NULL); + else + _leftDoor.setDetails(1900, 0, 1, -1, 1, (SceneItem *) NULL); - _enabled = false; - R2_GLOBALS._player.disableControl(CURSOR_WALK); - R2_GLOBALS._flubMazeEntryDirection = 0; - scene->_sceneMode = 1951; - scene->setAction(&scene->_sequenceManager, scene, 1951, &R2_GLOBALS._player, NULL); -} + _rightDoor.postInit(); + _rightDoor.setup(1901, 2, 1); + _rightDoor.setPosition(Common::Point(225, 109)); + _rightDoor.fixPriority(100); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + _rightDoor.setDetails(1900, 0, 1, 2, 1, (SceneItem *) NULL); + else + _rightDoor.setDetails(1900, 0, 1, -1, 1, (SceneItem *) NULL); -void Scene1950::DoorExit::changeScene() { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + if (R2_GLOBALS._sceneManager._previousScene != 1875) { + _leftDoorFrame.postInit(); + _leftDoorFrame.setup(1945, 6, 1); + _leftDoorFrame.setPosition(Common::Point(96, 109)); + _leftDoorFrame.fixPriority(80); - _enabled = false; - R2_GLOBALS._player.disableControl(CURSOR_WALK); - R2_GLOBALS._flubMazeEntryDirection = 3; - if (R2_GLOBALS._player._visage == 22) { - scene->_sceneMode = 1975; - scene->setAction(&scene->_sequenceManager, scene, 1975, &R2_GLOBALS._player, NULL); - } else { - SceneItem::display(1950, 22, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - R2_GLOBALS._flubMazeEntryDirection = 0; - scene->_sceneMode = 0; - Common::Point pt(250, 150); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, scene); - _enabled = true; + _rightDoorFrame.postInit(); + _rightDoorFrame.setup(1945, 6, 2); + _rightDoorFrame.setPosition(Common::Point(223, 109)); + _rightDoorFrame.fixPriority(80); } -} -/*--------------------------------------------------------------------------*/ + if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1875) { + R2_GLOBALS._player._characterIndex = R2_QUINN; + _companion.postInit(); + _sceneMode = 20; + R2_GLOBALS._player.setAction(&_sequenceManager1, NULL, 1901, &R2_GLOBALS._player, &_leftDoor, NULL); + _companion.setAction(&_sequenceManager2, this, 1900, &_companion, &_rightDoor, NULL); + } else if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1925) { + if (R2_GLOBALS.getFlag(29)) { + R2_GLOBALS.clearFlag(29); + _leftDoor.hide(); -Scene1950::Scene1950() { - _upExitStyle = false; - _removeFlag = false; - _vampireActive = false; - _vampireDestPos = Common::Point(0, 0); - _vampireIndex = 0; -} + R2_GLOBALS._player.setStrip(6); + R2_GLOBALS._player.setPosition(Common::Point(90, 106)); + _sceneMode = 1906; + setAction(&_sequenceManager1, this, 1906, &R2_GLOBALS._player, &_leftDoor, NULL); + } else { + _rightDoor.hide(); + R2_GLOBALS._player.setStrip(5); + R2_GLOBALS._player.setPosition(Common::Point(230, 106)); + _sceneMode = 1907; + setAction(&_sequenceManager1, this, 1907, &R2_GLOBALS._player, &_rightDoor, NULL); + } -void Scene1950::synchronize(Serializer &s) { - SceneExt::synchronize(s); + if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) { + _companion.postInit(); + _companion.setPosition(Common::Point(30, 110)); + R2_GLOBALS._walkRegions.disableRegion(1); + _companion.setup(2008, 3, 1); + _companion.setDetails(9001, 0, -1, -1, 1, (SceneItem *) NULL); + } + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 1900; + } else { + if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) { + _companion.postInit(); + _companion.setPosition(Common::Point(30, 110)); + R2_GLOBALS._walkRegions.disableRegion(1); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + _companion.setup(20, 3, 1); + _companion.setDetails(9002, 1, -1, -1, 1, (SceneItem *) NULL); + } else { + _companion.setup(2008, 3, 1); + _companion.setDetails(9001, 0, -1, -1, 1, (SceneItem *) NULL); + } + } - s.syncAsSint16LE(_upExitStyle); - s.syncAsSint16LE(_removeFlag); - s.syncAsSint16LE(_vampireActive); - s.syncAsSint16LE(_vampireDestPos.x); - s.syncAsSint16LE(_vampireDestPos.y); - s.syncAsSint16LE(_vampireIndex); -} - -void Scene1950::initArea() { - _northExit._enabled = false; - _upExit._enabled = false; - _eastExit._enabled = false; - _downExit._enabled = false; - _southExit._enabled = false; - _westExit._enabled = false; - _shaftExit._enabled = false; - _doorExit._enabled = false; - _northExit._insideArea = false; - _upExit._insideArea = false; - _eastExit._insideArea = false; - _downExit._insideArea = false; - _southExit._insideArea = false; - _westExit._insideArea = false; - _shaftExit._insideArea = false; - _doorExit._insideArea = false; - _northExit._moving = false; - _upExit._moving = false; - _eastExit._moving = false; - _downExit._moving = false; - _southExit._moving = false; - _westExit._moving = false; - _shaftExit._moving = false; - _doorExit._moving = false; - _upExitStyle = false; - - switch (R2_GLOBALS._flubMazeArea - 1) { - case 0: - loadScene(1948); - break; - case 1: - // No break on purpose - case 8: - // No break on purpose - case 10: - // No break on purpose - case 12: - // No break on purpose - case 16: - // No break on purpose - case 19: - // No break on purpose - case 23: - // No break on purpose - case 30: - // No break on purpose - case 44: - // No break on purpose - case 72: - // No break on purpose - case 74: - // No break on purpose - case 86: - // No break on purpose - case 96: - // No break on purpose - case 103: - loadScene(1950); - break; - case 2: - // No break on purpose - case 29: - loadScene(1965); - break; - case 3: - // No break on purpose - case 9: - // No break on purpose - case 11: - // No break on purpose - case 15: - // No break on purpose - case 24: - // No break on purpose - case 39: - // No break on purpose - case 45: - // No break on purpose - case 71: - // No break on purpose - case 73: - // No break on purpose - case 75: - // No break on purpose - case 79: - // No break on purpose - case 85: - // No break on purpose - case 87: - // No break on purpose - case 95: - loadScene(1955); - break; - case 4: - // No break on purpose - case 6: - // No break on purpose - case 13: - // No break on purpose - case 27: - // No break on purpose - case 41: - // No break on purpose - case 48: - // No break on purpose - case 50: - // No break on purpose - case 54: - // No break on purpose - case 76: - // No break on purpose - case 80: - // No break on purpose - case 90: - // No break on purpose - case 104: - loadScene(1975); - break; - case 5: - // No break on purpose - case 7: - // No break on purpose - case 14: - // No break on purpose - case 28: - // No break on purpose - case 32: - // No break on purpose - case 47: - // No break on purpose - case 53: - loadScene(1997); - break; - case 17: - // No break on purpose - case 20: - // No break on purpose - case 25: - // No break on purpose - case 31: - // No break on purpose - case 33: - // No break on purpose - case 46: - loadScene(1995); - break; - case 18: - // No break on purpose - case 22: - // No break on purpose - case 26: - // No break on purpose - case 36: - // No break on purpose - case 38: - // No break on purpose - case 43: - // No break on purpose - case 51: - // No break on purpose - case 70: - // No break on purpose - case 78: - // No break on purpose - case 84: - // No break on purpose - case 89: - // No break on purpose - case 101: - loadScene(1970); - break; - case 21: - // No break on purpose - case 34: - // No break on purpose - case 57: - // No break on purpose - case 58: - // No break on purpose - case 59: - // No break on purpose - case 62: - // No break on purpose - case 65: - loadScene(1980); - break; - case 35: - // No break on purpose - case 61: - // No break on purpose - case 77: - // No break on purpose - case 83: - loadScene(1982); - break; - case 37: - // No break on purpose - case 52: - // No break on purpose - case 82: - // No break on purpose - case 88: - // No break on purpose - case 92: - // No break on purpose - case 97: - // No break on purpose - case 100: - loadScene(1962); - break; - case 40: - // No break on purpose - case 102: - loadScene(1960); - break; - case 42: - // No break on purpose - case 55: - // No break on purpose - case 60: - // No break on purpose - case 66: - // No break on purpose - case 68: - // No break on purpose - case 69: - // No break on purpose - case 93: - // No break on purpose - case 98: - loadScene(1990); - break; - case 49: - // No break on purpose - case 81: - // No break on purpose - case 91: - // No break on purpose - case 94: - // No break on purpose - case 99: - loadScene(1967); - break; - case 56: - // No break on purpose - case 63: - // No break on purpose - case 64: - // No break on purpose - case 67: - loadScene(1985); - _upExitStyle = true; - break; - default: - break; + if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) { + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + if (R2_GLOBALS._spillLocation[R2_QUINN] == 5) { + _sceneMode = 1902; + setAction(&_sequenceManager1, this, 1902, &R2_GLOBALS._player, NULL); + } else { + _sceneMode = 1903; + setAction(&_sequenceManager1, this, 1903, &R2_GLOBALS._player, NULL); + } + } else { + if (R2_GLOBALS._spillLocation[R2_SEEKER] == 5) { + _sceneMode = 1908; + setAction(&_sequenceManager1, this, 1908, &R2_GLOBALS._player, NULL); + } else { + _sceneMode = 1909; + setAction(&_sequenceManager1, this, 1909, &R2_GLOBALS._player, NULL); + } + } + } else { + R2_GLOBALS._player.setPosition(Common::Point(160, 135)); + R2_GLOBALS._player.enableControl(); + } + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 1900; } - if (R2_GLOBALS._flubMazeArea != 1) - R2_GLOBALS._walkRegions.load(1950); + _elevator.setDetails(Rect(77, 2, 240, 103), 1900, 6, -1, -1, 1, NULL); + _background.setDetails(Rect(0, 0, 320, 200), 1900, 3, -1, -1, 1, NULL); +} - switch (R2_GLOBALS._flubMazeArea - 1) { - case 0: - _shaftExit._enabled = true; - if ((R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) == 0) && (R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 1950)) - _doorExit._enabled = true; - R2_GLOBALS._walkRegions.disableRegion(2); - R2_GLOBALS._walkRegions.disableRegion(3); - R2_GLOBALS._walkRegions.disableRegion(4); - R2_GLOBALS._walkRegions.disableRegion(5); - R2_GLOBALS._walkRegions.disableRegion(6); - break; - case 1: - // No break on purpose - case 2: - // No break on purpose - case 3: - // No break on purpose - case 8: - // No break on purpose - case 9: - // No break on purpose +void Scene1900::remove() { + R2_GLOBALS._sound1.fadeOut(NULL); + SceneExt::remove(); +} + +void Scene1900::signal() { + switch (_sceneMode) { case 10: - // No break on purpose + R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] = 5; + R2_GLOBALS._sceneManager.changeScene(2000); + break; case 11: - // No break on purpose - case 12: - // No break on purpose - case 15: - // No break on purpose - case 16: - // No break on purpose - case 19: - // No break on purpose - case 23: - // No break on purpose - case 24: - // No break on purpose - case 29: - // No break on purpose - case 30: - // No break on purpose - case 39: - // No break on purpose - case 40: - // No break on purpose - case 44: - // No break on purpose - case 45: - // No break on purpose - case 71: - // No break on purpose - case 72: - // No break on purpose - case 73: - // No break on purpose - case 74: - // No break on purpose - case 75: - // No break on purpose - case 79: - // No break on purpose - case 85: - // No break on purpose - case 86: - // No break on purpose - case 87: - // No break on purpose - case 95: - // No break on purpose - case 96: - // No break on purpose - case 102: - // No break on purpose - case 103: - _eastExit._enabled = true; - _westExit._enabled = true; + R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] = 6; + R2_GLOBALS._sceneManager.changeScene(2000); break; - case 4: - // No break on purpose - case 6: - // No break on purpose - case 13: - // No break on purpose - case 17: - // No break on purpose case 20: - // No break on purpose - case 25: - // No break on purpose - case 27: - // No break on purpose - case 31: - // No break on purpose - case 33: - // No break on purpose - case 37: - // No break on purpose - case 41: - // No break on purpose - case 46: - // No break on purpose - case 48: - // No break on purpose - case 50: - // No break on purpose - case 52: - // No break on purpose - case 54: - // No break on purpose - case 76: - // No break on purpose - case 80: - // No break on purpose - case 82: - // No break on purpose - case 88: - // No break on purpose - case 90: - // No break on purpose - case 92: - // No break on purpose - case 97: - // No break on purpose - case 100: - // No break on purpose - case 104: - _westExit._enabled = true; - R2_GLOBALS._walkRegions.disableRegion(6); - R2_GLOBALS._walkRegions.disableRegion(9); + ++_sceneMode; + R2_GLOBALS._events.setCursor(CURSOR_WALK); + _stripManager.start(1300, this); + break; + case 21: + ++_sceneMode; + R2_GLOBALS._player.disableControl(); + if (R2_GLOBALS._player._action) + R2_GLOBALS._player._action->_endHandler = this; + else + signal(); break; - case 5: - // No break on purpose - case 7: - // No break on purpose - case 14: - // No break on purpose - case 18: - // No break on purpose case 22: + _sceneMode = 1910; + _companion.setAction(&_sequenceManager2, this, 1910, &_companion, NULL); + break; + case 1904: + R2_GLOBALS._scene1925CurrLevel = -3; // No break on purpose - case 26: - // No break on purpose - case 28: - // No break on purpose - case 32: - // No break on purpose - case 36: - // No break on purpose - case 38: - // No break on purpose - case 43: - // No break on purpose - case 47: - // No break on purpose - case 49: - // No break on purpose - case 51: - // No break on purpose - case 53: - // No break on purpose - case 70: - // No break on purpose - case 78: - // No break on purpose - case 81: - // No break on purpose - case 84: - // No break on purpose - case 89: - // No break on purpose - case 91: - // No break on purpose - case 94: - // No break on purpose - case 99: - // No break on purpose - case 101: - _eastExit._enabled = true; - R2_GLOBALS._walkRegions.disableRegion(1); - R2_GLOBALS._walkRegions.disableRegion(7); - R2_GLOBALS._walkRegions.disableRegion(13); + case 1905: + R2_GLOBALS._player.disableControl(CURSOR_WALK); + R2_GLOBALS._sceneManager.changeScene(1925); + break; + case 1910: + R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 2535); + R2_GLOBALS._player.disableControl(CURSOR_WALK); + R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1900; + R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1900; + R2_GLOBALS._sceneManager.changeScene(2450); break; + case 1906: + R2_GLOBALS._scene1925CurrLevel = -3; + // No break on purpose default: - R2_GLOBALS._walkRegions.disableRegion(1); - R2_GLOBALS._walkRegions.disableRegion(6); - R2_GLOBALS._walkRegions.disableRegion(7); - R2_GLOBALS._walkRegions.disableRegion(9); - R2_GLOBALS._walkRegions.disableRegion(13); + R2_GLOBALS._player.enableControl(); break; } +} + +/*-------------------------------------------------------------------------- + * Scene 1925 - Spill Mountains Elevator Shaft + * + *--------------------------------------------------------------------------*/ + +Scene1925::Scene1925() { + _newSceneMode = 0; + for (int i = 0; i < 5; i++) + _levelResNum[i] = 0; +} + +void Scene1925::synchronize(Serializer &s) { + SceneExt::synchronize(s); + + s.syncAsSint16LE(_newSceneMode); + for (int i = 0; i < 5; i++) + s.syncAsSint16LE(_levelResNum[i]); +} + +bool Scene1925::Button::startAction(CursorType action, Event &event) { + if (action != CURSOR_USE) + return SceneHotspot::startAction(action, event); + + if ((R2_GLOBALS._player._position.x == 110) && (R2_GLOBALS._player._position.y == 100)) + return SceneHotspot::startAction(action, event); + + Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene; + + if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 20)) + scene->_sceneMode = 1928; + else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 200)) + scene->_sceneMode = 1929; + else + scene->_sceneMode = 1930; + + R2_GLOBALS._player.disableControl(CURSOR_WALK); + scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, + &scene->_door, NULL); + return true; +} + +bool Scene1925::Ladder::startAction(CursorType action, Event &event) { + if ((!R2_GLOBALS.getFlag(29)) || (action != CURSOR_USE)) + return SceneHotspot::startAction(action, event); + + Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene; + + R2_GLOBALS._player.disableControl(CURSOR_USE); + scene->_sceneMode = 0; + + if ((R2_GLOBALS._player._position.x == 110) && (R2_GLOBALS._player._position.y == 100)) { + scene->_westExit._enabled = false; + scene->_sceneMode = 1925; + scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, + &R2_GLOBALS._player, &scene->_door, NULL); + return true; + } + + if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 20) && (event.mousePos.y >= 30)) { + scene->_sceneMode = 1931; + } else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 200) && (event.mousePos.y < 140)) { + scene->_sceneMode = 1932; + } else if ( ( ((R2_GLOBALS._player._position.x == 112) && (R2_GLOBALS._player._position.y == 101)) + || ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 110)) + ) && (event.mousePos.y >= 100)) { + scene->_sceneMode = 1926; + } else if ( ( ((R2_GLOBALS._player._position.x == 112) && (R2_GLOBALS._player._position.y == 101)) + || ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 110)) + ) && (event.mousePos.y < 60)) { + scene->_sceneMode = 1927; + } else { + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = false; + } - _northDoorway.remove(); - _northDoorway.removeObject(); - _southDoorway.remove(); + if (scene->_sceneMode != 0) + scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL); - switch (R2_GLOBALS._flubMazeArea - 4) { - case 0: - // No break on purpose - case 3: - // No break on purpose - case 16: - // No break on purpose - case 22: - // No break on purpose - case 24: - // No break on purpose - case 32: - // No break on purpose - case 33: - // No break on purpose - case 45: - // No break on purpose - case 46: - // No break on purpose - case 48: - // No break on purpose - case 51: - // No break on purpose - case 56: - // No break on purpose - case 59: - // No break on purpose - case 67: - // No break on purpose - case 68: - // No break on purpose - case 70: - // No break on purpose - case 73: - // No break on purpose - case 82: - // No break on purpose - case 90: - _northExit._enabled = true; - _northDoorway.setup(1950, (R2_GLOBALS._flubMazeArea % 2) + 1, 1, 160, 137, 25); - //visage,strip,frame,px,py,priority,effect - _southDoorway.postInit(); - _southDoorway.setVisage(1950); - _southDoorway.setStrip((((R2_GLOBALS._flubMazeArea - 1) / 35) % 2) + 1); - _southDoorway.setFrame(2); - _southDoorway.setPosition(Common::Point(160, 167)); - _southDoorway.fixPriority(220); - R2_GLOBALS._walkRegions.disableRegion(3); - R2_GLOBALS._walkRegions.disableRegion(4); - break; - case 7: - // No break on purpose - case 10: - // No break on purpose - case 23: - // No break on purpose - case 29: - // No break on purpose - case 31: - // No break on purpose - case 39: - // No break on purpose - case 40: - // No break on purpose - case 52: - // No break on purpose - case 53: - // No break on purpose - case 55: - // No break on purpose - case 63: - // No break on purpose - case 65: - // No break on purpose - case 66: - // No break on purpose - case 75: - // No break on purpose - case 77: - // No break on purpose - case 81: - // No break on purpose - case 87: - // No break on purpose - case 89: - // No break on purpose - case 97: - _southExit._enabled = true; + return true; +} - _southDoorway.postInit(); - _southDoorway.setVisage(1950); - _southDoorway.setStrip((((R2_GLOBALS._flubMazeArea - 1) / 35) % 2) + 1); - _southDoorway.setFrame(3); - _southDoorway.setPosition(Common::Point(160, 167)); - _southDoorway.fixPriority(220); - break; - case 58: - // No break on purpose - case 74: - // No break on purpose - case 80: - _northExit._enabled = true; - _southExit._enabled = true; +void Scene1925::ExitUp::changeScene() { + Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene; - _northDoorway.setup(1950, (R2_GLOBALS._flubMazeArea % 2) + 1, 1, 160, 137, 25); + _moving = false; + R2_GLOBALS._player.disableControl(CURSOR_USE); + scene->_sceneMode = 0; - _southDoorway.postInit(); - _southDoorway.setVisage(1950); - _southDoorway.setStrip((((R2_GLOBALS._flubMazeArea - 1) / 35) % 2) + 1); - _southDoorway.setFrame(3); - _southDoorway.setPosition(Common::Point(160, 167)); - _southDoorway.fixPriority(220); - R2_GLOBALS._walkRegions.disableRegion(3); - R2_GLOBALS._walkRegions.disableRegion(4); - break; - default: - _southDoorway.postInit(); - _southDoorway.setVisage(1950); - _southDoorway.setStrip(((R2_GLOBALS._flubMazeArea - 1) / 35) % 2 + 1); - _southDoorway.setFrame(2); - _southDoorway.setPosition(Common::Point(160, 167)); - _southDoorway.fixPriority(220); - break; + if ((R2_GLOBALS._player._position.x == 110) && (R2_GLOBALS._player._position.y == 100)) { + scene->_westExit._enabled = false; + scene->_newSceneMode = 1927; + scene->_sceneMode = 1925; + scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, + &R2_GLOBALS._player, &scene->_door, NULL); + return; } - switch (R2_GLOBALS._flubMazeArea - 3) { - case 0: - // No break on purpose + if ( ((R2_GLOBALS._player._position.x == 112) && (R2_GLOBALS._player._position.y == 101)) + || ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 110))) { + scene->_sceneMode = 1927; + } else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 200)) { + scene->_sceneMode = 1932; + } + + if (scene->_sceneMode != 0) + scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL); + else { + scene->_sceneMode = 1932; + scene->signal(); + } +} + +void Scene1925::ExitDown::changeScene() { + Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene; + + _moving = false; + R2_GLOBALS._player.disableControl(CURSOR_USE); + scene->_sceneMode = 0; + + if ((R2_GLOBALS._player._position.x == 110) && (R2_GLOBALS._player._position.y == 100)) { + scene->_westExit._enabled = false; + scene->_newSceneMode = 1926; + scene->_sceneMode = 1925; + scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, + &R2_GLOBALS._player, &scene->_door, NULL); + return; + } + + if ( ((R2_GLOBALS._player._position.x == 112) && (R2_GLOBALS._player._position.y == 101)) + || ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 110))) { + scene->_sceneMode = 1926; + } else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 20)) { + scene->_sceneMode = 1931; + } + + if (scene->_sceneMode == 0) { + scene->_sceneMode = 1931; + scene->signal(); + } else + scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL); +} + +void Scene1925::WestExit::changeScene() { + Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene; + + _moving = false; + R2_GLOBALS._player.disableControl(CURSOR_WALK); + scene->_sceneMode = 1921; + scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL); +} + +void Scene1925::EastExit::changeScene() { + Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene; + + _moving = false; + R2_GLOBALS._player.disableControl(CURSOR_WALK); + scene->_sceneMode = 1920; + scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL); +} + +void Scene1925::changeLevel(bool upFlag) { + if (R2_GLOBALS._scene1925CurrLevel < 0) + R2_GLOBALS._scene1925CurrLevel = 3; + + if (upFlag) { + R2_GLOBALS._player.setup(1925, 1, 1); + R2_GLOBALS._player.setPosition(Common::Point(154, 200)); + ++R2_GLOBALS._scene1925CurrLevel; + } else { + R2_GLOBALS._player.setup(1925, 1, 1); + R2_GLOBALS._player.setPosition(Common::Point(154, 20)); + R2_GLOBALS._scene1925CurrLevel--; + } + + switch (R2_GLOBALS._scene1925CurrLevel) { + case -1: + R2_GLOBALS._sceneManager.changeScene(1945); + return; + break; case 3: - // No break on purpose - case 5: - // No break on purpose - case 12: - // No break on purpose - case 15: - // No break on purpose - case 18: - // No break on purpose - case 19: - // No break on purpose - case 23: - // No break on purpose - case 26: - // No break on purpose - case 27: - // No break on purpose - case 29: - // No break on purpose - case 30: - // No break on purpose - case 31: - // No break on purpose - case 32: - // No break on purpose - case 44: - // No break on purpose - case 45: - // No break on purpose - case 51: - // No break on purpose - case 55: - // No break on purpose - case 56: - // No break on purpose - case 57: - // No break on purpose - case 60: - // No break on purpose - case 63: - _upExit._enabled = true; + loadScene(_levelResNum[4]); + _button.setDetails(Rect(133, 68, 140, 77), 1925, 3, -1, 5, 2, NULL); + _door.setDetails(1925, 0, 1, 2, 2, (SceneItem *) NULL); + _door.show(); break; - case 54: - // No break on purpose - case 61: - // No break on purpose - case 62: - // No break on purpose - case 65: - _upExit._enabled = true; - // No break on purpose - case 35: - // No break on purpose - case 38: - // No break on purpose - case 40: - // No break on purpose - case 47: - // No break on purpose - case 50: - // No break on purpose - case 53: - // No break on purpose - case 58: - // No break on purpose - case 64: - // No break on purpose - case 66: - // No break on purpose - case 67: - // No break on purpose - case 79: - // No break on purpose - case 80: - // No break on purpose - case 86: - // No break on purpose - case 89: - // No break on purpose - case 90: - // No break on purpose - case 91: - // No break on purpose - case 92: - // No break on purpose - case 95: - // No break on purpose - case 96: + case 512: + R2_GLOBALS._scene1925CurrLevel = 508; // No break on purpose - case 97: + default: + loadScene(_levelResNum[(R2_GLOBALS._scene1925CurrLevel % 4)]); + R2_GLOBALS._sceneItems.remove(&_button); + R2_GLOBALS._sceneItems.remove(&_door); + _door.hide(); + break; + } + + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = false; +} + +void Scene1925::postInit(SceneObjectList *OwnerList) { + _levelResNum[0] = 1930; + _levelResNum[1] = 1935; + _levelResNum[2] = 1940; + _levelResNum[3] = 1935; + _levelResNum[4] = 1925; + + if (R2_GLOBALS.getFlag(29)) { + if ((R2_GLOBALS._scene1925CurrLevel == -3) || (R2_GLOBALS._scene1925CurrLevel == 3)) + loadScene(_levelResNum[4]); + else + loadScene(_levelResNum[R2_GLOBALS._scene1925CurrLevel % 4]); + } else { + R2_GLOBALS._scene1925CurrLevel = -2; + loadScene(1920); + } + SceneExt::postInit(); + R2_GLOBALS._sound1.play(220); + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._player._characterScene[R2_SEEKER] = 1925; + R2_GLOBALS._player._characterIndex = R2_SEEKER; + + switch (R2_GLOBALS._scene1925CurrLevel) { + case -2: + _eastExit.setDetails(Rect(203, 44, 247, 111), EXITCURSOR_E, 1925); + _ladder.setDetails(Rect(31, 3, 45, 167), 1925, 6, -1, 8, 1, NULL); + break; + case 3: + _door.setDetails(1925, 0, 1, 2, 1, (SceneItem *) NULL); + _button.setDetails(Rect(133, 68, 140, 77), 1925, 3, -1, 5, 1, NULL); // No break on purpose - case 98: + case -3: + _westExit.setDetails(Rect(83, 38, 128, 101), EXITCURSOR_W, 1925); // No break on purpose - case 100: - _downExit._enabled = true; - R2_GLOBALS._walkRegions.disableRegion(4); - R2_GLOBALS._walkRegions.disableRegion(5); - R2_GLOBALS._walkRegions.disableRegion(6); - R2_GLOBALS._walkRegions.disableRegion(10); - R2_GLOBALS._walkRegions.disableRegion(11); default: + _exitUp.setDetails(Rect(128, 0, 186, 10), EXITCURSOR_N, 1925); + _exitDown.setDetails(Rect(128, 160, 190, 167), EXITCURSOR_S, 1925); + _ladder.setDetails(Rect(141, 11, 167, 159), 1925, 6, -1, -1, 1, NULL); break; } - R2_GLOBALS._uiElements.draw(); -} - -void Scene1950::enterArea() { - R2_GLOBALS._player.disableControl(); - R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); - _vampire.remove(); - _door.remove(); - _scrolls.remove(); + _door.postInit(); + _door.setup(1925, 5, 1); + _door.setPosition(Common::Point(128, 35)); + _door.hide(); - _vampireActive = false; - _vampireIndex = 0; + if (R2_GLOBALS._scene1925CurrLevel == 3) + _door.show(); - // Certain areas have a vampire in them - switch (R2_GLOBALS._flubMazeArea) { - case 10: - _vampireIndex = 1; - break; - case 13: - _vampireIndex = 2; - break; - case 16: - _vampireIndex = 3; - break; - case 17: - _vampireIndex = 4; - break; - case 24: - _vampireIndex = 5; - break; - case 25: - _vampireIndex = 6; - break; - case 31: - _vampireIndex = 7; - break; - case 40: - _vampireIndex = 8; - break; - case 45: - _vampireIndex = 9; - break; - case 46: - _vampireIndex = 10; - break; - case 73: - _vampireIndex = 11; - break; - case 75: - _vampireIndex = 12; + R2_GLOBALS._player.enableControl(CURSOR_USE); + switch (R2_GLOBALS._scene1925CurrLevel) { + case -2: + R2_GLOBALS._player.setup(20, 6, 1); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + R2_GLOBALS._player.setPosition(Common::Point(224, 109)); break; - case 80: - _vampireIndex = 13; + case -3: + _door.hide(); + R2_GLOBALS._player.setup(20, 5, 1); + R2_GLOBALS._player.setPosition(Common::Point(110, 100)); break; - case 87: - _vampireIndex = 14; + case 0: + R2_GLOBALS._player.setup(1925, 1, 1); + R2_GLOBALS._player.setPosition(Common::Point(154, 200)); break; - case 88: - _vampireIndex = 15; + default: + R2_GLOBALS._player.setup(1925, 1, 3); + R2_GLOBALS._player.setPosition(Common::Point(154, 110)); break; - case 96: - _vampireIndex = 16; + } + + R2_GLOBALS._player._canWalk = false; + _newSceneMode = 0; + R2_GLOBALS._sceneManager._previousScene = 1925; + _background.setDetails(Rect(27, 0, 292, 200), 1925, 9, -1, -1, 1, NULL); +} + +void Scene1925::remove() { + R2_GLOBALS._sound1.fadeOut2(NULL); + R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1925; + SceneExt::remove(); +} + +void Scene1925::signal() { + switch (_sceneMode) { + case 1920: + // No break on purpose + case 1921: + // No break on purpose + case 1928: + // No break on purpose + case 1929: + // No break on purpose + case 1930: + R2_GLOBALS._scene1925CurrLevel = -3; + R2_GLOBALS._sceneManager.changeScene(1900); break; - case 97: - _vampireIndex = 17; + case 1926: + // No break on purpose + case 1931: + // Change level, down + changeLevel(false); break; - case 104: - _vampireIndex = 18; + case 1927: + // No break on purpose + case 1932: + // Change level, up + changeLevel(true); break; + case 1925: + _westExit._enabled = false; + if (_newSceneMode != 0) { + _sceneMode = _newSceneMode; + _newSceneMode = 0; + setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL); + } + // No break on purpose default: + R2_GLOBALS._player.enableControl(CURSOR_USE); break; } - if (_vampireIndex != 0) { - _vampire.postInit(); - _vampire._numFrames = 6; - _vampire._moveRate = 6; - _vampire._moveDiff = Common::Point(3, 2); - _vampire._effect = EFFECT_SHADED; - - if (!R2_GLOBALS._vampireData[_vampireIndex - 1]._isAlive) { - // Show vampire ashes - _vampire.setPosition(Common::Point(R2_GLOBALS._vampireData[_vampireIndex - 1]._position)); - _vampire.animate(ANIM_MODE_NONE, NULL); - _vampire.addMover(NULL); - _vampire.setVisage(1961); - _vampire.setStrip(4); - _vampire.setFrame(10); - _vampire.fixPriority(10); - _vampire.setDetails(1950, 15, -1, 17, 2, (SceneItem *) NULL); - } else { - // Start the vampire - _vampire.setVisage(1960); - _vampire.setPosition(Common::Point(160, 130)); - _vampire.animate(ANIM_MODE_2, NULL); - _vampire.setDetails(1950, 12, -1, 14, 2, (SceneItem *) NULL); - _vampireActive = true; - } - } - if ((R2_GLOBALS._flubMazeArea == 1) && (R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) != 0)) { - // Show doorway at the right hand side of the very first flub corridor - _door.postInit(); - _door.setVisage(1948); - _door.setStrip(3); - _door.setPosition(Common::Point(278, 155)); - _door.fixPriority(100); - _door.setDetails(1950, 19, 20, 23, 2, (SceneItem *) NULL); - } - - if (R2_GLOBALS._flubMazeArea == 102) { - R2_GLOBALS._walkRegions.load(1951); - R2_GLOBALS._walkRegions.disableRegion(1); - R2_GLOBALS._walkRegions.disableRegion(5); - R2_GLOBALS._walkRegions.disableRegion(6); - R2_GLOBALS._walkRegions.disableRegion(7); - - _cube.postInit(); - _cube.setVisage(1970); - _cube.setStrip(1); - if (R2_GLOBALS.getFlag(37)) - _cube.setFrame(3); - else - _cube.setFrame(1); - _cube.setPosition(Common::Point(193, 158)); - _cube.setDetails(1950, 3, 4, 5, 2, (SceneItem *) NULL); - - _pulsingLights.postInit(); - _pulsingLights.setVisage(1970); - _pulsingLights.setStrip(3); - _pulsingLights.animate(ANIM_MODE_2, NULL); - _pulsingLights._numFrames = 6; - _pulsingLights.setPosition(Common::Point(194, 158)); - _pulsingLights.fixPriority(159); - - _keypad.setDetails(Rect(188, 124, 199, 133), 1950, 27, 28, -1, 2, NULL); - - if (R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 1950) { - _gem.postInit(); - _gem.setVisage(1970); - _gem.setStrip(1); - _gem.setFrame(2); - _gem.fixPriority(160); - } - - if (R2_GLOBALS.getFlag(37)) { - _gem.setPosition(Common::Point(192, 118)); - _gem.setDetails(1950, 9, 4, -1, 2, (SceneItem *) NULL); - } else { - _containmentField.postInit(); - _containmentField.setVisage(1970); - _containmentField.setStrip(4); - _containmentField._numFrames = 4; - _containmentField.animate(ANIM_MODE_8, 0, NULL); - _containmentField.setPosition(Common::Point(192, 121)); - _containmentField.fixPriority(159); - _containmentField.setDetails(1950, 6, 7, 8, 2, (SceneItem *) NULL); - - _gem.setPosition(Common::Point(192, 109)); - _gem.setDetails(1950, 9, 7, 8, 2, (SceneItem *) NULL); - } - - _scrolls.postInit(); - _scrolls.setVisage(1972); - _scrolls.setStrip(1); - _scrolls.setPosition(Common::Point(76, 94)); - _scrolls.fixPriority(25); - _scrolls.setDetails(1950, 30, -1, -1, 2, (SceneItem *) NULL); - if (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 2) - _scrolls.setFrame(2); - else - _scrolls.setFrame(1); + R2_GLOBALS._player._canWalk = false; +} - _removeFlag = true; - } else if (_removeFlag) { - _cube.remove(); - _containmentField.remove(); - _gem.remove(); - _pulsingLights.remove(); - _scrolls.remove(); +/*-------------------------------------------------------------------------- + * Scene 1945 - Spill Mountains Shaft Bottom + * + *--------------------------------------------------------------------------*/ - R2_GLOBALS._sceneItems.remove(&_background); - _background.setDetails(Rect(0, 0, 320, 200), 1950, 0, 1, 2, 2, NULL); +Scene1945::Scene1945() { + _nextSceneMode1 = 0; + _nextSceneMode2 = 0; + _lampUsed = CURSOR_NONE; +} - _removeFlag = false; - } +void Scene1945::synchronize(Serializer &s) { + SceneExt::synchronize(s); - switch (R2_GLOBALS._flubMazeEntryDirection) { - case 0: - _sceneMode = 1950; - if (R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) == 0) - // The original uses CURSOR_ARROW. CURSOR_WALK is much more coherent - R2_GLOBALS._player.enableControl(CURSOR_WALK); - else - setAction(&_sequenceManager, this, 1950, &R2_GLOBALS._player, NULL); + s.syncAsSint16LE(_nextSceneMode1); + s.syncAsSint16LE(_nextSceneMode2); + s.syncAsSint16LE(_lampUsed); +} - break; - case 1: { - _sceneMode = R2_GLOBALS._flubMazeEntryDirection; - R2_GLOBALS._player.setPosition(Common::Point(160, 213)); - Common::Point pt(160, 160); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); +bool Scene1945::Ice::startAction(CursorType action, Event &event) { + Scene1945 *scene = (Scene1945 *)R2_GLOBALS._sceneManager._scene; + + switch (action) { + case R2_GUNPOWDER: + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 0; + if ((R2_GLOBALS._player._position.x == 191) && (R2_GLOBALS._player._position.y == 142)) + scene->_sceneMode = 1942; + else { + scene->_sceneMode = 1940; + scene->_nextSceneMode1 = 1942; } + // At this point the original check if _sceneMode != 0. Skipped. + scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_gunpowder, NULL); + return true; break; - case 2: - _sceneMode = R2_GLOBALS._flubMazeEntryDirection; - if (R2_GLOBALS.getFlag(36)) - setAction(&_sequenceManager, this, 1957, &R2_GLOBALS._player, NULL); - else - setAction(&_sequenceManager, this, 1974, &R2_GLOBALS._player, NULL); - break; - case 3: - // Entering from the left - if (!_vampireActive) { - _sceneMode = R2_GLOBALS._flubMazeEntryDirection; - R2_GLOBALS._player.setPosition(Common::Point(-20, 160)); - Common::Point pt(30, 160); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); + case CURSOR_USE: + R2_GLOBALS._player.disableControl(CURSOR_USE); + scene->_sceneMode = 0; + if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 50) && (event.mousePos.x >= 130)) { + scene->_sceneMode = 1940; + // At this point the original check if _sceneMode != 0. Skipped. + scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL); + return true; } else { - _sceneMode = 18; - _eastExit._enabled = false; - _vampireDestPos = Common::Point(60, 152); R2_GLOBALS._player.enableControl(CURSOR_USE); R2_GLOBALS._player._canWalk = false; - - _vampire.setStrip(2); - NpcMover *mover = new NpcMover(); - _vampire.addMover(mover, &_vampireDestPos, this); - - R2_GLOBALS._player.setPosition(Common::Point(-20, 160)); - Common::Point pt2(30, 160); - NpcMover *mover2 = new NpcMover(); - R2_GLOBALS._player.addMover(mover2, &pt2, NULL); - } - break; - case 4: - _sceneMode = R2_GLOBALS._flubMazeEntryDirection; - if (!_upExitStyle) { - if (R2_GLOBALS.getFlag(36)) - setAction(&_sequenceManager, this, 1955, &R2_GLOBALS._player, NULL); - else - setAction(&_sequenceManager, this, 1972, &R2_GLOBALS._player, NULL); - } else { - if (R2_GLOBALS.getFlag(36)) - setAction(&_sequenceManager, this, 1954, &R2_GLOBALS._player, NULL); + if (event.mousePos.x > 130) + scene->_ice.setDetails(1945, 3, -1, -1, 3, (SceneItem *) NULL); else - setAction(&_sequenceManager, this, 1971, &R2_GLOBALS._player, NULL); - } - break; - case 5: { - _sceneMode = R2_GLOBALS._flubMazeEntryDirection; - R2_GLOBALS._player.setPosition(Common::Point(160, 127)); - Common::Point pt(160, 160); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); + scene->_ice.setDetails(1945, 3, -1, 5, 3, (SceneItem *) NULL); } + // No break on purpose + default: + return SceneHotspot::startAction(action, event); break; - case 6: - // Entering from the right - if (!_vampireActive) { - _sceneMode = R2_GLOBALS._flubMazeEntryDirection; - if (R2_GLOBALS._flubMazeArea == 1) { - setAction(&_sequenceManager, this, 1961, &R2_GLOBALS._player, NULL); - } else { - R2_GLOBALS._player.setPosition(Common::Point(340, 160)); - Common::Point pt(289, 160); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - } - } else { - _sceneMode = 17; - _westExit._enabled = false; - _vampireDestPos = Common::Point(259, 152); + } +} - R2_GLOBALS._player.enableControl(CURSOR_USE); - R2_GLOBALS._player._canWalk = false; +bool Scene1945::Ladder::startAction(CursorType action, Event &event) { + if (action != CURSOR_USE) + return SceneHotspot::startAction(action, event); - _vampire.setStrip(1); - NpcMover *mover = new NpcMover(); - _vampire.addMover(mover, &_vampireDestPos, this); + Scene1945 *scene = (Scene1945 *)R2_GLOBALS._sceneManager._scene; - R2_GLOBALS._player.setPosition(Common::Point(340, 160)); - Common::Point pt2(289, 160); - NpcMover *mover2 = new NpcMover(); - R2_GLOBALS._player.addMover(mover2, &pt2, NULL); + R2_GLOBALS._player.disableControl(CURSOR_USE); + scene->_sceneMode = 0; + + if ((R2_GLOBALS._player._position.x == 221) && (R2_GLOBALS._player._position.y == 142)) { + scene->_sceneMode = 1949; + scene->_nextSceneMode1 = 1947; + } else if ( ((R2_GLOBALS._player._position.x == 197) && (R2_GLOBALS._player._position.y == 158)) + || ((R2_GLOBALS._player._position.x == 191) && (R2_GLOBALS._player._position.y == 142)) ) { + scene->_sceneMode = 1947; + } else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 50) + && (event.mousePos.y >= 30)) { + scene->_sceneMode = 1940; + } else { + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = false; + } + + if (scene->_sceneMode != 0) + scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL); + + return true; +} + +bool Scene1945::Gunpowder::startAction(CursorType action, Event &event) { + if ((action == R2_ALCOHOL_LAMP_3) || (action == R2_ALCOHOL_LAMP_2)) { + Scene1945 *scene = (Scene1945 *)R2_GLOBALS._sceneManager._scene; + + scene->_lampUsed = action; + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 0; + if ((R2_GLOBALS._player._position.x == 191) && (R2_GLOBALS._player._position.y == 142)) { + scene->_sceneMode= 1947; + scene->_nextSceneMode1 = 1943; + } else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 50)) { + scene->_sceneMode = 1940; + scene->_nextSceneMode1 = 1943; + } else { + scene->_sceneMode = 1949; + scene->_nextSceneMode1 = 1947; + scene->_nextSceneMode2 = 1943; } - break; - default: - break; - } -} - -void Scene1950::doButtonPress(int indx) { - Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; - R2_GLOBALS._player.disableControl(); - - int prevIndex = indx - 1; - if ((indx / 4) == (prevIndex / 4)) { - if (prevIndex < 0) - prevIndex = 3; + // At this point the original check if _sceneMode != 0. Skipped. + scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL); + return true; } else { - prevIndex += 4; + return SceneActor::startAction(action, event); } +} - assert(prevIndex >= 0 && prevIndex < 16); - if (!_KeypadWindow._buttons[prevIndex]._toggled) { - _KeypadWindow._buttons[prevIndex].setFrame(2); - _KeypadWindow._buttons[prevIndex]._toggled = true; - } else { - _KeypadWindow._buttons[prevIndex].setFrame(1); - _KeypadWindow._buttons[prevIndex]._toggled = false; - } +void Scene1945::ExitUp::changeScene() { + Scene1945 *scene = (Scene1945 *)R2_GLOBALS._sceneManager._scene; - prevIndex = indx + 1; - if ((indx / 4) == (prevIndex / 4)) { - if (prevIndex > 15) - prevIndex = 12; - } else { - prevIndex -= 4; - } + _moving = false; + R2_GLOBALS._player.disableControl(CURSOR_USE); + scene->_sceneMode = 0; - assert(prevIndex >= 0 && prevIndex < 16); - if (!_KeypadWindow._buttons[prevIndex]._toggled) { - _KeypadWindow._buttons[prevIndex].setFrame(2); - _KeypadWindow._buttons[prevIndex]._toggled = true; - } else { - _KeypadWindow._buttons[prevIndex].setFrame(1); - _KeypadWindow._buttons[prevIndex]._toggled = false; + if ((R2_GLOBALS._player._position.x == 221) && (R2_GLOBALS._player._position.y == 142)) { + scene->_sceneMode = 1949; + scene->_nextSceneMode1 = 1947; + } else if ( ((R2_GLOBALS._player._position.x == 197) && (R2_GLOBALS._player._position.y == 158)) + || ((R2_GLOBALS._player._position.x == 191) && (R2_GLOBALS._player._position.y == 142)) ) { + scene->_sceneMode = 1947; } - prevIndex = indx - 4; - if (prevIndex < 0) - prevIndex += 16; - - assert(prevIndex >= 0 && prevIndex < 16); - if (!_KeypadWindow._buttons[prevIndex]._toggled) { - _KeypadWindow._buttons[prevIndex].setFrame(2); - _KeypadWindow._buttons[prevIndex]._toggled = true; + if (scene->_sceneMode == 0) { + scene->_sceneMode = 1941; + signal(); } else { - _KeypadWindow._buttons[prevIndex].setFrame(1); - _KeypadWindow._buttons[prevIndex]._toggled = false; + scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL); } +} - prevIndex = indx + 4; - if (prevIndex > 15) - prevIndex -= 16; +void Scene1945::CorridorExit::changeScene() { + Scene1945 *scene = (Scene1945 *)R2_GLOBALS._sceneManager._scene; - assert(prevIndex >= 0 && prevIndex < 16); - if (!_KeypadWindow._buttons[prevIndex]._toggled) { - _KeypadWindow._buttons[prevIndex].setFrame(2); - _KeypadWindow._buttons[prevIndex]._toggled = true; - } else { - _KeypadWindow._buttons[prevIndex].setFrame(1); - _KeypadWindow._buttons[prevIndex]._toggled = false; - } + _moving = false; + R2_GLOBALS._player.disableControl(CURSOR_USE); + scene->_sceneMode = 0; - // Check whether all the buttons are highlighted - int cpt = 0; - for (prevIndex = 0; prevIndex < 16; prevIndex++) { - if (_KeypadWindow._buttons[prevIndex]._toggled) - ++cpt; + if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 50)) { + scene->_sceneMode = 1940; + scene->_nextSceneMode1 = 1945; + } else if ( ((R2_GLOBALS._player._position.x == 197) && (R2_GLOBALS._player._position.y == 158)) + || ((R2_GLOBALS._player._position.x == 191) && (R2_GLOBALS._player._position.y == 142)) ) { + scene->_sceneMode = 1945; } - if (cpt != 16) { - R2_GLOBALS._player.enableControl(); - R2_GLOBALS._player._canWalk = false; - } else { - R2_GLOBALS.setFlag(37); - _sceneMode = 24; - setAction(&_sequenceManager, scene, 1976, NULL); - } + if (scene->_sceneMode != 0) + scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL); } -void Scene1950::postInit(SceneObjectList *OwnerList) { - _upExitStyle = false; - _removeFlag = false; - _vampireActive = false; - _vampireIndex = 0; - if (R2_GLOBALS._sceneManager._previousScene == 300) - R2_GLOBALS._flubMazeArea = 103; - - initArea(); +void Scene1945::postInit(SceneObjectList *OwnerList) { + loadScene(1945); SceneExt::postInit(); - R2_GLOBALS._sound1.play(105); - - _northExit.setDetails(Rect(130, 46, 189, 135), SHADECURSOR_UP, 1950); - _northExit.setDest(Common::Point(160, 145)); + R2_GLOBALS._sound1.play(220); - _upExit.setDetails(Rect(208, 0, 255, 73), EXITCURSOR_N, 1950); - _upExit.setDest(Common::Point(200, 151)); + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = false; + R2_GLOBALS._player._characterScene[R2_SEEKER] = 1945; + R2_GLOBALS._player._characterIndex = R2_SEEKER; - _eastExit.setDetails(Rect(305, 95, 320, 147), EXITCURSOR_E, 1950); - _eastExit.setDest(Common::Point(312, 160)); + _exitUp.setDetails(Rect(128, 0, 186, 10), EXITCURSOR_N, 1945); + _corridorExit.setDetails(Rect(238, 144, 274, 167), EXITCURSOR_E, 1945); - _downExit.setDetails(Rect(208, 99, 255, 143), EXITCURSOR_S, 1950); - _downExit.setDest(Common::Point(200, 151)); + _ladder.setDetails(Rect(141, 3, 167, 126), 1945, 9, -1, -1, 1, NULL); - _southExit.setDetails(Rect(113, 154, 206, 168), SHADECURSOR_DOWN, 1950); - _southExit.setDest(Common::Point(160, 165)); + if (!R2_GLOBALS.getFlag(43)) { + _corridorExit._enabled = false; + _gunpowder.postInit(); + _gunpowder.setup(1945, 4, 1); + _gunpowder.setPosition(Common::Point(253, 169)); + _gunpowder.fixPriority(150); - _westExit.setDetails(Rect(0, 95, 14, 147), EXITCURSOR_W, 1950); - _westExit.setDest(Common::Point(7, 160)); + if (R2_GLOBALS.getFlag(42)) + _gunpowder.setDetails(1945, 15, -1, -1, 1, (SceneItem *) NULL); + else + _gunpowder.hide(); - _shaftExit.setDetails(Rect(72, 54, 120, 128), EXITCURSOR_NW, 1950); - _shaftExit.setDest(Common::Point(120, 140)); + _coveringIce.postInit(); + _coveringIce.setup(1945, 8, 1); + _coveringIce.setPosition(Common::Point(253, 169)); + _coveringIce.fixPriority(130); - _doorExit.setDetails(Rect(258, 60, 300, 145), EXITCURSOR_NE, 1950); - _doorExit.setDest(Common::Point(268, 149)); + _alcoholLamp.postInit(); + _alcoholLamp.setup(1945, 3, 1); + _alcoholLamp.hide(); + } else { + _corridorExit._enabled = true; + } - R2_GLOBALS._player.postInit(); - if ( (R2_INVENTORY.getObjectScene(R2_TANNER_MASK) == 0) && (R2_INVENTORY.getObjectScene(R2_PURE_GRAIN_ALCOHOL) == 0) - && (R2_INVENTORY.getObjectScene(R2_SOAKED_FACEMASK) == 0) && (!R2_GLOBALS.getFlag(36)) ) - R2_GLOBALS._player.setVisage(22); - else - R2_GLOBALS._player.setVisage(20); + switch (R2_GLOBALS._sceneManager._previousScene) { + case 1925: + R2_GLOBALS._scene1925CurrLevel = 0; + R2_GLOBALS.clearFlag(29); + R2_GLOBALS._player.setup(1925, 1, 10); + R2_GLOBALS._player.setPosition(Common::Point(154, 50)); + break; + case 1950: + _sceneMode = 1944; + setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL); + R2_GLOBALS._player.disableControl(CURSOR_USE); + break; + default: + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + R2_GLOBALS._player.setup(20, 5, 1); + R2_GLOBALS._player.setPosition(Common::Point(191, 142)); + break; + } - R2_GLOBALS._player._moveDiff = Common::Point(5, 3); - _background.setDetails(Rect(0, 0, 320, 200), 1950, 0, 1, 2, 1, NULL); + R2_GLOBALS._player._canWalk = false; + _nextSceneMode1 = 0; + _nextSceneMode2 = 0; - enterArea(); + _ice.setDetails(11, 1945, 3, -1, 5); + _hole.setDetails(Rect(238, 144, 274, 167), 1945, 0, -1, 2, 1, NULL); + _ice2.setDetails(Rect(27, 3, 292, 167), 1945, 3, -1, -1, 1, NULL); } -void Scene1950::remove() { - R2_GLOBALS._sound1.stop(); - R2_GLOBALS._sound2.fadeOut2(NULL); +void Scene1945::remove() { + R2_GLOBALS._sound1.fadeOut2(NULL); SceneExt::remove(); } -void Scene1950::signal() { +void Scene1945::signal() { switch (_sceneMode) { - case 11: - R2_GLOBALS._flubMazeArea += 7; - initArea(); - enterArea(); - break; - case 12: - // Moving up a ladder within the Flub maze - R2_GLOBALS._flubMazeArea += 35; - initArea(); - enterArea(); - break; - case 1975: - SceneItem::display(1950, 21, SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, 1, - SET_Y, 20, SET_EXT_BGCOLOR, 7, LIST_END); - // No break on purpose - case 13: - // Moving east within the Flub maze - ++R2_GLOBALS._flubMazeArea; - initArea(); - enterArea(); - break; - case 14: - // Moving down a ladder within the Flub maze - R2_GLOBALS._flubMazeArea -= 35; - initArea(); - enterArea(); - break; - case 15: - R2_GLOBALS._flubMazeArea -= 7; - initArea(); - enterArea(); - break; - case 16: - // Moving west within the Flub maze - // No break on purpose - case 1961: - --R2_GLOBALS._flubMazeArea; - initArea(); - enterArea(); - break; - case 17: { - _sceneMode = 13; - R2_GLOBALS._flubMazeEntryDirection = 3; - _vampireActive = false; - R2_GLOBALS._player.disableControl(CURSOR_WALK); - R2_GLOBALS._player._canWalk = true; - R2_GLOBALS._player.setVisage(22); - R2_GLOBALS._player.animate(ANIM_MODE_9); - Common::Point pt(340, 160); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - Common::Point pt2(289, 160); - NpcMover *mover2 = new NpcMover(); - _vampire.addMover(mover2, &pt2, NULL); + case 1940: + if (_nextSceneMode1 == 1943) { + _sceneMode = _nextSceneMode1; + setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_alcoholLamp, NULL); + } else { + _sceneMode = 1946; + setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL); } + return; break; - case 18: { - _sceneMode = 16; - R2_GLOBALS._flubMazeEntryDirection = 6; - _vampireActive = false; - R2_GLOBALS._player.disableControl(CURSOR_WALK); - R2_GLOBALS._player._canWalk = true; - R2_GLOBALS._player.setVisage(22); - R2_GLOBALS._player.animate(ANIM_MODE_9); - Common::Point pt(-20, 160); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); - Common::Point pt2(30, 160); - NpcMover *mover2 = new NpcMover(); - _vampire.addMover(mover2, &pt2, NULL); + case 1941: + if (_nextSceneMode1 == 0) { + R2_GLOBALS._scene1925CurrLevel = 0; + R2_GLOBALS.setFlag(29); + R2_GLOBALS._sceneManager.changeScene(1925); + } else { + _sceneMode = _nextSceneMode1; + _nextSceneMode1 = 0; + setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL); } + return; + case 1942: + R2_INVENTORY.setObjectScene(R2_GUNPOWDER, 0); + _gunpowder.setDetails(1945, 15, -1, -1, 2, (SceneItem *) NULL); + R2_GLOBALS.setFlag(42); break; - case 24: - _KeypadWindow.remove(); - _sceneMode = 1966; - _cube.setFrame(3); - setAction(&_sequenceManager, this, 1966, &_containmentField, &_gem, NULL); - break; - case 1951: + case 1943: R2_GLOBALS._sound1.fadeOut2(NULL); - R2_GLOBALS._sceneManager.changeScene(1945); - break; - case 1958: - SceneItem::display(1950, 24, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - R2_GLOBALS._player.enableControl(CURSOR_WALK); - _doorExit._enabled = true; - break; - case 1959: - R2_INVENTORY.setObjectScene(R2_SOAKED_FACEMASK, 0); - R2_GLOBALS._player.enableControl(CURSOR_WALK); - _doorExit._enabled = true; - break; - case 1962: - // No break on purpose - case 1963: - R2_GLOBALS._player.enableControl(); - _KeypadWindow.setup2(1971, 1, 1, 160, 135); + R2_INVENTORY.setObjectScene(_lampUsed, 0); + _sceneMode = 1948; + setAction(&_sequenceManager1, this, _sceneMode, &_gunpowder, &_alcoholLamp, &_coveringIce, NULL); + R2_GLOBALS._player.setAction(&_sequenceManager2, NULL, 1941, &R2_GLOBALS._player, NULL); + return; + case 1944: break; - case 1964: - // No break on purpose - case 1965: - if (!R2_GLOBALS.getFlag(37)) - SceneItem::display(1950, 26, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); - - R2_GLOBALS._player.enableControl(); + case 1945: + R2_GLOBALS._sceneManager.changeScene(1950); + return; + case 1946: + if (_nextSceneMode1 == 1942) { + _sceneMode = _nextSceneMode1; + _nextSceneMode1 = 0; + setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_gunpowder, NULL); + return; + } + _sceneMode = 0; break; - case 1966: - _containmentField.remove(); - if (R2_GLOBALS.getFlag(36)) { - _sceneMode = 1964; - setAction(&_sequenceManager, this, 1964, &R2_GLOBALS._player, NULL); + case 1947: + if (_nextSceneMode1 == 1943) { + _sceneMode = _nextSceneMode1; + _nextSceneMode1 = 1948; + setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_alcoholLamp, NULL); } else { - _sceneMode = 1965; - setAction(&_sequenceManager, this, 1965, &R2_GLOBALS._player, NULL); + _sceneMode = 1941; + setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL); } - _gem.setDetails(1950, 9, -1, -1, 2, (SceneItem *) NULL); - break; - case 1967: { - _sceneMode = 0; - R2_INVENTORY.setObjectScene(R2_SAPPHIRE_BLUE, 2); - _gem.remove(); - if (R2_GLOBALS.getFlag(36)) - R2_GLOBALS._player.setVisage(20); - else - R2_GLOBALS._player.setVisage(22); - - R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); - // This is a hack to work around a pathfinding issue. original destination is (218, 165) - Common::Point pt(128, 165); - NpcMover *mover = new NpcMover(); - R2_GLOBALS._player.addMover(mover, &pt, this); + return; + case 1948: + R2_GLOBALS._sound1.play(220); + _corridorExit._enabled = true; + R2_GLOBALS._sceneItems.remove(&_gunpowder); + R2_GLOBALS.clearFlag(42); + R2_GLOBALS.setFlag(43); + _nextSceneMode1 = 1940; + // No break on purpose + case 1949: + _sceneMode = _nextSceneMode1; + if (_nextSceneMode2 == 1943) { + _nextSceneMode1 = _nextSceneMode2; + _nextSceneMode2 = 0; + setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_alcoholLamp, NULL); + } else { + _nextSceneMode1 = 0; + setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL); } - break; - case 1968: - R2_GLOBALS._player.enableControl(); - R2_INVENTORY.setObjectScene(R2_ANCIENT_SCROLLS, 2); - _scrolls.setFrame(2); - if (R2_GLOBALS.getFlag(36)) - R2_GLOBALS._player.setVisage(20); - else - R2_GLOBALS._player.setVisage(22); - R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); - break; + return; default: - R2_GLOBALS._player.enableControl(CURSOR_WALK); break; } -} - -void Scene1950::process(Event &event) { - if ( (event.eventType == EVENT_BUTTON_DOWN) - && (R2_GLOBALS._player._uiEnabled) - && (R2_GLOBALS._events.getCursor() == R2_SOAKED_FACEMASK) - && (R2_GLOBALS._player._bounds.contains(event.mousePos)) - && (R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) == 0)) { - event.handled = true; - R2_GLOBALS._player.disableControl(); - _shaftExit._enabled = false; - _doorExit._enabled = false; - _sceneMode = 1959; - setAction(&_sequenceManager, this, 1959, &R2_GLOBALS._player, NULL); - } - Scene::process(event); + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = false; } } // End of namespace Ringworld2 diff --git a/engines/tsage/ringworld2/ringworld2_scenes1.h b/engines/tsage/ringworld2/ringworld2_scenes1.h index 0b6738060c..e6f5e0ab97 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes1.h +++ b/engines/tsage/ringworld2/ringworld2_scenes1.h @@ -135,53 +135,6 @@ public: virtual void saveCharacter(int characterIndex); }; -class Scene1200 : public SceneExt { - enum CrawlDirection { CRAWL_EAST = 1, CRAWL_WEST = 2, CRAWL_SOUTH = 3, CRAWL_NORTH = 4 }; - - class LaserPanel: public ModalWindow { - public: - class Jumper : public SceneActorExt { - public: - void init(int state); - virtual bool startAction(CursorType action, Event &event); - }; - - Jumper _jumper1; - Jumper _jumper2; - Jumper _jumper3; - - LaserPanel(); - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void remove(); - }; - -public: - NamedHotspot _item1; - SceneActor _actor1; - LaserPanel _laserPanel; - MazeUI _mazeUI; - SequenceManager _sequenceManager; - - int _nextCrawlDirection; - int _field414; - int _field416; - int _field418; - int _field41A; - bool _fixupMaze; - - Scene1200(); - void synchronize(Serializer &s); - - void startCrawling(CrawlDirection dir); - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void signal(); - virtual void process(Event &event); - virtual void dispatch(); - virtual void saveCharacter(int characterIndex); -}; - class Scene1500 : public SceneExt { public: SceneActor _starship; @@ -880,143 +833,6 @@ public: virtual void signal(); }; -class Scene1950 : public SceneExt { - /* Windows */ - class KeypadWindow: public ModalWindow { - public: - class KeypadButton : public SceneActor { - public: - int _buttonIndex; - bool _pressed; - bool _toggled; - - KeypadButton(); - void synchronize(Serializer &s); - - void init(int indx); - virtual void process(Event &event); - virtual bool startAction(CursorType action, Event &event); - }; - - SceneActor _areaActor; - KeypadButton _buttons[16]; - - int _buttonIndex; - - KeypadWindow(); - virtual void synchronize(Serializer &s); - virtual void remove(); - virtual void setup2(int visage, int stripFrameNum, int frameNum, int posX, int posY); - virtual void setup3(int resNum, int lookLineNum, int talkLineNum, int useLineNum); - }; - - class Keypad : public NamedHotspot { - public: - virtual bool startAction(CursorType action, Event &event); - }; - - /* Actors */ - class Door : public SceneActor { - public: - virtual bool startAction(CursorType action, Event &event); - }; - class Scrolls : public SceneActor { - public: - virtual bool startAction(CursorType action, Event &event); - }; - class Gem : public SceneActor { - public: - virtual bool startAction(CursorType action, Event &event); - }; - class Vampire : public SceneActor { - public: - Common::Point _deadPosition; - int _deltaX; - int _deltaY; - int _vampireMode; - - Vampire(); - void synchronize(Serializer &s); - - virtual void signal(); - virtual bool startAction(CursorType action, Event &event); - }; - - /* Exits */ - class NorthExit : public SceneExit { - public: - virtual void changeScene(); - }; - class UpExit : public SceneExit { - public: - virtual void changeScene(); - }; - class EastExit : public SceneExit { - public: - virtual void changeScene(); - }; - class DownExit : public SceneExit { - public: - virtual void changeScene(); - }; - class SouthExit : public SceneExit { - public: - virtual void changeScene(); - }; - class WestExit : public SceneExit { - public: - virtual void changeScene(); - }; - class ShaftExit : public SceneExit { - public: - virtual void changeScene(); - }; - class DoorExit : public SceneExit { - public: - virtual void changeScene(); - }; -private: - void initArea(); - void enterArea(); - void doButtonPress(int indx); -public: - NamedHotspot _background; - Keypad _keypad; - SceneActor _southDoorway; - SceneObject _northDoorway; - Door _door; - Scrolls _scrolls; - SceneActor _containmentField; - Gem _gem; - SceneActor _cube; - SceneActor _pulsingLights; - Vampire _vampire; - KeypadWindow _KeypadWindow; - NorthExit _northExit; - UpExit _upExit; - EastExit _eastExit; - DownExit _downExit; - SouthExit _southExit; - WestExit _westExit; - ShaftExit _shaftExit; - DoorExit _doorExit; - SequenceManager _sequenceManager; - - bool _upExitStyle; - bool _removeFlag; - bool _vampireActive; - Common::Point _vampireDestPos; - int _vampireIndex; - - Scene1950(); - void synchronize(Serializer &s); - - virtual void postInit(SceneObjectList *OwnerList = NULL); - virtual void remove(); - virtual void signal(); - virtual void process(Event &event); -}; - } // End of namespace Ringworld2 } // End of namespace TsAGE diff --git a/engines/tsage/ringworld2/ringworld2_vampire.cpp b/engines/tsage/ringworld2/ringworld2_vampire.cpp new file mode 100644 index 0000000000..9d3b7f91a5 --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_vampire.cpp @@ -0,0 +1,1821 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "tsage/ringworld2/ringworld2_vampire.h" + +namespace TsAGE { + +namespace Ringworld2 { + +/*-------------------------------------------------------------------------- + * Scene 1950 - Flup Tube Corridor Maze + * + *--------------------------------------------------------------------------*/ + +Scene1950::KeypadWindow::KeypadWindow() { + _buttonIndex = 0; +} + +void Scene1950::KeypadWindow::synchronize(Serializer &s) { + SceneArea::synchronize(s); + + s.syncAsSint16LE(_buttonIndex); +} + +Scene1950::KeypadWindow::KeypadButton::KeypadButton() { + _buttonIndex = 0; + _pressed = false; + _toggled = false; +} + +void Scene1950::KeypadWindow::KeypadButton::synchronize(Serializer &s) { + SceneActor::synchronize(s); + + s.syncAsSint16LE(_buttonIndex); + s.syncAsSint16LE(_pressed); + s.syncAsSint16LE(_toggled); +} + +void Scene1950::KeypadWindow::KeypadButton::init(int indx) { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + _buttonIndex = indx; + _pressed = false; + _toggled = false; + + postInit(); + setup(1971, 2, 1); + fixPriority(249); + setPosition(Common::Point(((_buttonIndex % 4) * 22) + 127, ((_buttonIndex / 4) * 19) + 71)); + scene->_sceneAreas.push_front(this); +} + +void Scene1950::KeypadWindow::KeypadButton::process(Event &event) { + if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE) + && (_bounds.contains(event.mousePos)) && !_pressed) { + R2_GLOBALS._sound2.play(227); + if (!_toggled) { + setFrame(2); + _toggled = true; + } else { + setFrame(1); + _toggled = false; + } + _pressed = true; + event.handled = true; + } + + if ((event.eventType == EVENT_BUTTON_UP) && _pressed) { + _pressed = false; + event.handled = true; + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + scene->doButtonPress(_buttonIndex); + } +} + +bool Scene1950::KeypadWindow::KeypadButton::startAction(CursorType action, Event &event) { + if (action == CURSOR_USE) + return false; + return SceneActor::startAction(action, event); +} + +void Scene1950::KeypadWindow::remove() { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + for (_buttonIndex = 0; _buttonIndex < 16; ++_buttonIndex) { + scene->_sceneAreas.remove(&_buttons[_buttonIndex]); + _buttons[_buttonIndex].remove(); + } + + ModalWindow::remove(); + + if (!R2_GLOBALS.getFlag(37)) + R2_GLOBALS._sound2.play(278); + + R2_GLOBALS._player.disableControl(CURSOR_WALK); + scene->_eastExit._enabled = true; + + if (!R2_GLOBALS.getFlag(37)) { + if (R2_GLOBALS.getFlag(36)) { + scene->_sceneMode = 1964; + scene->setAction(&scene->_sequenceManager, scene, 1964, &R2_GLOBALS._player, NULL); + } else { + scene->_sceneMode = 1965; + scene->setAction(&scene->_sequenceManager, scene, 1965, &R2_GLOBALS._player, NULL); + } + } +} + +void Scene1950::KeypadWindow::setup2(int visage, int stripFrameNum, int frameNum, int posX, int posY) { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + if (R2_GLOBALS._player._mover) + R2_GLOBALS._player.addMover(NULL); + R2_GLOBALS._player._canWalk = false; + + ModalWindow::setup2(visage, stripFrameNum, frameNum, posX, posY); + + _object1.fixPriority(248); + scene->_eastExit._enabled = false; + setup3(1950, 27, 28, 27); + + for (_buttonIndex = 0; _buttonIndex < 16; _buttonIndex++) + _buttons[_buttonIndex].init(_buttonIndex); +} + +void Scene1950::KeypadWindow::setup3(int resNum, int lookLineNum, int talkLineNum, int useLineNum) { + // Copy of Scene1200::LaserPanel::proc13() + _areaActor.setDetails(resNum, lookLineNum, talkLineNum, useLineNum, 2, (SceneItem *) NULL); +} + +/*--------------------------------------------------------------------------*/ + +bool Scene1950::Keypad::startAction(CursorType action, Event &event) { + if ((action != CURSOR_USE) || (R2_GLOBALS.getFlag(37))) + return SceneHotspot::startAction(action, event); + + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + R2_GLOBALS._player.disableControl(); + if (R2_GLOBALS.getFlag(36)) { + scene->_sceneMode = 1962; + scene->setAction(&scene->_sequenceManager, scene, 1962, &R2_GLOBALS._player, NULL); + } else { + scene->_sceneMode = 1963; + scene->setAction(&scene->_sequenceManager, scene, 1963, &R2_GLOBALS._player, NULL); + } + return true; +} + +bool Scene1950::Door::startAction(CursorType action, Event &event) { + if (action != R2_SCRITH_KEY) + return SceneActor::startAction(action, event); + + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + R2_GLOBALS._player.disableControl(); + R2_INVENTORY.setObjectScene(R2_SCRITH_KEY, 0); + scene->_sceneMode = 1958; + scene->setAction(&scene->_sequenceManager, scene, 1958, &R2_GLOBALS._player, &scene->_door, NULL); + return true; +} + +bool Scene1950::Scrolls::startAction(CursorType action, Event &event) { + if ((action != CURSOR_USE) || (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) != 1950)) + return SceneActor::startAction(action, event); + + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 1968; + scene->setAction(&scene->_sequenceManager, scene, 1968, &R2_GLOBALS._player, NULL); + + return true; +} + +bool Scene1950::Gem::startAction(CursorType action, Event &event) { + if ((action != CURSOR_USE) || (!R2_GLOBALS.getFlag(37))) + return SceneActor::startAction(action, event); + + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 1967; + scene->setAction(&scene->_sequenceManager, scene, 1967, &R2_GLOBALS._player, NULL); + + return true; +} + +/*--------------------------------------------------------------------------*/ + +Scene1950::Vampire::Vampire() { + _deadPosition = Common::Point(0, 0); + _deltaX = 0; + _deltaY = 0; + _vampireMode = 0; +} + +void Scene1950::Vampire::synchronize(Serializer &s) { + SceneActor::synchronize(s); + + s.syncAsSint16LE(_deadPosition.x); + s.syncAsSint16LE(_deadPosition.y); + s.syncAsSint16LE(_deltaX); + s.syncAsSint16LE(_deltaY); + s.syncAsSint16LE(_vampireMode); +} + +void Scene1950::Vampire::signal() { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + switch (_vampireMode) { + case 19: { + _vampireMode = 0; + setVisage(1960); + if (R2_GLOBALS._flubMazeEntryDirection == 3) + setStrip(2); + else + setStrip(1); + + NpcMover *mover = new NpcMover(); + addMover(mover, &scene->_vampireDestPos, scene); + } + break; + case 20: { + // Non fatal shot + _vampireMode = 19; + R2_GLOBALS._player.setVisage(22); + if (R2_GLOBALS._flubMazeEntryDirection == 3) + R2_GLOBALS._player.setStrip(1); + else + R2_GLOBALS._player.setStrip(2); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._shotsRequired--; + + if (R2_GLOBALS._flubMazeEntryDirection == 3) + _deadPosition.x = _position.x + 10; + else + _deadPosition.x = _position.x - 10; + _deadPosition.y = _position.y - 4; + + setVisage(1961); + + if (R2_GLOBALS._flubMazeEntryDirection == 3) + setStrip(2); + else + setStrip(1); + + animate(ANIM_MODE_2, NULL); + Common::Point pt = _deadPosition; + PlayerMover *mover = new PlayerMover(); + addMover(mover, &pt, this); + + R2_GLOBALS._player.enableControl(); + } + break; + case 21: { + // Fatal shot + R2_GLOBALS._player.setVisage(22); + if (R2_GLOBALS._flubMazeEntryDirection == 3) + R2_GLOBALS._player.setStrip(1); + else + R2_GLOBALS._player.setStrip(2); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + + setVisage(1961); + if (R2_GLOBALS._flubMazeEntryDirection == 3) + setStrip(4); + else + setStrip(3); + setDetails(1950, 15, -1, 17, 2, (SceneItem *) NULL); + addMover(NULL); + _numFrames = 8; + R2_GLOBALS._sound2.play(226); + animate(ANIM_MODE_5, NULL); + fixPriority(10); + + R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._isAlive = false; + R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._shotsRequired--; + R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._position = _position; + _deltaX = (_position.x - R2_GLOBALS._player._position.x) / 2; + _deltaY = (_position.y - R2_GLOBALS._player._position.y) / 2; + + byte vampireCount = 0; + for (byte i = 0; i < 18; ++i) { + if (!R2_GLOBALS._vampireData[i]._isAlive) + ++vampireCount; + } + + if (vampireCount == 18) { + R2_GLOBALS.setFlag(36); + _vampireMode = 23; + Common::Point pt(R2_GLOBALS._player._position.x + _deltaX, R2_GLOBALS._player._position.y + _deltaY); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } else if (vampireCount == 1) { + _vampireMode = 22; + Common::Point pt(R2_GLOBALS._player._position.x + _deltaX, R2_GLOBALS._player._position.y + _deltaY); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } else { + R2_GLOBALS._player.enableControl(CURSOR_WALK); + } + + if (R2_GLOBALS._flubMazeEntryDirection == 3) + scene->_eastExit._enabled = true; + else + scene->_westExit._enabled = true; + + scene->_vampireActive = false; + } + break; + case 22: + SceneItem::display(1950, 18, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + R2_GLOBALS._player.enableControl(CURSOR_WALK); + break; + case 23: + SceneItem::display(1950, 25, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + scene->_sceneMode = R2_GLOBALS._flubMazeEntryDirection; + scene->setAction(&scene->_sequenceManager, scene, 1960, &R2_GLOBALS._player, NULL); + break; + default: + break; + } +} + +bool Scene1950::Vampire::startAction(CursorType action, Event &event) { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + if (!R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._isAlive || + (action != R2_PHOTON_STUNNER)) + return SceneActor::startAction(action, event); + + R2_GLOBALS._player.disableControl(); + + if (R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._shotsRequired <= 1) + _vampireMode = 21; + else + _vampireMode = 20; + + R2_GLOBALS._player.setVisage(25); + if (R2_GLOBALS._flubMazeEntryDirection == 3) + R2_GLOBALS._player.setStrip(2); + else + R2_GLOBALS._player.setStrip(1); + R2_GLOBALS._player.animate(ANIM_MODE_5, this); + R2_GLOBALS._sound3.play(99); + + return true; +} + +/*--------------------------------------------------------------------------*/ + +void Scene1950::NorthExit::changeScene() { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._player.disableControl(CURSOR_WALK); + R2_GLOBALS._flubMazeEntryDirection = 1; + scene->_sceneMode = 11; + + Common::Point pt(160, 127); + PlayerMover *mover = new PlayerMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); +} + +void Scene1950::UpExit::changeScene() { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._player.disableControl(CURSOR_WALK); + R2_GLOBALS._flubMazeEntryDirection = 2; + scene->_sceneMode = 12; + + if (!scene->_upExitStyle) { + if (R2_GLOBALS.getFlag(36)) + scene->setAction(&scene->_sequenceManager, scene, 1953, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 1970, &R2_GLOBALS._player, NULL); + } else { + if (R2_GLOBALS.getFlag(36)) + scene->setAction(&scene->_sequenceManager, scene, 1952, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 1969, &R2_GLOBALS._player, NULL); + } +} + +void Scene1950::EastExit::changeScene() { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._player.disableControl(CURSOR_WALK); + R2_GLOBALS._flubMazeEntryDirection = 3; + scene->_sceneMode = 13; + + if (scene->_vampireActive) + R2_GLOBALS._player.animate(ANIM_MODE_9); + + Common::Point pt(340, 160); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); +} + +void Scene1950::DownExit::changeScene() { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._player.disableControl(CURSOR_WALK); + R2_GLOBALS._flubMazeEntryDirection = 4; + scene->_sceneMode = 14; + + if (R2_GLOBALS.getFlag(36)) + scene->setAction(&scene->_sequenceManager, scene, 1956, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 1973, &R2_GLOBALS._player, NULL); +} + +void Scene1950::SouthExit::changeScene() { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._player.disableControl(CURSOR_WALK); + R2_GLOBALS._flubMazeEntryDirection = 5; + scene->_sceneMode = 15; + + Common::Point pt(160, 213); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); +} + +void Scene1950::WestExit::changeScene() { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._player.disableControl(CURSOR_WALK); + R2_GLOBALS._flubMazeEntryDirection = 6; + + if (R2_GLOBALS._flubMazeArea == 2) { + // In the very first corridor area after the Scrith Door + if ((R2_GLOBALS.getFlag(36)) && (R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 2) && (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 2)) { + scene->_sceneMode = 1961; + Common::Point pt(-20, 160); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); + } else { + if (!R2_GLOBALS.getFlag(36)) + SceneItem::display(1950, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + if ((R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 1950) || (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 1950)) + SceneItem::display(1950, 34, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + scene->_sceneMode = 0; + Common::Point pt(30, 160); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); + } + } else { + if (scene->_vampireActive) + R2_GLOBALS._player.animate(ANIM_MODE_9); + + scene->_sceneMode = 16; + Common::Point pt(-20, 160); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); + } +} + +void Scene1950::ShaftExit::changeScene() { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._player.disableControl(CURSOR_WALK); + R2_GLOBALS._flubMazeEntryDirection = 0; + scene->_sceneMode = 1951; + scene->setAction(&scene->_sequenceManager, scene, 1951, &R2_GLOBALS._player, NULL); +} + +void Scene1950::DoorExit::changeScene() { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._player.disableControl(CURSOR_WALK); + R2_GLOBALS._flubMazeEntryDirection = 3; + if (R2_GLOBALS._player._visage == 22) { + scene->_sceneMode = 1975; + scene->setAction(&scene->_sequenceManager, scene, 1975, &R2_GLOBALS._player, NULL); + } else { + SceneItem::display(1950, 22, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + R2_GLOBALS._flubMazeEntryDirection = 0; + scene->_sceneMode = 0; + Common::Point pt(250, 150); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); + _enabled = true; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene1950::Scene1950() { + _upExitStyle = false; + _removeFlag = false; + _vampireActive = false; + _vampireDestPos = Common::Point(0, 0); + _vampireIndex = 0; +} + +void Scene1950::synchronize(Serializer &s) { + SceneExt::synchronize(s); + + s.syncAsSint16LE(_upExitStyle); + s.syncAsSint16LE(_removeFlag); + s.syncAsSint16LE(_vampireActive); + s.syncAsSint16LE(_vampireDestPos.x); + s.syncAsSint16LE(_vampireDestPos.y); + s.syncAsSint16LE(_vampireIndex); +} + +void Scene1950::initArea() { + _northExit._enabled = false; + _upExit._enabled = false; + _eastExit._enabled = false; + _downExit._enabled = false; + _southExit._enabled = false; + _westExit._enabled = false; + _shaftExit._enabled = false; + _doorExit._enabled = false; + _northExit._insideArea = false; + _upExit._insideArea = false; + _eastExit._insideArea = false; + _downExit._insideArea = false; + _southExit._insideArea = false; + _westExit._insideArea = false; + _shaftExit._insideArea = false; + _doorExit._insideArea = false; + _northExit._moving = false; + _upExit._moving = false; + _eastExit._moving = false; + _downExit._moving = false; + _southExit._moving = false; + _westExit._moving = false; + _shaftExit._moving = false; + _doorExit._moving = false; + _upExitStyle = false; + + switch (R2_GLOBALS._flubMazeArea - 1) { + case 0: + loadScene(1948); + break; + case 1: + // No break on purpose + case 8: + // No break on purpose + case 10: + // No break on purpose + case 12: + // No break on purpose + case 16: + // No break on purpose + case 19: + // No break on purpose + case 23: + // No break on purpose + case 30: + // No break on purpose + case 44: + // No break on purpose + case 72: + // No break on purpose + case 74: + // No break on purpose + case 86: + // No break on purpose + case 96: + // No break on purpose + case 103: + loadScene(1950); + break; + case 2: + // No break on purpose + case 29: + loadScene(1965); + break; + case 3: + // No break on purpose + case 9: + // No break on purpose + case 11: + // No break on purpose + case 15: + // No break on purpose + case 24: + // No break on purpose + case 39: + // No break on purpose + case 45: + // No break on purpose + case 71: + // No break on purpose + case 73: + // No break on purpose + case 75: + // No break on purpose + case 79: + // No break on purpose + case 85: + // No break on purpose + case 87: + // No break on purpose + case 95: + loadScene(1955); + break; + case 4: + // No break on purpose + case 6: + // No break on purpose + case 13: + // No break on purpose + case 27: + // No break on purpose + case 41: + // No break on purpose + case 48: + // No break on purpose + case 50: + // No break on purpose + case 54: + // No break on purpose + case 76: + // No break on purpose + case 80: + // No break on purpose + case 90: + // No break on purpose + case 104: + loadScene(1975); + break; + case 5: + // No break on purpose + case 7: + // No break on purpose + case 14: + // No break on purpose + case 28: + // No break on purpose + case 32: + // No break on purpose + case 47: + // No break on purpose + case 53: + loadScene(1997); + break; + case 17: + // No break on purpose + case 20: + // No break on purpose + case 25: + // No break on purpose + case 31: + // No break on purpose + case 33: + // No break on purpose + case 46: + loadScene(1995); + break; + case 18: + // No break on purpose + case 22: + // No break on purpose + case 26: + // No break on purpose + case 36: + // No break on purpose + case 38: + // No break on purpose + case 43: + // No break on purpose + case 51: + // No break on purpose + case 70: + // No break on purpose + case 78: + // No break on purpose + case 84: + // No break on purpose + case 89: + // No break on purpose + case 101: + loadScene(1970); + break; + case 21: + // No break on purpose + case 34: + // No break on purpose + case 57: + // No break on purpose + case 58: + // No break on purpose + case 59: + // No break on purpose + case 62: + // No break on purpose + case 65: + loadScene(1980); + break; + case 35: + // No break on purpose + case 61: + // No break on purpose + case 77: + // No break on purpose + case 83: + loadScene(1982); + break; + case 37: + // No break on purpose + case 52: + // No break on purpose + case 82: + // No break on purpose + case 88: + // No break on purpose + case 92: + // No break on purpose + case 97: + // No break on purpose + case 100: + loadScene(1962); + break; + case 40: + // No break on purpose + case 102: + loadScene(1960); + break; + case 42: + // No break on purpose + case 55: + // No break on purpose + case 60: + // No break on purpose + case 66: + // No break on purpose + case 68: + // No break on purpose + case 69: + // No break on purpose + case 93: + // No break on purpose + case 98: + loadScene(1990); + break; + case 49: + // No break on purpose + case 81: + // No break on purpose + case 91: + // No break on purpose + case 94: + // No break on purpose + case 99: + loadScene(1967); + break; + case 56: + // No break on purpose + case 63: + // No break on purpose + case 64: + // No break on purpose + case 67: + loadScene(1985); + _upExitStyle = true; + break; + default: + break; + } + + if (R2_GLOBALS._flubMazeArea != 1) + R2_GLOBALS._walkRegions.load(1950); + + switch (R2_GLOBALS._flubMazeArea - 1) { + case 0: + _shaftExit._enabled = true; + if ((R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) == 0) && (R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 1950)) + _doorExit._enabled = true; + R2_GLOBALS._walkRegions.disableRegion(2); + R2_GLOBALS._walkRegions.disableRegion(3); + R2_GLOBALS._walkRegions.disableRegion(4); + R2_GLOBALS._walkRegions.disableRegion(5); + R2_GLOBALS._walkRegions.disableRegion(6); + break; + case 1: + // No break on purpose + case 2: + // No break on purpose + case 3: + // No break on purpose + case 8: + // No break on purpose + case 9: + // No break on purpose + case 10: + // No break on purpose + case 11: + // No break on purpose + case 12: + // No break on purpose + case 15: + // No break on purpose + case 16: + // No break on purpose + case 19: + // No break on purpose + case 23: + // No break on purpose + case 24: + // No break on purpose + case 29: + // No break on purpose + case 30: + // No break on purpose + case 39: + // No break on purpose + case 40: + // No break on purpose + case 44: + // No break on purpose + case 45: + // No break on purpose + case 71: + // No break on purpose + case 72: + // No break on purpose + case 73: + // No break on purpose + case 74: + // No break on purpose + case 75: + // No break on purpose + case 79: + // No break on purpose + case 85: + // No break on purpose + case 86: + // No break on purpose + case 87: + // No break on purpose + case 95: + // No break on purpose + case 96: + // No break on purpose + case 102: + // No break on purpose + case 103: + _eastExit._enabled = true; + _westExit._enabled = true; + break; + case 4: + // No break on purpose + case 6: + // No break on purpose + case 13: + // No break on purpose + case 17: + // No break on purpose + case 20: + // No break on purpose + case 25: + // No break on purpose + case 27: + // No break on purpose + case 31: + // No break on purpose + case 33: + // No break on purpose + case 37: + // No break on purpose + case 41: + // No break on purpose + case 46: + // No break on purpose + case 48: + // No break on purpose + case 50: + // No break on purpose + case 52: + // No break on purpose + case 54: + // No break on purpose + case 76: + // No break on purpose + case 80: + // No break on purpose + case 82: + // No break on purpose + case 88: + // No break on purpose + case 90: + // No break on purpose + case 92: + // No break on purpose + case 97: + // No break on purpose + case 100: + // No break on purpose + case 104: + _westExit._enabled = true; + R2_GLOBALS._walkRegions.disableRegion(6); + R2_GLOBALS._walkRegions.disableRegion(9); + break; + case 5: + // No break on purpose + case 7: + // No break on purpose + case 14: + // No break on purpose + case 18: + // No break on purpose + case 22: + // No break on purpose + case 26: + // No break on purpose + case 28: + // No break on purpose + case 32: + // No break on purpose + case 36: + // No break on purpose + case 38: + // No break on purpose + case 43: + // No break on purpose + case 47: + // No break on purpose + case 49: + // No break on purpose + case 51: + // No break on purpose + case 53: + // No break on purpose + case 70: + // No break on purpose + case 78: + // No break on purpose + case 81: + // No break on purpose + case 84: + // No break on purpose + case 89: + // No break on purpose + case 91: + // No break on purpose + case 94: + // No break on purpose + case 99: + // No break on purpose + case 101: + _eastExit._enabled = true; + R2_GLOBALS._walkRegions.disableRegion(1); + R2_GLOBALS._walkRegions.disableRegion(7); + R2_GLOBALS._walkRegions.disableRegion(13); + break; + default: + R2_GLOBALS._walkRegions.disableRegion(1); + R2_GLOBALS._walkRegions.disableRegion(6); + R2_GLOBALS._walkRegions.disableRegion(7); + R2_GLOBALS._walkRegions.disableRegion(9); + R2_GLOBALS._walkRegions.disableRegion(13); + break; + } + + _northDoorway.remove(); + _northDoorway.removeObject(); + _southDoorway.remove(); + + switch (R2_GLOBALS._flubMazeArea - 4) { + case 0: + // No break on purpose + case 3: + // No break on purpose + case 16: + // No break on purpose + case 22: + // No break on purpose + case 24: + // No break on purpose + case 32: + // No break on purpose + case 33: + // No break on purpose + case 45: + // No break on purpose + case 46: + // No break on purpose + case 48: + // No break on purpose + case 51: + // No break on purpose + case 56: + // No break on purpose + case 59: + // No break on purpose + case 67: + // No break on purpose + case 68: + // No break on purpose + case 70: + // No break on purpose + case 73: + // No break on purpose + case 82: + // No break on purpose + case 90: + _northExit._enabled = true; + _northDoorway.setup(1950, (R2_GLOBALS._flubMazeArea % 2) + 1, 1, 160, 137, 25); + //visage,strip,frame,px,py,priority,effect + _southDoorway.postInit(); + _southDoorway.setVisage(1950); + _southDoorway.setStrip((((R2_GLOBALS._flubMazeArea - 1) / 35) % 2) + 1); + _southDoorway.setFrame(2); + _southDoorway.setPosition(Common::Point(160, 167)); + _southDoorway.fixPriority(220); + R2_GLOBALS._walkRegions.disableRegion(3); + R2_GLOBALS._walkRegions.disableRegion(4); + break; + case 7: + // No break on purpose + case 10: + // No break on purpose + case 23: + // No break on purpose + case 29: + // No break on purpose + case 31: + // No break on purpose + case 39: + // No break on purpose + case 40: + // No break on purpose + case 52: + // No break on purpose + case 53: + // No break on purpose + case 55: + // No break on purpose + case 63: + // No break on purpose + case 65: + // No break on purpose + case 66: + // No break on purpose + case 75: + // No break on purpose + case 77: + // No break on purpose + case 81: + // No break on purpose + case 87: + // No break on purpose + case 89: + // No break on purpose + case 97: + _southExit._enabled = true; + + _southDoorway.postInit(); + _southDoorway.setVisage(1950); + _southDoorway.setStrip((((R2_GLOBALS._flubMazeArea - 1) / 35) % 2) + 1); + _southDoorway.setFrame(3); + _southDoorway.setPosition(Common::Point(160, 167)); + _southDoorway.fixPriority(220); + break; + case 58: + // No break on purpose + case 74: + // No break on purpose + case 80: + _northExit._enabled = true; + _southExit._enabled = true; + + _northDoorway.setup(1950, (R2_GLOBALS._flubMazeArea % 2) + 1, 1, 160, 137, 25); + + _southDoorway.postInit(); + _southDoorway.setVisage(1950); + _southDoorway.setStrip((((R2_GLOBALS._flubMazeArea - 1) / 35) % 2) + 1); + _southDoorway.setFrame(3); + _southDoorway.setPosition(Common::Point(160, 167)); + _southDoorway.fixPriority(220); + R2_GLOBALS._walkRegions.disableRegion(3); + R2_GLOBALS._walkRegions.disableRegion(4); + break; + default: + _southDoorway.postInit(); + _southDoorway.setVisage(1950); + _southDoorway.setStrip(((R2_GLOBALS._flubMazeArea - 1) / 35) % 2 + 1); + _southDoorway.setFrame(2); + _southDoorway.setPosition(Common::Point(160, 167)); + _southDoorway.fixPriority(220); + break; + } + + switch (R2_GLOBALS._flubMazeArea - 3) { + case 0: + // No break on purpose + case 3: + // No break on purpose + case 5: + // No break on purpose + case 12: + // No break on purpose + case 15: + // No break on purpose + case 18: + // No break on purpose + case 19: + // No break on purpose + case 23: + // No break on purpose + case 26: + // No break on purpose + case 27: + // No break on purpose + case 29: + // No break on purpose + case 30: + // No break on purpose + case 31: + // No break on purpose + case 32: + // No break on purpose + case 44: + // No break on purpose + case 45: + // No break on purpose + case 51: + // No break on purpose + case 55: + // No break on purpose + case 56: + // No break on purpose + case 57: + // No break on purpose + case 60: + // No break on purpose + case 63: + _upExit._enabled = true; + break; + case 54: + // No break on purpose + case 61: + // No break on purpose + case 62: + // No break on purpose + case 65: + _upExit._enabled = true; + // No break on purpose + case 35: + // No break on purpose + case 38: + // No break on purpose + case 40: + // No break on purpose + case 47: + // No break on purpose + case 50: + // No break on purpose + case 53: + // No break on purpose + case 58: + // No break on purpose + case 64: + // No break on purpose + case 66: + // No break on purpose + case 67: + // No break on purpose + case 79: + // No break on purpose + case 80: + // No break on purpose + case 86: + // No break on purpose + case 89: + // No break on purpose + case 90: + // No break on purpose + case 91: + // No break on purpose + case 92: + // No break on purpose + case 95: + // No break on purpose + case 96: + // No break on purpose + case 97: + // No break on purpose + case 98: + // No break on purpose + case 100: + _downExit._enabled = true; + R2_GLOBALS._walkRegions.disableRegion(4); + R2_GLOBALS._walkRegions.disableRegion(5); + R2_GLOBALS._walkRegions.disableRegion(6); + R2_GLOBALS._walkRegions.disableRegion(10); + R2_GLOBALS._walkRegions.disableRegion(11); + default: + break; + } + R2_GLOBALS._uiElements.draw(); +} + +void Scene1950::enterArea() { + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + + _vampire.remove(); + _door.remove(); + _scrolls.remove(); + + _vampireActive = false; + _vampireIndex = 0; + + // Certain areas have a vampire in them + switch (R2_GLOBALS._flubMazeArea) { + case 10: + _vampireIndex = 1; + break; + case 13: + _vampireIndex = 2; + break; + case 16: + _vampireIndex = 3; + break; + case 17: + _vampireIndex = 4; + break; + case 24: + _vampireIndex = 5; + break; + case 25: + _vampireIndex = 6; + break; + case 31: + _vampireIndex = 7; + break; + case 40: + _vampireIndex = 8; + break; + case 45: + _vampireIndex = 9; + break; + case 46: + _vampireIndex = 10; + break; + case 73: + _vampireIndex = 11; + break; + case 75: + _vampireIndex = 12; + break; + case 80: + _vampireIndex = 13; + break; + case 87: + _vampireIndex = 14; + break; + case 88: + _vampireIndex = 15; + break; + case 96: + _vampireIndex = 16; + break; + case 97: + _vampireIndex = 17; + break; + case 104: + _vampireIndex = 18; + break; + default: + break; + } + + if (_vampireIndex != 0) { + _vampire.postInit(); + _vampire._numFrames = 6; + _vampire._moveRate = 6; + _vampire._moveDiff = Common::Point(3, 2); + _vampire._effect = EFFECT_SHADED; + + if (!R2_GLOBALS._vampireData[_vampireIndex - 1]._isAlive) { + // Show vampire ashes + _vampire.setPosition(Common::Point(R2_GLOBALS._vampireData[_vampireIndex - 1]._position)); + _vampire.animate(ANIM_MODE_NONE, NULL); + _vampire.addMover(NULL); + _vampire.setVisage(1961); + _vampire.setStrip(4); + _vampire.setFrame(10); + _vampire.fixPriority(10); + _vampire.setDetails(1950, 15, -1, 17, 2, (SceneItem *) NULL); + } else { + // Start the vampire + _vampire.setVisage(1960); + _vampire.setPosition(Common::Point(160, 130)); + _vampire.animate(ANIM_MODE_2, NULL); + _vampire.setDetails(1950, 12, -1, 14, 2, (SceneItem *) NULL); + _vampireActive = true; + } + } + if ((R2_GLOBALS._flubMazeArea == 1) && (R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) != 0)) { + // Show doorway at the right hand side of the very first flub corridor + _door.postInit(); + _door.setVisage(1948); + _door.setStrip(3); + _door.setPosition(Common::Point(278, 155)); + _door.fixPriority(100); + _door.setDetails(1950, 19, 20, 23, 2, (SceneItem *) NULL); + } + + if (R2_GLOBALS._flubMazeArea == 102) { + R2_GLOBALS._walkRegions.load(1951); + R2_GLOBALS._walkRegions.disableRegion(1); + R2_GLOBALS._walkRegions.disableRegion(5); + R2_GLOBALS._walkRegions.disableRegion(6); + R2_GLOBALS._walkRegions.disableRegion(7); + + _cube.postInit(); + _cube.setVisage(1970); + _cube.setStrip(1); + if (R2_GLOBALS.getFlag(37)) + _cube.setFrame(3); + else + _cube.setFrame(1); + _cube.setPosition(Common::Point(193, 158)); + _cube.setDetails(1950, 3, 4, 5, 2, (SceneItem *) NULL); + + _pulsingLights.postInit(); + _pulsingLights.setVisage(1970); + _pulsingLights.setStrip(3); + _pulsingLights.animate(ANIM_MODE_2, NULL); + _pulsingLights._numFrames = 6; + _pulsingLights.setPosition(Common::Point(194, 158)); + _pulsingLights.fixPriority(159); + + _keypad.setDetails(Rect(188, 124, 199, 133), 1950, 27, 28, -1, 2, NULL); + + if (R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 1950) { + _gem.postInit(); + _gem.setVisage(1970); + _gem.setStrip(1); + _gem.setFrame(2); + _gem.fixPriority(160); + } + + if (R2_GLOBALS.getFlag(37)) { + _gem.setPosition(Common::Point(192, 118)); + _gem.setDetails(1950, 9, 4, -1, 2, (SceneItem *) NULL); + } else { + _containmentField.postInit(); + _containmentField.setVisage(1970); + _containmentField.setStrip(4); + _containmentField._numFrames = 4; + _containmentField.animate(ANIM_MODE_8, 0, NULL); + _containmentField.setPosition(Common::Point(192, 121)); + _containmentField.fixPriority(159); + _containmentField.setDetails(1950, 6, 7, 8, 2, (SceneItem *) NULL); + + _gem.setPosition(Common::Point(192, 109)); + _gem.setDetails(1950, 9, 7, 8, 2, (SceneItem *) NULL); + } + + _scrolls.postInit(); + _scrolls.setVisage(1972); + _scrolls.setStrip(1); + _scrolls.setPosition(Common::Point(76, 94)); + _scrolls.fixPriority(25); + _scrolls.setDetails(1950, 30, -1, -1, 2, (SceneItem *) NULL); + if (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 2) + _scrolls.setFrame(2); + else + _scrolls.setFrame(1); + + _removeFlag = true; + } else if (_removeFlag) { + _cube.remove(); + _containmentField.remove(); + _gem.remove(); + _pulsingLights.remove(); + _scrolls.remove(); + + R2_GLOBALS._sceneItems.remove(&_background); + _background.setDetails(Rect(0, 0, 320, 200), 1950, 0, 1, 2, 2, NULL); + + _removeFlag = false; + } + + switch (R2_GLOBALS._flubMazeEntryDirection) { + case 0: + _sceneMode = 1950; + if (R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) == 0) + // The original uses CURSOR_ARROW. CURSOR_WALK is much more coherent + R2_GLOBALS._player.enableControl(CURSOR_WALK); + else + setAction(&_sequenceManager, this, 1950, &R2_GLOBALS._player, NULL); + + break; + case 1: { + _sceneMode = R2_GLOBALS._flubMazeEntryDirection; + R2_GLOBALS._player.setPosition(Common::Point(160, 213)); + Common::Point pt(160, 160); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } + break; + case 2: + _sceneMode = R2_GLOBALS._flubMazeEntryDirection; + if (R2_GLOBALS.getFlag(36)) + setAction(&_sequenceManager, this, 1957, &R2_GLOBALS._player, NULL); + else + setAction(&_sequenceManager, this, 1974, &R2_GLOBALS._player, NULL); + break; + case 3: + // Entering from the left + if (!_vampireActive) { + _sceneMode = R2_GLOBALS._flubMazeEntryDirection; + R2_GLOBALS._player.setPosition(Common::Point(-20, 160)); + Common::Point pt(30, 160); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } else { + _sceneMode = 18; + _eastExit._enabled = false; + _vampireDestPos = Common::Point(60, 152); + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = false; + + _vampire.setStrip(2); + NpcMover *mover = new NpcMover(); + _vampire.addMover(mover, &_vampireDestPos, this); + + R2_GLOBALS._player.setPosition(Common::Point(-20, 160)); + Common::Point pt2(30, 160); + NpcMover *mover2 = new NpcMover(); + R2_GLOBALS._player.addMover(mover2, &pt2, NULL); + } + break; + case 4: + _sceneMode = R2_GLOBALS._flubMazeEntryDirection; + if (!_upExitStyle) { + if (R2_GLOBALS.getFlag(36)) + setAction(&_sequenceManager, this, 1955, &R2_GLOBALS._player, NULL); + else + setAction(&_sequenceManager, this, 1972, &R2_GLOBALS._player, NULL); + } else { + if (R2_GLOBALS.getFlag(36)) + setAction(&_sequenceManager, this, 1954, &R2_GLOBALS._player, NULL); + else + setAction(&_sequenceManager, this, 1971, &R2_GLOBALS._player, NULL); + } + break; + case 5: { + _sceneMode = R2_GLOBALS._flubMazeEntryDirection; + R2_GLOBALS._player.setPosition(Common::Point(160, 127)); + Common::Point pt(160, 160); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } + break; + case 6: + // Entering from the right + if (!_vampireActive) { + _sceneMode = R2_GLOBALS._flubMazeEntryDirection; + if (R2_GLOBALS._flubMazeArea == 1) { + setAction(&_sequenceManager, this, 1961, &R2_GLOBALS._player, NULL); + } else { + R2_GLOBALS._player.setPosition(Common::Point(340, 160)); + Common::Point pt(289, 160); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } + } else { + _sceneMode = 17; + _westExit._enabled = false; + _vampireDestPos = Common::Point(259, 152); + + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = false; + + _vampire.setStrip(1); + NpcMover *mover = new NpcMover(); + _vampire.addMover(mover, &_vampireDestPos, this); + + R2_GLOBALS._player.setPosition(Common::Point(340, 160)); + Common::Point pt2(289, 160); + NpcMover *mover2 = new NpcMover(); + R2_GLOBALS._player.addMover(mover2, &pt2, NULL); + } + break; + default: + break; + } +} + +void Scene1950::doButtonPress(int indx) { + Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene; + R2_GLOBALS._player.disableControl(); + + int prevIndex = indx - 1; + if ((indx / 4) == (prevIndex / 4)) { + if (prevIndex < 0) + prevIndex = 3; + } else { + prevIndex += 4; + } + + assert(prevIndex >= 0 && prevIndex < 16); + if (!_KeypadWindow._buttons[prevIndex]._toggled) { + _KeypadWindow._buttons[prevIndex].setFrame(2); + _KeypadWindow._buttons[prevIndex]._toggled = true; + } else { + _KeypadWindow._buttons[prevIndex].setFrame(1); + _KeypadWindow._buttons[prevIndex]._toggled = false; + } + + prevIndex = indx + 1; + if ((indx / 4) == (prevIndex / 4)) { + if (prevIndex > 15) + prevIndex = 12; + } else { + prevIndex -= 4; + } + + assert(prevIndex >= 0 && prevIndex < 16); + if (!_KeypadWindow._buttons[prevIndex]._toggled) { + _KeypadWindow._buttons[prevIndex].setFrame(2); + _KeypadWindow._buttons[prevIndex]._toggled = true; + } else { + _KeypadWindow._buttons[prevIndex].setFrame(1); + _KeypadWindow._buttons[prevIndex]._toggled = false; + } + + prevIndex = indx - 4; + if (prevIndex < 0) + prevIndex += 16; + + assert(prevIndex >= 0 && prevIndex < 16); + if (!_KeypadWindow._buttons[prevIndex]._toggled) { + _KeypadWindow._buttons[prevIndex].setFrame(2); + _KeypadWindow._buttons[prevIndex]._toggled = true; + } else { + _KeypadWindow._buttons[prevIndex].setFrame(1); + _KeypadWindow._buttons[prevIndex]._toggled = false; + } + + prevIndex = indx + 4; + if (prevIndex > 15) + prevIndex -= 16; + + assert(prevIndex >= 0 && prevIndex < 16); + if (!_KeypadWindow._buttons[prevIndex]._toggled) { + _KeypadWindow._buttons[prevIndex].setFrame(2); + _KeypadWindow._buttons[prevIndex]._toggled = true; + } else { + _KeypadWindow._buttons[prevIndex].setFrame(1); + _KeypadWindow._buttons[prevIndex]._toggled = false; + } + + // Check whether all the buttons are highlighted + int cpt = 0; + for (prevIndex = 0; prevIndex < 16; prevIndex++) { + if (_KeypadWindow._buttons[prevIndex]._toggled) + ++cpt; + } + + if (cpt != 16) { + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player._canWalk = false; + } else { + R2_GLOBALS.setFlag(37); + _sceneMode = 24; + setAction(&_sequenceManager, scene, 1976, NULL); + } +} + +void Scene1950::postInit(SceneObjectList *OwnerList) { + _upExitStyle = false; + _removeFlag = false; + _vampireActive = false; + _vampireIndex = 0; + if (R2_GLOBALS._sceneManager._previousScene == 300) + R2_GLOBALS._flubMazeArea = 103; + + initArea(); + SceneExt::postInit(); + R2_GLOBALS._sound1.play(105); + + _northExit.setDetails(Rect(130, 46, 189, 135), SHADECURSOR_UP, 1950); + _northExit.setDest(Common::Point(160, 145)); + + _upExit.setDetails(Rect(208, 0, 255, 73), EXITCURSOR_N, 1950); + _upExit.setDest(Common::Point(200, 151)); + + _eastExit.setDetails(Rect(305, 95, 320, 147), EXITCURSOR_E, 1950); + _eastExit.setDest(Common::Point(312, 160)); + + _downExit.setDetails(Rect(208, 99, 255, 143), EXITCURSOR_S, 1950); + _downExit.setDest(Common::Point(200, 151)); + + _southExit.setDetails(Rect(113, 154, 206, 168), SHADECURSOR_DOWN, 1950); + _southExit.setDest(Common::Point(160, 165)); + + _westExit.setDetails(Rect(0, 95, 14, 147), EXITCURSOR_W, 1950); + _westExit.setDest(Common::Point(7, 160)); + + _shaftExit.setDetails(Rect(72, 54, 120, 128), EXITCURSOR_NW, 1950); + _shaftExit.setDest(Common::Point(120, 140)); + + _doorExit.setDetails(Rect(258, 60, 300, 145), EXITCURSOR_NE, 1950); + _doorExit.setDest(Common::Point(268, 149)); + + R2_GLOBALS._player.postInit(); + if ( (R2_INVENTORY.getObjectScene(R2_TANNER_MASK) == 0) && (R2_INVENTORY.getObjectScene(R2_PURE_GRAIN_ALCOHOL) == 0) + && (R2_INVENTORY.getObjectScene(R2_SOAKED_FACEMASK) == 0) && (!R2_GLOBALS.getFlag(36)) ) + R2_GLOBALS._player.setVisage(22); + else + R2_GLOBALS._player.setVisage(20); + + R2_GLOBALS._player._moveDiff = Common::Point(5, 3); + _background.setDetails(Rect(0, 0, 320, 200), 1950, 0, 1, 2, 1, NULL); + + enterArea(); +} + +void Scene1950::remove() { + R2_GLOBALS._sound1.stop(); + R2_GLOBALS._sound2.fadeOut2(NULL); + SceneExt::remove(); +} + +void Scene1950::signal() { + switch (_sceneMode) { + case 11: + R2_GLOBALS._flubMazeArea += 7; + initArea(); + enterArea(); + break; + case 12: + // Moving up a ladder within the Flub maze + R2_GLOBALS._flubMazeArea += 35; + initArea(); + enterArea(); + break; + case 1975: + SceneItem::display(1950, 21, SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, 1, + SET_Y, 20, SET_EXT_BGCOLOR, 7, LIST_END); + // No break on purpose + case 13: + // Moving east within the Flub maze + ++R2_GLOBALS._flubMazeArea; + initArea(); + enterArea(); + break; + case 14: + // Moving down a ladder within the Flub maze + R2_GLOBALS._flubMazeArea -= 35; + initArea(); + enterArea(); + break; + case 15: + R2_GLOBALS._flubMazeArea -= 7; + initArea(); + enterArea(); + break; + case 16: + // Moving west within the Flub maze + // No break on purpose + case 1961: + --R2_GLOBALS._flubMazeArea; + initArea(); + enterArea(); + break; + case 17: { + _sceneMode = 13; + R2_GLOBALS._flubMazeEntryDirection = 3; + _vampireActive = false; + R2_GLOBALS._player.disableControl(CURSOR_WALK); + R2_GLOBALS._player._canWalk = true; + R2_GLOBALS._player.setVisage(22); + R2_GLOBALS._player.animate(ANIM_MODE_9); + Common::Point pt(340, 160); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + Common::Point pt2(289, 160); + NpcMover *mover2 = new NpcMover(); + _vampire.addMover(mover2, &pt2, NULL); + } + break; + case 18: { + _sceneMode = 16; + R2_GLOBALS._flubMazeEntryDirection = 6; + _vampireActive = false; + R2_GLOBALS._player.disableControl(CURSOR_WALK); + R2_GLOBALS._player._canWalk = true; + R2_GLOBALS._player.setVisage(22); + R2_GLOBALS._player.animate(ANIM_MODE_9); + Common::Point pt(-20, 160); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + Common::Point pt2(30, 160); + NpcMover *mover2 = new NpcMover(); + _vampire.addMover(mover2, &pt2, NULL); + } + break; + case 24: + _KeypadWindow.remove(); + _sceneMode = 1966; + _cube.setFrame(3); + setAction(&_sequenceManager, this, 1966, &_containmentField, &_gem, NULL); + break; + case 1951: + R2_GLOBALS._sound1.fadeOut2(NULL); + R2_GLOBALS._sceneManager.changeScene(1945); + break; + case 1958: + SceneItem::display(1950, 24, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + R2_GLOBALS._player.enableControl(CURSOR_WALK); + _doorExit._enabled = true; + break; + case 1959: + R2_INVENTORY.setObjectScene(R2_SOAKED_FACEMASK, 0); + R2_GLOBALS._player.enableControl(CURSOR_WALK); + _doorExit._enabled = true; + break; + case 1962: + // No break on purpose + case 1963: + R2_GLOBALS._player.enableControl(); + _KeypadWindow.setup2(1971, 1, 1, 160, 135); + break; + case 1964: + // No break on purpose + case 1965: + if (!R2_GLOBALS.getFlag(37)) + SceneItem::display(1950, 26, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END); + + R2_GLOBALS._player.enableControl(); + break; + case 1966: + _containmentField.remove(); + if (R2_GLOBALS.getFlag(36)) { + _sceneMode = 1964; + setAction(&_sequenceManager, this, 1964, &R2_GLOBALS._player, NULL); + } else { + _sceneMode = 1965; + setAction(&_sequenceManager, this, 1965, &R2_GLOBALS._player, NULL); + } + _gem.setDetails(1950, 9, -1, -1, 2, (SceneItem *) NULL); + break; + case 1967: { + _sceneMode = 0; + R2_INVENTORY.setObjectScene(R2_SAPPHIRE_BLUE, 2); + _gem.remove(); + if (R2_GLOBALS.getFlag(36)) + R2_GLOBALS._player.setVisage(20); + else + R2_GLOBALS._player.setVisage(22); + + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + // This is a hack to work around a pathfinding issue. original destination is (218, 165) + Common::Point pt(128, 165); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } + break; + case 1968: + R2_GLOBALS._player.enableControl(); + R2_INVENTORY.setObjectScene(R2_ANCIENT_SCROLLS, 2); + _scrolls.setFrame(2); + if (R2_GLOBALS.getFlag(36)) + R2_GLOBALS._player.setVisage(20); + else + R2_GLOBALS._player.setVisage(22); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + break; + default: + R2_GLOBALS._player.enableControl(CURSOR_WALK); + break; + } +} + +void Scene1950::process(Event &event) { + if ( (event.eventType == EVENT_BUTTON_DOWN) + && (R2_GLOBALS._player._uiEnabled) + && (R2_GLOBALS._events.getCursor() == R2_SOAKED_FACEMASK) + && (R2_GLOBALS._player._bounds.contains(event.mousePos)) + && (R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) == 0)) { + event.handled = true; + R2_GLOBALS._player.disableControl(); + _shaftExit._enabled = false; + _doorExit._enabled = false; + _sceneMode = 1959; + setAction(&_sequenceManager, this, 1959, &R2_GLOBALS._player, NULL); + } + + Scene::process(event); +} + +} // End of namespace Ringworld2 +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld2/ringworld2_vampire.h b/engines/tsage/ringworld2/ringworld2_vampire.h new file mode 100644 index 0000000000..f2539421f1 --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_vampire.h @@ -0,0 +1,180 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef TSAGE_RINGWORLD2_VAMPIRE_H +#define TSAGE_RINGWORLD2_VAMPIRE_H + +#include "tsage/converse.h" +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" +#include "tsage/sound.h" +#include "tsage/ringworld2/ringworld2_logic.h" + +namespace TsAGE { + +namespace Ringworld2 { + +using namespace TsAGE; + +class Scene1950 : public SceneExt { + /* Windows */ + class KeypadWindow: public ModalWindow { + public: + class KeypadButton : public SceneActor { + public: + int _buttonIndex; + bool _pressed; + bool _toggled; + + KeypadButton(); + void synchronize(Serializer &s); + + void init(int indx); + virtual void process(Event &event); + virtual bool startAction(CursorType action, Event &event); + }; + + SceneActor _areaActor; + KeypadButton _buttons[16]; + + int _buttonIndex; + + KeypadWindow(); + virtual void synchronize(Serializer &s); + virtual void remove(); + virtual void setup2(int visage, int stripFrameNum, int frameNum, int posX, int posY); + virtual void setup3(int resNum, int lookLineNum, int talkLineNum, int useLineNum); + }; + + class Keypad : public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Actors */ + class Door : public SceneActor { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Scrolls : public SceneActor { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Gem : public SceneActor { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Vampire : public SceneActor { + public: + Common::Point _deadPosition; + int _deltaX; + int _deltaY; + int _vampireMode; + + Vampire(); + void synchronize(Serializer &s); + + virtual void signal(); + virtual bool startAction(CursorType action, Event &event); + }; + + /* Exits */ + class NorthExit : public SceneExit { + public: + virtual void changeScene(); + }; + class UpExit : public SceneExit { + public: + virtual void changeScene(); + }; + class EastExit : public SceneExit { + public: + virtual void changeScene(); + }; + class DownExit : public SceneExit { + public: + virtual void changeScene(); + }; + class SouthExit : public SceneExit { + public: + virtual void changeScene(); + }; + class WestExit : public SceneExit { + public: + virtual void changeScene(); + }; + class ShaftExit : public SceneExit { + public: + virtual void changeScene(); + }; + class DoorExit : public SceneExit { + public: + virtual void changeScene(); + }; +private: + void initArea(); + void enterArea(); + void doButtonPress(int indx); +public: + NamedHotspot _background; + Keypad _keypad; + SceneActor _southDoorway; + SceneObject _northDoorway; + Door _door; + Scrolls _scrolls; + SceneActor _containmentField; + Gem _gem; + SceneActor _cube; + SceneActor _pulsingLights; + Vampire _vampire; + KeypadWindow _KeypadWindow; + NorthExit _northExit; + UpExit _upExit; + EastExit _eastExit; + DownExit _downExit; + SouthExit _southExit; + WestExit _westExit; + ShaftExit _shaftExit; + DoorExit _doorExit; + SequenceManager _sequenceManager; + + bool _upExitStyle; + bool _removeFlag; + bool _vampireActive; + Common::Point _vampireDestPos; + int _vampireIndex; + + Scene1950(); + void synchronize(Serializer &s); + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void signal(); + virtual void process(Event &event); +}; + +} // End of namespace Ringworld2 +} // End of namespace TsAGE + +#endif -- cgit v1.2.3