Files
scummvm-cursorfix/engines/tsage/ringworld2/ringworld2_scenes0.cpp
2026-02-02 04:50:13 +01:00

7940 lines
210 KiB
C++

/* 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 3 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, see <http://www.gnu.org/licenses/>.
*
*/
#include "tsage/scenes.h"
#include "tsage/tsage.h"
#include "tsage/staticres.h"
#include "tsage/ringworld2/ringworld2_dialogs.h"
#include "tsage/ringworld2/ringworld2_scenes0.h"
#include "tsage/ringworld2/ringworld2_speakers.h"
namespace TsAGE {
namespace Ringworld2 {
/*--------------------------------------------------------------------------
* Scene 50 - Waking up cutscene
*
*--------------------------------------------------------------------------*/
void Scene50::Action1::signal() {
switch (_actionIndex++) {
case 0:
setDelay(2);
break;
case 1:
setDelay(180);
break;
case 2:
R2_GLOBALS._sceneManager.changeScene(100);
break;
default:
break;
}
}
void Scene50::postInit(SceneObjectList *OwnerList) {
loadScene(110);
SceneExt::postInit(OwnerList);
R2_GLOBALS._uiElements._active = false;
R2_GLOBALS._scenePalette.loadPalette(0);
R2_GLOBALS._sound2.play(10);
R2_GLOBALS._player.disableControl();
setAction(&_action1);
}
void Scene50::process(Event &event) {
if ((event.eventType != EVENT_BUTTON_DOWN) && (event.eventType == EVENT_CUSTOM_ACTIONSTART)
&& (event.eventType != EVENT_KEYPRESS) && (event.eventType == EVENT_UNK27)) {
event.handled = true;
g_globals->_events.setCursor(CURSOR_ARROW);
HelpDialog::show();
R2_GLOBALS._sceneManager.changeScene(100);
}
}
/*--------------------------------------------------------------------------
* Scene 100 - Quinn's Room
*
*--------------------------------------------------------------------------*/
bool Scene100::Door::startAction(CursorType action, Event &event) {
Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_USE:
if (_state) {
SceneItem::display2(100, 6);
} else {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 101;
scene->setAction(&scene->_sequenceManager1, scene, 101, &R2_GLOBALS._player, this, NULL);
}
return true;
case CURSOR_TALK:
if (_state) {
SceneItem::display2(100, 26);
_state = 0;
scene->_doorDisplay.setFrame(1);
} else {
SceneItem::display2(100, 27);
_state = 1;
scene->_doorDisplay.setFrame(2);
}
return true;
default:
return SceneActor::startAction(action, event);
}
}
bool Scene100::Table::startAction(CursorType action, Event &event) {
Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_USE:
R2_GLOBALS._player.disableControl();
if (_strip == 2) {
scene->_sceneMode = 108;
scene->_tableLocker.postInit();
scene->_stasisNegator.postInit();
if (R2_INVENTORY.getObjectScene(R2_NEGATOR_GUN) == 1) {
scene->_stasisNegator.setup(100, 7, 2);
} else {
scene->_stasisNegator.setup(100, 7, 1);
scene->_stasisNegator.setDetails(100, 21, 22, 23, 2, (SceneItem *)NULL);
}
// Open table locker
scene->setAction(&scene->_sequenceManager2, scene, 108, this, &scene->_tableLocker,
&scene->_stasisNegator, &R2_GLOBALS._player, NULL);
} else {
scene->_sceneMode = 109;
// Close table locker
scene->setAction(&scene->_sequenceManager2, scene, 109, this, &scene->_tableLocker,
&scene->_stasisNegator, &R2_GLOBALS._player, NULL);
}
return true;
case CURSOR_TALK:
R2_GLOBALS._player.disableControl();
if (_strip == 2) {
SceneItem::display2(100, 18);
scene->_sceneMode = 102;
scene->_tableLocker.postInit();
scene->_stasisNegator.postInit();
if (R2_INVENTORY.getObjectScene(R2_NEGATOR_GUN) == 1) {
scene->_stasisNegator.setup(100, 7, 2);
} else {
scene->_stasisNegator.setup(100, 7, 1);
scene->_stasisNegator.setDetails(100, 21, 22, 23, 2, (SceneItem *)NULL);
}
scene->setAction(&scene->_sequenceManager2, scene, 102, this, &scene->_tableLocker,
&scene->_stasisNegator, NULL);
} else {
SceneItem::display2(100, 19);
scene->_sceneMode = 103;
scene->setAction(&scene->_sequenceManager2, scene, 103, this, &scene->_tableLocker,
&scene->_stasisNegator, NULL);
}
return true;
default:
return SceneActor::startAction(action, event);
}
}
bool Scene100::StasisNegator::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE: {
Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 107;
scene->setAction(&scene->_sequenceManager1, scene, 107, &R2_GLOBALS._player, &scene->_stasisNegator, NULL);
return true;
}
default:
return SceneActor::startAction(action, event);
}
}
bool Scene100::DoorDisplay::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(100, _state ? 24 : 25);
return true;
case CURSOR_TALK:
SceneItem::display2(100, _state ? 26 : 27);
return true;
case CURSOR_USE: {
Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 110;
scene->setAction(&scene->_sequenceManager1, scene, 110, &R2_GLOBALS._player, NULL);
return true;
}
default:
return SceneActor::startAction(action, event);
}
}
bool Scene100::SteppingDisks::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE: {
Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 111;
scene->setAction(&scene->_sequenceManager1, scene, 111, &R2_GLOBALS._player, this, NULL);
return true;
}
default:
return SceneActor::startAction(action, event);
}
}
/*--------------------------------------------------------------------------*/
bool Scene100::Terminal::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE: {
Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 105;
scene->setAction(&scene->_sequenceManager1, scene, 105, &R2_GLOBALS._player, this, NULL);
return true;
}
default:
return NamedHotspot::startAction(action, event);
}
}
/*--------------------------------------------------------------------------*/
void Scene100::postInit(SceneObjectList *OwnerList) {
loadScene(100);
SceneExt::postInit();
if (R2_GLOBALS._sceneManager._previousScene != 125)
R2_GLOBALS._sound1.play(10);
_door.postInit();
_door._state = 0;
_door.setVisage(100);
_door.setPosition(Common::Point(160, 84));
_door.setDetails(100, 3, 4, 5, 1, (SceneItem *)NULL);
_doorDisplay.postInit();
_doorDisplay.setup(100, 2, 1);
_doorDisplay.setPosition(Common::Point(202, 53));
_doorDisplay.setDetails(100, -1, -1, -1, 1, (SceneItem *)NULL);
_table.postInit();
_table.setup(100, 2, 3);
_table.setPosition(Common::Point(175, 157));
_table.setDetails(100, 17, 18, 20, 1, (SceneItem *)NULL);
_bedLights1.postInit();
_bedLights1.setup(100, 3, 1);
_bedLights1.setPosition(Common::Point(89, 79));
_bedLights1.fixPriority(250);
_bedLights1.animate(ANIM_MODE_2, NULL);
_bedLights1._numFrames = 3;
_bedLights2.postInit();
_bedLights2.setup(100, 3, 1);
_bedLights2.setPosition(Common::Point(89, 147));
_bedLights2.fixPriority(250);
_bedLights2.animate(ANIM_MODE_7, 0, NULL);
_bedLights2._numFrames = 3;
_wardrobe.postInit();
_wardrobe.setVisage(101);
_wardrobe.setPosition(Common::Point(231, 126));
_wardrobe.fixPriority(10);
_wardrobe.setDetails(100, 37, -1, 39, 1, (SceneItem *)NULL);
if (R2_INVENTORY.getObjectScene(R2_STEPPING_DISKS) == 100) {
_steppingDisks.postInit();
_steppingDisks.setup(100, 8, 1);
_steppingDisks.setPosition(Common::Point(274, 130));
_steppingDisks.setDetails(100, 40, -1, 42, 1, (SceneItem *)NULL);
}
_terminal.setDetails(11, 100, 14, 15, 16);
_desk.setDetails(12, 100, 11, -1, 13);
_bed.setDetails(13, 100, 8, 9, 10);
_duct.setDetails(14, 100, 34, -1, 36);
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.setVisage(10);
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player.disableControl();
_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 100, 0, 1, -1, 1, NULL);
switch (R2_GLOBALS._sceneManager._previousScene) {
case 50:
case 180:
_wardrobeColorAnim.postInit();
_wardrobeTopAnim.postInit();
_sceneMode = 104;
setAction(&_sequenceManager1, this, 104, &R2_GLOBALS._player, &_wardrobe, &_wardrobeTopAnim, &_wardrobeColorAnim, NULL);
break;
case 125:
_sceneMode = 100;
setAction(&_sequenceManager1, this, 106, &R2_GLOBALS._player, NULL);
break;
case 200:
_sceneMode = 100;
setAction(&_sequenceManager1, this, 100, &R2_GLOBALS._player, &_door, NULL);
break;
default:
R2_GLOBALS._player.setStrip(3);
R2_GLOBALS._player.setPosition(Common::Point(180, 100));
R2_GLOBALS._player.enableControl();
break;
}
}
void Scene100::remove() {
R2_GLOBALS._sound1.play(10);
SceneExt::remove();
}
void Scene100::signal() {
switch (_sceneMode) {
case 101:
R2_GLOBALS._sceneManager.changeScene(200);
break;
case 103:
case 109:
_table.setStrip(2);
_table.setFrame(3);
_tableLocker.remove();
_stasisNegator.remove();
R2_GLOBALS._player.enableControl();
break;
case 104:
_sceneMode = 0;
_wardrobeColorAnim.remove();
_wardrobeTopAnim.remove();
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player._numFrames = 10;
R2_GLOBALS._player.fixPriority(-1);
R2_GLOBALS._player.enableControl();
break;
case 105:
R2_GLOBALS._sceneManager.changeScene(125);
break;
case 107:
R2_GLOBALS._sceneItems.remove(&_stasisNegator);
_stasisNegator.setFrame(2);
R2_INVENTORY.setObjectScene(R2_NEGATOR_GUN, 1);
R2_GLOBALS._player.enableControl();
break;
case 110:
if (_door._state) {
_door._state = 0;
_doorDisplay.setFrame(1);
} else {
_door._state = 1;
_doorDisplay.setFrame(2);
}
R2_GLOBALS._player.enableControl();
break;
case 111:
R2_INVENTORY.setObjectScene(R2_STEPPING_DISKS, 1);
_steppingDisks.remove();
R2_GLOBALS._player.enableControl();
break;
default:
R2_GLOBALS._player.enableControl();
break;
}
}
void Scene100::dispatch() {
int regionIndex = R2_GLOBALS._player.getRegionIndex();
if (regionIndex == 13)
R2_GLOBALS._player._shade = 4;
if ((R2_GLOBALS._player._visage == 13) || (R2_GLOBALS._player._visage == 101))
R2_GLOBALS._player._shade = 0;
SceneExt::dispatch();
if ((_sceneMode == 101) && (_door._frame == 2) && (_table._strip == 5)) {
_table.setAction(&_sequenceManager2, NULL, 103, &_table, &_tableLocker, &_stasisNegator, NULL);
}
}
/*--------------------------------------------------------------------------
* Scene 125 - Computer Terminal
*
*--------------------------------------------------------------------------*/
bool Scene125::Food::startAction(CursorType action, Event &event) {
if (action == CURSOR_USE)
return true;
return SceneActor::startAction(action, event);
}
/*--------------------------------------------------------------------------*/
Scene125::Icon::Icon(): SceneActor() {
_lookLineNum = 0;
_iconId = 0;
_pressed = false;
}
void Scene125::Icon::postInit(SceneObjectList *OwnerList) {
SceneObject::postInit();
_glyph.postInit();
_glyph.fixPriority(255);
_glyph.hide();
_sceneText1._color1 = 92;
_sceneText1._color2 = 0;
_sceneText1._width = 200;
_sceneText2._color1 = 0;
_sceneText2._color2 = 0;
_sceneText2._width = 200;
setDetails(125, -1, -1, -1, 2, (SceneItem *)NULL);
}
void Scene125::Icon::synchronize(Serializer &s) {
SceneActor::synchronize(s);
s.syncAsSint16LE(_lookLineNum);
s.syncAsSint16LE(_iconId);
s.syncAsSint16LE(_pressed);
}
void Scene125::Icon::process(Event &event) {
Scene125 *scene = (Scene125 *)R2_GLOBALS._sceneManager._scene;
if (!event.handled && !(_flags & OBJFLAG_HIDING) && R2_GLOBALS._player._uiEnabled) {
if (event.eventType == EVENT_BUTTON_DOWN) {
int regionIndex = R2_GLOBALS._sceneRegions.indexOf(event.mousePos);
switch (R2_GLOBALS._events.getCursor()) {
case CURSOR_LOOK:
if (regionIndex == _sceneRegionId) {
event.handled = true;
if (_lookLineNum == 26) {
SceneItem::display2(130, 7);
} else {
SceneItem::display2(130, _lookLineNum);
}
}
break;
case CURSOR_USE:
if ((regionIndex == _sceneRegionId) && !_pressed) {
scene->_sound1.play(14);
setFrame(2);
switch (_glyph._strip) {
case 1:
_glyph.setStrip(2);
break;
case 3:
_glyph.setStrip(4);
break;
case 5:
_glyph.setStrip(6);
break;
default:
break;
}
_pressed = true;
event.handled = true;
}
break;
default:
break;
}
}
if ((event.eventType == EVENT_BUTTON_UP) && _pressed) {
setFrame(1);
switch (_glyph._strip) {
case 2:
_glyph.setStrip(1);
break;
case 4:
_glyph.setStrip(3);
break;
case 6:
_glyph.setStrip(5);
break;
default:
break;
}
_pressed = false;
event.handled = true;
scene->consoleAction(_lookLineNum);
}
}
}
void Scene125::Icon::setIcon(int id) {
_lookLineNum = _iconId = id;
SceneActor::_lookLineNum = id;
_sceneText1.remove();
_sceneText2.remove();
if (_lookLineNum) {
Scene125 *scene = (Scene125 *)R2_GLOBALS._sceneManager._scene;
showIcon();
_glyph.setup(161, ((id - 1) / 10) * 2 + 1, ((id - 1) % 10) + 1);
_glyph.setPosition(_position);
_sceneText1._fontNumber = scene->_iconFontNumber;
_sceneText1.setup(CONSOLE125_MESSAGES[id]);
_sceneText1.fixPriority(20);
_sceneText2._fontNumber = scene->_iconFontNumber;
_sceneText2.setup(CONSOLE125_MESSAGES[id]);
_sceneText2.fixPriority(20);
_sceneText2._fontNumber = scene->_iconFontNumber;
_sceneText2.setup(CONSOLE125_MESSAGES[id]);
_sceneText2.fixPriority(10);
switch (_lookLineNum) {
case 5:
_sceneText1.setPosition(Common::Point(62, _position.y + 8));
_sceneText2.setPosition(Common::Point(64, _position.y + 10));
break;
case 6:
case 7:
case 24:
case 25:
_sceneText1.setPosition(Common::Point(65, _position.y + 8));
_sceneText2.setPosition(Common::Point(67, _position.y + 10));
break;
case 26:
_sceneText1.setPosition(Common::Point(83, _position.y + 8));
_sceneText2.setPosition(Common::Point(85, _position.y + 10));
break;
default:
_sceneText1.setPosition(Common::Point(121, _position.y + 8));
_sceneText2.setPosition(Common::Point(123, _position.y + 10));
break;
}
} else {
hideIcon();
}
}
void Scene125::Icon::showIcon() {
_sceneText1.show();
_sceneText2.show();
_glyph.show();
_horizLine.show();
show();
}
void Scene125::Icon::hideIcon() {
_sceneText1.hide();
_sceneText2.hide();
_glyph.hide();
_horizLine.hide();
hide();
}
/*--------------------------------------------------------------------------*/
bool Scene125::DiskSlot::startAction(CursorType action, Event &event) {
Scene125 *scene = (Scene125 *)R2_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_USE:
if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == R2_GLOBALS._player._oldCharacterScene[R2_QUINN]) {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 126;
scene->setAction(&scene->_sequenceManager, scene, 126, &scene->_infoDisk, NULL);
return true;
}
break;
case R2_OPTO_DISK:
if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 1) {
R2_GLOBALS._player.disableControl();
scene->_infoDisk.postInit();
scene->_sceneMode = 125;
scene->setAction(&scene->_sequenceManager, scene, 125, &scene->_infoDisk, NULL);
return true;
}
break;
default:
break;
}
return SceneHotspot::startAction(action, event);
}
/*--------------------------------------------------------------------------*/
Scene125::Scene125(): SceneExt() {
_iconFontNumber = 50;
_consoleMode = 5;
_logIndex = _databaseIndex = _infodiskIndex = 0;
_soundCount = _soundIndex = 0;
for (int i = 0; i < 10; ++i)
_soundIndexes[i] = 0;
}
void Scene125::postInit(SceneObjectList *OwnerList) {
loadScene(160);
SceneExt::postInit();
_palette.loadPalette(0);
if ((R2_GLOBALS._sceneManager._previousScene != 125) && (R2_GLOBALS._sceneManager._previousScene != 1337) && (R2_GLOBALS._sceneManager._previousScene != 1330))
// Save the prior scene to return to when the console is turned off
R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = R2_GLOBALS._sceneManager._previousScene;
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.hide();
R2_GLOBALS._player.disableControl();
if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == R2_GLOBALS._player._oldCharacterScene[R2_QUINN]) {
_infoDisk.postInit();
_infoDisk.setup(160, 3, 5);
_infoDisk.setPosition(Common::Point(47, 167));
}
_foodDispenser.postInit();
_foodDispenser.setup(162, 1, 1);
_foodDispenser.setPosition(Common::Point(214, 168));
_diskSlot.setDetails(Rect(27, 145, 81, 159), 126, 9, -1, -1, 1, NULL);
_item3.setDetails(Rect(144, 119, 286, 167), 126, 6, 7, 8, 1, NULL);
_item2.setDetails(1, 126, 3, 4, 5);
_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 126, 0, 1, -1, 1, NULL);
_sceneMode = 1;
signal();
}
void Scene125::signal() {
switch (_sceneMode) {
case 1:
_icon1.postInit();
_icon1._sceneRegionId = 2;
_icon2.postInit();
_icon2._sceneRegionId = 3;
_icon3.postInit();
_icon3._sceneRegionId = 4;
_icon4.postInit();
_icon4._sceneRegionId = 5;
setAction(&_sequenceManager, this, 127, &_icon1, &_icon2, &_icon3, &_icon4, &R2_GLOBALS._player, NULL);
_sceneMode = 2;
break;
case 2:
_icon1.setup(160, 1, 1);
_icon1.setPosition(Common::Point(65, 17));
_icon1._horizLine.postInit();
_icon1._horizLine.setup(160, 7, 1);
_icon1._horizLine.setPosition(Common::Point(106, 41));
_icon2.setup(160, 1, 1);
_icon2.setPosition(Common::Point(80, 32));
_icon2._horizLine.postInit();
_icon2._horizLine.setup(160, 7, 2);
_icon2._horizLine.setPosition(Common::Point(106, 56));
_icon3.setup(160, 1, 1);
_icon3.setPosition(Common::Point(65, 47));
_icon3._horizLine.postInit();
_icon3._horizLine.setup(160, 7, 1);
_icon3._horizLine.setPosition(Common::Point(106, 71));
_icon4.setup(160, 1, 1);
_icon4.setPosition(Common::Point(80, 62));
_icon4._sceneRegionId = 5;
_icon4._horizLine.postInit();
_icon4._horizLine.setup(160, 7, 2);
_icon4._horizLine.setPosition(Common::Point(106, 86));
_icon5.postInit();
_icon5.setup(160, 1, 1);
_icon5.setPosition(Common::Point(37, 92));
_icon5.setIcon(6);
_icon5._sceneRegionId = 7;
_icon6.postInit();
_icon6.setup(160, 1, 1);
_icon6.setPosition(Common::Point(106, 110));
_icon6.setIcon(5);
_icon6._sceneRegionId = 8;
consoleAction(5);
R2_GLOBALS._player.enableControl(CURSOR_USE);
R2_GLOBALS._player._canWalk = false;
break;
case 10:
switch (_consoleMode) {
case 12:
_sceneMode = 129;
_starchart1.postInit();
_starchart2.postInit();
_starchart3.postInit();
if (R2_GLOBALS.getFlag(13)) {
// Show starchart with Ringworld present
_starchart4.postInit();
setAction(&_sequenceManager, this, 130, &R2_GLOBALS._player, &_starchart1, &_starchart2,
&_starchart3, &_starchart4, NULL);
} else {
// Show starchart without Ringworld
setAction(&_sequenceManager, this, 129, &R2_GLOBALS._player, &_starchart1, &_starchart2,
&_starchart3, NULL);
}
break;
case 13:
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
_infodiskIndex = 0;
setDetails(129, 0);
break;
case 23:
R2_GLOBALS._sceneManager.changeScene(1330);
break;
case 27:
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
_databaseIndex = 0;
setDetails(128, 0);
break;
case 28:
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
_databaseIndex = 37;
setDetails(128, 37);
break;
case 29:
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
_databaseIndex = 68;
setDetails(128, 68);
break;
case 30:
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
_databaseIndex = 105;
setDetails(128, 105);
break;
default:
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
_logIndex = 0;
setDetails(127, 0);
break;
}
break;
case 11:
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
if ((_consoleMode >= 27) && (_consoleMode <= 30)) {
consoleAction(11);
}
consoleAction(2);
_icon6.setIcon(5);
break;
case 12:
if (_soundCount > 0)
--_soundCount;
if (!_soundCount || !(R2_GLOBALS._speechSubtitles & SPEECH_VOICE)) {
_soundIndex = 0;
R2_GLOBALS._playStream.stop();
} else {
_sceneMode = 12;
R2_GLOBALS._playStream.play(_soundIndexes[_soundIndex++], this);
}
break;
case 125:
R2_INVENTORY.setObjectScene(R2_OPTO_DISK, R2_GLOBALS._player._oldCharacterScene[R2_QUINN]);
R2_GLOBALS._player.enableControl();
break;
case 126:
R2_INVENTORY.setObjectScene(R2_OPTO_DISK, 1);
_infoDisk.remove();
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
break;
case 128:
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
SceneItem::display2(126, 12);
break;
default:
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
break;
}
}
void Scene125::synchronize(Serializer &s) {
SceneExt::synchronize(s);
s.syncAsSint16LE(_consoleMode);
s.syncAsSint16LE(_iconFontNumber);
s.syncAsSint16LE(_logIndex);
s.syncAsSint16LE(_databaseIndex);
s.syncAsSint16LE(_infodiskIndex);
s.syncAsSint16LE(_soundCount);
s.syncAsSint16LE(_soundIndex);
for (int i = 0; i < 10; ++i)
s.syncAsSint16LE(_soundIndexes[i]);
}
void Scene125::process(Event &event) {
SceneExt::process(event);
if (R2_GLOBALS._player._uiEnabled) {
_icon1.process(event);
_icon2.process(event);
_icon3.process(event);
_icon4.process(event);
_icon5.process(event);
_icon6.process(event);
}
}
void Scene125::dispatch() {
if (_soundCount)
R2_GLOBALS._playStream.dispatch();
Scene::dispatch();
}
/**
* Handles actions on the console screen.
*/
void Scene125::consoleAction(int id) {
_icon3.setIcon(0);
_icon4.setIcon(0);
if (id == 5)
_icon5.setIcon(6);
else {
switch (_consoleMode) {
case 10:
case 12:
case 13:
case 27:
case 28:
case 29:
case 30:
break;
default:
_icon5.setIcon(7);
break;
}
}
switch (id) {
case 1:
_icon1.setIcon(8);
_icon2.setIcon(9);
break;
case 2:
_icon1.setIcon(10);
_icon2.setIcon(11);
_icon3.setIcon(12);
_icon4.setIcon(13);
break;
case 3:
_icon1.setIcon(15);
_icon2.setIcon(16);
_icon3.setIcon(17);
break;
case 4:
_icon1.setIcon(22);
_icon2.setIcon(23);
break;
case 6:
R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._player._oldCharacterScene[R2_QUINN]);
break;
case 7:
if (_consoleMode == 11)
consoleAction(2);
else if (_consoleMode == 22)
consoleAction(4);
else
consoleAction(5);
break;
case 8:
_iconFontNumber = 50;
stop();
_icon6.setIcon(5);
consoleAction(1);
break;
case 9:
_iconFontNumber = 52;
stop();
_icon6.setIcon(5);
consoleAction(1);
break;
case 10:
R2_GLOBALS._player.disableControl();
consoleAction(2);
_icon1.hideIcon();
_icon2.hideIcon();
_icon3.hideIcon();
_icon5.setIcon(24);
_icon4.setPosition(Common::Point(52, 107));
_icon4._sceneRegionId = 9;
_icon4.setIcon(25);
_icon4._horizLine.hide();
_icon6.setIcon(26);
_sceneMode = 10;
_palette.loadPalette(161);
R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this);
break;
case 11:
_icon1.setIcon(27);
_icon2.setIcon(28);
_icon3.setIcon(29);
_icon4.setIcon(30);
break;
case 12:
R2_GLOBALS._player.disableControl();
consoleAction(2);
_icon1.hideIcon();
_icon2.hideIcon();
_icon3.hideIcon();
_icon4.hideIcon();
_icon5.hideIcon();
_icon6.setIcon(26);
_sceneMode = 10;
_palette.loadPalette(161);
R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this);
break;
case 13:
consoleAction(2);
if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) != R2_GLOBALS._player._oldCharacterScene[R2_QUINN]) {
SceneItem::display2(126, 17);
} else {
R2_GLOBALS._player.disableControl();
_icon1.hideIcon();
_icon2.hideIcon();
_icon3.hideIcon();
_icon5.setIcon(24);
_icon4.setPosition(Common::Point(52, 107));
_icon4._sceneRegionId = 9;
_icon4.setIcon(25);
_icon4._horizLine.hide();
_icon6.setIcon(26);
_sceneMode = 10;
_palette.loadPalette(161);
R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this);
}
break;
case 15:
consoleAction(3);
if (R2_GLOBALS._foodCount < 3) {
R2_GLOBALS._player.disableControl();
_food.postInit();
_food.setup(162, 2, 2);
_food.setPosition(Common::Point(216, UI_INTERFACE_Y));
R2_GLOBALS._foodCount += 2;
_sceneMode = 128;
this->setAction(&_sequenceManager, this, 128, &_foodDispenser, &_food, NULL);
} else if (R2_GLOBALS._foodCount == 3) {
SceneItem::display2(126, 13);
} else {
SceneItem::display2(126, 14);
}
break;
case 16:
consoleAction(3);
if (R2_GLOBALS._foodCount < 4) {
R2_GLOBALS._player.disableControl();
_food.postInit();
_food.setup(162, 2, 3);
_food.setPosition(Common::Point(218, UI_INTERFACE_Y));
++R2_GLOBALS._foodCount;
_sceneMode = 128;
this->setAction(&_sequenceManager, this, 128, &_foodDispenser, &_food, NULL);
} else {
SceneItem::display2(126, 15);
}
break;
case 17:
consoleAction(3);
if (R2_GLOBALS._foodCount < 4) {
R2_GLOBALS._player.disableControl();
_food.postInit();
_food.setup(162, 2, 1);
_food.setPosition(Common::Point(215, UI_INTERFACE_Y));
++R2_GLOBALS._foodCount;
_sceneMode = 128;
this->setAction(&_sequenceManager, this, 128, &_foodDispenser, &_food, NULL);
} else {
SceneItem::display2(126, 16);
}
break;
case 22:
_icon1.setIcon(31);
_icon2.setIcon(32);
_icon3.setIcon(33);
_icon4.setIcon(34);
break;
case 23:
R2_GLOBALS._player.disableControl();
consoleAction(4);
_icon1.hideIcon();
_icon2.hideIcon();
_icon3.hideIcon();
_icon4.hideIcon();
_icon5.hideIcon();
_icon6.hideIcon();
_sceneMode = 10;
_palette.loadPalette(161);
R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this);
break;
case 24:
_icon4.setIcon(25);
_icon4._horizLine.hide();
if (_consoleMode == 10) {
setDetails(127, --_logIndex);
} else if (_consoleMode == 13) {
setDetails(129, --_infodiskIndex);
} else {
setDetails(128, --_databaseIndex);
}
break;
case 25:
_icon4.setIcon(25);
_icon4._horizLine.hide();
if (_consoleMode == 10) {
setDetails(127, ++_logIndex);
} else if (_consoleMode == 13) {
setDetails(129, ++_infodiskIndex);
} else {
setDetails(128, ++_databaseIndex);
}
break;
case 26:
R2_GLOBALS._player.disableControl();
stop();
_icon4.setPosition(Common::Point(80, 62));
_icon4._sceneRegionId = 5;
_icon4.hideIcon();
R2_GLOBALS._player.hide();
_starchart1.hide();
_starchart2.hide();
_starchart3.hide();
_starchart4.hide();
_sceneMode = 11;
_palette.loadPalette(160);
R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this);
break;
case 27:
case 28:
case 29:
case 30:
R2_GLOBALS._player.disableControl();
consoleAction(11);
_consoleMode = id;
_icon1.hideIcon();
_icon2.hideIcon();
_icon3.hideIcon();
_icon4.hideIcon();
_icon5.setIcon(24);
_icon4.setPosition(Common::Point(52, 107));
_icon4._sceneRegionId = 9;
_icon4.setIcon(25);
_icon4._horizLine.hide();
_icon6.setIcon(26);
_sceneMode = 10;
_palette.loadPalette(161);
R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this);
break;
case 31:
consoleAction(22);
R2_GLOBALS._sound1.play((R2_GLOBALS._sound1.getSoundNum() == 10) ? 63 : 10);
break;
case 32:
consoleAction(22);
R2_GLOBALS._sound1.play((R2_GLOBALS._sound1.getSoundNum() == 10) ? 64 : 10);
break;
case 33:
consoleAction(22);
R2_GLOBALS._sound1.play((R2_GLOBALS._sound1.getSoundNum() == 10) ? 65 : 10);
break;
case 34:
consoleAction(22);
R2_GLOBALS._sound1.play((R2_GLOBALS._sound1.getSoundNum() == 10) ? 66 : 10);
break;
default:
_icon1.setIcon(1);
_icon2.setIcon(2);
_icon3.setIcon(3);
_icon4.setIcon(4);
break;
}
if ((id != 6) && (id != 7) && (id != 24) && (id != 25))
_consoleMode = id;
}
/**
* Sets the message to be displayed on the console screen.
*/
void Scene125::setDetails(int resNum, int lineNum) {
stop();
Common::String msg = g_resourceManager->getMessage(resNum, lineNum, true);
if (!msg.empty()) {
// Check for any specified sound numbers embedded in the message
msg = parseMessage(msg);
_sceneText._fontNumber = _iconFontNumber;
_sceneText._color1 = 92;
_sceneText._color2 = 0;
_sceneText._width = 221;
_sceneText.fixPriority(20);
_sceneText.setup(msg);
_sceneText.setPosition(Common::Point(49, 19));
R2_GLOBALS._sceneObjects->draw();
if ((_soundCount > 0) && (R2_GLOBALS._speechSubtitles & SPEECH_VOICE)) {
_sceneMode = 12;
R2_GLOBALS._playStream.play(_soundIndexes[_soundIndex++], this);
}
} else {
// Passed the start or end of the message set, so return to the menu
R2_GLOBALS._player.disableControl();
R2_GLOBALS._player.hide();
_icon4.setPosition(Common::Point(80, 62));
_icon4._sceneRegionId = 5;
_icon4.hideIcon();
_consoleMode = 0;
_palette.loadPalette(160);
_sceneMode = 11;
R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this);
}
}
/**
* Stops any playing console sounds and hides any current console message.
*/
void Scene125::stop() {
_sceneText.remove();
_soundIndex = 0;
_soundCount = 0;
R2_GLOBALS._playStream.stop();
}
/**
* Parses a message to be displayed on the console to see whether there are any sounds to be played.
*/
Common::String Scene125::parseMessage(const Common::String &msg) {
_soundIndex = 0;
_soundCount = 0;
const char *msgP = msg.c_str();
while (*msgP == '!') {
// Get the sound number
_soundIndexes[_soundCount++] = atoi(++msgP);
while (!((*msgP == '\0') || (*msgP < '0') || (*msgP > '9')))
++msgP;
}
return Common::String(msgP);
}
/*--------------------------------------------------------------------------
* Scene 150 - Empty Bedroom
*
*--------------------------------------------------------------------------*/
void Scene150::postInit(SceneObjectList *OwnerList) {
loadScene(100);
SceneExt::postInit();
_door.postInit();
_door._state = 0;
_door.setVisage(100);
_door.setPosition(Common::Point(160, 84));
_door.setDetails(100, 3, -1, -1, 1, (SceneItem *)NULL);
_doorDisplay.postInit();
_doorDisplay.setup(100, 2, 1);
_doorDisplay.setPosition(Common::Point(202, 53));
_doorDisplay.setDetails(100, -1, -1, -1, 1, (SceneItem *)NULL);
_emptyRoomTable.postInit();
_emptyRoomTable.setVisage(100);
_emptyRoomTable.setStrip(4);
_emptyRoomTable.setFrame(1);
_emptyRoomTable.setPosition(Common::Point(175, 157));
_emptyRoomTable.setDetails(150, 3, 4, 5, 1, (SceneItem *)NULL);
_wardrobe.postInit();
_wardrobe.setVisage(101);
_wardrobe.setPosition(Common::Point(231, 126));
_wardrobe.fixPriority(10);
_wardrobe.setDetails(100, 37, -1, 39, 1, (SceneItem *)NULL);
_terminal.setDetails(11, 100, 14, 15, 16);
_desk.setDetails(12, 100, 11, -1, 13);
_bed.setDetails(13, 100, 8, 9, 10);
_duct.setDetails(14, 100, 34, -1, 36);
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.setVisage(10);
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player.disableControl();
_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 150, 0, 1, -1, 1, NULL);
_sceneMode = 100;
switch (R2_GLOBALS._sceneManager._previousScene) {
case 100:
setAction(&_sequenceManager1, this, 106, &R2_GLOBALS._player, NULL);
break;
case 200:
setAction(&_sequenceManager1, this, 100, &R2_GLOBALS._player, &_door, NULL);
break;
default:
R2_GLOBALS._player.setStrip(3);
R2_GLOBALS._player.setPosition(Common::Point(180, 100));
R2_GLOBALS._player.enableControl();
break;
}
}
void Scene150::remove() {
R2_GLOBALS._sound1.fadeOut2(NULL);
SceneExt::remove();
}
void Scene150::signal() {
switch (_sceneMode) {
case 101:
R2_GLOBALS._sceneManager.changeScene(200);
break;
case 105:
R2_GLOBALS._sceneManager.changeScene(125);
break;
case 110:
if (_door._state) {
_door._state = 0;
_doorDisplay.setFrame(1);
} else {
_door._state = 1;
_doorDisplay.setFrame(2);
}
R2_GLOBALS._player.enableControl();
break;
default:
R2_GLOBALS._player.enableControl();
break;
}
}
/*--------------------------------------------------------------------------
* Scene 160 - Credits
*
*--------------------------------------------------------------------------*/
void Scene160::Action1::signal() {
Scene160 *scene = (Scene160 *)R2_GLOBALS._sceneManager._scene;
bool breakFlag;
SynchronizedList<SceneText *>::iterator i;
SceneText *topItem;
switch (_actionIndex) {
case 0:
scene->_yChange = 1;
scene->_lineNum = 0;
++_actionIndex;
// fall through
case 1:
setDelay(5);
breakFlag = true;
do {
if (!scene->_lineNum || ((scene->_lineNum != -1) &&
(((*scene->_creditsList.reverse_begin())->_position.y < 164) || !breakFlag))) {
breakFlag = true;
Common::String msg = g_resourceManager->getMessage(160, scene->_lineNum++);
if (*msg.c_str() == '^') {
scene->_lineNum = -1;
} else {
if (msg.size() == 0)
msg = " ";
SceneText *sceneText = new SceneText();
sceneText->_fontNumber = 50;
switch (*msg.c_str()) {
case '$': {
// Centered text
msg.deleteChar(0);
int width = R2_GLOBALS.gfxManager()._font.getStringWidth(msg.c_str());
sceneText->_textMode = ALIGN_CENTER;
sceneText->setPosition(Common::Point(160 - (width / 2), 175));
sceneText->_width = 320;
break;
}
case '%': {
// Text for position name
msg.deleteChar(0);
int width = R2_GLOBALS.gfxManager()._font.getStringWidth(msg.c_str());
sceneText->_textMode = ALIGN_RIGHT;
sceneText->setPosition(Common::Point(151 - width, 175));
sceneText->_width = 320;
breakFlag = false;
break;
}
case '@':
// Text for who was in the position
msg.deleteChar(0);
sceneText->_textMode = ALIGN_LEFT;
sceneText->_position = Common::Point(167, 175);
sceneText->_width = 153;
break;
default:
sceneText->_width = 151;
sceneText->setPosition(Common::Point(151, 175));
sceneText->_textMode = ALIGN_RIGHT;
break;
}
sceneText->_color1 = 191;
sceneText->_color2 = 191;
sceneText->_color3 = 191;
sceneText->setup(msg);
sceneText->_flags |= OBJFLAG_CLONED;
sceneText->fixPriority(5);
scene->_creditsList.push_back(sceneText);
}
}
} while (!breakFlag);
// Move all the active credits
for (i = scene->_creditsList.begin(); i != scene->_creditsList.end(); ++i) {
SceneObject *item = *i;
item->setPosition(Common::Point(item->_position.x, item->_position.y - scene->_yChange));
}
topItem = *scene->_creditsList.begin();
if (topItem->_position.y < 25) {
// Credit has reached the top, so remove it
topItem->remove();
scene->_creditsList.remove(topItem);
if (scene->_creditsList.size() == 0) {
// No more items left
setDelay(10);
++_actionIndex;
}
}
break;
case 2:
HelpDialog::show();
setDelay(4);
break;
default:
break;
}
}
/*--------------------------------------------------------------------------*/
Scene160::Scene160(): SceneExt() {
_frameNumber = _yChange = 0;
_lineNum = 0;
}
void Scene160::postInit(SceneObjectList *OwnerList) {
loadScene(4001);
R2_GLOBALS._uiElements._active = false;
SceneExt::postInit();
R2_GLOBALS._player._uiEnabled = false;
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
R2_GLOBALS._uiElements.hide();
R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
_lineNum = 0;
_frameNumber = R2_GLOBALS._events.getFrameNumber();
_sound1.play(337);
setAction(&_action1);
}
void Scene160::synchronize(Serializer &s) {
SceneExt::synchronize(s);
s.syncAsSint16LE(_frameNumber);
s.syncAsSint16LE(_yChange);
s.syncAsSint16LE(_lineNum);
_creditsList.synchronize(s);
}
void Scene160::remove() {
// Clear the credit list
SynchronizedList<SceneText *>::iterator i;
for (i = _creditsList.begin(); i != _creditsList.end(); ++i) {
SceneText *item = *i;
item->remove();
}
_creditsList.clear();
_sound1.fadeOut(NULL);
SceneExt::remove();
}
void Scene160::process(Event &event) {
if ((event.eventType == EVENT_CUSTOM_ACTIONSTART) && (event.customType == kActionEscape)) {
event.handled = true;
HelpDialog::show();
}
if (!event.handled)
SceneExt::process(event);
}
/*--------------------------------------------------------------------------
* Scene 180 - Title Screen
*
*--------------------------------------------------------------------------*/
void Scene180::Action1::signal() {
Scene180 *scene = (Scene180 *)R2_GLOBALS._sceneManager._scene;
switch (_actionIndex++) {
case 0:
case 1:
case 2:
scene->_shipDisplay.setStrip((_actionIndex == 1) ? 1 : 2);
scene->_shipDisplay.setFrame(1);
scene->_shipDisplay.animate(ANIM_MODE_5, this);
break;
case 4:
scene->_shipDisplay.setStrip(3);
scene->_shipDisplay.setFrame(1);
scene->_shipDisplay.animate(ANIM_MODE_5, this);
_actionIndex = 0;
break;
default:
break;
}
}
/*--------------------------------------------------------------------------*/
Scene180::Scene180(): SceneExt() {
_helpEnabled = false;
_frameInc = 0;
_frameNumber = R2_GLOBALS._events.getFrameNumber();
_fontNumber = R2_GLOBALS.gfxManager()._font._fontNumber;
GfxFont font;
font.setFontNumber(7);
_fontHeight = font.getHeight() + 1;
_sceneMode = (R2_GLOBALS._sceneManager._previousScene == 205) ? 10 : 0;
_gameTextSpeaker._displayMode = 9;
}
void Scene180::postInit(SceneObjectList *OwnerList) {
loadScene(9999);
SceneExt::postInit();
R2_GLOBALS._uiElements._active = true;
R2_GLOBALS._player.disableControl();
_stripManager.addSpeaker(&_gameTextSpeaker);
_stripManager.addSpeaker(&_webbsterSpeaker);
_stripManager.addSpeaker(&_tealSpeaker);
_stripManager.addSpeaker(&_dutyOfficerSpeaker);
signal();
}
void Scene180::remove() {
_stripManager._currObj44Id = -1;
// _stripManager._field2EA = -1;
SceneExt::remove();
R2_GLOBALS._scenePalette.loadPalette(0);
R2_GLOBALS._scenePalette.setEntry(255, 255, 255, 255);
R2_GLOBALS._events.setCursor(CURSOR_WALK);
// word_575F7 = 0;
R2_GLOBALS._playStream.stop();
R2_GLOBALS._sound2.fadeOut2(NULL);
R2_GLOBALS._sound1.fadeOut2(NULL);
}
void Scene180::synchronize(Serializer &s) {
SceneExt::synchronize(s);
s.syncAsSint16LE(_frameNumber);
s.syncAsSint16LE(_helpEnabled);
s.syncAsSint16LE(_frameInc);
s.syncAsSint16LE(_fontNumber);
s.syncAsSint16LE(_fontHeight);
}
void Scene180::signal() {
R2_GLOBALS._playStream.stop();
switch (_sceneMode++) {
case 0:
setSceneDelay(6);
break;
case 1:
_helpEnabled = true;
R2_GLOBALS._sceneManager._hasPalette = true;
_animationPlayer._paletteMode = ANIMPALMODE_NONE;
_animationPlayer._isActive = true;
_animationPlayer._objectMode = ANIMOBJMODE_1;
R2_GLOBALS._scene180Mode = 1;
_animationPlayer.load(1);
R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
R2_GLOBALS._sound1.play(1);
break;
case 2:
R2_GLOBALS._scene180Mode = 1;
R2_GLOBALS._paneRefreshFlag[0] = 3;
if (R2_GLOBALS._sound1.isPlaying()) {
setSceneDelay(1);
} else {
setSceneDelay(180);
}
break;
case 3:
R2_GLOBALS._scene180Mode = 1;
if (R2_GLOBALS._sound1.isPlaying())
_sceneMode = 3;
setSceneDelay(1);
break;
case 4:
case 8:
case 30:
case 43:
case 47:
_helpEnabled = false;
R2_GLOBALS._screen.fillRect(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 0);
_palette.loadPalette(0);
_palette.loadPalette(9998);
R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 8, this);
break;
case 5:
_animationPlayer._paletteMode = ANIMPALMODE_NONE;
_animationPlayer._isActive = true;
_animationPlayer._objectMode = ANIMOBJMODE_1;
R2_GLOBALS._scene180Mode = 2;
_animationPlayer.load(2);
_helpEnabled = true;
R2_GLOBALS._scenePalette.addFader(_animationPlayer._subData._palData, 256, 6, NULL);
R2_GLOBALS._sound1.play(2);
break;
case 6:
R2_GLOBALS._scene180Mode = 2;
R2_GLOBALS._paneRefreshFlag[0] = 3;
if (R2_GLOBALS._sound1.isPlaying()) {
setSceneDelay(1);
} else {
setSceneDelay(180);
}
break;
case 7:
// Title screen. Wait until title music finishes playing
R2_GLOBALS._scene180Mode = 2;
if (R2_GLOBALS._sound1.isPlaying())
_sceneMode = 7;
setSceneDelay(1);
break;
case 9:
R2_GLOBALS._sound1.play(3);
clearScreen();
setSceneDelay(2);
break;
case 10:
loadScene(4002);
R2_GLOBALS._scenePalette.loadPalette(0);
R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
setSceneDelay(6);
break;
case 11:
_helpEnabled = true;
_door.postInit();
_shipDisplay.postInit();
setAction(&_sequenceManager, this, 4000, &_door, &_shipDisplay, NULL);
break;
case 12:
case 14:
case 16:
case 18:
case 20:
case 22:
case 24:
case 26:
case 46:
setSceneDelay((R2_GLOBALS._speechSubtitles & SPEECH_TEXT) ? 1 : 18);
break;
case 13:
setAction(&_sequenceManager, this, 4001, &_door, &_shipDisplay, NULL);
break;
case 15:
setAction(&_sequenceManager, this, 4002, &_door, &_shipDisplay, NULL);
break;
case 17:
setAction(&_sequenceManager, this, 4003, &_door, &_shipDisplay, NULL);
break;
case 19:
setAction(&_sequenceManager, this, 4004, &_door, &_shipDisplay, NULL);
break;
case 21:
setAction(&_sequenceManager, this, 4005, &_door, &_shipDisplay, NULL);
break;
case 23:
setAction(&_sequenceManager, this, 4006, &_door, &_shipDisplay, NULL);
break;
case 25:
setAction(&_sequenceManager, this, 4007, &_door, &_shipDisplay, NULL);
break;
case 27:
_helpEnabled = false;
_door.remove();
_shipDisplay.remove();
setSceneDelay(2);
break;
case 28:
_helpEnabled = false;
_palette.loadPalette(0);
_palette.loadPalette(9998);
R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 100, this);
break;
case 29:
_helpEnabled = true;
_animationPlayer._paletteMode = ANIMPALMODE_REPLACE_PALETTE;
_animationPlayer._isActive = true;
_animationPlayer._objectMode = ANIMOBJMODE_42;
R2_GLOBALS._scene180Mode = 3;
_animationPlayer.load(3);
break;
case 31:
R2_GLOBALS._sound2.play(7);
_door.postInit();
_door.setVisage(76);
_door.setStrip(1);
_door.setFrame(1);
_door.setPosition(Common::Point(288, 143));
_door.fixPriority(210);
loadScene(75);
R2_GLOBALS._scenePalette.loadPalette(0);
R2_GLOBALS._scenePalette.loadPalette(75);
if (R2_GLOBALS._sceneManager._hasPalette)
R2_GLOBALS._scenePalette.refresh();
setSceneDelay(6);
break;
case 32:
_helpEnabled = true;
_teal.postInit();
_teal.setPosition(Common::Point(161, 97));
_teal.hide();
_webbster.postInit();
_webbster.setPosition(Common::Point(60, 96));
_webbster.hide();
_stripManager.start(11, this);
break;
case 33:
_teal.hide();
_webbster.setup(76, 4, 1);
_webbster.setFrame(_webbster.getFrameCount());
_shipDisplay.postInit();
_shipDisplay.setup(75, 1, 1);
_shipDisplay.setPosition(Common::Point(221, 125));
_shipDisplay.fixPriority(210);
_shipDisplay.setAction(&_action1);
_stripManager.start(12, this);
break;
case 34:
_teal.hide();
_webbster.remove();
_dutyOfficer.postInit();
_dutyOfficer.setup(76, 2, 1);
_dutyOfficer.setPosition(Common::Point(287, 135));
_dutyOfficer.fixPriority(200);
_sound1.play(19);
_door.animate(ANIM_MODE_5, this);
break;
case 35:
_stripManager.start(13, this);
break;
case 36:
_teal.remove();
_sound1.play(19);
_door.animate(ANIM_MODE_6, this);
break;
case 37:
_helpEnabled = false;
_dutyOfficer.remove();
_palette.loadPalette(9998);
R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 8, this);
break;
case 38:
_door.remove();
_shipDisplay.setAction(NULL);
_shipDisplay.remove();
_backSurface.fillRect(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 0);
R2_GLOBALS._screen.fillRect(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 0);
R2_GLOBALS._sound2.fadeOut2(NULL);
R2_GLOBALS._sound1.fadeOut2(this);
break;
case 39:
R2_GLOBALS._sound1.changeSound(8);
setSceneDelay(1);
break;
case 40:
_animationPlayer._paletteMode = ANIMPALMODE_NONE;
_animationPlayer._objectMode = ANIMOBJMODE_1;
R2_GLOBALS._scene180Mode = 4;
if (_animationPlayer.load(4)) {
_animationPlayer.dispatch();
R2_GLOBALS._scenePalette.addFader(_animationPlayer._subData._palData, 256, 8, this);
} else {
_sceneMode = 43;
setSceneDelay(1);
}
break;
case 41:
_helpEnabled = true;
_animationPlayer._isActive = true;
break;
case 42:
R2_GLOBALS._scene180Mode = 4;
R2_GLOBALS._paneRefreshFlag[0] = 3;
setSceneDelay(1);
break;
case 44:
loadScene(9997);
R2_GLOBALS._scenePalette.loadPalette(9997);
if (R2_GLOBALS._sceneManager._hasPalette)
R2_GLOBALS._scenePalette.refresh();
setSceneDelay(6);
break;
case 45:
_helpEnabled = true;
_stripManager.start(28, this);
break;
case 48:
_helpEnabled = true;
_animationPlayer._paletteMode = ANIMPALMODE_NONE;
_animationPlayer._isActive = true;
_animationPlayer._objectMode = ANIMOBJMODE_1;
R2_GLOBALS._scene180Mode = 15;
_animationPlayer.load(15, NULL);
R2_GLOBALS._sound1.play(9);
R2_GLOBALS._scenePalette.addFader(_animationPlayer._subData._palData, 256, 6, NULL);
break;
case 49:
R2_GLOBALS._scene180Mode = 15;
R2_GLOBALS._paneRefreshFlag[0] = 3;
_backSurface.fillRect(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 0);
R2_GLOBALS._screen.fillRect(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 0);
setSceneDelay(1);
break;
case 50:
R2_GLOBALS._scene180Mode = 0;
_helpEnabled = false;
// WORKAROUND: The original changed to scene 100 here, Quinn's Bedroom,
// but instead we're changing to the previously unused scene 50, which shows
// a closeup of Quinn in the floatation bed first
R2_GLOBALS._sceneManager.changeScene(50);
break;
default:
break;
}
}
void Scene180::setSceneDelay(int v) {
_frameInc = v;
_frameNumber = R2_GLOBALS._events.getFrameNumber();
}
void Scene180::process(Event &event) {
if ((event.eventType == EVENT_CUSTOM_ACTIONSTART) && (event.customType == kActionEscape)) {
event.handled = true;
if (_helpEnabled) {
if (R2_GLOBALS._scenePalette._listeners.size() == 0)
HelpDialog::show();
}
}
if (!event.handled)
SceneExt::process(event);
}
void Scene180::dispatch() {
if (_frameInc) {
uint32 gameFrame = R2_GLOBALS._events.getFrameNumber();
if (gameFrame >= (uint32)_frameNumber) {
_frameInc -= gameFrame - _frameNumber;
_frameNumber = gameFrame;
if (_frameInc <= 0) {
_frameInc = 0;
signal();
}
}
}
if (_animationPlayer._isActive) {
if (_animationPlayer.isCompleted()) {
_animationPlayer._isActive = false;
_animationPlayer.close();
_animationPlayer.remove();
signal();
} else {
_animationPlayer.dispatch();
}
}
Scene::dispatch();
}
void Scene180::restore() {
R2_GLOBALS._gfxColors.background = 0;
R2_GLOBALS._gfxColors.foreground = 0xff;
R2_GLOBALS._fontColors.background = 0;
R2_GLOBALS._fontColors.foreground = 0xff;
switch (R2_GLOBALS._scene180Mode) {
case 0:
R2_GLOBALS._events.setCursor(SHADECURSOR_HAND);
R2_GLOBALS._gfxColors.foreground = 4;
R2_GLOBALS._gfxColors.background = 3;
R2_GLOBALS._fontColors.background = 3;
R2_GLOBALS._frameEdgeColor = 3;
break;
case 1:
R2_GLOBALS._events.setCursor(R2_CURSOR_20);
R2_GLOBALS._gfxColors.foreground = 25;
R2_GLOBALS._gfxColors.background = 43;
R2_GLOBALS._fontColors.background = 48;
R2_GLOBALS._frameEdgeColor = 48;
break;
case 2:
R2_GLOBALS._events.setCursor(R2_CURSOR_21);
R2_GLOBALS._gfxColors.foreground = 106;
R2_GLOBALS._gfxColors.background = 136;
R2_GLOBALS._fontColors.background = 48;
R2_GLOBALS._fontColors.foreground = 253;
R2_GLOBALS._frameEdgeColor = 48;
break;
case 3:
R2_GLOBALS._events.setCursor(R2_CURSOR_22);
R2_GLOBALS._gfxColors.foreground = 84;
R2_GLOBALS._gfxColors.background = 118;
R2_GLOBALS._fontColors.background = 47;
R2_GLOBALS._frameEdgeColor = 48;
break;
case 14:
R2_GLOBALS._events.setCursor(R2_CURSOR_23);
R2_GLOBALS._fontColors.background = 38;
R2_GLOBALS._fontColors.foreground = 38;
R2_GLOBALS._gfxColors.foreground = 192;
R2_GLOBALS._gfxColors.background = 30;
R2_GLOBALS._frameEdgeColor = 48;
break;
default:
R2_GLOBALS._gfxColors.background = 0;
R2_GLOBALS._gfxColors.foreground = 59;
R2_GLOBALS._fontColors.background = 4;
R2_GLOBALS._fontColors.foreground = 15;
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
break;
}
}
/*--------------------------------------------------------------------------
* Scene 200 - Ship Corridor
*
*--------------------------------------------------------------------------*/
bool Scene200::NorthDoor::startAction(CursorType action, Event &event) {
if (action == CURSOR_USE) {
Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 202;
scene->setAction(&scene->_sequenceManager, scene, 202, &R2_GLOBALS._player, this, NULL);
return true;
} else {
return SceneActor::startAction(action, event);
}
}
bool Scene200::EastDoor::startAction(CursorType action, Event &event) {
if (action == CURSOR_USE) {
Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 200;
scene->setAction(&scene->_sequenceManager, scene, 200, &R2_GLOBALS._player, this, NULL);
return true;
} else {
return SceneActor::startAction(action, event);
}
}
bool Scene200::WestDoor::startAction(CursorType action, Event &event) {
if (action == CURSOR_USE) {
Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 204;
scene->setAction(&scene->_sequenceManager, scene, 204, &R2_GLOBALS._player, this, NULL);
return true;
} else {
return SceneActor::startAction(action, event);
}
}
/*--------------------------------------------------------------------------*/
void Scene200::EastExit::changeScene() {
Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene;
_enabled = false;
R2_GLOBALS._player.disableControl(CURSOR_WALK);
scene->_sceneMode = 206;
scene->setAction(&scene->_sequenceManager, scene, 206, &R2_GLOBALS._player, NULL);
}
void Scene200::WestExit::changeScene() {
Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene;
_enabled = false;
R2_GLOBALS._player.disableControl(CURSOR_WALK);
scene->_sceneMode = 208;
scene->setAction(&scene->_sequenceManager, scene, 208, &R2_GLOBALS._player, NULL);
}
/*--------------------------------------------------------------------------*/
void Scene200::postInit(SceneObjectList *OwnerList) {
loadScene(200);
SceneExt::postInit();
_westExit.setDetails(Rect(94, 0, 123, 58), EXITCURSOR_W, 175);
_westExit.setDest(Common::Point(125, 52));
_eastExit.setDetails(Rect(133, 0, 167, 58), EXITCURSOR_E, 150);
_eastExit.setDest(Common::Point(135, 52));
_northDoor.postInit();
_northDoor.setVisage(200);
_northDoor.setPosition(Common::Point(188, 79));
_northDoor.setDetails(200, 3, -1, -1, 1, (SceneItem *)NULL);
_eastDoor.postInit();
_eastDoor.setVisage(200);
_eastDoor.setStrip(2);
_eastDoor.setPosition(Common::Point(305, 124));
_eastDoor.setDetails(200, 6, -1, -1, 1, (SceneItem *)NULL);
_westDoor.postInit();
_westDoor.setVisage(200);
_westDoor.setStrip(3);
_westDoor.setPosition(Common::Point(62, 84));
_westDoor.setDetails(200, 9, -1, -1, 1, (SceneItem *)NULL);
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.setVisage(10);
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player.disableControl();
_compartment.setDetails(Rect(4, 88, 153, 167), 200, 12, -1, -1, 1, NULL);
_westDoorDisplay.setDetails(Rect(41, 51, 48, 61), 200, 15, -1, -1, 1, NULL);
_eastDoorDisplay.setDetails(Rect(279, 67, 286, 78), 200, 18, -1, -1, 1, NULL);
_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 200, 0, -1, -1, 1, NULL);
switch (R2_GLOBALS._sceneManager._previousScene) {
case 100:
_sceneMode = 201;
setAction(&_sequenceManager, this, 201, &R2_GLOBALS._player, &_eastDoor, NULL);
break;
case 150:
_sceneMode = 207;
setAction(&_sequenceManager, this, 207, &R2_GLOBALS._player, NULL);
break;
case 175:
_sceneMode = 209;
setAction(&_sequenceManager, this, 209, &R2_GLOBALS._player, NULL);
break;
case 250:
_sceneMode = 203;
setAction(&_sequenceManager, this, 203, &R2_GLOBALS._player, &_northDoor, NULL);
break;
case 400:
_sceneMode = 205;
setAction(&_sequenceManager, this, 205, &R2_GLOBALS._player, &_westDoor, NULL);
break;
default:
R2_GLOBALS._player.setStrip(3);
R2_GLOBALS._player.setPosition(Common::Point(215, 115));
R2_GLOBALS._player.enableControl();
break;
}
}
void Scene200::signal() {
switch (_sceneMode) {
case 200:
R2_GLOBALS._sceneManager.changeScene(100);
break;
case 202:
R2_GLOBALS._sceneManager.changeScene(250);
break;
case 204:
R2_GLOBALS._sceneManager.changeScene(400);
break;
case 206:
R2_GLOBALS._sceneManager.changeScene(150);
break;
case 208:
R2_GLOBALS._sceneManager.changeScene(175);
break;
default:
R2_GLOBALS._player.enableControl();
break;
}
}
/*--------------------------------------------------------------------------
* Scene 205 - Star-field Credits
*
*--------------------------------------------------------------------------*/
void Scene205::Action1::signal() {
Scene205 *scene = (Scene205 *)R2_GLOBALS._sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(2);
break;
case 1:
scene->_yp = 100 - (scene->_fontHeight * 3 / 2);
scene->handleText();
for (int idx = 1; idx <= 2; ++idx) {
++scene->_textIndex;
scene->_yp += scene->_fontHeight;
scene->handleText();
}
setDelay(240);
break;
case 2:
case 4:
case 6:
case 8:
case 10:
case 12:
case 14:
case 16:
case 18:
case 20:
textLoop();
setDelay(120);
break;
case 3:
scene->_textIndex = 1;
scene->_yp = 100 - ((scene->_fontHeight * 2) / 2);
scene->handleText();
++scene->_textIndex;
scene->_yp += scene->_fontHeight;
scene->handleText();
setDelay(240);
break;
case 5:
scene->_textIndex = 1;
scene->_yp = 100 - ((scene->_fontHeight * 7) / 2);
scene->handleText();
for (int idx = 1; idx <= 6; ++idx) {
++scene->_textIndex;
scene->_yp += scene->_fontHeight;
scene->handleText();
}
setDelay(480);
break;
case 7:
scene->_textIndex = 1;
scene->_yp = 100 - ((scene->_fontHeight * 6) / 2);
scene->handleText();
for (int idx = 1; idx <= 5; ++idx) {
++scene->_textIndex;
scene->_yp += scene->_fontHeight;
scene->handleText();
}
setDelay(300);
break;
case 9:
scene->_textIndex = 1;
scene->_yp = 100 - ((scene->_fontHeight * 8) / 2);
scene->handleText();
for (int idx = 1; idx <= 7; ++idx) {
++scene->_textIndex;
scene->_yp += scene->_fontHeight;
scene->handleText();
}
setDelay(480);
break;
case 11:
scene->_textIndex = 1;
scene->_yp = 100 - ((scene->_fontHeight * 3) / 2);
scene->handleText();
for (int idx = 1; idx <= 2; ++idx) {
++scene->_textIndex;
scene->_yp += scene->_fontHeight;
scene->handleText();
}
setDelay(240);
break;
case 13:
scene->_textIndex = 1;
scene->_yp = 100 - ((scene->_fontHeight * 3) / 2);
scene->handleText();
for (int idx = 1; idx <= 2; ++idx) {
++scene->_textIndex;
scene->_yp += scene->_fontHeight;
scene->handleText();
}
setDelay(240);
break;
case 15:
scene->_textIndex = 1;
scene->_yp = 100 - ((scene->_fontHeight * 5) / 2);
scene->handleText();
for (int idx = 1; idx <= 4; ++idx) {
++scene->_textIndex;
scene->_yp += scene->_fontHeight;
scene->handleText();
}
setDelay(240);
break;
case 17:
scene->_textIndex = 1;
scene->_yp = 100 - ((scene->_fontHeight * 5) / 2);
scene->handleText();
for (int idx = 1; idx <= 4; ++idx) {
++scene->_textIndex;
scene->_yp += scene->_fontHeight;
scene->handleText();
}
setDelay(360);
break;
case 19:
scene->_textIndex = 1;
scene->_yp = 100 - ((scene->_fontHeight * 3) / 2);
scene->handleText();
for (int idx = 1; idx <= 2; ++idx) {
++scene->_textIndex;
scene->_yp += scene->_fontHeight;
scene->handleText();
}
setDelay(480);
break;
case 21:
R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._sceneManager._previousScene);
default:
break;
}
}
void Scene205::Action1::textLoop() {
Scene205 *scene = (Scene205 *)R2_GLOBALS._sceneManager._scene;
for (int idx = 1; idx <= 14; ++idx) {
if (R2_GLOBALS._sceneObjects->contains(&scene->_textList[idx])) {
scene->_textList[idx].remove();
}
}
}
/*--------------------------------------------------------------------------*/
Scene205::Scene205(): SceneExt() {
_yp = 0;
_textIndex = 1;
_lineNum = -1;
GfxFont font;
font.setFontNumber(4);
_fontHeight = font.getHeight();
for (int i = 0; i < 3; i++) {
_starList1[i] = nullptr;
_starList2[i] = nullptr;
}
for (int i = 0; i < 4; i++)
_starList3[i] = nullptr;
}
void Scene205::postInit(SceneObjectList *OwnerList) {
loadScene(4000);
R2_GLOBALS._uiElements._active = false;
SceneExt::postInit();
R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
R2_GLOBALS._player._uiEnabled = false;
R2_GLOBALS._sound1.play(337);
R2_GLOBALS._scenePalette.loadPalette(0);
R2_GLOBALS._player.disableControl();
setup();
setAction(&_action1);
}
void Scene205::synchronize(Serializer &s) {
SceneExt::synchronize(s);
for (int idx = 0; idx < 3; ++idx)
SYNC_POINTER(_starList1[idx]);
for (int idx = 0; idx < 3; ++idx)
SYNC_POINTER(_starList2[idx]);
for (int idx = 0; idx < 4; ++idx)
SYNC_POINTER(_starList3[idx]);
s.syncAsSint16LE(_textIndex);
s.syncAsSint16LE(_lineNum);
s.syncAsSint16BE(_yp);
}
void Scene205::remove() {
R2_GLOBALS._sound1.fadeOut2(NULL);
SceneExt::remove();
}
void Scene205::process(Event &event) {
if ((event.eventType == EVENT_CUSTOM_ACTIONSTART) && (event.customType == kActionEscape)) {
event.handled = true;
R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._sceneManager._previousScene);
} else {
Scene::process(event);
}
}
void Scene205::dispatch() {
processList(_starList3, 4, Common::Rect(0, 0, 319, 200), 1, 1, 160, 100);
processList(_starList2, 3, Common::Rect(0, 0, 319, 200), 2, 2, 160, 100);
processList(_starList1, 3, Common::Rect(0, 0, 319, 200), 4, 3, 160, 100);
Scene::dispatch();
}
void Scene205::setup() {
const Common::Point pointList1[3] = { Common::Point(2, 50), Common::Point(100, 28), Common::Point(53, 15) };
const Common::Point pointList2[3] = { Common::Point(289, 192), Common::Point(125, 60), Common::Point(130, 40) };
const Common::Point pointList3[4] = {
Common::Point(140, 149), Common::Point(91, 166), Common::Point(299, 46), Common::Point(314, 10)
};
// Set up the first star list
for (int idx = 0; idx < 3; ++idx) {
Star *obj = new Star();
_starList1[idx] = obj;
obj->postInit();
obj->_flags |= OBJFLAG_CLONED;
obj->setVisage(205);
obj->_strip = 1;
obj->_frame = 1;
obj->setPosition(pointList1[idx]);
obj->_x100 = obj->_position.x * 100;
obj->_y100 = obj->_position.y * 100;
obj->fixPriority(12);
}
// Setup the second star list
for (int idx = 0; idx < 3; ++idx) {
Star *obj = new Star();
_starList2[idx] = obj;
obj->postInit();
obj->_flags |= OBJFLAG_CLONED;
obj->setVisage(205);
obj->_strip = 1;
obj->_frame = 2;
obj->setPosition(pointList2[idx]);
obj->_x100 = obj->_position.x * 100;
obj->_y100 = obj->_position.y * 100;
obj->fixPriority(11);
}
// Setup the third star list
for (int idx = 0; idx < 4; ++idx) {
Star *obj = new Star();
_starList3[idx] = obj;
obj->postInit();
obj->_flags |= OBJFLAG_CLONED;
obj->setVisage(205);
obj->_strip = 1;
obj->_frame = 3;
obj->setPosition(pointList3[idx]);
obj->_x100 = obj->_position.x * 100;
obj->_y100 = obj->_position.y * 100;
obj->fixPriority(10);
}
}
/**
* Handles moving a group of stars in the scene background
*/
void Scene205::processList(Star **ObjList, int count, const Common::Rect &bounds,
int xMultiply, int yMultiply, int xCenter, int yCenter) {
for (int idx = 0; idx < count; ++idx) {
Star *obj = ObjList[idx];
Common::Point pt(obj->_position.x - xCenter, obj->_position.y - yCenter);
if ((obj->_position.x <= 319) && (obj->_position.x >= 0) &&
(obj->_position.y <= 199) && (obj->_position.y >= 0)) {
if (!pt.x && !pt.y) {
pt.x = pt.y = 1;
}
pt.x *= xMultiply;
pt.y *= yMultiply;
obj->_x100 += pt.x;
obj->_y100 += pt.y;
} else {
obj->_x100 = (bounds.left + R2_GLOBALS._randomSource.getRandomNumber(bounds.right)) * 100;
obj->_y100 = (bounds.top + R2_GLOBALS._randomSource.getRandomNumber(bounds.bottom)) * 100;
}
obj->setPosition(Common::Point(obj->_x100 / 100, obj->_y100 / 100));
}
}
void Scene205::handleText() {
_message = g_resourceManager->getMessage(205, ++_lineNum);
_textList[_textIndex]._fontNumber = 4;
_textList[_textIndex]._color1 = 0;
_textList[_textIndex]._color2 = 10;
_textList[_textIndex]._color3 = 7;
_textList[_textIndex]._width = 400;
_textList[_textIndex].setup(_message);
_textList[_textIndex].fixPriority(199);
GfxFont font;
font.setFontNumber(4);
int width = font.getStringWidth(_message.c_str());
_textList[_textIndex].setPosition(Common::Point(160 - (width / 2), _yp));
}
/*--------------------------------------------------------------------------
* Scene 205 Demo - End of Demo
*
*--------------------------------------------------------------------------*/
void Scene205Demo::Action1::signal() {
Scene205Demo *scene = (Scene205Demo *)R2_GLOBALS._sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(2);
break;
case 1:
MessageDialog::show2(BUY_FULL_GAME_MSG, OK_BTN_STRING);
setDelay(1);
break;
case 2:
scene->leaveScene();
break;
default:
break;
}
}
/*--------------------------------------------------------------------------*/
void Scene205Demo::leaveScene() {
if (g_globals->getFlag(85))
R2_GLOBALS._sceneManager.changeScene(160);
else
R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._sceneManager._previousScene);
BF_GLOBALS._scenePalette.loadPalette(0);
BF_GLOBALS._scenePalette.refresh();
}
void Scene205Demo::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._sceneManager._hasPalette = true;
R2_GLOBALS._scenePalette.loadPalette(0);
loadScene(1000);
R2_GLOBALS._uiElements._active = false;
R2_GLOBALS._player.enableControl();
SceneExt::postInit();
_sound1.play(337);
_stripManager.addSpeaker(&_animationPlayer);
setAction(&_action1);
}
void Scene205Demo::remove() {
R2_GLOBALS._sound1.fadeOut2(NULL);
SceneExt::remove();
}
void Scene205Demo::process(Event &event) {
if ((event.eventType == EVENT_CUSTOM_ACTIONSTART) && (event.customType == kActionEscape)) {
event.handled = true;
leaveScene();
} else {
Scene::process(event);
}
}
/*--------------------------------------------------------------------------
* Scene 250 - Lift
*
*--------------------------------------------------------------------------*/
Scene250::Button::Button(): SceneActor() {
_floorNumber = 0;
}
void Scene250::Button::synchronize(Serializer &s) {
SceneActor::synchronize(s);
s.syncAsSint16LE(_floorNumber);
}
bool Scene250::Button::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE: {
Scene250 *scene = (Scene250 *)R2_GLOBALS._sceneManager._scene;
if (scene->_destButtonY) {
SceneItem::display2(250, 15);
} else {
switch (_floorNumber) {
case 1:
case 2:
case 5:
case 9:
scene->_sound1.play(14);
scene->changeFloor(_floorNumber);
break;
case 10:
// Current Floor
scene->_sound1.play(14);
R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._sceneManager._previousScene);
break;
default:
SceneItem::display2(250, 16);
break;
}
}
return true;
}
case CURSOR_LOOK:
switch (_floorNumber) {
case 1:
case 2:
case 5:
case 9:
SceneItem::display2(250, 12);
break;
case 10:
SceneItem::display2(250, 13);
break;
case 11:
SceneItem::display2(250, 14);
break;
default:
SceneItem::display2(250, 16);
break;
}
return true;
default:
return SceneActor::startAction(action, event);
}
}
void Scene250::Button::setFloor(int floorNumber) {
SceneActor::postInit();
_floorNumber = floorNumber;
if (_floorNumber <= 9) {
SceneObject::setup(250, 1, 4);
switch (_floorNumber) {
case 1:
case 2:
case 5:
case 9:
setFrame(6);
break;
default:
break;
}
setPosition(Common::Point(111, (_floorNumber - 1) * 12 + 43));
fixPriority(10);
setDetails(250, -1, -1, -1, 1, (SceneItem *)NULL);
}
}
/*--------------------------------------------------------------------------*/
Scene250::Scene250(): SceneExt() {
_currButtonY = _destButtonY = _elevatorSpeed = 0;
_skippingFl = _skippableFl = false;
}
void Scene250::synchronize(Serializer &s) {
SceneExt::synchronize(s);
s.syncAsSint16LE(_currButtonY);
s.syncAsSint16LE(_destButtonY);
s.syncAsSint16LE(_elevatorSpeed);
s.syncAsSint16LE(_skippableFl);
s.syncAsSint16LE(_skippingFl);
}
void Scene250::postInit(SceneObjectList *OwnerList) {
loadScene(250);
R2_GLOBALS._uiElements._active = false;
SceneExt::postInit();
R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.setVisage(10);
R2_GLOBALS._player.hide();
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
_currentFloor.setFloor(10);
_currentFloor.setup(250, 1, 5);
_currentFloor.setDetails(250, 13, -1, -1, 1, (SceneItem *)NULL);
_destinationFloor.setFloor(11);
_destinationFloor.setup(250, 1, 3);
_destinationFloor.setPosition(Common::Point(400, 100));
_destinationFloor.setDetails(250, 14, -1, -1, 1, (SceneItem *)NULL);
_destinationFloor.fixPriority(190);
_destinationFloor.hide();
_floor1.setFloor(1);
_floor2.setFloor(2);
_floor3.setFloor(3);
_floor4.setFloor(4);
_floor5.setFloor(5);
_floor6.setFloor(6);
_floor7.setFloor(7);
_floor8.setFloor(8);
_floor9.setFloor(9);
_door.setDetails(Rect(0, 0, 73, SCREEN_HEIGHT), 250, 9, -1, 9, 1, NULL);
_directionIndicator.setDetails(Rect(239, 16, 283, 164), 250, 6, -1, -1, 1, NULL);
_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 250, 0, 1, -1, 1, NULL);
R2_GLOBALS._events.setCursor(CURSOR_USE);
switch (R2_GLOBALS._sceneManager._previousScene) {
case 200:
_currButtonY = 55;
break;
case 300:
_currButtonY = 43;
break;
case 700:
_currButtonY = 139;
break;
case 850:
_currButtonY = 91;
break;
default:
R2_GLOBALS._sceneManager._previousScene = 200;
_currButtonY = 55;
break;
}
_currentFloor.setPosition(Common::Point(111, _currButtonY));
}
void Scene250::signal() {
if (_skippingFl)
_sceneMode = 20;
switch (_sceneMode) {
case 1:
_sound1.play(22);
R2_GLOBALS._player.show();
R2_GLOBALS._player.setup(250, 1, 2);
R2_GLOBALS._player.setPosition(Common::Point(261, 185));
ADD_MOVER(R2_GLOBALS._player, 261, 15);
_elevatorSpeed = 0;
_sceneMode = 2;
break;
case 2:
if (_destButtonY - 12 == _currButtonY)
_sceneMode = 4;
else
_sceneMode = 3;
signal();
break;
case 3:
_currentFloor.setPosition(Common::Point(111, _currentFloor._position.y + 12));
_currButtonY += 12;
R2_GLOBALS._player.setPosition(Common::Point(261, 185));
ADD_MOVER(R2_GLOBALS._player, 261, 15);
if ((_destButtonY - 12) == _currButtonY)
_sceneMode = 4;
break;
case 4:
_sound1.play(21);
_currentFloor.setPosition(Common::Point(111, _currentFloor._position.y + 12));
R2_GLOBALS._player.setPosition(Common::Point(261, 185));
ADD_MOVER(R2_GLOBALS._player, 261, 15);
_sceneMode = 5;
break;
case 5:
R2_GLOBALS._player.disableControl();
_sceneMode = 20;
signal();
break;
case 6:
_sound1.play(22);
R2_GLOBALS._player.show();
R2_GLOBALS._player.setup(250, 1, 2);
R2_GLOBALS._player.setPosition(Common::Point(261, 15));
ADD_MOVER(R2_GLOBALS._player, 261, 185);
_elevatorSpeed = 0;
_sceneMode = 7;
break;
case 7:
_skippableFl = true;
if ((_destButtonY + 12) == _currButtonY)
_sceneMode = 9;
else
_sceneMode = 8;
signal();
break;
case 8:
_currentFloor.setPosition(Common::Point(111, _currentFloor._position.y - 12));
_currButtonY -= 12;
R2_GLOBALS._player.setPosition(Common::Point(261, 15));
ADD_MOVER(R2_GLOBALS._player, 261, 185);
if ((_destButtonY + 12) == _currButtonY)
_sceneMode = 9;
break;
case 9:
_sound1.play(21);
_currentFloor.setPosition(Common::Point(111, _currentFloor._position.y - 12));
R2_GLOBALS._player.setPosition(Common::Point(261, 15));
ADD_MOVER(R2_GLOBALS._player, 261, 185);
_sceneMode = 10;
break;
case 10:
_sceneMode = 20;
signal();
break;
case 20:
// Handle changing scene
switch (_destButtonY) {
case 55:
R2_GLOBALS._sceneManager.changeScene(200);
break;
case 43:
R2_GLOBALS._sceneManager.changeScene(300);
break;
case 139:
R2_GLOBALS._sceneManager.changeScene(700);
break;
case 91:
R2_GLOBALS._sceneManager.changeScene(850);
break;
default:
break;
}
break;
default:
break;
}
}
void Scene250::changeFloor(int floorNumber) {
_destButtonY = (floorNumber - 1) * 12 + 43;
_destinationFloor.setPosition(Common::Point(111, _destButtonY));
_destinationFloor.show();
_skippableFl = true;
_sceneMode = (_currButtonY >= _destButtonY) ? 6 : 1;
if (_destButtonY == _currButtonY)
_sceneMode = 20;
signal();
}
void Scene250::process(Event &event) {
if (!event.handled) {
if (((event.eventType == EVENT_KEYPRESS) || (event.btnState == BTNSHIFT_RIGHT)) && _skippableFl) {
_skippingFl = true;
event.handled = true;
}
SceneExt::process(event);
}
}
void Scene250::dispatch() {
SceneExt::dispatch();
if (((_sceneMode == 2) || (_sceneMode == 7)) && (_elevatorSpeed < 100)) {
++_elevatorSpeed;
R2_GLOBALS._player._moveDiff.y = _elevatorSpeed / 5;
}
if (((_sceneMode == 5) || (_sceneMode == 10)) && (R2_GLOBALS._player._moveDiff.y > 4)) {
--_elevatorSpeed;
R2_GLOBALS._player._moveDiff.y = (_elevatorSpeed / 7) + 3;
}
}
/*--------------------------------------------------------------------------
* Scene 300 - Bridge
*
*--------------------------------------------------------------------------*/
void Scene300::Action1::signal() {
Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
switch (_actionIndex) {
case 0:
setAction(&scene->_sequenceManager2, this, 311, (R2_GLOBALS._player._characterIndex == R2_QUINN) ?
(SceneObject *)&R2_GLOBALS._player : (SceneObject *)&scene->_quinn);
_actionIndex = 2;
break;
case 1:
setAction(&scene->_sequenceManager2, this, 312, (R2_GLOBALS._player._characterIndex == R2_QUINN) ?
(SceneObject *)&R2_GLOBALS._player : (SceneObject *)&scene->_quinn);
_actionIndex = 0;
break;
case 2:
if (!R2_GLOBALS._playStream.isPlaying())
_actionIndex = R2_GLOBALS._randomSource.getRandomNumber(1);
break;
default:
break;
}
}
void Scene300::Action2::signal() {
Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
switch (_actionIndex) {
case 0:
setAction(&scene->_sequenceManager3, this, 302, &scene->_seeker, NULL);
_actionIndex = 2;
break;
case 1:
setAction(&scene->_sequenceManager3, this, 303, &scene->_seeker, NULL);
_actionIndex = 2;
break;
case 2:
if (!R2_GLOBALS._playStream.isPlaying())
_actionIndex = R2_GLOBALS._randomSource.getRandomNumber(1);
setDelay(60 + R2_GLOBALS._randomSource.getRandomNumber(119));
break;
default:
break;
}
}
void Scene300::Action3::signal() {
Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
switch (_actionIndex) {
case 0:
setAction(&scene->_sequenceManager3, this, 304, &scene->_miranda, NULL);
_actionIndex = 2;
break;
case 1:
setAction(&scene->_sequenceManager3, this, 305, &scene->_miranda, NULL);
_actionIndex = 2;
break;
case 2:
if (!R2_GLOBALS._playStream.isPlaying())
_actionIndex = R2_GLOBALS._randomSource.getRandomNumber(1);
setDelay(60 + R2_GLOBALS._randomSource.getRandomNumber(119));
break;
default:
break;
}
}
void Scene300::Action4::signal() {
if (!R2_GLOBALS._playStream.isPlaying()) {
Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
scene->_mirandaScreen.setStrip2(R2_GLOBALS._randomSource.getRandomNumber(2));
scene->_mirandaScreen.setFrame(1);
scene->_quinnScreen.setStrip2(3);
scene->_quinnScreen.setFrame(1);
}
setDelay(60 + R2_GLOBALS._randomSource.getRandomNumber(479));
}
/*--------------------------------------------------------------------------*/
bool Scene300::QuinnWorkstation::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE:
if (R2_GLOBALS._player._characterIndex != R2_QUINN)
SceneItem::display2(300, 46);
else if (R2_GLOBALS.getFlag(44)) {
R2_GLOBALS._player.setAction(NULL);
R2_GLOBALS._sceneManager.changeScene(325);
} else {
Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 306;
scene->setAction(&scene->_sequenceManager1, scene, 306, &R2_GLOBALS._player, NULL);
}
return true;
case CURSOR_LOOK:
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
SceneItem::display2(300, 47);
return true;
}
break;
default:
break;
}
return NamedHotspot::startAction(action, event);
}
bool Scene300::MirandaWorkstation::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE:
if (R2_GLOBALS._player._characterIndex != R2_MIRANDA)
SceneItem::display2(300, 49);
else
R2_GLOBALS._sceneManager.changeScene(325);
return true;
case CURSOR_LOOK:
if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) {
SceneItem::display2(300, 47);
return true;
}
break;
default:
break;
}
return NamedHotspot::startAction(action, event);
}
bool Scene300::SeekerWorkstation::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_LOOK:
if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
SceneItem::display2(300, 47);
return true;
}
break;
case CURSOR_USE:
if (R2_GLOBALS._player._characterIndex != R2_SEEKER)
SceneItem::display2(300, 48);
else
R2_GLOBALS._sceneManager.changeScene(325);
return true;
default:
break;
}
return NamedHotspot::startAction(action, event);
}
/*--------------------------------------------------------------------------*/
bool Scene300::Miranda::startAction(CursorType action, Event &event) {
Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_TALK:
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
// Quinn talking to Miranda
R2_GLOBALS._player.disableControl();
if (!R2_GLOBALS.getFlag(44)) {
if (R2_GLOBALS.getFlag(40))
scene->_stripId = 119;
else if (R2_GLOBALS.getFlag(38))
scene->_stripId = 101;
else {
R2_GLOBALS._sound1.play(69);
scene->_stripId = 100;
}
scene->_sceneMode = 309;
scene->setAction(&scene->_sequenceManager1, scene, 309, &R2_GLOBALS._player, NULL);
} else if (!R2_GLOBALS.getFlag(55)) {
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
scene->_sceneMode = 10;
scene->_stripManager.start3(201, scene, R2_GLOBALS._stripManager_lookupList);
} else {
scene->_sceneMode = 16;
if (!R2_GLOBALS.getFlag(57)) {
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
scene->_stripManager.start3(434, scene, R2_GLOBALS._stripManager_lookupList);
} else if (R2_GLOBALS._player._characterScene[R2_SEEKER] != 500) {
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
scene->_stripManager.start3(407, scene, R2_GLOBALS._stripManager_lookupList);
} else {
scene->_stripId = 433;
scene->_sceneMode = 309;
scene->setAction(&scene->_sequenceManager1, scene, 309, &R2_GLOBALS._player, NULL);
}
}
} else {
// Seeker talking to Miranda
scene->_sceneMode = 10;
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
if (!R2_GLOBALS.getFlag(44))
scene->_stripId = 174 + R2_GLOBALS._randomSource.getRandomNumber(2);
else if (!R2_GLOBALS.getFlag(55))
scene->_stripId = 211;
else
scene->_stripId = 438;
scene->_stripManager.start3(scene->_stripId, scene, R2_GLOBALS._stripManager_lookupList);
}
return true;
case R2_OPTO_DISK:
SceneItem::display2(300, 54);
return true;
case R2_READER:
if (!R2_GLOBALS.getFlag(2) || !R2_GLOBALS.getFlag(3) || (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 1))
SceneItem::display2(300, 55);
else {
R2_GLOBALS._player.disableControl();
scene->_stripId = R2_GLOBALS.getFlag(4) ? 121 : 120;
scene->_sceneMode = 309;
scene->setAction(&scene->_sequenceManager1, scene, 309, &R2_GLOBALS._player, NULL);
}
return true;
default:
break;
}
return SceneActor::startAction(action, event);
}
bool Scene300::Seeker::startAction(CursorType action, Event &event) {
Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_TALK:
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
if (!R2_GLOBALS.getFlag(44)) {
if (!R2_GLOBALS.getFlag(38)) {
R2_GLOBALS._sound1.play(69);
scene->_stripId = 181;
scene->_sceneMode = 310;
scene->setAction(&scene->_sequenceManager1, scene, 309, &R2_GLOBALS._player, NULL);
} else {
scene->_stripId = R2_GLOBALS.getFlag(40) ? 170 : 150;
scene->_sceneMode = 310;
scene->setAction(&scene->_sequenceManager1, scene, 309, &R2_GLOBALS._player, NULL);
}
} else {
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
if (!R2_GLOBALS.getFlag(55)) {
scene->_sceneMode = 10;
scene->_stripManager.start3(205, scene, R2_GLOBALS._stripManager_lookupList);
} else {
scene->_sceneMode = 16;
scene->_stripManager.start3(R2_GLOBALS.getFlag(57) ? 407 : 401, scene, R2_GLOBALS._stripManager_lookupList);
}
}
} else {
scene->_sceneMode = 10;
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
if (!R2_GLOBALS.getFlag(44))
scene->_stripId = 122 + R2_GLOBALS._randomSource.getRandomNumber(2);
else if (!R2_GLOBALS.getFlag(55))
scene->_stripId = 209;
else
scene->_stripId = 440;
scene->_stripManager.start3(scene->_stripId, scene, R2_GLOBALS._stripManager_lookupList);
}
return true;
case R2_OPTO_DISK:
if (R2_GLOBALS.getFlag(13)) {
SceneItem::display2(300, 53);
} else {
R2_GLOBALS._player.disableControl();
scene->_stripId = 171;
scene->_sceneMode = 310;
scene->setAction(&scene->_sequenceManager1, scene, 310, &R2_GLOBALS._player, NULL);
}
return true;
case R2_READER:
if (!R2_GLOBALS.getFlag(2) || !R2_GLOBALS.getFlag(3) || (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 1))
break;
R2_GLOBALS._player.disableControl();
scene->_stripId = R2_GLOBALS.getFlag(4) ? 173 : 172;
scene->_sceneMode = 310;
scene->setAction(&scene->_sequenceManager1, scene, 310, &R2_GLOBALS._player, NULL);
return true;
default:
break;
}
return SceneActor::startAction(action, event);
}
bool Scene300::Quinn::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_TALK: {
Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
scene->_sceneMode = 10;
if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) {
if (R2_GLOBALS._player._characterScene[R2_MIRANDA] == 500)
scene->_stripId = 442;
else if (!R2_GLOBALS.getFlag(44))
scene->_stripId = 125 + R2_GLOBALS._randomSource.getRandomNumber(2);
else if (!R2_GLOBALS.getFlag(55))
scene->_stripId = 439;
else
scene->_stripId = 210;
} else if (R2_GLOBALS.getFlag(44)) {
scene->_stripId = R2_GLOBALS.getFlag(55) ? 439 : 210;
} else {
scene->_stripId = 177 + R2_GLOBALS._randomSource.getRandomNumber(2);
}
scene->_stripManager.start3(scene->_stripId, scene, R2_GLOBALS._stripManager_lookupList);
return true;
}
default:
return SceneActor::startAction(action, event);
}
}
bool Scene300::Doorway::startAction(CursorType action, Event &event) {
if (action == CURSOR_USE) {
if ((R2_GLOBALS._player._characterIndex == R2_QUINN) &&
(!R2_GLOBALS.getFlag(44) || R2_GLOBALS._player._characterScene[R2_SEEKER] == 500)) {
Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 301;
scene->setAction(&scene->_sequenceManager1, scene, 301, &R2_GLOBALS._player, this, NULL);
} else {
SceneItem::display2(300, 45);
}
return true;
} else {
return SceneActor::startAction(action, event);
}
}
/*--------------------------------------------------------------------------*/
Scene300::Scene300(): SceneExt() {
_stripId = 0;
_rotation = NULL;
_stripManager.setColors(60, 255);
_stripManager.setFontNumber(3);
}
void Scene300::synchronize(Serializer &s) {
SceneExt::synchronize(s);
s.syncAsSint16LE(_stripId);
SYNC_POINTER(_rotation);
}
void Scene300::postInit(SceneObjectList *OwnerList) {
loadScene(300);
SceneExt::postInit();
_sound1.play(23);
setZoomPercents(75, 93, 120, 100);
if (R2_GLOBALS._sceneManager._previousScene == -1) {
R2_GLOBALS._sceneManager._previousScene = 1000;
R2_GLOBALS._player._characterIndex = R2_QUINN;
}
_stripManager.addSpeaker(&_mirandaSpeaker);
_stripManager.addSpeaker(&_seekerSpeaker);
_stripManager.addSpeaker(&_quinnSpeaker);
_stripManager.addSpeaker(&_quinnLSpeaker);
_stripManager.addSpeaker(&_seekerLSpeaker);
_stripManager.addSpeaker(&_tealSpeaker);
_stripManager.addSpeaker(&_soldierSpeaker);
_rotation = R2_GLOBALS._scenePalette.addRotation(237, 254, -1);
_rotation->setDelay(3);
_rotation->_countdown = 1;
if (R2_GLOBALS.getFlag(51) && !R2_GLOBALS.getFlag(25)) {
_atmosphereLeftWindow.postInit();
_atmosphereLeftWindow.setup(301, 7, 2);
_atmosphereLeftWindow.setPosition(Common::Point(65, 24));
_atmosphereRightWindow.postInit();
_atmosphereRightWindow.setup(301, 8, 2);
_atmosphereRightWindow.setPosition(Common::Point(254, 24));
}
_doorway.postInit();
_doorway.setVisage(300);
_doorway.setPosition(Common::Point(159, 79));
_leftVerticalBarsAnim.postInit();
_leftVerticalBarsAnim.setup(300, 4, 1);
_leftVerticalBarsAnim.setPosition(Common::Point(84, 48));
_leftVerticalBarsAnim.animate(ANIM_MODE_2, NULL);
_leftVerticalBarsAnim._numFrames = 5;
_rightVerticalBarsAnim.postInit();
_rightVerticalBarsAnim.setup(300, 5, 1);
_rightVerticalBarsAnim.setPosition(Common::Point(236, 48));
_rightVerticalBarsAnim.animate(ANIM_MODE_2, NULL);
_protocolDisplay.postInit();
_protocolDisplay.setup(300, 6, 1);
_protocolDisplay.setPosition(Common::Point(287, 71));
_protocolDisplay.animate(ANIM_MODE_7, 0, NULL);
_protocolDisplay._numFrames = 5;
_rightTextDisplay.postInit();
_rightTextDisplay.setup(300, 7, 1);
_rightTextDisplay.setPosition(Common::Point(214, 37));
_rightTextDisplay.animate(ANIM_MODE_2, NULL);
_rightTextDisplay._numFrames = 3;
_mirandaScreen.postInit();
_mirandaScreen.setup(301, 1, 1);
_mirandaScreen.setPosition(Common::Point(39, 97));
_mirandaScreen.fixPriority(124);
_mirandaScreen.animate(ANIM_MODE_2, NULL);
_mirandaScreen._numFrames = 5;
_mirandaScreen.setAction(&_action4);
_leftTextDisplay.postInit();
_leftTextDisplay.setup(300, 8, 1);
_leftTextDisplay.setPosition(Common::Point(105, 37));
_leftTextDisplay.animate(ANIM_MODE_2, NULL);
_leftTextDisplay._numFrames = 5;
_quinnScreen.postInit();
_quinnScreen.setup(301, 6, 1);
_quinnScreen.setPosition(Common::Point(274, 116));
_quinnScreen.fixPriority(143);
_quinnScreen.animate(ANIM_MODE_2, NULL);
_quinnScreen._numFrames = 5;
_quinnWorkstation1.setDetails(Rect(243, 148, 315, 167), 300, 30, 31, 32, 1, NULL);
_mirandaWorkstation1.setDetails(Rect(4, 128, 69, 167), 300, 33, 31, 35, 1, NULL);
switch (R2_GLOBALS._player._characterIndex) {
case R2_QUINN:
_miranda.postInit();
_miranda.setup(302, 2, 1);
_miranda.setPosition(Common::Point(47, 128));
_miranda.setAction(&_action3);
_miranda.setDetails(300, 39, 40, 41, 1, (SceneItem *)NULL);
if ((R2_GLOBALS._player._characterScene[R2_SEEKER] == 300) || (R2_GLOBALS._player._characterScene[R2_SEEKER] == 325)) {
_seeker.postInit();
_seeker.setVisage(302);
_seeker.setPosition(Common::Point(158, 108));
_seeker.fixPriority(130);
_seeker.setAction(&_action2);
_seeker.setDetails(300, 42, 43, 44, 1, (SceneItem *)NULL);
}
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.setVisage(10);
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player.disableControl();
break;
case R2_SEEKER:
_miranda.postInit();
_miranda.setup(302, 2, 1);
_miranda.setPosition(Common::Point(47, 128));
_miranda.setAction(&_action3);
_miranda.setDetails(300, 39, 40, 41, 1, (SceneItem *)NULL);
if ((R2_GLOBALS._player._characterScene[R2_QUINN] == 300) || (R2_GLOBALS._player._characterScene[R2_QUINN] == 325)) {
_quinn.postInit();
_quinn.setup(302, 3, 1);
_quinn.setPosition(Common::Point(271, 150));
_quinn.setAction(&_action1);
_quinn.setDetails(300, 50, 51, 52, 1, (SceneItem *)NULL);
}
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.setup(302, 1, 3);
R2_GLOBALS._player.setPosition(Common::Point(158, 108));
R2_GLOBALS._player.fixPriority(130);
R2_GLOBALS._player.enableControl(CURSOR_USE);
R2_GLOBALS._player._canWalk = false;
break;
case R2_MIRANDA:
if ((R2_GLOBALS._player._characterScene[R2_SEEKER] == 300) || (R2_GLOBALS._player._characterScene[R2_SEEKER] == 325)) {
_seeker.postInit();
_seeker.setVisage(302);
_seeker.setPosition(Common::Point(158, 108));
_seeker.fixPriority(130);
_seeker.setAction(&_action2);
_seeker.setDetails(300, 42, 43, 44, 1, (SceneItem *)NULL);
}
if ((R2_GLOBALS._player._characterScene[R2_QUINN] == 300) || (R2_GLOBALS._player._characterScene[R2_QUINN] == 325)) {
_quinn.postInit();
_quinn.setup(302, 3, 1);
_quinn.setPosition(Common::Point(271, 150));
_quinn.setAction(&_action1);
_quinn.setDetails(300, 50, 51, 52, 1, (SceneItem *)NULL);
}
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.setup(302, 2, 1);
R2_GLOBALS._player.setPosition(Common::Point(47, 128));
R2_GLOBALS._player.enableControl(CURSOR_USE);
R2_GLOBALS._player._canWalk = false;
break;
default:
break;
}
_seekerWorkstation.setDetails(Rect(101, 95, 217, 143), 300, 36, 31, 35, 1, NULL);
_quinnWorkstation2.setDetails(Rect(224, 102, 315, 143), 300, 30, 31, 32, 1, NULL);
_mirandaWorkstation2.setDetails(Rect(4, 83, 84, 124), 300, 33, 31, 35, 1, NULL);
_hull.setDetails(11, 300, 6, -1, -1);
_statusDisplays.setDetails(12, 300, 9, 10, -1);
_damageControl.setDetails(13, 300, 12, -1, -1);
_manualOverrides.setDetails(14, 300, 15, -1, 17);
_scanners1.setDetails(Rect(126, 15, 183, 25), 300, 18, -1, 20, 1, NULL);
_scanners2.setDetails(Rect(126, 80, 183, 90), 300, 18, -1, 20, 1, NULL);
_protocolDisplay.setDetails(300, 27, -1, 29, 1, (SceneItem *)NULL);
_indirectLighting1.setDetails(Rect(74, 71, 122, 89), 300, 21, -1, -1, 1, NULL);
_indirectLighting2.setDetails(Rect(197, 71, 245, 89), 300, 21, -1, -1, 1, NULL);
_lighting.setDetails(Rect(129, 3, 190, 14), 300, 24, -1, -1, 1, NULL);
_doorway.setDetails(300, 3, -1, 5, 1, (SceneItem *)NULL);
_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 300, 0, -1, -1, 1, NULL);
switch (R2_GLOBALS._player._characterIndex) {
case R2_QUINN:
_sceneMode = 300;
switch (R2_GLOBALS._sceneManager._previousScene) {
case 250:
setAction(&_sequenceManager1, this, 300, &R2_GLOBALS._player, &_doorway, NULL);
break;
case 325:
if (!R2_GLOBALS.getFlag(44) || R2_GLOBALS.getFlag(25))
setAction(&_sequenceManager1, this, 307, &R2_GLOBALS._player, NULL);
else {
R2_GLOBALS.setFlag(60);
R2_GLOBALS._player.setup(302, 3, 1);
R2_GLOBALS._player.setPosition(Common::Point(271, 150));
R2_GLOBALS._player.setAction(&_action1);
if (R2_GLOBALS.getFlag(55)) {
if (R2_GLOBALS.getFlag(57)) {
// Little hack to get the correct sentence order
R2_GLOBALS._stripManager_lookupList[8] = 2;
R2_GLOBALS.clearFlag(60);
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
_sceneMode = 16;
_stripManager.start3(404, this, R2_GLOBALS._stripManager_lookupList);
} else {
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
}
} else {
if (R2_GLOBALS.getFlag(45)) {
R2_GLOBALS.clearFlag(60);
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
_sceneMode = 12;
_stripManager.start3(204, this, R2_GLOBALS._stripManager_lookupList);
} else {
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
}
}
}
break;
case 1000:
R2_GLOBALS.setFlag(60);
R2_GLOBALS._player.setup(302, 3, 1);
R2_GLOBALS._player.setPosition(Common::Point(271, 150));
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
if (R2_GLOBALS.getFlag(51)) {
// Things don't seem right
_sceneMode = 13;
_stripManager.start3(300, this, R2_GLOBALS._stripManager_lookupList);
} else {
// Back in Ringworld space
_sceneMode = 11;
_stripManager.start3(200, this, R2_GLOBALS._stripManager_lookupList);
}
break;
case 1100:
R2_GLOBALS._player.setVisage(10);
R2_GLOBALS._player.setPosition(Common::Point(160, 95));
_stripId = 400;
_sceneMode = 309;
setAction(&_sequenceManager1, this, 309, &R2_GLOBALS._player, NULL);
break;
case 1500:
R2_GLOBALS.clearFlag(60);
R2_GLOBALS._player.setup(302, 3, 1);
R2_GLOBALS._player.setPosition(Common::Point(271, 150));
_sceneMode = 17;
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
_stripManager.start(413, this);
break;
default:
if (R2_GLOBALS.getFlag(60)) {
R2_GLOBALS._player.setup(302, 3, 1);
R2_GLOBALS._player.setPosition(Common::Point(271, 150));
R2_GLOBALS._player.setAction(&_action1);
R2_GLOBALS._player.enableControl(CURSOR_USE);
R2_GLOBALS._player._canWalk = false;
} else {
R2_GLOBALS._player.setStrip(3);
R2_GLOBALS._player.setPosition(Common::Point(200, 150));
R2_GLOBALS._player.enableControl();
}
break;
}
break;
case R2_MIRANDA:
if (R2_GLOBALS._sceneManager._previousScene == 1500) {
R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3150;
R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3150;
R2_GLOBALS._player._effect = EFFECT_NONE;
R2_GLOBALS._player.setAction(NULL);
R2_GLOBALS._player.disableControl();
_quinn.postInit();
_quinn.setVisage(10);
_quinn.setPosition(Common::Point(10, 10));
_quinn.hide();
_seeker.postInit();
_seeker.setVisage(20);
_seeker.setPosition(Common::Point(20, 20));
_seeker.hide();
_teal.postInit();
_soldier.postInit();
_object12.postInit();
R2_GLOBALS._sound1.play(107);
_sceneMode = 308;
setAction(&_sequenceManager1, this, 308, &R2_GLOBALS._player, &_teal, &_soldier, &_object12, &_doorway, NULL);
}
break;
default:
break;
}
}
void Scene300::remove() {
R2_GLOBALS._player.setAction(NULL);
SceneExt::remove();
}
void Scene300::signal() {
switch (_sceneMode) {
case 10:
switch (_stripManager._exitMode) {
case 1:
R2_GLOBALS._sound1.changeSound(10);
R2_GLOBALS.setFlag(38);
break;
case 2:
R2_GLOBALS.setFlag(3);
break;
case 3:
R2_GLOBALS.setFlag(4);
break;
case 4:
R2_GLOBALS.setFlag(13);
if (R2_GLOBALS._stripManager_lookupList[1] == 6)
R2_GLOBALS.setFlag(40);
break;
case 5:
if (R2_GLOBALS._stripManager_lookupList[0] == 6)
R2_GLOBALS.setFlag(40);
break;
case 6:
if (g_vm->getFeatures() & GF_DEMO) {
R2_GLOBALS.setFlag(85);
R2_GLOBALS._sceneManager.changeScene(205);
} else
R2_GLOBALS._sceneManager.changeScene(1000);
break;
default:
break;
}
_stripManager._currObj44Id = 0;
switch (_stripId) {
case 400:
R2_GLOBALS._player.disableControl();
_sceneMode = 15;
setAction(&_sequenceManager1, this, 306, &R2_GLOBALS._player, NULL);
break;
case 181:
R2_GLOBALS._player.setStrip(6);
// fall through
default:
R2_GLOBALS._player.enableControl(CURSOR_TALK);
if ((R2_GLOBALS._player._characterIndex != R2_QUINN) || R2_GLOBALS.getFlag(44))
R2_GLOBALS._player._canWalk = false;
break;
}
break;
case 11:
R2_GLOBALS.setFlag(44);
R2_GLOBALS._player.enableControl(CURSOR_USE);
break;
case 12:
R2_GLOBALS._player.setAction(NULL);
R2_GLOBALS._sceneManager.changeScene(1010);
break;
case 13:
R2_GLOBALS._player.disableControl();
_seeker.changeZoom(-1);
_sceneMode = 313;
_seeker.setAction(NULL);
setAction(&_sequenceManager1, this, 313, &R2_GLOBALS._player, &_seeker, NULL);
break;
case 14:
if (_seeker._action)
R2_GLOBALS._player.disableControl();
_sceneMode = 314;
break;
case 15:
R2_GLOBALS.setFlag(55);
R2_GLOBALS.setFlag(38);
R2_GLOBALS.setFlag(44);
R2_GLOBALS.setFlag(51);
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
_sceneMode = 16;
_stripManager.start3(401, this, R2_GLOBALS._stripManager_lookupList);
break;
case 16:
if (_stripManager._exitMode == 1) {
if (g_vm->getFeatures() & GF_DEMO) {
R2_GLOBALS._player.setAction(NULL);
R2_GLOBALS.setFlag(85);
R2_GLOBALS._sceneManager.changeScene(205);
} else {
R2_GLOBALS._player.setAction(NULL);
R2_GLOBALS._sceneManager.changeScene(1000);
}
} else {
R2_GLOBALS._player.setAction(&_action1);
R2_GLOBALS._player.enableControl(CURSOR_TALK);
}
break;
case 17:
R2_GLOBALS._player.disableControl();
_sceneMode = 316;
_seeker.changeZoom(-1);
_seeker.setAction(&_sequenceManager3, this, 316, &_seeker, &_doorway, NULL);
R2_GLOBALS._player.setAction(&_sequenceManager1, NULL, 307, &R2_GLOBALS._player, NULL);
break;
case 18:
R2_GLOBALS._player.disableControl();
_sceneMode = 317;
setAction(&_sequenceManager1, this, 317, &_teal, &_doorway, NULL);
break;
case 19:
R2_GLOBALS._player.disableControl();
_sceneMode = 318;
setAction(&_sequenceManager1, this, 318, &R2_GLOBALS._player, &_teal, &_soldier, &_object12, NULL);
break;
case 20:
R2_GLOBALS._player._characterIndex = R2_QUINN;
R2_GLOBALS._sceneManager.changeScene(1500);
break;
case 300:
case 307:
R2_GLOBALS._player.enableControl();
break;
case 301:
R2_GLOBALS._sceneManager.changeScene(250);
break;
case 306:
R2_GLOBALS._sceneManager.changeScene(325);
break;
case 308:
_sceneMode = 18;
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
_stripManager.start(418, this);
break;
case 310:
R2_GLOBALS._player.setStrip(5);
// fall through
case 309:
signal309();
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
R2_GLOBALS._events._currentCursor = CURSOR_ARROW;
_sceneMode = 10;
_stripManager.start3(_stripId, this, R2_GLOBALS._stripManager_lookupList);
break;
case 313:
_sceneMode = 14;
R2_GLOBALS._player._effect = EFFECT_NONE;
_seeker.setAction(&_sequenceManager3, this, 314, &_seeker, &_doorway, NULL);
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
_stripManager.start(301, this);
break;
case 314:
R2_GLOBALS._player.disableControl();
_sceneMode = 315;
R2_GLOBALS._player._effect = EFFECT_SHADED;
setAction(&_sequenceManager1, this, 315, &R2_GLOBALS._player, &_doorway, NULL);
break;
case 315:
R2_GLOBALS._sceneManager.changeScene(1100);
break;
case 316:
R2_GLOBALS._player._characterScene[R2_SEEKER] = 500;
_seeker.remove();
R2_GLOBALS._player.enableControl(CURSOR_WALK);
break;
case 317:
_sceneMode = 19;
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
_stripManager.start(419, this);
break;
case 318:
_sceneMode = 20;
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
_stripManager.start(420, this);
break;
default:
break;
}
}
void Scene300::signal309() {
// Sets up what conversation items will be available when to talking to the
// others on the Bridge, and will be set dependent on game flags
if (R2_GLOBALS.getFlag(2))
R2_GLOBALS._stripManager_lookupList[0] = (R2_INVENTORY.getObjectScene(R2_READER) == 1) ? 3 : 2;
if (R2_GLOBALS.getFlag(4))
R2_GLOBALS._stripManager_lookupList[0] = 4;
if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 1)
R2_GLOBALS._stripManager_lookupList[0] = 5;
if (R2_GLOBALS.getFlag(13)) {
R2_GLOBALS._stripManager_lookupList[0] = 6;
R2_GLOBALS._stripManager_lookupList[2] = 2;
}
if (R2_GLOBALS.getFlag(39))
R2_GLOBALS._stripManager_lookupList[1] = 2;
if (R2_GLOBALS.getFlag(5))
R2_GLOBALS._stripManager_lookupList[1] = 3;
if (R2_GLOBALS.getFlag(6))
R2_GLOBALS._stripManager_lookupList[1] = 4;
if (R2_GLOBALS.getFlag(8))
R2_GLOBALS._stripManager_lookupList[1] = 5;
if (R2_GLOBALS.getFlag(9)) {
R2_GLOBALS._stripManager_lookupList[1] = 6;
R2_GLOBALS._stripManager_lookupList[3] = 2;
}
if (R2_GLOBALS.getFlag(48))
R2_GLOBALS._stripManager_lookupList[4] = 2;
if (R2_GLOBALS.getFlag(49))
R2_GLOBALS._stripManager_lookupList[4] = 3;
}
/*--------------------------------------------------------------------------
* Scene 325 - Bridge Console
*
*--------------------------------------------------------------------------*/
const double ADJUST_FACTOR = 0.06419999999999999;
/*--------------------------------------------------------------------------*/
Scene325::Icon::Icon(): SceneActor() {
_lookLineNum = 0;
_iconId = 0;
_pressed = false;
}
void Scene325::Icon::postInit(SceneObjectList *OwnerList) {
SceneObject::postInit();
_glyph.postInit();
_glyph.fixPriority(21);
_glyph.hide();
_sceneText1._color1 = 92;
_sceneText1._color2 = 0;
_sceneText1._width = 200;
_sceneText2._color1 = 0;
_sceneText2._color2 = 0;
_sceneText2._width = 200;
fixPriority(20);
}
void Scene325::Icon::synchronize(Serializer &s) {
SceneActor::synchronize(s);
s.syncAsSint16LE(_lookLineNum);
s.syncAsSint16LE(_iconId);
s.syncAsSint16LE(_pressed);
}
void Scene325::Icon::process(Event &event) {
Scene325 *scene = (Scene325 *)R2_GLOBALS._sceneManager._scene;
if (!event.handled && !(_flags & OBJFLAG_HIDING) && R2_GLOBALS._player._uiEnabled) {
if (event.eventType == EVENT_BUTTON_DOWN) {
int regionIndex = R2_GLOBALS._sceneRegions.indexOf(event.mousePos);
switch (R2_GLOBALS._events.getCursor()) {
case CURSOR_LOOK:
if (regionIndex == _sceneRegionId) {
event.handled = true;
SceneItem::display2(326, _lookLineNum);
}
break;
case CURSOR_USE:
if ((regionIndex == _sceneRegionId) && !_pressed) {
scene->_sound1.play(14);
setFrame(2);
switch (_glyph._strip) {
case 1:
_glyph.setStrip(2);
break;
case 3:
_glyph.setStrip(4);
break;
case 5:
_glyph.setStrip(6);
break;
case 7:
_glyph.setStrip(8);
break;
default:
break;
}
_pressed = true;
event.handled = true;
}
break;
default:
break;
}
}
if ((event.eventType == EVENT_BUTTON_UP) && _pressed) {
setFrame(1);
switch (_glyph._strip) {
case 2:
_glyph.setStrip(1);
break;
case 4:
_glyph.setStrip(3);
break;
case 6:
_glyph.setStrip(5);
break;
default:
break;
}
_pressed = false;
event.handled = true;
scene->consoleAction(_lookLineNum);
}
}
}
void Scene325::Icon::setIcon(int id) {
_lookLineNum = _iconId = id;
SceneActor::_lookLineNum = id;
_sceneText1.remove();
_sceneText2.remove();
if (_lookLineNum) {
Scene325 *scene = (Scene325 *)R2_GLOBALS._sceneManager._scene;
showIcon();
_glyph.setup(325, ((id - 1) / 10) * 2 + 1, ((id - 1) % 10) + 1);
_glyph.setPosition(_position);
_sceneText1._fontNumber = scene->_iconFontNumber;
_sceneText1.setup(CONSOLE325_MESSAGES[id]);
_sceneText1.fixPriority(20);
_sceneText2._fontNumber = scene->_iconFontNumber;
_sceneText2.setup(CONSOLE325_MESSAGES[id]);
_sceneText2.fixPriority(20);
_sceneText2._fontNumber = scene->_iconFontNumber;
_sceneText2.setup(CONSOLE325_MESSAGES[id]);
_sceneText2.fixPriority(10);
switch (_lookLineNum) {
case 7:
_sceneText1.setPosition(Common::Point(62, _position.y + 8));
_sceneText2.setPosition(Common::Point(64, _position.y + 10));
break;
case 8:
case 9:
_sceneText1.setPosition(Common::Point(65, _position.y + 8));
_sceneText2.setPosition(Common::Point(67, _position.y + 10));
break;
case 12:
_sceneText1.setPosition(Common::Point(83, _position.y + 8));
_sceneText2.setPosition(Common::Point(85, _position.y + 10));
break;
default:
_sceneText1.setPosition(Common::Point(121, _position.y + 8));
_sceneText2.setPosition(Common::Point(123, _position.y + 10));
break;
}
} else {
hideIcon();
}
}
void Scene325::Icon::showIcon() {
_sceneText1.show();
_sceneText2.show();
_glyph.show();
_horizLine.show();
show();
}
void Scene325::Icon::hideIcon() {
_sceneText1.hide();
_sceneText2.hide();
_glyph.hide();
_horizLine.hide();
hide();
}
/*--------------------------------------------------------------------------*/
Scene325::Scene325(): SceneExt() {
_consoleAction = 7;
_iconFontNumber = 50;
_databasePage = _priorConsoleAction = 0;
_moveCounter = _yChange = _yDirection = _scannerLocation = 0;
_soundCount = _soundIndex = 0;
for (int idx = 0; idx < 10; ++idx)
_soundQueue[idx] = 0;
}
void Scene325::postInit(SceneObjectList *OwnerList) {
loadScene(325);
SceneExt::postInit();
R2_GLOBALS.clearFlag(50);
_stripManager.addSpeaker(&_quinnSpeaker);
_palette.loadPalette(0);
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.hide();
R2_GLOBALS._player.disableControl();
_terminal.setDetails(1, 325, 3, 4, 5);
_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 325, 0, 1, 2, 1, (SceneItem *)NULL);
_sceneMode = 1;
signal();
}
void Scene325::synchronize(Serializer &s) {
SceneExt::synchronize(s);
s.syncAsSint16LE(_consoleAction);
s.syncAsSint16LE(_iconFontNumber);
s.syncAsSint16LE(_databasePage);
s.syncAsSint16LE(_priorConsoleAction);
s.syncAsSint16LE(_moveCounter);
s.syncAsSint16LE(_yChange);
s.syncAsSint16LE(_yDirection);
s.syncAsSint16LE(_scannerLocation);
s.syncAsSint16LE(_soundCount);
s.syncAsSint16LE(_soundIndex);
for (int idx = 0; idx < 10; ++idx)
s.syncAsSint16LE(_soundQueue[idx]);
}
void Scene325::remove() {
removeText();
SceneExt::remove();
}
void Scene325::signal() {
switch (_sceneMode - 1) {
case 0:
_icon1.postInit();
_icon1._sceneRegionId = 2;
_icon2.postInit();
_icon2._sceneRegionId = 3;
_icon3.postInit();
_icon3._sceneRegionId = 4;
_icon4.postInit();
_icon4._sceneRegionId = 5;
setAction(&_sequenceManager1, this, 127, &_icon1, &_icon2, &_icon3, &_icon4,
&R2_GLOBALS._player, NULL);
_sceneMode = 2;
break;
case 1:
_icon1.setup(160, 1, 1);
_icon1.setPosition(Common::Point(65, 17));
_icon1._horizLine.postInit();
_icon1._horizLine.setup(160, 7, 1);
_icon1._horizLine.setPosition(Common::Point(106, 41));
_icon2.setup(160, 1, 1);
_icon2.setPosition(Common::Point(80, 32));
_icon2._horizLine.postInit();
_icon2._horizLine.setup(160, 7, 2);
_icon2._horizLine.setPosition(Common::Point(106, 56));
_icon3.setup(160, 1, 1);
_icon3.setPosition(Common::Point(65, 47));
_icon3._horizLine.postInit();
_icon3._horizLine.setup(160, 7, 1);
_icon3._horizLine.setPosition(Common::Point(106, 71));
_icon4.setup(160, 1, 1);
_icon4.setPosition(Common::Point(80, 62));
_icon4._sceneRegionId = 5;
_icon4._horizLine.postInit();
_icon4._horizLine.setup(160, 7, 2);
_icon4._horizLine.setPosition(Common::Point(106, 86));
_icon5.postInit();
_icon5.setup(160, 1, 1);
_icon5._sceneRegionId = 7;
_icon5.setPosition(Common::Point(37, 92));
_icon5.setIcon(8);
_icon6.postInit();
_icon6.setup(160, 1, 1);
_icon6.setPosition(Common::Point(106, 110));
_icon6.setIcon(7);
_icon6._sceneRegionId = 8;
consoleAction(7);
R2_GLOBALS._player.enableControl(CURSOR_USE);
R2_GLOBALS._player._canWalk = false;
break;
case 9:
// Fade to black for console sub-section: database, or starchart
switch (_consoleAction) {
case 3:
// Starchart
_sceneMode = 129;
_starGrid1.postInit();
_starGrid2.postInit();
_starGrid3.postInit();
if (R2_GLOBALS.getFlag(13)) {
// Show starchart with Ringworld present
_starGrid4.postInit();
setAction(&_sequenceManager1, this, 130, &R2_GLOBALS._player, &_starGrid1,
&_starGrid2, &_starGrid3, &_starGrid4, NULL);
} else {
// Show starchart without Ringworld
setAction(&_sequenceManager1, this, 129, &R2_GLOBALS._player, &_starGrid1,
&_starGrid2, &_starGrid3, NULL);
}
break;
case 17:
case 18:
case 19:
case 20: {
int v = 10 - ((21 - _consoleAction) * 2);
if (R2_GLOBALS.getFlag(50))
--v;
if (_priorConsoleAction == 5)
v += 8;
if (R2_GLOBALS.getFlag(51) && (v == 2))
R2_GLOBALS.setFlag(57);
if (R2_GLOBALS.getFlag(44) && !R2_GLOBALS.getFlag(51)) {
if (v != 13) {
if (_priorConsoleAction == 6) {
// Fix for original game bug.
// The passive short scan geographical and astronomical sentences
// are inverted in the original game.
if (v == 6)
v = 8;
else if (v == 8)
v = 6;
}
setMessage(328, v);
} else {
_scannerLocation = 864;
_starGrid12.postInit();
_starGrid12.setup(326, 4, 1);
_starGrid12.setPosition(Common::Point(149, 128));
_starGrid12.fixPriority(20);
_starGrid13.postInit();
_starGrid13.setup(326, 4, 2);
_starGrid13.setPosition(Common::Point(149, 22 + (int)(_scannerLocation * ADJUST_FACTOR)));
_starGrid13.fixPriority(21);
_starGrid10.postInit();
_starGrid10.setup(326, 1, 1);
_starGrid10.setPosition(Common::Point(210, 20));
_starGrid10.fixPriority(10);
_starGrid1.postInit();
_starGrid1.setup(326, 1, 1);
_starGrid1.setPosition(Common::Point(210, 32));
_starGrid1.fixPriority(10);
_starGrid2.postInit();
_starGrid2.setup(326, 1, 1);
_starGrid2.setPosition(Common::Point(210, 44));
_starGrid2.fixPriority(10);
_starGrid3.postInit();
_starGrid3.setup(326, 1, 1);
_starGrid3.setPosition(Common::Point(210, 56));
_starGrid3.fixPriority(10);
_starGrid4.postInit();
_starGrid4.setup(326, 1, 1);
_starGrid4.setPosition(Common::Point(210, 68));
_starGrid4.fixPriority(10);
_starGrid5.postInit();
_starGrid5.setup(326, 1, 1);
_starGrid5.setPosition(Common::Point(210, 80));
_starGrid5.fixPriority(10);
_starGrid6.postInit();
_starGrid6.setup(326, 1, 1);
_starGrid6.setPosition(Common::Point(210, 92));
_starGrid6.fixPriority(10);
_starGrid7.postInit();
_starGrid7.setup(326, 1, 1);
_starGrid7.setPosition(Common::Point(210, 104));
_starGrid7.fixPriority(10);
_starGrid8.postInit();
_starGrid8.setup(326, 1, 1);
_starGrid8.setPosition(Common::Point(210, 116));
_starGrid8.fixPriority(10);
_starGrid9.postInit();
_starGrid9.setup(326, 1, 1);
_starGrid9.setPosition(Common::Point(210, 128));
_starGrid9.fixPriority(10);
_starGrid11.postInit();
_starGrid11.setup(326, 1, 1);
_starGrid11.setPosition(Common::Point(210, 150));
_starGrid11.fixPriority(10);
}
} else if (R2_GLOBALS.getFlag(51)) {
setMessage(329, (v == 12) ? 10 : v);
} else {
setMessage(327, (v >= 15) ? 1 : v);
}
break;
}
case 21:
_sceneMode = 129;
_starGrid1.postInit();
_starGrid1.setup(327, 1, 1);
_starGrid1.setPosition(Common::Point(170, 80));
_starGrid1.fixPriority(10);
_starGrid1.animate(ANIM_MODE_5, NULL);
break;
case 22:
_sceneMode = 129;
_starGrid1.postInit();
_starGrid1.setup(327, 2, 1);
_starGrid1.setPosition(Common::Point(160, 80));
_starGrid1.fixPriority(10);
_starGrid1.animate(ANIM_MODE_5, NULL);
break;
case 24:
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
_databasePage = 37;
setMessage(128, _databasePage);
break;
case 25:
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
_databasePage = 68;
setMessage(128, _databasePage);
break;
case 26:
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
_databasePage = 105;
setMessage(128, _databasePage);
break;
default:
_databasePage = 0;
setMessage(128, _databasePage);
break;
}
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
break;
case 10:
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
if ((_consoleAction >= 17) && (_consoleAction <= 20)) {
_icon5.setIcon(8);
consoleAction(4);
} else {
consoleAction(7);
}
_icon6.setIcon(7);
break;
case 11:
R2_GLOBALS.setFlag(45);
R2_GLOBALS._sceneManager.changeScene(300);
break;
case 12:
R2_GLOBALS.setFlag(57);
R2_GLOBALS._sceneManager.changeScene(300);
break;
case 14:
if (_soundCount)
--_soundCount;
if (!_soundCount || !(R2_GLOBALS._speechSubtitles & SPEECH_VOICE)) {
_soundIndex = 0;
R2_GLOBALS._playStream.stop();
} else {
_sceneMode = 15;
R2_GLOBALS._playStream.play(_soundQueue[_soundIndex++], this);
}
break;
default:
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
break;
}
}
void Scene325::removeText() {
_text1.remove();
_soundCount = 0;
_soundIndex = 0;
R2_GLOBALS._playStream.stop();
}
void Scene325::consoleAction(int id) {
_icon1.setIcon(0);
_icon2.setIcon(0);
_icon3.setIcon(0);
_icon4.setIcon(0);
if (id == 7)
_icon5.setIcon(9);
else if ((_consoleAction != 3) && ((_consoleAction < 17) || (_consoleAction > 26)))
_icon5.setIcon(8);
switch (id - 1) {
case 0:
_icon1.setIcon(10);
_icon2.setIcon(11);
break;
case 1:
// Database screen
_icon1.setIcon(23);
_icon2.setIcon(24);
_icon3.setIcon(25);
_icon4.setIcon(26);
break;
case 2:
case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
R2_GLOBALS._player.disableControl();
consoleAction(7);
_icon1.hideIcon();
_icon2.hideIcon();
_icon3.hideIcon();
if (id == 2 || (id == 19 && _priorConsoleAction == 5 && R2_GLOBALS.getFlag(50) &&
R2_GLOBALS.getFlag(44) && !R2_GLOBALS.getFlag(51))) {
_icon5.setIcon(13);
_icon4.setPosition(Common::Point(52, 107));
_icon4._sceneRegionId = 9;
_icon4.setIcon(14);
_icon4._horizLine.hide();
} else {
_icon4.hideIcon();
_icon5.hideIcon();
}
_icon6.setIcon(12);
_sceneMode = 10;
_palette.loadPalette(161);
R2_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
break;
case 22:
case 23:
case 24:
case 25:
// Database sub-sections: A-G, N-O, P-S, T-Z
R2_GLOBALS._player.disableControl();
consoleAction(2);
_consoleAction = id;
_icon1.hideIcon();
_icon2.hideIcon();
_icon3.hideIcon();
_icon4.hideIcon();
_icon5.setIcon(13);
_icon4.setPosition(Common::Point(52, 107));
_icon4._sceneRegionId = 9;
_icon4.setIcon(14);
_icon4._horizLine.hide();
_icon6.setIcon(12);
_sceneMode = 10;
_palette.loadPalette(161);
R2_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
break;
case 11:
if (R2_GLOBALS.getFlag(57) && (R2_GLOBALS._player._characterIndex == R2_QUINN) && !R2_GLOBALS.getFlag(25)) {
R2_GLOBALS._player.disableControl();
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
_sceneMode = 13;
_stripManager.start(403, this);
} else {
R2_GLOBALS._player.disableControl();
id = 8;
_text1.remove();
_icon4.setPosition(Common::Point(80, 62));
_icon4._sceneRegionId = 5;
_icon4.hideIcon();
R2_GLOBALS._player.hide();
_starGrid1.remove();
_starGrid2.remove();
_starGrid3.remove();
_starGrid4.remove();
_starGrid5.remove();
_starGrid6.remove();
_starGrid7.remove();
_starGrid8.remove();
_starGrid9.remove();
_starGrid10.remove();
_starGrid11.remove();
_starGrid12.remove();
_starGrid13.remove();
_palette.loadPalette(160);
_sceneMode = 11;
R2_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
}
break;
case 3:
_icon1.setIcon(5);
_icon2.setIcon(6);
_icon3.setIcon(R2_GLOBALS.getFlag(50) ? 16 : 15);
break;
case 4:
case 5:
_priorConsoleAction = id;
_icon1.setIcon(17);
_icon2.setIcon(18);
_icon3.setIcon(19);
_icon4.setIcon(20);
break;
case 7:
consoleAction(((_consoleAction == 5) || (_consoleAction == 6) || (_consoleAction == 15)) ? 4 : 7);
break;
case 8:
R2_GLOBALS._sceneManager.changeScene(300);
break;
case 9:
case 10:
// Set language: Interworld or Hero's Tongue
_iconFontNumber = (id - 1) == 9 ? 50 : 52;
_text1.remove();
_icon6.setIcon(7);
consoleAction(1);
break;
case 12:
// Page up button
_icon4.setIcon(14);
_icon4._horizLine.hide();
switch (_consoleAction) {
case 17:
case 18:
case 19:
case 20:
if (_scannerLocation) {
R2_GLOBALS._player.disableControl();
_moveCounter = 1296;
_yDirection = 1;
}
break;
default:
setMessage(128, --_databasePage);
break;
}
return;
case 13:
// Page down button
_icon4.setIcon(14);
_icon4._horizLine.hide();
switch (_consoleAction) {
case 17:
case 18:
case 19:
case 20:
if (_scannerLocation < 1620) {
R2_GLOBALS._player.disableControl();
_moveCounter = 1296;
_yDirection = -1;
}
break;
default:
setMessage(128, ++_databasePage);
break;
}
return;
case 14:
if (R2_GLOBALS.getFlag(55)) {
consoleAction(4);
// Workaround for original game bug.
// Empty message crashing the game. It should be a warning message forbidding to switch to active scan
// SceneItem::display2(329, 17);
} else {
R2_GLOBALS.setFlag(50);
consoleAction(4);
}
id = 4;
break;
case 15:
R2_GLOBALS.clearFlag(50);
consoleAction(4);
id = 4;
break;
case 6:
default:
// Initial starting screen
_icon1.setIcon(1);
_icon2.setIcon(2);
_icon3.setIcon(3);
int idList[3] = { 4, 22, 21 };
_icon4.setIcon(idList[R2_GLOBALS._player._characterIndex - 1]);
break;
}
if (id != 8)
_consoleAction = id;
}
void Scene325::process(Event &event) {
SceneExt::process(event);
if (R2_GLOBALS._player._uiEnabled) {
_icon1.process(event);
_icon2.process(event);
_icon3.process(event);
_icon4.process(event);
_icon5.process(event);
_icon6.process(event);
}
}
void Scene325::dispatch() {
if (_moveCounter) {
switch (_moveCounter) {
case 13:
_yChange = 1;
break;
case 1296:
R2_GLOBALS._sound3.play(87);
_yChange = 1;
break;
case 33:
case 1283:
_yChange = 2;
break;
case 63:
case 1263:
_yChange = 3;
break;
case 103:
case 1233:
_yChange = 4;
break;
case 153:
case 1193:
_yChange = 5;
break;
case 213:
case 1143:
_yChange = 6;
break;
case 283:
case 1083:
_yChange = 7;
break;
case 1013:
_yChange = 8;
break;
default:
break;
}
_moveCounter -= _yChange;
int yp = _yDirection * _yChange + _starGrid10._position.y;
bool flag = false;
if (yp >= 30) {
yp -= 12;
--_scannerLocation;
flag = true;
}
if (yp <= 10) {
yp += 12;
++_scannerLocation;
flag = true;
}
_starGrid13.setPosition(Common::Point(149, 22 + (int)(_scannerLocation * ADJUST_FACTOR)));
for (int idx = 0; idx < 4; ++idx)
_objList[idx].remove();
if (flag) {
int v = _scannerLocation - 758;
_starGrid10.setFrame((v++ <= 0) ? 1 : v);
_starGrid1.setFrame((v++ <= 0) ? 1 : v);
_starGrid2.setFrame((v++ <= 0) ? 1 : v);
_starGrid3.setFrame((v++ <= 0) ? 1 : v);
_starGrid4.setFrame((v++ <= 0) ? 1 : v);
_starGrid5.setFrame((v++ <= 0) ? 1 : v);
_starGrid6.setFrame((v++ <= 0) ? 1 : v);
_starGrid7.setFrame((v++ <= 0) ? 1 : v);
_starGrid8.setFrame((v++ <= 0) ? 1 : v);
_starGrid9.setFrame((v++ <= 0) ? 1 : v);
_starGrid11.setFrame((v++ <= 0) ? 1 : v);
}
_starGrid10.setPosition(Common::Point(210, yp));
yp += 12;
_starGrid1.setPosition(Common::Point(210, yp));
yp += 12;
_starGrid2.setPosition(Common::Point(210, yp));
yp += 12;
_starGrid3.setPosition(Common::Point(210, yp));
yp += 12;
_starGrid4.setPosition(Common::Point(210, yp));
yp += 12;
_starGrid5.setPosition(Common::Point(210, yp));
yp += 12;
_starGrid6.setPosition(Common::Point(210, yp));
yp += 12;
_starGrid7.setPosition(Common::Point(210, yp));
yp += 12;
_starGrid8.setPosition(Common::Point(210, yp));
yp += 12;
_starGrid9.setPosition(Common::Point(210, yp));
yp += 12;
_starGrid11.setPosition(Common::Point(210, yp));
if (!_moveCounter) {
R2_GLOBALS._sound3.stop();
_yChange = 0;
if (_scannerLocation == 756) {
R2_GLOBALS._player.disableControl();
R2_GLOBALS._events.setCursor(CURSOR_USE);
_sceneMode = 12;
_stripManager.start(212, this);
} else {
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
}
}
}
SceneExt::dispatch();
}
void Scene325::setMessage(int resNum, int lineNum) {
removeText();
Common::String msg = g_resourceManager->getMessage(resNum, lineNum, true);
if (!msg.empty()) {
// Found valid database entry to display
Common::String msgText = parseMessage(msg);
_text1._fontNumber = _iconFontNumber;
_text1._color1 = 92;
_text1._color2 = 0;
_text1._width = 221;
_text1.fixPriority(20);
_text1.setup(msgText);
_text1.setPosition(Common::Point(49, 19));
R2_GLOBALS._sceneObjects->draw();
if ((_soundCount != 0) && (R2_GLOBALS._speechSubtitles & SPEECH_VOICE)) {
_sceneMode = 15;
R2_GLOBALS._playStream.play(_soundQueue[_soundIndex++], this);
}
} else {
// No message for given database index, so we must have passed beyond
// the start or end of the database
_consoleAction = 13;
R2_GLOBALS._player.disableControl();
R2_GLOBALS._player.hide();
_icon4.setPosition(Common::Point(80, 62));
_icon4._sceneRegionId = 5;
_icon4.hideIcon();
_palette.loadPalette(160);
_sceneMode = 11;
R2_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
}
}
/**
* Parses a message to be displayed on the console to see whether there are any sounds to be played.
*/
Common::String Scene325::parseMessage(const Common::String &msg) {
_soundIndex = 0;
_soundCount = 0;
const char *msgP = msg.c_str();
while (*msgP == '!') {
// Get the sound number
_soundQueue[_soundCount++] = atoi(++msgP);
while (!((*msgP == '\0') || (*msgP < '0') || (*msgP > '9')))
++msgP;
}
return Common::String(msgP);
}
/*--------------------------------------------------------------------------
* Scene 400 - Science Lab
*
*--------------------------------------------------------------------------*/
bool Scene400::Terminal::startAction(CursorType action, Event &event) {
if (action == CURSOR_USE) {
Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 402;
scene->setAction(&scene->_sequenceManager1, scene, 402, &R2_GLOBALS._player, this, NULL);
return true;
} else {
return NamedHotspot::startAction(action, event);
}
}
/*--------------------------------------------------------------------------*/
bool Scene400::Door::startAction(CursorType action, Event &event) {
if (action == CURSOR_USE) {
Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 401;
scene->setAction(&scene->_sequenceManager1, scene, 401, &R2_GLOBALS._player, this, NULL);
return true;
} else {
return SceneActor::startAction(action, event);
}
}
bool Scene400::Reader::startAction(CursorType action, Event &event) {
if (action == CURSOR_USE) {
Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 405;
scene->setAction(&scene->_sequenceManager1, scene, 405, &R2_GLOBALS._player, this, NULL);
return true;
} else {
return SceneActor::startAction(action, event);
}
}
bool Scene400::SensorProbe::startAction(CursorType action, Event &event) {
if (action == CURSOR_USE) {
Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 404;
scene->setAction(&scene->_sequenceManager1, scene, 404, &R2_GLOBALS._player, this, NULL);
return true;
} else {
return SceneActor::startAction(action, event);
}
}
bool Scene400::AttractorUnit::startAction(CursorType action, Event &event) {
if (action == CURSOR_USE) {
Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 406;
scene->setAction(&scene->_sequenceManager1, scene, 406, &R2_GLOBALS._player, this, NULL);
return true;
} else {
return SceneActor::startAction(action, event);
}
}
/*--------------------------------------------------------------------------*/
void Scene400::postInit(SceneObjectList *OwnerList) {
loadScene(400);
SceneExt::postInit();
_sound1.play(20);
_door.postInit();
_door.setVisage(100);
_door.setPosition(Common::Point(123, 84));
_door.setDetails(400, 24, -1, 26, 1, (SceneItem *)NULL);
_consoleDisplay.postInit();
_consoleDisplay.setup(400, 4, 1);
_consoleDisplay.setPosition(Common::Point(236, 92));
_consoleDisplay.fixPriority(120);
_consoleDisplay.animate(ANIM_MODE_2, NULL);
_consoleDisplay._numFrames = 5;
_testerDisplay.postInit();
_testerDisplay.setup(400, 2, 1);
_testerDisplay.setPosition(Common::Point(198, 83));
_testerDisplay.animate(ANIM_MODE_2, NULL);
_testerDisplay._numFrames = 20;
if (R2_INVENTORY.getObjectScene(R2_READER) == 400) {
_reader.postInit();
_reader.setup(400, 5, 2);
_reader.setPosition(Common::Point(301, 95));
_reader.setDetails(400, 54, -1, 56, 1, (SceneItem *)NULL);
}
if (R2_INVENTORY.getObjectScene(R2_SENSOR_PROBE) == 400) {
_sensorProbe.postInit();
_sensorProbe.setup(400, 5, 1);
_sensorProbe.setPosition(Common::Point(251, 104));
_sensorProbe.fixPriority(121);
_sensorProbe.setDetails(400, 57, -1, 59, 1, (SceneItem *)NULL);
}
if (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_UNIT) == 400) {
_attractorUnit.postInit();
_attractorUnit.setup(400, 5, 3);
_attractorUnit.setPosition(Common::Point(265, 129));
_attractorUnit.setDetails(400, 60, -1, 62, 1, (SceneItem *)NULL);
}
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.setVisage(10);
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player.disableControl();
_equipment1.setDetails(11, 400, 3, -1, -1);
_equipment2.setDetails(24, 400, 3, -1, -1);
_equipment3.setDetails(25, 400, 3, -1, -1);
_equipment4.setDetails(26, 400, 3, -1, -1);
_equipment5.setDetails(28, 400, 3, -1, -1);
_equipment6.setDetails(29, 400, 3, -1, -1);
_desk.setDetails(12, 400, 6, -1, -1);
_desk2.setDetails(27, 400, 6, -1, -1);
_terminal.setDetails(13, 400, 6, -1, 11);
_duct.setDetails(14, 400, 12, -1, -1);
_console.setDetails(15, 400, 15, -1, 17);
_equalizer.setDetails(Rect(284, 99, 308, 108), 400, 36, -1, 38, 1, NULL);
_transducer.setDetails(Rect(295, 67, 314, 79), 400, 39, -1, 41, 1, NULL);
_optimizer.setDetails(Rect(308, 106, 315, 113), 400, 42, -1, 44, 1, NULL);
_soundModule.setDetails(Rect(291, 118, 315, 131), 400, 45, -1, 47, 1, NULL);
_tester.setDetails(Rect(179, 62, 217, 92), 400, 30, -1, 32, 1, NULL);
_helmet.setDetails(Rect(181, 53, 197, 65), 400, 48, -1, 50, 1, NULL);
_nullifier.setDetails(Rect(201, 56, 212, 65), 400, 51, -1, 50, 1, NULL);
_shelves.setDetails(16, 400, 18, -1, 20);
_cabinet.setDetails(17, 400, 21, -1, -1);
_doorDisplay.setDetails(Rect(161, 43, 166, 52), 400, 27, -1, -1, 1, NULL);
_lights.setDetails(Rect(113, 3, 168, 14), 400, 33, -1, -1, 1, NULL);
_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 400, 0, 1, -1, 1, NULL);
_sceneMode = 400;
switch (R2_GLOBALS._sceneManager._previousScene) {
case 125:
setAction(&_sequenceManager1, this, 403, &R2_GLOBALS._player, NULL);
break;
case 200:
setAction(&_sequenceManager1, this, 400, &R2_GLOBALS._player, &_door, NULL);
break;
default:
R2_GLOBALS._player.setStrip(3);
R2_GLOBALS._player.setPosition(Common::Point(180, 100));
R2_GLOBALS._player.enableControl();
break;
}
}
void Scene400::remove() {
R2_GLOBALS._sound1.fadeOut2(NULL);
SceneExt::remove();
}
void Scene400::signal() {
switch (_sceneMode) {
case 400:
case 403:
R2_GLOBALS._player.enableControl();
break;
case 401:
R2_GLOBALS._sceneManager.changeScene(200);
break;
case 402:
R2_GLOBALS._sceneManager.changeScene(125);
break;
case 404:
// Getting the sensor probe
R2_INVENTORY.setObjectScene(R2_SENSOR_PROBE, 1);
_sensorProbe.remove();
R2_GLOBALS._player.enableControl();
break;
case 405:
// Getting the reader
R2_INVENTORY.setObjectScene(R2_READER, 1);
_reader.remove();
R2_GLOBALS._player.enableControl();
break;
case 406:
R2_INVENTORY.setObjectScene(R2_ATTRACTOR_UNIT, 1);
_attractorUnit.remove();
R2_GLOBALS._player.enableControl();
break;
default:
break;
}
}
void Scene400::dispatch() {
SceneExt::dispatch();
switch (R2_GLOBALS._player.getRegionIndex() - 15) {
case 0:
case 11:
case 12:
R2_GLOBALS._player._shade = 2;
break;
case 9:
R2_GLOBALS._player._shade = 0;
break;
case 10:
R2_GLOBALS._player._shade = 1;
break;
case 13:
R2_GLOBALS._player._shade = 3;
break;
case 14:
R2_GLOBALS._player._shade = 4;
break;
default:
break;
}
}
/*--------------------------------------------------------------------------
* Scene 500 - Lander Bay 2 Storage
*
*--------------------------------------------------------------------------*/
Scene500::PanelDialog::Button::Button() {
_buttonId = 0;
_buttonDown = false;
}
bool Scene500::ControlPanel::startAction(CursorType action, Event &event) {
if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_QUINN)) {
Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS.getFlag(26)) {
scene->_stripNumber = 1104;
scene->_sceneMode = 524;
scene->setAction(&scene->_sequenceManager1, scene, 524, &R2_GLOBALS._player, NULL);
} else {
scene->_sceneMode = 510;
scene->setAction(&scene->_sequenceManager1, scene, 510, &R2_GLOBALS._player, NULL);
}
return true;
} else {
return SceneHotspot::startAction(action, event);
}
}
/*--------------------------------------------------------------------------*/
bool Scene500::Seeker::startAction(CursorType action, Event &event) {
if (action == CURSOR_TALK) {
Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
scene->_stripNumber = R2_GLOBALS.getFlag(26) ? 1101 : 1103;
} else {
scene->_stripNumber = R2_GLOBALS.getFlag(26) ? 1102 : 1105;
}
scene->_sceneMode = 524;
scene->setAction(&scene->_sequenceManager1, scene, 524, &R2_GLOBALS._player, NULL);
return true;
} else {
return SceneActor::startAction(action, event);
}
}
bool Scene500::Suit::startAction(CursorType action, Event &event) {
Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(500, R2_GLOBALS.getFlag(28) ? 28 : _strip + 25);
return true;
case CURSOR_USE:
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
if ((_strip != 3) && (_strip != 7))
SceneItem::display2(500, _strip + 25);
else if (R2_GLOBALS.getFlag(26)) {
R2_GLOBALS._player.disableControl();
scene->_stripNumber = 1103;
scene->_sceneMode = 524;
scene->setAction(&scene->_sequenceManager1, scene, 512, &R2_GLOBALS._player, NULL);
} else if (!R2_GLOBALS.getFlag(28))
SceneItem::display2(500, 41);
else if (!R2_GLOBALS.getFlag(25))
SceneItem::display2(500, 40);
else {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 512;
scene->setAction(&scene->_sequenceManager1, scene, 512, &R2_GLOBALS._player, &scene->_suit, NULL);
R2_GLOBALS.setFlag(26);
}
} else {
SceneItem::display2(500, 42);
}
return true;
case R2_REBREATHER_TANK:
if (!R2_GLOBALS.getFlag(25))
SceneItem::display2(500, 10);
else if (_strip != 3)
SceneItem::display2(500, _strip + 25);
else {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 515;
scene->setAction(&scene->_sequenceManager1, scene, 515, &R2_GLOBALS._player, &scene->_suit, NULL);
R2_GLOBALS.setFlag(28);
}
return true;
case R2_RESERVE_REBREATHER_TANK:
SceneItem::display2(500, 53);
return true;
default:
return SceneActor::startAction(action, event);
}
}
bool Scene500::Doorway::startAction(CursorType action, Event &event) {
if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_QUINN)) {
Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS.getFlag(26)) {
scene->_stripNumber = 1104;
scene->_sceneMode = 524;
scene->setAction(&scene->_sequenceManager1, scene, 524, &R2_GLOBALS._player, NULL);
} else {
scene->_sceneMode = 500;
scene->setAction(&scene->_sequenceManager1, scene, 500, &R2_GLOBALS._player, this, NULL);
}
return true;
} else {
return SceneActor::startAction(action, event);
}
}
bool Scene500::OxygenTanks::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(500, R2_INVENTORY.getObjectScene(R2_REBREATHER_TANK) ? 50 : 49);
return true;
case CURSOR_USE:
if (R2_GLOBALS._player._characterIndex != R2_QUINN) {
SceneItem::display2(500, 52);
return true;
} else if ((R2_INVENTORY.getObjectScene(R2_REBREATHER_TANK) != 1) &&
(R2_GLOBALS._player._characterIndex != R2_SEEKER) && !R2_GLOBALS.getFlag(28)) {
Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
if (_position.y == 120) {
scene->_sceneMode = 513;
scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player,
&scene->_tanks1, NULL);
} else {
scene->_sceneMode = 514;
scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player,
&scene->_tanks2, NULL);
}
return true;
}
break;
default:
break;
}
return SceneActor::startAction(action, event);
}
bool Scene500::AirLock::startAction(CursorType action, Event &event) {
if ((action == CURSOR_USE) && R2_GLOBALS.getFlag(26)) {
Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = (R2_GLOBALS._player._characterIndex == R2_QUINN) ? 521 : 522;
scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player,
&scene->_seeker, &scene->_airLock, NULL);
return true;
} else {
return SceneActor::startAction(action, event);
}
}
void Scene500::TransparentDoor::draw() {
// Determine the area of the screen to be updated
Rect destRect = _bounds;
destRect.translate(-g_globals->_sceneManager._scene->_sceneBounds.left,
-g_globals->_sceneManager._scene->_sceneBounds.top);
// Get the frame to be drawn
GfxSurface frame = getFrame();
Graphics::Surface s = frame.lockSurface();
Graphics::Surface screen = g_globals->gfxManager().getSurface().lockSurface();
for (int yp = 0; yp < s.h; ++yp) {
byte *frameSrcP = (byte *)s.getBasePtr(0, yp);
byte *screenP = (byte *)screen.getBasePtr(destRect.left, destRect.top + yp);
for (int xp = 0; xp < s.w; ++xp, ++frameSrcP, ++screenP) {
if (*frameSrcP != frame._transColor && *frameSrcP < 6) {
*frameSrcP = R2_GLOBALS._fadePaletteMap[*frameSrcP][*screenP];
}
}
}
// Finished updating the frame
frame.unlockSurface();
g_globals->gfxManager().getSurface().unlockSurface();
// Draw the processed frame
Region *priorityRegion = g_globals->_sceneManager._scene->_priorities.find(_priority);
g_globals->gfxManager().copyFrom(frame, destRect, priorityRegion);
}
bool Scene500::Aerosol::startAction(CursorType action, Event &event) {
if (action == CURSOR_USE) {
Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 503;
scene->setAction(&scene->_sequenceManager1, scene, 503, &R2_GLOBALS._player, this, NULL);
return true;
} else {
return SceneActor::startAction(action, event);
}
}
bool Scene500::SonicStunner::startAction(CursorType action, Event &event) {
if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_QUINN)) {
Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = R2_GLOBALS.getFlag(26) ? 520 : 502;
scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, this, NULL);
return true;
} else {
return SceneActor::startAction(action, event);
}
}
bool Scene500::Locker1::startAction(CursorType action, Event &event) {
if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_QUINN)) {
Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS.getFlag(11))
scene->_sceneMode = R2_GLOBALS.getFlag(26) ? 517 : 505;
else
scene->_sceneMode = R2_GLOBALS.getFlag(26) ? 516 : 504;
scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, this, NULL);
return true;
} else {
return SceneActor::startAction(action, event);
}
}
bool Scene500::Locker2::startAction(CursorType action, Event &event) {
if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_QUINN)) {
Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS.getFlag(12))
scene->_sceneMode = R2_GLOBALS.getFlag(26) ? 519 : 507;
else
scene->_sceneMode = R2_GLOBALS.getFlag(26) ? 518 : 506;
scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, this, NULL);
return true;
} else {
return SceneActor::startAction(action, event);
}
}
/*--------------------------------------------------------------------------*/
void Scene500::PanelDialog::setDetails(int visage, int strip, int frameNumber,
const Common::Point &pt) {
SceneAreaObject::setDetails(visage, strip, frameNumber, pt);
SceneAreaObject::setDetails(500, 43, 32, 45);
_button1.setupButton(1);
_button2.setupButton(2);
_button3.setupButton(3);
}
void Scene500::PanelDialog::remove() {
Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
scene->_sceneAreas.remove(&_button1);
scene->_sceneAreas.remove(&_button2);
scene->_sceneAreas.remove(&_button3);
_button1.remove();
_button2.remove();
_button3.remove();
SceneAreaObject::remove();
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 511;
scene->setAction(&scene->_sequenceManager1, scene, 511, &R2_GLOBALS._player, NULL);
}
bool Scene500::PanelDialog::Button::startAction(CursorType action, Event &event) {
if (action == CURSOR_USE) {
return false;
} else {
return SceneActor::startAction(action, event);
}
}
void Scene500::PanelDialog::Button::setupButton(int buttonId) {
_buttonId = buttonId;
_buttonDown = false;
SceneActor::postInit();
setup(500, 7, 1);
fixPriority(251);
switch (_buttonId) {
case 1:
setPosition(Common::Point(139, 78));
break;
case 2:
setPosition(Common::Point(139, 96));
break;
case 3:
setPosition(Common::Point(139, 114));
break;
default:
break;
}
Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
scene->_sceneAreas.push_front(this);
}
void Scene500::PanelDialog::Button::synchronize(Serializer &s) {
SceneActor::synchronize(s);
s.syncAsSint16LE(_buttonId);
s.syncAsSint16LE(_buttonDown);
}
void Scene500::PanelDialog::Button::process(Event &event) {
if ((event.eventType == EVENT_BUTTON_DOWN) &&
(R2_GLOBALS._events.getCursor() == CURSOR_USE) &&
_bounds.contains(event.mousePos) && !_buttonDown) {
_buttonDown = true;
event.handled = true;
setFrame(2);
}
if ((event.eventType == EVENT_BUTTON_UP) && _buttonDown) {
setFrame(1);
_buttonDown = false;
event.handled = true;
doButtonPress();
}
}
void Scene500::PanelDialog::Button::doButtonPress() {
if (R2_GLOBALS.getFlag(28)) {
SceneItem::display2(500, 48);
} else {
Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = _buttonId;
switch (_buttonId) {
case 1:
// Rotate Left
if (--R2_GLOBALS._landerSuitNumber == 0)
R2_GLOBALS._landerSuitNumber = R2_MIRANDA;
if (R2_GLOBALS.getFlag(35)) {
scene->_sceneMode = 5;
scene->setAction(&scene->_sequenceManager1, scene, 509, &scene->_suits,
&scene->_suit, &scene->_transparentDoor, NULL);
} else {
scene->_sound1.play(127);
scene->_suits.animate(ANIM_MODE_6, scene);
}
break;
case 2:
// Rotate Right
if (++R2_GLOBALS._landerSuitNumber == 4)
R2_GLOBALS._landerSuitNumber = R2_QUINN;
if (R2_GLOBALS.getFlag(35)) {
scene->_sceneMode = 6;
scene->setAction(&scene->_sequenceManager1, scene, 509, &scene->_suits,
&scene->_suit, &scene->_transparentDoor, NULL);
} else {
scene->_sound1.play(127);
scene->_suits.animate(ANIM_MODE_5, scene);
}
break;
case 3:
if (R2_GLOBALS.getFlag(35)) {
scene->_sceneMode = 509;
scene->setAction(&scene->_sequenceManager1, scene, 509, &scene->_suits,
&scene->_suit, &scene->_transparentDoor, NULL);
} else {
scene->_suit.postInit();
scene->_suit.hide();
scene->_suit._effect = EFFECT_SHADED;
scene->_suit.setDetails(500, -1, -1, -1, 2, (SceneItem *)NULL);
scene->_suit.setup(502, R2_GLOBALS._landerSuitNumber + 2, 1);
scene->setAction(&scene->_sequenceManager1, scene, 508,
&R2_GLOBALS._player, &scene->_suits, &scene->_suit,
&scene->_transparentDoor, NULL);
R2_GLOBALS.setFlag(35);
}
break;
default:
break;
}
}
}
/*--------------------------------------------------------------------------*/
void Scene500::postInit(SceneObjectList *OwnerList) {
loadScene(500);
SceneExt::postInit();
_stripManager.setColors(60, 255);
_stripManager.setFontNumber(50);
_stripManager.addSpeaker(&_seekerSpeaker);
_stripManager.addSpeaker(&_quinnSpeaker);
if (R2_GLOBALS.getFlag(25)) {
R2_GLOBALS._player._characterScene[R2_SEEKER] = 500;
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
R2_GLOBALS._walkRegions.enableRegion(1);
_seeker.postInit();
_seeker._effect = EFFECT_SHADED;
_seeker.setup(1505, 1, 1);
_seeker._moveDiff.x = 5;
_seeker.setPosition(Common::Point(42, 151));
_seeker.setDetails(500, 34, 35, 36, 1, (SceneItem *)NULL);
} else if (R2_GLOBALS._player._characterScene[R2_QUINN] == 500) {
_seeker.postInit();
_seeker._effect = EFFECT_SHADED;
_seeker.setup(R2_GLOBALS.getFlag(26) ? 1500 : 10, 1, 1);
_seeker.setPosition(Common::Point(42, 151));
R2_GLOBALS._walkRegions.enableRegion(1);
R2_GLOBALS._walkRegions.enableRegion(2);
R2_GLOBALS._walkRegions.enableRegion(3);
_seeker.setDetails(500, 37, 38, -1, 1, (SceneItem *)NULL);
}
}
if ((R2_INVENTORY.getObjectScene(R2_REBREATHER_TANK) == 500) && R2_GLOBALS.getFlag(27)) {
_tanks1.postInit();
_tanks1.setup(502, 7, 1);
_tanks1.setPosition(Common::Point(281, 120));
_tanks1.setDetails(500, -1, -1, -1, 1, (SceneItem *)NULL);
} else {
if (R2_INVENTORY.getObjectScene(R2_REBREATHER_TANK) == 500) {
_tanks1.postInit();
_tanks1.setup(502, 7, 1);
_tanks1.setPosition(Common::Point(281, 120));
_tanks1.setDetails(500, -1, -1, -1, 1, (SceneItem *)NULL);
}
_tanks2.postInit();
_tanks2.setup(502, 7, 1);
_tanks2.setPosition(Common::Point(286, 121));
_tanks2.setDetails(500, -1, -1, -1, 1, (SceneItem *)NULL);
}
_doorway.postInit();
_doorway.setup(501, 1, 1);
_doorway.setPosition(Common::Point(132, 85));
_doorway.setDetails(500, 15, -1, 17, 1, (SceneItem *)NULL);
_airLock.postInit();
_airLock.setup(501, 2, 1);
_airLock.setPosition(Common::Point(41, 121));
if (!R2_GLOBALS.getFlag(25))
_airLock.setDetails(500, 6, -1, 10, 1, (SceneItem *)NULL);
else if ((R2_GLOBALS._player._characterScene[R2_QUINN] != 500) ||
(R2_GLOBALS._player._characterScene[R2_SEEKER] != 500))
_airLock.setDetails(500, 6, -1, 40, 1, (SceneItem *)NULL);
else
_airLock.setDetails(500, 6, -1, 9, 1, (SceneItem *)NULL);
_locker1.postInit();
_locker1.setup(500, 3, R2_GLOBALS.getFlag(11) ? 6 : 1);
_locker1.setPosition(Common::Point(220, 82));
_locker1.setDetails(500, 27, -1, -1, 1, (SceneItem *)NULL);
_locker2.postInit();
_locker2.setup(500, 4, R2_GLOBALS.getFlag(12) ? 6 : 1);
_locker2.setPosition(Common::Point(291, 98));
_locker2.fixPriority(121);
_locker2.setDetails(500, 27, -1, -1, 1, (SceneItem *)NULL);
if (R2_INVENTORY.getObjectScene(R2_AEROSOL) == 500) {
_aerosol.postInit();
_aerosol.setup(500, 5, 2);
_aerosol.setPosition(Common::Point(286, 91));
_aerosol.fixPriority(120);
_aerosol.setDetails(500, 24, 25, 26, 1, (SceneItem *)NULL);
}
if (R2_INVENTORY.getObjectScene(R2_SONIC_STUNNER) == 500) {
_sonicStunner.postInit();
_sonicStunner.setup(500, 5, 1);
_sonicStunner.setPosition(Common::Point(214, 76));
_sonicStunner.setDetails(500, 21, 22, 23, 1, (SceneItem *)NULL);
}
_suits.postInit();
_suits._effect = EFFECT_SHADED;
_suits.setup(502, 1, 1);
_suits.setPosition(Common::Point(258, 99));
_suits.fixPriority(50);
_transparentDoor.postInit();
_transparentDoor.setPosition(Common::Point(250, 111));
if (!R2_GLOBALS.getFlag(35)) {
_transparentDoor.setup(501, 3, 1);
} else {
_transparentDoor.setup(500, 8, 7);
_suit.postInit();
_suit._effect = EFFECT_SHADED;
_suit.setPosition(Common::Point(247, 52));
_suit.setDetails(500, -1, -1, -1, 2, (SceneItem *)NULL);
if (!R2_GLOBALS.getFlag(26)) {
if (R2_GLOBALS.getFlag(28))
_suit.setup(502, 7, 2);
else
_suit.setup(502, R2_GLOBALS._landerSuitNumber + 2, 7);
}
}
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.setVisage(10);
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
R2_GLOBALS._player._moveDiff.x = 5;
_controlPanel.setDetails(Rect(175, 62, 191, 80), 500, 31, 32, 33, 1, (SceneItem *)NULL);
_airlockCorridor.setDetails(Rect(13, 58, 70, 118), 500, 12, -1, -1, 1, (SceneItem *)NULL);
_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 500, 0, -1, -1, 1, (SceneItem *)NULL);
if ((R2_GLOBALS._player._characterIndex == R2_QUINN) && (R2_GLOBALS._sceneManager._previousScene == 700)) {
R2_GLOBALS._player.disableControl();
_sceneMode = 501;
setAction(&_sequenceManager1, this, 501, &R2_GLOBALS._player, &_doorway, NULL);
} else {
if (R2_GLOBALS._player._characterIndex != R2_QUINN) {
R2_GLOBALS._player.setup(1505, 6, 1);
} else {
R2_GLOBALS._player.setup(R2_GLOBALS.getFlag(26) ? 1500 : 10, 6, 1);
}
R2_GLOBALS._player.setPosition(Common::Point(123, 135));
R2_GLOBALS._player.enableControl();
}
}
void Scene500::synchronize(Serializer &s) {
SceneExt::synchronize(s);
s.syncAsSint16LE(_stripNumber);
}
void Scene500::signal() {
switch (_sceneMode) {
case 3:
R2_GLOBALS._player.enableControl();
break;
case 5:
_sceneMode = 12;
_sound1.play(127);
_suits.animate(ANIM_MODE_6, this);
R2_GLOBALS.clearFlag(35);
_suit.remove();
R2_GLOBALS._player.enableControl();
break;
case 6:
_sceneMode = 11;
_sound1.play(127);
_suits.animate(ANIM_MODE_5, this);
R2_GLOBALS.clearFlag(35);
_suit.remove();
R2_GLOBALS._player.enableControl();
break;
case 7:
_sound1.play(126);
_transparentDoor.animate(ANIM_MODE_6, this);
R2_GLOBALS.clearFlag(35);
_suit.remove();
R2_GLOBALS._player.enableControl();
break;
case 500:
R2_GLOBALS._sceneManager.changeScene(700);
break;
case 501:
if (R2_GLOBALS._player._characterScene[R2_SEEKER] == 500) {
_stripNumber = 1100;
_sceneMode = 523;
setAction(&_sequenceManager1, this, 523, &R2_GLOBALS._player, NULL);
} else {
R2_GLOBALS._player.enableControl();
}
break;
case 502:
case 520:
R2_INVENTORY.setObjectScene(R2_SONIC_STUNNER, 1);
_sonicStunner.remove();
R2_GLOBALS._player.enableControl();
break;
case 503:
R2_INVENTORY.setObjectScene(R2_AEROSOL, 1);
_aerosol.remove();
R2_GLOBALS._player.enableControl();
break;
case 504:
case 516:
R2_GLOBALS.setFlag(11);
R2_GLOBALS._player.enableControl();
break;
case 505:
case 517:
R2_GLOBALS.clearFlag(11);
R2_GLOBALS._player.enableControl();
break;
case 506:
case 518:
R2_GLOBALS.setFlag(12);
R2_GLOBALS._player.enableControl();
break;
case 507:
case 519:
R2_GLOBALS.clearFlag(12);
R2_GLOBALS._player.enableControl();
break;
case 509:
R2_GLOBALS.clearFlag(35);
_suit.remove();
R2_GLOBALS._player.enableControl();
break;
case 510:
R2_GLOBALS._player.enableControl();
_panelDialog.setDetails(500, 6, 1, Common::Point(160, 120));
R2_GLOBALS._player.enableControl();
break;
case 513:
R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 1);
_tanks1.remove();
R2_GLOBALS._player.enableControl();
break;
case 514:
R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 1);
R2_GLOBALS.setFlag(27);
_tanks2.remove();
R2_GLOBALS._player.enableControl();
break;
case 515:
R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 0);
R2_GLOBALS.setFlag(28);
R2_GLOBALS._player.enableControl();
break;
case 521:
case 522:
R2_GLOBALS._sceneManager.changeScene(525);
break;
case 523:
case 524:
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
_sceneMode = 8;
_stripManager.start(_stripNumber, this);
break;
default:
R2_GLOBALS._player.enableControl();
break;
}
}
/*--------------------------------------------------------------------------
* Scene 525 - Cutscene - Walking in hall
*
*--------------------------------------------------------------------------*/
void Scene525::postInit(SceneObjectList *OwnerList) {
loadScene(525);
R2_GLOBALS._uiElements._active = false;
SceneExt::postInit();
R2_GLOBALS._sound1.play(105);
_actor1.postInit();
_actor1._effect = EFFECT_SHADED;
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player.disableControl();
setAction(&_sequenceManager, this, 525, &R2_GLOBALS._player, &_actor1, NULL);
}
void Scene525::signal() {
R2_GLOBALS._sceneManager.changeScene(1525);
}
/*--------------------------------------------------------------------------
* Scene 600 - Drive Room
*
*--------------------------------------------------------------------------*/
bool Scene600::CompartmentHotspot::startAction(CursorType action, Event &event) {
if ((action != R2_NEGATOR_GUN) || (!R2_GLOBALS.getFlag(5)) || (R2_GLOBALS.getFlag(8)))
return SceneHotspot::startAction(action, event);
SceneItem::display(600, 32, SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, ALIGN_CENTER,
SET_Y, 20, SET_EXT_BGCOLOR, 7, LIST_END);
return true;
}
bool Scene600::EngineCompartment::startAction(CursorType action, Event &event) {
if ((action != R2_NEGATOR_GUN) || (!R2_GLOBALS.getFlag(1)))
return SceneHotspot::startAction(action, event);
if ((R2_GLOBALS.getFlag(5)) && (!R2_GLOBALS.getFlag(8))) {
SceneItem::display(600, 32, SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, ALIGN_CENTER,
SET_Y, 20, SET_EXT_BGCOLOR, 7, LIST_END);
return true;
}
if (!R2_GLOBALS.getFlag(5)) {
SceneItem::display(600, 30, SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, ALIGN_CENTER,
SET_Y, 20, SET_EXT_BGCOLOR, 7, LIST_END);
return true;
}
if ((!R2_GLOBALS.getFlag(8)) || (R2_GLOBALS.getFlag(9)))
return SceneHotspot::startAction(action, event);
R2_GLOBALS._player.disableControl();
Scene600 *scene = (Scene600 *)R2_GLOBALS._sceneManager._scene;
scene->_stasisArea.setup(603, 3, 1, 239, 54, 10);
scene->_stasisField.postInit();
scene->_computer.postInit();
scene->_sceneMode = 612;
scene->setAction(&scene->_sequenceManager1, scene, 612, &scene->_stasisField, &scene->_computer, &R2_GLOBALS._player, NULL);
// WORKAROUND: For ScummVM, we use a SceneActor rather than BackgroundSceneObject
// for the stasis field since it doesn't work properly. We override the priority for
// the stasis field here so that the stasis field dissolve will show up
scene->_stasisField.fixPriority(12);
return true;
}
void Scene600::Smoke::signal() {
Common::Point pt(177 + R2_GLOBALS._randomSource.getRandomNumber(5),
108 + R2_GLOBALS._randomSource.getRandomNumber(3));
NpcMover *mover = new NpcMover();
addMover(mover, &pt, this);
}
bool Scene600::Smoke::startAction(CursorType action, Event &event) {
if (action >= CURSOR_WALK)
// Only action cursors
return SceneActor::startAction(action, event);
return false;
}
void Scene600::Smoke::draw() {
// Effect should always be active on smoke, but since the original had this
// check, include it here too
if (_effect == EFFECT_NONE) {
SceneActor::draw();
return;
}
// Determine the area of the screen to be updated
Rect destRect = _bounds;
destRect.translate(-g_globals->_sceneManager._scene->_sceneBounds.left,
-g_globals->_sceneManager._scene->_sceneBounds.top);
// Get the smoke frame, screen reference, and pixel palette translation map
GfxSurface frame = getFrame();
Graphics::Surface s = frame.lockSurface();
Graphics::Surface screen = g_globals->gfxManager().getSurface().lockSurface();
byte *pixelMap = static_cast<Scene600 *>(R2_GLOBALS._sceneManager._scene)->_pixelMap;
// Loop through every pixel of the frame. Any pixel of the frame that's not a
// tranparency, get the same pixel from the screen background, and shade it using
// the scene's pixel translation map
for (int yp = 0; yp < s.h; ++yp) {
byte *frameSrcP = (byte *)s.getBasePtr(0, yp);
byte *screenP = (byte *)screen.getBasePtr(destRect.left, destRect.top + yp);
for (int xp = 0; xp < s.w; ++xp, ++frameSrcP, ++screenP) {
if (*frameSrcP != frame._transColor) {
*frameSrcP = pixelMap[*screenP];
}
}
}
// Finished updating the frame
frame.unlockSurface();
g_globals->gfxManager().getSurface().unlockSurface();
// Draw the processed frame
Region *priorityRegion = g_globals->_sceneManager._scene->_priorities.find(_priority);
g_globals->gfxManager().copyFrom(frame, destRect, priorityRegion);
}
bool Scene600::Doorway::startAction(CursorType action, Event &event) {
// Only action cursors
if (action < CURSOR_WALK)
return false;
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
Scene600 *scene = (Scene600 *)R2_GLOBALS._sceneManager._scene;
if ((R2_INVENTORY.getObjectScene(R2_CLAMP) == 600) && (!R2_GLOBALS.getFlag(6))) {
R2_GLOBALS._player.disableControl();
scene->_laser.setDetails(600, 11, -1, -1, 3, (SceneItem *) NULL);
R2_GLOBALS.setFlag(6);
scene->_sceneMode = 609;
scene->setAction(&scene->_sequenceManager1, scene, 609, &R2_GLOBALS._player, &scene->_doorway, &scene->_laser, &scene->_laserBeam, NULL);
return true;
}
if (_frame != 1)
return false;
if (!R2_GLOBALS.getFlag(6)) {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 616;
scene->setAction(&scene->_sequenceManager1, scene, 616, &R2_GLOBALS._player, &scene->_doorway, &scene->_laser, NULL);
return true;
}
if ((R2_GLOBALS.getFlag(9)) && (R2_INVENTORY.getObjectScene(R2_COM_SCANNER) == 600))
SceneItem::display(600, 31, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
else {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 601;
scene->setAction(&scene->_sequenceManager1, scene, 601, &R2_GLOBALS._player, &scene->_doorway, NULL);
}
return true;
}
bool Scene600::Laser::startAction(CursorType action, Event &event) {
Scene600 *scene = (Scene600 *)R2_GLOBALS._sceneManager._scene;
if (action < CURSOR_WALK) {
switch (action) {
case R2_COM_SCANNER:
// If laser is destroyed
if (R2_GLOBALS.getFlag(6)) {
if (R2_GLOBALS.getFlag(8)) {
SceneItem::display(600, 29, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
return true;
} else {
R2_GLOBALS._player.disableControl();
scene->_scanner.postInit();
scene->_scanner.setDetails(600, 20, -1, -1, 4, &scene->_laser);
scene->_sceneMode = 607;
scene->setAction(&scene->_sequenceManager1, scene, 607, &R2_GLOBALS._player, &scene->_scanner, NULL);
return true;
}
} else {
return SceneActor::startAction(action, event);
}
break;
case R2_AEROSOL:
if (R2_GLOBALS.getFlag(5)) {
SceneItem::display(600, 28, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
return true;
} else {
R2_GLOBALS._player.disableControl();
scene->_aerosol.postInit();
scene->_aerosol.setDetails(600, 27, -1, -1, 5, &scene->_laser);
scene->_smoke.postInit();
scene->_smoke.setup(601, 3, 1);
scene->_smoke._effect = EFFECT_SMOKE;
scene->_smoke._moveDiff = Common::Point(1, 1);
scene->_smoke._moveRate = 2;
scene->_smoke._numFrames = 3;
scene->_smoke.setDetails(600, 24, 25, 26, 5, &scene->_aerosol);
scene->_sceneMode = 605;
scene->setAction(&scene->_sequenceManager1, scene, 605, &R2_GLOBALS._player, &scene->_aerosol, &scene->_smoke, &scene->_doorway, NULL);
return true;
}
break;
case R2_CLAMP:
// If cloud is active
if (R2_GLOBALS.getFlag(5)) {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 606;
scene->setAction(&scene->_sequenceManager1, scene, 606, &R2_GLOBALS._player, &scene->_laser, NULL);
return true;
} else {
return SceneActor::startAction(action, event);
}
break;
default:
return false;
break;
}
} else if (action == CURSOR_USE) {
if (R2_GLOBALS.getFlag(5)) {
return SceneActor::startAction(action, event);
} else {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 610;
scene->setAction(&scene->_sequenceManager1, scene, 610, &scene->_laserBeam, &R2_GLOBALS._player, NULL);
return true;
}
} else
return SceneActor::startAction(action, event);
}
bool Scene600::Aerosol::startAction(CursorType action, Event &event) {
// Only action cursors
if (action < CURSOR_WALK)
return false;
if (action == CURSOR_USE) {
Scene600 *scene = (Scene600 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 614;
scene->setAction(&scene->_sequenceManager1, scene, 614, &R2_GLOBALS._player, &scene->_aerosol, NULL);
return true;
} else {
return SceneActor::startAction(action, event);
}
}
/*--------------------------------------------------------------------------*/
Scene600::Scene600() {
_roomState = 0;
Common::fill(&_pixelMap[0], &_pixelMap[256], 0);
}
void Scene600::synchronize(Serializer &s) {
SceneExt::synchronize(s);
s.syncAsSint16LE(_roomState);
for (int i = 0; i < 256; i++)
s.syncAsByte(_pixelMap[i]);
}
bool Scene600::Scanner::startAction(CursorType action, Event &event) {
Scene600 *scene = (Scene600 *)R2_GLOBALS._sceneManager._scene;
if ((action == CURSOR_USE) && (R2_INVENTORY.getObjectScene(R2_COM_SCANNER) == 600)) {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 615;
scene->setAction(&scene->_sequenceManager1, scene, 615, &R2_GLOBALS._player, &scene->_scanner, NULL);
} else if ((action == R2_SONIC_STUNNER) && (R2_INVENTORY.getObjectScene(R2_COM_SCANNER) == 600) && (R2_GLOBALS._scannerFrequencies[1] == 2) && (!R2_GLOBALS.getFlag(8))){
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 608;
scene->setAction(&scene->_sequenceManager1, scene, 608, &R2_GLOBALS._player, &scene->_smoke, NULL);
} else {
return SceneActor::startAction(action, event);
}
return true;
}
void Scene600::postInit(SceneObjectList *OwnerList) {
loadScene(600);
SceneExt::postInit();
R2_GLOBALS.setFlag(39);
R2_GLOBALS._walkRegions.disableRegion(3);
_roomState = 0;
// Initialize pixel map for the obscuring effect
ScenePalette &pal = R2_GLOBALS._scenePalette;
uint r, g, b;
for (int i = 0; i < 256; ++i) {
pal.getEntry(i, &r, &g, &b);
int av = ((r + g + b) / 48);
_pixelMap[i] = R2_GLOBALS._paletteMap[(av << 8) | (av << 4) | av];
}
_doorway.postInit();
_doorway.setVisage(600);
_doorway.setPosition(Common::Point(29, 147));
_doorway.fixPriority(10);
_doorway.setDetails(300, 3, -1, -1, 1, (SceneItem *) NULL);
_laser.postInit();
_laser.setPosition(Common::Point(246, 41));
if (R2_INVENTORY.getObjectScene(R2_COM_SCANNER) == 600) {
_scanner.postInit();
_scanner.setup(602, 5, 1);
_scanner.setPosition(Common::Point(246, 41));
_scanner.setDetails(600, 20, -1, -1, 1, (SceneItem *) NULL);
switch (R2_GLOBALS._scannerFrequencies[1] - 2) {
case 0:
R2_GLOBALS._sound4.play(45);
break;
case 1:
R2_GLOBALS._sound4.play(4);
break;
case 2:
R2_GLOBALS._sound4.play(5);
break;
case 3:
R2_GLOBALS._sound4.play(6);
break;
default:
break;
}
}
if (R2_GLOBALS.getFlag(6)) {
_laser.setup(602, 7, 1);
_laser.setDetails(600, 11, -1, -1, 1, (SceneItem *) NULL);
} else {
_laser.setup(600, 2, 1);
_laser.setDetails(600, 10, -1, -1, 1, (SceneItem *) NULL);
_laserBeam.postInit();
_laserBeam.setup(600, 3, 5);
_laserBeam.setPosition(Common::Point(223, 51));
_laserBeam.fixPriority(200);
}
if (! R2_GLOBALS.getFlag(9))
_stasisArea.setup(603, 1, 1, 244, 50, 10);
if (R2_GLOBALS.getFlag(5)) {
if (R2_INVENTORY.getObjectScene(R2_AEROSOL) == 600) {
_aerosol.postInit();
_aerosol.setup(602, 2, 2);
_aerosol.setPosition(Common::Point(189, 95));
_aerosol.setDetails(600, 27, -1, -1, 1, (SceneItem *) NULL);
}
if (R2_GLOBALS.getFlag(8)) {
if (R2_GLOBALS.getFlag(9)) {
// Computer is active
_computer.postInit();
_computer.setup(603, 2, 1);
_computer.setPosition(Common::Point(233, 45));
_computer.animate(ANIM_MODE_2, NULL);
_computer.fixPriority(11);
}
} else {
_smoke.postInit();
_smoke.setup(601, 1, 1);
_smoke.setPosition(Common::Point(180, 110));
_smoke._moveDiff = Common::Point(1, 1);
_smoke._moveRate = 2;
_smoke._numFrames = 3;
_smoke.animate(ANIM_MODE_2, NULL);
_smoke.fixPriority(130);
_smoke._effect = EFFECT_SMOKE;
_smoke.setDetails(600, 24, 25, 26, 1, (SceneItem *) NULL);
_smoke.signal();
}
}
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.setVisage(10);
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player.disableControl();
_quantumRegulator.setDetails(12, 600, 17, -1, 19);
_powerNode.setDetails(11, 600, 14, -1, -1);
if (R2_GLOBALS.getFlag(9)) {
_quantumDrive.setDetails(Rect(159, 3, 315, 95), 600, 7, -1, -1, 1, NULL);
} else {
_engineCompartment.setDetails(Rect(173, 15, 315, 45), 600, 21, -1, 23, 1, NULL);
_quantumDrive.setDetails(Rect(159, 3, 315, 95), 600, 6, -1, -1, 1, NULL);
}
_background.setDetails(Rect(0, 0, 320, 200), 600, 0, -1, -1, 1, NULL);
_sceneMode = 600;
if (R2_GLOBALS._sceneManager._previousScene == 700) {
if (R2_GLOBALS.getFlag(6)) {
setAction(&_sequenceManager1, this, 600, &R2_GLOBALS._player, &_doorway, NULL);
} else if (R2_GLOBALS.getFlag(5)) {
setAction(&_sequenceManager1, this, 603, &R2_GLOBALS._player, &_doorway, &_laser, &_laserBeam, NULL);
} else {
setAction(&_sequenceManager1, this, 602, &R2_GLOBALS._player, &_doorway, &_laser, &_laserBeam, NULL);
}
} else if (R2_GLOBALS.getFlag(5)) {
R2_GLOBALS._player.setPosition(Common::Point(50, 140));
R2_GLOBALS._player.setStrip(3);
_laser.setFrame(_laser.getFrameCount());
signal();
} else {
_doorway.setFrame(7);
_laser.setFrame(7);
R2_GLOBALS._player.setPosition(Common::Point(28, 140));
R2_GLOBALS._player.setStrip(5);
signal();
}
}
void Scene600::remove() {
if (R2_INVENTORY.getObjectScene(R2_COM_SCANNER) == 600)
R2_GLOBALS._sound4.fadeOut2(NULL);
SceneExt::remove();
}
void Scene600::signal() {
switch (_sceneMode) {
case 601:
// No break on purpose
case 613:
// No break on purpose
case 616:
R2_GLOBALS._sceneManager.changeScene(700);
break;
case 605:
// After cloud is active
R2_GLOBALS._player.enableControl();
R2_GLOBALS._walkRegions.disableRegion(6);
R2_GLOBALS._walkRegions.disableRegion(7);
R2_GLOBALS._walkRegions.disableRegion(9);
R2_GLOBALS._walkRegions.disableRegion(10);
R2_INVENTORY.setObjectScene(R2_AEROSOL, 600);
R2_GLOBALS.setFlag(5);
_smoke._effect = EFFECT_SMOKE;
_smoke.signal();
break;
case 606:
// After Clamp is put on laser
R2_INVENTORY.setObjectScene(R2_CLAMP, 600);
R2_GLOBALS._player.enableControl();
break;
case 607:
// After scanner is put on laser
R2_INVENTORY.setObjectScene(R2_COM_SCANNER, 600);
R2_GLOBALS._player.enableControl();
break;
case 608:
// deactivate cloud
R2_GLOBALS.setFlag(8);
_smoke.remove();
R2_GLOBALS._walkRegions.enableRegion(6);
R2_GLOBALS._walkRegions.enableRegion(9);
R2_GLOBALS._walkRegions.enableRegion(10);
R2_GLOBALS._player.enableControl();
break;
case 612:
// Deactivate stasis field
R2_GLOBALS.setFlag(9);
_stasisField.remove();
R2_GLOBALS._sceneItems.remove(&_engineCompartment);
_computer.setDetails(600, 21, -1, 23, 4, &_engineCompartment);
_engineCompartment.setDetails(600, 7, -1, -1, 3, (SceneItem *) NULL);
_quantumDrive._lookLineNum = 7;
R2_GLOBALS._player.enableControl(CURSOR_USE);
break;
case 614:
// Pick up Aerosol
R2_GLOBALS._player.enableControl();
_aerosol.remove();
R2_INVENTORY.setObjectScene(R2_AEROSOL, 1);
R2_GLOBALS._walkRegions.enableRegion(7);
break;
case 615:
// Pick up Com Scanner
_scanner.remove();
R2_INVENTORY.setObjectScene(R2_COM_SCANNER, 1);
R2_GLOBALS._player.enableControl();
break;
default:
_roomState = 0;
_sceneMode = 0;
R2_GLOBALS._player.enableControl();
break;
}
}
void Scene600::process(Event &event) {
if (R2_GLOBALS._player._canWalk && (!R2_GLOBALS.getFlag(6)) && (event.eventType == EVENT_BUTTON_DOWN)
&& (R2_GLOBALS._events.getCursor() == CURSOR_WALK)) {
if (!_doorway.contains(event.mousePos) || (_doorway._frame <= 1)) {
if (R2_GLOBALS.getFlag(5)) {
_roomState += 10;
} else {
R2_GLOBALS._player.disableControl();
_sceneMode = 604;
setAction(&_sequenceManager1, this, 604, &_laserBeam, &R2_GLOBALS._player, NULL);
event.handled = true;
}
} else {
R2_GLOBALS._player.disableControl();
_sceneMode = 613;
setAction(&_sequenceManager1, this, 613, &R2_GLOBALS._player, &_laser, NULL);
event.handled = true;
}
} else if ((!R2_GLOBALS.getFlag(6)) && (R2_GLOBALS._player._mover) && (_roomState < 10)){
_roomState += 10;
}
Scene::process(event);
}
void Scene600::dispatch() {
if ((_roomState != 0) && (_sceneMode != 600) && (_sceneMode != 603) && (_sceneMode != 602)) {
if ( ((_laser._strip == 4) && (_laser._frame > 1))
|| (_sceneMode == 601)
|| ((_sceneMode == 616) && (_doorway._frame > 1)) )
_roomState = 0;
else {
_roomState--;
if (_roomState % 10 == 0) {
_laserBeam.setAction(&_sequenceManager2, NULL, 611, &_laserBeam, NULL);
}
if ((_roomState == 0) && (R2_GLOBALS._player._mover))
_roomState = 10;
}
}
if (_laserBeam._frame == 2)
_sound1.play(40);
Scene::dispatch();
if ((_smoke._strip == 3) && (_smoke._frame == 3)) {
_laserBeam.setStrip(4);
_laserBeam.setFrame(1);
}
}
/*--------------------------------------------------------------------------
* Scene 700 - Lander Bay 2
*
*--------------------------------------------------------------------------*/
#define CABLE700_X 26
#define CABLE700_Y -5
Scene700::Scene700() {
_rotation = NULL;
}
void Scene700::synchronize(Serializer &s) {
SceneExt::synchronize(s);
SYNC_POINTER(_rotation);
}
bool Scene700::Loft::startAction(CursorType action, Event &event) {
if ((action == CURSOR_USE) && (R2_GLOBALS._player._position.x < 100))
return false;
return NamedHotspot::startAction(action, event);
}
bool Scene700::HandGrip::startAction(CursorType action, Event &event) {
Scene700 *scene = (Scene700 *)R2_GLOBALS._sceneManager._scene;
switch (action) {
case R2_CABLE_HARNESS:
R2_GLOBALS._player.disableControl();
scene->_cable.postInit();
scene->_cable.setup(701, 3, 2);
scene->_cable.setPosition(Common::Point(243, 98));
scene->_cable.setDetails(700, 37, -1, -1, 2, (SceneItem *) NULL);
scene->_cable.hide();
scene->_sceneMode = 20;
break;
case R2_ATTRACTOR_CABLE_HARNESS:
R2_GLOBALS._player.disableControl();
scene->_cable.postInit();
scene->_cable.setup(701, 2, 8);
scene->_cable.setPosition(Common::Point(243, 98));
scene->_cable.setDetails(700, 38, -1, -1, 2, (SceneItem *) NULL);
scene->_cable.hide();
scene->_sceneMode = 21;
break;
default:
return NamedHotspot::startAction(action, event);
break;
}
scene->setAction(&scene->_sequenceManager, scene, 707, &R2_GLOBALS._player, &scene->_cable, NULL);
return true;
}
bool Scene700::LiftDoor::startAction(CursorType action, Event &event) {
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
if (R2_GLOBALS._player._position.y <= 100)
return false;
Scene700 *scene = (Scene700 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 701;
scene->setAction(&scene->_sequenceManager, scene, 701, &R2_GLOBALS._player, this, NULL);
return true;
}
bool Scene700::SuitRoomDoor::startAction(CursorType action, Event &event) {
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
if (R2_GLOBALS._player._position.y <= 100)
return false;
Scene700 *scene = (Scene700 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 702;
scene->setAction(&scene->_sequenceManager, scene, 702, &R2_GLOBALS._player, this, NULL);
return true;
}
bool Scene700::ControlPanel::startAction(CursorType action, Event &event) {
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
if (R2_GLOBALS._player._position.y <= 100)
return false;
Scene700 *scene = (Scene700 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 704;
scene->setAction(&scene->_sequenceManager, scene, 704, &R2_GLOBALS._player, this, NULL);
return true;
}
bool Scene700::Cable::startAction(CursorType action, Event &event) {
Scene700 *scene = (Scene700 *)R2_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_USE:
switch (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS)) {
case 0:
if ((_strip == 2) && (_frame == 1)) {
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS._player._position.y <= 100) {
scene->_sceneMode = 710;
scene->setAction(&scene->_sequenceManager, scene, 710, &R2_GLOBALS._player, this, NULL);
} else {
scene->_sceneMode = 709;
scene->setAction(&scene->_sequenceManager, scene, 709, &R2_GLOBALS._player, this, NULL);
}
} else {
return SceneActor::startAction(action, event);
}
break;
case 700: {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 10;
Common::Point pt(_position.x - 12, _position.y + 1);
PlayerMover *mover = new PlayerMover();
R2_GLOBALS._player.addMover(mover, &pt, scene);
}
break;
default:
break;
}
break;
case R2_ATTRACTOR_UNIT:
R2_GLOBALS._player.disableControl();
if (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) != 700) {
scene->_sceneMode = 706;
scene->setAction(&scene->_sequenceManager, scene, 706, &R2_GLOBALS._player, &scene->_cable, NULL);
} else {
scene->_sceneMode = 15;
Common::Point pt(_position.x - 12, _position.y + 1);
PlayerMover *mover = new PlayerMover();
R2_GLOBALS._player.addMover(mover, &pt, scene);
}
break;
default:
return SceneActor::startAction(action, event);
break;
}
return true;
}
bool Scene700::LoftDoor::startAction(CursorType action, Event &event) {
if ((action != CURSOR_USE) || (R2_GLOBALS._player._position.y >= 100))
return SceneActor::startAction(action, event);
Scene700 *scene = (Scene700 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 1;
Common::Point pt(_position.x, 69);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, scene);
return true;
}
void Scene700::postInit(SceneObjectList *OwnerList) {
loadScene(700);
if (R2_GLOBALS._sceneManager._previousScene == 900)
_sceneBounds = Rect(160, 0, 480, 200);
SceneExt::postInit();
_rotation = R2_GLOBALS._scenePalette.addRotation(237, 246, -1);
_rotation->setDelay(5);
_rotation->_countdown = 1;
_liftDoor.postInit();
_liftDoor.setVisage(700);
_liftDoor.setPosition(Common::Point(21, 128));
_liftDoor.fixPriority(10);
_liftDoor.setDetails(700, 3, -1, -1, 1, (SceneItem *) NULL);
_suitRoomDoor.postInit();
_suitRoomDoor.setup(700, 2, 1);
_suitRoomDoor.setPosition(Common::Point(217, 120));
_suitRoomDoor.fixPriority(10);
_suitRoomDoor.setDetails(700, 15, -1, -1, 1, (SceneItem *) NULL);
_electromagnet.postInit();
_electromagnet.setup(700, 4, 1);
_electromagnet.setPosition(Common::Point(355 - ((R2_GLOBALS._electromagnetZoom * 8) / 5), ((R2_GLOBALS._electromagnetChangeAmount + 20 ) / 5) - 12));
_electromagnet.fixPriority(10);
_electromagnet.setDetails(700, 12, -1, 14, 1, (SceneItem *) NULL);
_loftDoor1.postInit();
_loftDoor1.setup(700, 8, 1);
_loftDoor1.setPosition(Common::Point(85, 53));
_loftDoor1.setDetails(700, 33, -1, 35, 1, (SceneItem *) NULL);
_loftDoor2.postInit();
_loftDoor2.setup(700, 8, 1);
_loftDoor2.setPosition(Common::Point(164, 53));
_loftDoor2.setDetails(700, 33, -1, 35, 1, (SceneItem *) NULL);
_loftDoor3.postInit();
_loftDoor3.setup(700, 8, 1);
_loftDoor3.setPosition(Common::Point(243, 53));
_loftDoor3.setDetails(700, 33, -1, 35, 1, (SceneItem *) NULL);
_loftDoor4.postInit();
_loftDoor4.setup(700, 8, 1);
_loftDoor4.setPosition(Common::Point(324, 53));
_loftDoor4.setDetails(700, 33, -1, 35, 1, (SceneItem *) NULL);
if ((R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) != 1) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) != 1)) {
_cable.postInit();
_cable.fixPriority(10);
switch (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS)) {
case 0:
switch (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS)) {
case 0:
_cable.setup(701, 3, 2);
_cable.setPosition(Common::Point(243, 98));
_cable.setDetails(700, 37, -1, -1, 1, (SceneItem *) NULL);
break;
case 700:
_cable.setup(701, 3, 1);
_cable.setPosition(Common::Point(356 - (CABLE700_X * 8), 148 - (((CABLE700_Y + 10) / 5) * 4)));
_cable.setDetails(700, 37, -1, -1, 1, (SceneItem *) NULL);
break;
default:
break;
}
break;
case 700:
switch (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS)) {
case 0:
if (R2_GLOBALS._tractorField && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70))
_cable.setup(701, 2, 1);
else
_cable.setup(701, 2, 8);
_cable.setPosition(Common::Point(243, 98));
_cable.fixPriority(77);
_cable.setDetails(700, 38, -1, -1, 1, (SceneItem *) NULL);
break;
case 700:
_cable.setup(701, 1, 8);
if (!R2_GLOBALS._cableAttached) {
_cable.setPosition(Common::Point(356 - (CABLE700_X * 8), 148 - (((CABLE700_Y + 10) / 5) * 4)));
} else {
_cable.setup(701, 1, 1);
_cable.setPosition(Common::Point(_electromagnet._position.x + 1, _electromagnet._position.y + 120));
}
_cable.setDetails(700, 38, -1, -1, 1, (SceneItem *) NULL);
break;
default:
break;
}
default:
break;
}
}
_controlPanel.postInit();
_controlPanel.setup(700, 3, 1);
_controlPanel.setPosition(Common::Point(454, 117));
_controlPanel.setDetails(700, 27, -1, -1, 1, (SceneItem *) NULL);
_handGrip.setDetails(Rect(234, 90, 252, 110), 700, 39, -1, -1, 1, NULL);
_restraintCollar.setDetails(Rect(91, 158, 385, 167), 700, 6, -1, 8, 1, NULL);
_debris1.setDetails(Rect(47, 115, 149, 124), 700, 40, -1, 41, 1, NULL);
_debris2.setDetails(Rect(151, 108, 187, 124), 700, 40, -1, 41, 1, NULL);
_debris3.setDetails(Rect(247, 108, 275, 124), 700, 40, -1, 41, 1, NULL);
_debris4.setDetails(Rect(300, 105, 321, 124), 700, 40, -1, 41, 1, NULL);
_storage2.setDetails(Rect(255, 74, 368, 115), 700, 9, -1, 11, 1, NULL);
_storage1.setDetails(Rect(69, 74, 182, 115), 700, 9, -1, 11, 1, NULL);
_stars.setDetails(Rect(370, 58, 475, 103), 700, 18, -1, -1, 1, NULL);
_light.setDetails(Rect(17, 11, 393, 31), 700, 24, -1, -1, 1, NULL);
_loft.setDetails(Rect(42, 32, 368, 66), 700, 30, -1, 32, 1, NULL);
_background.setDetails(Rect(0, 0, 480, 200), 700, 0, -1, -1, 1, NULL);
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.setVisage(11);
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player._moveDiff.x = 2;
R2_GLOBALS._player.disableControl();
R2_GLOBALS._sound1.play(34);
_sceneMode = 700;
switch (R2_GLOBALS._sceneManager._previousScene) {
case 250:
setAction(&_sequenceManager, this, 700, &R2_GLOBALS._player, &_liftDoor, NULL);
break;
case 500:
setAction(&_sequenceManager, this, 703, &R2_GLOBALS._player, &_suitRoomDoor, NULL);
break;
case 600: {
_sceneMode = 4;
_loftDoor2.setFrame(5);
R2_GLOBALS._player.setPosition(Common::Point(164, 74));
R2_GLOBALS._player.setStrip2(3);
Common::Point pt(164, 69);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
}
break;
case 900:
setAction(&_sequenceManager, this, 705, &R2_GLOBALS._player, &_controlPanel, NULL);
break;
default:
if (R2_GLOBALS.getFlag(41))
R2_GLOBALS._player.setPosition(Common::Point(107, 67));
else
R2_GLOBALS._player.setPosition(Common::Point(60, 140));
R2_GLOBALS._player.setStrip(3);
R2_GLOBALS._player.enableControl(CURSOR_ARROW);
break;
}
}
void Scene700::remove() {
R2_GLOBALS._sound1.play(10);
SceneExt::remove();
}
void Scene700::signal() {
switch (_sceneMode) {
case 1:
_sceneMode = 2;
R2_GLOBALS._player.setStrip(4);
if (R2_GLOBALS._player._position.x != 164) {
SceneItem::display(700, 36, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
R2_GLOBALS._player.enableControl();
} else {
R2_GLOBALS._sound2.play(19);
_loftDoor2.animate(ANIM_MODE_5, this);
}
break;
case 2: {
_sceneMode = 3;
R2_GLOBALS._player.setStrip2(4);
Common::Point pt(R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y + 5);
NpcMover *mover = new NpcMover();
R2_GLOBALS._player.addMover(mover, &pt, this);
}
break;
case 3:
R2_GLOBALS._sceneManager.changeScene(600);
break;
case 4:
_sceneMode = 5;
R2_GLOBALS._player.setStrip2(-1);
R2_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
R2_GLOBALS._sound2.play(19);
_loftDoor2.animate(ANIM_MODE_6, this);
R2_GLOBALS._player.setStrip(3);
R2_GLOBALS.setFlag(41);
break;
case 10:
_sceneMode = 11;
R2_GLOBALS._player.setup(16, 7, 1);
R2_GLOBALS._player.changeZoom(50);
R2_GLOBALS._player.animate(ANIM_MODE_5, this);
break;
case 11:
_sceneMode = 12;
_cable.remove();
R2_GLOBALS._player.animate(ANIM_MODE_6, this);
break;
case 12:
R2_GLOBALS._player.setVisage(11);
R2_GLOBALS._player.changeZoom(100);
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
R2_GLOBALS._player._strip = 7;
if (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_UNIT) == 0) {
R2_INVENTORY.setObjectScene(R2_ATTRACTOR_CABLE_HARNESS, 1);
R2_INVENTORY.setObjectScene(R2_CABLE_HARNESS, 0);
} else {
R2_INVENTORY.setObjectScene(R2_CABLE_HARNESS, 1);
}
R2_GLOBALS._player.enableControl();
break;
case 15:
_sceneMode = 16;
R2_GLOBALS._player.setup(16, 7, 1);
R2_GLOBALS._player.changeZoom(50);
R2_GLOBALS._player.animate(ANIM_MODE_5, this);
break;
case 16:
_sceneMode = 17;
_cable.setup(701, 1, 8);
_cable.setDetails(700, 38, -1, -1, 3, (SceneItem *) NULL);
if (R2_GLOBALS._tractorField && (_cable._position.x == _electromagnet._position.x + 1) && (_cable._position.x == 148 - (((R2_GLOBALS._electromagnetChangeAmount + 10) / 5) * 4))) {
_cable.animate(ANIM_MODE_6, NULL);
Common::Point pt(_cable._position.x, _electromagnet._position.y + 120);
NpcMover *mover = new NpcMover();
_cable.addMover(mover, &pt, NULL);
R2_GLOBALS._cableAttached = true;
}
R2_GLOBALS._player.animate(ANIM_MODE_6, this);
break;
case 17:
R2_INVENTORY.setObjectScene(R2_ATTRACTOR_UNIT, 0);
R2_INVENTORY.setObjectScene(R2_ATTRACTOR_CABLE_HARNESS, 700);
R2_GLOBALS._player.setVisage(11);
R2_GLOBALS._player.changeZoom(100);
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
R2_GLOBALS._player._strip = 7;
R2_GLOBALS._player.enableControl();
break;
case 20:
R2_INVENTORY.setObjectScene(R2_CABLE_HARNESS, 0);
R2_GLOBALS._player.enableControl();
break;
case 21:
_cable.fixPriority(77);
if (R2_GLOBALS._tractorField && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70))
_cable.animate(ANIM_MODE_6, NULL);
R2_INVENTORY.setObjectScene(R2_ATTRACTOR_CABLE_HARNESS, 700);
R2_GLOBALS._player.enableControl();
break;
case 701:
R2_GLOBALS._sceneManager.changeScene(250);
break;
case 702:
R2_GLOBALS._sceneManager.changeScene(500);
break;
case 704:
R2_GLOBALS._sceneManager.changeScene(900);
break;
case 706:
_cable.setDetails(700, 38, -1, -1, 3, (SceneItem *) NULL);
_cable.fixPriority(77);
if (R2_GLOBALS._tractorField && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70))
_cable.animate(ANIM_MODE_6, NULL);
R2_INVENTORY.setObjectScene(R2_ATTRACTOR_UNIT, 0);
R2_INVENTORY.setObjectScene(R2_ATTRACTOR_CABLE_HARNESS, 700);
R2_GLOBALS._player.enableControl();
break;
case 709:
R2_GLOBALS.setFlag(41);
R2_GLOBALS._player.enableControl();
break;
case 710:
R2_GLOBALS.clearFlag(41);
R2_GLOBALS._player.enableControl();
break;
case 5:
// No break on purpose
default:
R2_GLOBALS._player.enableControl();
break;
}
}
/*--------------------------------------------------------------------------
* Scene 800 - Sick Bay
*
*--------------------------------------------------------------------------*/
bool Scene800::Button::startAction(CursorType action, Event &event) {
if (action != CURSOR_USE) {
return NamedHotspot::startAction(action, event);
} else {
Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 802;
scene->setAction(&scene->_sequenceManager1, scene, 802, &R2_GLOBALS._player, &scene->_autodocCover, NULL);
return true;
}
}
bool Scene800::CableJunction::startAction(CursorType action, Event &event) {
if (action != R2_OPTICAL_FIBER) {
return NamedHotspot::startAction(action, event);
} else {
Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_opticalFiber.postInit();
scene->_sceneMode = 803;
if (R2_INVENTORY.getObjectScene(R2_READER) == 800)
scene->setAction(&scene->_sequenceManager1, scene, 813, &R2_GLOBALS._player, &scene->_opticalFiber, &scene->_reader, NULL);
else
scene->setAction(&scene->_sequenceManager1, scene, 803, &R2_GLOBALS._player, &scene->_opticalFiber, NULL);
return true;
}
}
bool Scene800::DeviceSlot::startAction(CursorType action, Event &event) {
Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_USE:
if (R2_INVENTORY.getObjectScene(R2_READER) != 800)
break;
R2_GLOBALS._player.disableControl();
_lookLineNum = 27;
scene->_sceneMode = 809;
if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) == 800)
scene->setAction(&scene->_sequenceManager1, scene, 815, &R2_GLOBALS._player, &scene->_reader, &scene->_opticalFiber, NULL);
else
scene->setAction(&scene->_sequenceManager1, scene, 809, &R2_GLOBALS._player, &scene->_reader, NULL);
return true;
case R2_READER:
R2_GLOBALS._player.disableControl();
scene->_reader.postInit();
scene->_sceneMode = 804;
if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) == 800) {
scene->setAction(&scene->_sequenceManager1, scene, 814, &R2_GLOBALS._player,
&scene->_reader, &scene->_opticalFiber, NULL);
} else {
scene->setAction(&scene->_sequenceManager1, scene, 804, &R2_GLOBALS._player,
&scene->_reader, NULL);
}
return true;
default:
break;
}
return NamedHotspot::startAction(action, event);
}
/*--------------------------------------------------------------------------*/
bool Scene800::Door::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE: {
Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 801;
scene->setAction(&scene->_sequenceManager1, scene, 801, &R2_GLOBALS._player, &scene->_door, NULL);
return true;
}
default:
return SceneActor::startAction(action, event);
}
}
bool Scene800::Tray::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE: {
Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
if (!R2_GLOBALS.getFlag(10)) {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 806;
scene->setAction(&scene->_sequenceManager1, scene, 806, &R2_GLOBALS._player, &scene->_tray, NULL);
} else if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 825) {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 808;
scene->setAction(&scene->_sequenceManager1, scene, 808, &R2_GLOBALS._player, &scene->_tray, NULL);
} else {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 807;
scene->setAction(&scene->_sequenceManager1, scene, 807, &R2_GLOBALS._player, &scene->_tray, NULL);
}
return true;
}
default:
return SceneActor::startAction(action, event);
}
}
bool Scene800::ComScanner::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE: {
Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
if (scene->_cabinet._frame == 1)
return false;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 811;
scene->setAction(&scene->_sequenceManager1, scene, 811, &R2_GLOBALS._player, &scene->_comScanner, NULL);
return true;
}
case CURSOR_TALK:
SceneItem::display2(800, 35);
return true;
default:
return SceneActor::startAction(action, event);
}
}
bool Scene800::Cabinet::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE: {
Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
if (scene->_cabinet._frame == 1) {
scene->_sceneMode = 810;
scene->setAction(&scene->_sequenceManager1, scene, 810, &R2_GLOBALS._player, &scene->_cabinet, NULL);
R2_GLOBALS.setFlag(56);
} else {
scene->_sceneMode = 812;
scene->setAction(&scene->_sequenceManager1, scene, 812, &R2_GLOBALS._player, &scene->_cabinet, NULL);
R2_GLOBALS.clearFlag(56);
}
return true;
}
default:
return SceneActor::startAction(action, event);
}
}
/*--------------------------------------------------------------------------*/
void Scene800::postInit(SceneObjectList *OwnerList) {
loadScene(800);
SceneExt::postInit();
_door.postInit();
_door.setVisage(800);
_door.setPosition(Common::Point(286, 108));
_door.fixPriority(50);
_door.setDetails(800, 3, -1, -1, 1, (SceneItem *)NULL);
_autodocCover.postInit();
_autodocCover.setup(800, 2, 1);
_autodocCover.setPosition(Common::Point(119, 161));
_autodocCover.setDetails(800, 6, 7, -1, 1, (SceneItem *)NULL);
if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) == 800) {
_opticalFiber.postInit();
if (R2_INVENTORY.getObjectScene(R2_READER) == 800)
_opticalFiber.setup(800, 4, 1);
else
_opticalFiber.setup(800, 7, 2);
_opticalFiber.setPosition(Common::Point(220, 124));
_opticalFiber.fixPriority(140);
}
if (R2_INVENTORY.getObjectScene(R2_READER) == 800) {
_reader.postInit();
if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) == 800) {
_opticalFiber.setup(800, 4, 1);
_reader.hide();
} else {
_reader.setup(800, 7, 1);
}
_reader.setPosition(Common::Point(230, 120));
_reader.fixPriority(140);
}
_cabinet.postInit();
_cabinet.setup(801, 1, R2_GLOBALS.getFlag(56) ? 6 : 1);
_cabinet.setPosition(Common::Point(169, 79));
_cabinet.setDetails(800, 41, -1, -1, 1, (SceneItem *)NULL);
if (R2_INVENTORY.getObjectScene(R2_COM_SCANNER) == 800) {
_comScanner.postInit();
_comScanner.setup(801, 2, 1);
_comScanner.setPosition(Common::Point(174, 73));
_comScanner.setDetails(800, 34, 35, -1, 1, (SceneItem *)NULL);
}
_tray.postInit();
_tray.setup(800, R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 825 ? 6 : 5, 1);
if (R2_GLOBALS.getFlag(10))
_tray.setFrame(5);
_tray.setPosition(Common::Point(203, 144));
_tray.setDetails(800, 12, -1, 14, 1, (SceneItem *)NULL);
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.setVisage(10);
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player.disableControl();
_dataConduits.setDetails(13, 800, 21, -1, -1);
_cableJunction.setDetails(Rect(206, 111, 223, 125), 800, 24, -1, -1, 1, NULL);
_deviceSlot.setDetails(Rect(220, 108, 239, 122), 800, 27, -1, -1, 1, NULL);
_diskSlot.setDetails(Rect(209, 124, 226, 133), 800, 9, -1, 11, 1, NULL);
if (R2_INVENTORY.getObjectScene(R2_READER) == 800)
_deviceSlot._lookLineNum = 33;
_button.setDetails(Rect(189, 112, 204, 124), 800, 30, -1, -1, 1, NULL);
_couch.setDetails(11, 800, 15, -1, 17);
_autoDoc.setDetails(Rect(152, 92, 247, 151), 800, 6, 7, -1, 1, NULL);
_medicalDatabase.setDetails(12, 800, 18, -1, -1);
_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 800, 0, -1, -1, 1, NULL);
switch (R2_GLOBALS._sceneManager._previousScene) {
case 825:
_sceneMode = 800;
setAction(&_sequenceManager1, this, 805, &R2_GLOBALS._player, &_autodocCover, NULL);
break;
case 850:
_sceneMode = 800;
setAction(&_sequenceManager1, this, 800, &R2_GLOBALS._player, &_door, NULL);
break;
default:
R2_GLOBALS._player.setStrip(3);
R2_GLOBALS._player.setPosition(Common::Point(277, 132));
R2_GLOBALS._player.enableControl();
break;
}
}
void Scene800::signal() {
switch (_sceneMode) {
case 801:
R2_GLOBALS._sceneManager.changeScene(850);
break;
case 802:
R2_GLOBALS._sceneManager.changeScene(825);
break;
case 803:
R2_GLOBALS._player.enableControl();
R2_INVENTORY.setObjectScene(R2_OPTICAL_FIBER, 800);
break;
case 804:
R2_GLOBALS._player.enableControl();
_deviceSlot._lookLineNum = 33;
R2_INVENTORY.setObjectScene(R2_READER, 800);
break;
case 806:
R2_GLOBALS._player.enableControl();
R2_GLOBALS.setFlag(10);
break;
case 807:
R2_GLOBALS._player.enableControl();
R2_GLOBALS.clearFlag(10);
break;
case 808:
R2_GLOBALS._player.enableControl();
R2_INVENTORY.setObjectScene(R2_OPTO_DISK, 1);
break;
case 809:
R2_GLOBALS._player.enableControl();
R2_INVENTORY.setObjectScene(R2_READER, 1);
break;
case 811:
R2_GLOBALS._player.enableControl();
_comScanner.remove();
R2_INVENTORY.setObjectScene(R2_COM_SCANNER, 1);
break;
default:
R2_GLOBALS._player.enableControl();
break;
}
}
/*--------------------------------------------------------------------------
* Scene 825 - Autodoc
*
*--------------------------------------------------------------------------*/
Scene825::Button::Button(): SceneObject() {
_buttonId = 0;
_buttonDown = false;
}
void Scene825::Button::synchronize(Serializer &s) {
SceneObject::synchronize(s);
s.syncAsSint16LE(_buttonId);
s.syncAsSint16LE(_buttonDown);
}
void Scene825::Button::process(Event &event) {
if (!event.handled) {
Scene825 *scene = (Scene825 *)R2_GLOBALS._sceneManager._scene;
if ((event.eventType == EVENT_BUTTON_DOWN) && _bounds.contains(event.mousePos) && !_buttonDown) {
scene->_sound1.play(14);
setFrame(2);
_buttonDown = true;
event.handled = true;
}
if ((event.eventType == EVENT_BUTTON_UP) && _buttonDown) {
setFrame(1);
_buttonDown = false;
event.handled = true;
scene->doButtonPress(_buttonId);
}
}
}
bool Scene825::Button::startAction(CursorType action, Event &event) {
if (action == CURSOR_USE)
return false;
else
return SceneObject::startAction(action, event);
}
void Scene825::Button::setButton(int buttonId) {
SceneObject::postInit();
_buttonDown = 0;
_sceneText._color1 = 92;
_sceneText._color2 = 0;
_sceneText._width = 200;
_sceneText.fixPriority(20);
_sceneText._fontNumber = 50;
switch (buttonId) {
case 1:
_sceneText.setPosition(Common::Point(95, 58));
break;
case 2:
_sceneText.setPosition(Common::Point(98, 75));
break;
case 3:
_sceneText.setPosition(Common::Point(102, 95));
break;
case 4:
_sceneText.setPosition(Common::Point(180, 58));
_sceneText._textMode = ALIGN_RIGHT;
break;
case 5:
_sceneText.setPosition(Common::Point(177, 75));
_sceneText._textMode = ALIGN_RIGHT;
break;
case 6:
_sceneText.setPosition(Common::Point(175, 95));
_sceneText._textMode = ALIGN_RIGHT;
break;
default:
break;
}
setDetails(825, 6, 7, -1, 2, (SceneItem *)NULL);
}
void Scene825::Button::setText(int textId) {
_buttonId = textId;
_lookLineNum = textId;
_sceneText.remove();
if (textId != 0) {
Scene825 *scene = (Scene825 *)R2_GLOBALS._sceneManager._scene;
_sceneText.setup(scene->_autodocItems[textId - 1]);
}
}
/*--------------------------------------------------------------------------*/
Scene825::Scene825(): SceneExt() {
_menuId = _frame1 = _frame2 = 0;
// Setup Autodoc items list
_autodocItems[0] = MAIN_MENU;
_autodocItems[1] = DIAGNOSIS;
_autodocItems[2] = ADVANCED_PROCEDURES;
_autodocItems[3] = VITAL_SIGNS;
_autodocItems[4] = OPEN_DOOR;
_autodocItems[5] = TREATMENTS;
_autodocItems[6] = NO_MALADY_DETECTED;
_autodocItems[7] = NO_TREATMENT_REQUIRED;
_autodocItems[8] = ACCESS_CODE_REQUIRED;
_autodocItems[9] = INVALID_ACCESS_CODE;
_autodocItems[10] = FOREIGN_OBJECT_EXTRACTED;
}
void Scene825::postInit(SceneObjectList *OwnerList) {
loadScene(825);
R2_GLOBALS._uiElements._active = false;
SceneExt::postInit();
R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
R2_GLOBALS._player.postInit();
R2_GLOBALS._player._effect = EFFECT_NONE;
R2_GLOBALS._player.setVisage(10);
R2_GLOBALS._player.hide();
R2_GLOBALS._player.disableControl();
_console.setDetails(1, 825, 3, 4, 5);
_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 825, 0, -1, -1, 1, NULL);
_sceneMode = 10;
signal();
}
void Scene825::synchronize(Serializer &s) {
SceneExt::synchronize(s);
s.syncAsSint16LE(_menuId);
s.syncAsSint16LE(_frame1);
s.syncAsSint16LE(_frame2);
}
void Scene825::remove() {
SceneExt::remove();
R2_GLOBALS._player._uiEnabled = true;
}
void Scene825::signal() {
switch (_sceneMode) {
case 10:
_button1.setButton(1);
_button1.setup(825, 1, 1);
_button1.setPosition(Common::Point(71, 71));
_button2.setButton(2);
_button2.setup(825, 3, 1);
_button2.setPosition(Common::Point(74, 90));
_button3.setButton(3);
_button3.setup(825, 5, 1);
_button3.setPosition(Common::Point(78, 109));
_button4.setButton(4);
_button4.setup(825, 2, 1);
_button4.setPosition(Common::Point(248, 71));
_button5.setButton(5);
_button5.setup(825, 4, 1);
_button5.setPosition(Common::Point(245, 90));
_button6.setButton(6);
_button6.setup(825, 6, 1);
_button6.setPosition(Common::Point(241, 109));
doButtonPress(1);
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
break;
case 825:
_vertLine5.remove();
_sceneText._color1 = 92;
_sceneText._color2 = 0;
_sceneText._width = 200;
_sceneText.fixPriority(20);
_sceneText._fontNumber = 50;
_sceneText.setPosition(Common::Point(120, 75));
_sceneText.setup(NO_MALADY_DETECTED);
_sceneMode = 826;
setAction(&_sequenceManager1, this, 826, &R2_GLOBALS._player, NULL);
break;
case 826:
_sceneText.remove();
doButtonPress(1);
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
break;
case 827:
_vertLine5.remove();
R2_INVENTORY.setObjectScene(R2_OPTO_DISK, 825);
_sceneText.setPosition(Common::Point(108, 75));
_sceneText.setup(FOREIGN_OBJECT_EXTRACTED);
_sceneMode = 826;
setAction(&_sequenceManager1, this, 826, &R2_GLOBALS._player, NULL);
break;
default:
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
break;
}
}
void Scene825::process(Event &event) {
SceneExt::process(event);
if (R2_GLOBALS._player._uiEnabled) {
_button1.process(event);
_button2.process(event);
_button3.process(event);
_button4.process(event);
_button5.process(event);
_button6.process(event);
}
}
void Scene825::dispatch() {
if (R2_GLOBALS._sceneObjects->contains(&_vertLine4) &&
((_vertLine4._frame == 1) || (_vertLine4._frame == 3)) &&
(_vertLine4._frame != _frame1)) {
_sound2.play(25);
}
if (R2_GLOBALS._sceneObjects->contains(&_vertLine1) &&
(_vertLine1._frame == 3) && (_vertLine1._frame != _frame2)) {
_sound3.play(26);
}
_frame1 = _vertLine4._frame;
_frame2 = _vertLine1._frame;
Scene::dispatch();
}
void Scene825::doButtonPress(int buttonId) {
if ((_menuId != 4) || (buttonId == 5)) {
_button1.setText(0);
_button2.setText(0);
_button3.setText(0);
_button4.setText(0);
_button5.setText(0);
_button6.setText(0);
switch (buttonId) {
case 2:
R2_GLOBALS._player.disableControl();
_vertLine5.postInit();
_sceneMode = 825;
setAction(&_sequenceManager1, this, 825, &R2_GLOBALS._player, &_vertLine5, NULL);
break;
case 3:
R2_GLOBALS._player.disableControl();
_sceneText._color1 = 92;
_sceneText._color2 = 0;
_sceneText._width = 200;
_sceneText.fixPriority(20);
_sceneText._fontNumber = 50;
_sceneText.setPosition(Common::Point(115, 75));
if (R2_GLOBALS.getFlag(4)) {
if ((R2_INVENTORY.getObjectScene(R2_READER) != 800) ||
(R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) != 800)) {
_sceneText.setPosition(Common::Point(116, 75));
_sceneText.setup(ACCESS_CODE_REQUIRED);
} else if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) != 800) {
_sceneText.setPosition(Common::Point(115, 75));
_sceneText.setup(NO_TREATMENT_REQUIRED);
} else {
_button6._buttonId = 5;
_sceneMode = 827;
_vertLine5.postInit();
setAction(&_sequenceManager1, this, 827, &_vertLine5, NULL);
}
} else {
R2_GLOBALS.setFlag(2);
if ((R2_INVENTORY.getObjectScene(R2_READER) != 800) ||
(R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) != 800)) {
_sceneText.setPosition(Common::Point(116, 75));
_sceneText.setup(ACCESS_CODE_REQUIRED);
} else {
_sceneText.setPosition(Common::Point(119, 75));
_sceneText.setup(INVALID_ACCESS_CODE);
}
}
if (_sceneMode != 827) {
_sceneMode = 826;
setAction(&_sequenceManager1, this, 826, &R2_GLOBALS._player, NULL);
}
break;
case 4:
_sound4.play(27);
_button6._buttonId = 5;
_vertLine1.postInit();
_vertLine1.setup(826, 7, 1);
_vertLine1.setPosition(Common::Point(112, 67));
_vertLine1._numFrames = 1;
_vertLine1.animate(ANIM_MODE_2);
_vertLine2.postInit();
_vertLine2.setup(826, 5, 1);
_vertLine2.setPosition(Common::Point(158, 67));
_vertLine2._numFrames = 5;
_vertLine2.animate(ANIM_MODE_2);
_vertLine3.postInit();
_vertLine3.setup(826, 6, 1);
_vertLine3.setPosition(Common::Point(206, 67));
_vertLine3._numFrames = 1;
_vertLine3.animate(ANIM_MODE_2);
_vertLine4.postInit();
_vertLine4.setup(826, 8, 1);
_vertLine4.setPosition(Common::Point(158, 84));
_vertLine4._numFrames = 1;
_vertLine4.animate(ANIM_MODE_2);
_vertLine5.postInit();
_vertLine5.setup(826, 4, 1);
_vertLine5.setPosition(Common::Point(161, 110));
break;
case 5:
R2_GLOBALS._player.disableControl();
if (_menuId == 4) {
_menuId = 0;
_vertLine1.remove();
_vertLine2.remove();
_vertLine3.remove();
_vertLine4.remove();
_vertLine5.remove();
_sound2.stop();
_sound3.stop();
_sound4.stop();
doButtonPress(1);
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
} else {
R2_GLOBALS._sceneManager.changeScene(800);
}
break;
case 6:
R2_GLOBALS._player.disableControl();
_sceneText._color1 = 92;
_sceneText._color2 = 0;
_sceneText._width = 200;
_sceneText.fixPriority(20);
_sceneText._fontNumber = 50;
_sceneText.setPosition(Common::Point(115, 75));
_sceneText.setup(NO_TREATMENT_REQUIRED);
_sceneMode = 826;
setAction(&_sequenceManager1, this, 826, &R2_GLOBALS._player, NULL);
break;
default:
_button1.setText(2);
_button2.setText(3);
_button3.setText(4);
_button4.setText(6);
_button6.setText(5);
break;
}
_menuId = buttonId;
}
}
/*--------------------------------------------------------------------------
* Scene 850 - Deck #5 - By Lift
*
*--------------------------------------------------------------------------*/
bool Scene850::Indicator::startAction(CursorType action, Event &event) {
if ((action != CURSOR_USE) || (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) != 850))
return NamedHotspot::startAction(action, event);
else {
Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 851;
scene->setAction(&scene->_sequenceManager1, scene, 851, &R2_GLOBALS._player, &scene->_fiber, NULL);
return true;
}
}
/*--------------------------------------------------------------------------*/
bool Scene850::LiftDoor::startAction(CursorType action, Event &event) {
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
else {
Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 202;
scene->setAction(&scene->_sequenceManager1, scene, 202, &R2_GLOBALS._player, this, NULL);
return true;
}
}
bool Scene850::SickBayDoor::startAction(CursorType action, Event &event) {
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
else {
Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 204;
scene->setAction(&scene->_sequenceManager1, scene, 204, &R2_GLOBALS._player, this, NULL);
return true;
}
}
bool Scene850::Clamp::startAction(CursorType action, Event &event) {
if (!R2_GLOBALS.getFlag(7))
return false;
else if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
else {
Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_spark.postInit();
scene->_sceneMode = 850;
scene->setAction(&scene->_sequenceManager1, scene, 850, &R2_GLOBALS._player, this,
&scene->_spark, NULL);
return true;
}
}
bool Scene850::Panel::startAction(CursorType action, Event &event) {
if ((action != CURSOR_USE) || R2_GLOBALS.getFlag(7))
return SceneActor::startAction(action, event);
else {
Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 852;
scene->setAction(&scene->_sequenceManager1, scene, 852, &R2_GLOBALS._player,
this, &scene->_spark, NULL);
return true;
}
}
/*--------------------------------------------------------------------------*/
void Scene850::postInit(SceneObjectList *OwnerList) {
loadScene(850);
SceneExt::postInit();
_liftDoor.postInit();
_liftDoor.setup(850, 2, 1);
_liftDoor.setPosition(Common::Point(188, 79));
_liftDoor.setDetails(850, 3, -1, -1, 1, (SceneItem *)NULL);
_sickBayDoor.postInit();
_sickBayDoor.setup(850, 3, 1);
_sickBayDoor.setPosition(Common::Point(62, 84));
_sickBayDoor.setDetails(850, 9, -1, -1, 1, (SceneItem *)NULL);
if (R2_INVENTORY.getObjectScene(R2_CLAMP) == 850) {
_clamp.postInit();
_clamp.setup(850, 5, 1);
_clamp.setPosition(Common::Point(242, 93));
_clamp.fixPriority(81);
_clamp.animate(ANIM_MODE_2, NULL);
_clamp.setDetails(850, 27, -1, -1, 1, (SceneItem *)NULL);
}
_panel.postInit();
_panel.setVisage(850);
if (R2_GLOBALS.getFlag(7))
_panel.setFrame(7);
_panel.setPosition(Common::Point(232, 119));
_panel.fixPriority(82);
_panel.setDetails(850, 24, -1, -1, 1, (SceneItem *)NULL);
if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) == 850) {
_fiber.postInit();
_fiber.setup(850, 6, 1);
_fiber.setPosition(Common::Point(280, 87));
}
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.setVisage(10);
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player.disableControl();
_eastDoor.setDetails(Rect(289, 53, 315, 125), 850, 6, -1, 8, 1, NULL);
_indicator.setDetails(Rect(275, 67, 286, 79), 850, 18, -1, 20, 1, NULL);
_sickBayIndicator.setDetails(Rect(41, 51, 48, 61), 850, 15, -1, -1, 1, NULL);
_liftControls.setDetails(Rect(156, 32, 166, 44), 850, 21, -1, -1, 1, NULL);
_compartment.setDetails(Rect(4, 88, 153, 167), 850, 12, -1, -1, 1, NULL);
_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 850, 0, -1, -1, 1, NULL);
switch (R2_GLOBALS._sceneManager._previousScene) {
case 250:
_sceneMode = 203;
setAction(&_sequenceManager1, this, 203, &R2_GLOBALS._player, &_liftDoor, NULL);
break;
case 800:
_sceneMode = 205;
setAction(&_sequenceManager1, this, 205, &R2_GLOBALS._player, &_sickBayDoor, NULL);
break;
default:
R2_GLOBALS._player.setStrip(3);
R2_GLOBALS._player.setPosition(Common::Point(215, 115));
R2_GLOBALS._player.enableControl();
break;
}
}
void Scene850::signal() {
switch (_sceneMode) {
case 202:
R2_GLOBALS._sceneManager.changeScene(250);
break;
case 204:
R2_GLOBALS._sceneManager.changeScene(800);
break;
case 850:
R2_INVENTORY.setObjectScene(R2_CLAMP, 1);
_clamp.remove();
_spark.remove();
R2_GLOBALS._player.enableControl();
break;
case 851:
R2_INVENTORY.setObjectScene(R2_OPTICAL_FIBER, 1);
_fiber.remove();
R2_GLOBALS._player.enableControl();
break;
case 852:
R2_GLOBALS.setFlag(7);
R2_GLOBALS._player.enableControl();
break;
default:
R2_GLOBALS._player.enableControl();
break;
}
}
/*--------------------------------------------------------------------------
* Scene 900 - Lander Bay 2 - Crane Controls
*
*--------------------------------------------------------------------------*/
Scene900::Button::Button() {
_buttonId = 0;
}
void Scene900::Button::synchronize(Serializer &s) {
SceneActor::synchronize(s);
s.syncAsSint16LE(_buttonId);
}
void Scene900::Button::initButton(int buttonId) {
_buttonId = buttonId;
postInit();
setDetails(900, -1, -1, -1, 2, (SceneItem *) NULL);
}
Scene900::Scene900() {
_controlsScreenNumber = 0;
_magnetChangeAmount.x = 0;
_magnetChangeAmount.y = 0;
}
void Scene900::synchronize(Serializer &s) {
SceneExt::synchronize(s);
s.syncAsSint16LE(_controlsScreenNumber);
s.syncAsSint16LE(_magnetChangeAmount.x);
s.syncAsSint16LE(_magnetChangeAmount.y);
}
bool Scene900::Button::startAction(CursorType action, Event &event) {
Scene900 *scene = (Scene900 *)R2_GLOBALS._sceneManager._scene;
if (action == CURSOR_USE) {
R2_GLOBALS._sound2.play(14);
switch (_buttonId) {
case 2:
if (scene->_controlsScreenNumber == 1) {
scene->_sceneMode = 2;
scene->signal();
} else if (scene->_controlsScreenNumber == 2) {
if (!R2_GLOBALS._tractorField) {
scene->_aSound1.play(30);
setup(900, 3, 11);
R2_GLOBALS._tractorField = true;
if ((R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 0) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS == 700)) && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70) && (scene->_cable._animateMode != ANIM_MODE_6)) {
scene->_cable.animate(ANIM_MODE_6, NULL);
} else {
if (((scene->_electromagnet._percent * 49) / 100) + scene->_electromagnet._position.x == scene->_cable._position.x) {
if (scene->_cable._position.x == 166 - (R2_GLOBALS._electromagnetZoom / 15)) {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 4;
scene->_cable._moveDiff.y = (scene->_cable._position.y - (scene->_electromagnet._position.y + ((scene->_electromagnet._percent * 3) / 10) - 2)) / 9;
Common::Point pt(scene->_electromagnet._position.x + ((scene->_electromagnet._percent * 49) / 100), scene->_electromagnet._position.y + ((scene->_electromagnet._percent * 3) / 10) - 2);
NpcMover *mover = new NpcMover();
scene->_cable.addMover(mover, &pt, this);
scene->_cable.animate(ANIM_MODE_6, NULL);
}
}
}
} else {
scene->_aSound1.play(53);
setup(900, 3, 9);
R2_GLOBALS._tractorField = false;
if ((R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 0) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) == 700) && (scene->_cable._frame < 8) && (scene->_cable._animateMode != ANIM_MODE_5)) {
scene->_cable.animate(ANIM_MODE_5, NULL);
} else if ((R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 700) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) == 700) && (scene->_cable._frame < 8)) {
R2_GLOBALS._cableAttached = false;
if (scene->_cable._animateMode != 5) {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 5;
scene->_cable.animate(ANIM_MODE_5, NULL);
scene->_cable._moveDiff.y = (166 - scene->_cable._position.y) / 9;
Common::Point pt(scene->_cable._position.x, 166 - (R2_GLOBALS._electromagnetZoom / 15));
NpcMover *mover = new NpcMover();
scene->_cable.addMover(mover, &pt, this);
}
}
}
}
return true;
break;
case 3:
if (scene->_controlsScreenNumber == 1) {
scene->_sceneMode = 3;
scene->signal();
}
return true;
break;
case 4:
if ((scene->_magnetChangeAmount.y == 0) && (scene->_magnetChangeAmount.x == 0) && (R2_GLOBALS._electromagnetZoom != 0)) {
scene->_aSound1.play(38);
scene->_magnetChangeAmount.y = -5;
}
return true;
break;
case 5:
if ((scene->_magnetChangeAmount.y == 0) && (scene->_magnetChangeAmount.x == 0) && (R2_GLOBALS._electromagnetZoom < 135)) {
scene->_aSound1.play(38);
scene->_magnetChangeAmount.y = 5;
}
return true;
break;
case 6:
if ((scene->_magnetChangeAmount.y == 0) && (scene->_magnetChangeAmount.x == 0) && (R2_GLOBALS._electromagnetChangeAmount > -10)) {
scene->_aSound1.play(38);
scene->_magnetChangeAmount.x = -5;
}
return true;
break;
case 7:
if ((scene->_magnetChangeAmount.y == 0) && (scene->_magnetChangeAmount.x == 0) && (R2_GLOBALS._electromagnetChangeAmount < 20)) {
scene->_aSound1.play(38);
scene->_magnetChangeAmount.x = 5;
}
return true;
break;
case 8:
SceneItem::display(5, 11, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
return true;
break;
case 9:
SceneItem::display(5, 12, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
return true;
break;
default:
if (scene->_controlsScreenNumber == 1) {
R2_GLOBALS._player.disableControl();
scene->_button2.remove();
scene->_button3.remove();
scene->_button4.remove();
scene->_button5.remove();
scene->_button6.remove();
scene->_button7.remove();
R2_GLOBALS._sound2.play(37);
scene->_sceneMode = 901;
scene->setAction(&scene->_sequenceManager1, scene, 901, &scene->_controls, this ,NULL);
} else if ((scene->_controlsScreenNumber == 2) || (scene->_controlsScreenNumber == 3)) {
scene->_sceneMode = 1;
scene->signal();
}
return true;
break;
}
} else if (action == CURSOR_LOOK) {
SceneItem::display(900, ((_buttonId == 2) && (scene->_controlsScreenNumber == 2)) ? 21 : _buttonId + 11,
SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, 1, SET_Y, 20, SET_EXT_BGCOLOR, 7, LIST_END);
return true;
} else {
return SceneActor::startAction(action, event);
}
}
void Scene900::postInit(SceneObjectList *OwnerList) {
g_globals->gfxManager()._bounds.moveTo(Common::Point(0, 0));
loadScene(900);
SceneExt::postInit();
R2_GLOBALS._sound1.play(34);
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.hide();
R2_GLOBALS._player.disableControl();
_controls.postInit();
_controls.setDetails(900, 3, -1, -1, 1, (SceneItem *) NULL);
_magnetChangeAmount.x = 0;
_magnetChangeAmount.y = 0;
_electromagnet.postInit();
_electromagnet.fixPriority(1);
_electromagnet.setup(900, 1, 2);
_electromagnet.setPosition(Common::Point(89, 0));
_electromagnet._effect = EFFECT_SHADED;
_electromagnet.setDetails(900, 6, -1, 8, 1, (SceneItem *) NULL);
if ((R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) != 1) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) != 1)) {
_cable.postInit();
_cable.setPosition(Common::Point(0, 0));
_cable.fixPriority(1);
if (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 0) {
if (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) != 700) {
_cable.setup(901, 3, 2);
} else if (R2_GLOBALS._tractorField && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70)) {
_cable.setup(901, 2, 1);
} else {
_cable.setup(901, 2, 8);
}
_cable.setPosition(Common::Point(171, 145));
_cable.setDetails(700, -1, -1, -1, 1, (SceneItem *) NULL);
} else {
_cable.setDetails(700, -1, -1, -1, 1, (SceneItem *) NULL);
if (!R2_GLOBALS._cableAttached) {
_cable.setup(901, 1, 8);
// Original set two times the same values: skipped
_cable.setPosition(Common::Point((((100 - ((CABLE700_X * 350) / 100)) * 49) / 100) + ((CABLE700_Y * _electromagnet._percent * 6) / 100) + 89, 166 - (CABLE700_X / 3)));
_cable.changeZoom(((100 - ((CABLE700_X * 350) / 100) + 52) / 10) * 10);
}
}
}
_background.setDetails(Rect(0, 0, 320, 200), 900, 0, -1, -1, 1, NULL);
_sceneMode = 900;
setAction(&_sequenceManager1, this, 900, &_controls, NULL);
}
void Scene900::remove() {
if (_sceneMode != 901)
R2_GLOBALS._sound1.play(10);
SceneExt::remove();
}
void Scene900::signal() {
switch (_sceneMode) {
case 1:
_controlsScreenNumber = 1;
R2_GLOBALS._sound2.play(37);
_button2.remove();
_button3.remove();
_button4.remove();
_button5.remove();
_button6.remove();
_button7.remove();
_button2.initButton(2);
_button2.setup(900, 2, 1);
_button2.setPosition(Common::Point(36, 166));
_button3.initButton(3);
_button3.setup(900, 2, 5);
_button3.setPosition(Common::Point(117, 166));
break;
case 2:
_controlsScreenNumber = 2;
_button2.remove();
_button3.remove();
_button2.initButton(2);
if (!R2_GLOBALS._tractorField)
_button2.setup(900, 3, 9);
else
_button2.setup(900, 3, 11);
_button2.setPosition(Common::Point(36, 166));
_button4.initButton(5);
_button4.setup(900, 3, 3);
_button4.setPosition(Common::Point(76, 134));
_button5.initButton(4);
_button5.setup(900, 3, 7);
_button5.setPosition(Common::Point(76, 156));
_button6.initButton(6);
_button6.setup(900, 3, 1);
_button6.setPosition(Common::Point(55, 144));
_button7.initButton(7);
_button7.setup(900, 3, 5);
_button7.setPosition(Common::Point(99, 144));
break;
case 3:
_controlsScreenNumber = 3;
_button2.remove();
_button3.remove();
_button4.remove();
_button5.remove();
_button6.remove();
_button7.remove();
_button2.initButton(8);
_button2.setup(900, 4, 1);
_button2.setPosition(Common::Point(36, 166));
_button3.initButton(9);
_button3.setup(900, 4, 5);
_button3.setPosition(Common::Point(117, 166));
break;
case 4:
_sceneMode = 0;
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
R2_GLOBALS._cableAttached = true;
break;
case 900:
R2_GLOBALS._player.enableControl(CURSOR_USE);
R2_GLOBALS._player._canWalk = false;
_controls.setup(900, 1, 1);
_button1.initButton(1);
_button1.setup(900, 1, 3);
_button1.setPosition(Common::Point(77, 168));
_sceneMode = 1;
signal();
break;
case 901:
R2_GLOBALS._sceneManager.changeScene(700);
break;
case 5:
_sceneMode = 0;
// fall through
default:
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
break;
}
}
void Scene900::dispatch() {
if (_magnetChangeAmount.y != 0) {
if (_magnetChangeAmount.y < 0) {
R2_GLOBALS._electromagnetZoom--;
++_magnetChangeAmount.y;
} else {
++R2_GLOBALS._electromagnetZoom;
_magnetChangeAmount.y--;
}
}
if (_magnetChangeAmount.x != 0) {
if (_magnetChangeAmount.x < 0) {
R2_GLOBALS._electromagnetChangeAmount--;
++_magnetChangeAmount.x;
} else {
++R2_GLOBALS._electromagnetChangeAmount;
_magnetChangeAmount.x--;
}
}
if (R2_GLOBALS._sceneObjects->contains(&_cable)) {
if (R2_GLOBALS._tractorField && (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 0) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) == 700) && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70)) {
if ((_cable._frame > 1) && (_cable._animateMode != ANIM_MODE_6))
_cable.animate(ANIM_MODE_6, NULL);
} else {
if ((_cable._frame < 8) && (_cable._animateMode != ANIM_MODE_5) && !R2_GLOBALS._cableAttached && (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 0) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) == 700) && (_sceneMode != 4))
_cable.animate(ANIM_MODE_5, NULL);
}
}
_electromagnet.changeZoom(100 - ((R2_GLOBALS._electromagnetZoom * 70) / 100));
_electromagnet.setPosition(Common::Point(((_electromagnet._percent * R2_GLOBALS._electromagnetChangeAmount * 6) / 100) + 89, R2_GLOBALS._electromagnetZoom));
if ((R2_GLOBALS._sceneObjects->contains(&_cable)) && R2_GLOBALS._cableAttached && (!_cable._mover) && (_cable._animateMode == ANIM_MODE_NONE)) {
_cable.setPosition(Common::Point(_electromagnet._position.x + ((_electromagnet._percent * 49) / 100), _electromagnet._position.y + ((_electromagnet._percent * 3) / 10)));
if (R2_GLOBALS._electromagnetZoom >= 75) {
_cable.setup(901, 1, 1);
_cable.changeZoom(((_electromagnet._percent + 52) / 10) * 10);
} else {
_cable.setup(901, 5, 1);
_cable.changeZoom(((_electromagnet._percent / 10) * 10) + 30);
}
}
Scene::dispatch();
}
} // End of namespace Ringworld2
} // End of namespace TsAGE