Files
scummvm-cursorfix/engines/mads/nebular/nebular_scenes8.cpp
2026-02-02 04:50:13 +01:00

1627 lines
58 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "common/scummsys.h"
#include "mads/mads.h"
#include "mads/scene.h"
#include "mads/nebular/nebular_scenes.h"
#include "mads/nebular/nebular_scenes8.h"
namespace MADS {
namespace Nebular {
void Scene8xx::setPlayerSpritesPrefix() {
_vm->_sound->command(5);
if ((_globals[kFromCockpit] && !_globals[kExitShip]) ||
_scene->_nextSceneId == 804 || _scene->_nextSceneId == 805 ||
_scene->_nextSceneId == 808 || _scene->_nextSceneId == 810) {
_game._player._spritesPrefix = "";
} else
_game._player._spritesPrefix = _globals[kSexOfRex] == SEX_FEMALE ? "ROX" : "RXM";
_vm->_palette->setEntry(16, 0x0A, 0x3F, 0x3F);
_vm->_palette->setEntry(17, 0x0A, 0x2D, 0x2D);
}
void Scene8xx::setAAName() {
_game._aaName = Resources::formatAAName(5);
}
void Scene8xx::sceneEntrySound() {
if (!_vm->_musicFlag)
_vm->_sound->command(2);
else {
switch (_scene->_nextSceneId) {
case 801:
case 802:
case 803:
case 804:
case 806:
case 807:
case 808:
_vm->_sound->command(20);
break;
case 805:
_vm->_sound->command(23);
break;
case 810:
_vm->_sound->command(10);
break;
default:
break;
}
}
}
/*------------------------------------------------------------------------*/
Scene801::Scene801(MADSEngine *vm) : Scene8xx(vm) {
_walkThroughDoor = false;
}
void Scene801::synchronize(Common::Serializer &s) {
Scene8xx::synchronize(s);
s.syncAsByte(_walkThroughDoor);
}
void Scene801::setup() {
setPlayerSpritesPrefix();
setAAName();
}
void Scene801::enter() {
_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0));
_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 2));
_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 3));
_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('a', -1));
if (_scene->_priorSceneId != 802) {
_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 5);
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 13);
}
if ((_globals[kCameFromCut]) && (_globals[kCutX] != 0)) {
_game._player._playerPos = Common::Point(_globals[kCutX], _globals[kCutY]);
_game._player._facing = (Facing)_globals[kCutFacing];
_globals[kCutX] = 0;
_globals[kCameFromCut] = false;
_globals[kReturnFromCut] = false;
_globals[kBeamIsUp] = false;
_globals[kForceBeamDown] = false;
_globals[kDontRepeat] = false;
} else if (_scene->_priorSceneId == 808) {
_game._player._playerPos = Common::Point(148, 110);
_game._player._facing = FACING_NORTH;
} else if (_scene->_priorSceneId == 802) {
_game._player._playerPos = Common::Point(307, 111);
_game._player.walk(Common::Point(270, 118), FACING_WEST);
_game._player._visible = true;
} else if ((_scene->_priorSceneId != RETURNING_FROM_DIALOG) && !_globals[kTeleporterCommand]) {
_game._player._playerPos = Common::Point(8, 117);
_game._player.walk(Common::Point(41, 115), FACING_EAST);
_game._player._visible = true;
}
_globals[kBetweenRooms] = false;
if (_globals[kTeleporterCommand]) {
_game._player._stepEnabled = false;
switch (_globals[kTeleporterCommand]) {
case 1:
_game._player._playerPos = Common::Point(8, 117);
_globals[kTeleporterUnderstood] = true;
_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 13);
_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 75);
_vm->_sound->command(30);
break;
case 2:
_game._player._playerPos = Common::Point(8, 117);
_globals[kTeleporterUnderstood] = true;
_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 8, 1, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 13);
_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 80);
_vm->_sound->command(30);
break;
case 3:
case 4:
_game._player._playerPos = Common::Point(8, 117);
_game._player.walk(Common::Point(41, 115), FACING_EAST);
_game._player._visible = true;
_game._player._stepEnabled = true;
break;
default:
break;
}
_globals[kTeleporterCommand] = 0;
}
_walkThroughDoor = false;
if (_scene->_priorSceneId == 802) {
_game._player._stepEnabled = false;
_walkThroughDoor = true;
}
_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 11, 0, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 9, 0, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -2);
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
sceneEntrySound();
}
void Scene801::step() {
if (_game._trigger == 75) {
if (_globals[kSexOfRex] == REX_FEMALE) {
_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 8, 1, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 8);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 140);
} else {
_game._player._stepEnabled = true;
_game._player._visible = true;
_game._player._playerPos = Common::Point(8, 117);
_game._player.walk(Common::Point(41, 115), FACING_EAST);
}
}
if (_game._trigger == 140) {
_vm->_sound->command(27);
_globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 8);
_scene->_sequences.addTimer(100, 141);
}
if (_game._trigger == 141) {
_scene->_reloadSceneFlag = true;
_scene->_nextSceneId = _scene->_priorSceneId;
_globals[kTeleporterCommand] = 0;
}
if (_game._trigger == 80) {
_globals[kTeleporterCommand] = 1;
_scene->_nextSceneId = _globals[kTeleporterDestination];
_scene->_reloadSceneFlag = true;
}
if (_walkThroughDoor && (_game._player._playerPos == Common::Point(270, 118))) {
_game._player._stepEnabled = false;
_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 4, 1, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 5);
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
_walkThroughDoor = false;
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 120);
}
if (_game._trigger == 120) {
_vm->_sound->command(12);
_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 5);
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
_game._player._stepEnabled = true;
}
if (_game._trigger == 90) {
_game._player.walk(Common::Point(307, 111), FACING_EAST);
_scene->_sequences.addTimer(80, 130);
}
if (_game._trigger == 130) {
_vm->_sound->command(12);
_scene->_sequences.remove(_globals._sequenceIndexes[2]);
_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 4, 1, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 5);
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 110);
}
if (_game._trigger == 110) {
_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 5);
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10);
_scene->_nextSceneId = 802;
}
}
void Scene801::preActions() {
if (_action.isAction(VERB_LOOK, NOUN_CONTROL_PANEL)) {
_game._player.walk(Common::Point(148, 110), FACING_NORTH);
_game._player._needToWalk = true;
_game._player._readyToWalk = true;
}
if (_action.isAction(VERB_WALK_INSIDE, NOUN_TELEPORTER) && _globals[kBeamIsUp]) {
_globals[kCutX] = _game._player._playerPos.x;
_globals[kCutY] = _game._player._playerPos.y;
_globals[kCutFacing] = _game._player._facing;
_globals[kForceBeamDown] = true;
_globals[kDontRepeat] = true;
_scene->_nextSceneId = 803;
}
}
void Scene801::actions() {
if (_action.isAction(VERB_LOOK, NOUN_CONTROL_PANEL))
_scene->_nextSceneId = 808;
else if (_action.isAction(VERB_WALK_INSIDE, NOUN_TELEPORTER)) {
_game._player._stepEnabled = false;
_game._player._visible = false;
_scene->_nextSceneId = 807;
} else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) && (_game._player._playerPos == Common::Point(270, 118))) {
_game._player._stepEnabled = false;
_game._player._facing = FACING_EAST;
_game._player.selectSeries();
_globals[kBetweenRooms] = true;
_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
_scene->_sequences.remove(_globals._sequenceIndexes[2]);
_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 4, 1, 0, 0);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 90);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 5);
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 13);
_vm->_sound->command(11);
} else if (_action.isAction(VERB_LOOK, NOUN_CEILING))
_vm->_dialogs->show(80110);
else if (_action.isAction(VERB_LOOK, NOUN_MONITOR))
_vm->_dialogs->show(80111);
else if (_action.isAction(VERB_LOOK, NOUN_TELEPORTER))
_vm->_dialogs->show(80112);
else if (_action.isAction(VERB_LOOK, NOUN_EQUIPMENT) || _action._lookFlag)
_vm->_dialogs->show(80113);
else if (_action.isAction(VERB_LOOK, NOUN_SPEAKER))
_vm->_dialogs->show(80114);
else if (_action.isAction(VERB_LOOK, NOUN_EYE_CHART))
_vm->_dialogs->show(80115);
else if (_action.isAction(VERB_LOOK, NOUN_WALL))
_vm->_dialogs->show(80116);
else if (_action.isAction(VERB_LOOK, NOUN_DOOR))
_vm->_dialogs->show(80117);
else
return;
_action._inProgress = false;
}
/*------------------------------------------------------------------------*/
void Scene802::setup() {
setPlayerSpritesPrefix();
setAAName();
_scene->addActiveVocab(NOUN_SHIELD_MODULATOR);
_scene->addActiveVocab(VERB_WALKTO);
_scene->addActiveVocab(NOUN_REMOTE);
}
void Scene802::enter() {
_globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXMRC_8");
_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 2));
_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 0));
_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 1));
_globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RXMBD_8");
_globals[kBetweenRooms] = false;
if ((_globals[kCameFromCut]) && (_globals[kCutX] != 0)) {
_game._player._playerPos.x = _globals[kCutX];
_game._player._playerPos.y = _globals[kCutY];
_game._player._facing = (Facing)_globals[kCutFacing];
_globals[kCutX] = 0;
_globals[kCameFromCut] = false;
_globals[kReturnFromCut] = false;
_globals[kBeamIsUp] = false;
_globals[kForceBeamDown] = false;
_globals[kDontRepeat] = false;
_globals[kAntigravClock] = _scene->_frameStartTime;
} else if (_scene->_priorSceneId == 801) {
_game._player._playerPos = Common::Point(15, 129);
_game._player._facing = FACING_EAST;
} else if (_scene->_priorSceneId == 803) {
_game._player._playerPos = Common::Point(303, 119);
_game._player._facing = FACING_WEST;
} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
_game._player._playerPos = Common::Point(15, 129);
_game._player._facing = FACING_EAST;
}
_game._player._visible = true;
if (_globals[kHasWatchedAntigrav] && !_globals[kRemoteSequenceRan]) {
_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
_scene->_sequences.addTimer(200, 70);
}
if ((_globals[kRemoteOnGround]) && (!_game._objects.isInInventory(OBJ_REMOTE))) {
_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 8);
int idx = _scene->_dynamicHotspots.add(NOUN_REMOTE, VERB_WALKTO,_globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
_scene->_dynamicHotspots.setPosition(idx, Common::Point(107, 99), FACING_NORTH);
}
if (!_game._objects.isInInventory(OBJ_SHIELD_MODULATOR) && !_globals[kShieldModInstalled]) {
_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 8);
int idx = _scene->_dynamicHotspots.add(NOUN_SHIELD_MODULATOR, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
_scene->_dynamicHotspots.setPosition(idx, Common::Point(93, 97), FACING_NORTH);
}
sceneEntrySound();
}
void Scene802::step() {
if (_game._trigger == 70) {
_game._player._stepEnabled = false;
_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 19);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 4, 72);
}
if (_game._trigger == 71) {
_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 8);
int idx = _scene->_dynamicHotspots.add(NOUN_REMOTE, VERB_WALKTO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
_scene->_dynamicHotspots.setPosition(idx, Common::Point(107, 99), FACING_NORTH);
_globals[kRemoteSequenceRan] = true;
_globals[kRemoteOnGround] = true;
_game._player._stepEnabled = true;
}
if (_game._trigger == 72)
_vm->_sound->command(13);
}
void Scene802::preActions() {
if (_action.isAction(VERB_WALK_TOWARDS, NOUN_BUILDING_TO_WEST))
_game._player._walkOffScreenSceneId = 801;
if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_EAST)) {
_game._player._walkOffScreenSceneId = 803;
_globals[kForceBeamDown] = false;
}
if (_action.isAction(VERB_TAKE, NOUN_SHIP))
_game._player._needToWalk = false;
}
void Scene802::actions() {
if (_action.isAction(VERB_TAKE, NOUN_SHIELD_MODULATOR) && !_game._objects.isInInventory(OBJ_SHIELD_MODULATOR)) {
switch (_game._trigger) {
case 0:
_game._player._stepEnabled = false;
_game._player._visible = false;
_globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], true, 7, 2, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 2);
_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 2, 1);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
break;
case 1:
_scene->_sequences.remove(_globals._sequenceIndexes[1]);
_vm->_sound->command(9);
break;
case 2:
_game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
_game._player._visible = true;
_scene->_sequences.addTimer(20, 3);
break;
case 3:
_game._player._stepEnabled = true;
_game._objects.addToInventory(OBJ_SHIELD_MODULATOR);
_vm->_dialogs->showItem(OBJ_SHIELD_MODULATOR, 80215);
break;
default:
break;
}
} else if ((_action.isAction(VERB_TAKE, NOUN_REMOTE)) && (!_game._objects.isInInventory(OBJ_REMOTE))) {
switch (_game._trigger) {
case 0:
_game._player._stepEnabled = false;
_game._player._visible = false;
_globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 7, 2, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 4);
_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 4, 1);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
break;
case 1:
_scene->_sequences.remove(_globals._sequenceIndexes[4]);
_vm->_sound->command(9);
_globals[kRemoteOnGround] = false;
break;
case 2:
_game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
_game._player._visible = true;
_scene->_sequences.addTimer(20, 3);
break;
case 3:
_game._player._stepEnabled = true;
_game._objects.addToInventory(OBJ_REMOTE);
_vm->_dialogs->showItem(OBJ_REMOTE, 80223);
break;
default:
break;
}
} else if (!_globals[kRemoteOnGround] && (_game._objects.isInInventory(OBJ_SHIELD_MODULATOR) || _globals[kShieldModInstalled])
&& (_action.isAction(VERB_LOOK, NOUN_LAUNCH_PAD) || _action._lookFlag))
_vm->_dialogs->show(80210);
else if (!_globals[kRemoteOnGround]&& !_game._objects.isInInventory(OBJ_SHIELD_MODULATOR) && !_globals[kShieldModInstalled]
&& (_action.isAction(VERB_LOOK, NOUN_LAUNCH_PAD) || _action._lookFlag))
_vm->_dialogs->show(80211);
else if (_globals[kRemoteOnGround] && !_game._objects.isInInventory(OBJ_SHIELD_MODULATOR) && !_globals[kShieldModInstalled]
&& (_action.isAction(VERB_LOOK, NOUN_LAUNCH_PAD) || _action._lookFlag))
_vm->_dialogs->show(80213);
else if (_globals[kRemoteOnGround] && (_game._objects.isInInventory(OBJ_SHIELD_MODULATOR) || _globals[kShieldModInstalled])
&& (_action.isAction(VERB_LOOK, NOUN_LAUNCH_PAD) || _action._lookFlag))
_vm->_dialogs->show(80212);
else if (!_game._objects.isInInventory(OBJ_SHIELD_MODULATOR) && !_globals[kShieldModInstalled] && _action.isAction(VERB_LOOK, NOUN_SHIELD_MODULATOR))
_vm->_dialogs->show(80214);
else if (_globals[kRemoteOnGround] && _action.isAction(VERB_LOOK, NOUN_REMOTE))
_vm->_dialogs->show(80216);
else if (_action.isAction(VERB_LOOK, NOUN_SHIP)) {
if ((!_game._objects.isInInventory(OBJ_SHIELD_MODULATOR)) && (!_globals[kShieldModInstalled]))
_vm->_dialogs->show(80218);
else
_vm->_dialogs->show(80217);
} else if (_action.isAction(VERB_LOOK, NOUN_BUSHES))
_vm->_dialogs->show(80219);
else if (_action.isAction(VERB_LOOK, NOUN_PATH_TO_EAST))
_vm->_dialogs->show(80220);
else if (_action.isAction(VERB_LOOK, NOUN_SKY))
_vm->_dialogs->show(80221);
else if (_action.isAction(VERB_TAKE, NOUN_SHIP))
_vm->_dialogs->show(80222);
else if (_action.isAction(VERB_LOOK, NOUN_TREE) || _action.isAction(VERB_LOOK, NOUN_TREES))
_vm->_dialogs->show(80224);
else if (_action.isAction(VERB_LOOK, NOUN_BUILDING_TO_WEST))
_vm->_dialogs->show(80225);
else
return;
_action._inProgress = false;
}
/*------------------------------------------------------------------------*/
void Scene803::setup() {
setPlayerSpritesPrefix();
setAAName();
_scene->addActiveVocab(NOUN_GUTS);
_scene->addActiveVocab(VERB_WALKTO);
if ((!_globals[kFromCockpit] && _globals[kReturnFromCut] && !_globals[kBeamIsUp])
|| (_globals[kFromCockpit] && !_globals[kExitShip])) {
_game._player._spritesPrefix = "";
_game._player._spritesChanged = true;
}
}
void Scene803::enter() {
_globals[kBetweenRooms] = false;
_game._player._visible = false;
_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 1));
_globals._spriteIndexes[9] = _scene->_sprites.addSprites("*RXMBD_2");
_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('d', 1));
_game.loadQuoteSet(0x31B, 0x31C, 0x31D, 0x31E, 0x31F, 0x320, 0x321, 0x322, 0);
if (_globals[kHoppyDead]) {
_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('e', 1));
_globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, 1);
int idx = _scene->_dynamicHotspots.add(NOUN_GUTS, VERB_WALKTO, _globals._sequenceIndexes[7], Common::Rect(0, 0, 0, 0));
_scene->_dynamicHotspots.setPosition(idx, Common::Point(66, 123), FACING_SOUTH);
}
if (!_globals[kBeamIsUp] && !_globals[kReturnFromCut] && (!_globals[kFromCockpit] || _globals[kExitShip])) {
_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 2, 2);
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
}
if (!_globals[kFromCockpit]) {
if (!_globals[kReturnFromCut]) {
if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
_game._player._playerPos = Common::Point(15, 130);
_game._player._facing = FACING_EAST;
}
_game._player._visible = true;
} else if (!_globals[kBeamIsUp]){
_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 1));
_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 3));
_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('a', 2));
_game._player._visible = false;
_game._player._stepEnabled = false;
_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15);
_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 80);
_vm->_sound->command(14);
}
if (_globals[kBeamIsUp] && !_globals[kReturnFromCut]){
if (_globals[kForceBeamDown])
_game._player._visible = false;
else
_game._player._visible = true;
_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('b', 1));
_vm->_sound->command(15);
_game._player._stepEnabled = false;
_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 12, 1, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 6);
_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 100);
}
} else if (!_globals[kExitShip]) {
if (!_globals[kBeamIsUp]) {
_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 1));
_game._player._visible = false;
_game._player._stepEnabled = false;
_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0);
_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 130);
_vm->_sound->command(14);
} else {
_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('c', 1));
_game._player._visible = false;
_game._player._stepEnabled = false;
_globals._sequenceIndexes[8] = _scene->_sequences.startCycle(_globals._spriteIndexes[8], false, 1);
_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0);
_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 1);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 140);
}
} else {
_game._player._stepEnabled = false;
_game._player._playerPos = Common::Point(197, 96);
_game._player._facing = FACING_SOUTHWEST;
_game._player._visible = true;
_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('d', 1));
_globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 19);
_scene->_sequences.addTimer(1, 150);
}
sceneEntrySound();
}
void Scene803::step() {
if (_game._trigger == 120) {
_globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 19);
_scene->_nextSceneId = 804;
}
if (_game._trigger == 100) {
_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 2, 2);
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
if (!_globals[kHoppyDead]) {
_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 7, 1, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 7, 12);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5],SEQUENCE_TRIGGER_EXPIRE, 0, 101);
} else {
_globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, -2);
int idx = _scene->_dynamicHotspots.add(NOUN_GUTS, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
_scene->_dynamicHotspots.setPosition(idx, Common::Point(66, 123), FACING_SOUTH);
_vm->_sound->command(16);
_globals[kCameFromCut] = true;
_globals[kBeamIsUp] = false;
_globals[kReturnFromCut] = false;
_globals[kDontRepeat] = false;
_globals[kHoppyDead] = true;
_globals[kHasWatchedAntigrav] = true;
if (_globals[kForceBeamDown])
_scene->_nextSceneId = _scene->_priorSceneId;
else
_game._player._stepEnabled = true;
}
}
if (_game._trigger == 101) {
_globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, -2);
int idx = _scene->_dynamicHotspots.add(NOUN_GUTS, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
_scene->_dynamicHotspots.setPosition(idx, Common::Point(66, 123), FACING_SOUTH);
_vm->_sound->command(16);
_globals[kCameFromCut] = true;
_globals[kBeamIsUp] = false;
_globals[kReturnFromCut] = false;
_globals[kDontRepeat] = false;
_globals[kHoppyDead] = true;
_globals[kHasWatchedAntigrav] = true;
if (_globals[kForceBeamDown])
_scene->_nextSceneId = _scene->_priorSceneId;
else
_game._player._stepEnabled = true;
}
if (_game._trigger == 80) {
if (!_globals[kHoppyDead])
_scene->_sequences.addTimer(350, 70);
_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 12, 1, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 3);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 90);
}
if (_game._trigger == 70) {
_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
_vm->_sound->command(31);
}
if (_game._trigger == 71)
_scene->_sequences.addTimer(200, 110);
if (_game._trigger == 90) {
int syncIdx = _globals._sequenceIndexes[4];
_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 15, 0, 0, 0);
_scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 4, 9);
if (_globals[kHoppyDead])
_scene->_sequences.addTimer(200, 110);
}
if (_game._trigger == 110)
_scene->_nextSceneId = 808;
if (_game._trigger == 130) {
_globals[kBeamIsUp] = true;
_scene->_nextSceneId = 804;
}
if (_game._trigger == 140) {
if (!_globals[kWindowFixed]) {
_scene->_nextSceneId = 810;
_globals[kInSpace] = true;
} else {
if (!_globals[kShieldModInstalled])
_game._winStatus = 1;
else if (!_globals[kTargetModInstalled])
_game._winStatus = 2;
else
_game._winStatus = 3;
return;
}
}
if (_game._trigger == 150) {
_scene->_sequences.remove(_globals._sequenceIndexes[6]);
_vm->_sound->command(18);
_globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 8, 1, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 19);
_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 4);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 151);
}
if (_game._trigger == 151) {
_globals[kBeamIsUp] = false;
_globals[kFromCockpit] = false;
_globals[kExitShip] = false;
_game._player._stepEnabled = true;
}
}
void Scene803::preActions() {
if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_WEST))
_game._player._walkOffScreenSceneId = 802;
if (_action.isAction(VERB_TAKE, NOUN_SHIP))
_game._player._needToWalk = false;
}
void Scene803::actions() {
if (_action.isAction(VERB_TAKE, NOUN_GUTS)) {
switch (_game._trigger) {
case 0:
_game._player._stepEnabled = false;
_game._player._visible = false;
_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], true, 6, 1, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 1, 4);
_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[9]);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 160);
break;
case 160: {
int syncIdx = _globals._sequenceIndexes[9];
_globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 4);
_scene->_sequences.updateTimeout(_globals._sequenceIndexes[9], syncIdx);
_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[9]);
_scene->_sequences.addTimer(60, 161);
}
break;
case 161: {
int quoteId = 0x31A + _vm->getRandomNumber(1, 8);
_scene->_kernelMessages.add(Common::Point(64, 67), 0x1110, 32, 0, 80, _game.getQuote(quoteId));
_scene->_sequences.addTimer(60, 162);
}
break;
case 162:
_scene->_sequences.remove(_globals._sequenceIndexes[9]);
_globals._sequenceIndexes[9] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[9], true, 6, 1, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 1, 4);
_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[9]);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 163);
break;
case 163:
_game._player._priorTimer = _scene->_frameStartTime + _game._player._ticksAmount;
_game._player._visible = true;
_game._player._stepEnabled = true;
break;
default:
break;
}
} else if (_action.isAction(VERB_ENTER, NOUN_SHIP)) {
_vm->_sound->command(17);
_game._player._stepEnabled = false;
_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 8, 1, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 19);
_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 4);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 120);
_globals[kBeamIsUp] = false;
} else if (_action.isAction(VERB_LOOK, NOUN_LAUNCH_PAD))
_vm->_dialogs->show(80310);
else if (_action._lookFlag)
_vm->_dialogs->show(80310);
else if (_action.isAction(VERB_LOOK, NOUN_PAD_TO_WEST))
_vm->_dialogs->show(80311);
else if (_action.isAction(VERB_LOOK, NOUN_GUTS)) {
if (_game._storyMode == STORYMODE_NICE)
_vm->_dialogs->show(80312);
else
_vm->_dialogs->show(80313);
} else if (_action.isAction(VERB_LOOK, NOUN_BUSHES))
_vm->_dialogs->show(80315);
else if (_action.isAction(VERB_LOOK, NOUN_SHIP))
_vm->_dialogs->show(80317);
else if (_action.isAction(VERB_LOOK, NOUN_TOWER))
_vm->_dialogs->show(80318);
else if (_action.isAction(VERB_LOOK, NOUN_TREE) || _action.isAction(VERB_LOOK, NOUN_TREES))
_vm->_dialogs->show(80319);
else if (_action.isAction(VERB_LOOK, NOUN_SKY))
_vm->_dialogs->show(80320);
else if (_action.isAction(VERB_TAKE, NOUN_SHIP))
_vm->_dialogs->show(80321);
else
return;
_action._inProgress = false;
}
/*------------------------------------------------------------------------*/
Scene804::Scene804(MADSEngine *vm) : Scene8xx(vm) {
_messWithThrottle = false;
_movingThrottle = false;
_throttleGone = false;
_dontPullThrottleAgain = false;
_pullThrottleReally = false;
_alreadyOrgan = false;
_alreadyPop = false;
_throttleCounter = 0;
_resetFrame = -1;
}
void Scene804::synchronize(Common::Serializer &s) {
Scene8xx::synchronize(s);
s.syncAsByte(_messWithThrottle);
s.syncAsByte(_movingThrottle);
s.syncAsByte(_throttleGone);
s.syncAsByte(_dontPullThrottleAgain);
s.syncAsByte(_pullThrottleReally);
s.syncAsByte(_alreadyOrgan);
s.syncAsByte(_alreadyPop);
s.syncAsSint16LE(_resetFrame);
s.syncAsUint32LE(_throttleCounter);
}
void Scene804::setup() {
Scene8xx::setPlayerSpritesPrefix();
Scene8xx::setAAName();
}
void Scene804::enter() {
_messWithThrottle = false;
_throttleCounter = 0;
_movingThrottle = false;
_throttleGone = false;
_dontPullThrottleAgain = false;
_resetFrame = -1;
_pullThrottleReally = false;
_alreadyOrgan = false;
_alreadyPop = false;
if (_globals[kCopyProtectFailed]) {
// Copy protection failed
_globals[kInSpace] = true;
_globals[kWindowFixed] = 0;
}
_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 0));
_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 1));
_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 2));
_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 3));
_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('x', 4));
_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('f', 1));
_game.loadQuoteSet(791, 0);
if (_globals[kInSpace]) {
if (_globals[kWindowFixed]) {
_globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], 0, 1);
_scene->_sequences.addTimer(60, 100);
} else {
_globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 1);
_globals._sequenceIndexes[7] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[7], false, 4, 0, 0, 0);
_scene->_sequences.addTimer(160, 70);
_game._player._stepEnabled = false;
}
} else {
if (_globals[kBeamIsUp]) {
_globals._sequenceIndexes[8] = _scene->_sequences.startCycle(_globals._spriteIndexes[8], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[8], 7);
}
if (_globals[kWindowFixed])
_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(133, 139));
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 8);
}
_scene->loadAnimation(Resources::formatName(804, 'r', 1, EXT_AA, ""));
Scene8xx::sceneEntrySound();
if (_globals[kInSpace] && !_globals[kWindowFixed]) {
_scene->_userInterface.setup(kInputLimitedSentences);
_vm->_sound->command(19);
}
}
void Scene804::step() {
if (!_messWithThrottle) {
if ((_throttleGone) && (_movingThrottle) && (_scene->_animation[0]->getCurrentFrame() == 39)) {
_globals._sequenceIndexes[1] = _scene->_sequences.startCycle
(_globals._spriteIndexes[1], false, 1);
_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(133, 139));
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 8);
_throttleGone = false;
}
if ((_movingThrottle) && (_scene->_animation[0]->getCurrentFrame() == 42)) {
_resetFrame = 0;
_movingThrottle = false;
}
if (_game._trigger == 70) {
_resetFrame = 42;
}
if (_scene->_animation[0]->getCurrentFrame() == 65)
_scene->_sequences.remove(_globals._sequenceIndexes[7]);
switch (_game._storyMode) {
case STORYMODE_NAUGHTY:
default:
if (_scene->_animation[0]->getCurrentFrame() == 81) {
_resetFrame = 80;
_globals[kInSpace] = false;
_globals[kBeamIsUp] = true;
//assert(!_globals[kCopyProtectFailed]);
_game._winStatus = 4;
return;
}
break;
case STORYMODE_NICE:
if (_scene->_animation[0]->getCurrentFrame() == 68) {
_resetFrame = 66;
_globals[kInSpace] = false;
_globals[kBeamIsUp] = true;
assert(!_globals[kCopyProtectFailed]);
_game._winStatus = 4;
return;
}
}
if (_scene->_animation[0]->getCurrentFrame() == 34) {
_resetFrame = 36;
_scene->_sequences.remove(_globals._sequenceIndexes[1]);
}
if (_scene->_animation[0]->getCurrentFrame() == 37) {
_resetFrame = 36;
if (!_dontPullThrottleAgain) {
_dontPullThrottleAgain = true;
_scene->_sequences.addTimer(60, 80);
}
}
if (_game._trigger == 80) {
_scene->_nextSceneId = 803;
}
if ((_scene->_animation[0]->getCurrentFrame() == 7) && (!_globals[kWindowFixed])) {
_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
_scene->_sequences.addTimer(20, 110);
_globals[kWindowFixed] = true;
}
if (_scene->_animation[0]->getCurrentFrame() == 10) {
_resetFrame = 0;
_game._player._stepEnabled = true;
_game._objects.setRoom(OBJ_POLYCEMENT, NOWHERE);
}
// FIXME: Original doesn't have resetFrame check. Check why this has been needed
if (_resetFrame == -1 && _scene->_animation[0]->getCurrentFrame() == 1) {
int randomVal = _vm->getRandomNumber(29) + 1;
switch (randomVal) {
case 1:
_resetFrame = 25;
break;
case 2:
_resetFrame = 27;
break;
case 3:
_resetFrame = 29;
break;
default:
_resetFrame = 0;
break;
}
}
switch (_scene->_animation[0]->getCurrentFrame()) {
case 26:
case 28:
case 31:
_resetFrame = 0;
break;
default:
break;
}
} else {
if ((_scene->_animation[0]->getCurrentFrame() == 36) && (!_throttleGone)) {
_scene->_sequences.remove(_globals._sequenceIndexes[1]);
_throttleGone = true;
}
if (_scene->_animation[0]->getCurrentFrame() == 39) {
_movingThrottle = false;
switch (_throttleCounter) {
case 1:
break;
case 3:
_scene->_sequences.addTimer(130, 120);
break;
default:
break;
}
}
if (!_movingThrottle) {
++_throttleCounter;
_movingThrottle = true;
if (_throttleCounter < 4) {
_resetFrame = 34;
} else {
_messWithThrottle = false;
_throttleCounter = 0;
_game._player._stepEnabled = true;
}
}
}
if (_game._trigger == 120) {
_vm->_dialogs->show(80422);
}
if (_game._trigger == 110) {
_vm->_dialogs->show(80426);
}
if (_pullThrottleReally) {
_resetFrame = 32;
_pullThrottleReally = false;
}
if (_resetFrame >= 0) {
if (_resetFrame != _scene->_animation[0]->getCurrentFrame()) {
_scene->_animation[0]->setCurrentFrame(_resetFrame);
_resetFrame = -1;
}
}
if (_game._trigger == 90) {
_scene->_nextSceneId = 803;
}
if ((_scene->_animation[0]->getCurrentFrame() == 72) && !_alreadyPop) {
_vm->_sound->command(21);
_alreadyPop = true;
}
if ((_scene->_animation[0]->getCurrentFrame() == 80) && !_alreadyOrgan) {
_vm->_sound->command(22);
_alreadyOrgan = true;
}
}
void Scene804::actions() {
if (_action.isAction(VERB_LOOK, NOUN_SERVICE_PANEL) ||
_action.isAction(VERB_OPEN, NOUN_SERVICE_PANEL)) {
_scene->_nextSceneId = 805;
} else if ((_action.isAction(VERB_ACTIVATE, NOUN_REMOTE)) && _globals[kTopButtonPushed]) {
if (!_globals[kInSpace]) {
// Top button pressed on panel in hanger control
if (!_globals[kBeamIsUp]) {
_globals[kFromCockpit] = true;
_globals[kUpBecauseOfRemote] = true;
_scene->_nextSceneId = 803;
} else {
// Player turning off remote
_globals[kBeamIsUp] = false;
_globals[kUpBecauseOfRemote] = false;
_scene->_sequences.remove(_globals._sequenceIndexes[8]);
_vm->_sound->command(15);
}
}
} else if (_action.isAction(VERB_PULL, NOUN_THROTTLE)) {
_game._player._stepEnabled = false;
if (_globals[kBeamIsUp]) {
if (!_game._objects.isInInventory(OBJ_VASE) && _globals[kWindowFixed]) {
_vm->_dialogs->show(80423);
_game._player._stepEnabled = true;
} else {
_action._inProgress = false;
_vm->_dialogs->show(80424);
_pullThrottleReally = true;
_scene->_kernelMessages.add(Common::Point(78, 75), 0x1110, 0, 0,
120, _game.getQuote(791));
}
} else {
_messWithThrottle = true;
}
} else if (_action.isAction(VERB_APPLY, NOUN_POLYCEMENT, NOUN_CRACK) ||
_action.isAction(VERB_PUT, NOUN_POLYCEMENT, NOUN_CRACK)) {
if (!_globals[kWindowFixed]) {
_resetFrame = 2;
_game._player._stepEnabled = false;
}
} else if (_action.isAction(VERB_EXIT, NOUN_SHIP)) {
_globals[kExitShip] = true;
_globals[kFromCockpit] = true;
if (_globals[kBeamIsUp]) {
_vm->_dialogs->show(80425);
_scene->_sequences.remove(_globals._sequenceIndexes[8]);
_vm->_sound->command(15);
_globals[kBeamIsUp] = false;
}
_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
_scene->_sequences.addTimer(2, 90);
} else if (_action._lookFlag) {
_vm->_dialogs->show(80410);
} else if ((_action.isAction(VERB_LOOK, NOUN_WINDOW)) ||
(_action.isAction(VERB_LOOK_OUT, NOUN_WINDOW))) {
if (_globals[kBeamIsUp]) {
_vm->_dialogs->show(80412);
} else {
_vm->_dialogs->show(80411);
}
} else if (_action.isAction(VERB_LOOK, NOUN_CRACK)) {
if (_globals[kWindowFixed]) {
_vm->_dialogs->show(80414);
} else {
_vm->_dialogs->show(80413);
}
} else if (_action.isAction(VERB_LOOK, NOUN_CONTROLS)) {
_vm->_dialogs->show(80415);
} else if (_action.isAction(VERB_LOOK, NOUN_STATUS_PANEL)) {
if (_globals[kBeamIsUp]) {
_vm->_dialogs->show(80417);
} else {
_vm->_dialogs->show(80416);
}
} else if (_action.isAction(VERB_LOOK, NOUN_TP)) {
_vm->_dialogs->show(80418);
} else if (_action.isAction(VERB_TAKE, NOUN_TP)) {
_vm->_dialogs->show(80419);
} else if (_action.isAction(VERB_LOOK, NOUN_INSTRUMENTATION)) {
_vm->_dialogs->show(80420);
} else if (_action.isAction(VERB_LOOK, NOUN_SEAT)) {
_vm->_dialogs->show(80421);
} else
return;
_action._inProgress = false;
}
/*------------------------------------------------------------------------*/
void Scene805::setup() {
setPlayerSpritesPrefix();
setAAName();
_scene->addActiveVocab(VERB_REMOVE);
_scene->addActiveVocab(NOUN_TARGET_MODULE);
_scene->addActiveVocab(NOUN_SHIELD_MODULATOR);
}
void Scene805::enter() {
_game._player._visible = false;
_scene->_userInterface.setup(kInputLimitedSentences);
_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 1));
_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 2));
if (_globals[kShieldModInstalled]) {
_scene->_hotspots.activate(OBJ_SHIELD_MODULATOR, false);
_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 25);
int idx = _scene->_dynamicHotspots.add(NOUN_SHIELD_MODULATOR, VERB_REMOVE, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
_scene->_dynamicHotspots.setPosition(idx, Common::Point(0, 0), FACING_DUMMY);
}
if (_globals[kTargetModInstalled]) {
_scene->_hotspots.activate(OBJ_TARGET_MODULE, false);
_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 12);
int idx = _scene->_dynamicHotspots.add(NOUN_TARGET_MODULE, VERB_REMOVE, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
_scene->_dynamicHotspots.setPosition(idx, Common::Point(0, 0), FACING_DUMMY);
}
sceneEntrySound();
}
void Scene805::step() {
UserInterface &userInterface = _vm->_game->_scene._userInterface;
if (_game._trigger == 70) {
_scene->_hotspots.activate(OBJ_SHIELD_MODULATOR, false);
_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 25);
int idx = _scene->_dynamicHotspots.add(NOUN_SHIELD_MODULATOR, VERB_REMOVE, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
_scene->_dynamicHotspots.setPosition(idx, Common::Point(0, 0), FACING_DUMMY);
_globals[kShieldModInstalled] = true;
_game._objects.setRoom(OBJ_SHIELD_MODULATOR, NOWHERE);
userInterface._selectedInvIndex = -1;
_game._player._stepEnabled = true;
_vm->_sound->command(24);
}
if (_game._trigger == 80) {
_scene->_hotspots.activate(OBJ_TARGET_MODULE, false);
_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 12);
int idx = _scene->_dynamicHotspots.add(NOUN_TARGET_MODULE, VERB_REMOVE, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
_scene->_dynamicHotspots.setPosition(idx, Common::Point(0, 0), FACING_DUMMY);
_globals[kTargetModInstalled] = true;
_game._objects.setRoom(OBJ_TARGET_MODULE, NOWHERE);
userInterface._selectedInvIndex = -1;
_game._player._stepEnabled = true;
_vm->_sound->command(24);
}
if (_game._trigger == 71) {
_scene->_hotspots.activate(OBJ_SHIELD_MODULATOR, true);
_globals[kShieldModInstalled] = false;
_game._objects.addToInventory(OBJ_SHIELD_MODULATOR);
_game._player._stepEnabled = true;
}
if (_game._trigger == 81) {
_scene->_hotspots.activate(OBJ_TARGET_MODULE, true);
_globals[kTargetModInstalled] = false;
_game._objects.addToInventory(OBJ_TARGET_MODULE);
_game._player._stepEnabled = true;
}
}
void Scene805::preActions() {
_game._player._needToWalk = false;
}
void Scene805::actions() {
if (_action.isAction(VERB_EXIT, NOUN_SERVICE_PANEL))
_scene->_nextSceneId = 804;
else if (_action.isAction(VERB_INSTALL, NOUN_SHIELD_MODULATOR) && _game._objects.isInInventory(OBJ_SHIELD_MODULATOR)) {
_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 7, 1, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
_game._player._stepEnabled = false;
} else if (_action.isAction(VERB_INSTALL, NOUN_TARGET_MODULE) && _game._objects.isInInventory(OBJ_TARGET_MODULE)) {
_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 80);
_game._player._stepEnabled = false;
} else if (_action.isAction(VERB_REMOVE, NOUN_SHIELD_MODULATOR) && _globals[kShieldModInstalled]) {
_scene->_sequences.remove(_globals._sequenceIndexes[1]);
_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 7, 1, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
_game._player._stepEnabled = false;
} else if (_action.isAction(VERB_REMOVE, NOUN_TARGET_MODULE) && _globals[kTargetModInstalled]) {
_scene->_sequences.remove(_globals._sequenceIndexes[2]);
_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 81);
_game._player._stepEnabled = false;
} else if (_action.isAction(VERB_INSTALL, NOUN_SHIELD_MODULATOR) && !_game._objects.isInInventory(OBJ_SHIELD_MODULATOR))
_vm->_dialogs->show(80511);
else if (_action.isAction(VERB_INSTALL, NOUN_TARGET_MODULE) && !_game._objects.isInInventory(OBJ_TARGET_MODULE))
_vm->_dialogs->show(80510);
else if (_action.isAction(VERB_REMOVE, NOUN_LIFE_SUPPORT_MODULE))
_vm->_dialogs->show(80512);
else
return;
_action._inProgress = false;
}
/*------------------------------------------------------------------------*/
void Scene807::setup() {
_game._player._spritesPrefix = "";
// The original was calling Scene8xx::setAAName()
_game._aaName = Resources::formatAAName(5);
}
void Scene807::enter() {
if (_globals[kSexOfRex] == REX_FEMALE)
_handSpriteId = _scene->_sprites.addSprites("*ROXHAND");
else
_handSpriteId = _scene->_sprites.addSprites("*REXHAND");
teleporterEnter();
// The original uses Scene8xx::SceneEntrySound()
if (!_vm->_musicFlag)
_vm->_sound->command(2);
else
_vm->_sound->command(20);
}
void Scene807::step() {
teleporterStep();
}
void Scene807::actions() {
if (teleporterActions()) {
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_LOOK, NOUN_VIEWPORT))
_vm->_dialogs->show(80710);
else if (_action.isAction(VERB_PEER_THROUGH, NOUN_VIEWPORT))
_vm->_dialogs->show(80710);
else if (_action.isAction(VERB_LOOK, NOUN_KEYPAD) && _action.isAction(VERB_INSPECT, NOUN_KEYPAD))
_vm->_dialogs->show(80711);
else if (_action.isAction(VERB_LOOK, NOUN_DISPLAY))
_vm->_dialogs->show(80712);
else if (_action.isAction(VERB_LOOK, NOUN_1_KEY) || _action.isAction(VERB_LOOK, NOUN_2_KEY)
|| _action.isAction(VERB_LOOK, NOUN_3_KEY) || _action.isAction(VERB_LOOK, NOUN_4_KEY)
|| _action.isAction(VERB_LOOK, NOUN_5_KEY) || _action.isAction(VERB_LOOK, NOUN_6_KEY)
|| _action.isAction(VERB_LOOK, NOUN_7_KEY) || _action.isAction(VERB_LOOK, NOUN_8_KEY)
|| _action.isAction(VERB_LOOK, NOUN_9_KEY) || _action.isAction(VERB_LOOK, NOUN_0_KEY)
|| _action.isAction(VERB_LOOK, NOUN_SMILE_KEY) || _action.isAction(VERB_LOOK, NOUN_FROWN_KEY))
_vm->_dialogs->show(80713);
else if (_action.isAction(VERB_LOOK, NOUN_DEVICE) && _action._lookFlag)
_vm->_dialogs->show(80714);
else
return;
_action._inProgress = false;
}
/*------------------------------------------------------------------------*/
Scene808::Scene808(MADSEngine *vm) : Scene8xx(vm) {
_goingTo803 = false;
}
void Scene808::synchronize(Common::Serializer &s) {
Scene8xx::synchronize(s);
s.syncAsByte(_goingTo803);
}
void Scene808::setup() {
setPlayerSpritesPrefix();
setAAName();
}
void Scene808::enter() {
_scene->_userInterface.setup(kInputLimitedSentences);
_globals._spriteIndexes[4] = _scene->_sprites.addSprites ("*REXHAND");
_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0));
_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('b', 1));
_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('b', 2));
if (_globals[kTopButtonPushed])
_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
else
_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
_goingTo803 = false;
if (_globals[kCameFromCut] && _globals[kCutX] != 0) {
_globals[kCutX] = 0;
_globals[kCameFromCut] = false;
_globals[kReturnFromCut] = false;
_globals[kBeamIsUp] = false;
_globals[kForceBeamDown] = false;
_globals[kDontRepeat] = false;
} else if ((_scene->_priorSceneId == 803) && _globals[kReturnFromCut]){
_globals[kDontRepeat] = false;
_globals[kBeamIsUp] = true;
_globals[kAntigravClock] = _scene->_frameStartTime;
_globals[kAntigravTiming] = _scene->_frameStartTime;
_globals[kForceBeamDown] = false;
_globals[kReturnFromCut] = false;
}
_globals[kBetweenRooms] = false;
if (_globals[kBeamIsUp]) {
_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8);
}
sceneEntrySound();
}
void Scene808::actions() {
if (_action.isAction(VERB_PRESS, NOUN_START_BUTTON_2)) {
switch (_game._trigger) {
case 0:
_game._player._stepEnabled = false;
_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 4, 1, 0, 0);
_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(248, 211));
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 2);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
break;
case 70:
if (!_globals[kBeamIsUp] && !_globals[kTopButtonPushed]) {
_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8);
_goingTo803 = true;
_vm->_sound->command(20);
_vm->_sound->command(25);
}
_globals._sequenceIndexes[4] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[4], false, 4, 1, 0, 0);
_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(248, 211));
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 2);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
break;
case 71:
_game._player._stepEnabled = true;
if (_goingTo803 && !_globals[kTopButtonPushed]) {
_goingTo803 = false;
_globals[kReturnFromCut] = true;
_scene->_nextSceneId = 803;
}
break;
default:
break;
}
} else if (_action.isAction(VERB_PRESS, NOUN_TIMER_BUTTON_2)) {
switch (_game._trigger) {
case 0:
_game._player._stepEnabled = false;
_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 4, 1, 0, 0);
_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(248, 186));
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 2);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 90);
break;
case 90:
if (_globals[kTopButtonPushed]) {
_scene->_sequences.remove(_globals._sequenceIndexes[1]);
_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 8);
_vm->_sound->command(20);
}
_globals[kTopButtonPushed] = false;
_globals._sequenceIndexes[4] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[4], false, 4, 1, 0, 0);
_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(248, 186));
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 2);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 91);
break;
case 91:
_game._player._stepEnabled = true;
break;
default:
break;
}
} else if (_action.isAction(VERB_PRESS, NOUN_REMOTE_BUTTON_2)) {
switch (_game._trigger) {
case 0:
_game._player._stepEnabled = false;
_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 4, 1, 0, 0);
_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(248, 163));
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 2);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 80);
break;
case 80:
if (!_globals[kTopButtonPushed]) {
_scene->_sequences.remove(_globals._sequenceIndexes[2]);
_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 8);
_vm->_sound->command(20);
}
_globals[kTopButtonPushed] = true;
_globals._sequenceIndexes[4] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[4], false, 4, 1, 0, 0);
_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(248, 163));
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 2);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 81);
break;
case 81:
_game._player._stepEnabled = true;
break;
default:
break;
}
} else if (_action.isAction(VERB_PRESS, NOUN_START_BUTTON_1)) {
switch (_game._trigger) {
case 0:
_game._player._stepEnabled = false;
_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 4, 2, 0, 0);
_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(168, 211));
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 2);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
break;
case 70:
_game._player._stepEnabled = true;
break;
default:
break;
}
} else if (_action.isAction(VERB_PRESS, NOUN_REMOTE_BUTTON_1)) {
switch (_game._trigger) {
case 0:
_game._player._stepEnabled = false;
_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 4, 2, 0, 0);
_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(172, 163));
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 2);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 80);
break;
case 80:
_game._player._stepEnabled = true;
break;
default:
break;
}
} else if (_action.isAction(VERB_PRESS, NOUN_TIMER_BUTTON_1)) {
switch (_game._trigger) {
case 0:
_game._player._stepEnabled = false;
_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 4, 2, 0, 0);
_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(172, 186));
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 2);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 90);
break;
case 90:
_game._player._stepEnabled = true;
break;
default:
break;
}
} else if (_action.isAction(VERB_EXIT, NOUN_PANEL)) {
_scene->_nextSceneId = 801;
_globals[kBetweenRooms] = true;
} else
return;
_action._inProgress = false;
}
/*------------------------------------------------------------------------*/
Scene810::Scene810(MADSEngine *vm) : Scene8xx(vm) {
_moveAllowed = false;
}
void Scene810::synchronize(Common::Serializer &s) {
Scene8xx::synchronize(s);
s.syncAsByte(_moveAllowed);
}
void Scene810::setup() {
setPlayerSpritesPrefix();
setAAName();
}
void Scene810::enter() {
_scene->_userInterface.setup(kInputLimitedSentences);
_game._player._visible = false;
_game._player._stepEnabled = false;
_scene->loadAnimation(Resources::formatName(810, 'a', -1, EXT_AA, ""));
_moveAllowed = true;
sceneEntrySound();
}
void Scene810::step() {
if (_scene->_animation[0] && (_scene->_animation[0]->getCurrentFrame() == 200)
&& _moveAllowed) {
_scene->_sequences.addTimer(100, 70);
_moveAllowed = false;
}
if (_game._trigger == 70)
_scene->_nextSceneId = 804;
}
/*------------------------------------------------------------------------*/
} // End of namespace Nebular
} // End of namespace MADS