mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-04 01:46:42 +00:00
5715 lines
166 KiB
C++
5715 lines
166 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 2
|
|
* of the License, or (at your option) any later version.
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
*/
|
|
|
|
#include "tsage/scenes.h"
|
|
#include "tsage/tsage.h"
|
|
#include "tsage/staticres.h"
|
|
#include "tsage/ringworld2/ringworld2_scenes3.h"
|
|
|
|
namespace TsAGE {
|
|
|
|
namespace Ringworld2 {
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3100 - ARM Base Hanager
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
Scene3100::Scene3100() {
|
|
_fadeSound = false;
|
|
}
|
|
|
|
void Scene3100::synchronize(Serializer &s) {
|
|
SceneExt::synchronize(s);
|
|
|
|
s.syncAsSint16LE(_fadeSound);
|
|
}
|
|
|
|
bool Scene3100::Guard::startAction(CursorType action, Event &event) {
|
|
if (action != CURSOR_TALK)
|
|
return SceneActor::startAction(action, event);
|
|
|
|
Scene3100 *scene = (Scene3100 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_sceneMode = 10;
|
|
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
|
|
scene->_stripManager.start(606, scene);
|
|
return true;
|
|
}
|
|
|
|
void Scene3100::postInit(SceneObjectList *OwnerList) {
|
|
if (R2_GLOBALS._sceneManager._previousScene == 1000) {
|
|
if (R2_GLOBALS._player._oldCharacterScene[R2_QUINN] == 3100) {
|
|
loadScene(3101);
|
|
R2_GLOBALS._uiElements._active = false;
|
|
} else {
|
|
loadScene(3100);
|
|
_sceneBounds = Rect(160, 0, 480, SCREEN_HEIGHT);
|
|
}
|
|
} else {
|
|
loadScene(3100);
|
|
}
|
|
// Original was doing it twice in a row. Skipped.
|
|
|
|
if (R2_GLOBALS._sceneManager._previousScene == 3255)
|
|
R2_GLOBALS._uiElements._active = false;
|
|
|
|
SceneExt::postInit();
|
|
_stripManager.addSpeaker(&_guardSpeaker);
|
|
|
|
if (R2_GLOBALS._sceneManager._previousScene == -1)
|
|
R2_GLOBALS._sceneManager._previousScene = 1000;
|
|
|
|
R2_GLOBALS._player.postInit();
|
|
R2_GLOBALS._player._characterIndex = R2_QUINN;
|
|
R2_GLOBALS._player.disableControl();
|
|
|
|
_hammerHead.postInit();
|
|
_hammerHead2.setDetails(Rect(212, 97, 320, 114), 3100, 3, -1, -1, 1, NULL);
|
|
_background.setDetails(Rect(0, 0, 480, 200), 3100, 0, -1, -1, 1, NULL);
|
|
_fadeSound = false;
|
|
|
|
if (R2_GLOBALS._sceneManager._previousScene == 1000) {
|
|
if (R2_GLOBALS._player._oldCharacterScene[R2_QUINN] == 3100) {
|
|
_sceneMode = 3102;
|
|
_ghoul.postInit();
|
|
_technicians.postInit();
|
|
_deadBodies.postInit();
|
|
R2_GLOBALS._sound1.play(274);
|
|
_sound1.fadeSound(130);
|
|
setAction(&_sequenceManager, this, 3102, &_hammerHead, &R2_GLOBALS._player,
|
|
&_ghoul, &_technicians, &_deadBodies, NULL);
|
|
} else {
|
|
_guard.postInit();
|
|
_guard.setup(3110, 5, 1);
|
|
_guard.changeZoom(50);
|
|
_guard.setPosition(Common::Point(10, 149));
|
|
_guard.setDetails(3100, 6, -1, -1, 2, (SceneItem *)NULL);
|
|
|
|
_technicians.postInit();
|
|
_technicians.setup(3103, 1, 1);
|
|
_technicians.setPosition(Common::Point(278, 113));
|
|
_technicians.setDetails(3100, 9, -1, -1, 2, (SceneItem *)NULL);
|
|
_technicians.animate(ANIM_MODE_2, NULL);
|
|
|
|
_fadeSound = true;
|
|
_hammerHead.setDetails(3100, 3, -1, -1, 2, (SceneItem *)NULL);
|
|
R2_GLOBALS._sound1.play(243);
|
|
R2_GLOBALS._sound2.play(130);
|
|
_sceneMode = 3100;
|
|
|
|
setAction(&_sequenceManager, this, 3100, &R2_GLOBALS._player, &_hammerHead, NULL);
|
|
}
|
|
} else if (R2_GLOBALS._sceneManager._previousScene == 3255) {
|
|
_sceneMode = 3101;
|
|
_miranda.postInit();
|
|
_ghoul.postInit();
|
|
_fadeSound = true;
|
|
|
|
setAction(&_sequenceManager, this, 3101, &R2_GLOBALS._player, &_hammerHead,
|
|
&_miranda, &_ghoul, NULL);
|
|
} else {
|
|
_guard.postInit();
|
|
_guard.setup(3110, 5, 1);
|
|
_guard.changeZoom(50);
|
|
_guard.setPosition(Common::Point(10, 149));
|
|
_guard.setDetails(3100, 6, -1, -1, 2, (SceneItem *)NULL);
|
|
|
|
_technicians.postInit();
|
|
_technicians.setup(3103, 1, 1);
|
|
_technicians.setPosition(Common::Point(278, 113));
|
|
_technicians.setDetails(3100, 9, -1, -1, 2, (SceneItem *)NULL);
|
|
_technicians.animate(ANIM_MODE_2, NULL);
|
|
|
|
_hammerHead.postInit();
|
|
_hammerHead.setup(3104, 4, 1);
|
|
_hammerHead.setPosition(Common::Point(143, 104));
|
|
_hammerHead.setDetails(3100, 3, -1, -1, 2, (SceneItem *)NULL);
|
|
|
|
R2_GLOBALS._player.setup(3110, 3, 1);
|
|
R2_GLOBALS._player.changeZoom(50);
|
|
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
|
|
R2_GLOBALS._player.setPosition(Common::Point(160, 150));
|
|
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
|
|
R2_GLOBALS._player.enableControl(CURSOR_WALK);
|
|
|
|
R2_GLOBALS._sound1.play(243);
|
|
}
|
|
|
|
R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 3100;
|
|
}
|
|
|
|
void Scene3100::remove() {
|
|
R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
|
|
R2_GLOBALS._sound1.fadeOut2(NULL);
|
|
R2_GLOBALS._sound2.fadeOut2(NULL);
|
|
_sound1.fadeOut2(NULL);
|
|
SceneExt::remove();
|
|
}
|
|
|
|
void Scene3100::signal() {
|
|
switch (_sceneMode) {
|
|
case 10:
|
|
R2_GLOBALS._player.enableControl(CURSOR_TALK);
|
|
break;
|
|
case 3100:
|
|
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
|
|
R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
|
|
R2_GLOBALS._player.enableControl(CURSOR_WALK);
|
|
break;
|
|
case 3101:
|
|
R2_GLOBALS._sceneManager.changeScene(1000);
|
|
break;
|
|
case 3102:
|
|
R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1000;
|
|
R2_GLOBALS._sceneManager.changeScene(1000);
|
|
break;
|
|
default:
|
|
R2_GLOBALS._player.enableControl(CURSOR_WALK);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene3100::dispatch() {
|
|
if ((_sceneMode == 3100) && _fadeSound && (R2_GLOBALS._player._position.y == 104)) {
|
|
_fadeSound = false;
|
|
R2_GLOBALS._sound2.fadeOut2(NULL);
|
|
}
|
|
|
|
if ((_sceneMode == 3101) && _fadeSound && (R2_GLOBALS._player._position.y < 104)) {
|
|
_fadeSound = false;
|
|
_sound1.fadeSound(130);
|
|
}
|
|
|
|
Scene::dispatch();
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3125 - Ghouls dormitory
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
Scene3125::Scene3125() {
|
|
_soundPlayed = false;
|
|
}
|
|
|
|
void Scene3125::synchronize(Serializer &s) {
|
|
SceneExt::synchronize(s);
|
|
|
|
s.syncAsSint16LE(_soundPlayed);
|
|
}
|
|
|
|
bool Scene3125::Background::startAction(CursorType action, Event &event) {
|
|
switch (action) {
|
|
case CURSOR_USE:
|
|
if (_useLineNum != -1)
|
|
SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
|
|
break;
|
|
case CURSOR_LOOK:
|
|
if (_lookLineNum != -1)
|
|
SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
|
|
break;
|
|
case CURSOR_TALK:
|
|
if (_talkLineNum != -1)
|
|
SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
|
|
break;
|
|
default: {
|
|
Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
|
|
return scene->display(action, event);
|
|
}
|
|
break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool Scene3125::Table::startAction(CursorType action, Event &event) {
|
|
switch (action) {
|
|
case CURSOR_USE: {
|
|
Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_sceneMode = 3125;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3125, &R2_GLOBALS._player, NULL);
|
|
}
|
|
break;
|
|
case CURSOR_LOOK:
|
|
SceneItem::display(3125, 15, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
|
|
break;
|
|
case CURSOR_TALK:
|
|
SceneItem::display(3125, 13, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
|
|
break;
|
|
default:
|
|
return SceneHotspot::startAction(action, event);
|
|
break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool Scene3125::Computer::startAction(CursorType action, Event &event) {
|
|
switch (action) {
|
|
case CURSOR_USE: {
|
|
Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_ghoul4.postInit();
|
|
scene->_sceneMode = 3126;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3126, &R2_GLOBALS._player,
|
|
&scene->_ghoul1, &scene->_ghoul2, &scene->_ghoul3, &scene->_door,
|
|
&scene->_ghoul4, NULL);
|
|
}
|
|
break;
|
|
case CURSOR_LOOK:
|
|
SceneItem::display(3125, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
|
|
break;
|
|
case CURSOR_TALK:
|
|
SceneItem::display(3125, 13, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
|
|
break;
|
|
default:
|
|
return SceneHotspot::startAction(action, event);
|
|
break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool Scene3125::Door::startAction(CursorType action, Event &event) {
|
|
if (action != CURSOR_USE)
|
|
return SceneActor::startAction(action, event);
|
|
|
|
Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_sceneMode = 3176;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3176, &R2_GLOBALS._player, &scene->_door, NULL);
|
|
return true;
|
|
}
|
|
|
|
void Scene3125::postInit(SceneObjectList *OwnerList) {
|
|
loadScene(3125);
|
|
SceneExt::postInit();
|
|
_soundPlayed = false;
|
|
|
|
_door.postInit();
|
|
_door.setup(3175, 1, 1);
|
|
_door.setPosition(Common::Point(35, 72));
|
|
_door.setDetails(3125, 12, 13, -1, 1, (SceneItem *)NULL);
|
|
|
|
_ghoul1.postInit();
|
|
_ghoul1.setup(3126, 4, 1);
|
|
_ghoul1.setPosition(Common::Point(71, 110));
|
|
_ghoul1._numFrames = 20;
|
|
|
|
_ghoul2.postInit();
|
|
_ghoul2.setup(3126, 1, 1);
|
|
_ghoul2.setPosition(Common::Point(215, 62));
|
|
_ghoul2.fixPriority(71);
|
|
|
|
_ghoul3.postInit();
|
|
_ghoul3.setup(3126, 1, 1);
|
|
_ghoul3.setPosition(Common::Point(171, 160));
|
|
_ghoul3.fixPriority(201);
|
|
|
|
_computer.setDetails(12, 3125, 9, 13, -1);
|
|
_table.setDetails(11, 3125, 15, 13, -1);
|
|
_background.setDetails(Rect(0, 0, 320, 200), 3125, 0, 1, 2, 1, NULL);
|
|
|
|
R2_GLOBALS._sound1.play(262);
|
|
R2_GLOBALS._player.postInit();
|
|
|
|
if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 3250) {
|
|
_sceneMode = 3175;
|
|
setAction(&_sequenceManager, this, 3175, &R2_GLOBALS._player, &_door, NULL);
|
|
} else {
|
|
R2_GLOBALS._player.setup(30, 5, 1);
|
|
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
|
|
R2_GLOBALS._player.setPosition(Common::Point(89, 76));
|
|
R2_GLOBALS._player.enableControl();
|
|
}
|
|
R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3125;
|
|
}
|
|
|
|
void Scene3125::signal() {
|
|
switch (_sceneMode) {
|
|
case 3125:
|
|
SceneItem::display(3125, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
|
|
_sceneMode = 3127;
|
|
setAction(&_sequenceManager, this, 3127, &R2_GLOBALS._player, NULL);
|
|
break;
|
|
case 3126:
|
|
R2_GLOBALS.setFlag(79);
|
|
// No break on purpose
|
|
case 3176:
|
|
R2_GLOBALS._sceneManager.changeScene(3250);
|
|
break;
|
|
default:
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene3125::dispatch() {
|
|
if ((_sceneMode == 3126) && (_ghoul1._frame == 2) && !_soundPlayed) {
|
|
R2_GLOBALS._sound1.play(265);
|
|
_soundPlayed = true;
|
|
}
|
|
Scene::dispatch();
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3150 - Jail
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
bool Scene3150::LightFixture::startAction(CursorType action, Event &event) {
|
|
Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
switch (action) {
|
|
case CURSOR_USE:
|
|
if (R2_INVENTORY.getObjectScene(R2_LIGHT_BULB) != 3150)
|
|
return SceneHotspot::startAction(action, event);
|
|
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_sceneMode = 3154;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3154, &R2_GLOBALS._player, &scene->_bulbOrWire, NULL);
|
|
return true;
|
|
case R2_SUPERCONDUCTOR_WIRE:
|
|
if ((R2_INVENTORY.getObjectScene(R2_LIGHT_BULB) != 3150) && (R2_GLOBALS.getFlag(75))) {
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_bulbOrWire.postInit();
|
|
scene->_bulbOrWire._effect = EFFECT_SHADED2;
|
|
scene->_bulbOrWire._shade = 5;
|
|
scene->_sceneMode = 3155;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3155, &R2_GLOBALS._player, &scene->_bulbOrWire, NULL);
|
|
} else {
|
|
SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
|
|
}
|
|
return true;
|
|
default:
|
|
return SceneHotspot::startAction(action, event);
|
|
break;
|
|
}
|
|
}
|
|
|
|
bool Scene3150::Toilet::startAction(CursorType action, Event &event) {
|
|
Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
switch (action) {
|
|
case R2_PILLOW:
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_water.postInit();
|
|
scene->_water._effect = EFFECT_SHADED2;
|
|
scene->_water._shade = 3;
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_sceneMode = 3158;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3158, &R2_GLOBALS._player, &scene->_water, NULL);
|
|
return true;
|
|
case R2_FOOD_TRAY:
|
|
if ((R2_INVENTORY.getObjectScene(R2_LIGHT_BULB) != 3150) &&
|
|
(R2_INVENTORY.getObjectScene(R2_SUPERCONDUCTOR_WIRE) == 3150)
|
|
&& (R2_GLOBALS.getFlag(75))) {
|
|
scene->_foodTray.postInit();
|
|
scene->_foodTray._effect = EFFECT_SHADED2;
|
|
scene->_foodTray._shade = 3;
|
|
scene->_foodTray.setDetails(3150, 30, -1, -1, 2, (SceneItem *)NULL);
|
|
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_sceneMode = 3159;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3159, &R2_GLOBALS._player, &scene->_foodTray, NULL);
|
|
} else {
|
|
SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
|
|
}
|
|
return true;
|
|
default:
|
|
return SceneHotspot::startAction(action, event);
|
|
break;
|
|
}
|
|
}
|
|
|
|
bool Scene3150::Water::startAction(CursorType action, Event &event) {
|
|
switch (action) {
|
|
case CURSOR_USE: {
|
|
if (R2_GLOBALS.getFlag(75))
|
|
return SceneActor::startAction(action, event);
|
|
|
|
Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_sceneMode = 3151;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3151, &R2_GLOBALS._player, &scene->_water, NULL);
|
|
return true;
|
|
}
|
|
case R2_FOOD_TRAY:
|
|
return false;
|
|
default:
|
|
return SceneActor::startAction(action, event);
|
|
break;
|
|
}
|
|
}
|
|
|
|
bool Scene3150::FoodTray::startAction(CursorType action, Event &event) {
|
|
if ((action != CURSOR_USE) || (R2_GLOBALS.getFlag(77)))
|
|
return SceneActor::startAction(action, event);
|
|
|
|
Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_sceneMode = 3157;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3157, &R2_GLOBALS._player, &scene->_foodTray, NULL);
|
|
return true;
|
|
}
|
|
|
|
bool Scene3150::ToiletFlush::startAction(CursorType action, Event &event) {
|
|
if (action == CURSOR_USE) {
|
|
Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
if (R2_GLOBALS.getFlag(75)) {
|
|
if (R2_GLOBALS.getFlag(77)) {
|
|
R2_GLOBALS._player.disableControl();
|
|
if (R2_GLOBALS.getFlag(76)) {
|
|
scene->_sceneMode = 3152;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3152, &R2_GLOBALS._player, NULL);
|
|
} else {
|
|
scene->_sceneMode = 3153;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3153, &R2_GLOBALS._player, &scene->_water, NULL);
|
|
}
|
|
} else {
|
|
SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
|
|
}
|
|
} else {
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_sceneMode = 3152;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3152, &R2_GLOBALS._player, NULL);
|
|
}
|
|
return true;
|
|
} else {
|
|
return SceneActor::startAction(action, event);
|
|
}
|
|
}
|
|
|
|
bool Scene3150::AirVent::startAction(CursorType action, Event &event) {
|
|
if ((action == R2_LASER_HACKSAW) && (!R2_GLOBALS.getFlag(80))) {
|
|
Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_sceneMode = 3160;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3160, &R2_GLOBALS._player, &scene->_airVent, NULL);
|
|
return true;
|
|
}
|
|
|
|
return SceneActor::startAction(action, event);
|
|
}
|
|
|
|
void Scene3150::DoorExit::changeScene() {
|
|
Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_enabled = false;
|
|
g_globals->_events.setCursor(CURSOR_ARROW);
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_sceneMode = 11;
|
|
|
|
Common::Point pt(-20, 180);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, scene);
|
|
}
|
|
|
|
void Scene3150::VentExit::changeScene() {
|
|
Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_enabled = false;
|
|
g_globals->_events.setCursor(CURSOR_ARROW);
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_sceneMode = 12;
|
|
|
|
scene->setAction(&scene->_sequenceManager, scene, 3163, &R2_GLOBALS._player, NULL);
|
|
}
|
|
|
|
void Scene3150::postInit(SceneObjectList *OwnerList) {
|
|
loadScene(3150);
|
|
if (R2_GLOBALS._sceneManager._previousScene == -1) {
|
|
R2_INVENTORY.setObjectScene(R2_ANCIENT_SCROLLS, 2000);
|
|
R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 3100;
|
|
R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 0;
|
|
R2_GLOBALS._player._characterIndex = R2_MIRANDA;
|
|
}
|
|
SceneExt::postInit();
|
|
|
|
if (R2_GLOBALS.getFlag(78)) {
|
|
_doorExit.setDetails(Rect(0, 135, 60, 168), EXITCURSOR_SW, 3275);
|
|
_doorExit.setDest(Common::Point(70, 125));
|
|
}
|
|
|
|
if (R2_GLOBALS.getFlag(80)) {
|
|
_ventExit.setDetails(Rect(249, 36, 279, 60), EXITCURSOR_NE, 3150);
|
|
_ventExit.setDest(Common::Point(241, 106));
|
|
}
|
|
|
|
R2_GLOBALS._player.postInit();
|
|
R2_GLOBALS._player.disableControl();
|
|
|
|
_doorBars.postInit();
|
|
_doorBars.setPosition(Common::Point(64, 139));
|
|
if (R2_GLOBALS.getFlag(78)) {
|
|
_doorBars.setup(3151, 1, 5);
|
|
_doorBars.fixPriority(125);
|
|
} else {
|
|
_doorBars.setup(3151, 1, 1);
|
|
_doorBars.setDetails(3150, 8, -1, 9, 1, (SceneItem *)NULL);
|
|
}
|
|
|
|
if (R2_GLOBALS.getFlag(78)) {
|
|
_guard.postInit();
|
|
_guard.setup(3154, 1, 16);
|
|
_guard.setPosition(Common::Point(104, 129));
|
|
_guard._effect = EFFECT_SHADED2;
|
|
_guard._shade = 3;
|
|
_guard.setDetails(3150, 24, -1, -1, -1, (SceneItem *)NULL);
|
|
}
|
|
|
|
_airVent.postInit();
|
|
_airVent.setup(3154, 5, 1);
|
|
if (R2_GLOBALS.getFlag(80))
|
|
_airVent.setPosition(Common::Point(264, 108));
|
|
else
|
|
_airVent.setPosition(Common::Point(264, 58));
|
|
_airVent.fixPriority(50);
|
|
_airVent.setDetails(3150, 17, -1, 19, 1, (SceneItem *)NULL);
|
|
|
|
if (R2_INVENTORY.getObjectScene(R2_PILLOW) == 3150) {
|
|
_water.postInit();
|
|
if (R2_GLOBALS.getFlag(75)) {
|
|
if (R2_GLOBALS.getFlag(76)) {
|
|
R2_GLOBALS._walkRegions.disableRegion(1);
|
|
R2_GLOBALS._walkRegions.disableRegion(4);
|
|
R2_GLOBALS._walkRegions.disableRegion(5);
|
|
R2_GLOBALS._walkRegions.disableRegion(6);
|
|
_water.setup(3152, 4, 10);
|
|
_water.setDetails(3150, 14, -1, -1, 1, (SceneItem *)NULL);
|
|
} else {
|
|
_water.setup(3152, 7, 4);
|
|
_water.setDetails(3150, 13, -1, -1, 1, (SceneItem *)NULL);
|
|
}
|
|
_water.fixPriority(110);
|
|
_water.setPosition(Common::Point(83, 88));
|
|
_water._effect = EFFECT_SHADED2;
|
|
_water._shade = 3;
|
|
} else {
|
|
_water.setup(3152, 7, 3);
|
|
_water.setPosition(Common::Point(143, 70));
|
|
_water.setDetails(3150, 15, -1, -1, 1, (SceneItem *)NULL);
|
|
}
|
|
}
|
|
|
|
if (R2_INVENTORY.getObjectScene(R2_LIGHT_BULB) == 3150) {
|
|
_bulbOrWire.postInit();
|
|
_bulbOrWire.setup(3152, 7, 1);
|
|
_bulbOrWire.setPosition(Common::Point(73, 83));
|
|
}
|
|
|
|
if (R2_INVENTORY.getObjectScene(R2_SUPERCONDUCTOR_WIRE) == 3150) {
|
|
_bulbOrWire.postInit();
|
|
_bulbOrWire.setup(3152, 7, 2);
|
|
_bulbOrWire.setPosition(Common::Point(70, 55));
|
|
_bulbOrWire.fixPriority(111);
|
|
_bulbOrWire._effect = EFFECT_SHADED2;
|
|
_bulbOrWire._shade = 5;
|
|
}
|
|
|
|
if (R2_INVENTORY.getObjectScene(R2_FOOD_TRAY) == 3150) {
|
|
_foodTray.postInit();
|
|
if (R2_GLOBALS.getFlag(77)) {
|
|
_foodTray.setup(3152, 7, 8);
|
|
_foodTray.setPosition(Common::Point(82, 92));
|
|
_foodTray.fixPriority(111);
|
|
_foodTray._effect = EFFECT_SHADED2;
|
|
_foodTray._shade = 3;
|
|
} else {
|
|
_foodTray.setup(3152, 7, 7);
|
|
_foodTray.setPosition(Common::Point(155, 79));
|
|
}
|
|
_foodTray.setDetails(3150, 30, -1, -1, 2, (SceneItem *)NULL);
|
|
}
|
|
|
|
_toiletFlush.postInit();
|
|
_toiletFlush.setup(3152, 7, 6);
|
|
_toiletFlush.setPosition(Common::Point(98, 73));
|
|
_toiletFlush.setDetails(3150, 43, -1, -1, 1, (SceneItem *)NULL);
|
|
|
|
_bed.setDetails(12, 3150, 10, -1, 12);
|
|
_lightFixture2.setDetails(Rect(186, 17, 210, 36), 3150, 6, -1, -1, 1, NULL);
|
|
_bars.setDetails(Rect(61, 21, 92, 41), 3150, 7, -1, -1, 1, NULL);
|
|
_lightFixture.setDetails(Rect(63, 48, 78, 58), 3150, 6, -1, -1, 1, NULL);
|
|
_toilet.setDetails(Rect(63, 81, 100, 95), 3150, 3, 4, -1, 1, NULL);
|
|
_background.setDetails(Rect(0, 0, 200, 320), 3150, 0, 1, 2, 1, NULL);
|
|
|
|
switch (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA]) {
|
|
case 0:
|
|
_sceneMode = 3150;
|
|
_guard.postInit();
|
|
_guard._effect = EFFECT_SHADED2;
|
|
_guard._shade = 5;
|
|
setAction(&_sequenceManager, this, 3150, &R2_GLOBALS._player, &_guard, &_doorBars, NULL);
|
|
break;
|
|
case 1200:
|
|
_sceneMode = 3162;
|
|
setAction(&_sequenceManager, this, 3162, &R2_GLOBALS._player, NULL);
|
|
break;
|
|
case 3275: {
|
|
_sceneMode = 10;
|
|
R2_GLOBALS._player.setup(30, 3, 1);
|
|
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
|
|
R2_GLOBALS._player.setPosition(Common::Point(-20, 180));
|
|
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
|
|
|
|
Common::Point pt(80, 125);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
break;
|
|
}
|
|
default:
|
|
if ((R2_GLOBALS._mirandaJailState == 1) && (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 2000)
|
|
&& (R2_GLOBALS._player._oldCharacterScene[R2_QUINN] == 3100)) {
|
|
// Moving story on to Miranda getting food delivered
|
|
++R2_GLOBALS._mirandaJailState;
|
|
_sceneMode = 3156;
|
|
_guard.postInit();
|
|
_guard._effect = EFFECT_SHADED2;
|
|
_guard._shade = 3;
|
|
|
|
_doorBars.postInit();
|
|
_foodTray.postInit();
|
|
_foodTray._effect = EFFECT_SHADED2;
|
|
_foodTray._shade = 3;
|
|
|
|
setAction(&_sequenceManager, this, 3156, &R2_GLOBALS._player, &_guard, &_doorBars, &_foodTray, NULL);
|
|
} else {
|
|
if ((R2_GLOBALS._mirandaJailState != 1) && (R2_GLOBALS._mirandaJailState != 2))
|
|
++R2_GLOBALS._mirandaJailState;
|
|
|
|
R2_GLOBALS._player.setup(30, 3, 1);
|
|
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
|
|
R2_GLOBALS._player.setPosition(Common::Point(155, 120));
|
|
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
|
|
R2_GLOBALS._player.enableControl();
|
|
}
|
|
}
|
|
|
|
R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3150;
|
|
}
|
|
|
|
void Scene3150::signal() {
|
|
switch (_sceneMode) {
|
|
case 11:
|
|
R2_GLOBALS._sceneManager.changeScene(3275);
|
|
break;
|
|
case 12:
|
|
R2_GLOBALS._sceneManager.changeScene(1200);
|
|
break;
|
|
case 3151:
|
|
_guard.remove();
|
|
R2_INVENTORY.setObjectScene(R2_PILLOW, 3);
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
case 3153:
|
|
R2_GLOBALS.setFlag(76);
|
|
_water.setDetails(3150, 14, -1, -1, 3, (SceneItem *)NULL);
|
|
_guard.postInit();
|
|
_guard.setDetails(3150, 24, -1, -1, 2, (SceneItem *)NULL);
|
|
_sceneMode = 3161;
|
|
setAction(&_sequenceManager, this, 3161, &_guard, &_doorBars, NULL);
|
|
break;
|
|
case 3154:
|
|
_bulbOrWire.remove();
|
|
R2_INVENTORY.setObjectScene(R2_LIGHT_BULB, 3);
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
case 3155:
|
|
R2_INVENTORY.setObjectScene(R2_SUPERCONDUCTOR_WIRE, 3150);
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
case 3156:
|
|
_foodTray.setDetails(3150, 30, -1, -1, 2, (SceneItem *)NULL);
|
|
R2_INVENTORY.setObjectScene(R2_FOOD_TRAY, 3150);
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
case 3157:
|
|
_foodTray.remove();
|
|
R2_INVENTORY.setObjectScene(R2_FOOD_TRAY, 3);
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
case 3158:
|
|
R2_GLOBALS.setFlag(75);
|
|
R2_INVENTORY.setObjectScene(R2_PILLOW, 3150);
|
|
_water.fixPriority(110);
|
|
_water.setDetails(3150, 13, -1, -1, 2, (SceneItem *)NULL);
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
case 3159:
|
|
R2_GLOBALS.setFlag(77);
|
|
R2_INVENTORY.setObjectScene(R2_FOOD_TRAY, 3150);
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
case 3160:
|
|
R2_INVENTORY.setObjectScene(R2_TOOLBOX, 3150);
|
|
R2_GLOBALS.setFlag(80);
|
|
R2_GLOBALS._sceneManager.changeScene(1200);
|
|
break;
|
|
case 3161:
|
|
R2_GLOBALS._sceneItems.remove(&_doorBars);
|
|
_doorExit.setDetails(Rect(0, 135, 60, 168), EXITCURSOR_SW, 3275);
|
|
_doorExit.setDest(Common::Point(70, 125));
|
|
R2_GLOBALS._walkRegions.disableRegion(1);
|
|
R2_GLOBALS._walkRegions.disableRegion(4);
|
|
R2_GLOBALS._walkRegions.disableRegion(5);
|
|
R2_GLOBALS._walkRegions.disableRegion(6);
|
|
R2_GLOBALS.setFlag(78);
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
default:
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene3150::dispatch() {
|
|
if (_foodTray._position.x == 155) {
|
|
_foodTray._effect = EFFECT_NONE;
|
|
_foodTray._shade = 0;
|
|
}
|
|
|
|
if (_guard._visage == 3154) {
|
|
_guard._effect = EFFECT_NONE;
|
|
_guard._shade = 0;
|
|
}
|
|
|
|
Scene::dispatch();
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3175 - Autopsy room
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
bool Scene3175::RoomItem::startAction(CursorType action, Event &event) {
|
|
switch (action) {
|
|
case CURSOR_USE:
|
|
if (_useLineNum != -1) {
|
|
SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
|
|
return true;
|
|
}
|
|
break;
|
|
case CURSOR_LOOK:
|
|
if (_lookLineNum != -1) {
|
|
SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
|
|
return true;
|
|
}
|
|
break;
|
|
case CURSOR_TALK:
|
|
if (_talkLineNum != -1) {
|
|
SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
|
|
return true;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
Scene3175 *scene = (Scene3175 *)R2_GLOBALS._sceneManager._scene;
|
|
return scene->display(action, event);
|
|
}
|
|
|
|
bool Scene3175::Corpse::startAction(CursorType action, Event &event) {
|
|
switch (action) {
|
|
case CURSOR_USE:
|
|
if (_useLineNum != -1) {
|
|
SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
|
|
return true;
|
|
}
|
|
break;
|
|
case CURSOR_LOOK:
|
|
if (_lookLineNum != -1) {
|
|
SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
|
|
return true;
|
|
}
|
|
break;
|
|
case CURSOR_TALK:
|
|
if (_talkLineNum != -1) {
|
|
SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
|
|
return true;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
Scene3175 *scene = (Scene3175 *)R2_GLOBALS._sceneManager._scene;
|
|
return scene->display(action, event);
|
|
}
|
|
|
|
bool Scene3175::Door::startAction(CursorType action, Event &event) {
|
|
switch (action) {
|
|
case CURSOR_USE: {
|
|
Scene3175 *scene = (Scene3175 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_sceneMode = 3176;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3176, &R2_GLOBALS._player, &scene->_door, NULL);
|
|
return true;
|
|
}
|
|
break;
|
|
case CURSOR_LOOK:
|
|
SceneItem::display(3175, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
|
|
return true;
|
|
break;
|
|
case CURSOR_TALK:
|
|
SceneItem::display(3175, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
|
|
return true;
|
|
break;
|
|
default:
|
|
return SceneActor::startAction(action, event);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene3175::postInit(SceneObjectList *OwnerList) {
|
|
loadScene(3175);
|
|
SceneExt::postInit();
|
|
|
|
_door.postInit();
|
|
_door.setup(3175, 1, 1);
|
|
_door.setPosition(Common::Point(35, 72));
|
|
_door.setDetails(3175, 9, 10, -1, 1, (SceneItem *)NULL);
|
|
|
|
_computer.postInit();
|
|
_computer.setup(3175, 2, 1);
|
|
_computer.setPosition(Common::Point(87, 148));
|
|
|
|
_corpse.postInit();
|
|
_corpse.setup(3175, 3, 1);
|
|
_corpse.setPosition(Common::Point(199, 117));
|
|
_corpse.setDetails(3175, 15, 16, 17, 1, (SceneItem *)NULL);
|
|
|
|
_table.setDetails(12, 3175, 3, 1, 5);
|
|
_autopsies.setDetails(11, 3175, 6, 7, 8);
|
|
_background.setDetails(Rect(0, 0, 320, 200), 3175, 0, 1, 2, 1, NULL);
|
|
|
|
R2_GLOBALS._player.postInit();
|
|
|
|
if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 3250) {
|
|
R2_GLOBALS._player.setup(30, 5, 1);
|
|
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
|
|
R2_GLOBALS._player.setPosition(Common::Point(126, 77));
|
|
R2_GLOBALS._player.enableControl();
|
|
} else {
|
|
_sceneMode = 3175;
|
|
setAction(&_sequenceManager, this, 3175, &R2_GLOBALS._player, &_door, NULL);
|
|
}
|
|
|
|
R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3175;
|
|
}
|
|
|
|
void Scene3175::signal() {
|
|
if (_sceneMode == 3176)
|
|
R2_GLOBALS._sceneManager.changeScene(3250);
|
|
else
|
|
R2_GLOBALS._player.enableControl();
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3200 - Cutscene : Guards - Discussion
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void Scene3200::postInit(SceneObjectList *OwnerList) {
|
|
loadScene(3200);
|
|
R2_GLOBALS._uiElements._active = false;
|
|
SceneExt::postInit();
|
|
|
|
_stripManager.addSpeaker(&_rockoSpeaker);
|
|
_stripManager.addSpeaker(&_jockoSpeaker);
|
|
_stripManager.addSpeaker(&_sockoSpeaker);
|
|
|
|
R2_GLOBALS._player.postInit();
|
|
R2_GLOBALS._player.hide();
|
|
R2_GLOBALS._player.disableControl();
|
|
|
|
_rocko.postInit();
|
|
_jocko.postInit();
|
|
_socko.postInit();
|
|
|
|
setAction(&_sequenceManager, this, 3200 + R2_GLOBALS._randomSource.getRandomNumber(1),
|
|
&_rocko, &_jocko, &_socko, NULL);
|
|
}
|
|
|
|
void Scene3200::signal() {
|
|
R2_GLOBALS._sceneManager.changeScene(1200);
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3210 - Cutscene : Captain and Private - Discussion
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void Scene3210::postInit(SceneObjectList *OwnerList) {
|
|
loadScene(3210);
|
|
R2_GLOBALS._uiElements._active = false;
|
|
SceneExt::postInit();
|
|
|
|
_stripManager.addSpeaker(&_privateSpeaker);
|
|
_stripManager.addSpeaker(&_captainSpeaker);
|
|
|
|
R2_GLOBALS._player.postInit();
|
|
R2_GLOBALS._player.hide();
|
|
R2_GLOBALS._player.disableControl();
|
|
|
|
_captain.postInit();
|
|
_private.postInit();
|
|
|
|
setAction(&_sequenceManager, this, 3210 + R2_GLOBALS._randomSource.getRandomNumber(1),
|
|
&_captain, &_private, NULL);
|
|
}
|
|
|
|
void Scene3210::signal() {
|
|
R2_GLOBALS._sceneManager.changeScene(1200);
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3220 - Cutscene : Guards in cargo zone
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void Scene3220::postInit(SceneObjectList *OwnerList) {
|
|
loadScene(3220);
|
|
R2_GLOBALS._uiElements._active = false;
|
|
SceneExt::postInit();
|
|
|
|
_stripManager.addSpeaker(&_rockoSpeaker);
|
|
_stripManager.addSpeaker(&_jockoSpeaker);
|
|
|
|
R2_GLOBALS._player.postInit();
|
|
R2_GLOBALS._player.hide();
|
|
R2_GLOBALS._player.disableControl();
|
|
|
|
_rocko.postInit();
|
|
_jocko.postInit();
|
|
|
|
setAction(&_sequenceManager, this, 3220 + R2_GLOBALS._randomSource.getRandomNumber(1),
|
|
&_rocko, &_jocko, NULL);
|
|
}
|
|
|
|
void Scene3220::signal() {
|
|
R2_GLOBALS._sceneManager.changeScene(1200);
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3230 - Cutscene : Guards on duty
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void Scene3230::postInit(SceneObjectList *OwnerList) {
|
|
loadScene(3230);
|
|
R2_GLOBALS._uiElements._active = false;
|
|
SceneExt::postInit();
|
|
|
|
_stripManager.addSpeaker(&_rockoSpeaker);
|
|
_stripManager.addSpeaker(&_jockoSpeaker);
|
|
|
|
R2_GLOBALS._player.postInit();
|
|
R2_GLOBALS._player.hide();
|
|
R2_GLOBALS._player.disableControl();
|
|
|
|
_rocko.postInit();
|
|
_jocko.postInit();
|
|
_ghoul.postInit();
|
|
|
|
setAction(&_sequenceManager, this, 3230 + R2_GLOBALS._randomSource.getRandomNumber(1),
|
|
&_rocko, &_jocko, &_ghoul, NULL);
|
|
}
|
|
|
|
void Scene3230::signal() {
|
|
R2_GLOBALS._sceneManager.changeScene(1200);
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3240 - Cutscene : Teal monolog
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void Scene3240::postInit(SceneObjectList *OwnerList) {
|
|
loadScene(3240);
|
|
R2_GLOBALS._uiElements._active = false;
|
|
SceneExt::postInit();
|
|
|
|
_stripManager.addSpeaker(&_tealSpeaker);
|
|
_stripManager.addSpeaker(&_webbsterSpeaker);
|
|
_stripManager.addSpeaker(&_mirandaSpeaker);
|
|
|
|
R2_GLOBALS._player.postInit();
|
|
R2_GLOBALS._player.hide();
|
|
R2_GLOBALS._player.disableControl();
|
|
|
|
_teal.postInit();
|
|
_webbster.postInit();
|
|
|
|
setAction(&_sequenceManager, this, 3240 + R2_GLOBALS._randomSource.getRandomNumber(1),
|
|
&_teal, &_webbster, NULL);
|
|
}
|
|
|
|
void Scene3240::signal() {
|
|
R2_GLOBALS._sceneManager.changeScene(1200);
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3245 - Cutscene : Discussions with Dr. Tomko
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void Scene3245::postInit(SceneObjectList *OwnerList) {
|
|
loadScene(3245);
|
|
R2_GLOBALS._uiElements._active = false;
|
|
SceneExt::postInit();
|
|
|
|
_stripManager.addSpeaker(&_ralfSpeaker);
|
|
_stripManager.addSpeaker(&_tomkoSpeaker);
|
|
|
|
R2_GLOBALS._player.postInit();
|
|
R2_GLOBALS._player.hide();
|
|
R2_GLOBALS._player.disableControl();
|
|
|
|
_ralf.postInit();
|
|
_tomko.postInit();
|
|
|
|
if (R2_GLOBALS._scientistConvIndex < 4)
|
|
++R2_GLOBALS._scientistConvIndex;
|
|
|
|
if (R2_GLOBALS._scientistConvIndex >= 4) {
|
|
SceneItem::display(1200, 7, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
|
|
signal();
|
|
} else {
|
|
setAction(&_sequenceManager, this, 3244 + R2_GLOBALS._scientistConvIndex,
|
|
&_ralf, &_tomko, NULL);
|
|
}
|
|
}
|
|
|
|
void Scene3245::signal() {
|
|
R2_GLOBALS._sceneManager.changeScene(1200);
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3250 - Room with large stasis field negator
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
bool Scene3250::Item::startAction(CursorType action, Event &event) {
|
|
switch (action) {
|
|
case CURSOR_USE:
|
|
if (_useLineNum != -1) {
|
|
SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
|
|
return true;
|
|
}
|
|
break;
|
|
case CURSOR_LOOK:
|
|
if (_lookLineNum != -1) {
|
|
SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
|
|
return true;
|
|
}
|
|
break;
|
|
case CURSOR_TALK:
|
|
if (_talkLineNum != -1) {
|
|
SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
|
|
return true;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
Scene3250 *scene = (Scene3250 *)R2_GLOBALS._sceneManager._scene;
|
|
return scene->display(action, event);
|
|
}
|
|
|
|
bool Scene3250::Door::startAction(CursorType action, Event &event) {
|
|
if (action != CURSOR_USE)
|
|
return SceneActor::startAction(action, event);
|
|
|
|
Scene3250 *scene = (Scene3250 *)R2_GLOBALS._sceneManager._scene;
|
|
R2_GLOBALS._player.disableControl();
|
|
|
|
switch(_position.x) {
|
|
case 25:
|
|
scene->_sceneMode = 3262;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3262, &R2_GLOBALS._player, &scene->_leftDoor, NULL);
|
|
break;
|
|
case 259:
|
|
scene->_sceneMode = 3260;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3260, &R2_GLOBALS._player, &scene->_topDoor, NULL);
|
|
break;
|
|
case 302:
|
|
scene->_sceneMode = 3261;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3261, &R2_GLOBALS._player, &scene->_rightDoor, NULL);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void Scene3250::postInit(SceneObjectList *OwnerList) {
|
|
loadScene(3250);
|
|
|
|
if (R2_GLOBALS._sceneManager._previousScene == -1) {
|
|
R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 1200;
|
|
R2_GLOBALS._player._characterIndex = R2_MIRANDA;
|
|
}
|
|
|
|
SceneExt::postInit();
|
|
_leftDoor.postInit();
|
|
_leftDoor.setup(3250, 6, 1);
|
|
_leftDoor.setPosition(Common::Point(25, 148));
|
|
_leftDoor.fixPriority(10);
|
|
_leftDoor.setDetails(3250, 9, 10, -1, 1, (SceneItem *)NULL);
|
|
|
|
_topDoor.postInit();
|
|
_topDoor.setup(3250, 4, 1);
|
|
_topDoor.setPosition(Common::Point(259, 126));
|
|
_topDoor.fixPriority(10);
|
|
_topDoor.setDetails(3250, 9, 10, -1, 1, (SceneItem *)NULL);
|
|
|
|
_rightDoor.postInit();
|
|
_rightDoor.setup(3250, 5, 1);
|
|
_rightDoor.setPosition(Common::Point(302, 138));
|
|
_rightDoor.fixPriority(10);
|
|
_rightDoor.setDetails(3250, 9, 10, -1, 1, (SceneItem *)NULL);
|
|
|
|
_floodLights.setDetails(Rect(119, 111, 149, 168), 3250, 6, 7, 2, 1, NULL);
|
|
_tnuctipunShip.setDetails(Rect(58, 85, 231, 138), 3250, 12, 7, 2, 1, NULL);
|
|
_negator.setDetails(12, 3250, 3, 1, 2);
|
|
_background.setDetails(Rect(0, 0, 320, 200), 3250, 0, 1, 2, 1, NULL);
|
|
|
|
R2_GLOBALS._player.postInit();
|
|
|
|
switch (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA]) {
|
|
case 1200:
|
|
_sceneMode = 3250;
|
|
_grate.postInit();
|
|
R2_GLOBALS._player._effect = EFFECT_NONE;
|
|
setAction(&_sequenceManager, this, 3250, &R2_GLOBALS._player, &_grate, NULL);
|
|
break;
|
|
case 3125:
|
|
if (R2_GLOBALS.getFlag(79)) {
|
|
_sceneMode = 3254;
|
|
_ghoul1.postInit();
|
|
_ghoul1._effect = EFFECT_SHADED;
|
|
_ghoul2.postInit();
|
|
_ghoul2._effect = EFFECT_SHADED;
|
|
_ghoul3.postInit();
|
|
_ghoul3._effect = EFFECT_SHADED;
|
|
setAction(&_sequenceManager, this, 3254, &R2_GLOBALS._player, &_rightDoor,
|
|
&_ghoul1, &_ghoul2, &_ghoul3, &_leftDoor, NULL);
|
|
} else {
|
|
_sceneMode = 3252;
|
|
setAction(&_sequenceManager, this, 3252, &R2_GLOBALS._player, &_rightDoor, NULL);
|
|
}
|
|
break;
|
|
case 3175:
|
|
_sceneMode = 3251;
|
|
setAction(&_sequenceManager, this, 3251, &R2_GLOBALS._player, &_topDoor, NULL);
|
|
break;
|
|
case 3255:
|
|
_sceneMode = 3253;
|
|
setAction(&_sequenceManager, this, 3253, &R2_GLOBALS._player, &_leftDoor, NULL);
|
|
break;
|
|
default:
|
|
R2_GLOBALS._player.setup(31, 3, 1);
|
|
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
|
|
R2_GLOBALS._player.setPosition(Common::Point(185, 150));
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
}
|
|
|
|
R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3250;
|
|
}
|
|
|
|
void Scene3250::signal() {
|
|
switch(_sceneMode) {
|
|
case 3250:
|
|
R2_GLOBALS._player._effect = EFFECT_SHADED;
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
case 3254:
|
|
//No break on purpose
|
|
case 3262:
|
|
R2_GLOBALS._sceneManager.changeScene(3255);
|
|
break;
|
|
case 3260:
|
|
R2_GLOBALS._sceneManager.changeScene(3175);
|
|
break;
|
|
case 3261:
|
|
R2_GLOBALS._sceneManager.changeScene(3125);
|
|
break;
|
|
default:
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene3250::dispatch() {
|
|
if ((R2_GLOBALS._player._visage == 3250) && (R2_GLOBALS._player._strip == 3) && (R2_GLOBALS._player._effect == EFFECT_NONE)) {
|
|
R2_GLOBALS._player._effect = EFFECT_SHADED2;
|
|
R2_GLOBALS._player._shade = 6;
|
|
}
|
|
|
|
Scene::dispatch();
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3255 - Guard Post
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void Scene3255::postInit(SceneObjectList *OwnerList) {
|
|
loadScene(3255);
|
|
SceneExt::postInit();
|
|
|
|
_stripManager.addSpeaker(&_quinnSpeaker);
|
|
_stripManager.addSpeaker(&_mirandaSpeaker);
|
|
|
|
if (R2_GLOBALS._sceneManager._previousScene == -1)
|
|
R2_GLOBALS.setFlag(79);
|
|
|
|
R2_GLOBALS._player.postInit();
|
|
R2_GLOBALS._player.disableControl();
|
|
|
|
if (R2_GLOBALS.getFlag(79)) {
|
|
R2_GLOBALS._sound1.play(267);
|
|
R2_GLOBALS._sound2.play(268);
|
|
_sceneMode = 3257;
|
|
_door.postInit();
|
|
_quinn.postInit();
|
|
_quinn._effect = EFFECT_SHADED;
|
|
setAction(&_sequenceManager, this, 3257, &R2_GLOBALS._player, &_quinn, &_door, NULL);
|
|
} else {
|
|
_teal.postInit();
|
|
_teal.setup(303, 1, 1);
|
|
_teal.setPosition(Common::Point(208, 128));
|
|
_guard.postInit();
|
|
_guard.setup(3107, 3, 1);
|
|
_guard.setPosition(Common::Point(230, 127));
|
|
_sceneMode = 3255;
|
|
setAction(&_sequenceManager, this, 3255, &R2_GLOBALS._player, NULL);
|
|
}
|
|
R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3255;
|
|
}
|
|
|
|
void Scene3255::signal() {
|
|
switch (_sceneMode) {
|
|
case 10:
|
|
_sceneMode = 3258;
|
|
_ghoul1.postInit();
|
|
_ghoul2.postInit();
|
|
_ghoul3.postInit();
|
|
setAction(&_sequenceManager, this, 3258, &R2_GLOBALS._player, &_quinn,
|
|
&_door, &_ghoul1, &_ghoul2, &_ghoul3, NULL);
|
|
break;
|
|
case 3256:
|
|
R2_GLOBALS._sceneManager.changeScene(3250);
|
|
break;
|
|
case 3257:
|
|
_sceneMode = 10;
|
|
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
|
|
_stripManager.start(607, this);
|
|
break;
|
|
case 3258:
|
|
R2_GLOBALS._sceneManager.changeScene(3100);
|
|
break;
|
|
default:
|
|
SceneItem::display(3255, 0, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
|
|
_sceneMode = 3256;
|
|
setAction(&_sequenceManager, this, 3256, &R2_GLOBALS._player, NULL);
|
|
}
|
|
}
|
|
|
|
void Scene3255::dispatch() {
|
|
if (R2_GLOBALS.getFlag(79)) {
|
|
if (_ghoul1._position.y >= 95) {
|
|
if (_ghoul1._position.y <= 110)
|
|
_ghoul1._shade = 6 - (_ghoul1._position.y - 95) / 3;
|
|
else
|
|
_ghoul1._effect = EFFECT_SHADED;
|
|
} else {
|
|
_ghoul1._effect = EFFECT_SHADED2;
|
|
_ghoul1._shade = 6;
|
|
}
|
|
|
|
if (_ghoul2._position.y >= 95) {
|
|
if (_ghoul2._position.y <= 110)
|
|
_ghoul2._shade = 6 - (_ghoul2._position.y - 95) / 3;
|
|
else
|
|
_ghoul2._effect = EFFECT_SHADED;
|
|
} else {
|
|
_ghoul2._effect = EFFECT_SHADED2;
|
|
_ghoul2._shade = 6;
|
|
}
|
|
|
|
if (_ghoul3._position.y >= 95) {
|
|
if (_ghoul3._position.y <= 110)
|
|
_ghoul3._shade = 6 - (_ghoul3._position.y - 95) / 3;
|
|
else
|
|
_ghoul3._effect = EFFECT_SHADED;
|
|
} else {
|
|
_ghoul3._effect = EFFECT_SHADED2;
|
|
_ghoul3._shade = 6;
|
|
}
|
|
}
|
|
|
|
if ((R2_GLOBALS._player._position.x > 250) && (R2_GLOBALS._player._shade == 1)) {
|
|
R2_GLOBALS._player._effect = EFFECT_SHADED2;
|
|
_quinn._effect = EFFECT_SHADED2;
|
|
}
|
|
Scene::dispatch();
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3260 - Computer room
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
bool Scene3260::Door::startAction(CursorType action, Event &event) {
|
|
if (action != CURSOR_USE)
|
|
return SceneActor::startAction(action, event);
|
|
|
|
Scene3260 *scene = (Scene3260 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_sceneMode = 3271;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3271, &R2_GLOBALS._player, &scene->_door, NULL);
|
|
return true;
|
|
}
|
|
|
|
bool Scene3260::Toolbox::startAction(CursorType action, Event &event) {
|
|
if (action != CURSOR_USE)
|
|
return SceneActor::startAction(action, event);
|
|
|
|
Scene3260 *scene = (Scene3260 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_sceneMode = 3272;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3272, &R2_GLOBALS._player, &scene->_toolbox, NULL);
|
|
return true;
|
|
}
|
|
|
|
void Scene3260::Action1::signal() {
|
|
SceneObjectExt *fmtObj = (SceneObjectExt *) _endHandler;
|
|
|
|
fmtObj->setFrame(R2_GLOBALS._randomSource.getRandomNumber(6));
|
|
setDelay(120 + R2_GLOBALS._randomSource.getRandomNumber(179));
|
|
}
|
|
|
|
void Scene3260::postInit(SceneObjectList *OwnerList) {
|
|
loadScene(3260);
|
|
R2_GLOBALS._player._characterIndex = R2_MIRANDA;
|
|
SceneExt::postInit();
|
|
R2_GLOBALS._sound1.play(285);
|
|
|
|
_door.postInit();
|
|
_door.setup(3260, 6, 1);
|
|
_door.setPosition(Common::Point(40, 106));
|
|
_door.setDetails(3260, 18, 1, -1, 1, (SceneItem *)NULL);
|
|
|
|
if (R2_INVENTORY.getObjectScene(R2_TOOLBOX) == 3260) {
|
|
_toolbox.postInit();
|
|
_toolbox.setup(3260, 7, 1);
|
|
_toolbox.setPosition(Common::Point(202, 66));
|
|
_toolbox.setDetails(3260, 12, 1, -1, 1, (SceneItem *)NULL);
|
|
}
|
|
|
|
_sceeen1.postInit();
|
|
_sceeen1.setup(3260, 1, 1);
|
|
_sceeen1.setPosition(Common::Point(93, 73));
|
|
_sceeen1.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
|
|
_sceeen1.setAction(&_action1, &_sceeen1);
|
|
|
|
_screen2.postInit();
|
|
_screen2.setup(3260, 2, 1);
|
|
_screen2.setPosition(Common::Point(142, 63));
|
|
_screen2.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
|
|
_screen2.setAction(&_action2, &_screen2);
|
|
|
|
_screen3.postInit();
|
|
_screen3.setup(3260, 2, 1);
|
|
_screen3.setPosition(Common::Point(166, 54));
|
|
_screen3.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
|
|
_screen3.setAction(&_action3, &_screen3);
|
|
|
|
_screen4.postInit();
|
|
_screen4.setup(3260, 2, 1);
|
|
_screen4.setPosition(Common::Point(190, 46));
|
|
_screen4.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
|
|
_screen4.setAction(&_action4, &_screen4);
|
|
|
|
_screen5.postInit();
|
|
_screen5.setup(3260, 2, 1);
|
|
_screen5.setPosition(Common::Point(142, 39));
|
|
_screen5.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
|
|
_screen5.setAction(&_action5, &_screen5);
|
|
|
|
_screen6.postInit();
|
|
_screen6.setup(3260, 2, 1);
|
|
_screen6.setPosition(Common::Point(166, 30));
|
|
_screen6.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
|
|
_screen6.setAction(&_action6, &_screen6);
|
|
|
|
_screen7.postInit();
|
|
_screen7.setup(3260, 2, 1);
|
|
_screen7.setPosition(Common::Point(190, 22));
|
|
_screen7.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
|
|
_screen7.setAction(&_action7, &_screen7);
|
|
|
|
_screen8.postInit();
|
|
_screen8.setup(3260, 2, 1);
|
|
_screen8.setPosition(Common::Point(142, 14));
|
|
_screen8.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
|
|
_screen8.setAction(&_action8, &_screen8);
|
|
|
|
_screen9.postInit();
|
|
_screen9.setup(3260, 2, 1);
|
|
_screen9.setPosition(Common::Point(166, 6));
|
|
_screen9.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
|
|
_screen9.setAction(&_action9, &_screen9);
|
|
|
|
_securityConsole.postInit();
|
|
_securityConsole.setup(3260, 3, 1);
|
|
_securityConsole.setPosition(Common::Point(265, 163));
|
|
_securityConsole.fixPriority(180);
|
|
_securityConsole._numFrames = 10;
|
|
_securityConsole.setDetails(3260, 6, 1, 8, 1, (SceneItem *)NULL);
|
|
_securityConsole.animate(ANIM_MODE_2, NULL);
|
|
|
|
_computerConsole.postInit();
|
|
_computerConsole.setup(3260, 4, 1);
|
|
_computerConsole.setPosition(Common::Point(127, 108));
|
|
_computerConsole.fixPriority(120);
|
|
_computerConsole.setAction(&_action11, &_computerConsole);
|
|
_computerConsole._numFrames = 15;
|
|
_computerConsole.setDetails(3260, 6, 1, 8, 1, (SceneItem *)NULL);
|
|
_computerConsole.animate(ANIM_MODE_2, NULL);
|
|
|
|
_lightingConsole.postInit();
|
|
_lightingConsole.setup(3260, 5, 1);
|
|
_lightingConsole.setPosition(Common::Point(274, 65));
|
|
_lightingConsole.setAction(&_action12, &_lightingConsole);
|
|
_lightingConsole._numFrames = 5;
|
|
_lightingConsole.setDetails(3260, 9, 1, 11, 1, (SceneItem *)NULL);
|
|
_lightingConsole.animate(ANIM_MODE_2, NULL);
|
|
|
|
_background.setDetails(Rect(0, 0, 320, 200), 3260, 0, 1, 2, 1, NULL);
|
|
R2_GLOBALS._player.postInit();
|
|
|
|
if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 3275) {
|
|
_sceneMode = 3270;
|
|
setAction(&_sequenceManager, this, 3270, &R2_GLOBALS._player, &_door, NULL);
|
|
} else {
|
|
R2_GLOBALS._player.setup(30, 5, 1);
|
|
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
|
|
R2_GLOBALS._player.setPosition(Common::Point(53, 113));
|
|
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
|
|
R2_GLOBALS._player.enableControl();
|
|
}
|
|
R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3260;
|
|
}
|
|
|
|
void Scene3260::remove() {
|
|
R2_GLOBALS._sound1.fadeOut2(NULL);
|
|
SceneExt::remove();
|
|
}
|
|
|
|
void Scene3260::signal() {
|
|
switch (_sceneMode) {
|
|
case 3271:
|
|
R2_GLOBALS._sceneManager.changeScene(3275);
|
|
break;
|
|
case 3272:
|
|
_sceneMode = 3273;
|
|
R2_GLOBALS._events.setCursor(CURSOR_WALK);
|
|
SceneItem::display(3260, 15, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
|
|
R2_GLOBALS._player.disableControl();
|
|
R2_INVENTORY.setObjectScene(R2_TOOLBOX, 3);
|
|
R2_INVENTORY.setObjectScene(R2_LASER_HACKSAW, 3);
|
|
setAction(&_sequenceManager, this, 3273, &R2_GLOBALS._player, &_toolbox, NULL);
|
|
break;
|
|
case 3273:
|
|
_screen4.remove();
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
default:
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3275 - Hall
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
bool Scene3275::Door::startAction(CursorType action, Event &event) {
|
|
if (action != CURSOR_USE)
|
|
return SceneActor::startAction(action, event);
|
|
|
|
Scene3275 *scene = (Scene3275 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_sceneMode = 3275;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3275, &R2_GLOBALS._player, &scene->_door, NULL);
|
|
return true;
|
|
}
|
|
|
|
void Scene3275::CellExit::changeScene() {
|
|
Scene3275 *scene = (Scene3275 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
scene->_sceneMode = 0;
|
|
g_globals->_events.setCursor(CURSOR_ARROW);
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_sceneMode = 10;
|
|
Common::Point pt(418, 118);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, scene);
|
|
}
|
|
|
|
void Scene3275::postInit(SceneObjectList *OwnerList) {
|
|
loadScene(3275);
|
|
|
|
if (R2_GLOBALS._sceneManager._previousScene == -1)
|
|
R2_GLOBALS._sceneManager._previousScene = 3260;
|
|
|
|
if (R2_GLOBALS._sceneManager._previousScene == 3150)
|
|
_sceneBounds = Rect(160, 0, 480, 200);
|
|
|
|
SceneExt::postInit();
|
|
_cellExit.setDetails(Rect(398, 60, 439, 118), SHADECURSOR_UP, 3150);
|
|
_cellExit.setDest(Common::Point(418, 128));
|
|
|
|
_doorFrame.postInit();
|
|
_doorFrame.setup(3275, 1, 7);
|
|
_doorFrame.setPosition(Common::Point(419, 119));
|
|
|
|
_door.postInit();
|
|
_door.setup(3275, 2, 1);
|
|
_door.setPosition(Common::Point(56, 118));
|
|
_door.setDetails(3275, 3, 4, -1, 1, (SceneItem *)NULL);
|
|
|
|
_emptyCell1.setDetails(Rect(153, 58, 200, 120), 3275, 6, 7, 8, 1, NULL);
|
|
_emptyCell2.setDetails(Rect(275, 58, 331, 120), 3275, 6, 7, 8, 1, NULL);
|
|
_securityBeams1.setDetails(Rect(0, 66, 22, 127), 3275, 9, 10, 11, 1, NULL);
|
|
_securityBeams2.setDetails(Rect(457, 66, 480, 127), 3275, 9, 10, 11, 1, NULL);
|
|
_background.setDetails(Rect(0, 0, 480, 200), 3275, 0, 1, 2, 1, NULL);
|
|
|
|
R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
|
|
R2_GLOBALS._player.postInit();
|
|
R2_GLOBALS._player.disableControl();
|
|
if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 3150) {
|
|
_sceneMode = 11;
|
|
R2_GLOBALS._player.setup(30, 3, 1);
|
|
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
|
|
R2_GLOBALS._player.setPosition(Common::Point(418, 118));
|
|
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
|
|
Common::Point pt(418, 128);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
} else if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 3260) {
|
|
_sceneMode = 3276;
|
|
setAction(&_sequenceManager, this, 3276, &R2_GLOBALS._player, &_door, NULL);
|
|
} else {
|
|
R2_GLOBALS._player.setup(30, 3, 1);
|
|
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
|
|
R2_GLOBALS._player.setPosition(Common::Point(245, 135));
|
|
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
|
|
R2_GLOBALS._player.enableControl();
|
|
}
|
|
R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3275;
|
|
}
|
|
|
|
void Scene3275::signal() {
|
|
switch (_sceneMode) {
|
|
case 10:
|
|
R2_GLOBALS._sceneManager.changeScene(3150);
|
|
break;
|
|
case 3275:
|
|
R2_GLOBALS._sceneManager.changeScene(3260);
|
|
break;
|
|
default:
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3350 - Cutscene - Ship landing
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void Scene3350::postInit(SceneObjectList *OwnerList) {
|
|
loadScene(3350);
|
|
R2_GLOBALS._uiElements._active = false;
|
|
SceneExt::postInit();
|
|
R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
|
|
R2_GLOBALS._sound2.play(310);
|
|
|
|
_rotation = R2_GLOBALS._scenePalette.addRotation(176, 203, 1);
|
|
_rotation->setDelay(3);
|
|
|
|
R2_GLOBALS._player.postInit();
|
|
R2_GLOBALS._player.hide();
|
|
R2_GLOBALS._player.disableControl();
|
|
|
|
_miranda.postInit();
|
|
_miranda.hide();
|
|
_seeker.postInit();
|
|
_seeker.hide();
|
|
_webbster.postInit();
|
|
_webbster.hide();
|
|
_seatedPeople.postInit();
|
|
_seatedPeople.hide();
|
|
_shipFront.postInit();
|
|
_shipFront.hide();
|
|
_canopy.postInit();
|
|
_canopy.hide();
|
|
_ship.postInit();
|
|
_ship.hide();
|
|
_landedShip.postInit();
|
|
_landedShip.hide();
|
|
_shipShadow.postInit();
|
|
_shipShadow.hide();
|
|
|
|
_sceneMode = 3350;
|
|
setAction(&_sequenceManager, this, _sceneMode, &_ship, &_landedShip, &_shipShadow, NULL);
|
|
}
|
|
|
|
void Scene3350::remove() {
|
|
R2_GLOBALS._sound2.fadeOut2(NULL);
|
|
SceneExt::remove();
|
|
}
|
|
|
|
void Scene3350::signal() {
|
|
switch (_sceneMode) {
|
|
case 3350:
|
|
_sceneMode = 3351;
|
|
setAction(&_sequenceManager, this, 3351, &_seatedPeople, &_shipFront, &_canopy, NULL);
|
|
break;
|
|
case 3351:
|
|
_sceneMode = 3352;
|
|
setAction(&_sequenceManager, this, 3352, &_seatedPeople, &R2_GLOBALS._player,
|
|
&_miranda, &_seeker, &_webbster, NULL);
|
|
break;
|
|
case 3352:
|
|
R2_GLOBALS._sceneManager.changeScene(3395);
|
|
break;
|
|
default:
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3375 - Circular Walkway
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void Scene3375::synchronize(Serializer &s) {
|
|
SceneExt::synchronize(s);
|
|
|
|
s.syncAsSint16LE(_newSceneMode);
|
|
for (int i = 0; i < 4; ++i)
|
|
s.syncAsSint16LE(_sceneAreas[i]);
|
|
}
|
|
|
|
void Scene3375::enterArea(int sceneMode) {
|
|
switch (sceneMode) {
|
|
case 3379:
|
|
R2_GLOBALS._player.setPosition(Common::Point(0, 155));
|
|
_companion1.setPosition(Common::Point(-20, 163));
|
|
_companion2.setPosition(Common::Point(-5, 150));
|
|
_webbster.setPosition(Common::Point(-20, 152));
|
|
break;
|
|
case 3380:
|
|
++R2_GLOBALS._walkwaySceneNumber;
|
|
if (R2_GLOBALS._walkwaySceneNumber >= 4)
|
|
R2_GLOBALS._walkwaySceneNumber = 0;
|
|
|
|
loadScene(_sceneAreas[R2_GLOBALS._walkwaySceneNumber]);
|
|
|
|
R2_GLOBALS._uiElements.show();
|
|
R2_GLOBALS._player.setStrip(4);
|
|
R2_GLOBALS._player.setPosition(Common::Point(148, 230));
|
|
|
|
_companion1.setPosition(Common::Point(191, 274));
|
|
_companion1._effect = EFFECT_SHADED;
|
|
_companion2.setPosition(Common::Point(124, 255));
|
|
_companion2._effect = EFFECT_SHADED;
|
|
_webbster.setPosition(Common::Point(155, 245));
|
|
_webbster._effect = EFFECT_SHADED;
|
|
break;
|
|
case 3381:
|
|
--R2_GLOBALS._walkwaySceneNumber;
|
|
if (R2_GLOBALS._walkwaySceneNumber < 0)
|
|
R2_GLOBALS._walkwaySceneNumber = 3;
|
|
|
|
loadScene(_sceneAreas[R2_GLOBALS._walkwaySceneNumber]);
|
|
|
|
R2_GLOBALS._uiElements.show();
|
|
R2_GLOBALS._player.setStrip(6);
|
|
R2_GLOBALS._player.setPosition(Common::Point(201, 131));
|
|
|
|
_companion1.setPosition(Common::Point(231, 127));
|
|
_companion1._effect = EFFECT_SHADED;
|
|
_companion2.setPosition(Common::Point(231, 127));
|
|
_companion2._effect = EFFECT_SHADED;
|
|
_webbster.setPosition(Common::Point(231, 127));
|
|
_webbster._effect = EFFECT_SHADED;
|
|
break;
|
|
default:
|
|
R2_GLOBALS._player.setPosition(Common::Point(192, 155));
|
|
|
|
_companion1.setPosition(Common::Point(138, 134));
|
|
_companion2.setPosition(Common::Point(110, 139));
|
|
_webbster.setPosition(Common::Point(125, 142));
|
|
break;
|
|
}
|
|
|
|
if (R2_GLOBALS._walkwaySceneNumber == 2) {
|
|
R2_GLOBALS._sceneItems.remove(&_door);
|
|
for (int i = 0; i <= 12; i++)
|
|
R2_GLOBALS._sceneItems.remove(&_itemArray[i]);
|
|
R2_GLOBALS._sceneItems.remove(&_background);
|
|
|
|
_door.show();
|
|
_door.setDetails(3375, 9, 10, -1, 1, (SceneItem *)NULL);
|
|
|
|
for (int i = 0; i <= 12; i++)
|
|
_itemArray[i].setDetails(3375, 3, -1, -1);
|
|
|
|
_background.setDetails(Rect(0, 0, 320, 200), 3375, 0, -1, -1, 1, NULL);
|
|
} else {
|
|
_door.hide();
|
|
R2_GLOBALS._sceneItems.remove(&_door);
|
|
}
|
|
|
|
if (_sceneMode == 0)
|
|
signal();
|
|
else
|
|
setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, &_companion1, &_companion2, &_webbster, NULL);
|
|
}
|
|
|
|
bool Scene3375::Companion2::startAction(CursorType action, Event &event) {
|
|
if (action != CURSOR_TALK)
|
|
return SceneActor::startAction(action, event);
|
|
|
|
Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
scene->_sceneMode = 9999;
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
|
|
scene->_stripManager.start(3302, scene);
|
|
else
|
|
scene->_stripManager.start(3304, scene);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool Scene3375::Companion1::startAction(CursorType action, Event &event) {
|
|
if (action != CURSOR_TALK)
|
|
return SceneActor::startAction(action, event);
|
|
|
|
Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
scene->_sceneMode = 9999;
|
|
if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
|
|
scene->_stripManager.start(3302, scene);
|
|
else
|
|
scene->_stripManager.start(3301, scene);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool Scene3375::Webbster::startAction(CursorType action, Event &event) {
|
|
if (action != CURSOR_TALK)
|
|
return SceneActor::startAction(action, event);
|
|
|
|
Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
scene->_sceneMode = 9999;
|
|
scene->_stripManager.start(3303, scene);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool Scene3375::Door::startAction(CursorType action, Event &event) {
|
|
if (action != CURSOR_USE)
|
|
return SceneActor::startAction(action, event);
|
|
|
|
if (R2_GLOBALS._walkwaySceneNumber != 0) {
|
|
R2_GLOBALS._walkRegions.enableRegion(2);
|
|
R2_GLOBALS._walkRegions.enableRegion(3);
|
|
} else {
|
|
R2_GLOBALS._walkRegions.enableRegion(1);
|
|
R2_GLOBALS._walkRegions.enableRegion(3);
|
|
R2_GLOBALS._walkRegions.enableRegion(4);
|
|
}
|
|
R2_GLOBALS._walkRegions.enableRegion(6);
|
|
R2_GLOBALS._walkRegions.enableRegion(7);
|
|
R2_GLOBALS._walkRegions.enableRegion(8);
|
|
|
|
R2_GLOBALS._player.disableControl(CURSOR_ARROW);
|
|
|
|
Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
scene->_sceneMode = 3375;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3375, &R2_GLOBALS._player,
|
|
&scene->_companion1, &scene->_companion2, &scene->_webbster, &scene->_door, NULL);
|
|
|
|
return true;
|
|
}
|
|
|
|
void Scene3375::LeftExit::changeScene() {
|
|
Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_moving = false;
|
|
R2_GLOBALS._player.disableControl(CURSOR_ARROW);
|
|
scene->_sceneMode = 3376;
|
|
if (R2_GLOBALS._walkwaySceneNumber != 0) {
|
|
R2_GLOBALS._walkRegions.enableRegion(2);
|
|
R2_GLOBALS._walkRegions.enableRegion(3);
|
|
} else {
|
|
R2_GLOBALS._walkRegions.enableRegion(1);
|
|
R2_GLOBALS._walkRegions.enableRegion(3);
|
|
R2_GLOBALS._walkRegions.enableRegion(4);
|
|
}
|
|
if (scene->_companion1._position.y != 163) {
|
|
R2_GLOBALS._player.setStrip2(-1);
|
|
scene->_companion1.setStrip2(-1);
|
|
scene->_companion2.setStrip2(-1);
|
|
scene->_webbster.setStrip2(-1);
|
|
scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_companion1, &scene->_companion2, &scene->_webbster, NULL);
|
|
} else {
|
|
R2_GLOBALS._player.setStrip2(2);
|
|
scene->_companion1.setStrip2(2);
|
|
scene->_companion2.setStrip2(2);
|
|
scene->_webbster.setStrip2(2);
|
|
R2_GLOBALS._sound2.play(314);
|
|
|
|
Common::Point pt(50, 150);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, scene);
|
|
}
|
|
}
|
|
|
|
void Scene3375::DownExit::changeScene() {
|
|
Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_moving = false;
|
|
R2_GLOBALS._player._effect = EFFECT_SHADED2;
|
|
R2_GLOBALS._player._shade = 4;
|
|
R2_GLOBALS._player.disableControl(CURSOR_ARROW);
|
|
|
|
scene->_sceneMode = 3377;
|
|
scene->_newSceneMode = 3381;
|
|
|
|
if (R2_GLOBALS._walkwaySceneNumber != 0) {
|
|
R2_GLOBALS._walkRegions.enableRegion(2);
|
|
R2_GLOBALS._walkRegions.enableRegion(3);
|
|
} else {
|
|
R2_GLOBALS._walkRegions.enableRegion(1);
|
|
R2_GLOBALS._walkRegions.enableRegion(3);
|
|
R2_GLOBALS._walkRegions.enableRegion(4);
|
|
}
|
|
scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_companion1, &scene->_companion2, &scene->_webbster, NULL);
|
|
}
|
|
|
|
void Scene3375::RightExit::changeScene() {
|
|
Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_moving = false;
|
|
R2_GLOBALS._player._effect = EFFECT_SHADED2;
|
|
R2_GLOBALS._player._shade = 4;
|
|
R2_GLOBALS._player.disableControl(CURSOR_ARROW);
|
|
|
|
scene->_sceneMode = 3378;
|
|
scene->_newSceneMode = 3380;
|
|
|
|
if (R2_GLOBALS._walkwaySceneNumber != 0) {
|
|
R2_GLOBALS._walkRegions.enableRegion(2);
|
|
R2_GLOBALS._walkRegions.enableRegion(3);
|
|
} else {
|
|
R2_GLOBALS._walkRegions.enableRegion(1);
|
|
R2_GLOBALS._walkRegions.enableRegion(3);
|
|
R2_GLOBALS._walkRegions.enableRegion(4);
|
|
}
|
|
scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_companion1, &scene->_companion2, &scene->_webbster, NULL);
|
|
}
|
|
|
|
Scene3375::Scene3375() {
|
|
_newSceneMode = 0;
|
|
|
|
_sceneAreas[0] = 3376;
|
|
_sceneAreas[1] = 3377;
|
|
_sceneAreas[2] = 3375;
|
|
_sceneAreas[3] = 3378;
|
|
}
|
|
|
|
void Scene3375::postInit(SceneObjectList *OwnerList) {
|
|
loadScene(_sceneAreas[R2_GLOBALS._walkwaySceneNumber]);
|
|
SceneExt::postInit();
|
|
|
|
R2_GLOBALS._sound1.play(313);
|
|
|
|
_stripManager.setColors(60, 255);
|
|
_stripManager.setFontNumber(3);
|
|
_stripManager.addSpeaker(&_quinnSpeaker);
|
|
_stripManager.addSpeaker(&_seekerSpeaker);
|
|
_stripManager.addSpeaker(&_mirandaSpeaker);
|
|
_stripManager.addSpeaker(&_webbsterSpeaker);
|
|
|
|
R2_GLOBALS._player._characterScene[R2_QUINN] = 3375;
|
|
R2_GLOBALS._player._characterScene[R2_SEEKER] = 3375;
|
|
R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3375;
|
|
|
|
setZoomPercents(126, 55, 200, 167);
|
|
R2_GLOBALS._player.postInit();
|
|
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
|
|
R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
|
|
else
|
|
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
|
|
|
|
R2_GLOBALS._player.changeZoom(-1);
|
|
|
|
switch (R2_GLOBALS._player._characterIndex) {
|
|
case R2_SEEKER:
|
|
if (R2_GLOBALS._sceneManager._previousScene == 3385)
|
|
R2_GLOBALS._player.setup(20, 1, 1);
|
|
else
|
|
R2_GLOBALS._player.setup(20, 3, 1);
|
|
break;
|
|
case R2_MIRANDA:
|
|
if (R2_GLOBALS._sceneManager._previousScene == 3385)
|
|
R2_GLOBALS._player.setup(30, 1, 1);
|
|
else
|
|
R2_GLOBALS._player.setup(30, 3, 1);
|
|
break;
|
|
default:
|
|
if (R2_GLOBALS._sceneManager._previousScene == 3385)
|
|
R2_GLOBALS._player.setup(10, 1, 1);
|
|
else
|
|
R2_GLOBALS._player.setup(10, 3, 1);
|
|
break;
|
|
}
|
|
|
|
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
|
|
R2_GLOBALS._player.disableControl();
|
|
|
|
_companion1.postInit();
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
|
|
_companion1._moveRate = 10;
|
|
_companion1._moveDiff = Common::Point(3, 2);
|
|
} else {
|
|
_companion1._moveRate = 7;
|
|
_companion1._moveDiff = Common::Point(5, 3);
|
|
}
|
|
_companion1.changeZoom(-1);
|
|
_companion1._effect = EFFECT_SHADED;
|
|
|
|
int tmpStrip, tmpVisage;
|
|
if (R2_GLOBALS._sceneManager._previousScene == 3385)
|
|
tmpStrip = 1;
|
|
else
|
|
tmpStrip = 4;
|
|
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
|
|
tmpVisage = 10;
|
|
else
|
|
tmpVisage = 20;
|
|
|
|
_companion1.setup(tmpVisage, tmpStrip, 1);
|
|
_companion1.animate(ANIM_MODE_1, NULL);
|
|
|
|
_companion2.postInit();
|
|
_companion2._moveDiff = Common::Point(3, 2);
|
|
_companion2.changeZoom(-1);
|
|
_companion2._effect = EFFECT_SHADED;
|
|
if (R2_GLOBALS._sceneManager._previousScene == 3385)
|
|
tmpStrip = 1;
|
|
else
|
|
tmpStrip = 8;
|
|
|
|
if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
|
|
tmpVisage = 10;
|
|
else
|
|
tmpVisage = 30;
|
|
|
|
_companion2.setup(tmpVisage, tmpStrip, 1);
|
|
_companion2.animate(ANIM_MODE_1, NULL);
|
|
|
|
_webbster.postInit();
|
|
_webbster._moveRate = 7;
|
|
_webbster._moveDiff = Common::Point(5, 3);
|
|
_webbster.changeZoom(-1);
|
|
_webbster._effect = EFFECT_SHADED;
|
|
if (R2_GLOBALS._sceneManager._previousScene == 3385)
|
|
tmpStrip = 1;
|
|
else
|
|
tmpStrip = 4;
|
|
|
|
_webbster.setup(40, tmpStrip, 1);
|
|
_webbster.animate(ANIM_MODE_1, NULL);
|
|
|
|
_companion2.setDetails(3375, -1, -1, -1, 1, (SceneItem *)NULL);
|
|
_webbster.setDetails(3375, 21, -1, -1, 1, (SceneItem *)NULL);
|
|
_companion1.setDetails(3375, -1, -1, -1, 1, (SceneItem *)NULL);
|
|
|
|
_door.postInit();
|
|
_door.setup(3375, 1, 1);
|
|
_door.setPosition(Common::Point(254, 166));
|
|
_door.fixPriority(140);
|
|
_door.hide();
|
|
|
|
_leftExit.setDetails(Rect(0, 84, 24, 167), EXITCURSOR_W, 3375);
|
|
_leftExit.setDest(Common::Point(65, 155));
|
|
_downExit.setDetails(Rect(103, 152, 183, 170), SHADECURSOR_DOWN, 3375);
|
|
_downExit.setDest(Common::Point(158, 151));
|
|
_rightExit.setDetails(Rect(180, 75, 213, 132), EXITCURSOR_E, 3375);
|
|
_rightExit.setDest(Common::Point(201, 131));
|
|
|
|
for (int i = 0; i <= 12; ++i)
|
|
_itemArray[i].setDetails(i, 3375, 3, -1, -1);
|
|
|
|
_background.setDetails(Rect(0, 0, 320, 200), 3375, 0, -1, 1, 1, NULL);
|
|
|
|
if (R2_GLOBALS._sceneManager._previousScene == 3385)
|
|
_sceneMode = 3379;
|
|
else
|
|
_sceneMode = 0;
|
|
|
|
enterArea(_sceneMode);
|
|
}
|
|
|
|
void Scene3375::remove() {
|
|
R2_GLOBALS._sound1.fadeOut2(NULL);
|
|
SceneExt::remove();
|
|
}
|
|
|
|
void Scene3375::signalCase3379() {
|
|
switch (R2_GLOBALS._walkwaySceneNumber) {
|
|
case 0:
|
|
_leftExit._enabled = true;
|
|
if (R2_GLOBALS._sceneManager._previousScene == 3385) {
|
|
// WORKAROUND: The original disables the left entry region here for
|
|
// some reason. But there's also some walk issue even I leave it enabled.
|
|
// Instead, for now, add an extra walk into the properly enabled regions
|
|
_sceneMode = 1;
|
|
ADD_MOVER(R2_GLOBALS._player, 70, R2_GLOBALS._player._position.y);
|
|
R2_GLOBALS._sceneManager._previousScene = 3375;
|
|
R2_GLOBALS._player._effect = EFFECT_SHADED;
|
|
_companion1._effect = EFFECT_SHADED;
|
|
_companion2._effect = EFFECT_SHADED;
|
|
_webbster._effect = EFFECT_SHADED;
|
|
|
|
return;
|
|
//R2_GLOBALS._walkRegions.disableRegion(1);
|
|
} else {
|
|
R2_GLOBALS._walkRegions.disableRegion(3);
|
|
R2_GLOBALS._walkRegions.disableRegion(4);
|
|
}
|
|
R2_GLOBALS._walkRegions.disableRegion(6);
|
|
R2_GLOBALS._walkRegions.disableRegion(7);
|
|
break;
|
|
case 2:
|
|
_leftExit._enabled = false;
|
|
R2_GLOBALS._walkRegions.disableRegion(2);
|
|
R2_GLOBALS._walkRegions.disableRegion(3);
|
|
R2_GLOBALS._walkRegions.disableRegion(5);
|
|
R2_GLOBALS._walkRegions.disableRegion(6);
|
|
R2_GLOBALS._walkRegions.disableRegion(7);
|
|
R2_GLOBALS._walkRegions.disableRegion(8);
|
|
R2_GLOBALS._walkRegions.disableRegion(9);
|
|
break;
|
|
default:
|
|
_leftExit._enabled = false;
|
|
R2_GLOBALS._walkRegions.disableRegion(2);
|
|
R2_GLOBALS._walkRegions.disableRegion(3);
|
|
R2_GLOBALS._walkRegions.disableRegion(5);
|
|
R2_GLOBALS._walkRegions.disableRegion(6);
|
|
break;
|
|
}
|
|
R2_GLOBALS._sceneManager._previousScene = 3375;
|
|
R2_GLOBALS._player._effect = EFFECT_SHADED;
|
|
_companion1._effect = EFFECT_SHADED;
|
|
_companion2._effect = EFFECT_SHADED;
|
|
_webbster._effect = EFFECT_SHADED;
|
|
R2_GLOBALS._player.enableControl(CURSOR_WALK);
|
|
}
|
|
|
|
void Scene3375::signal() {
|
|
switch (_sceneMode) {
|
|
case 1:
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
case 3375:
|
|
R2_GLOBALS._sceneManager.changeScene(3400);
|
|
break;
|
|
case 3376:
|
|
R2_GLOBALS._sceneManager.changeScene(3385);
|
|
break;
|
|
case 3377:
|
|
// No break on purpose
|
|
case 3378:
|
|
_sceneMode = _newSceneMode;
|
|
_newSceneMode = 0;
|
|
|
|
_companion1._effect = EFFECT_SHADED2;
|
|
_companion1._shade = 4;
|
|
_companion2._effect = EFFECT_SHADED2;
|
|
_companion2._shade = 4;
|
|
_webbster._effect = EFFECT_SHADED2;
|
|
_webbster._shade = 4;
|
|
|
|
// HACK: Reset zooms in order to avoid giant characters on the upper right of the screen
|
|
R2_GLOBALS._player.setZoom(-1);
|
|
_companion1.setZoom(-1);
|
|
_companion2.setZoom(-1);
|
|
_webbster.setZoom(-1);
|
|
//
|
|
|
|
enterArea(_sceneMode);
|
|
break;
|
|
case 3379:
|
|
signalCase3379();
|
|
break;
|
|
case 9999:
|
|
if (_companion1._position.y == 163)
|
|
R2_GLOBALS._player.setStrip(1);
|
|
else
|
|
R2_GLOBALS._player.setStrip(3);
|
|
R2_GLOBALS._player.enableControl(CURSOR_TALK);
|
|
break;
|
|
default:
|
|
_companion1.setPriority(130);
|
|
_companion2.setPriority(132);
|
|
_webbster.setPriority(134);
|
|
signalCase3379();
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene3375::dispatch() {
|
|
if ((R2_GLOBALS._player._position.y >= 168) && (R2_GLOBALS._player._effect == EFFECT_SHADED))
|
|
R2_GLOBALS._player._effect = EFFECT_SHADED2;
|
|
else if ((R2_GLOBALS._player._position.y < 168) && (R2_GLOBALS._player._effect == EFFECT_SHADED2))
|
|
R2_GLOBALS._player._effect = EFFECT_SHADED;
|
|
|
|
if ((_companion1._position.y >= 168) && (_companion1._effect == EFFECT_SHADED))
|
|
_companion1._effect = EFFECT_SHADED2;
|
|
else if ((_companion1._position.y < 168) && (_companion1._effect == EFFECT_SHADED2))
|
|
_companion1._effect = EFFECT_SHADED;
|
|
|
|
if ((_companion2._position.y >= 168) && (_companion2._effect == EFFECT_SHADED))
|
|
_companion2._effect = EFFECT_SHADED2;
|
|
else if ((_companion2._position.y < 168) && (_companion2._effect == EFFECT_SHADED2))
|
|
_companion2._effect = EFFECT_SHADED;
|
|
|
|
if ((_webbster._position.y >= 168) && (_webbster._effect == EFFECT_SHADED))
|
|
_webbster._effect = EFFECT_SHADED2;
|
|
else if ((_webbster._position.y < 168) && (_webbster._effect == EFFECT_SHADED2))
|
|
_webbster._effect = EFFECT_SHADED;
|
|
|
|
Scene::dispatch();
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3385 - Corridor
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
Scene3385::Scene3385() {
|
|
_playerStrip = 0;
|
|
}
|
|
|
|
void Scene3385::synchronize(Serializer &s) {
|
|
SceneExt::synchronize(s);
|
|
|
|
s.syncAsSint16LE(_playerStrip);
|
|
}
|
|
|
|
bool Scene3385::Companion1::startAction(CursorType action, Event &event) {
|
|
if (action != CURSOR_TALK)
|
|
return SceneActor::startAction(action, event);
|
|
|
|
Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
scene->_sceneMode = 9999;
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
|
|
scene->_stripManager.start(3302, scene);
|
|
else
|
|
scene->_stripManager.start(3304, scene);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool Scene3385::Companion2::startAction(CursorType action, Event &event) {
|
|
if (action != CURSOR_TALK)
|
|
return SceneActor::startAction(action, event);
|
|
|
|
Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
scene->_sceneMode = 9999;
|
|
if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
|
|
scene->_stripManager.start(3302, scene);
|
|
else
|
|
scene->_stripManager.start(3301, scene);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool Scene3385::Webbster::startAction(CursorType action, Event &event) {
|
|
if (action != CURSOR_TALK)
|
|
return SceneActor::startAction(action, event);
|
|
|
|
Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
scene->_sceneMode = 9999;
|
|
scene->_stripManager.start(3303, scene);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool Scene3385::Door::startAction(CursorType action, Event &event) {
|
|
if (action != CURSOR_USE)
|
|
return SceneActor::startAction(action, event);
|
|
|
|
R2_GLOBALS._player.disableControl(CURSOR_ARROW);
|
|
if (R2_GLOBALS._sceneManager._previousScene == 3375)
|
|
R2_GLOBALS._sound2.play(314);
|
|
|
|
Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
scene->_sceneMode = 3386;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3386, &R2_GLOBALS._player,
|
|
&scene->_companion1, &scene->_companion2, &scene->_webbster, &scene->_door,
|
|
NULL);
|
|
|
|
return true;
|
|
}
|
|
|
|
void Scene3385::SouthExit::changeScene() {
|
|
Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
R2_GLOBALS._player.disableControl(CURSOR_ARROW);
|
|
scene->_sceneMode = 3387;
|
|
|
|
if (R2_GLOBALS._sceneManager._previousScene == 3375)
|
|
scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode,
|
|
&R2_GLOBALS._player, &scene->_companion1, &scene->_companion2,
|
|
&scene->_webbster, NULL);
|
|
else
|
|
scene->signal();
|
|
}
|
|
|
|
void Scene3385::Action1::signal() {
|
|
int v = _actionIndex;
|
|
++_actionIndex;
|
|
|
|
if (v == 0)
|
|
setDelay(1);
|
|
else if (v == 1)
|
|
R2_GLOBALS._sound2.play(314);
|
|
}
|
|
|
|
void Scene3385::postInit(SceneObjectList *OwnerList) {
|
|
loadScene(3385);
|
|
SceneExt::postInit();
|
|
|
|
R2_GLOBALS._sound1.play(313);
|
|
|
|
_stripManager.setColors(60, 255);
|
|
_stripManager.setFontNumber(3);
|
|
_stripManager.addSpeaker(&_quinnSpeaker);
|
|
_stripManager.addSpeaker(&_seekerSpeaker);
|
|
_stripManager.addSpeaker(&_mirandaSpeaker);
|
|
_stripManager.addSpeaker(&_webbsterSpeaker);
|
|
|
|
R2_GLOBALS._player._characterScene[R2_QUINN] = 3385;
|
|
R2_GLOBALS._player._characterScene[R2_SEEKER] = 3385;
|
|
R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3385;
|
|
|
|
if (R2_GLOBALS._sceneManager._previousScene == 3375)
|
|
_playerStrip = 3;
|
|
else
|
|
_playerStrip = 4;
|
|
|
|
setZoomPercents(102, 40, 200, 160);
|
|
R2_GLOBALS._player.postInit();
|
|
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
|
|
R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
|
|
else
|
|
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
|
|
|
|
R2_GLOBALS._player.changeZoom(-1);
|
|
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
|
|
R2_GLOBALS._player.setup(20, _playerStrip, 1);
|
|
else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
|
|
R2_GLOBALS._player.setup(30, _playerStrip, 1);
|
|
else
|
|
R2_GLOBALS._player.setup(10, _playerStrip, 1);
|
|
|
|
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
|
|
R2_GLOBALS._player.disableControl();
|
|
|
|
_companion1.postInit();
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
|
|
_companion1._moveRate = 10;
|
|
_companion1._moveDiff = Common::Point(3, 2);
|
|
} else {
|
|
_companion1._moveRate = 7;
|
|
_companion1._moveDiff = Common::Point(5, 3);
|
|
}
|
|
_companion1.changeZoom(-1);
|
|
_companion1._effect = EFFECT_SHADED;
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
|
|
_companion1.setup(10, _playerStrip, 1);
|
|
else
|
|
_companion1.setup(20, _playerStrip, 1);
|
|
_companion1.animate(ANIM_MODE_1, NULL);
|
|
_companion1.setDetails(3385, -1, -1, -1, 1, (SceneItem *) NULL);
|
|
|
|
_companion2.postInit();
|
|
_companion2._moveDiff = Common::Point(3, 2);
|
|
_companion2.changeZoom(-1);
|
|
_companion2._effect = EFFECT_SHADED;
|
|
if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
|
|
_companion2.setup(10, _playerStrip, 1);
|
|
else
|
|
_companion2.setup(30, _playerStrip, 1);
|
|
_companion2.animate(ANIM_MODE_1, NULL);
|
|
_companion2.setDetails(3385, -1, -1, -1, 1, (SceneItem *) NULL);
|
|
|
|
_webbster.postInit();
|
|
_webbster._moveDiff = Common::Point(3, 2);
|
|
_webbster.changeZoom(-1);
|
|
_webbster._effect = EFFECT_SHADED;
|
|
_webbster.setup(40, _playerStrip, 1);
|
|
_webbster.animate(ANIM_MODE_1, NULL);
|
|
_webbster.setDetails(3385, 15, -1, -1, 1, (SceneItem *) NULL);
|
|
|
|
_southExit.setDetails(Rect(103, 152, 217, 170), SHADECURSOR_DOWN, 3395);
|
|
_southExit.setDest(Common::Point(158, 151));
|
|
|
|
_door.postInit();
|
|
_door.setPosition(Common::Point(160, 100));
|
|
_door.fixPriority(90);
|
|
_door.setDetails(3385, 3, 4, -1, 1, (SceneItem *) NULL);
|
|
|
|
if (R2_GLOBALS._sceneManager._previousScene == 3375) {
|
|
R2_GLOBALS._player.setPosition(Common::Point(158, 102));
|
|
_companion1.setPosition(Common::Point(164, 100));
|
|
_companion1.fixPriority(98);
|
|
_companion2.setPosition(Common::Point(150, 100));
|
|
_companion2.fixPriority(97);
|
|
_webbster.setPosition(Common::Point(158, 100));
|
|
_webbster.fixPriority(96);
|
|
_sceneMode = 3384;
|
|
_door.setup(3385, 1, 6);
|
|
_door.animate(ANIM_MODE_6, this);
|
|
setAction(&_action1, &_door);
|
|
} else {
|
|
R2_GLOBALS._player.setPosition(Common::Point(158, 230));
|
|
_companion1.setPosition(Common::Point(191, 270));
|
|
_companion2.setPosition(Common::Point(124, 255));
|
|
_webbster.setPosition(Common::Point(155, 245));
|
|
_door.setup(3385, 1, 1);
|
|
_sceneMode = 3385;
|
|
setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, &_companion1, &_companion2, &_webbster, NULL);
|
|
}
|
|
|
|
_background.setDetails(Rect(0, 0, 320, 200), 3385, 0, -1, -1, 1, NULL);
|
|
R2_GLOBALS._walkwaySceneNumber = 0;
|
|
}
|
|
|
|
void Scene3385::remove() {
|
|
R2_GLOBALS._sound1.fadeOut2(NULL);
|
|
SceneExt::remove();
|
|
}
|
|
|
|
void Scene3385::signal() {
|
|
switch (_sceneMode) {
|
|
case 3386:
|
|
R2_GLOBALS._sceneManager.changeScene(3375);
|
|
break;
|
|
case 3387:
|
|
R2_GLOBALS._sceneManager.changeScene(3395);
|
|
break;
|
|
case 9999:
|
|
if (R2_GLOBALS._sceneManager._previousScene == 3375)
|
|
R2_GLOBALS._player.setStrip(3);
|
|
else
|
|
R2_GLOBALS._player.setStrip(4);
|
|
R2_GLOBALS._player.enableControl(CURSOR_TALK);
|
|
break;
|
|
default:
|
|
R2_GLOBALS._player.enableControl(CURSOR_WALK);
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3395 - Walkway
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
Scene3395::Scene3395() {
|
|
_playerStrip = 0;
|
|
}
|
|
|
|
void Scene3395::synchronize(Serializer &s) {
|
|
SceneExt::synchronize(s);
|
|
|
|
s.syncAsSint16LE(_playerStrip);
|
|
}
|
|
|
|
bool Scene3395::Companion1::startAction(CursorType action, Event &event) {
|
|
if (action != CURSOR_TALK)
|
|
return SceneActor::startAction(action, event);
|
|
|
|
Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
scene->_sceneMode = 9999;
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
|
|
scene->_stripManager.start(3302, scene);
|
|
else
|
|
scene->_stripManager.start(3304, scene);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool Scene3395::Companion2::startAction(CursorType action, Event &event) {
|
|
if (action != CURSOR_TALK)
|
|
return SceneActor::startAction(action, event);
|
|
|
|
Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
scene->_sceneMode = 9999;
|
|
if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
|
|
scene->_stripManager.start(3302, scene);
|
|
else
|
|
scene->_stripManager.start(3301, scene);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool Scene3395::Webbster::startAction(CursorType action, Event &event) {
|
|
if (action != CURSOR_TALK)
|
|
return SceneActor::startAction(action, event);
|
|
|
|
Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
scene->_sceneMode = 9999;
|
|
scene->_stripManager.start(3303, scene);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool Scene3395::Door::startAction(CursorType action, Event &event) {
|
|
if (action != CURSOR_USE)
|
|
return SceneActor::startAction(action, event);
|
|
|
|
R2_GLOBALS._player.disableControl(CURSOR_ARROW);
|
|
if (R2_GLOBALS._sceneManager._previousScene == 3385)
|
|
R2_GLOBALS._sound2.play(314);
|
|
|
|
Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
scene->_sceneMode = 3396;
|
|
scene->setAction(&scene->_sequenceManager, scene, 3396, &R2_GLOBALS._player,
|
|
&scene->_companion1, &scene->_companion2, &scene->_webbster, &scene->_door,
|
|
NULL);
|
|
|
|
return true;
|
|
}
|
|
|
|
void Scene3395::Action1::signal() {
|
|
int v = _actionIndex;
|
|
++_actionIndex;
|
|
|
|
if (v == 0)
|
|
setDelay(2);
|
|
else if (v == 1)
|
|
R2_GLOBALS._sound2.play(314);
|
|
}
|
|
|
|
void Scene3395::postInit(SceneObjectList *OwnerList) {
|
|
loadScene(3395);
|
|
SceneExt::postInit();
|
|
|
|
R2_GLOBALS._sound1.play(313);
|
|
|
|
_stripManager.setColors(60, 255);
|
|
_stripManager.setFontNumber(3);
|
|
_stripManager.addSpeaker(&_quinnSpeaker);
|
|
_stripManager.addSpeaker(&_seekerSpeaker);
|
|
_stripManager.addSpeaker(&_mirandaSpeaker);
|
|
_stripManager.addSpeaker(&_webbsterSpeaker);
|
|
|
|
R2_GLOBALS._player._characterScene[R2_QUINN] = 3395;
|
|
R2_GLOBALS._player._characterScene[R2_SEEKER] = 3395;
|
|
R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3395;
|
|
|
|
if (R2_GLOBALS._sceneManager._previousScene == 3385)
|
|
_playerStrip = 3;
|
|
else
|
|
_playerStrip = 4;
|
|
|
|
setZoomPercents(51, 40, 200, 137);
|
|
R2_GLOBALS._player.postInit();
|
|
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
|
|
R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
|
|
else
|
|
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
|
|
|
|
R2_GLOBALS._player.changeZoom(-1);
|
|
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
|
|
R2_GLOBALS._player.setup(20, _playerStrip, 1);
|
|
else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
|
|
R2_GLOBALS._player.setup(30, _playerStrip, 1);
|
|
else
|
|
R2_GLOBALS._player.setup(10, _playerStrip, 1);
|
|
|
|
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
|
|
R2_GLOBALS._player.disableControl();
|
|
|
|
_companion1.postInit();
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
|
|
_companion1._moveRate = 10;
|
|
_companion1._moveDiff = Common::Point(3, 2);
|
|
} else {
|
|
_companion1._moveRate = 7;
|
|
_companion1._moveDiff = Common::Point(5, 3);
|
|
}
|
|
_companion1.changeZoom(-1);
|
|
_companion1._effect = EFFECT_SHADED;
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
|
|
_companion1.setup(10, _playerStrip, 1);
|
|
else
|
|
_companion1.setup(20, _playerStrip, 1);
|
|
_companion1.animate(ANIM_MODE_1, NULL);
|
|
_companion1.setDetails(3395, -1, -1, -1, 1, (SceneItem *) NULL);
|
|
|
|
_companion2.postInit();
|
|
_companion2._moveDiff = Common::Point(3, 2);
|
|
_companion2.changeZoom(-1);
|
|
_companion2._effect = EFFECT_SHADED;
|
|
if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
|
|
_companion2.setup(10, _playerStrip, 1);
|
|
else
|
|
_companion2.setup(30, _playerStrip, 1);
|
|
_companion2.animate(ANIM_MODE_1, NULL);
|
|
_companion2.setDetails(3395, -1, -1, -1, 1, (SceneItem *) NULL);
|
|
|
|
_webbster.postInit();
|
|
_webbster._moveDiff = Common::Point(3, 2);
|
|
_webbster.changeZoom(-1);
|
|
_webbster._effect = EFFECT_SHADED;
|
|
_webbster.setup(40, _playerStrip, 1);
|
|
_webbster.animate(ANIM_MODE_1, NULL);
|
|
_webbster.setDetails(3395, 18, -1, -1, 1, (SceneItem *) NULL);
|
|
|
|
_door.postInit();
|
|
_door.setPosition(Common::Point(159, 50));
|
|
_door.fixPriority(40);
|
|
_door.setDetails(3395, 6, 7, -1, 1, (SceneItem *) NULL);
|
|
|
|
if (R2_GLOBALS._sceneManager._previousScene == 3385) {
|
|
R2_GLOBALS._player.setPosition(Common::Point(158, 53));
|
|
_companion1.setPosition(Common::Point(164, 51));
|
|
_companion1.fixPriority(48);
|
|
_companion2.setPosition(Common::Point(150, 51));
|
|
_companion2.fixPriority(47);
|
|
_webbster.setPosition(Common::Point(158, 51));
|
|
_webbster.fixPriority(46);
|
|
_sceneMode = 3394;
|
|
_door.setup(3395, 1, 7);
|
|
_door.animate(ANIM_MODE_6, this);
|
|
setAction(&_action1, &_door);
|
|
} else {
|
|
R2_GLOBALS._player.setPosition(Common::Point(158, 200));
|
|
_companion1.setPosition(Common::Point(191, 255));
|
|
_companion2.setPosition(Common::Point(124, 240));
|
|
_webbster.setPosition(Common::Point(155, 242));
|
|
_door.setup(3395, 1, 1);
|
|
|
|
R2_GLOBALS._walkRegions.disableRegion(1);
|
|
|
|
_sceneMode = 3395;
|
|
setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, &_companion1, &_companion2, &_webbster, NULL);
|
|
}
|
|
|
|
for (int i = 0; i <= 12; i++) {
|
|
_itemArray[i].setDetails(i, 3395, 0, -1, -1);
|
|
}
|
|
|
|
_background.setDetails(Rect(0, 0, 320, 200), 3395, 3, -1, -1, 1, NULL);
|
|
}
|
|
|
|
void Scene3395::remove() {
|
|
R2_GLOBALS._sound1.fadeOut2(NULL);
|
|
SceneExt::remove();
|
|
}
|
|
|
|
void Scene3395::signal() {
|
|
switch (_sceneMode) {
|
|
case 3396:
|
|
R2_GLOBALS._sceneManager.changeScene(3385);
|
|
break;
|
|
case 9999:
|
|
if (R2_GLOBALS._sceneManager._previousScene == 3385)
|
|
R2_GLOBALS._player.setStrip(3);
|
|
else
|
|
R2_GLOBALS._player.setStrip(4);
|
|
R2_GLOBALS._player.enableControl(CURSOR_TALK);
|
|
break;
|
|
default:
|
|
R2_GLOBALS._player.enableControl(CURSOR_WALK);
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3400 - Confrontation
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
Scene3400::Scene3400() {
|
|
_soundFaded = false;
|
|
}
|
|
|
|
void Scene3400::synchronize(Serializer &s) {
|
|
SceneExt::synchronize(s);
|
|
|
|
s.syncAsSint16LE(_soundFaded);
|
|
}
|
|
|
|
void Scene3400::postInit(SceneObjectList *OwnerList) {
|
|
R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
|
|
_sceneBounds = Rect(160, 0, 480, 200);
|
|
|
|
loadScene(3400);
|
|
_soundFaded = false;
|
|
SceneExt::postInit();
|
|
R2_GLOBALS._sound1.play(317);
|
|
|
|
_stripManager.setColors(60, 255);
|
|
_stripManager.setFontNumber(3);
|
|
_stripManager.addSpeaker(&_quinnSpeaker);
|
|
_stripManager.addSpeaker(&_seekerSpeaker);
|
|
_stripManager.addSpeaker(&_mirandaSpeaker);
|
|
_stripManager.addSpeaker(&_webbsterSpeaker);
|
|
_stripManager.addSpeaker(&_tealSpeaker);
|
|
|
|
setZoomPercents(51, 46, 180, 200);
|
|
R2_GLOBALS._player._characterScene[R2_QUINN] = 3400;
|
|
R2_GLOBALS._player._characterScene[R2_SEEKER] = 3400;
|
|
R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3400;
|
|
|
|
_manholeCover.postInit();
|
|
_manholeCover.setup(3403, 1, 1);
|
|
_manholeCover.setPosition(Common::Point(190, 103));
|
|
_manholeCover.fixPriority(89);
|
|
|
|
R2_GLOBALS._player.postInit();
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
|
|
R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
|
|
else
|
|
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
|
|
R2_GLOBALS._player.changeZoom(-1);
|
|
R2_GLOBALS._player.setPosition(Common::Point(239, 64));
|
|
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
|
|
R2_GLOBALS._player.setup(20, 5, 1);
|
|
else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
|
|
R2_GLOBALS._player.setup(30, 5, 1);
|
|
else
|
|
R2_GLOBALS._player.setup(10, 5, 1);
|
|
|
|
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
|
|
R2_GLOBALS._player.disableControl();
|
|
|
|
_companion1.postInit();
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
|
|
_companion1._numFrames = 10;
|
|
_companion1._moveDiff = Common::Point(3, 2);
|
|
} else {
|
|
_companion1._numFrames = 7;
|
|
_companion1._moveDiff = Common::Point(5, 3);
|
|
}
|
|
_companion1.changeZoom(-1);
|
|
_companion1._effect = EFFECT_SHADED;
|
|
_companion1.setPosition(Common::Point(247, 63));
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
|
|
_companion1.setup(10, 5, 1);
|
|
else
|
|
_companion1.setup(20, 5, 1);
|
|
_companion1.animate(ANIM_MODE_1, NULL);
|
|
|
|
_companion2.postInit();
|
|
_companion2._moveDiff = Common::Point(3, 2);
|
|
_companion2.changeZoom(-1);
|
|
_companion2._effect = EFFECT_SHADED;
|
|
_companion2.setPosition(Common::Point(225, 63));
|
|
if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
|
|
_companion2.setup(10, 5, 1);
|
|
else
|
|
_companion2.setup(30, 5, 1);
|
|
_companion2.animate(ANIM_MODE_1, NULL);
|
|
|
|
_webbster.postInit();
|
|
_webbster._numFrames = 7;
|
|
_webbster._moveDiff = Common::Point(5, 3);
|
|
_webbster.changeZoom(-1);
|
|
_webbster._effect = EFFECT_SHADED;
|
|
_webbster.setPosition(Common::Point(235, 61));
|
|
_webbster.setup(40, 3, 1);
|
|
_webbster.animate(ANIM_MODE_1, NULL);
|
|
|
|
_door.postInit();
|
|
_door.setup(3400, 1, 6);
|
|
_door.setPosition(Common::Point(236, 51));
|
|
_door.fixPriority(51);
|
|
_door.animate(ANIM_MODE_6, NULL);
|
|
|
|
R2_GLOBALS.clearFlag(71);
|
|
_sceneMode = 3400;
|
|
setAction(&_sequenceManager, this, 3400, &R2_GLOBALS._player, &_companion1, &_companion2, &_webbster, NULL);
|
|
}
|
|
|
|
void Scene3400::remove() {
|
|
R2_GLOBALS._sound2.fadeOut2(NULL);
|
|
R2_GLOBALS._sound1.fadeOut2(NULL);
|
|
SceneExt::remove();
|
|
}
|
|
|
|
void Scene3400::signal() {
|
|
switch (_sceneMode) {
|
|
case 3305: {
|
|
// First part of discussion
|
|
_tealSpeaker._object1.hide();
|
|
_teal.show();
|
|
_teal.setStrip(1);
|
|
Common::Point pt(158, 190);
|
|
NpcMover *mover = new NpcMover();
|
|
_teal.addMover(mover, &pt, this);
|
|
_sceneMode = 3402;
|
|
setAction(&_sequenceManager, this, 3402, &R2_GLOBALS._player, &_companion1, &_companion2, &_webbster, NULL);
|
|
}
|
|
break;
|
|
case 3306:
|
|
// Teal picks up the sapphire
|
|
R2_GLOBALS._sound2.play(318);
|
|
_companion1.setStrip(2);
|
|
R2_GLOBALS._player.setStrip(6);
|
|
_companion2.setStrip(6);
|
|
_webbster.setStrip(3);
|
|
_teal.setStrip(1);
|
|
R2_INVENTORY.setObjectScene(R2_SAPPHIRE_BLUE, 0);
|
|
_stripManager.start(3307, this);
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
|
|
_sceneMode = 3400;
|
|
R2_GLOBALS._player.setAction(&_sequenceManager, this, 3400, &R2_GLOBALS._player, &_teal, &_sapphire, NULL);
|
|
} else {
|
|
_sceneMode = 3408;
|
|
_companion1.setAction(&_sequenceManager, this, 3408, &_companion1, &_teal, &_sapphire, NULL);
|
|
}
|
|
break;
|
|
case 3307:
|
|
case 3404:
|
|
case 3408:
|
|
// A tasp!
|
|
if (!_soundFaded) {
|
|
R2_GLOBALS._sound2.fadeOut2(NULL);
|
|
_soundFaded = true;
|
|
} else {
|
|
_sceneMode = 3308;
|
|
_stripManager.start(3308, this);
|
|
}
|
|
break;
|
|
case 3308:
|
|
// Characters teleport one after the other
|
|
_companion1.setStrip(2);
|
|
R2_GLOBALS._player.setStrip(6);
|
|
_companion2.setStrip(6);
|
|
_webbster.setStrip(3);
|
|
_teal.setStrip(1);
|
|
_sceneMode = 3403;
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
|
|
setAction(&_sequenceManager, this, 3403, &R2_GLOBALS._player, &_webbster, &_manholeCover, NULL);
|
|
else
|
|
setAction(&_sequenceManager, this, 3403, &_companion1, &_webbster, &_manholeCover, NULL);
|
|
break;
|
|
case 3309:
|
|
// Miranda teleports away
|
|
_teal.setStrip(1);
|
|
_sceneMode = 3405;
|
|
if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
|
|
setAction(&_sequenceManager, this, 3405, &R2_GLOBALS._player, &_manholeCover, NULL);
|
|
else
|
|
setAction(&_sequenceManager, this, 3405, &_companion2, &_manholeCover, NULL);
|
|
break;
|
|
case 3310:
|
|
// Quinn teleports away
|
|
_teal.setStrip(1);
|
|
_sceneMode = 3406;
|
|
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
|
|
setAction(&_sequenceManager, this, 3406, &R2_GLOBALS._player, &_manholeCover, NULL);
|
|
else if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
|
|
setAction(&_sequenceManager, this, 3406, &_companion1, &_manholeCover, NULL);
|
|
else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
|
|
setAction(&_sequenceManager, this, 3406, &_companion2, &_manholeCover, NULL);
|
|
break;
|
|
case 3311:
|
|
// Teal teleports away
|
|
_tealSpeaker._object1.hide();
|
|
_teal.show();
|
|
_teal.setStrip(1);
|
|
_sceneMode = 3407;
|
|
setAction(&_sequenceManager, this, 3407, &_teal, &_manholeCover, NULL);
|
|
break;
|
|
case 3400: {
|
|
// Teal enters the room
|
|
_sapphire.postInit();
|
|
_sapphire.hide();
|
|
_teal.postInit();
|
|
_teal._numFrames = 7;
|
|
_teal._moveDiff = Common::Point(3, 2);
|
|
_teal.changeZoom(-1);
|
|
_teal._effect = EFFECT_SHADED;
|
|
_teal.setPosition(Common::Point(-15, 90));
|
|
_teal.setup(3402, 1, 1);
|
|
_teal.animate(ANIM_MODE_1, NULL);
|
|
Common::Point pt1(115, 90);
|
|
NpcMover *mover1 = new NpcMover();
|
|
_teal.addMover(mover1, &pt1, this);
|
|
R2_GLOBALS._scrollFollower = &_teal;
|
|
Common::Point pt2(203, 76);
|
|
NpcMover *mover2 = new NpcMover();
|
|
_webbster.addMover(mover2, &pt2, NULL);
|
|
_sceneMode = 3401;
|
|
}
|
|
break;
|
|
case 3401:
|
|
// Teal first speech
|
|
_sceneMode = 3305;
|
|
_stripManager.start(3305, this);
|
|
break;
|
|
case 3402:
|
|
// Betrayal of Webbster
|
|
_sceneMode = 3306;
|
|
_stripManager.start(3306, this);
|
|
break;
|
|
case 3403:
|
|
// Teal: "Miranda..."
|
|
R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
|
|
_sceneMode = 3309;
|
|
_stripManager.start(3309, this);
|
|
break;
|
|
case 3405:
|
|
// Teal: "And Quinn..."
|
|
_sceneMode = 3310;
|
|
_stripManager.start(3310, this);
|
|
break;
|
|
case 3406:
|
|
// Teal final sentence before teleporting
|
|
_sceneMode = 3311;
|
|
_stripManager.start(3311, this);
|
|
break;
|
|
case 3407:
|
|
// End of scene
|
|
R2_GLOBALS._sceneManager.changeScene(3600);
|
|
break;
|
|
default:
|
|
// Unexpected scene mode
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3500 - Flub tube maze
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
Scene3500::Action1::Action1() {
|
|
_direction = 0;
|
|
_headingRightFl = false;
|
|
_turningFl = false;
|
|
}
|
|
|
|
void Scene3500::Action1::synchronize(Serializer &s) {
|
|
Action::synchronize(s);
|
|
|
|
s.syncAsSint16LE(_direction);
|
|
s.syncAsSint16LE(_headingRightFl);
|
|
if (s.getVersion() < 13) {
|
|
int useless = 0;
|
|
s.syncAsSint32LE(useless);
|
|
}
|
|
s.syncAsSint16LE(_turningFl);
|
|
}
|
|
|
|
void Scene3500::Action1::handleHorzButton(int direction) {
|
|
Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
// Direction: -1 == Left, 1 == Right
|
|
_direction = direction;
|
|
_headingRightFl = true;
|
|
_turningFl = true;
|
|
|
|
scene->_tunnelHorzCircle.setStrip(2);
|
|
scene->_tunnelHorzCircle.show();
|
|
|
|
if (_direction == 1)
|
|
scene->_symbolRight.show();
|
|
else
|
|
scene->_symbolLeft.show();
|
|
|
|
if (scene->_shuttle._frame % 2 == 0) {
|
|
scene->_shuttle._frameChange = _direction;
|
|
scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
|
|
}
|
|
|
|
setActionIndex(0);
|
|
}
|
|
|
|
void Scene3500::Action1::turnShuttle(bool arg1) {
|
|
Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_headingRightFl = arg1;
|
|
_direction = -_direction;
|
|
|
|
if (_direction == 1) {
|
|
scene->_symbolRight.show();
|
|
scene->_symbolLeft.hide();
|
|
} else {
|
|
scene->_symbolLeft.show();
|
|
scene->_symbolRight.hide();
|
|
}
|
|
|
|
switch (_actionIndex) {
|
|
case 4:
|
|
scene->_shuttle._frameChange = _direction;
|
|
scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
|
|
// No break on purpose
|
|
case 3:
|
|
_actionIndex = 10;
|
|
setDelay(0);
|
|
break;
|
|
case 5: {
|
|
scene->_moverVertX = 160;
|
|
Common::Point pt(160, 73);
|
|
NpcMover *mover = new NpcMover();
|
|
scene->_tunnelVertCircle.addMover(mover, &pt, NULL);
|
|
|
|
scene->_moverHorzX = 160 - (_direction * 2 * 160);
|
|
Common::Point pt2(scene->_moverHorzX, 73);
|
|
NpcMover *mover2 = new NpcMover();
|
|
scene->_tunnelHorzCircle.addMover(mover2, &pt2, this);
|
|
|
|
_actionIndex = 11;
|
|
}
|
|
break;
|
|
case 6:
|
|
scene->_shuttle._frameChange = _direction;
|
|
scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
|
|
setDelay(1);
|
|
// No break on purpose
|
|
case 8:
|
|
scene->_tunnelHorzCircle.setStrip(2);
|
|
_actionIndex = 1;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene3500::Action1::signal() {
|
|
Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
switch(_actionIndex++) {
|
|
case 0:
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_directionChangesEnabled = false;
|
|
if (scene->_speed != 0) {
|
|
scene->_speed = 0;
|
|
scene->_mazeChangeAmount = 0;
|
|
scene->_updateIdxChangeFl = false;
|
|
scene->_rotation->_idxChange = 0;
|
|
}
|
|
break;
|
|
case 1:
|
|
if ((scene->_shuttle._frame % 2) == 1) {
|
|
setDelay(1);
|
|
return;
|
|
}
|
|
// No break on purpose
|
|
case 3:
|
|
scene->_shuttle._frameChange = _direction;
|
|
scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
|
|
setDelay(1);
|
|
break;
|
|
case 4: {
|
|
int cellId = scene->_mazeUI.getCellFromMapXY(Common::Point(scene->_mazePosition.x + 70, scene->_mazePosition.y + 46));
|
|
int var2 = scene->_mazeUI.cellFromX(scene->_mazePosition.x + 70) - 70;
|
|
int var4 = scene->_mazeUI.cellFromY(scene->_mazePosition.y + 46) - 46;
|
|
int di = abs(var2 - scene->_mazePosition.x);
|
|
int var6 = abs(var4 - scene->_mazePosition.y);
|
|
|
|
if ((scene->_shuttle._frame % 2) != 0) {
|
|
scene->_shuttle._frameChange = _direction;
|
|
scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
|
|
}
|
|
|
|
// Get the new direction starting on
|
|
int direction = (scene->_action1._direction * 2 + scene->_mazeDirection);
|
|
if (direction > MAZEDIR_NORTHWEST)
|
|
direction = MAZEDIR_NORTH;
|
|
else if (direction < MAZEDIR_NORTH)
|
|
direction = MAZEDIR_WEST;
|
|
|
|
// Check whether movement is allowed in that direction. If so, then
|
|
// movement is started again
|
|
switch (direction) {
|
|
case MAZEDIR_NORTH:
|
|
if ( ((cellId != 2) && (cellId != 3) && (cellId != 6) && (cellId != 1) && (cellId != 23) && (cellId != 24) && (cellId != 4) && (cellId != 11))
|
|
|| (var6 != 0)) {
|
|
if ((cellId != 25) && (cellId != 26) && (cellId != 5) && (cellId != 14) && (cellId != 15))
|
|
_headingRightFl = false;
|
|
else if ((var6 != 0) || (di <= 3)) // useless, skipped: "|| (di == 0)"
|
|
_headingRightFl = false;
|
|
else
|
|
_headingRightFl = true;
|
|
} else
|
|
_headingRightFl = true;
|
|
break;
|
|
case MAZEDIR_EAST:
|
|
if ( ((cellId != 12) && (cellId != 13) && (cellId != 11) && (cellId != 16) && (cellId != 26) && (cellId != 24) && (cellId != 15) && (cellId != 6) && (cellId != 31))
|
|
|| (di != 0)) {
|
|
if ((cellId != 25) && (cellId != 23) && (cellId != 14) && (cellId != 5) && (cellId != 4))
|
|
_headingRightFl = false;
|
|
else if ((di != 0) || (var6 <= 3)) // useless, skipped: "|| (var6 == 0)"
|
|
_headingRightFl = false;
|
|
else
|
|
_headingRightFl = true;
|
|
} else
|
|
_headingRightFl = true;
|
|
break;
|
|
case MAZEDIR_SOUTH:
|
|
if ( ((cellId != 2) && (cellId != 3) && (cellId != 6) && (cellId != 1) && (cellId != 25) && (cellId != 26) && (cellId != 5) && (cellId != 16) && (cellId != 31))
|
|
|| (var6 != 0)) {
|
|
if ((cellId != 23) && (cellId != 24) && (cellId != 4) && (cellId != 14) && (cellId != 15))
|
|
_headingRightFl = false;
|
|
else if ((var6 != 0) || (di <= 3)) // useless, skipped: "|| (di == 0)"
|
|
_headingRightFl = false;
|
|
else
|
|
_headingRightFl = true;
|
|
} else
|
|
_headingRightFl = true;
|
|
break;
|
|
case MAZEDIR_WEST:
|
|
if ( ((cellId != 12) && (cellId != 13) && (cellId != 11) && (cellId != 16) && (cellId != 25) && (cellId != 23) && (cellId != 14) && (cellId != 1) && (cellId != 31))
|
|
|| (var6 != 0)) {
|
|
if ((cellId != 26) && (cellId != 24) && (cellId != 15) && (cellId != 5) && (cellId != 4))
|
|
_headingRightFl = false;
|
|
else if ((var6 <= 0) || (di != 0)) // useless, skipped: "|| (var6 == 0)"
|
|
_headingRightFl = false;
|
|
else
|
|
_headingRightFl = true;
|
|
} else
|
|
_headingRightFl = true;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
// No break on purpose
|
|
case 2: {
|
|
scene->_tunnelVertCircle.setPosition(Common::Point(160, 73));
|
|
scene->_tunnelVertCircle._moveDiff.x = 160 - scene->_mazeChangeAmount;
|
|
scene->_moverVertX = 160 - ((_direction * 2) * 160);
|
|
Common::Point pt(scene->_moverVertX, 73);
|
|
NpcMover *mover = new NpcMover();
|
|
scene->_tunnelVertCircle.addMover(mover, &pt, this);
|
|
|
|
scene->_tunnelHorzCircle.setPosition(Common::Point(160 + ((_direction * 2) * 160), 73));
|
|
scene->_tunnelHorzCircle._moveDiff.x = 160 - scene->_mazeChangeAmount;
|
|
scene->_moverHorzX = 160;
|
|
Common::Point pt2(scene->_moverHorzX, 73);
|
|
NpcMover *mover2 = new NpcMover();
|
|
scene->_tunnelHorzCircle.addMover(mover2, &pt2, NULL);
|
|
}
|
|
break;
|
|
case 5:
|
|
scene->_shuttle._frameChange = _direction;
|
|
scene->_mazeDirection = scene->_shuttle.changeFrame();
|
|
scene->_shuttle.setFrame(scene->_mazeDirection);
|
|
setDelay(1);
|
|
break;
|
|
case 6:
|
|
scene->_tunnelVertCircle.setPosition(Common::Point(160, 73));
|
|
if (!_headingRightFl)
|
|
scene->_tunnelVertCircle.setStrip(1);
|
|
else
|
|
scene->_tunnelVertCircle.setStrip(2);
|
|
scene->_tunnelVertCircle.fixPriority(1);
|
|
|
|
scene->_tunnelHorzCircle.setPosition(Common::Point(-160, 73));
|
|
scene->_tunnelHorzCircle.setStrip(9);
|
|
scene->_tunnelHorzCircle.fixPriority(11);
|
|
scene->_tunnelHorzCircle.hide();
|
|
setDelay(1);
|
|
break;
|
|
case 7:
|
|
if ((scene->_shuttle._frame % 2) == 0) {
|
|
scene->_shuttle._frameChange = _direction;
|
|
scene->_mazeDirection = scene->_shuttle.changeFrame();
|
|
scene->_shuttle.setFrame(scene->_mazeDirection);
|
|
}
|
|
setDelay(1);
|
|
break;
|
|
case 8: {
|
|
R2_GLOBALS._player.enableControl();
|
|
R2_GLOBALS._player._canWalk = false;
|
|
scene->_directionChangesEnabled = true;
|
|
if ((scene->_shuttle._frame % 2) == 0) {
|
|
scene->_shuttle._frameChange = _direction;
|
|
scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
|
|
}
|
|
// CHECKME: All the var_8 initialization was missing in the original
|
|
// but it's clearly a cut and paste error from case 4.
|
|
// The following code allows the switch to work properly.
|
|
int var_8 = (_direction * 2 + scene->_mazeDirection);
|
|
if (var_8 > 7)
|
|
var_8 = 1;
|
|
else if (var_8 < 1)
|
|
var_8 = 7;
|
|
//
|
|
|
|
switch (var_8 - 1) {
|
|
case 0:
|
|
// No break on purpose
|
|
case 4:
|
|
scene->_mazePosition.x = scene->_mazeUI.cellFromX(scene->_mazePosition.x + 70) - 70;
|
|
break;
|
|
case 2:
|
|
// No break on purpose
|
|
case 6:
|
|
scene->_mazePosition.y = scene->_mazeUI.cellFromY(scene->_mazePosition.y + 46) - 46;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
scene->_symbolLeft.hide();
|
|
scene->_symbolRight.hide();
|
|
_turningFl = false;
|
|
if (!_headingRightFl) {
|
|
scene->_throttle.updateSpeed();
|
|
if (scene->_mazeChangeAmount == scene->_speed)
|
|
scene->_aSound1.play(276);
|
|
}
|
|
break;
|
|
}
|
|
case 10: {
|
|
scene->_moverVertX = 160;
|
|
Common::Point pt(160, 73);
|
|
NpcMover *mover = new NpcMover();
|
|
scene->_tunnelVertCircle.addMover(mover, &pt, NULL);
|
|
|
|
scene->_moverHorzX = 160 - (_direction * 2 * 160);
|
|
Common::Point pt2(scene->_moverHorzX, 73);
|
|
NpcMover *mover2 = new NpcMover();
|
|
scene->_tunnelHorzCircle.addMover(mover2, &pt2, this);
|
|
_actionIndex = 6;
|
|
}
|
|
break;
|
|
case 11: {
|
|
scene->_tunnelVertCircle.setStrip(2);
|
|
scene->_tunnelVertCircle.setPosition(Common::Point(160, 73));
|
|
scene->_moverVertX = 160 - (_direction * 2 * 160);
|
|
Common::Point pt(scene->_moverVertX, 73);
|
|
NpcMover *mover = new NpcMover();
|
|
scene->_tunnelVertCircle.addMover(mover, &pt, NULL);
|
|
scene->_tunnelVertCircle.fixPriority(11);
|
|
if (!_headingRightFl)
|
|
scene->_tunnelHorzCircle.setStrip(1);
|
|
else
|
|
scene->_tunnelHorzCircle.setStrip(2);
|
|
scene->_tunnelHorzCircle.setPosition(Common::Point(160 - (_direction * 2 * 160), 73));
|
|
scene->_moverHorzX = 160;
|
|
Common::Point pt2(scene->_moverHorzX, 73);
|
|
NpcMover *mover2 = new NpcMover();
|
|
scene->_tunnelHorzCircle.addMover(mover2, &pt2, this);
|
|
scene->_tunnelHorzCircle.fixPriority(1);
|
|
_actionIndex = 5;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene3500::Action1::dispatch() {
|
|
Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
Action::dispatch();
|
|
if ((_actionIndex == 1) && (scene->_mazeChangeAmount <= 4)) {
|
|
scene->_rotation->_idxChange = 0;
|
|
signal();
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
Scene3500::Action2::Action2() {
|
|
_direction = 0;
|
|
}
|
|
|
|
void Scene3500::Action2::synchronize(Serializer &s) {
|
|
Action::synchronize(s);
|
|
|
|
s.syncAsSint16LE(_direction);
|
|
}
|
|
|
|
void Scene3500::Action2::handleVertButton(int direction) {
|
|
Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
// Directions : 2 == up, -1 == down
|
|
_direction = direction;
|
|
if (_direction == -1)
|
|
scene->_horizontalSpeedDisplay.setFrame2(3);
|
|
else
|
|
scene->_horizontalSpeedDisplay.setFrame2(1);
|
|
|
|
setActionIndex(0);
|
|
}
|
|
|
|
void Scene3500::Action2::signal() {
|
|
Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
int vertX;
|
|
int horzX;
|
|
|
|
switch (_actionIndex++) {
|
|
case 0: {
|
|
if (scene->_tunnelVertCircle._mover) {
|
|
vertX = scene->_moverVertX;
|
|
horzX = scene->_moverHorzX;
|
|
} else {
|
|
scene->_moverVertX = scene->_tunnelVertCircle._position.x;
|
|
vertX = scene->_moverVertX;
|
|
scene->_moverHorzX = scene->_tunnelHorzCircle._position.y;
|
|
horzX = scene->_moverHorzX;
|
|
}
|
|
|
|
scene->_tunnelVertCircle._moveDiff.y = 9 - (scene->_mazeChangeAmount / 2);
|
|
Common::Point pt(vertX, 73 - (_direction * 12));
|
|
NpcMover *mover = new NpcMover();
|
|
scene->_tunnelVertCircle.addMover(mover, &pt, NULL);
|
|
|
|
scene->_tunnelHorzCircle._moveDiff.y = 9 - (scene->_mazeChangeAmount / 2);
|
|
Common::Point pt2(horzX, 73 - (_direction * 12));
|
|
NpcMover *mover2 = new NpcMover();
|
|
scene->_tunnelHorzCircle.addMover(mover2, &pt2, NULL);
|
|
scene->_mazeChangeAmount = (scene->_mazeChangeAmount / 2) + (scene->_mazeChangeAmount % 2);
|
|
setDelay(17 - scene->_mazeChangeAmount);
|
|
}
|
|
break;
|
|
case 1: {
|
|
R2_GLOBALS._sound2.play(339);
|
|
if (scene->_tunnelVertCircle._mover) {
|
|
vertX = scene->_moverVertX;
|
|
horzX = scene->_moverHorzX;
|
|
} else {
|
|
vertX = scene->_tunnelVertCircle._position.x;
|
|
horzX = scene->_tunnelHorzCircle._position.x;
|
|
}
|
|
|
|
scene->_throttle.updateSpeed();
|
|
|
|
scene->_tunnelVertCircle._moveDiff.y = 9 - (scene->_mazeChangeAmount / 2);
|
|
Common::Point pt(vertX, 73);
|
|
NpcMover *mover = new NpcMover();
|
|
scene->_tunnelVertCircle.addMover(mover, &pt, NULL);
|
|
|
|
scene->_tunnelHorzCircle._moveDiff.y = 9 - (scene->_mazeChangeAmount / 2);
|
|
Common::Point pt2(horzX, 73);
|
|
NpcMover *mover2 = new NpcMover();
|
|
scene->_tunnelHorzCircle.addMover(mover2, &pt2, NULL);
|
|
|
|
scene->_horizontalSpeedDisplay.setFrame2(2);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
Scene3500::DirectionButton::DirectionButton() {
|
|
_movementId = 0;
|
|
}
|
|
|
|
void Scene3500::DirectionButton::synchronize(Serializer &s) {
|
|
NamedHotspot::synchronize(s);
|
|
|
|
s.syncAsSint16LE(_movementId);
|
|
}
|
|
|
|
bool Scene3500::DirectionButton::startAction(CursorType action, Event &event) {
|
|
Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
if (!scene->_directionChangesEnabled) {
|
|
return true;
|
|
} else if (action == CURSOR_USE) {
|
|
R2_GLOBALS._sound2.play(14, nullptr, 63);
|
|
scene->doMovement(_movementId);
|
|
return true;
|
|
} else {
|
|
return SceneHotspot::startAction(action, event);
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
Scene3500::Throttle::Throttle() {
|
|
_deltaX = 1;
|
|
_deltaY = 0;
|
|
_slideDeltaY = 0;
|
|
_deltaMouseY = 0;
|
|
}
|
|
|
|
void Scene3500::Throttle::synchronize(Serializer &s) {
|
|
SceneActor::synchronize(s);
|
|
|
|
s.syncAsSint16LE(_pos.x);
|
|
s.syncAsSint16LE(_pos.y);
|
|
s.syncAsSint16LE(_deltaX);
|
|
s.syncAsSint16LE(_deltaY);
|
|
s.syncAsSint16LE(_slideDeltaY);
|
|
s.syncAsSint16LE(_deltaMouseY);
|
|
}
|
|
|
|
void Scene3500::Throttle::init(int xp, int yp, int dx, int dy, int speed) {
|
|
_deltaMouseY = 0;
|
|
_pos = Common::Point(xp, yp);
|
|
_deltaX = dx;
|
|
_deltaY = dy;
|
|
_slideDeltaY = _deltaY / _deltaX;
|
|
|
|
postInit();
|
|
setup(1050, 3, 1);
|
|
fixPriority(255);
|
|
setSpeed(speed);
|
|
}
|
|
|
|
void Scene3500::Throttle::updateSpeed() {
|
|
Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
scene->_speed = _position.x - _pos.x;
|
|
}
|
|
|
|
void Scene3500::Throttle::setSpeed(int arg1){
|
|
changePosition(Common::Point(_pos.x + arg1, _pos.y - (_slideDeltaY * arg1)));
|
|
}
|
|
|
|
void Scene3500::Throttle::changePosition(const Common::Point &pt) {
|
|
setPosition(pt);
|
|
}
|
|
|
|
void Scene3500::Throttle::process(Event &event) {
|
|
Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
if (!scene->_directionChangesEnabled)
|
|
return;
|
|
|
|
if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE) && (_bounds.contains(event.mousePos))) {
|
|
_deltaMouseY = 1 + event.mousePos.y - _position.y;
|
|
event.eventType = EVENT_NONE;
|
|
}
|
|
|
|
if ((event.eventType == EVENT_BUTTON_UP) && (_deltaMouseY != 0)) {
|
|
_deltaMouseY = 0;
|
|
event.handled = true;
|
|
if (!scene->_action1._turningFl)
|
|
updateSpeed();
|
|
}
|
|
|
|
if (_deltaMouseY == 0)
|
|
return;
|
|
|
|
R2_GLOBALS._sound2.play(338);
|
|
event.handled = true;
|
|
|
|
int cx = event.mousePos.y - _deltaMouseY + 1;
|
|
if (_pos.y >= cx) {
|
|
if (_pos.y - _deltaY <= cx)
|
|
changePosition(Common::Point(((_pos.y - cx) / 2) + _pos.x + ((_pos.y - cx) % 2), cx));
|
|
else
|
|
changePosition(Common::Point(_pos.x + _deltaX, _pos.y - _deltaY));
|
|
} else {
|
|
changePosition(Common::Point(_pos.x, _pos.y));
|
|
}
|
|
}
|
|
|
|
bool Scene3500::Throttle::startAction(CursorType action, Event &event) {
|
|
Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
if (!scene->_directionChangesEnabled) {
|
|
return true;
|
|
} else if (action == CURSOR_USE) {
|
|
return false;
|
|
} else {
|
|
return SceneActor::startAction(action, event);
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
int16 Scene3500::MazeUI3500::cellFromX(int x) {
|
|
return (_cellSize.x / 2) + x - (x % _cellSize.x);
|
|
}
|
|
|
|
int16 Scene3500::MazeUI3500::cellFromY(int y) {
|
|
return (_cellSize.y / 2) + y - (y % _cellSize.y) - 1;
|
|
}
|
|
|
|
int Scene3500::MazeUI3500::getCellFromMapXY(Common::Point pt) {
|
|
int cellX = pt.x / _cellSize.x;
|
|
int cellY = pt.y / _cellSize.y;
|
|
|
|
if ((cellX >= 0) && (cellY >= 0) && (cellX < _mapCells.x) && (cellY < _mapCells.y)) {
|
|
return (int16)READ_LE_UINT16(_mapData + (_mapCells.x * cellY + cellX) * 2);
|
|
} else
|
|
return -1;
|
|
}
|
|
|
|
bool Scene3500::MazeUI3500::setMazePosition2(Common::Point &p) {
|
|
bool retVal = setMazePosition(p);
|
|
p = _mapOffset;
|
|
|
|
return retVal;
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
Scene3500::Scene3500() {
|
|
_moverVertX = 0;
|
|
_moverHorzX = 0;
|
|
_rotation = NULL;
|
|
_mazeChangeAmount = 0;
|
|
_speed = 0;
|
|
_updateIdxChangeFl = false;
|
|
_mazeDirection = MAZEDIR_NONE;
|
|
_nextMove = 0;
|
|
_mazePosition.x = 0;
|
|
_mazePosition.y = 0;
|
|
_postFixupFl = true; // Set to true in fixup()
|
|
_exitCounter = 0;
|
|
_directionChangesEnabled = false;
|
|
}
|
|
|
|
void Scene3500::synchronize(Serializer &s) {
|
|
SceneExt::synchronize(s);
|
|
SYNC_POINTER(_rotation);
|
|
|
|
s.syncAsSint16LE(_moverVertX);
|
|
s.syncAsSint16LE(_moverHorzX);
|
|
s.syncAsSint16LE(_mazeChangeAmount);
|
|
s.syncAsSint16LE(_speed);
|
|
s.syncAsSint16LE(_updateIdxChangeFl);
|
|
s.syncAsSint16LE(_mazeDirection);
|
|
s.syncAsSint16LE(_nextMove);
|
|
s.syncAsSint16LE(_mazePosition.x);
|
|
s.syncAsSint16LE(_mazePosition.y);
|
|
s.syncAsSint16LE(_postFixupFl);
|
|
s.syncAsSint16LE(_exitCounter);
|
|
s.syncAsSint16LE(_directionChangesEnabled);
|
|
}
|
|
|
|
void Scene3500::postInit(SceneObjectList *OwnerList) {
|
|
byte tmpPal[768];
|
|
|
|
loadScene(1050);
|
|
R2_GLOBALS._uiElements._active = false;
|
|
R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
|
|
|
|
R2_GLOBALS._sound1.play(305);
|
|
R2_GLOBALS._player._characterIndex = R2_QUINN;
|
|
R2_GLOBALS._player._characterScene[R2_QUINN] = 3500;
|
|
R2_GLOBALS._player._characterScene[R2_SEEKER] = 3500;
|
|
R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3500;
|
|
_exitCounter = 0;
|
|
_postFixupFl = false;
|
|
_nextMove = 0;
|
|
_updateIdxChangeFl = true;
|
|
_speed = 4;
|
|
_mazeChangeAmount = 4;
|
|
_mazePosition = Common::Point(860, 891);
|
|
_rotation = R2_GLOBALS._scenePalette.addRotation(240, 254, -1);
|
|
_rotation->setDelay(0);
|
|
_rotation->_idxChange = 1;
|
|
|
|
for (int i = 240; i <= 254; i++) {
|
|
int tmpIndex = _rotation->_currIndex - 240;
|
|
|
|
if (tmpIndex > 254)
|
|
tmpIndex--;
|
|
|
|
tmpPal[3 * i] = R2_GLOBALS._scenePalette._palette[3 * tmpIndex];
|
|
tmpPal[(3 * i) + 1] = R2_GLOBALS._scenePalette._palette[(3 * tmpIndex) + 1];
|
|
tmpPal[(3 * i) + 2] = R2_GLOBALS._scenePalette._palette[(3 * tmpIndex) + 2];
|
|
}
|
|
|
|
for (int i = 240; i <= 254; i++) {
|
|
R2_GLOBALS._scenePalette._palette[3 * i] = tmpPal[3 * i];
|
|
R2_GLOBALS._scenePalette._palette[(3 * i) + 1] = tmpPal[(3 * i) + 1];
|
|
R2_GLOBALS._scenePalette._palette[(3 * i) + 2] = tmpPal[(3 * i) + 2];
|
|
}
|
|
|
|
_throttle.init(38, 165, 16, 32, _speed);
|
|
_throttle.setDetails(3500, 6, 7, -1, 1, (SceneItem *)NULL);
|
|
R2_GLOBALS._sound1.play(276);
|
|
|
|
_pitchDown._movementId = 88;
|
|
_pitchDown.setDetails(88, 3500, 18, 10, -1);
|
|
|
|
_turnLeft._movementId = 112;
|
|
_turnLeft.setDetails(112, 3500, 9, 10, -1);
|
|
|
|
_pitchUp._movementId = 104;
|
|
_pitchUp.setDetails(104, 3500, 15, 10, -1);
|
|
|
|
_turnRight._movementId = 96;
|
|
_turnRight.setDetails(96, 3500, 12, 10, -1);
|
|
|
|
_tunnelVertCircle.postInit();
|
|
_tunnelVertCircle.setup(1050, 1, 1);
|
|
_tunnelVertCircle.setPosition(Common::Point(160, 73));
|
|
_tunnelVertCircle.fixPriority(1);
|
|
|
|
_tunnelHorzCircle.postInit();
|
|
_tunnelHorzCircle.setup(1050, 2, 1);
|
|
_tunnelHorzCircle.setPosition(Common::Point(-160, 73));
|
|
_tunnelHorzCircle.fixPriority(11);
|
|
_tunnelHorzCircle.hide();
|
|
|
|
_outsideView.setDetails(27, 3500, 21, -1, -1);
|
|
_mapScreen.setDetails(Rect(160, 89, 299, 182), 3500, 3, -1, -1, 1, NULL);
|
|
_background.setDetails(Rect(0, 0, 320, 200), 3500, 0, -1, 2, 1, NULL);
|
|
|
|
_shuttle.postInit();
|
|
_mazeDirection = MAZEDIR_NORTH;
|
|
_shuttle.setup(1004, 1, _mazeDirection);
|
|
_shuttle.setPosition(Common::Point(230, 135));
|
|
_shuttle.fixPriority(200);
|
|
_shuttle._frameChange = 1;
|
|
|
|
_symbolLeft.postInit();
|
|
_symbolLeft.setup(1004, 3, 1);
|
|
_symbolLeft.setPosition(Common::Point(117, 163));
|
|
_symbolLeft.fixPriority(200);
|
|
_symbolLeft.hide();
|
|
|
|
_symbolVertical.postInit();
|
|
_symbolVertical.setup(1004, 3, 2);
|
|
_symbolVertical.setPosition(Common::Point(126, 163));
|
|
_symbolVertical.fixPriority(200);
|
|
|
|
_symbolRight.postInit();
|
|
_symbolRight.setup(1004, 3, 3);
|
|
_symbolRight.setPosition(Common::Point(135, 163));
|
|
_symbolRight.fixPriority(200);
|
|
_symbolRight.hide();
|
|
|
|
_verticalSpeedDisplay.postInit();
|
|
_verticalSpeedDisplay.setup(1004, 4, _mazeChangeAmount + 1);
|
|
_verticalSpeedDisplay.setPosition(Common::Point(126, 137));
|
|
_verticalSpeedDisplay.fixPriority(200);
|
|
|
|
_horizontalSpeedDisplay.postInit();
|
|
_horizontalSpeedDisplay.setup(1004, 5, 2);
|
|
_horizontalSpeedDisplay.setPosition(Common::Point(126, 108));
|
|
_horizontalSpeedDisplay.fixPriority(200);
|
|
|
|
_mazeUI.setDisplayBounds(Rect(160, 89, 299, 182));
|
|
_mazeUI.load(2);
|
|
_mazeUI.setMazePosition(_mazePosition);
|
|
|
|
_action1._turningFl = false;
|
|
_mazeUI.draw();
|
|
_directionChangesEnabled = true;
|
|
|
|
R2_GLOBALS._player.postInit();
|
|
R2_GLOBALS._player.hide();
|
|
R2_GLOBALS._player.enableControl(CURSOR_USE);
|
|
R2_GLOBALS._player._uiEnabled = false;
|
|
R2_GLOBALS._player._canWalk = false;
|
|
}
|
|
|
|
void Scene3500::doMovement(int id) {
|
|
switch (id) {
|
|
case -1:
|
|
_throttle.updateSpeed();
|
|
if (_speed != 0) {
|
|
_speed--;
|
|
_throttle.setSpeed(_speed);
|
|
}
|
|
if (_action1._turningFl)
|
|
_speed = 0;
|
|
break;
|
|
case 1:
|
|
_throttle.updateSpeed();
|
|
if (_speed < 16) {
|
|
++_speed;
|
|
_throttle.setSpeed(_speed);
|
|
}
|
|
if (_action1._turningFl)
|
|
_speed = 0;
|
|
break;
|
|
case 88:
|
|
// Up button has been pressed
|
|
// The original was doing a double check on action, only one is here.
|
|
if (!_action || (!_action1._turningFl)) {
|
|
_action2.handleVertButton(2);
|
|
if (_action && ((_action2.getActionIndex() != 0) || (_action2._direction != 2))) {
|
|
_action2.signal();
|
|
} else {
|
|
_tunnelHorzCircle.setAction(&_action2, &_tunnelHorzCircle, NULL);
|
|
}
|
|
}
|
|
break;
|
|
case 96:
|
|
// Right button has been pressed
|
|
if (!_action || !_action1._turningFl || (_action1._direction == 1)) {
|
|
if (_action && (_nextMove == 0) && (_action1._turningFl)) {
|
|
_nextMove = id;
|
|
} else if (_action && (!_action1._turningFl)) {
|
|
_action1.handleHorzButton(1);
|
|
_action1.signal();
|
|
} else if (!_action) {
|
|
_action1.handleHorzButton(1);
|
|
setAction(&_action1, &_shuttle, NULL);
|
|
}
|
|
|
|
} else {
|
|
if (_nextMove != 0)
|
|
_nextMove = 0;
|
|
|
|
_action1.turnShuttle(false);
|
|
}
|
|
break;
|
|
case 104:
|
|
// Down button has been pressed
|
|
if (!_action || (!_action1._turningFl)) {
|
|
_action2.handleVertButton(-1);
|
|
if ((_action) && ((_action2.getActionIndex() != 0) || (_action2._direction != -1))) {
|
|
_action2.signal();
|
|
} else {
|
|
_tunnelHorzCircle.setAction(&_action2, &_tunnelHorzCircle, NULL);
|
|
}
|
|
}
|
|
break;
|
|
case 112:
|
|
// Left button has been pressed
|
|
if (!_action || !_action1._turningFl || (_action1._direction == 1)) {
|
|
if (_action && (_nextMove == 0) && (_action1._turningFl)) {
|
|
_nextMove = id;
|
|
} else if (_action && (!_action1._turningFl)) {
|
|
_action1.handleHorzButton(-1);
|
|
_action1.signal();
|
|
} else if (!_action) {
|
|
_action1.handleHorzButton(-1);
|
|
setAction(&_action1, &_shuttle, NULL);
|
|
}
|
|
|
|
} else {
|
|
if (_nextMove != 0)
|
|
_nextMove = 0;
|
|
|
|
_action1.turnShuttle(false);
|
|
}
|
|
break;
|
|
default:
|
|
_speed = id;
|
|
_throttle.setSpeed(id);
|
|
if (_action1._turningFl) {
|
|
_speed = 0;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene3500::remove() {
|
|
R2_GLOBALS._sound2.fadeOut2(NULL);
|
|
SceneExt::remove();
|
|
}
|
|
|
|
void Scene3500::signal() {
|
|
R2_GLOBALS._player.enableControl(CURSOR_USE);
|
|
R2_GLOBALS._player._canWalk = false;
|
|
_directionChangesEnabled = true;
|
|
}
|
|
|
|
void Scene3500::process(Event &event) {
|
|
if (!_directionChangesEnabled)
|
|
return;
|
|
|
|
if (event.eventType == EVENT_KEYPRESS) {
|
|
switch (event.kbd.keycode) {
|
|
case Common::KEYCODE_KP7:
|
|
R2_GLOBALS._sound2.play(338);
|
|
doMovement(16);
|
|
event.handled = true;
|
|
break;
|
|
case Common::KEYCODE_UP:
|
|
case Common::KEYCODE_KP8:
|
|
R2_GLOBALS._sound2.play(14, NULL, 63);
|
|
doMovement(88);
|
|
event.handled = true;
|
|
break;
|
|
case Common::KEYCODE_KP9:
|
|
if (_speed < 16)
|
|
R2_GLOBALS._sound2.play(338);
|
|
doMovement(1);
|
|
event.handled = true;
|
|
break;
|
|
case Common::KEYCODE_KP4:
|
|
case Common::KEYCODE_LEFT:
|
|
R2_GLOBALS._sound2.play(14, NULL, 63);
|
|
doMovement(112);
|
|
event.handled = true;
|
|
break;
|
|
case Common::KEYCODE_KP6:
|
|
case Common::KEYCODE_RIGHT:
|
|
R2_GLOBALS._sound2.play(14, NULL, 63);
|
|
doMovement(96);
|
|
event.handled = true;
|
|
break;
|
|
case Common::KEYCODE_KP1:
|
|
R2_GLOBALS._sound2.play(338);
|
|
doMovement(0);
|
|
event.handled = true;
|
|
break;
|
|
case Common::KEYCODE_KP2:
|
|
case Common::KEYCODE_DOWN:
|
|
R2_GLOBALS._sound2.play(14, NULL, 63);
|
|
doMovement(104);
|
|
event.handled = true;
|
|
break;
|
|
case Common::KEYCODE_KP3:
|
|
if (_speed != 0)
|
|
R2_GLOBALS._sound2.play(338);
|
|
doMovement(-1);
|
|
event.handled = true;
|
|
break;
|
|
case Common::KEYCODE_KP0:
|
|
R2_GLOBALS._sound2.play(338);
|
|
doMovement(8);
|
|
event.handled = true;
|
|
break;
|
|
case Common::KEYCODE_KP_PERIOD:
|
|
R2_GLOBALS._sound2.play(338);
|
|
doMovement(4);
|
|
event.handled = true;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!event.handled)
|
|
_throttle.process(event);
|
|
|
|
if (!event.handled)
|
|
_pitchDown.process(event);
|
|
|
|
if (!event.handled)
|
|
_turnLeft.process(event);
|
|
|
|
if (!event.handled)
|
|
_pitchUp.process(event);
|
|
|
|
if (!event.handled)
|
|
_turnRight.process(event);
|
|
|
|
Scene::process(event);
|
|
}
|
|
|
|
void Scene3500::dispatch() {
|
|
Rect tmpRect;
|
|
Scene::dispatch();
|
|
|
|
if (((_shuttle._frame % 2) == 0) && (!_action1._turningFl)) {
|
|
_shuttle.setFrame(_shuttle.changeFrame());
|
|
_mazeDirection = _shuttle._frame;
|
|
}
|
|
|
|
if ((_nextMove != 0) && (!_action1._turningFl)) {
|
|
int move = _nextMove;
|
|
_nextMove = 0;
|
|
doMovement(move);
|
|
}
|
|
|
|
if (!_rotation)
|
|
return;
|
|
|
|
int16 newMazeX = 0;
|
|
int16 newMazeY = 0;
|
|
int16 mazePosX = 0;
|
|
int16 mazePosY = 0;
|
|
int deltaX = 0;
|
|
int deltaY = 0;
|
|
int tmpCellId = 0;
|
|
int cellId = 0;
|
|
|
|
if ((_mazeChangeAmount == 0) && !_postFixupFl) {
|
|
if (_exitCounter == 2)
|
|
R2_GLOBALS._sceneManager.changeScene(1000);
|
|
} else {
|
|
_postFixupFl = false;
|
|
tmpRect.set(160, 89, 299, 182);
|
|
|
|
newMazeX = _mazePosition.x;
|
|
newMazeY = _mazePosition.y;
|
|
mazePosX = _mazeUI.cellFromX(newMazeX + 70) - 70;
|
|
mazePosY = _mazeUI.cellFromY(_mazePosition.y + 46) - 46;
|
|
deltaX = abs(mazePosX - newMazeX);
|
|
deltaY = abs(mazePosY - newMazeY);
|
|
tmpCellId = 0;
|
|
|
|
switch (_mazeDirection) {
|
|
case MAZEDIR_NORTH:
|
|
cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
|
|
if (((cellId == 2) || (cellId == 3) || (cellId == 6) || (cellId == 1)) ||
|
|
((cellId == 25 || cellId == 26 || cellId == 5 || cellId == 14 || cellId == 15) && deltaX > 3)) {
|
|
R2_GLOBALS._sound2.play(339);
|
|
_rotation->_idxChange = 0;
|
|
_speed = 0;
|
|
_mazeChangeAmount = 0;
|
|
_updateIdxChangeFl = false;
|
|
if (!_action1._turningFl)
|
|
_tunnelVertCircle.hide();
|
|
} else {
|
|
mazePosY = _mazeUI.cellFromY(newMazeY + 46) - 46;
|
|
newMazeY = _mazePosition.y - _mazeChangeAmount;
|
|
tmpCellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
|
|
if (((cellId == 23) || (cellId == 24) || (cellId == 4)) && (cellId != tmpCellId)) {
|
|
newMazeY = mazePosY;
|
|
R2_GLOBALS._sound2.play(339);
|
|
_rotation->_idxChange = 0;
|
|
_speed = 0;
|
|
_mazeChangeAmount = 0;
|
|
_updateIdxChangeFl = false;
|
|
if (!_action1._turningFl)
|
|
_tunnelVertCircle.hide();
|
|
} else if ((cellId == 11) && (cellId != tmpCellId)) {
|
|
newMazeY = mazePosY + 3;
|
|
R2_GLOBALS._sound2.play(339);
|
|
_rotation->_idxChange = 0;
|
|
_speed = 0;
|
|
_mazeChangeAmount = 0;
|
|
_updateIdxChangeFl = false;
|
|
if (!_action1._turningFl)
|
|
_tunnelVertCircle.hide();
|
|
} else {
|
|
mazePosY = _mazeUI.cellFromY(newMazeY + 46) - 46;
|
|
deltaY = abs(mazePosY - newMazeY);
|
|
cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
|
|
|
|
if ( (((cellId == 23) || (cellId == 24) || (cellId == 4)) && (newMazeY <= mazePosY) && (_mazePosition.y>= mazePosY))
|
|
|| (((cellId == 25) || (cellId == 26) || (cellId == 5) || (cellId == 14) || (cellId == 15)) && (_mazeChangeAmount >= deltaY) && (_mazeChangeAmount > 3) && (_action1._turningFl != 0)) ) {
|
|
newMazeY = mazePosY;
|
|
if ((cellId != 25) && (cellId != 26) && (cellId != 5) && (cellId != 14) && (cellId == 15))
|
|
R2_GLOBALS._sound2.play(339);
|
|
_rotation->_idxChange = 0;
|
|
_speed = 0;
|
|
_mazeChangeAmount = 0;
|
|
_updateIdxChangeFl = false;
|
|
if (!_action1._turningFl)
|
|
_tunnelVertCircle.hide();
|
|
} else if ((cellId == 11) && (mazePosY + 3 >= newMazeY) && (_mazePosition.y >= mazePosY + 3)) {
|
|
R2_GLOBALS._sound2.play(339);
|
|
_rotation->_idxChange = 0;
|
|
_speed = 0;
|
|
_mazeChangeAmount = 0;
|
|
_updateIdxChangeFl = false;
|
|
if (!_action1._turningFl)
|
|
_tunnelVertCircle.hide();
|
|
} else if (((cellId == 25) || (cellId == 26) || (cellId == 5) || (cellId == 14) || (cellId == 15)) && (deltaX != 0) && (deltaX <= 3)) {
|
|
newMazeX = mazePosX;
|
|
R2_GLOBALS._sound2.play(339);
|
|
} else {
|
|
// Nothing
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case MAZEDIR_EAST:
|
|
cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
|
|
if ( ((cellId == 12) || (cellId == 13) || (cellId == 11) || (cellId == 16) || (cellId == 31))
|
|
|| (((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4)) && (deltaY > 3)) ) {
|
|
R2_GLOBALS._sound2.play(339);
|
|
_rotation->_idxChange = 0;
|
|
_speed = 0;
|
|
_mazeChangeAmount = 0;
|
|
_updateIdxChangeFl = false;
|
|
if (!_action1._turningFl)
|
|
_tunnelVertCircle.hide();
|
|
} else {
|
|
mazePosX = _mazeUI.cellFromX(newMazeX + 70) - 70;
|
|
newMazeX = _mazePosition.x + _mazeChangeAmount;
|
|
tmpCellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
|
|
if (((cellId == 26) || (cellId == 24) || (cellId == 15)) && (cellId != tmpCellId)) {
|
|
newMazeX = mazePosX;
|
|
R2_GLOBALS._sound2.play(339);
|
|
_rotation->_idxChange = 0;
|
|
_speed = 0;
|
|
_mazeChangeAmount = 0;
|
|
_updateIdxChangeFl = false;
|
|
if (!_action1._turningFl)
|
|
_tunnelVertCircle.hide();
|
|
} else if ((cellId == 6) && (cellId != tmpCellId)) {
|
|
newMazeX = mazePosX - 5;
|
|
R2_GLOBALS._sound2.play(339);
|
|
_rotation->_idxChange = 0;
|
|
_speed = 0;
|
|
_mazeChangeAmount = 0;
|
|
_updateIdxChangeFl = false;
|
|
if (!_action1._turningFl)
|
|
_tunnelVertCircle.hide();
|
|
} else {
|
|
mazePosX = _mazeUI.cellFromX(newMazeX + 70) - 70;
|
|
deltaX = abs(newMazeX - mazePosX);
|
|
cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
|
|
if ( (((cellId == 26) || (cellId == 24) || (cellId == 15)) && (newMazeX >= mazePosX) && (_mazePosition.x <= mazePosX))
|
|
|| (((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4)) && (_mazeChangeAmount >= deltaX) && (_mazeChangeAmount <= 3) && (_action1._turningFl != 0)) ) {
|
|
newMazeX = mazePosX;
|
|
if ((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4))
|
|
R2_GLOBALS._sound2.play(339);
|
|
_rotation->_idxChange = 0;
|
|
_speed = 0;
|
|
_mazeChangeAmount = 0;
|
|
_updateIdxChangeFl = false;
|
|
if (!_action1._turningFl)
|
|
_tunnelVertCircle.hide();
|
|
} else if ((cellId == 6) && (mazePosX - 5 <= newMazeX) && (_mazePosition.x <= mazePosX - 5)) {
|
|
newMazeX = mazePosX - 5;
|
|
R2_GLOBALS._sound2.play(339);
|
|
_rotation->_idxChange = 0;
|
|
_speed = 0;
|
|
_mazeChangeAmount = 0;
|
|
_updateIdxChangeFl = false;
|
|
if (!_action1._turningFl)
|
|
_tunnelVertCircle.hide();
|
|
} else if (((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4)) && (deltaY != 0) && (deltaY <= 3)) {
|
|
newMazeY = mazePosY;
|
|
R2_GLOBALS._sound2.play(339);
|
|
} else {
|
|
// Nothing
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case MAZEDIR_SOUTH:
|
|
cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
|
|
if ( ((cellId == 2) || (cellId == 3) || (cellId == 6) || (cellId == 1))
|
|
|| (((cellId == 23) || (cellId == 24) || (cellId == 4) || (cellId == 14) || (cellId == 15)) && (deltaX > 3)) ) {
|
|
R2_GLOBALS._sound2.play(339);
|
|
_rotation->_idxChange = 0;
|
|
_speed = 0;
|
|
_mazeChangeAmount = 0;
|
|
_updateIdxChangeFl = false;
|
|
if (!_action1._turningFl)
|
|
_tunnelVertCircle.hide();
|
|
} else {
|
|
mazePosY = _mazeUI.cellFromY(newMazeY + 46) - 46;
|
|
newMazeY = _mazePosition.y + _mazeChangeAmount;
|
|
tmpCellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
|
|
|
|
if (((cellId == 25) || (cellId == 26) || (cellId == 5)) && (cellId != tmpCellId)) {
|
|
R2_GLOBALS._sound2.play(339);
|
|
_rotation->_idxChange = 0;
|
|
_speed = 0;
|
|
_mazeChangeAmount = 0;
|
|
_updateIdxChangeFl = false;
|
|
if (!_action1._turningFl)
|
|
_tunnelVertCircle.hide();
|
|
} else if ((cellId == 16) && (cellId != tmpCellId)) {
|
|
newMazeY = mazePosY - 3;
|
|
R2_GLOBALS._sound2.play(339);
|
|
_rotation->_idxChange = 0;
|
|
_speed = 0;
|
|
_mazeChangeAmount = 0;
|
|
_updateIdxChangeFl = false;
|
|
if (!_action1._turningFl)
|
|
_tunnelVertCircle.hide();
|
|
} else if ((cellId == 31) && (cellId != tmpCellId)) {
|
|
newMazeY = mazePosY + 4;
|
|
R2_GLOBALS._sound2.play(339);
|
|
_rotation->_idxChange = 0;
|
|
_speed = 0;
|
|
_mazeChangeAmount = 0;
|
|
_updateIdxChangeFl = false;
|
|
if (!_action1._turningFl)
|
|
_tunnelVertCircle.hide();
|
|
} else {
|
|
mazePosY = _mazeUI.cellFromY(newMazeY + 46) - 46;
|
|
deltaY = abs(newMazeY - mazePosY);
|
|
cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
|
|
if ( (((cellId == 25) || (cellId == 26) || (cellId == 5)) && (newMazeY >= mazePosY) && (_mazePosition.y <= mazePosY))
|
|
|| (((cellId == 23) || (cellId == 24) || (cellId == 4) || (cellId == 14) || (cellId == 15)) && (_mazeChangeAmount >= deltaY) && (_mazeChangeAmount <= 3) && (_action1._turningFl != 0)) ){
|
|
newMazeY = mazePosY;
|
|
|
|
if ((cellId != 23) && (cellId != 24) && (cellId != 4) && (cellId != 14) && (cellId != 15))
|
|
R2_GLOBALS._sound2.play(339);
|
|
_rotation->_idxChange = 0;
|
|
_speed = 0;
|
|
_mazeChangeAmount = 0;
|
|
_updateIdxChangeFl = false;
|
|
if (!_action1._turningFl)
|
|
_tunnelVertCircle.hide();
|
|
} else if ((cellId == 16) && (mazePosY - 3 <= newMazeY) && (_mazePosition.y <= mazePosY - 3)) {
|
|
newMazeY = mazePosY - 3;
|
|
R2_GLOBALS._sound2.play(339);
|
|
_rotation->_idxChange = 0;
|
|
_speed = 0;
|
|
_mazeChangeAmount = 0;
|
|
_updateIdxChangeFl = false;
|
|
if (!_action1._turningFl)
|
|
_tunnelVertCircle.hide();
|
|
} else if ((cellId == 31) && (mazePosY + 4 <= newMazeY) && (_mazePosition.y <= mazePosY + 4)) {
|
|
newMazeY = mazePosY + 4;
|
|
_rotation->_idxChange = 0;
|
|
_speed = 0;
|
|
_mazeChangeAmount = 0;
|
|
_updateIdxChangeFl = false;
|
|
if (!_action1._turningFl)
|
|
_tunnelVertCircle.hide();
|
|
if ((newMazeX == 660) && (_mazeChangeAmount + 306 <= newMazeY) && (newMazeY <= 307))
|
|
++_exitCounter;
|
|
else
|
|
R2_GLOBALS._sound2.play(339);
|
|
} else if (((cellId == 23) || (cellId == 24) || (cellId == 4) || (cellId == 14) || (cellId == 15)) && (deltaX != 0) && (deltaX <= 3)) {
|
|
newMazeX = mazePosX;
|
|
R2_GLOBALS._sound2.play(339);
|
|
} else {
|
|
// Nothing
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case MAZEDIR_WEST:
|
|
cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
|
|
if ( ((cellId == 12) || (cellId == 13) || (cellId == 11) || (cellId == 16) || (cellId == 31))
|
|
|| (((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4)) && (deltaY > 3)) ) {
|
|
R2_GLOBALS._sound2.play(339);
|
|
_rotation->_idxChange = 0;
|
|
_speed = 0;
|
|
_mazeChangeAmount = 0;
|
|
_updateIdxChangeFl = false;
|
|
if (!_action1._turningFl)
|
|
_tunnelVertCircle.hide();
|
|
} else {
|
|
mazePosX = _mazeUI.cellFromX(newMazeX + 70) - 70;
|
|
newMazeX = _mazePosition.x - _mazeChangeAmount;
|
|
tmpCellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
|
|
if (((cellId == 25) || (cellId == 23) || (cellId == 14)) && (cellId != tmpCellId)) {
|
|
newMazeX = mazePosX;
|
|
R2_GLOBALS._sound2.play(339);
|
|
_rotation->_idxChange = 0;
|
|
_speed = 0;
|
|
_mazeChangeAmount = 0;
|
|
_updateIdxChangeFl = false;
|
|
if (!_action1._turningFl)
|
|
_tunnelVertCircle.hide();
|
|
} else if ((cellId == 1) && (cellId != tmpCellId)) {
|
|
newMazeX = mazePosX + 5;
|
|
R2_GLOBALS._sound2.play(339);
|
|
_rotation->_idxChange = 0;
|
|
_speed = 0;
|
|
_mazeChangeAmount = 0;
|
|
_updateIdxChangeFl = false;
|
|
if (!_action1._turningFl)
|
|
_tunnelVertCircle.hide();
|
|
} else {
|
|
mazePosX = _mazeUI.cellFromX(newMazeX + 70) - 70;
|
|
deltaX = abs(mazePosX - newMazeX);
|
|
cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
|
|
if ( (((cellId == 25) || (cellId == 23) || (cellId == 14)) && (newMazeX <= mazePosX) && (_mazePosition.x >= mazePosX))
|
|
|| (((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4)) && (_mazeChangeAmount >= deltaX) && (_mazeChangeAmount <= 3) && (_action1._turningFl)) ) {
|
|
newMazeX = mazePosX;
|
|
if ((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4))
|
|
R2_GLOBALS._sound2.play(339);
|
|
_rotation->_idxChange = 0;
|
|
_speed = 0;
|
|
_mazeChangeAmount = 0;
|
|
_updateIdxChangeFl = false;
|
|
if (!_action1._turningFl)
|
|
_tunnelVertCircle.hide();
|
|
} else if ((cellId == 1) && (newMazeX >= mazePosX + 5) && (_mazePosition.x >= mazePosX + 5)) {
|
|
newMazeX = mazePosX + 5;
|
|
R2_GLOBALS._sound2.play(339);
|
|
_rotation->_idxChange = 0;
|
|
_speed = 0;
|
|
_mazeChangeAmount = 0;
|
|
_updateIdxChangeFl = false;
|
|
if (!_action1._turningFl)
|
|
_tunnelVertCircle.hide();
|
|
} else if (((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4)) && (deltaY != 0) && (deltaY <= 3)) {
|
|
newMazeY = mazePosY;
|
|
R2_GLOBALS._sound2.play(339);
|
|
} else {
|
|
// Nothing
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (_exitCounter < 2) {
|
|
_mazePosition.x = newMazeX;
|
|
_mazePosition.y = newMazeY;
|
|
if (_mazeUI.setMazePosition2(_mazePosition) != 0) {
|
|
_updateIdxChangeFl = false;
|
|
_mazeChangeAmount = 0;
|
|
_speed = 0;
|
|
_rotation->setDelay(0);
|
|
_rotation->_idxChange = 0;
|
|
}
|
|
|
|
_mazeUI.draw();
|
|
if (_exitCounter != 0)
|
|
++_exitCounter;
|
|
}
|
|
}
|
|
|
|
if (!_updateIdxChangeFl) {
|
|
if (_mazeChangeAmount != _speed) {
|
|
if (_mazeChangeAmount >= _speed) {
|
|
if (_mazeChangeAmount == 1) {
|
|
if (_action1._turningFl) {
|
|
if ( ((_mazeDirection == 1) && (deltaX == 0) && (deltaY != 0) && (deltaY <= 3) && ((cellId == 25) || (cellId == 26) || (cellId == 5) || (cellId == 14) || (cellId == 15)))
|
|
|| ((_mazeDirection == 3) && (deltaY == 0) && (deltaX != 0) && (deltaX <= 3) && ((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4)))
|
|
|| ((_mazeDirection == 5) && (deltaX == 0) && (deltaY != 0) && (deltaY <= 3) && ((cellId == 23) || (cellId == 24) || (cellId == 4) || (cellId == 14) || (cellId == 15)))
|
|
|| ((_mazeDirection == 7) && (deltaY == 0) && (deltaX != 0) && (deltaX <= 3) && ((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4))) ){
|
|
_mazeChangeAmount = 1;
|
|
} else
|
|
_mazeChangeAmount--;
|
|
} else
|
|
_mazeChangeAmount--;
|
|
} else
|
|
_mazeChangeAmount--;
|
|
} else
|
|
++_mazeChangeAmount;
|
|
_updateIdxChangeFl = true;
|
|
}
|
|
_verticalSpeedDisplay.setFrame2(_mazeChangeAmount + 1);
|
|
}
|
|
|
|
if (_updateIdxChangeFl) {
|
|
if (_mazeChangeAmount == 0)
|
|
_rotation->_idxChange = 0;
|
|
else if (_mazeChangeAmount > 8)
|
|
_rotation->_idxChange = 2;
|
|
else
|
|
_rotation->_idxChange = 1;
|
|
|
|
_updateIdxChangeFl = false;
|
|
}
|
|
|
|
if (_mazeChangeAmount != 0) {
|
|
R2_GLOBALS._player._uiEnabled = false;
|
|
if (_mazeChangeAmount != _speed)
|
|
_aSound1.play(276);
|
|
} else {
|
|
R2_GLOBALS._player._uiEnabled = true;
|
|
_aSound1.fadeOut2(NULL);
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3600 - Cutscene - walking at gunpoint
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
Scene3600::Scene3600() {
|
|
_tealDead = false;
|
|
_lightEntered = false;
|
|
_ghoulTeleported = false;
|
|
}
|
|
void Scene3600::synchronize(Serializer &s) {
|
|
SceneExt::synchronize(s);
|
|
|
|
s.syncAsSint16LE(_tealDead);
|
|
s.syncAsSint16LE(_lightEntered);
|
|
s.syncAsSint16LE(_ghoulTeleported);
|
|
}
|
|
|
|
Scene3600::Action3600::Action3600() {
|
|
_part2Fl = false;
|
|
_fadePct = 0;
|
|
}
|
|
|
|
void Scene3600::Action3600::synchronize(Serializer &s) {
|
|
Action::synchronize(s);
|
|
|
|
s.syncAsSint16LE(_part2Fl);
|
|
s.syncAsSint16LE(_fadePct);
|
|
}
|
|
|
|
void Scene3600::Action3600::signal() {
|
|
Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
switch (_actionIndex) {
|
|
case 0:
|
|
++_actionIndex;
|
|
setDelay(60);
|
|
break;
|
|
case 1:
|
|
if (!_part2Fl) {
|
|
_part2Fl = true;
|
|
scene->_steppingDisk.setAction(NULL);
|
|
R2_GLOBALS._sound2.play(330, NULL, 0);
|
|
R2_GLOBALS._sound2.fade(127, 5, 10, false, NULL);
|
|
}
|
|
|
|
setDelay(1);
|
|
R2_GLOBALS._scenePalette.fade((const byte *)&scene->_palette1._palette, true, _fadePct);
|
|
if (_fadePct > 0)
|
|
_fadePct -= 2;
|
|
break;
|
|
case 2:
|
|
R2_GLOBALS._sound2.stop();
|
|
++_actionIndex;
|
|
setDelay(3);
|
|
break;
|
|
case 3:
|
|
R2_GLOBALS._sound2.play(330, this, 0);
|
|
R2_GLOBALS._sound2.fade(127, 5, 10, false, NULL);
|
|
_actionIndex = 1;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene3600::Action2::signal() {
|
|
Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
switch (_actionIndex) {
|
|
case 3621:
|
|
R2_GLOBALS._events.proc1();
|
|
R2_GLOBALS._player.enableControl();
|
|
_actionIndex = 3619;
|
|
scene->_protector._state = 0;
|
|
// No break on purpose
|
|
case 3619: {
|
|
++_actionIndex;
|
|
scene->_protector.setup(3127, 2, 1);
|
|
scene->_protector.animate(ANIM_MODE_1, NULL);
|
|
NpcMover *mover = new NpcMover();
|
|
scene->_protector.addMover(mover, &scene->_protector._actorDestPos, scene);
|
|
}
|
|
break;
|
|
default:
|
|
_actionIndex = 3619;
|
|
setDelay(360);
|
|
break;
|
|
}
|
|
}
|
|
|
|
bool Scene3600::LightShaft::startAction(CursorType action, Event &event) {
|
|
Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
if ((action != CURSOR_USE) || !scene->_action1._part2Fl)
|
|
return SceneItem::startAction(action, event);
|
|
|
|
R2_GLOBALS._walkRegions.enableRegion(2);
|
|
R2_GLOBALS._walkRegions.enableRegion(7);
|
|
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_sceneMode = 3624;
|
|
scene->_quinn.setStrip2(-1);
|
|
scene->_seeker.setStrip2(-1);
|
|
scene->_miranda.setStrip2(-1);
|
|
scene->_webbster.setStrip2(-1);
|
|
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
|
|
R2_GLOBALS._player.setAction(&scene->_sequenceManager3, scene, 3611, &R2_GLOBALS._player, NULL);
|
|
else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
|
|
R2_GLOBALS._player.setAction(&scene->_sequenceManager4, scene, 3612, &R2_GLOBALS._player, NULL);
|
|
else
|
|
R2_GLOBALS._player.setAction(&scene->_sequenceManager2, scene, 3610, &R2_GLOBALS._player, NULL);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool Scene3600::Protector::startAction(CursorType action, Event &event) {
|
|
Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
switch(action) {
|
|
case CURSOR_TALK:
|
|
if (_action)
|
|
return SceneActor::startAction(action, event);
|
|
|
|
scene->_protectorSpeaker._displayMode = 1;
|
|
if (!R2_GLOBALS._player._mover)
|
|
R2_GLOBALS._player.addMover(NULL);
|
|
if (!scene->_quinn._mover)
|
|
scene->_quinn.addMover(NULL);
|
|
if (!scene->_seeker._mover)
|
|
scene->_seeker.addMover(NULL);
|
|
if (!scene->_miranda._mover)
|
|
scene->_miranda.addMover(NULL);
|
|
if (!scene->_webbster._mover)
|
|
scene->_webbster.addMover(NULL);
|
|
|
|
setup(3127, 2, 1);
|
|
scene->_sceneMode = 3327;
|
|
scene->_stripManager.start(3327, scene);
|
|
|
|
return true;
|
|
case R2_SONIC_STUNNER:
|
|
// No break on purpose
|
|
case R2_PHOTON_STUNNER:
|
|
if (action == R2_SONIC_STUNNER)
|
|
R2_GLOBALS._sound3.play(43);
|
|
else
|
|
R2_GLOBALS._sound3.play(99);
|
|
|
|
if (_state != 0) {
|
|
_state = 1;
|
|
setup(3128, 1, 1);
|
|
addMover(NULL);
|
|
}
|
|
scene->_action2.setActionIndex(3621);
|
|
|
|
if (!_action)
|
|
setAction(&scene->_action2, scene, NULL);
|
|
|
|
animate(ANIM_MODE_5, &scene->_action2);
|
|
R2_GLOBALS._player.disableControl();
|
|
return true;
|
|
break;
|
|
default:
|
|
return SceneActor::startAction(action, event);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene3600::postInit(SceneObjectList *OwnerList) {
|
|
if (R2_GLOBALS._sceneManager._previousScene == 3600) {
|
|
R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
|
|
} else {
|
|
R2_GLOBALS._scrollFollower = &_steppingDisk;
|
|
_sceneBounds = Rect(160, 0, 480, 200);
|
|
}
|
|
|
|
loadScene(3600);
|
|
SceneExt::postInit();
|
|
|
|
_stripManager.setColors(60, 255);
|
|
_stripManager.setFontNumber(3);
|
|
_stripManager.addSpeaker(&_quinnSpeaker);
|
|
_stripManager.addSpeaker(&_seekerSpeaker);
|
|
_stripManager.addSpeaker(&_mirandaSpeaker);
|
|
_stripManager.addSpeaker(&_tealSpeaker);
|
|
_stripManager.addSpeaker(&_protectorSpeaker);
|
|
|
|
setZoomPercents(142, 80, 167, 105);
|
|
R2_GLOBALS._player._characterScene[R2_QUINN] = 3600;
|
|
R2_GLOBALS._player._characterScene[R2_SEEKER] = 3600;
|
|
R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3600;
|
|
|
|
_console.setDetails(33, 3600, 6, -1, -1);
|
|
_tapestry1.setDetails(Rect(3, 3, 22, 45), 3600, 9, -1, -1, 1, NULL);
|
|
_tapestry2.setDetails(Rect(449, 3, 475, 45), 3600, 9, -1, -1, 1, NULL);
|
|
|
|
_quinn.postInit();
|
|
_quinn._moveDiff = Common::Point(3, 2);
|
|
_quinn.changeZoom(-1);
|
|
_quinn._effect = EFFECT_SHADED;
|
|
|
|
if (R2_GLOBALS._player._characterIndex != R2_QUINN)
|
|
_quinn.setDetails(9001, 0, -1, -1, 1, (SceneItem *) NULL);
|
|
|
|
_seeker.postInit();
|
|
_seeker._numFrames = 7;
|
|
_seeker._moveDiff = Common::Point(5, 3);
|
|
_seeker.changeZoom(-1);
|
|
_seeker._effect = EFFECT_SHADED;
|
|
|
|
if (R2_GLOBALS._player._characterIndex != R2_SEEKER)
|
|
_seeker.setDetails(9002, 1, -1, -1, 1, (SceneItem *) NULL);
|
|
|
|
_miranda.postInit();
|
|
_miranda._moveDiff = Common::Point(3, 2);
|
|
_miranda.changeZoom(-1);
|
|
_miranda._effect = EFFECT_SHADED;
|
|
|
|
if (R2_GLOBALS._player._characterIndex != R2_MIRANDA)
|
|
_miranda.setDetails(9003, 1, -1, -1, 1, (SceneItem *) NULL);
|
|
|
|
R2_GLOBALS._player.postInit();
|
|
R2_GLOBALS._player.changeZoom(-1);
|
|
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
|
|
R2_GLOBALS._player.disableControl();
|
|
|
|
_webbster.postInit();
|
|
_webbster._numFrames = 7;
|
|
_webbster._moveDiff = Common::Point(5, 3);
|
|
_webbster.changeZoom(-1);
|
|
_webbster._effect = EFFECT_SHADED;
|
|
_webbster.setDetails(3600, 27, -1, -1, 1, (SceneItem *) NULL);
|
|
|
|
_teal.postInit();
|
|
_teal._numFrames = 7;
|
|
_teal._moveDiff = Common::Point(3, 2);
|
|
_teal.changeZoom(-1);
|
|
_teal._effect = EFFECT_SHADED;
|
|
_teal.setDetails(3600, 12, -1, -1, 1, (SceneItem *) NULL);
|
|
|
|
_palette1.loadPalette(0);
|
|
_palette1.loadPalette(3601);
|
|
|
|
if (R2_GLOBALS._sceneManager._previousScene == 3600) {
|
|
_lightShaft._sceneRegionId = 200;
|
|
_lightShaft.setDetails(3600, 30, -1, -1, 5, &_webbster);
|
|
_tealDead = true;
|
|
|
|
R2_GLOBALS._walkRegions.disableRegion(2);
|
|
R2_GLOBALS._walkRegions.disableRegion(7);
|
|
R2_GLOBALS._walkRegions.disableRegion(14);
|
|
R2_GLOBALS._walkRegions.disableRegion(15);
|
|
R2_GLOBALS._walkRegions.disableRegion(16);
|
|
|
|
_quinn.setup(10, 5, 11);
|
|
_quinn.animate(ANIM_MODE_1, NULL);
|
|
|
|
_seeker.setup(20, 5, 11);
|
|
_seeker.animate(ANIM_MODE_1, NULL);
|
|
|
|
_miranda.setup(30, 5, 11);
|
|
_miranda.animate(ANIM_MODE_1, NULL);
|
|
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
|
|
_quinn.setPosition(Common::Point(76, 148));
|
|
_seeker.setPosition(Common::Point(134, 148));
|
|
_miranda.setPosition(Common::Point(100, 148));
|
|
R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
|
|
R2_GLOBALS._player.setup(20, _seeker._strip, 1);
|
|
R2_GLOBALS._player.setPosition(_seeker._position);
|
|
_seeker.hide();
|
|
} else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) {
|
|
_quinn.setPosition(Common::Point(110, 148));
|
|
_seeker.setPosition(Common::Point(76, 148));
|
|
_miranda.setPosition(Common::Point(134, 148));
|
|
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
|
|
R2_GLOBALS._player.setup(30, _miranda._strip, 1);
|
|
R2_GLOBALS._player.setPosition(_miranda._position);
|
|
_miranda.hide();
|
|
} else {
|
|
_quinn.setPosition(Common::Point(134, 148));
|
|
_seeker.setPosition(Common::Point(76, 148));
|
|
_miranda.setPosition(Common::Point(110, 148));
|
|
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
|
|
R2_GLOBALS._player.setup(10, _quinn._strip, 1);
|
|
R2_GLOBALS._player.setPosition(_quinn._position);
|
|
_quinn.hide();
|
|
}
|
|
_webbster.setPosition(Common::Point(47, 149));
|
|
_webbster.setup(40, 1, 11);
|
|
_webbster.animate(ANIM_MODE_1, NULL);
|
|
|
|
_teal.setPosition(Common::Point(367, 148));
|
|
_teal.setup(3601, 7, 5);
|
|
|
|
if (!R2_GLOBALS.getFlag(71)) {
|
|
_protector.postInit();
|
|
_protector._state = 0;
|
|
_protector._actorDestPos = Common::Point(226, 152);
|
|
_protector._moveDiff = Common::Point(3, 2);
|
|
_protector.setPosition(Common::Point(284, 152));
|
|
_protector.setup(3127, 2, 1);
|
|
_protector.changeZoom(-1);
|
|
_protector.setDetails(3600, 15, -1, 17, 1, (SceneItem *) NULL);
|
|
}
|
|
|
|
R2_GLOBALS._sound2.play(330);
|
|
_consoleLights.postInit();
|
|
_consoleLights.setPosition(Common::Point(84, 156));
|
|
_consoleLights.fixPriority(158);
|
|
_consoleLights.setup(3601, 5, 1);
|
|
_consoleLights.animate(ANIM_MODE_2, NULL);
|
|
|
|
_action1._part2Fl = true;
|
|
_action1._fadePct = 0;
|
|
_action1.setActionIndex(1);
|
|
|
|
_consoleLights.setAction(&_action1);
|
|
_sceneMode = 3623;
|
|
|
|
g_globals->_events.setCursor(CURSOR_ARROW);
|
|
R2_GLOBALS._player.enableControl(CURSOR_WALK);
|
|
} else {
|
|
_tealDead = false;
|
|
|
|
R2_GLOBALS._walkRegions.disableRegion(17);
|
|
R2_GLOBALS._walkRegions.disableRegion(18);
|
|
|
|
_quinn.setPosition(Common::Point(393, 148));
|
|
_seeker.setPosition(Common::Point(364, 153));
|
|
_miranda.setPosition(Common::Point(413, 164));
|
|
|
|
R2_GLOBALS._player.hide();
|
|
|
|
_webbster.setPosition(Common::Point(373, 164));
|
|
|
|
_teal.setup(3403, 8, 11);
|
|
_teal.setPosition(Common::Point(403, 155));
|
|
|
|
_protector.setup(3403, 7, 1);
|
|
_protector.setPosition(Common::Point(405, 155));
|
|
|
|
_steppingDisk.postInit();
|
|
_steppingDisk.setup(3600, 2, 1);
|
|
_steppingDisk.setPosition(Common::Point(403, 161));
|
|
_steppingDisk.fixPriority(149);
|
|
_steppingDisk.changeZoom(-1);
|
|
|
|
_action1._part2Fl = false;
|
|
_action1._fadePct = 90;
|
|
|
|
_sceneMode = 3600;
|
|
setAction(&_sequenceManager1, this, 3600, &_seeker, &_quinn, &_miranda,
|
|
&_webbster, &_teal, &_steppingDisk, NULL);
|
|
}
|
|
_lightEntered = false;
|
|
_ghoulTeleported = R2_GLOBALS.getFlag(71);
|
|
|
|
R2_GLOBALS._sound1.play(326);
|
|
_background.setDetails(Rect(0, 0, 480, 200), 3600, 0, -1, -1, 1, NULL);
|
|
}
|
|
|
|
void Scene3600::remove() {
|
|
_consoleLights.animate(ANIM_MODE_NONE, NULL);
|
|
_consoleLights.setAction(NULL);
|
|
R2_GLOBALS._sound2.fadeOut2(NULL);
|
|
R2_GLOBALS._sound1.fadeOut2(NULL);
|
|
R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
|
|
SceneExt::remove();
|
|
}
|
|
|
|
void Scene3600::signal() {
|
|
switch (_sceneMode) {
|
|
case 3320:
|
|
// Move to the console
|
|
R2_GLOBALS._walkRegions.disableRegion(14);
|
|
R2_GLOBALS._scrollFollower = &_seeker;
|
|
_tealSpeaker._object1.hide();
|
|
_teal.show();
|
|
_teal.setStrip(2);
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
|
|
_sceneMode = 3602;
|
|
else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
|
|
_sceneMode = 3603;
|
|
else
|
|
_sceneMode = 3601;
|
|
setAction(&_sequenceManager1, this, _sceneMode, &_seeker, &_quinn,
|
|
&_miranda, &_webbster, &_teal, NULL);
|
|
break;
|
|
case 3321:
|
|
// Teal activates console
|
|
R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
|
|
_tealSpeaker.stopSpeaking();
|
|
_teal.show();
|
|
_teal.setStrip(1);
|
|
_consoleLights.postInit();
|
|
_sceneMode = 3604;
|
|
setAction(&_sequenceManager1, this, _sceneMode, &_teal, &_consoleLights,
|
|
&_quinn, &_seeker, &_miranda, &_webbster, NULL);
|
|
break;
|
|
case 3322:
|
|
// Teal walks toward the teleport pod, the goule protector appears
|
|
_quinnSpeaker.stopSpeaking();
|
|
_quinnSpeaker._displayMode = 1;
|
|
_tealSpeaker.stopSpeaking();
|
|
_tealSpeaker._displayMode = 7;
|
|
R2_GLOBALS._scrollFollower = &_teal;
|
|
_sceneMode = 3605;
|
|
setAction(&_sequenceManager1, this, _sceneMode, &_teal, &_protector, &_steppingDisk, NULL);
|
|
break;
|
|
case 3323:
|
|
// Goule protector eats Teal guts then moves
|
|
|
|
if (!_tealDead)
|
|
_tealDead = true;
|
|
else {
|
|
_protectorSpeaker.stopSpeaking();
|
|
_protector.show();
|
|
_protector.setup(3258, 6, 1);
|
|
|
|
_sceneMode = 3607;
|
|
_protector.setAction(&_sequenceManager1, this, _sceneMode, &_protector, NULL);
|
|
|
|
_protectorSpeaker.stopSpeaking();
|
|
_protectorSpeaker._displayMode = 1;
|
|
_quinnSpeaker._displayMode = 1;
|
|
_protector.show();
|
|
|
|
R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
|
|
R2_GLOBALS._walkRegions.enableRegion(17);
|
|
R2_GLOBALS._walkRegions.enableRegion(18);
|
|
R2_GLOBALS._walkRegions.disableRegion(2);
|
|
R2_GLOBALS._walkRegions.disableRegion(7);
|
|
R2_GLOBALS._walkRegions.disableRegion(14);
|
|
R2_GLOBALS._walkRegions.disableRegion(15);
|
|
R2_GLOBALS._walkRegions.disableRegion(16);
|
|
|
|
_consoleLights.setAction(&_action1);
|
|
}
|
|
break;
|
|
case 3324:
|
|
// No break on purpose
|
|
case 3607:
|
|
g_globals->_events.setCursor(CURSOR_ARROW);
|
|
R2_GLOBALS._player.enableControl(CURSOR_WALK);
|
|
_protector.fixPriority(-1);
|
|
_sceneMode = 3623;
|
|
break;
|
|
case 3327:
|
|
g_globals->_events.setCursor(CURSOR_ARROW);
|
|
R2_GLOBALS._player.enableControl(CURSOR_WALK);
|
|
_sceneMode = 3623;
|
|
break;
|
|
case 3450:
|
|
// Speech of Teal and Quinn
|
|
R2_GLOBALS._sound1.stop();
|
|
_protector3400.hide();
|
|
_door3400.hide();
|
|
|
|
_sceneBounds = Rect(40, 0, SCREEN_WIDTH + 40, SCREEN_HEIGHT);
|
|
setZoomPercents(142, 80, 167, 105);
|
|
loadScene(3600);
|
|
R2_GLOBALS._uiElements.show();
|
|
_lightShaft._sceneRegionId = 200;
|
|
_lightShaft.setDetails(3600, 30, -1, -1, 5, &_webbster);
|
|
|
|
_consoleLights.show();
|
|
_quinn.show();
|
|
_seeker.show();
|
|
_miranda.show();
|
|
_webbster.show();
|
|
_teal.show();
|
|
|
|
_teal.setPosition(Common::Point(298, 151));
|
|
|
|
_protector.postInit();
|
|
_protector._state = 0;
|
|
_protector._actorDestPos = Common::Point(226, 152);
|
|
_protector._moveDiff = Common::Point(5, 3);
|
|
_protector.setup(3403, 7, 1);
|
|
_protector.setPosition(Common::Point(405, 155));
|
|
_protector.changeZoom(-1);
|
|
_protector.addMover(NULL);
|
|
_protector.animate(ANIM_MODE_NONE);
|
|
_protector.hide();
|
|
_protector.setDetails(3600, 15, -1, 17, 5, &_lightShaft);
|
|
|
|
_steppingDisk.setup(3600, 2, 1);
|
|
_steppingDisk.setPosition(Common::Point(403, 161));
|
|
_steppingDisk.fixPriority(149);
|
|
_steppingDisk.changeZoom(-1);
|
|
_steppingDisk.show();
|
|
|
|
_quinnSpeaker._displayMode = 2;
|
|
_tealSpeaker._displayMode = 2;
|
|
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
|
|
R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
|
|
R2_GLOBALS._player.setup(20, _seeker._strip, 1);
|
|
R2_GLOBALS._player.setPosition(_seeker._position);
|
|
_seeker.hide();
|
|
} else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) {
|
|
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
|
|
R2_GLOBALS._player.setup(30, _miranda._strip, 1);
|
|
R2_GLOBALS._player.setPosition(_miranda._position);
|
|
_miranda.hide();
|
|
} else {
|
|
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
|
|
R2_GLOBALS._player.setup(10, _quinn._strip, 1);
|
|
R2_GLOBALS._player.setPosition(_quinn._position);
|
|
_quinn.hide();
|
|
}
|
|
R2_GLOBALS._player.show();
|
|
R2_GLOBALS._sound1.play(326);
|
|
_sceneMode = 3322;
|
|
_stripManager.start(3322, this);
|
|
R2_GLOBALS._sound2.play(329);
|
|
break;
|
|
case 3600:
|
|
// First speech by Teal
|
|
_sceneMode = 3320;
|
|
_stripManager.start(3320, this);
|
|
break;
|
|
case 3601:
|
|
// No break on purpose
|
|
case 3602:
|
|
// No break on purpose
|
|
case 3603:
|
|
// Teal speech near the console
|
|
R2_GLOBALS._walkRegions.disableRegion(2);
|
|
R2_GLOBALS._walkRegions.disableRegion(7);
|
|
_tealSpeaker._displayMode = 1;
|
|
_sceneMode = 3321;
|
|
_stripManager.start(3321, this);
|
|
break;
|
|
case 3604:
|
|
// Goule Protector forces the door
|
|
R2_GLOBALS._sound2.fadeOut2(NULL);
|
|
R2_GLOBALS._sound1.stop();
|
|
R2_GLOBALS._walkRegions.enableRegion(2);
|
|
R2_GLOBALS._walkRegions.enableRegion(7);
|
|
|
|
_steppingDisk.hide();
|
|
_consoleLights.hide();
|
|
R2_GLOBALS._player.hide();
|
|
_quinn.hide();
|
|
_seeker.hide();
|
|
_miranda.hide();
|
|
_webbster.hide();
|
|
_teal.hide();
|
|
|
|
_sceneBounds = Rect(60, 0, SCREEN_WIDTH + 60, SCREEN_HEIGHT);
|
|
setZoomPercents(51, 46, 180, 200);
|
|
|
|
loadScene(3400);
|
|
R2_GLOBALS._uiElements.show();
|
|
_protector3400.postInit();
|
|
|
|
_steppingDisk.setup(3403, 1, 1);
|
|
_steppingDisk.setPosition(Common::Point(190, 103));
|
|
_steppingDisk.fixPriority(89);
|
|
_steppingDisk.show();
|
|
|
|
_door3400.postInit();
|
|
_door3400.setup(3400, 1, 6);
|
|
_door3400.setPosition(Common::Point(236, 51));
|
|
_door3400.fixPriority(51);
|
|
R2_GLOBALS._scrollFollower = &_door3400;
|
|
|
|
R2_GLOBALS._sound1.play(323);
|
|
_sceneMode = 3450;
|
|
setAction(&_sequenceManager1, this, 3450, &_protector3400, &_door3400, NULL);
|
|
break;
|
|
case 3605:
|
|
// Goule protector jumps on Teal
|
|
_protector.setup(3258, 4, 1);
|
|
_protector.setAction(&_sequenceManager1, this, 3606, &_teal, &_protector,
|
|
&_steppingDisk, NULL);
|
|
_sceneMode = 3323;
|
|
_stripManager.start(3323, this);
|
|
|
|
break;
|
|
case 3620:
|
|
// No break on purpose
|
|
case 3623:
|
|
if ((_protector._position.x == 226) && (_protector._position.y == 152)
|
|
&& _action1._part2Fl && (_protector._visage == 3127) && (!R2_GLOBALS.getFlag(71))) {
|
|
R2_GLOBALS._sound2.stop();
|
|
R2_GLOBALS._sound2.play(331);
|
|
R2_GLOBALS.setFlag(71);
|
|
_sceneMode = 3626;
|
|
setAction(&_sequenceManager1, this, 3626, &_protector, NULL);
|
|
}
|
|
break;
|
|
case 3624:
|
|
R2_GLOBALS._player.disableControl();
|
|
if (_lightEntered && (_quinn._position.x == 229) && (_quinn._position.y == 154) && (_seeker._position.x == 181) && (_seeker._position.y == 154) && (_miranda._position.x == 207) && (_miranda._position.y == 154) && (_webbster._position.x == 155) && (_webbster._position.y == 154)) {
|
|
R2_GLOBALS._sound2.stop();
|
|
R2_GLOBALS._sound2.play(331);
|
|
_sceneMode = 3625;
|
|
setAction(&_sequenceManager1, this, 3625, &_quinn, &_seeker, &_miranda, &_webbster, NULL);
|
|
}
|
|
break;
|
|
case 3625:
|
|
R2_GLOBALS._sound2.stop();
|
|
R2_GLOBALS._sceneManager.changeScene(3700);
|
|
break;
|
|
case 3626:
|
|
_protector.setPosition(Common::Point(0, 0));
|
|
_action1.setActionIndex(2);
|
|
if (R2_GLOBALS._events.getCursor() > R2_LAST_INVENT) {
|
|
R2_GLOBALS._events.setCursor(CURSOR_USE);
|
|
R2_GLOBALS._player.enableControl(CURSOR_USE);
|
|
} else {
|
|
R2_GLOBALS._player.enableControl();
|
|
}
|
|
R2_GLOBALS._sound2.stop();
|
|
_sceneMode = 3623;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene3600::process(Event &event) {
|
|
if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_ARROW)
|
|
&& (event.mousePos.x > 237) && (!R2_GLOBALS.getFlag(71))) {
|
|
SceneItem::display(3600, 17, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
|
|
event.handled = true;
|
|
}
|
|
Scene::process(event);
|
|
}
|
|
|
|
void Scene3600::dispatch() {
|
|
if ((R2_GLOBALS._player.getRegionIndex() == 200) && _action1._part2Fl && !_lightEntered) {
|
|
R2_GLOBALS._sound2.fadeOut2(NULL);
|
|
if (_protector._mover)
|
|
_protector.addMover(NULL);
|
|
|
|
if (R2_GLOBALS._player._action)
|
|
R2_GLOBALS._player.setAction(NULL);
|
|
if (R2_GLOBALS._player._mover)
|
|
R2_GLOBALS._player.addMover(NULL);
|
|
|
|
_lightEntered = true;
|
|
|
|
R2_GLOBALS._walkRegions.enableRegion(2);
|
|
R2_GLOBALS._walkRegions.enableRegion(7);
|
|
R2_GLOBALS._player.disableControl();
|
|
|
|
_sceneMode = 3624;
|
|
|
|
_quinn.setStrip(-1);
|
|
_seeker.setStrip(-1);
|
|
_miranda.setStrip(-1);
|
|
_webbster.setStrip(-1);
|
|
|
|
R2_GLOBALS._player.hide();
|
|
|
|
if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
|
|
_seeker.setPosition(R2_GLOBALS._player._position);
|
|
_seeker.show();
|
|
} else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) {
|
|
_miranda.setPosition(R2_GLOBALS._player._position);
|
|
_miranda.show();
|
|
} else {
|
|
_quinn.setPosition(R2_GLOBALS._player._position);
|
|
_quinn.show();
|
|
}
|
|
_quinn.setAction(&_sequenceManager2, this, 3610, &_quinn, NULL);
|
|
_seeker.setAction(&_sequenceManager3, this, 3611, &_seeker, NULL);
|
|
_miranda.setAction(&_sequenceManager4, this, 3612, &_miranda, NULL);
|
|
_webbster.setAction(&_sequenceManager1, this, 3613, &_webbster, NULL);
|
|
}
|
|
|
|
if ((_protector.getRegionIndex() == 200) && _action1._part2Fl && !_ghoulTeleported) {
|
|
R2_GLOBALS._sound2.fadeOut2(NULL);
|
|
_sceneMode = 3620;
|
|
_ghoulTeleported = true;
|
|
R2_GLOBALS._player.disableControl();
|
|
|
|
if (R2_GLOBALS._player._mover)
|
|
R2_GLOBALS._player.addMover(NULL);
|
|
if (_quinn._mover)
|
|
_quinn.addMover(NULL);
|
|
if (_seeker._mover)
|
|
_seeker.addMover(NULL);
|
|
if (_miranda._mover)
|
|
_miranda.addMover(NULL);
|
|
if (_webbster._mover)
|
|
_webbster.addMover(NULL);
|
|
}
|
|
|
|
Scene::dispatch();
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3700 - Cutscene - Teleport outside
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void Scene3700::postInit(SceneObjectList *OwnerList) {
|
|
loadScene(3700);
|
|
R2_GLOBALS._uiElements._active = false;
|
|
R2_GLOBALS._uiElements._visible = false;
|
|
SceneExt::postInit();
|
|
R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
|
|
|
|
_stripManager.setColors(60, 255);
|
|
_stripManager.setFontNumber(3);
|
|
_stripManager.addSpeaker(&_quinnSpeaker);
|
|
_stripManager.addSpeaker(&_seekerSpeaker);
|
|
_stripManager.addSpeaker(&_mirandaSpeaker);
|
|
|
|
_quinn.postInit();
|
|
_quinn._moveDiff = Common::Point(3, 2);
|
|
|
|
_seeker.postInit();
|
|
_seeker._numFrames = 7;
|
|
_seeker._moveDiff = Common::Point(5, 3);
|
|
_seeker.hide();
|
|
|
|
_miranda.postInit();
|
|
_miranda._moveDiff = Common::Point(3, 2);
|
|
_miranda.hide();
|
|
|
|
_webbster.postInit();
|
|
_webbster._numFrames = 7;
|
|
_webbster._moveDiff = Common::Point(5, 3);
|
|
_webbster.hide();
|
|
|
|
_teleportPad.postInit();
|
|
|
|
R2_GLOBALS._player.disableControl();
|
|
R2_GLOBALS._sound1.play(332);
|
|
|
|
_sceneMode = 3700;
|
|
setAction(&_sequenceManager, this, 3700, &_quinn, &_seeker, &_miranda,
|
|
&_webbster, &_teleportPad, NULL);
|
|
}
|
|
|
|
void Scene3700::remove() {
|
|
R2_GLOBALS._sound1.fadeOut2(NULL);
|
|
SceneExt::remove();
|
|
}
|
|
|
|
void Scene3700::signal() {
|
|
switch (_sceneMode) {
|
|
case 3328:
|
|
// No break on purpose
|
|
case 3329:
|
|
_sceneMode = 3701;
|
|
setAction(&_sequenceManager, this, 3701, &_seeker, &_miranda, &_webbster, NULL);
|
|
break;
|
|
case 3700:
|
|
_quinn.setup(10, 6, 1);
|
|
_seeker.setup(20, 5, 1);
|
|
if (R2_GLOBALS.getFlag(71)) {
|
|
_sceneMode = 3329;
|
|
_stripManager.start(3329, this);
|
|
} else {
|
|
_sceneMode = 3328;
|
|
_stripManager.start(3328, this);
|
|
}
|
|
break;
|
|
case 3701:
|
|
R2_GLOBALS._sceneManager.changeScene(1000);
|
|
break;
|
|
default:
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3800 - Desert
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
Scene3800::Scene3800() {
|
|
_desertDirection = 0;
|
|
}
|
|
|
|
void Scene3800::synchronize(Serializer &s) {
|
|
SceneExt::synchronize(s);
|
|
|
|
s.syncAsSint16LE(_desertDirection);
|
|
}
|
|
|
|
void Scene3800::NorthExit::changeScene() {
|
|
Scene3800 *scene = (Scene3800 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_enabled = false;
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_desertDirection = 1;
|
|
|
|
if (R2_GLOBALS.getFlag(46)) {
|
|
if (scene->_desertDirection == R2_GLOBALS._desertCorrectDirection) {
|
|
R2_GLOBALS._desertPreviousDirection = 3;
|
|
if (R2_GLOBALS._desertWrongDirCtr + 1 == 0) {
|
|
R2_GLOBALS._desertStepsRemaining--;
|
|
R2_GLOBALS._desertCorrectDirection = 0;
|
|
} else {
|
|
R2_GLOBALS._desertCorrectDirection = R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr];
|
|
R2_GLOBALS._desertWrongDirCtr--;
|
|
}
|
|
} else {
|
|
++R2_GLOBALS._desertWrongDirCtr;
|
|
if (R2_GLOBALS._desertWrongDirCtr > 999)
|
|
R2_GLOBALS._desertWrongDirCtr = 999;
|
|
R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr] = R2_GLOBALS._desertCorrectDirection;
|
|
R2_GLOBALS._desertCorrectDirection = 3;
|
|
}
|
|
}
|
|
|
|
if (R2_GLOBALS._desertStepsRemaining == 0)
|
|
scene->_sceneMode = 16;
|
|
else
|
|
scene->_sceneMode = 11;
|
|
|
|
Common::Point pt(160, 115);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, scene);
|
|
}
|
|
|
|
void Scene3800::EastExit::changeScene() {
|
|
Scene3800 *scene = (Scene3800 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_enabled = false;
|
|
R2_GLOBALS._player.disableControl(CURSOR_ARROW);
|
|
scene->_desertDirection = 2;
|
|
|
|
if (R2_GLOBALS.getFlag(46)) {
|
|
if (scene->_desertDirection == R2_GLOBALS._desertCorrectDirection) {
|
|
R2_GLOBALS._desertPreviousDirection = 4;
|
|
if (R2_GLOBALS._desertWrongDirCtr + 1 == 0) {
|
|
R2_GLOBALS._desertStepsRemaining--;
|
|
R2_GLOBALS._desertCorrectDirection = 0;
|
|
} else {
|
|
R2_GLOBALS._desertCorrectDirection = R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr];
|
|
R2_GLOBALS._desertWrongDirCtr--;
|
|
}
|
|
} else {
|
|
++R2_GLOBALS._desertWrongDirCtr;
|
|
if (R2_GLOBALS._desertWrongDirCtr > 999)
|
|
R2_GLOBALS._desertWrongDirCtr = 999;
|
|
R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr] = R2_GLOBALS._desertCorrectDirection;
|
|
R2_GLOBALS._desertCorrectDirection = 4;
|
|
}
|
|
}
|
|
|
|
if (R2_GLOBALS._desertStepsRemaining == 0)
|
|
scene->_sceneMode = 16;
|
|
else
|
|
scene->_sceneMode = 12;
|
|
|
|
Common::Point pt(330, 145);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, scene);
|
|
}
|
|
|
|
void Scene3800::SouthExit::changeScene() {
|
|
Scene3800 *scene = (Scene3800 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_enabled = false;
|
|
R2_GLOBALS._player.disableControl(CURSOR_ARROW);
|
|
scene->_desertDirection = 3;
|
|
|
|
if (R2_GLOBALS.getFlag(46)) {
|
|
if (scene->_desertDirection == R2_GLOBALS._desertCorrectDirection) {
|
|
R2_GLOBALS._desertPreviousDirection = 1;
|
|
if (R2_GLOBALS._desertWrongDirCtr + 1 == 0) {
|
|
R2_GLOBALS._desertStepsRemaining--;
|
|
R2_GLOBALS._desertCorrectDirection = 0;
|
|
} else {
|
|
R2_GLOBALS._desertCorrectDirection = R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr];
|
|
R2_GLOBALS._desertWrongDirCtr--;
|
|
}
|
|
} else {
|
|
++R2_GLOBALS._desertWrongDirCtr;
|
|
if (R2_GLOBALS._desertWrongDirCtr > 999)
|
|
R2_GLOBALS._desertWrongDirCtr = 999;
|
|
R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr] = R2_GLOBALS._desertCorrectDirection;
|
|
R2_GLOBALS._desertCorrectDirection = 1;
|
|
}
|
|
}
|
|
|
|
if (R2_GLOBALS._desertStepsRemaining == 0)
|
|
scene->_sceneMode = 16;
|
|
else
|
|
scene->_sceneMode = 13;
|
|
|
|
Common::Point pt(160, 220);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, scene);
|
|
}
|
|
|
|
void Scene3800::WestExit::changeScene() {
|
|
Scene3800 *scene = (Scene3800 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_enabled = false;
|
|
R2_GLOBALS._player.disableControl(CURSOR_ARROW);
|
|
scene->_desertDirection = 4;
|
|
|
|
if (R2_GLOBALS.getFlag(46)) {
|
|
if (scene->_desertDirection == R2_GLOBALS._desertCorrectDirection) {
|
|
R2_GLOBALS._desertPreviousDirection = 2;
|
|
if (R2_GLOBALS._desertWrongDirCtr + 1 == 0) {
|
|
R2_GLOBALS._desertStepsRemaining--;
|
|
R2_GLOBALS._desertCorrectDirection = 0;
|
|
} else {
|
|
R2_GLOBALS._desertCorrectDirection = R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr];
|
|
R2_GLOBALS._desertWrongDirCtr--;
|
|
}
|
|
} else {
|
|
++R2_GLOBALS._desertWrongDirCtr;
|
|
if (R2_GLOBALS._desertWrongDirCtr > 999)
|
|
R2_GLOBALS._desertWrongDirCtr = 999;
|
|
R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr] = R2_GLOBALS._desertCorrectDirection;
|
|
R2_GLOBALS._desertCorrectDirection = 2;
|
|
}
|
|
}
|
|
|
|
if (R2_GLOBALS._desertStepsRemaining == 0)
|
|
scene->_sceneMode = 16;
|
|
else
|
|
scene->_sceneMode = 14;
|
|
|
|
Common::Point pt(-10, 145);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, scene);
|
|
}
|
|
|
|
void Scene3800::initExits() {
|
|
_northExit._enabled = true;
|
|
_eastExit._enabled = true;
|
|
_southExit._enabled = true;
|
|
_westExit._enabled = true;
|
|
_northExit._insideArea = false;
|
|
_eastExit._insideArea = false;
|
|
_southExit._insideArea = false;
|
|
_westExit._insideArea = false;
|
|
_northExit._moving = false;
|
|
_eastExit._moving = false;
|
|
_southExit._moving = false;
|
|
_westExit._moving = false;
|
|
|
|
loadScene(R2_GLOBALS._maze3800SceneNumb);
|
|
|
|
R2_GLOBALS._uiElements.draw();
|
|
}
|
|
|
|
void Scene3800::enterArea() {
|
|
R2_GLOBALS._player.disableControl();
|
|
switch (_desertDirection) {
|
|
case 0:
|
|
R2_GLOBALS._player.postInit();
|
|
R2_GLOBALS._player.setVisage(10);
|
|
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
|
|
R2_GLOBALS._player.setPosition(Common::Point(160, 145));
|
|
R2_GLOBALS._player.setStrip(3);
|
|
R2_GLOBALS._player.changeZoom(-1);
|
|
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
|
|
|
|
_quinnShadow.postInit();
|
|
_quinnShadow.fixPriority(10);
|
|
_quinnShadow.changeZoom(-1);
|
|
_quinnShadow.setVisage(1110);
|
|
_quinnShadow._effect = EFFECT_SHADOW_MAP;
|
|
_quinnShadow._shadowMap = this->_shadowPaletteMap;
|
|
R2_GLOBALS._player._linkedActor = &_quinnShadow;
|
|
|
|
switch (R2_GLOBALS._sceneManager._previousScene) {
|
|
case 2600:
|
|
_balloon.postInit();
|
|
_harness.postInit();
|
|
_quinnShadow.hide();
|
|
_sceneMode = 3800;
|
|
setAction(&_sequenceManager1, this, 3800, &R2_GLOBALS._player,
|
|
&_balloon, &_harness, NULL);
|
|
break;
|
|
case 3900:
|
|
_sceneMode = 15;
|
|
switch (R2_GLOBALS._desertPreviousDirection - 1) {
|
|
case 0: {
|
|
R2_GLOBALS._player.setPosition(Common::Point(160, 220));
|
|
Common::Point pt(160, 160);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
}
|
|
break;
|
|
case 1: {
|
|
R2_GLOBALS._player.setPosition(Common::Point(-10, 145));
|
|
Common::Point pt(19, 145);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
}
|
|
break;
|
|
case 2: {
|
|
R2_GLOBALS._player.setPosition(Common::Point(160, 115));
|
|
Common::Point pt(160, 120);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
}
|
|
break;
|
|
case 3: {
|
|
R2_GLOBALS._player.setPosition(Common::Point(330, 145));
|
|
Common::Point pt(300, 145);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
R2_GLOBALS._player.enableControl(CURSOR_WALK);
|
|
break;
|
|
}
|
|
break;
|
|
case 1: {
|
|
_sceneMode = 15;
|
|
R2_GLOBALS._player.setPosition(Common::Point(160, 220));
|
|
Common::Point pt(160, 160);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
}
|
|
break;
|
|
case 2: {
|
|
_sceneMode = 15;
|
|
R2_GLOBALS._player.setPosition(Common::Point(-10, 145));
|
|
Common::Point pt(19, 145);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
}
|
|
break;
|
|
case 3: {
|
|
_sceneMode = 15;
|
|
R2_GLOBALS._player.setPosition(Common::Point(160, 115));
|
|
Common::Point pt(160, 120);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
}
|
|
break;
|
|
case 4: {
|
|
_sceneMode = 15;
|
|
R2_GLOBALS._player.setPosition(Common::Point(330, 145));
|
|
Common::Point pt(300, 145);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene3800::postInit(SceneObjectList *OwnerList) {
|
|
_desertDirection = 0;
|
|
|
|
initExits();
|
|
|
|
SceneExt::postInit();
|
|
R2_GLOBALS._sound1.play(231);
|
|
|
|
scalePalette(65, 65, 65);
|
|
|
|
setZoomPercents(87, 40, 144, 100);
|
|
|
|
_northExit.setDetails(Rect(14, 87, 305, 125), SHADECURSOR_UP, 3800);
|
|
_northExit.setDest(Common::Point(160, 126));
|
|
_eastExit.setDetails(Rect(305, 87, 320, 168), EXITCURSOR_E, 3800);
|
|
_eastExit.setDest(Common::Point(312, 145));
|
|
_southExit.setDetails(Rect(14, 160, 305, 168), SHADECURSOR_DOWN, 3800);
|
|
_southExit.setDest(Common::Point(160, 165));
|
|
_westExit.setDetails(Rect(0, 87, 14, 168), EXITCURSOR_W, 3800);
|
|
_westExit.setDest(Common::Point(7, 145));
|
|
|
|
_skylineRect.set(0, 0, 320, 87);
|
|
_background.setDetails(Rect(0, 0, 320, 200), 3800, 0, 1, 2, 1, (SceneItem *) NULL);
|
|
|
|
enterArea();
|
|
}
|
|
|
|
void Scene3800::signal() {
|
|
switch (_sceneMode) {
|
|
case 11:
|
|
R2_GLOBALS._maze3800SceneNumb += 15;
|
|
if (R2_GLOBALS._maze3800SceneNumb > 3815)
|
|
R2_GLOBALS._maze3800SceneNumb -= 20;
|
|
initExits();
|
|
enterArea();
|
|
break;
|
|
case 12:
|
|
R2_GLOBALS._maze3800SceneNumb += 5;
|
|
if (R2_GLOBALS._maze3800SceneNumb > 3815)
|
|
R2_GLOBALS._maze3800SceneNumb = 3800;
|
|
initExits();
|
|
enterArea();
|
|
break;
|
|
case 13:
|
|
R2_GLOBALS._maze3800SceneNumb -= 15;
|
|
if (R2_GLOBALS._maze3800SceneNumb < 3800)
|
|
R2_GLOBALS._maze3800SceneNumb += 20;
|
|
initExits();
|
|
enterArea();
|
|
break;
|
|
case 14:
|
|
R2_GLOBALS._maze3800SceneNumb -= 5;
|
|
if (R2_GLOBALS._maze3800SceneNumb < 3800)
|
|
R2_GLOBALS._maze3800SceneNumb = 3815;
|
|
initExits();
|
|
enterArea();
|
|
break;
|
|
case 15:
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
case 16:
|
|
g_globals->_sceneManager.changeScene(3900);
|
|
break;
|
|
case 3800:
|
|
_quinnShadow.show();
|
|
_balloon.remove();
|
|
_harness.remove();
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
case 3805:
|
|
_northExit._enabled = false;
|
|
_eastExit._enabled = false;
|
|
_southExit._enabled = false;
|
|
_westExit._enabled = false;
|
|
R2_GLOBALS._player._canWalk = false;
|
|
R2_GLOBALS._events.setCursor(CURSOR_USE);
|
|
break;
|
|
case 3806:
|
|
_northExit._enabled = true;
|
|
_eastExit._enabled = true;
|
|
_southExit._enabled = true;
|
|
_westExit._enabled = true;
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene3800::process(Event &event) {
|
|
if ((R2_GLOBALS._player._uiEnabled) && (event.eventType == EVENT_BUTTON_DOWN)
|
|
&& (_skylineRect.contains(event.mousePos))) {
|
|
event.handled = true;
|
|
switch (R2_GLOBALS._events.getCursor()) {
|
|
case CURSOR_WALK:
|
|
R2_GLOBALS._player.addMover(NULL);
|
|
R2_GLOBALS._player.updateAngle(event.mousePos);
|
|
break;
|
|
case CURSOR_LOOK:
|
|
SceneItem::display(3800, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
|
|
break;
|
|
case CURSOR_USE:
|
|
SceneItem::display(3800, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
|
|
break;
|
|
default:
|
|
event.handled = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
Scene::process(event);
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3900 - Forest Entrance
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void Scene3900::NorthExit::changeScene() {
|
|
Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_enabled = false;
|
|
R2_GLOBALS._player.disableControl(CURSOR_ARROW);
|
|
R2_GLOBALS._desertCorrectDirection = 3;
|
|
R2_GLOBALS._desertPreviousDirection = 1;
|
|
R2_GLOBALS._desertStepsRemaining = 1;
|
|
scene->_sceneMode = 14;
|
|
|
|
Common::Point pt(160, 115);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, scene);
|
|
}
|
|
|
|
void Scene3900::EastExit::changeScene() {
|
|
Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_enabled = false;
|
|
R2_GLOBALS._player.disableControl(CURSOR_ARROW);
|
|
R2_GLOBALS._desertCorrectDirection = 4;
|
|
R2_GLOBALS._desertPreviousDirection = 2;
|
|
R2_GLOBALS._desertStepsRemaining = 1;
|
|
scene->_sceneMode = 14;
|
|
|
|
Common::Point pt(330, 145);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, scene);
|
|
}
|
|
|
|
void Scene3900::SouthExit::changeScene() {
|
|
Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_enabled = false;
|
|
R2_GLOBALS._player.disableControl(CURSOR_ARROW);
|
|
R2_GLOBALS._desertCorrectDirection = 1;
|
|
R2_GLOBALS._desertPreviousDirection = 3;
|
|
R2_GLOBALS._desertStepsRemaining = 1;
|
|
scene->_sceneMode = 14;
|
|
|
|
Common::Point pt(160, 220);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, scene);
|
|
}
|
|
|
|
void Scene3900::WestExit::changeScene() {
|
|
Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_enabled = false;
|
|
R2_GLOBALS._player.disableControl(CURSOR_ARROW);
|
|
R2_GLOBALS._desertCorrectDirection = 2;
|
|
R2_GLOBALS._desertPreviousDirection = 4;
|
|
R2_GLOBALS._desertStepsRemaining = 1;
|
|
scene->_sceneMode = 14;
|
|
|
|
Common::Point pt(-10, 145);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, scene);
|
|
}
|
|
|
|
void Scene3900::Exit5::changeScene() {
|
|
Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_enabled = false;
|
|
R2_GLOBALS._player.disableControl(CURSOR_ARROW);
|
|
scene->_sceneMode = 13;
|
|
|
|
if (R2_GLOBALS._desertCorrectDirection == 4) {
|
|
Common::Point pt(-10, 135);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, scene);
|
|
} else {
|
|
Common::Point pt(330, 135);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, scene);
|
|
}
|
|
|
|
R2_GLOBALS._desertCorrectDirection = 0;
|
|
}
|
|
|
|
void Scene3900::postInit(SceneObjectList *OwnerList) {
|
|
if ((R2_GLOBALS._desertPreviousDirection == 2)
|
|
&& (R2_GLOBALS._sceneManager._previousScene != 2700))
|
|
loadScene(3825);
|
|
else
|
|
loadScene(3820);
|
|
SceneExt::postInit();
|
|
|
|
R2_GLOBALS._sound1.changeSound(231);
|
|
setZoomPercents(87, 40, 144, 100);
|
|
|
|
R2_GLOBALS._player.disableControl();
|
|
R2_GLOBALS._player.postInit();
|
|
R2_GLOBALS._player.setVisage(10);
|
|
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
|
|
R2_GLOBALS._player.setStrip(3);
|
|
R2_GLOBALS._player.changeZoom(-1);
|
|
R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
|
|
|
|
_quinnShadow.postInit();
|
|
_quinnShadow.fixPriority(10);
|
|
_quinnShadow.changeZoom(-1);
|
|
_quinnShadow.setVisage(1110);
|
|
_quinnShadow._effect = EFFECT_SHADOW_MAP;
|
|
_quinnShadow._shadowMap = _shadowPaletteMap;
|
|
R2_GLOBALS._player._linkedActor = &_quinnShadow;
|
|
|
|
if ((R2_GLOBALS._desertPreviousDirection == 2) && (R2_GLOBALS._sceneManager._previousScene != 2700)) {
|
|
// loadScene(3825);
|
|
R2_GLOBALS._desertCorrectDirection = 4;
|
|
_northExit.setDetails(Rect(29, 87, 305, 125), SHADECURSOR_UP, 3900);
|
|
_southExit.setDetails(Rect(29, 160, 305, 168), SHADECURSOR_DOWN, 3900);
|
|
|
|
_eastExit.setDetails(Rect(305, 87, 320, 168), EXITCURSOR_E, 3900);
|
|
_eastExit.setDest(Common::Point(312, 145));
|
|
_eastExit._enabled = true;
|
|
_eastExit._insideArea = false;
|
|
_eastExit._moving = false;
|
|
|
|
_westExit._enabled = false;
|
|
|
|
_westEnterForest.setDetails(Rect(0, 87, 29, 168), EXITCURSOR_W, 3900);
|
|
_westEnterForest.setDest(Common::Point(24, 135));
|
|
} else {
|
|
// loadScene(3820);
|
|
R2_GLOBALS._desertCorrectDirection = 2;
|
|
_northExit.setDetails(Rect(14, 87, 290, 125), SHADECURSOR_UP, 3900);
|
|
_southExit.setDetails(Rect(14, 160, 290, 168), SHADECURSOR_DOWN, 3900);
|
|
|
|
_eastExit._enabled = false;
|
|
|
|
_westExit.setDetails(Rect(0, 87, 14, 168), EXITCURSOR_W, 3900);
|
|
_westExit.setDest(Common::Point(7, 145));
|
|
_westExit._enabled = true;
|
|
_westExit._insideArea = false;
|
|
_westExit._moving = false;
|
|
|
|
_westEnterForest.setDetails(Rect(290, 87, 320, 168), EXITCURSOR_E, 3900);
|
|
_westEnterForest.setDest(Common::Point(295, 135));
|
|
}
|
|
_westEnterForest._enabled = true;
|
|
_westEnterForest._insideArea = false;
|
|
_westEnterForest._moving = false;
|
|
|
|
scalePalette(65, 65, 65);
|
|
|
|
_northExit.setDest(Common::Point(160, 126));
|
|
_northExit._enabled = true;
|
|
_northExit._insideArea = false;
|
|
_northExit._moving = false;
|
|
|
|
_southExit.setDest(Common::Point(160, 165));
|
|
_southExit._enabled = true;
|
|
_southExit._insideArea = false;
|
|
_southExit._moving = false;
|
|
|
|
R2_GLOBALS._uiElements.draw();
|
|
|
|
_skylineRect.set(0, 0, 320, 87);
|
|
_background.setDetails(Rect(0, 0, 320, 200), 3800, 0, 1, 2, 1, (SceneItem *)NULL);
|
|
if (R2_GLOBALS._sceneManager._previousScene == 3800) {
|
|
_sceneMode = 11;
|
|
switch (R2_GLOBALS._desertPreviousDirection) {
|
|
case 1: {
|
|
// Entering from the north
|
|
R2_GLOBALS._player.setPosition(Common::Point(160, 115));
|
|
Common::Point pt(160, 120);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
}
|
|
break;
|
|
case 2: {
|
|
// Entering from the east
|
|
R2_GLOBALS._player.setPosition(Common::Point(330, 145));
|
|
Common::Point pt(300, 145);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
}
|
|
break;
|
|
case 3: {
|
|
// Entering from the south
|
|
R2_GLOBALS._player.setPosition(Common::Point(160, 220));
|
|
Common::Point pt(160, 160);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
}
|
|
break;
|
|
case 4: {
|
|
// Entering from the west
|
|
R2_GLOBALS._player.setPosition(Common::Point(-10, 145));
|
|
Common::Point pt(19, 145);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
} else if (R2_GLOBALS._sceneManager._previousScene == 2700) {
|
|
_sceneMode = 12;
|
|
R2_GLOBALS._player.setPosition(Common::Point(330, 135));
|
|
Common::Point pt(265, 135);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
} else {
|
|
R2_GLOBALS._player.setPosition(Common::Point(160, 145));
|
|
R2_GLOBALS._player.enableControl(CURSOR_WALK);
|
|
}
|
|
}
|
|
|
|
void Scene3900::signal() {
|
|
switch (_sceneMode) {
|
|
case 11:
|
|
// No break on purpose
|
|
case 12:
|
|
R2_GLOBALS._player.enableControl(CURSOR_WALK);
|
|
break;
|
|
case 13:
|
|
R2_GLOBALS._sceneManager.changeScene(2700);
|
|
break;
|
|
case 14:
|
|
R2_GLOBALS._sceneManager.changeScene(3800);
|
|
break;
|
|
case 3805:
|
|
_northExit._enabled = false;
|
|
_eastExit._enabled = false;
|
|
_southExit._enabled = false;
|
|
_westExit._enabled = false;
|
|
R2_GLOBALS._player._canWalk = false;
|
|
R2_GLOBALS._events.setCursor(CURSOR_USE);
|
|
break;
|
|
case 3806:
|
|
_northExit._enabled = true;
|
|
_eastExit._enabled = true;
|
|
_southExit._enabled = true;
|
|
_westExit._enabled = true;
|
|
R2_GLOBALS._player.enableControl(CURSOR_WALK);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene3900::process(Event &event) {
|
|
if ((R2_GLOBALS._player._uiEnabled) && (event.eventType == EVENT_BUTTON_DOWN)
|
|
&& (_skylineRect.contains(event.mousePos))) {
|
|
event.handled = true;
|
|
switch (R2_GLOBALS._events.getCursor()) {
|
|
case CURSOR_WALK:
|
|
R2_GLOBALS._player.addMover(NULL);
|
|
R2_GLOBALS._player.updateAngle(event.mousePos);
|
|
break;
|
|
case CURSOR_USE:
|
|
SceneItem::display(3800, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
|
|
break;
|
|
case CURSOR_LOOK:
|
|
SceneItem::display(3800, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
|
|
break;
|
|
default:
|
|
event.handled = false;
|
|
break;
|
|
}
|
|
}
|
|
Scene::process(event);
|
|
}
|
|
|
|
} // End of namespace Ringworld2
|
|
} // End of namespace TsAGE
|