mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-15 14:28:28 +00:00
1822 lines
45 KiB
C++
1822 lines
45 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/ringworld2/ringworld2_vampire.h"
|
|
|
|
namespace TsAGE {
|
|
|
|
namespace Ringworld2 {
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 1950 - Flup Tube Corridor Maze
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
Scene1950::KeypadWindow::KeypadWindow() {
|
|
_buttonIndex = 0;
|
|
}
|
|
|
|
void Scene1950::KeypadWindow::synchronize(Serializer &s) {
|
|
SceneArea::synchronize(s);
|
|
|
|
s.syncAsSint16LE(_buttonIndex);
|
|
}
|
|
|
|
Scene1950::KeypadWindow::KeypadButton::KeypadButton() {
|
|
_buttonIndex = 0;
|
|
_pressed = false;
|
|
_toggled = false;
|
|
}
|
|
|
|
void Scene1950::KeypadWindow::KeypadButton::synchronize(Serializer &s) {
|
|
SceneActor::synchronize(s);
|
|
|
|
s.syncAsSint16LE(_buttonIndex);
|
|
s.syncAsSint16LE(_pressed);
|
|
s.syncAsSint16LE(_toggled);
|
|
}
|
|
|
|
void Scene1950::KeypadWindow::KeypadButton::init(int indx) {
|
|
Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_buttonIndex = indx;
|
|
_pressed = false;
|
|
_toggled = false;
|
|
|
|
postInit();
|
|
setup(1971, 2, 1);
|
|
fixPriority(249);
|
|
setPosition(Common::Point(((_buttonIndex % 4) * 22) + 127, ((_buttonIndex / 4) * 19) + 71));
|
|
scene->_sceneAreas.push_front(this);
|
|
}
|
|
|
|
void Scene1950::KeypadWindow::KeypadButton::process(Event &event) {
|
|
if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE)
|
|
&& (_bounds.contains(event.mousePos)) && !_pressed) {
|
|
R2_GLOBALS._sound2.play(227);
|
|
if (!_toggled) {
|
|
setFrame(2);
|
|
_toggled = true;
|
|
} else {
|
|
setFrame(1);
|
|
_toggled = false;
|
|
}
|
|
_pressed = true;
|
|
event.handled = true;
|
|
}
|
|
|
|
if ((event.eventType == EVENT_BUTTON_UP) && _pressed) {
|
|
_pressed = false;
|
|
event.handled = true;
|
|
Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
|
|
scene->doButtonPress(_buttonIndex);
|
|
}
|
|
}
|
|
|
|
bool Scene1950::KeypadWindow::KeypadButton::startAction(CursorType action, Event &event) {
|
|
if (action == CURSOR_USE)
|
|
return false;
|
|
return SceneActor::startAction(action, event);
|
|
}
|
|
|
|
void Scene1950::KeypadWindow::remove() {
|
|
Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
|
|
for (_buttonIndex = 0; _buttonIndex < 16; ++_buttonIndex) {
|
|
scene->_sceneAreas.remove(&_buttons[_buttonIndex]);
|
|
_buttons[_buttonIndex].remove();
|
|
}
|
|
|
|
ModalWindow::remove();
|
|
|
|
if (!R2_GLOBALS.getFlag(37))
|
|
R2_GLOBALS._sound2.play(278);
|
|
|
|
R2_GLOBALS._player.disableControl(CURSOR_WALK);
|
|
scene->_eastExit._enabled = true;
|
|
|
|
if (!R2_GLOBALS.getFlag(37)) {
|
|
if (R2_GLOBALS.getFlag(36)) {
|
|
scene->_sceneMode = 1964;
|
|
scene->setAction(&scene->_sequenceManager, scene, 1964, &R2_GLOBALS._player, NULL);
|
|
} else {
|
|
scene->_sceneMode = 1965;
|
|
scene->setAction(&scene->_sequenceManager, scene, 1965, &R2_GLOBALS._player, NULL);
|
|
}
|
|
}
|
|
}
|
|
|
|
void Scene1950::KeypadWindow::setup2(int visage, int stripFrameNum, int frameNum, int posX, int posY) {
|
|
Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
if (R2_GLOBALS._player._mover)
|
|
R2_GLOBALS._player.addMover(NULL);
|
|
R2_GLOBALS._player._canWalk = false;
|
|
|
|
ModalWindow::setup2(visage, stripFrameNum, frameNum, posX, posY);
|
|
|
|
_object1.fixPriority(248);
|
|
scene->_eastExit._enabled = false;
|
|
setup3(1950, 27, 28, 27);
|
|
|
|
for (_buttonIndex = 0; _buttonIndex < 16; _buttonIndex++)
|
|
_buttons[_buttonIndex].init(_buttonIndex);
|
|
}
|
|
|
|
void Scene1950::KeypadWindow::setup3(int resNum, int lookLineNum, int talkLineNum, int useLineNum) {
|
|
// Copy of Scene1200::LaserPanel::proc13()
|
|
_areaActor.setDetails(resNum, lookLineNum, talkLineNum, useLineNum, 2, (SceneItem *) NULL);
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
bool Scene1950::Keypad::startAction(CursorType action, Event &event) {
|
|
if ((action != CURSOR_USE) || (R2_GLOBALS.getFlag(37)))
|
|
return SceneHotspot::startAction(action, event);
|
|
|
|
Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
R2_GLOBALS._player.disableControl();
|
|
if (R2_GLOBALS.getFlag(36)) {
|
|
scene->_sceneMode = 1962;
|
|
scene->setAction(&scene->_sequenceManager, scene, 1962, &R2_GLOBALS._player, NULL);
|
|
} else {
|
|
scene->_sceneMode = 1963;
|
|
scene->setAction(&scene->_sequenceManager, scene, 1963, &R2_GLOBALS._player, NULL);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool Scene1950::Door::startAction(CursorType action, Event &event) {
|
|
if (action != R2_SCRITH_KEY)
|
|
return SceneActor::startAction(action, event);
|
|
|
|
Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
R2_GLOBALS._player.disableControl();
|
|
R2_INVENTORY.setObjectScene(R2_SCRITH_KEY, 0);
|
|
scene->_sceneMode = 1958;
|
|
scene->setAction(&scene->_sequenceManager, scene, 1958, &R2_GLOBALS._player, &scene->_door, NULL);
|
|
return true;
|
|
}
|
|
|
|
bool Scene1950::Scrolls::startAction(CursorType action, Event &event) {
|
|
if ((action != CURSOR_USE) || (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) != 1950))
|
|
return SceneActor::startAction(action, event);
|
|
|
|
Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_sceneMode = 1968;
|
|
scene->setAction(&scene->_sequenceManager, scene, 1968, &R2_GLOBALS._player, NULL);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool Scene1950::Gem::startAction(CursorType action, Event &event) {
|
|
if ((action != CURSOR_USE) || (!R2_GLOBALS.getFlag(37)))
|
|
return SceneActor::startAction(action, event);
|
|
|
|
Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
R2_GLOBALS._player.disableControl();
|
|
scene->_sceneMode = 1967;
|
|
scene->setAction(&scene->_sequenceManager, scene, 1967, &R2_GLOBALS._player, NULL);
|
|
|
|
return true;
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
Scene1950::Vampire::Vampire() {
|
|
_deadPosition = Common::Point(0, 0);
|
|
_deltaX = 0;
|
|
_deltaY = 0;
|
|
_vampireMode = 0;
|
|
}
|
|
|
|
void Scene1950::Vampire::synchronize(Serializer &s) {
|
|
SceneActor::synchronize(s);
|
|
|
|
s.syncAsSint16LE(_deadPosition.x);
|
|
s.syncAsSint16LE(_deadPosition.y);
|
|
s.syncAsSint16LE(_deltaX);
|
|
s.syncAsSint16LE(_deltaY);
|
|
s.syncAsSint16LE(_vampireMode);
|
|
}
|
|
|
|
void Scene1950::Vampire::signal() {
|
|
Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
switch (_vampireMode) {
|
|
case 19: {
|
|
_vampireMode = 0;
|
|
setVisage(1960);
|
|
if (R2_GLOBALS._flubMazeEntryDirection == 3)
|
|
setStrip(2);
|
|
else
|
|
setStrip(1);
|
|
|
|
NpcMover *mover = new NpcMover();
|
|
addMover(mover, &scene->_vampireDestPos, scene);
|
|
}
|
|
break;
|
|
case 20: {
|
|
// Non fatal shot
|
|
_vampireMode = 19;
|
|
R2_GLOBALS._player.setVisage(22);
|
|
if (R2_GLOBALS._flubMazeEntryDirection == 3)
|
|
R2_GLOBALS._player.setStrip(1);
|
|
else
|
|
R2_GLOBALS._player.setStrip(2);
|
|
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
|
|
R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._shotsRequired--;
|
|
|
|
if (R2_GLOBALS._flubMazeEntryDirection == 3)
|
|
_deadPosition.x = _position.x + 10;
|
|
else
|
|
_deadPosition.x = _position.x - 10;
|
|
_deadPosition.y = _position.y - 4;
|
|
|
|
setVisage(1961);
|
|
|
|
if (R2_GLOBALS._flubMazeEntryDirection == 3)
|
|
setStrip(2);
|
|
else
|
|
setStrip(1);
|
|
|
|
animate(ANIM_MODE_2, NULL);
|
|
Common::Point pt = _deadPosition;
|
|
PlayerMover *mover = new PlayerMover();
|
|
addMover(mover, &pt, this);
|
|
|
|
R2_GLOBALS._player.enableControl();
|
|
}
|
|
break;
|
|
case 21: {
|
|
// Fatal shot
|
|
R2_GLOBALS._player.setVisage(22);
|
|
if (R2_GLOBALS._flubMazeEntryDirection == 3)
|
|
R2_GLOBALS._player.setStrip(1);
|
|
else
|
|
R2_GLOBALS._player.setStrip(2);
|
|
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
|
|
|
|
setVisage(1961);
|
|
if (R2_GLOBALS._flubMazeEntryDirection == 3)
|
|
setStrip(4);
|
|
else
|
|
setStrip(3);
|
|
setDetails(1950, 15, -1, 17, 2, (SceneItem *) NULL);
|
|
addMover(NULL);
|
|
_numFrames = 8;
|
|
R2_GLOBALS._sound2.play(226);
|
|
animate(ANIM_MODE_5, NULL);
|
|
fixPriority(10);
|
|
|
|
R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._isAlive = false;
|
|
R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._shotsRequired--;
|
|
R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._position = _position;
|
|
_deltaX = (_position.x - R2_GLOBALS._player._position.x) / 2;
|
|
_deltaY = (_position.y - R2_GLOBALS._player._position.y) / 2;
|
|
|
|
byte vampireCount = 0;
|
|
for (byte i = 0; i < 18; ++i) {
|
|
if (!R2_GLOBALS._vampireData[i]._isAlive)
|
|
++vampireCount;
|
|
}
|
|
|
|
if (vampireCount == 18) {
|
|
R2_GLOBALS.setFlag(36);
|
|
_vampireMode = 23;
|
|
Common::Point pt(R2_GLOBALS._player._position.x + _deltaX, R2_GLOBALS._player._position.y + _deltaY);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
} else if (vampireCount == 1) {
|
|
_vampireMode = 22;
|
|
Common::Point pt(R2_GLOBALS._player._position.x + _deltaX, R2_GLOBALS._player._position.y + _deltaY);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
} else {
|
|
R2_GLOBALS._player.enableControl(CURSOR_WALK);
|
|
}
|
|
|
|
if (R2_GLOBALS._flubMazeEntryDirection == 3)
|
|
scene->_eastExit._enabled = true;
|
|
else
|
|
scene->_westExit._enabled = true;
|
|
|
|
scene->_vampireActive = false;
|
|
}
|
|
break;
|
|
case 22:
|
|
SceneItem::display(1950, 18, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
|
|
R2_GLOBALS._player.enableControl(CURSOR_WALK);
|
|
break;
|
|
case 23:
|
|
SceneItem::display(1950, 25, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
|
|
scene->_sceneMode = R2_GLOBALS._flubMazeEntryDirection;
|
|
scene->setAction(&scene->_sequenceManager, scene, 1960, &R2_GLOBALS._player, NULL);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
bool Scene1950::Vampire::startAction(CursorType action, Event &event) {
|
|
Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
if (!R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._isAlive ||
|
|
(action != R2_PHOTON_STUNNER))
|
|
return SceneActor::startAction(action, event);
|
|
|
|
R2_GLOBALS._player.disableControl();
|
|
|
|
if (R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._shotsRequired <= 1)
|
|
_vampireMode = 21;
|
|
else
|
|
_vampireMode = 20;
|
|
|
|
R2_GLOBALS._player.setVisage(25);
|
|
if (R2_GLOBALS._flubMazeEntryDirection == 3)
|
|
R2_GLOBALS._player.setStrip(2);
|
|
else
|
|
R2_GLOBALS._player.setStrip(1);
|
|
R2_GLOBALS._player.animate(ANIM_MODE_5, this);
|
|
R2_GLOBALS._sound3.play(99);
|
|
|
|
return true;
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
void Scene1950::NorthExit::changeScene() {
|
|
Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_enabled = false;
|
|
R2_GLOBALS._player.disableControl(CURSOR_WALK);
|
|
R2_GLOBALS._flubMazeEntryDirection = 1;
|
|
scene->_sceneMode = 11;
|
|
|
|
Common::Point pt(160, 127);
|
|
PlayerMover *mover = new PlayerMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, scene);
|
|
}
|
|
|
|
void Scene1950::UpExit::changeScene() {
|
|
Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_enabled = false;
|
|
R2_GLOBALS._player.disableControl(CURSOR_WALK);
|
|
R2_GLOBALS._flubMazeEntryDirection = 2;
|
|
scene->_sceneMode = 12;
|
|
|
|
if (!scene->_upExitStyle) {
|
|
if (R2_GLOBALS.getFlag(36))
|
|
scene->setAction(&scene->_sequenceManager, scene, 1953, &R2_GLOBALS._player, NULL);
|
|
else
|
|
scene->setAction(&scene->_sequenceManager, scene, 1970, &R2_GLOBALS._player, NULL);
|
|
} else {
|
|
if (R2_GLOBALS.getFlag(36))
|
|
scene->setAction(&scene->_sequenceManager, scene, 1952, &R2_GLOBALS._player, NULL);
|
|
else
|
|
scene->setAction(&scene->_sequenceManager, scene, 1969, &R2_GLOBALS._player, NULL);
|
|
}
|
|
}
|
|
|
|
void Scene1950::EastExit::changeScene() {
|
|
Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_enabled = false;
|
|
R2_GLOBALS._player.disableControl(CURSOR_WALK);
|
|
R2_GLOBALS._flubMazeEntryDirection = 3;
|
|
scene->_sceneMode = 13;
|
|
|
|
if (scene->_vampireActive)
|
|
R2_GLOBALS._player.animate(ANIM_MODE_9);
|
|
|
|
Common::Point pt(340, 160);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, scene);
|
|
}
|
|
|
|
void Scene1950::DownExit::changeScene() {
|
|
Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_enabled = false;
|
|
R2_GLOBALS._player.disableControl(CURSOR_WALK);
|
|
R2_GLOBALS._flubMazeEntryDirection = 4;
|
|
scene->_sceneMode = 14;
|
|
|
|
if (R2_GLOBALS.getFlag(36))
|
|
scene->setAction(&scene->_sequenceManager, scene, 1956, &R2_GLOBALS._player, NULL);
|
|
else
|
|
scene->setAction(&scene->_sequenceManager, scene, 1973, &R2_GLOBALS._player, NULL);
|
|
}
|
|
|
|
void Scene1950::SouthExit::changeScene() {
|
|
Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_enabled = false;
|
|
R2_GLOBALS._player.disableControl(CURSOR_WALK);
|
|
R2_GLOBALS._flubMazeEntryDirection = 5;
|
|
scene->_sceneMode = 15;
|
|
|
|
Common::Point pt(160, 213);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, scene);
|
|
}
|
|
|
|
void Scene1950::WestExit::changeScene() {
|
|
Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_enabled = false;
|
|
R2_GLOBALS._player.disableControl(CURSOR_WALK);
|
|
R2_GLOBALS._flubMazeEntryDirection = 6;
|
|
|
|
if (R2_GLOBALS._flubMazeArea == 2) {
|
|
// In the very first corridor area after the Scrith Door
|
|
if ((R2_GLOBALS.getFlag(36)) && (R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 2) && (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 2)) {
|
|
scene->_sceneMode = 1961;
|
|
Common::Point pt(-20, 160);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, scene);
|
|
} else {
|
|
if (!R2_GLOBALS.getFlag(36))
|
|
SceneItem::display(1950, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
|
|
if ((R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 1950) || (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 1950))
|
|
SceneItem::display(1950, 34, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
|
|
scene->_sceneMode = 0;
|
|
Common::Point pt(30, 160);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, scene);
|
|
}
|
|
} else {
|
|
if (scene->_vampireActive)
|
|
R2_GLOBALS._player.animate(ANIM_MODE_9);
|
|
|
|
scene->_sceneMode = 16;
|
|
Common::Point pt(-20, 160);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, scene);
|
|
}
|
|
}
|
|
|
|
void Scene1950::ShaftExit::changeScene() {
|
|
Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_enabled = false;
|
|
R2_GLOBALS._player.disableControl(CURSOR_WALK);
|
|
R2_GLOBALS._flubMazeEntryDirection = 0;
|
|
scene->_sceneMode = 1951;
|
|
scene->setAction(&scene->_sequenceManager, scene, 1951, &R2_GLOBALS._player, NULL);
|
|
}
|
|
|
|
void Scene1950::DoorExit::changeScene() {
|
|
Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
|
|
|
|
_enabled = false;
|
|
R2_GLOBALS._player.disableControl(CURSOR_WALK);
|
|
R2_GLOBALS._flubMazeEntryDirection = 3;
|
|
if (R2_GLOBALS._player._visage == 22) {
|
|
scene->_sceneMode = 1975;
|
|
scene->setAction(&scene->_sequenceManager, scene, 1975, &R2_GLOBALS._player, NULL);
|
|
} else {
|
|
SceneItem::display(1950, 22, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
|
|
R2_GLOBALS._flubMazeEntryDirection = 0;
|
|
scene->_sceneMode = 0;
|
|
Common::Point pt(250, 150);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, scene);
|
|
_enabled = true;
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
Scene1950::Scene1950() {
|
|
_upExitStyle = false;
|
|
_removeFlag = false;
|
|
_vampireActive = false;
|
|
_vampireDestPos = Common::Point(0, 0);
|
|
_vampireIndex = 0;
|
|
}
|
|
|
|
void Scene1950::synchronize(Serializer &s) {
|
|
SceneExt::synchronize(s);
|
|
|
|
s.syncAsSint16LE(_upExitStyle);
|
|
s.syncAsSint16LE(_removeFlag);
|
|
s.syncAsSint16LE(_vampireActive);
|
|
s.syncAsSint16LE(_vampireDestPos.x);
|
|
s.syncAsSint16LE(_vampireDestPos.y);
|
|
s.syncAsSint16LE(_vampireIndex);
|
|
}
|
|
|
|
void Scene1950::initArea() {
|
|
_northExit._enabled = false;
|
|
_upExit._enabled = false;
|
|
_eastExit._enabled = false;
|
|
_downExit._enabled = false;
|
|
_southExit._enabled = false;
|
|
_westExit._enabled = false;
|
|
_shaftExit._enabled = false;
|
|
_doorExit._enabled = false;
|
|
_northExit._insideArea = false;
|
|
_upExit._insideArea = false;
|
|
_eastExit._insideArea = false;
|
|
_downExit._insideArea = false;
|
|
_southExit._insideArea = false;
|
|
_westExit._insideArea = false;
|
|
_shaftExit._insideArea = false;
|
|
_doorExit._insideArea = false;
|
|
_northExit._moving = false;
|
|
_upExit._moving = false;
|
|
_eastExit._moving = false;
|
|
_downExit._moving = false;
|
|
_southExit._moving = false;
|
|
_westExit._moving = false;
|
|
_shaftExit._moving = false;
|
|
_doorExit._moving = false;
|
|
_upExitStyle = false;
|
|
|
|
switch (R2_GLOBALS._flubMazeArea - 1) {
|
|
case 0:
|
|
loadScene(1948);
|
|
break;
|
|
case 1:
|
|
// No break on purpose
|
|
case 8:
|
|
// No break on purpose
|
|
case 10:
|
|
// No break on purpose
|
|
case 12:
|
|
// No break on purpose
|
|
case 16:
|
|
// No break on purpose
|
|
case 19:
|
|
// No break on purpose
|
|
case 23:
|
|
// No break on purpose
|
|
case 30:
|
|
// No break on purpose
|
|
case 44:
|
|
// No break on purpose
|
|
case 72:
|
|
// No break on purpose
|
|
case 74:
|
|
// No break on purpose
|
|
case 86:
|
|
// No break on purpose
|
|
case 96:
|
|
// No break on purpose
|
|
case 103:
|
|
loadScene(1950);
|
|
break;
|
|
case 2:
|
|
// No break on purpose
|
|
case 29:
|
|
loadScene(1965);
|
|
break;
|
|
case 3:
|
|
// No break on purpose
|
|
case 9:
|
|
// No break on purpose
|
|
case 11:
|
|
// No break on purpose
|
|
case 15:
|
|
// No break on purpose
|
|
case 24:
|
|
// No break on purpose
|
|
case 39:
|
|
// No break on purpose
|
|
case 45:
|
|
// No break on purpose
|
|
case 71:
|
|
// No break on purpose
|
|
case 73:
|
|
// No break on purpose
|
|
case 75:
|
|
// No break on purpose
|
|
case 79:
|
|
// No break on purpose
|
|
case 85:
|
|
// No break on purpose
|
|
case 87:
|
|
// No break on purpose
|
|
case 95:
|
|
loadScene(1955);
|
|
break;
|
|
case 4:
|
|
// No break on purpose
|
|
case 6:
|
|
// No break on purpose
|
|
case 13:
|
|
// No break on purpose
|
|
case 27:
|
|
// No break on purpose
|
|
case 41:
|
|
// No break on purpose
|
|
case 48:
|
|
// No break on purpose
|
|
case 50:
|
|
// No break on purpose
|
|
case 54:
|
|
// No break on purpose
|
|
case 76:
|
|
// No break on purpose
|
|
case 80:
|
|
// No break on purpose
|
|
case 90:
|
|
// No break on purpose
|
|
case 104:
|
|
loadScene(1975);
|
|
break;
|
|
case 5:
|
|
// No break on purpose
|
|
case 7:
|
|
// No break on purpose
|
|
case 14:
|
|
// No break on purpose
|
|
case 28:
|
|
// No break on purpose
|
|
case 32:
|
|
// No break on purpose
|
|
case 47:
|
|
// No break on purpose
|
|
case 53:
|
|
loadScene(1997);
|
|
break;
|
|
case 17:
|
|
// No break on purpose
|
|
case 20:
|
|
// No break on purpose
|
|
case 25:
|
|
// No break on purpose
|
|
case 31:
|
|
// No break on purpose
|
|
case 33:
|
|
// No break on purpose
|
|
case 46:
|
|
loadScene(1995);
|
|
break;
|
|
case 18:
|
|
// No break on purpose
|
|
case 22:
|
|
// No break on purpose
|
|
case 26:
|
|
// No break on purpose
|
|
case 36:
|
|
// No break on purpose
|
|
case 38:
|
|
// No break on purpose
|
|
case 43:
|
|
// No break on purpose
|
|
case 51:
|
|
// No break on purpose
|
|
case 70:
|
|
// No break on purpose
|
|
case 78:
|
|
// No break on purpose
|
|
case 84:
|
|
// No break on purpose
|
|
case 89:
|
|
// No break on purpose
|
|
case 101:
|
|
loadScene(1970);
|
|
break;
|
|
case 21:
|
|
// No break on purpose
|
|
case 34:
|
|
// No break on purpose
|
|
case 57:
|
|
// No break on purpose
|
|
case 58:
|
|
// No break on purpose
|
|
case 59:
|
|
// No break on purpose
|
|
case 62:
|
|
// No break on purpose
|
|
case 65:
|
|
loadScene(1980);
|
|
break;
|
|
case 35:
|
|
// No break on purpose
|
|
case 61:
|
|
// No break on purpose
|
|
case 77:
|
|
// No break on purpose
|
|
case 83:
|
|
loadScene(1982);
|
|
break;
|
|
case 37:
|
|
// No break on purpose
|
|
case 52:
|
|
// No break on purpose
|
|
case 82:
|
|
// No break on purpose
|
|
case 88:
|
|
// No break on purpose
|
|
case 92:
|
|
// No break on purpose
|
|
case 97:
|
|
// No break on purpose
|
|
case 100:
|
|
loadScene(1962);
|
|
break;
|
|
case 40:
|
|
// No break on purpose
|
|
case 102:
|
|
loadScene(1960);
|
|
break;
|
|
case 42:
|
|
// No break on purpose
|
|
case 55:
|
|
// No break on purpose
|
|
case 60:
|
|
// No break on purpose
|
|
case 66:
|
|
// No break on purpose
|
|
case 68:
|
|
// No break on purpose
|
|
case 69:
|
|
// No break on purpose
|
|
case 93:
|
|
// No break on purpose
|
|
case 98:
|
|
loadScene(1990);
|
|
break;
|
|
case 49:
|
|
// No break on purpose
|
|
case 81:
|
|
// No break on purpose
|
|
case 91:
|
|
// No break on purpose
|
|
case 94:
|
|
// No break on purpose
|
|
case 99:
|
|
loadScene(1967);
|
|
break;
|
|
case 56:
|
|
// No break on purpose
|
|
case 63:
|
|
// No break on purpose
|
|
case 64:
|
|
// No break on purpose
|
|
case 67:
|
|
loadScene(1985);
|
|
_upExitStyle = true;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (R2_GLOBALS._flubMazeArea != 1)
|
|
R2_GLOBALS._walkRegions.load(1950);
|
|
|
|
switch (R2_GLOBALS._flubMazeArea - 1) {
|
|
case 0:
|
|
_shaftExit._enabled = true;
|
|
if ((R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) == 0) && (R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 1950))
|
|
_doorExit._enabled = true;
|
|
R2_GLOBALS._walkRegions.disableRegion(2);
|
|
R2_GLOBALS._walkRegions.disableRegion(3);
|
|
R2_GLOBALS._walkRegions.disableRegion(4);
|
|
R2_GLOBALS._walkRegions.disableRegion(5);
|
|
R2_GLOBALS._walkRegions.disableRegion(6);
|
|
break;
|
|
case 1:
|
|
// No break on purpose
|
|
case 2:
|
|
// No break on purpose
|
|
case 3:
|
|
// No break on purpose
|
|
case 8:
|
|
// No break on purpose
|
|
case 9:
|
|
// No break on purpose
|
|
case 10:
|
|
// No break on purpose
|
|
case 11:
|
|
// No break on purpose
|
|
case 12:
|
|
// No break on purpose
|
|
case 15:
|
|
// No break on purpose
|
|
case 16:
|
|
// No break on purpose
|
|
case 19:
|
|
// No break on purpose
|
|
case 23:
|
|
// No break on purpose
|
|
case 24:
|
|
// No break on purpose
|
|
case 29:
|
|
// No break on purpose
|
|
case 30:
|
|
// No break on purpose
|
|
case 39:
|
|
// No break on purpose
|
|
case 40:
|
|
// No break on purpose
|
|
case 44:
|
|
// No break on purpose
|
|
case 45:
|
|
// No break on purpose
|
|
case 71:
|
|
// No break on purpose
|
|
case 72:
|
|
// No break on purpose
|
|
case 73:
|
|
// No break on purpose
|
|
case 74:
|
|
// No break on purpose
|
|
case 75:
|
|
// No break on purpose
|
|
case 79:
|
|
// No break on purpose
|
|
case 85:
|
|
// No break on purpose
|
|
case 86:
|
|
// No break on purpose
|
|
case 87:
|
|
// No break on purpose
|
|
case 95:
|
|
// No break on purpose
|
|
case 96:
|
|
// No break on purpose
|
|
case 102:
|
|
// No break on purpose
|
|
case 103:
|
|
_eastExit._enabled = true;
|
|
_westExit._enabled = true;
|
|
break;
|
|
case 4:
|
|
// No break on purpose
|
|
case 6:
|
|
// No break on purpose
|
|
case 13:
|
|
// No break on purpose
|
|
case 17:
|
|
// No break on purpose
|
|
case 20:
|
|
// No break on purpose
|
|
case 25:
|
|
// No break on purpose
|
|
case 27:
|
|
// No break on purpose
|
|
case 31:
|
|
// No break on purpose
|
|
case 33:
|
|
// No break on purpose
|
|
case 37:
|
|
// No break on purpose
|
|
case 41:
|
|
// No break on purpose
|
|
case 46:
|
|
// No break on purpose
|
|
case 48:
|
|
// No break on purpose
|
|
case 50:
|
|
// No break on purpose
|
|
case 52:
|
|
// No break on purpose
|
|
case 54:
|
|
// No break on purpose
|
|
case 76:
|
|
// No break on purpose
|
|
case 80:
|
|
// No break on purpose
|
|
case 82:
|
|
// No break on purpose
|
|
case 88:
|
|
// No break on purpose
|
|
case 90:
|
|
// No break on purpose
|
|
case 92:
|
|
// No break on purpose
|
|
case 97:
|
|
// No break on purpose
|
|
case 100:
|
|
// No break on purpose
|
|
case 104:
|
|
_westExit._enabled = true;
|
|
R2_GLOBALS._walkRegions.disableRegion(6);
|
|
R2_GLOBALS._walkRegions.disableRegion(9);
|
|
break;
|
|
case 5:
|
|
// No break on purpose
|
|
case 7:
|
|
// No break on purpose
|
|
case 14:
|
|
// No break on purpose
|
|
case 18:
|
|
// No break on purpose
|
|
case 22:
|
|
// No break on purpose
|
|
case 26:
|
|
// No break on purpose
|
|
case 28:
|
|
// No break on purpose
|
|
case 32:
|
|
// No break on purpose
|
|
case 36:
|
|
// No break on purpose
|
|
case 38:
|
|
// No break on purpose
|
|
case 43:
|
|
// No break on purpose
|
|
case 47:
|
|
// No break on purpose
|
|
case 49:
|
|
// No break on purpose
|
|
case 51:
|
|
// No break on purpose
|
|
case 53:
|
|
// No break on purpose
|
|
case 70:
|
|
// No break on purpose
|
|
case 78:
|
|
// No break on purpose
|
|
case 81:
|
|
// No break on purpose
|
|
case 84:
|
|
// No break on purpose
|
|
case 89:
|
|
// No break on purpose
|
|
case 91:
|
|
// No break on purpose
|
|
case 94:
|
|
// No break on purpose
|
|
case 99:
|
|
// No break on purpose
|
|
case 101:
|
|
_eastExit._enabled = true;
|
|
R2_GLOBALS._walkRegions.disableRegion(1);
|
|
R2_GLOBALS._walkRegions.disableRegion(7);
|
|
R2_GLOBALS._walkRegions.disableRegion(13);
|
|
break;
|
|
default:
|
|
R2_GLOBALS._walkRegions.disableRegion(1);
|
|
R2_GLOBALS._walkRegions.disableRegion(6);
|
|
R2_GLOBALS._walkRegions.disableRegion(7);
|
|
R2_GLOBALS._walkRegions.disableRegion(9);
|
|
R2_GLOBALS._walkRegions.disableRegion(13);
|
|
break;
|
|
}
|
|
|
|
_northDoorway.remove();
|
|
_northDoorway.removeObject();
|
|
_southDoorway.remove();
|
|
|
|
switch (R2_GLOBALS._flubMazeArea - 4) {
|
|
case 0:
|
|
// No break on purpose
|
|
case 3:
|
|
// No break on purpose
|
|
case 16:
|
|
// No break on purpose
|
|
case 22:
|
|
// No break on purpose
|
|
case 24:
|
|
// No break on purpose
|
|
case 32:
|
|
// No break on purpose
|
|
case 33:
|
|
// No break on purpose
|
|
case 45:
|
|
// No break on purpose
|
|
case 46:
|
|
// No break on purpose
|
|
case 48:
|
|
// No break on purpose
|
|
case 51:
|
|
// No break on purpose
|
|
case 56:
|
|
// No break on purpose
|
|
case 59:
|
|
// No break on purpose
|
|
case 67:
|
|
// No break on purpose
|
|
case 68:
|
|
// No break on purpose
|
|
case 70:
|
|
// No break on purpose
|
|
case 73:
|
|
// No break on purpose
|
|
case 82:
|
|
// No break on purpose
|
|
case 90:
|
|
_northExit._enabled = true;
|
|
_northDoorway.setup(1950, (R2_GLOBALS._flubMazeArea % 2) + 1, 1, 160, 137, 25);
|
|
//visage,strip,frame,px,py,priority,effect
|
|
_southDoorway.postInit();
|
|
_southDoorway.setVisage(1950);
|
|
_southDoorway.setStrip((((R2_GLOBALS._flubMazeArea - 1) / 35) % 2) + 1);
|
|
_southDoorway.setFrame(2);
|
|
_southDoorway.setPosition(Common::Point(160, 167));
|
|
_southDoorway.fixPriority(220);
|
|
R2_GLOBALS._walkRegions.disableRegion(3);
|
|
R2_GLOBALS._walkRegions.disableRegion(4);
|
|
break;
|
|
case 7:
|
|
// No break on purpose
|
|
case 10:
|
|
// No break on purpose
|
|
case 23:
|
|
// No break on purpose
|
|
case 29:
|
|
// No break on purpose
|
|
case 31:
|
|
// No break on purpose
|
|
case 39:
|
|
// No break on purpose
|
|
case 40:
|
|
// No break on purpose
|
|
case 52:
|
|
// No break on purpose
|
|
case 53:
|
|
// No break on purpose
|
|
case 55:
|
|
// No break on purpose
|
|
case 63:
|
|
// No break on purpose
|
|
case 65:
|
|
// No break on purpose
|
|
case 66:
|
|
// No break on purpose
|
|
case 75:
|
|
// No break on purpose
|
|
case 77:
|
|
// No break on purpose
|
|
case 81:
|
|
// No break on purpose
|
|
case 87:
|
|
// No break on purpose
|
|
case 89:
|
|
// No break on purpose
|
|
case 97:
|
|
_southExit._enabled = true;
|
|
|
|
_southDoorway.postInit();
|
|
_southDoorway.setVisage(1950);
|
|
_southDoorway.setStrip((((R2_GLOBALS._flubMazeArea - 1) / 35) % 2) + 1);
|
|
_southDoorway.setFrame(3);
|
|
_southDoorway.setPosition(Common::Point(160, 167));
|
|
_southDoorway.fixPriority(220);
|
|
break;
|
|
case 58:
|
|
// No break on purpose
|
|
case 74:
|
|
// No break on purpose
|
|
case 80:
|
|
_northExit._enabled = true;
|
|
_southExit._enabled = true;
|
|
|
|
_northDoorway.setup(1950, (R2_GLOBALS._flubMazeArea % 2) + 1, 1, 160, 137, 25);
|
|
|
|
_southDoorway.postInit();
|
|
_southDoorway.setVisage(1950);
|
|
_southDoorway.setStrip((((R2_GLOBALS._flubMazeArea - 1) / 35) % 2) + 1);
|
|
_southDoorway.setFrame(3);
|
|
_southDoorway.setPosition(Common::Point(160, 167));
|
|
_southDoorway.fixPriority(220);
|
|
R2_GLOBALS._walkRegions.disableRegion(3);
|
|
R2_GLOBALS._walkRegions.disableRegion(4);
|
|
break;
|
|
default:
|
|
_southDoorway.postInit();
|
|
_southDoorway.setVisage(1950);
|
|
_southDoorway.setStrip(((R2_GLOBALS._flubMazeArea - 1) / 35) % 2 + 1);
|
|
_southDoorway.setFrame(2);
|
|
_southDoorway.setPosition(Common::Point(160, 167));
|
|
_southDoorway.fixPriority(220);
|
|
break;
|
|
}
|
|
|
|
switch (R2_GLOBALS._flubMazeArea - 3) {
|
|
case 0:
|
|
// No break on purpose
|
|
case 3:
|
|
// No break on purpose
|
|
case 5:
|
|
// No break on purpose
|
|
case 12:
|
|
// No break on purpose
|
|
case 15:
|
|
// No break on purpose
|
|
case 18:
|
|
// No break on purpose
|
|
case 19:
|
|
// No break on purpose
|
|
case 23:
|
|
// No break on purpose
|
|
case 26:
|
|
// No break on purpose
|
|
case 27:
|
|
// No break on purpose
|
|
case 29:
|
|
// No break on purpose
|
|
case 30:
|
|
// No break on purpose
|
|
case 31:
|
|
// No break on purpose
|
|
case 32:
|
|
// No break on purpose
|
|
case 44:
|
|
// No break on purpose
|
|
case 45:
|
|
// No break on purpose
|
|
case 51:
|
|
// No break on purpose
|
|
case 55:
|
|
// No break on purpose
|
|
case 56:
|
|
// No break on purpose
|
|
case 57:
|
|
// No break on purpose
|
|
case 60:
|
|
// No break on purpose
|
|
case 63:
|
|
_upExit._enabled = true;
|
|
break;
|
|
case 54:
|
|
// No break on purpose
|
|
case 61:
|
|
// No break on purpose
|
|
case 62:
|
|
// No break on purpose
|
|
case 65:
|
|
_upExit._enabled = true;
|
|
// No break on purpose
|
|
case 35:
|
|
// No break on purpose
|
|
case 38:
|
|
// No break on purpose
|
|
case 40:
|
|
// No break on purpose
|
|
case 47:
|
|
// No break on purpose
|
|
case 50:
|
|
// No break on purpose
|
|
case 53:
|
|
// No break on purpose
|
|
case 58:
|
|
// No break on purpose
|
|
case 64:
|
|
// No break on purpose
|
|
case 66:
|
|
// No break on purpose
|
|
case 67:
|
|
// No break on purpose
|
|
case 79:
|
|
// No break on purpose
|
|
case 80:
|
|
// No break on purpose
|
|
case 86:
|
|
// No break on purpose
|
|
case 89:
|
|
// No break on purpose
|
|
case 90:
|
|
// No break on purpose
|
|
case 91:
|
|
// No break on purpose
|
|
case 92:
|
|
// No break on purpose
|
|
case 95:
|
|
// No break on purpose
|
|
case 96:
|
|
// No break on purpose
|
|
case 97:
|
|
// No break on purpose
|
|
case 98:
|
|
// No break on purpose
|
|
case 100:
|
|
_downExit._enabled = true;
|
|
R2_GLOBALS._walkRegions.disableRegion(4);
|
|
R2_GLOBALS._walkRegions.disableRegion(5);
|
|
R2_GLOBALS._walkRegions.disableRegion(6);
|
|
R2_GLOBALS._walkRegions.disableRegion(10);
|
|
R2_GLOBALS._walkRegions.disableRegion(11);
|
|
default:
|
|
break;
|
|
}
|
|
R2_GLOBALS._uiElements.draw();
|
|
}
|
|
|
|
void Scene1950::enterArea() {
|
|
R2_GLOBALS._player.disableControl();
|
|
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
|
|
|
|
_vampire.remove();
|
|
_door.remove();
|
|
_scrolls.remove();
|
|
|
|
_vampireActive = false;
|
|
_vampireIndex = 0;
|
|
|
|
// Certain areas have a vampire in them
|
|
switch (R2_GLOBALS._flubMazeArea) {
|
|
case 10:
|
|
_vampireIndex = 1;
|
|
break;
|
|
case 13:
|
|
_vampireIndex = 2;
|
|
break;
|
|
case 16:
|
|
_vampireIndex = 3;
|
|
break;
|
|
case 17:
|
|
_vampireIndex = 4;
|
|
break;
|
|
case 24:
|
|
_vampireIndex = 5;
|
|
break;
|
|
case 25:
|
|
_vampireIndex = 6;
|
|
break;
|
|
case 31:
|
|
_vampireIndex = 7;
|
|
break;
|
|
case 40:
|
|
_vampireIndex = 8;
|
|
break;
|
|
case 45:
|
|
_vampireIndex = 9;
|
|
break;
|
|
case 46:
|
|
_vampireIndex = 10;
|
|
break;
|
|
case 73:
|
|
_vampireIndex = 11;
|
|
break;
|
|
case 75:
|
|
_vampireIndex = 12;
|
|
break;
|
|
case 80:
|
|
_vampireIndex = 13;
|
|
break;
|
|
case 87:
|
|
_vampireIndex = 14;
|
|
break;
|
|
case 88:
|
|
_vampireIndex = 15;
|
|
break;
|
|
case 96:
|
|
_vampireIndex = 16;
|
|
break;
|
|
case 97:
|
|
_vampireIndex = 17;
|
|
break;
|
|
case 104:
|
|
_vampireIndex = 18;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (_vampireIndex != 0) {
|
|
_vampire.postInit();
|
|
_vampire._numFrames = 6;
|
|
_vampire._moveRate = 6;
|
|
_vampire._moveDiff = Common::Point(3, 2);
|
|
_vampire._effect = EFFECT_SHADED;
|
|
|
|
if (!R2_GLOBALS._vampireData[_vampireIndex - 1]._isAlive) {
|
|
// Show vampire ashes
|
|
_vampire.setPosition(Common::Point(R2_GLOBALS._vampireData[_vampireIndex - 1]._position));
|
|
_vampire.animate(ANIM_MODE_NONE, NULL);
|
|
_vampire.addMover(NULL);
|
|
_vampire.setVisage(1961);
|
|
_vampire.setStrip(4);
|
|
_vampire.setFrame(10);
|
|
_vampire.fixPriority(10);
|
|
_vampire.setDetails(1950, 15, -1, 17, 2, (SceneItem *) NULL);
|
|
} else {
|
|
// Start the vampire
|
|
_vampire.setVisage(1960);
|
|
_vampire.setPosition(Common::Point(160, 130));
|
|
_vampire.animate(ANIM_MODE_2, NULL);
|
|
_vampire.setDetails(1950, 12, -1, 14, 2, (SceneItem *) NULL);
|
|
_vampireActive = true;
|
|
}
|
|
}
|
|
if ((R2_GLOBALS._flubMazeArea == 1) && (R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) != 0)) {
|
|
// Show doorway at the right hand side of the very first flub corridor
|
|
_door.postInit();
|
|
_door.setVisage(1948);
|
|
_door.setStrip(3);
|
|
_door.setPosition(Common::Point(278, 155));
|
|
_door.fixPriority(100);
|
|
_door.setDetails(1950, 19, 20, 23, 2, (SceneItem *) NULL);
|
|
}
|
|
|
|
if (R2_GLOBALS._flubMazeArea == 102) {
|
|
R2_GLOBALS._walkRegions.load(1951);
|
|
R2_GLOBALS._walkRegions.disableRegion(1);
|
|
R2_GLOBALS._walkRegions.disableRegion(5);
|
|
R2_GLOBALS._walkRegions.disableRegion(6);
|
|
R2_GLOBALS._walkRegions.disableRegion(7);
|
|
|
|
_cube.postInit();
|
|
_cube.setVisage(1970);
|
|
_cube.setStrip(1);
|
|
if (R2_GLOBALS.getFlag(37))
|
|
_cube.setFrame(3);
|
|
else
|
|
_cube.setFrame(1);
|
|
_cube.setPosition(Common::Point(193, 158));
|
|
_cube.setDetails(1950, 3, 4, 5, 2, (SceneItem *) NULL);
|
|
|
|
_pulsingLights.postInit();
|
|
_pulsingLights.setVisage(1970);
|
|
_pulsingLights.setStrip(3);
|
|
_pulsingLights.animate(ANIM_MODE_2, NULL);
|
|
_pulsingLights._numFrames = 6;
|
|
_pulsingLights.setPosition(Common::Point(194, 158));
|
|
_pulsingLights.fixPriority(159);
|
|
|
|
_keypad.setDetails(Rect(188, 124, 199, 133), 1950, 27, 28, -1, 2, NULL);
|
|
|
|
if (R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 1950) {
|
|
_gem.postInit();
|
|
_gem.setVisage(1970);
|
|
_gem.setStrip(1);
|
|
_gem.setFrame(2);
|
|
_gem.fixPriority(160);
|
|
}
|
|
|
|
if (R2_GLOBALS.getFlag(37)) {
|
|
_gem.setPosition(Common::Point(192, 118));
|
|
_gem.setDetails(1950, 9, 4, -1, 2, (SceneItem *) NULL);
|
|
} else {
|
|
_containmentField.postInit();
|
|
_containmentField.setVisage(1970);
|
|
_containmentField.setStrip(4);
|
|
_containmentField._numFrames = 4;
|
|
_containmentField.animate(ANIM_MODE_8, 0, NULL);
|
|
_containmentField.setPosition(Common::Point(192, 121));
|
|
_containmentField.fixPriority(159);
|
|
_containmentField.setDetails(1950, 6, 7, 8, 2, (SceneItem *) NULL);
|
|
|
|
_gem.setPosition(Common::Point(192, 109));
|
|
_gem.setDetails(1950, 9, 7, 8, 2, (SceneItem *) NULL);
|
|
}
|
|
|
|
_scrolls.postInit();
|
|
_scrolls.setVisage(1972);
|
|
_scrolls.setStrip(1);
|
|
_scrolls.setPosition(Common::Point(76, 94));
|
|
_scrolls.fixPriority(25);
|
|
_scrolls.setDetails(1950, 30, -1, -1, 2, (SceneItem *) NULL);
|
|
if (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 2)
|
|
_scrolls.setFrame(2);
|
|
else
|
|
_scrolls.setFrame(1);
|
|
|
|
_removeFlag = true;
|
|
} else if (_removeFlag) {
|
|
_cube.remove();
|
|
_containmentField.remove();
|
|
_gem.remove();
|
|
_pulsingLights.remove();
|
|
_scrolls.remove();
|
|
|
|
R2_GLOBALS._sceneItems.remove(&_background);
|
|
_background.setDetails(Rect(0, 0, 320, 200), 1950, 0, 1, 2, 2, NULL);
|
|
|
|
_removeFlag = false;
|
|
}
|
|
|
|
switch (R2_GLOBALS._flubMazeEntryDirection) {
|
|
case 0:
|
|
_sceneMode = 1950;
|
|
if (R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) == 0)
|
|
// The original uses CURSOR_ARROW. CURSOR_WALK is much more coherent
|
|
R2_GLOBALS._player.enableControl(CURSOR_WALK);
|
|
else
|
|
setAction(&_sequenceManager, this, 1950, &R2_GLOBALS._player, NULL);
|
|
|
|
break;
|
|
case 1: {
|
|
_sceneMode = R2_GLOBALS._flubMazeEntryDirection;
|
|
R2_GLOBALS._player.setPosition(Common::Point(160, 213));
|
|
Common::Point pt(160, 160);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
}
|
|
break;
|
|
case 2:
|
|
_sceneMode = R2_GLOBALS._flubMazeEntryDirection;
|
|
if (R2_GLOBALS.getFlag(36))
|
|
setAction(&_sequenceManager, this, 1957, &R2_GLOBALS._player, NULL);
|
|
else
|
|
setAction(&_sequenceManager, this, 1974, &R2_GLOBALS._player, NULL);
|
|
break;
|
|
case 3:
|
|
// Entering from the left
|
|
if (!_vampireActive) {
|
|
_sceneMode = R2_GLOBALS._flubMazeEntryDirection;
|
|
R2_GLOBALS._player.setPosition(Common::Point(-20, 160));
|
|
Common::Point pt(30, 160);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
} else {
|
|
_sceneMode = 18;
|
|
_eastExit._enabled = false;
|
|
_vampireDestPos = Common::Point(60, 152);
|
|
R2_GLOBALS._player.enableControl(CURSOR_USE);
|
|
R2_GLOBALS._player._canWalk = false;
|
|
|
|
_vampire.setStrip(2);
|
|
NpcMover *mover = new NpcMover();
|
|
_vampire.addMover(mover, &_vampireDestPos, this);
|
|
|
|
R2_GLOBALS._player.setPosition(Common::Point(-20, 160));
|
|
Common::Point pt2(30, 160);
|
|
NpcMover *mover2 = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover2, &pt2, NULL);
|
|
}
|
|
break;
|
|
case 4:
|
|
_sceneMode = R2_GLOBALS._flubMazeEntryDirection;
|
|
if (!_upExitStyle) {
|
|
if (R2_GLOBALS.getFlag(36))
|
|
setAction(&_sequenceManager, this, 1955, &R2_GLOBALS._player, NULL);
|
|
else
|
|
setAction(&_sequenceManager, this, 1972, &R2_GLOBALS._player, NULL);
|
|
} else {
|
|
if (R2_GLOBALS.getFlag(36))
|
|
setAction(&_sequenceManager, this, 1954, &R2_GLOBALS._player, NULL);
|
|
else
|
|
setAction(&_sequenceManager, this, 1971, &R2_GLOBALS._player, NULL);
|
|
}
|
|
break;
|
|
case 5: {
|
|
_sceneMode = R2_GLOBALS._flubMazeEntryDirection;
|
|
R2_GLOBALS._player.setPosition(Common::Point(160, 127));
|
|
Common::Point pt(160, 160);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
}
|
|
break;
|
|
case 6:
|
|
// Entering from the right
|
|
if (!_vampireActive) {
|
|
_sceneMode = R2_GLOBALS._flubMazeEntryDirection;
|
|
if (R2_GLOBALS._flubMazeArea == 1) {
|
|
setAction(&_sequenceManager, this, 1961, &R2_GLOBALS._player, NULL);
|
|
} else {
|
|
R2_GLOBALS._player.setPosition(Common::Point(340, 160));
|
|
Common::Point pt(289, 160);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
}
|
|
} else {
|
|
_sceneMode = 17;
|
|
_westExit._enabled = false;
|
|
_vampireDestPos = Common::Point(259, 152);
|
|
|
|
R2_GLOBALS._player.enableControl(CURSOR_USE);
|
|
R2_GLOBALS._player._canWalk = false;
|
|
|
|
_vampire.setStrip(1);
|
|
NpcMover *mover = new NpcMover();
|
|
_vampire.addMover(mover, &_vampireDestPos, this);
|
|
|
|
R2_GLOBALS._player.setPosition(Common::Point(340, 160));
|
|
Common::Point pt2(289, 160);
|
|
NpcMover *mover2 = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover2, &pt2, NULL);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene1950::doButtonPress(int indx) {
|
|
Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
|
|
R2_GLOBALS._player.disableControl();
|
|
|
|
int prevIndex = indx - 1;
|
|
if ((indx / 4) == (prevIndex / 4)) {
|
|
if (prevIndex < 0)
|
|
prevIndex = 3;
|
|
} else {
|
|
prevIndex += 4;
|
|
}
|
|
|
|
assert(prevIndex >= 0 && prevIndex < 16);
|
|
if (!_KeypadWindow._buttons[prevIndex]._toggled) {
|
|
_KeypadWindow._buttons[prevIndex].setFrame(2);
|
|
_KeypadWindow._buttons[prevIndex]._toggled = true;
|
|
} else {
|
|
_KeypadWindow._buttons[prevIndex].setFrame(1);
|
|
_KeypadWindow._buttons[prevIndex]._toggled = false;
|
|
}
|
|
|
|
prevIndex = indx + 1;
|
|
if ((indx / 4) == (prevIndex / 4)) {
|
|
if (prevIndex > 15)
|
|
prevIndex = 12;
|
|
} else {
|
|
prevIndex -= 4;
|
|
}
|
|
|
|
assert(prevIndex >= 0 && prevIndex < 16);
|
|
if (!_KeypadWindow._buttons[prevIndex]._toggled) {
|
|
_KeypadWindow._buttons[prevIndex].setFrame(2);
|
|
_KeypadWindow._buttons[prevIndex]._toggled = true;
|
|
} else {
|
|
_KeypadWindow._buttons[prevIndex].setFrame(1);
|
|
_KeypadWindow._buttons[prevIndex]._toggled = false;
|
|
}
|
|
|
|
prevIndex = indx - 4;
|
|
if (prevIndex < 0)
|
|
prevIndex += 16;
|
|
|
|
assert(prevIndex >= 0 && prevIndex < 16);
|
|
if (!_KeypadWindow._buttons[prevIndex]._toggled) {
|
|
_KeypadWindow._buttons[prevIndex].setFrame(2);
|
|
_KeypadWindow._buttons[prevIndex]._toggled = true;
|
|
} else {
|
|
_KeypadWindow._buttons[prevIndex].setFrame(1);
|
|
_KeypadWindow._buttons[prevIndex]._toggled = false;
|
|
}
|
|
|
|
prevIndex = indx + 4;
|
|
if (prevIndex > 15)
|
|
prevIndex -= 16;
|
|
|
|
assert(prevIndex >= 0 && prevIndex < 16);
|
|
if (!_KeypadWindow._buttons[prevIndex]._toggled) {
|
|
_KeypadWindow._buttons[prevIndex].setFrame(2);
|
|
_KeypadWindow._buttons[prevIndex]._toggled = true;
|
|
} else {
|
|
_KeypadWindow._buttons[prevIndex].setFrame(1);
|
|
_KeypadWindow._buttons[prevIndex]._toggled = false;
|
|
}
|
|
|
|
// Check whether all the buttons are highlighted
|
|
int cpt = 0;
|
|
for (prevIndex = 0; prevIndex < 16; prevIndex++) {
|
|
if (_KeypadWindow._buttons[prevIndex]._toggled)
|
|
++cpt;
|
|
}
|
|
|
|
if (cpt != 16) {
|
|
R2_GLOBALS._player.enableControl();
|
|
R2_GLOBALS._player._canWalk = false;
|
|
} else {
|
|
R2_GLOBALS.setFlag(37);
|
|
_sceneMode = 24;
|
|
setAction(&_sequenceManager, scene, 1976, NULL);
|
|
}
|
|
}
|
|
|
|
void Scene1950::postInit(SceneObjectList *OwnerList) {
|
|
_upExitStyle = false;
|
|
_removeFlag = false;
|
|
_vampireActive = false;
|
|
_vampireIndex = 0;
|
|
if (R2_GLOBALS._sceneManager._previousScene == 300)
|
|
R2_GLOBALS._flubMazeArea = 103;
|
|
|
|
initArea();
|
|
SceneExt::postInit();
|
|
R2_GLOBALS._sound1.play(105);
|
|
|
|
_northExit.setDetails(Rect(130, 46, 189, 135), SHADECURSOR_UP, 1950);
|
|
_northExit.setDest(Common::Point(160, 145));
|
|
|
|
_upExit.setDetails(Rect(208, 0, 255, 73), EXITCURSOR_N, 1950);
|
|
_upExit.setDest(Common::Point(200, 151));
|
|
|
|
_eastExit.setDetails(Rect(305, 95, 320, 147), EXITCURSOR_E, 1950);
|
|
_eastExit.setDest(Common::Point(312, 160));
|
|
|
|
_downExit.setDetails(Rect(208, 99, 255, 143), EXITCURSOR_S, 1950);
|
|
_downExit.setDest(Common::Point(200, 151));
|
|
|
|
_southExit.setDetails(Rect(113, 154, 206, 168), SHADECURSOR_DOWN, 1950);
|
|
_southExit.setDest(Common::Point(160, 165));
|
|
|
|
_westExit.setDetails(Rect(0, 95, 14, 147), EXITCURSOR_W, 1950);
|
|
_westExit.setDest(Common::Point(7, 160));
|
|
|
|
_shaftExit.setDetails(Rect(72, 54, 120, 128), EXITCURSOR_NW, 1950);
|
|
_shaftExit.setDest(Common::Point(120, 140));
|
|
|
|
_doorExit.setDetails(Rect(258, 60, 300, 145), EXITCURSOR_NE, 1950);
|
|
_doorExit.setDest(Common::Point(268, 149));
|
|
|
|
R2_GLOBALS._player.postInit();
|
|
if ( (R2_INVENTORY.getObjectScene(R2_TANNER_MASK) == 0) && (R2_INVENTORY.getObjectScene(R2_PURE_GRAIN_ALCOHOL) == 0)
|
|
&& (R2_INVENTORY.getObjectScene(R2_SOAKED_FACEMASK) == 0) && (!R2_GLOBALS.getFlag(36)) )
|
|
R2_GLOBALS._player.setVisage(22);
|
|
else
|
|
R2_GLOBALS._player.setVisage(20);
|
|
|
|
R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
|
|
_background.setDetails(Rect(0, 0, 320, 200), 1950, 0, 1, 2, 1, NULL);
|
|
|
|
enterArea();
|
|
}
|
|
|
|
void Scene1950::remove() {
|
|
R2_GLOBALS._sound1.stop();
|
|
R2_GLOBALS._sound2.fadeOut2(NULL);
|
|
SceneExt::remove();
|
|
}
|
|
|
|
void Scene1950::signal() {
|
|
switch (_sceneMode) {
|
|
case 11:
|
|
R2_GLOBALS._flubMazeArea += 7;
|
|
initArea();
|
|
enterArea();
|
|
break;
|
|
case 12:
|
|
// Moving up a ladder within the Flub maze
|
|
R2_GLOBALS._flubMazeArea += 35;
|
|
initArea();
|
|
enterArea();
|
|
break;
|
|
case 1975:
|
|
SceneItem::display(1950, 21, SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, 1,
|
|
SET_Y, 20, SET_EXT_BGCOLOR, 7, LIST_END);
|
|
// No break on purpose
|
|
case 13:
|
|
// Moving east within the Flub maze
|
|
++R2_GLOBALS._flubMazeArea;
|
|
initArea();
|
|
enterArea();
|
|
break;
|
|
case 14:
|
|
// Moving down a ladder within the Flub maze
|
|
R2_GLOBALS._flubMazeArea -= 35;
|
|
initArea();
|
|
enterArea();
|
|
break;
|
|
case 15:
|
|
R2_GLOBALS._flubMazeArea -= 7;
|
|
initArea();
|
|
enterArea();
|
|
break;
|
|
case 16:
|
|
// Moving west within the Flub maze
|
|
// No break on purpose
|
|
case 1961:
|
|
--R2_GLOBALS._flubMazeArea;
|
|
initArea();
|
|
enterArea();
|
|
break;
|
|
case 17: {
|
|
_sceneMode = 13;
|
|
R2_GLOBALS._flubMazeEntryDirection = 3;
|
|
_vampireActive = false;
|
|
R2_GLOBALS._player.disableControl(CURSOR_WALK);
|
|
R2_GLOBALS._player._canWalk = true;
|
|
R2_GLOBALS._player.setVisage(22);
|
|
R2_GLOBALS._player.animate(ANIM_MODE_9);
|
|
Common::Point pt(340, 160);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
Common::Point pt2(289, 160);
|
|
NpcMover *mover2 = new NpcMover();
|
|
_vampire.addMover(mover2, &pt2, NULL);
|
|
}
|
|
break;
|
|
case 18: {
|
|
_sceneMode = 16;
|
|
R2_GLOBALS._flubMazeEntryDirection = 6;
|
|
_vampireActive = false;
|
|
R2_GLOBALS._player.disableControl(CURSOR_WALK);
|
|
R2_GLOBALS._player._canWalk = true;
|
|
R2_GLOBALS._player.setVisage(22);
|
|
R2_GLOBALS._player.animate(ANIM_MODE_9);
|
|
Common::Point pt(-20, 160);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
Common::Point pt2(30, 160);
|
|
NpcMover *mover2 = new NpcMover();
|
|
_vampire.addMover(mover2, &pt2, NULL);
|
|
}
|
|
break;
|
|
case 24:
|
|
_KeypadWindow.remove();
|
|
_sceneMode = 1966;
|
|
_cube.setFrame(3);
|
|
setAction(&_sequenceManager, this, 1966, &_containmentField, &_gem, NULL);
|
|
break;
|
|
case 1951:
|
|
R2_GLOBALS._sound1.fadeOut2(NULL);
|
|
R2_GLOBALS._sceneManager.changeScene(1945);
|
|
break;
|
|
case 1958:
|
|
SceneItem::display(1950, 24, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
|
|
R2_GLOBALS._player.enableControl(CURSOR_WALK);
|
|
_doorExit._enabled = true;
|
|
break;
|
|
case 1959:
|
|
R2_INVENTORY.setObjectScene(R2_SOAKED_FACEMASK, 0);
|
|
R2_GLOBALS._player.enableControl(CURSOR_WALK);
|
|
_doorExit._enabled = true;
|
|
break;
|
|
case 1962:
|
|
// No break on purpose
|
|
case 1963:
|
|
R2_GLOBALS._player.enableControl();
|
|
_KeypadWindow.setup2(1971, 1, 1, 160, 135);
|
|
break;
|
|
case 1964:
|
|
// No break on purpose
|
|
case 1965:
|
|
if (!R2_GLOBALS.getFlag(37))
|
|
SceneItem::display(1950, 26, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
|
|
|
|
R2_GLOBALS._player.enableControl();
|
|
break;
|
|
case 1966:
|
|
_containmentField.remove();
|
|
if (R2_GLOBALS.getFlag(36)) {
|
|
_sceneMode = 1964;
|
|
setAction(&_sequenceManager, this, 1964, &R2_GLOBALS._player, NULL);
|
|
} else {
|
|
_sceneMode = 1965;
|
|
setAction(&_sequenceManager, this, 1965, &R2_GLOBALS._player, NULL);
|
|
}
|
|
_gem.setDetails(1950, 9, -1, -1, 2, (SceneItem *) NULL);
|
|
break;
|
|
case 1967: {
|
|
_sceneMode = 0;
|
|
R2_INVENTORY.setObjectScene(R2_SAPPHIRE_BLUE, 2);
|
|
_gem.remove();
|
|
if (R2_GLOBALS.getFlag(36))
|
|
R2_GLOBALS._player.setVisage(20);
|
|
else
|
|
R2_GLOBALS._player.setVisage(22);
|
|
|
|
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
|
|
// This is a hack to work around a pathfinding issue. original destination is (218, 165)
|
|
Common::Point pt(128, 165);
|
|
NpcMover *mover = new NpcMover();
|
|
R2_GLOBALS._player.addMover(mover, &pt, this);
|
|
}
|
|
break;
|
|
case 1968:
|
|
R2_GLOBALS._player.enableControl();
|
|
R2_INVENTORY.setObjectScene(R2_ANCIENT_SCROLLS, 2);
|
|
_scrolls.setFrame(2);
|
|
if (R2_GLOBALS.getFlag(36))
|
|
R2_GLOBALS._player.setVisage(20);
|
|
else
|
|
R2_GLOBALS._player.setVisage(22);
|
|
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
|
|
break;
|
|
default:
|
|
R2_GLOBALS._player.enableControl(CURSOR_WALK);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene1950::process(Event &event) {
|
|
if ( (event.eventType == EVENT_BUTTON_DOWN)
|
|
&& (R2_GLOBALS._player._uiEnabled)
|
|
&& (R2_GLOBALS._events.getCursor() == R2_SOAKED_FACEMASK)
|
|
&& (R2_GLOBALS._player._bounds.contains(event.mousePos))
|
|
&& (R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) == 0)) {
|
|
event.handled = true;
|
|
R2_GLOBALS._player.disableControl();
|
|
_shaftExit._enabled = false;
|
|
_doorExit._enabled = false;
|
|
_sceneMode = 1959;
|
|
setAction(&_sequenceManager, this, 1959, &R2_GLOBALS._player, NULL);
|
|
}
|
|
|
|
Scene::process(event);
|
|
}
|
|
|
|
} // End of namespace Ringworld2
|
|
} // End of namespace TsAGE
|