mirror of
https://github.com/scummvm/scummvm.git
synced 2025-04-02 10:52:32 -04:00
3560 lines
109 KiB
C++
3560 lines
109 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.
|
|
*
|
|
* Additional copyright for this file:
|
|
* Copyright (C) 1995-1997 Presto Studios, Inc.
|
|
*
|
|
* 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 "common/file.h"
|
|
|
|
#include "pegasus/compass.h"
|
|
#include "pegasus/cursor.h"
|
|
#include "pegasus/energymonitor.h"
|
|
#include "pegasus/gamestate.h"
|
|
#include "pegasus/pegasus.h"
|
|
#include "pegasus/ai/ai_area.h"
|
|
#include "pegasus/items/biochips/aichip.h"
|
|
#include "pegasus/items/biochips/arthurchip.h"
|
|
#include "pegasus/items/biochips/opticalchip.h"
|
|
#include "pegasus/neighborhood/caldoria/caldoria.h"
|
|
#include "pegasus/neighborhood/norad/constants.h"
|
|
#include "pegasus/neighborhood/prehistoric/prehistoric.h"
|
|
#include "pegasus/neighborhood/mars/constants.h"
|
|
#include "pegasus/neighborhood/tsa/fulltsa.h"
|
|
#include "pegasus/neighborhood/wsc/wsc.h"
|
|
|
|
namespace Pegasus {
|
|
|
|
// TSA PICTs:
|
|
|
|
enum {
|
|
kTBPCloseBoxPICTID = 800,
|
|
kTBPRewindPICTID = 801,
|
|
kUnresolvedPICTID = 802,
|
|
kResolvedPICTID = 803,
|
|
kJumpMenuPICTID = 804,
|
|
kJumpMenuHilitedPICTID = 805,
|
|
kExitPICTID = 806,
|
|
kExitHilitedPICTID = 807,
|
|
kLeftRipPICTID = 808,
|
|
kComparisonCloseBoxPICTID = 809,
|
|
kComparisonLeftRewindPICTID = 810,
|
|
kComparisonRightRewindPICTID = 811,
|
|
kComparisonHiliteNoradPICTID = 812,
|
|
kComparisonHiliteMarsPICTID = 813,
|
|
kComparisonHiliteCaldoriaPICTID = 814,
|
|
kComparisonHiliteWSCPICTID = 815,
|
|
kComparisonChancesNoradPICTID = 816,
|
|
kComparisonChancesMarsPICTID = 817,
|
|
kComparisonChancesCaldoriaPICTID = 818,
|
|
kComparisonChancesWSCPICTID = 819,
|
|
kRedirectionCCRolloverPICTID = 820,
|
|
kRedirectionRRRolloverPICTID = 821,
|
|
kRedirectionFDRolloverPICTID = 822,
|
|
kRedirectionCCDoorPICTID = 823,
|
|
kRedirectionRRDoorPICTID = 824,
|
|
kRedirectionFDDoorPICTID = 825,
|
|
kRedirectionSecuredPICTID = 826,
|
|
kRedirectionNewTargetPICTID = 827,
|
|
kRedirectionClosePICTID = 828
|
|
};
|
|
|
|
static const int16 kCompassShift = 15;
|
|
|
|
enum {
|
|
kFullTSAMovieScale = 600,
|
|
kFullTSAFramesPerSecond = 15,
|
|
kFullTSAFrameDuration = 40
|
|
};
|
|
|
|
// Alternate IDs.
|
|
static const AlternateID kAltTSANormal = 0;
|
|
static const AlternateID kAltTSARobotsAtReadyRoom = 1;
|
|
static const AlternateID kAltTSARobotsAtFrontDoor = 2;
|
|
static const AlternateID kAltTSARedAlert = 3;
|
|
|
|
// Room IDs.
|
|
enum {
|
|
kTSA01 = 1,
|
|
kTSA02 = 2,
|
|
kTSA03 = 3,
|
|
kTSA04 = 4,
|
|
kTSA05 = 5,
|
|
kTSA0A = 6,
|
|
kTSA06 = 7,
|
|
kTSA07 = 8,
|
|
kTSA08 = 9,
|
|
kTSA09 = 10,
|
|
kTSA10 = 11,
|
|
kTSA11 = 12,
|
|
kTSA12 = 13,
|
|
kTSA13 = 14,
|
|
kTSA14 = 15,
|
|
kTSA15 = 16,
|
|
kTSA16 = 17,
|
|
kTSA17 = 18,
|
|
kTSA18 = 19,
|
|
kTSA19 = 20,
|
|
kTSA0B = 21,
|
|
kTSA21Cyan = 22,
|
|
kTSA22Cyan = 23,
|
|
kTSA23Cyan = 24,
|
|
kTSA24Cyan = 25,
|
|
kTSA25Cyan = 26,
|
|
kTSA21Red = 27,
|
|
kTSA23Red = 29,
|
|
kTSA24Red = 30,
|
|
kTSA25Red = 31,
|
|
kTSA26 = 32,
|
|
kTSA27 = 33,
|
|
kTSA28 = 34,
|
|
kTSA29 = 35,
|
|
kTSA30 = 36,
|
|
kTSA31 = 37,
|
|
kTSA32 = 38,
|
|
kTSA33 = 39,
|
|
kTSA34 = 40,
|
|
kTSA35 = 41,
|
|
kTSADeathRoom = 43
|
|
};
|
|
|
|
// Hot Spot Activation IDs.
|
|
enum {
|
|
kActivateTSAReadyForCard = 1,
|
|
kActivateTSAReadyToTransport = 2,
|
|
kActivateTSARobotsAwake = 3,
|
|
kActivateTSA0BZoomedOut = 4,
|
|
kActivateTSA0BZoomedIn = 5,
|
|
kActivateTSA0BComparisonVideo = 6,
|
|
kActivationLogReaderOpen = 7,
|
|
kActivateTSA0BTBPVideo = 8,
|
|
kActivationDoesntHaveKey = 9,
|
|
kActivationKeyVaultOpen = 10,
|
|
kActivationDoesntHaveChips = 11,
|
|
kActivationChipVaultOpen = 12,
|
|
kActivationJumpToPrehistoric = 13,
|
|
kActivationJumpToNorad = 14,
|
|
kActivationJumpToMars = 15,
|
|
kActivationJumpToWSC = 16,
|
|
kActivationReadyToExit = 17,
|
|
kActivationReadyForJumpMenu = 18,
|
|
kActivationMainJumpMenu = 19
|
|
};
|
|
|
|
// Hot Spot IDs.
|
|
enum {
|
|
kTSAGTCardDropSpotID = 5000,
|
|
kTSAGTTokyoSpotID = 5001,
|
|
kTSAGTCaldoriaSpotID = 5002,
|
|
kTSAGTBeachSpotID = 5003,
|
|
kTSAGTOtherSpotID = 5004,
|
|
kTSA02DoorSpotID = 5005,
|
|
kTSA03EastJimenezSpotID = 5006,
|
|
kTSA03WestCrenshawSpotID = 5007,
|
|
kTSA04EastMatsumotoSpotID = 5008,
|
|
kTSA04WestCastilleSpotID = 5009,
|
|
kTSA05EastSinclairSpotID = 5010,
|
|
kTSA05WestWhiteSpotID = 5011,
|
|
kTSA0AEastSpotID = 5012,
|
|
kTSA0AWastSpotID = 5013,
|
|
kTSA0BEastMonitorSpotID = 5014,
|
|
kTSA0BEastMonitorOutSpotID = 5015,
|
|
kTSA0BEastCompareNoradSpotID = 5016,
|
|
kTSA0BEastCompareMarsSpotID = 5017,
|
|
kTSA0BEastCompareCaldoriaSpotID = 5018,
|
|
kTSA0BEastCompareWSCSpotID = 5019,
|
|
kTSA0BEastLeftRewindSpotID = 5020,
|
|
kTSA0BEastLeftPlaySpotID = 5021,
|
|
kTSA0BEastRightRewindSpotID = 5022,
|
|
kTSA0BEastRightPlaySpotID = 5023,
|
|
kTSA0BEastCloseVideoSpotID = 5024,
|
|
kTSA0BNorthMonitorSpotID = 5025,
|
|
kTSA0BNorthMonitorOutSpotID = 5026,
|
|
kTSA0BNorthHistLogSpotID = 5027,
|
|
kTSA0BNorthRobotsToCommandCenterSpotID = 5028,
|
|
kTSA0BNorthRobotsToReadyRoomSpotID = 5029,
|
|
kTSA0BNorthRobotsToFrontDoorSpotID = 5030,
|
|
kTSA0BWestMonitorSpotID = 5031,
|
|
kTSA0BWestMonitorOutSpotID = 5032,
|
|
kTSA0BWestTheorySpotID = 5033,
|
|
kTSA0BWestBackgroundSpotID = 5034,
|
|
kTSA0BWestProcedureSpotID = 5035,
|
|
kTSA0BWestCloseVideoSpotID = 5036,
|
|
kTSA0BWestPlayVideoSpotID = 5037,
|
|
kTSA0BWestRewindVideoSpotID = 5038,
|
|
kTSA22EastMonitorSpotID = 5039,
|
|
kTSA22EastKeySpotID = 5040,
|
|
kTSA23WestMonitorSpotID = 5041,
|
|
kTSA23WestChipsSpotID = 5042,
|
|
kTSA34NorthDoorSpotID = 5043,
|
|
kTSA37NorthJumpToPrehistoricSpotID = 5044,
|
|
kTSA37NorthJumpToNoradSpotID = 5045,
|
|
kTSA37NorthCancelNoradSpotID = 5046,
|
|
kTSA37NorthJumpToMarsSpotID = 5047,
|
|
kTSA37NorthCancelMarsSpotID = 5048,
|
|
kTSA37NorthJumpToWSCSpotID = 5049,
|
|
kTSA37NorthCancelWSCSpotID = 5050,
|
|
kTSA37NorthExitSpotID = 5051,
|
|
kTSA37NorthJumpMenuSpotID = 5052,
|
|
kTSA37NorthNoradMenuSpotID = 5053,
|
|
kTSA37NorthMarsMenuSpotID = 5054,
|
|
kTSA37NorthWSCMenuSpotID = 5055
|
|
};
|
|
|
|
// Extra sequence IDs.
|
|
enum {
|
|
kTSATransporterArrowLoop = 0,
|
|
kTSAArriveFromCaldoria = 1,
|
|
kTSAGTOtherChoice = 2,
|
|
kTSAGTCardSwipe = 3,
|
|
kTSAGTSelectCaldoria = 4,
|
|
kTSAGTGoToCaldoria = 5,
|
|
kTSAGTSelectBeach = 6,
|
|
kTSAGTGoToBeach = 7,
|
|
kTSAGTArriveAtBeach = 8,
|
|
kTSAGTSelectTokyo = 9,
|
|
kTSAGTGoToTokyo = 10,
|
|
kTSAGTArriveAtTokyo = 11,
|
|
kTSA02NorthZoomIn = 12,
|
|
kTSA02NorthTenSecondDoor = 13,
|
|
kTSA02NorthZoomOut = 14,
|
|
kTSA02NorthDoorWithAgent3 = 15,
|
|
kTSA03JimenezZoomIn = 16,
|
|
kTSA03JimenezSpeech = 17,
|
|
kTSA03JimenezZoomOut = 18,
|
|
kTSA03CrenshawZoomIn = 19,
|
|
kTSA03CrenshawSpeech = 20,
|
|
kTSA03CrenshawZoomOut = 21,
|
|
kTSA03SouthRobotDeath = 22,
|
|
kTSA04NorthRobotGreeting = 23,
|
|
kTSA04MatsumotoZoomIn = 24,
|
|
kTSA04MatsumotoSpeech = 25,
|
|
kTSA04MatsumotoZoomOut = 26,
|
|
kTSA04CastilleZoomIn = 27,
|
|
kTSA04CastilleSpeech = 28,
|
|
kTSA04CastilleZoomOut = 29,
|
|
kTSA05SinclairZoomIn = 30,
|
|
kTSA05SinclairSpeech = 31,
|
|
kTSA05SinclairZoomOut = 32,
|
|
kTSA05WhiteZoomIn = 33,
|
|
kTSA05WhiteSpeech = 34,
|
|
kTSA05WhiteZoomOut = 35,
|
|
kTSA0AEastRobot = 36,
|
|
kTSA0AWestRobot = 37,
|
|
kTSA16NorthRobotDeath = 38,
|
|
kTSA0BEastZoomIn = 39,
|
|
kTSA0BEastZoomedView = 40,
|
|
kTSA0BEastZoomOut = 41,
|
|
kTSA0BEastTurnLeft = 42,
|
|
kTSA0BComparisonStartup = 43,
|
|
kTSA0BComparisonView0000 = 44,
|
|
kTSA0BComparisonView0002 = 45,
|
|
kTSA0BComparisonView0020 = 46,
|
|
kTSA0BComparisonView0022 = 47,
|
|
kTSA0BComparisonView0200 = 48,
|
|
kTSA0BComparisonView0202 = 49,
|
|
kTSA0BComparisonView0220 = 50,
|
|
kTSA0BComparisonView0222 = 51,
|
|
kTSA0BComparisonView2000 = 52,
|
|
kTSA0BComparisonView2002 = 53,
|
|
kTSA0BComparisonView2020 = 54,
|
|
kTSA0BComparisonView2022 = 55,
|
|
kTSA0BComparisonView2200 = 56,
|
|
kTSA0BComparisonView2202 = 57,
|
|
kTSA0BComparisonView2220 = 58,
|
|
kTSA0BComparisonView2222 = 59,
|
|
kTSA0BNoradComparisonView = 60,
|
|
kTSA0BNoradUnaltered = 61,
|
|
kTSA0BNoradAltered = 62,
|
|
kTSA0BMarsComparisonView = 63,
|
|
kTSA0BMarsUnaltered = 64,
|
|
kTSA0BMarsAltered = 65,
|
|
kTSA0BWSCComparisonView = 66,
|
|
kTSA0BWSCUnaltered = 67,
|
|
kTSA0BWSCAltered = 68,
|
|
kTSA0BCaldoriaComparisonView = 69,
|
|
kTSA0BCaldoriaUnaltered = 70,
|
|
kTSA0BCaldoriaAltered = 71,
|
|
kTSA0BNorthZoomIn = 72,
|
|
kTSA0BNorthZoomedView = 73,
|
|
kTSA0BNorthZoomOut = 74,
|
|
kTSA0BNorthTurnLeft = 75,
|
|
kTSA0BNorthTurnRight = 76,
|
|
kTSA0BNorthHistLogOpen = 77,
|
|
kTSA0BNorthHistLogClose = 78,
|
|
kTSA0BNorthHistLogCloseWithLog = 79,
|
|
kTSA0BNorthCantChangeHistory = 80,
|
|
kTSA0BNorthYoureBusted = 81,
|
|
kTSA0BNorthFinallyHappened = 82,
|
|
kTSA0BShowRip1 = 83,
|
|
kTSA0BNorthRipView1 = 84,
|
|
kTSA0BShowRip2 = 85,
|
|
kTSA0BShowGuardRobots = 86,
|
|
kTSA0BAIInterruption = 87,
|
|
kTSA0BRobotsToCommandCenter = 88,
|
|
kTSA0BNorthRobotsAtCCView = 89,
|
|
kTSA0BNorthRobotsAtRRView = 90,
|
|
kTSA0BNorthRobotsAtFDView = 91,
|
|
kTSA0BRobotsFromCommandCenterToReadyRoom = 92,
|
|
kTSA0BRobotsFromReadyRoomToCommandCenter = 93,
|
|
kTSA0BRobotsFromCommandCenterToFrontDoor = 94,
|
|
kTSA0BRobotsFromFrontDoorToCommandCenter = 95,
|
|
kTSA0BRobotsFromFrontDoorToReadyRoom = 96,
|
|
kTSA0BRobotsFromReadyRoomToFrontDoor = 97,
|
|
kTSA0BWestZoomIn = 98,
|
|
kTSA0BWestZoomedView = 99,
|
|
kTSA0BWestZoomOut = 100,
|
|
kTSA0BWestTurnRight = 101,
|
|
kTSA0BTBPTheoryHighlight = 102,
|
|
kTSA0BTBPBackgroundHighlight = 103,
|
|
kTSA0BTBPProcedureHighlight = 104,
|
|
kTSA0BTBPTheory = 105,
|
|
kTSA0BTBPBackground = 106,
|
|
kTSA0BTBPProcedure = 107,
|
|
kTSA0BRipAlarmScreen = 108,
|
|
kTSA22RedEastZoomInSequence = 109,
|
|
kTSA22RedEastVaultViewWithKey = 110,
|
|
kTSA22RedEastVaultViewNoKey = 111,
|
|
kTSA23RedWestVaultZoomInSequence = 112,
|
|
kTSA23RedWestVaultViewWithChips = 113,
|
|
kTSA23RedWestVaultViewNoChips = 114,
|
|
kTSA25NorthDeniedNoKey = 115,
|
|
kTSA25NorthDeniedNoChip = 116,
|
|
kTSA25NorthPutOnSuit = 117,
|
|
kTSA25NorthAlreadyHaveSuit = 118,
|
|
kTSA25NorthDescending1 = 119,
|
|
kTSA25NorthDescending2 = 120,
|
|
kTSA37HorseToAI1 = 121,
|
|
kTSA37PegasusAI1 = 122,
|
|
kTSA37AI1ToCommissioner1 = 123,
|
|
kTSA37Commissioner1 = 124,
|
|
kTSA37Commissioner1ToZoom = 125,
|
|
kTSA37ZoomToPrehistoric = 126,
|
|
kTSA37PrehistoricToAI2 = 127,
|
|
kTSA37PegasusAI2 = 128,
|
|
kTSA37AI2ToPrehistoric = 129,
|
|
kTSA37PrehistoricToDepart = 130,
|
|
kTSA37PegasusDepart = 131,
|
|
kTSA37TimeJumpToPegasus = 132,
|
|
kTSA37RecallToDownload = 133,
|
|
kTSA37DownloadToColonel1 = 134,
|
|
kTSA37Colonel1 = 135,
|
|
kTSA37Colonel1ToReviewRequired = 136,
|
|
kTSA37ReviewRequiredToExit = 137,
|
|
kTSA37ExitHilited = 138,
|
|
kTSA37ExitToHorse = 139,
|
|
kTSA37HorseToColonel2 = 140,
|
|
kTSA37Colonel2 = 141,
|
|
kTSA37PegasusAI3 = 142,
|
|
kTSA37AI3ToHorse = 143,
|
|
kTSA37HorseToZoom = 144,
|
|
kTSA37ZoomToMainMenu = 145,
|
|
kTSA37MainMenuToAI4 = 146,
|
|
kTSA37PegasusAI4 = 147,
|
|
kTSA37AI4ToMainMenu = 148,
|
|
kTSA37JumpMenu000 = 149,
|
|
kTSA37JumpMenu001 = 150,
|
|
kTSA37JumpMenu010 = 151,
|
|
kTSA37JumpMenu011 = 152,
|
|
kTSA37JumpMenu100 = 153,
|
|
kTSA37JumpMenu101 = 154,
|
|
kTSA37JumpMenu110 = 155,
|
|
kTSA37JumpMenu111 = 156,
|
|
kTSA37JumpToWSCMenu = 157,
|
|
kTSA37CancelWSC = 158,
|
|
kTSA37JumpToWSC = 159,
|
|
kTSA37WSCToAI5 = 160,
|
|
kTSA37PegasusAI5 = 161,
|
|
kTSA37AI5ToWSC = 162,
|
|
kTSA37WSCToDepart = 163,
|
|
kTSA37JumpToMarsMenu = 164,
|
|
kTSA37CancelMars = 165,
|
|
kTSA37JumpToMars = 166,
|
|
kTSA37MarsToAI6 = 167,
|
|
kTSA37PegasusAI6 = 168,
|
|
kTSA37AI6ToMars = 169,
|
|
kTSA37MarsToDepart = 170,
|
|
kTSA37JumpToNoradMenu = 171,
|
|
kTSA37CancelNorad = 172,
|
|
kTSA37JumpToNorad = 173,
|
|
kTSA37NoradToAI7 = 174,
|
|
kTSA37PegasusAI7 = 175,
|
|
kTSA37AI7ToNorad = 176,
|
|
kTSA37NoradToDepart = 177,
|
|
kTSA37EnvironmentalScan = 178,
|
|
kTSA37DownloadToMainMenu = 179,
|
|
kTSA37DownloadToOpMemReview = 180,
|
|
kTSA37OpMemReviewToMainMenu = 181,
|
|
kTSA37OpMemReviewToAllClear = 182,
|
|
kTSA37AllClearToCongratulations = 183,
|
|
kTSA37Congratulations = 184,
|
|
kTSA37CongratulationsToExit = 185
|
|
};
|
|
|
|
const DisplayOrder kRipTimerOrder = kMonitorLayer;
|
|
|
|
enum {
|
|
kUnresolvedLeft = kNavAreaLeft + 14,
|
|
kUnresolvedTop = kNavAreaTop + 236,
|
|
|
|
kResolvedLeft = kNavAreaLeft + 36,
|
|
kResolvedTop = kNavAreaTop + 236,
|
|
|
|
kJumpMenuLeft = kNavAreaLeft + 360,
|
|
kJumpMenuTop = kNavAreaTop + 202,
|
|
|
|
kJumpMenuHilitedLeft = kNavAreaLeft + 354,
|
|
kJumpMenuHilitedTop = kNavAreaTop + 196,
|
|
|
|
kExitLeft = kNavAreaLeft + 360,
|
|
kExitTop = kNavAreaTop + 216,
|
|
|
|
kExitHilitedLeft = kNavAreaLeft + 354,
|
|
kExitHilitedTop = kNavAreaTop + 210,
|
|
|
|
kRipTimerLeft = kNavAreaLeft + 95,
|
|
kRipTimerTop = kNavAreaTop + 87,
|
|
|
|
kTBPCloseLeft = kNavAreaLeft + 30,
|
|
kTBPCloseTop = kNavAreaTop + 16,
|
|
|
|
kTBPRewindLeft = kNavAreaLeft + 86,
|
|
kTBPRewindTop = kNavAreaTop + 218,
|
|
|
|
kComparisonCloseLeft = kNavAreaLeft + 50,
|
|
kComparisonCloseTop = kNavAreaTop + 14,
|
|
|
|
kComparisonLeftRewindLeft = kNavAreaLeft + 96,
|
|
kComparisonLeftRewindTop = kNavAreaTop + 190,
|
|
|
|
kComparisonRightRewindLeft = kNavAreaLeft + 282,
|
|
kComparisonRightRewindTop = kNavAreaTop + 190,
|
|
|
|
kComparisonHiliteSpriteLeft = kNavAreaLeft + 45,
|
|
kComparisonHiliteSpriteTop = kNavAreaTop + 65,
|
|
|
|
kComparisonHiliteNoradLeft = kNavAreaLeft + 45,
|
|
kComparisonHiliteNoradTop = kNavAreaTop + 65,
|
|
|
|
kComparisonHiliteMarsLeft = kNavAreaLeft + 45 + 4,
|
|
kComparisonHiliteMarsTop = kNavAreaTop + 65 + 23,
|
|
|
|
kComparisonHiliteCaldoriaLeft = kNavAreaLeft + 45 + 7,
|
|
kComparisonHiliteCaldoriaTop = kNavAreaTop + 65 + 46,
|
|
|
|
kComparisonHiliteWSCLeft = kNavAreaLeft + 45 + 11,
|
|
kComparisonHiliteWSCTop = kNavAreaTop + 65 + 68,
|
|
|
|
kComparisonChancesSpriteLeft = kNavAreaLeft + 148,
|
|
kComparisonChancesSpriteTop = kNavAreaTop + 162,
|
|
|
|
kComparisonChancesNoradLeft = kNavAreaLeft + 148,
|
|
kComparisonChancesNoradTop = kNavAreaTop + 162,
|
|
|
|
kComparisonChancesMarsLeft = kNavAreaLeft + 148,
|
|
kComparisonChancesMarsTop = kNavAreaTop + 162,
|
|
|
|
kComparisonChancesCaldoriaLeft = kNavAreaLeft + 148,
|
|
kComparisonChancesCaldoriaTop = kNavAreaTop + 162 + 1,
|
|
|
|
kComparisonChancesWSCLeft = kNavAreaLeft + 148,
|
|
kComparisonChancesWSCTop = kNavAreaTop + 162,
|
|
|
|
kRedirectionSprite1Left = kNavAreaLeft + 58,
|
|
kRedirectionSprite1Top = kNavAreaTop + 16,
|
|
|
|
kRedirectionSprite2Left = kNavAreaLeft + 36,
|
|
kRedirectionSprite2Top = kNavAreaTop + 166,
|
|
|
|
kRedirectionCCRolloverLeft = kNavAreaLeft + 58,
|
|
kRedirectionCCRolloverTop = kNavAreaTop + 16,
|
|
|
|
kRedirectionRRRolloverLeft = kNavAreaLeft + 430,
|
|
kRedirectionRRRolloverTop = kNavAreaTop + 30,
|
|
|
|
kRedirectionFDRolloverLeft = kNavAreaLeft + 278,
|
|
kRedirectionFDRolloverTop = kNavAreaTop + 160,
|
|
|
|
kRedirectionCCDoorLeft = kNavAreaLeft + 174,
|
|
kRedirectionCCDoorTop = kNavAreaTop + 36,
|
|
|
|
kRedirectionRRDoorLeft = kNavAreaLeft + 428,
|
|
kRedirectionRRDoorTop = kNavAreaTop + 32,
|
|
|
|
kRedirectionFDDoorLeft = kNavAreaLeft + 298,
|
|
kRedirectionFDDoorTop = kNavAreaTop + 240,
|
|
|
|
kRedirectionSecuredLeft = kNavAreaLeft + 36,
|
|
kRedirectionSecuredTop = kNavAreaTop + 166,
|
|
|
|
kRedirectionNewTargetLeft = kNavAreaLeft + 36,
|
|
kRedirectionNewTargetTop = kNavAreaTop + 166,
|
|
|
|
kRedirectionCloseLeft = kNavAreaLeft + 56,
|
|
kRedirectionCloseTop = kNavAreaTop + 220
|
|
};
|
|
|
|
static const TimeValue kTSABumpIntoWallIn = 0;
|
|
static const TimeValue kTSABumpIntoWallOut = 148;
|
|
|
|
static const TimeValue kTSAGTDoorCloseIn = 148;
|
|
static const TimeValue kTSAGTDoorCloseOut = 1570;
|
|
|
|
static const TimeValue kTSANoOtherDestinationIn = 1570;
|
|
static const TimeValue kTSANoOtherDestinationOut = 3601;
|
|
|
|
static const TimeValue kTSAEntryDoorCloseIn = 3601;
|
|
static const TimeValue kTSAEntryDoorCloseOut = 4200;
|
|
|
|
static const TimeValue kTSAInsideDoorCloseIn = 4200;
|
|
static const TimeValue kTSAInsideDoorCloseOut = 4800;
|
|
|
|
static const TimeValue kTSAVaultCloseIn = 4800;
|
|
static const TimeValue kTSAVaultCloseOut = 5388;
|
|
|
|
static const TimeValue kTSAPegasusDoorCloseIn = 5388;
|
|
static const TimeValue kTSAPegasusDoorCloseOut = 6457;
|
|
|
|
enum {
|
|
kPegasusUnresolved = false,
|
|
kPegasusResolved = true,
|
|
kPegasusCantExit = false,
|
|
kPegasusCanExit = true
|
|
};
|
|
|
|
static const ExtraID kEasterEggJimenez = 1000;
|
|
static const ExtraID kEasterEggCastillo = 1001;
|
|
static const ExtraID kEasterEggSinclair = 1002;
|
|
|
|
// Monitor modes
|
|
enum {
|
|
kMonitorNeutral = 0,
|
|
kMonitorTheory = 1,
|
|
kMonitorProcedure = 2,
|
|
kMonitorBackground = 3,
|
|
kMonitorNoradComparison = 4,
|
|
kMonitorMarsComparison = 5,
|
|
kMonitorCaldoriaComparison = 6,
|
|
kMonitorWSCComparison = 7,
|
|
|
|
kRawModeMask = 0x0F,
|
|
kPlayingTBPMask = 0x10,
|
|
kPlayingLeftComparisonMask = 0x20,
|
|
kPlayingRightComparisonMask = 0x40,
|
|
|
|
kPlayingAnyMask = kPlayingTBPMask |
|
|
kPlayingLeftComparisonMask |
|
|
kPlayingRightComparisonMask,
|
|
|
|
kMonitorPlayingTheory = kMonitorTheory | kPlayingTBPMask,
|
|
kMonitorPlayingProcedure = kMonitorProcedure | kPlayingTBPMask,
|
|
kMonitorPlayingBackground = kMonitorBackground | kPlayingTBPMask,
|
|
|
|
kMonitorPlayingLeftNoradComparison = kMonitorNoradComparison |
|
|
kPlayingLeftComparisonMask,
|
|
kMonitorPlayingRightNoradComparison = kMonitorNoradComparison |
|
|
kPlayingRightComparisonMask,
|
|
kMonitorPlayingLeftMarsComparison = kMonitorMarsComparison |
|
|
kPlayingLeftComparisonMask,
|
|
kMonitorPlayingRightMarsComparison = kMonitorMarsComparison |
|
|
kPlayingRightComparisonMask,
|
|
kMonitorPlayingLeftCaldoriaComparison = kMonitorCaldoriaComparison |
|
|
kPlayingLeftComparisonMask,
|
|
kMonitorPlayingRightCaldoriaComparison = kMonitorCaldoriaComparison |
|
|
kPlayingRightComparisonMask,
|
|
kMonitorPlayingLeftWSCComparison = kMonitorWSCComparison |
|
|
kPlayingLeftComparisonMask,
|
|
kMonitorPlayingRightWSCComparison = kMonitorWSCComparison |
|
|
kPlayingRightComparisonMask
|
|
};
|
|
|
|
static const ExtraID s_historicalLogViews[16] = {
|
|
kTSA0BComparisonView0000,
|
|
kTSA0BComparisonView0002,
|
|
kTSA0BComparisonView0020,
|
|
kTSA0BComparisonView0022,
|
|
kTSA0BComparisonView0200,
|
|
kTSA0BComparisonView0202,
|
|
kTSA0BComparisonView0220,
|
|
kTSA0BComparisonView0222,
|
|
kTSA0BComparisonView2000,
|
|
kTSA0BComparisonView2002,
|
|
kTSA0BComparisonView2020,
|
|
kTSA0BComparisonView2022,
|
|
kTSA0BComparisonView2200,
|
|
kTSA0BComparisonView2202,
|
|
kTSA0BComparisonView2220,
|
|
kTSA0BComparisonView2222
|
|
};
|
|
|
|
enum {
|
|
kRedirectionCCRolloverSprite = 0,
|
|
kRedirectionRRRolloverSprite = 1,
|
|
kRedirectionFDRolloverSprite = 2,
|
|
kRedirectionCCDoorSprite = 3,
|
|
kRedirectionRRDoorSprite = 4,
|
|
kRedirectionFDDoorSprite = 5,
|
|
kRedirectionCloseSprite = 6,
|
|
kRedirectionSecuredSprite = 0,
|
|
kRedirectionNewTargetSprite = 1
|
|
};
|
|
|
|
void RipTimer::initImage() {
|
|
_middle = -1;
|
|
|
|
_timerImage.getImageFromPICTResource(((PegasusEngine *)g_engine)->_resFork, kLeftRipPICTID);
|
|
|
|
Common::Rect r;
|
|
_timerImage.getSurfaceBounds(r);
|
|
setBounds(r);
|
|
}
|
|
|
|
void RipTimer::releaseImage() {
|
|
_timerImage.deallocateSurface();
|
|
}
|
|
|
|
void RipTimer::draw(const Common::Rect &updateRect) {
|
|
Common::Rect bounds;
|
|
getBounds(bounds);
|
|
|
|
Common::Rect r1 = bounds;
|
|
r1.right = _middle;
|
|
r1 = updateRect.findIntersectingRect(r1);
|
|
|
|
if (!r1.isEmpty()) {
|
|
Common::Rect r2 = r1;
|
|
r2.moveTo(r1.left - _bounds.left, r1.top - bounds.top);
|
|
_timerImage.copyToCurrentPort(r2, r1);
|
|
}
|
|
}
|
|
|
|
void RipTimer::timeChanged(const TimeValue newTime) {
|
|
// WORKAROUND: If the timer isn't running, don't run the following code.
|
|
// Fixes use of the code when it shouldn't be running (since this is an
|
|
// IdlerAnimation, this is called on useIdleTime() but this specific
|
|
// timer only makes sense when used as an actual timer).
|
|
if (!isRunning())
|
|
return;
|
|
|
|
Common::Rect bounds;
|
|
getBounds(bounds);
|
|
|
|
CoordType newMiddle = bounds.left + bounds.width() * newTime / getDuration();
|
|
|
|
if (newMiddle != _middle) {
|
|
_middle = newMiddle;
|
|
triggerRedraw();
|
|
}
|
|
|
|
if (newTime == getStop())
|
|
((PegasusEngine *)g_engine)->die(kDeathUncreatedInTSA);
|
|
}
|
|
|
|
FullTSA::FullTSA(InputHandler *nextHandler, PegasusEngine *owner) : Neighborhood(nextHandler, owner, "Full TSA", kFullTSAID),
|
|
_extraMovie(kNoDisplayElement), _blankMovie(kNoDisplayElement), _playedSolvedMusicCue(false), _ripTimer(kNoDisplayElement),
|
|
_sprite1(kNoDisplayElement), _sprite2(kNoDisplayElement), _sprite3(kNoDisplayElement) {
|
|
setIsItemTaken(kJourneymanKey);
|
|
setIsItemTaken(kPegasusBiochip);
|
|
setIsItemTaken(kMapBiochip);
|
|
}
|
|
|
|
void FullTSA::init() {
|
|
Neighborhood::init();
|
|
_extraMovieCallBack.setNotification(&_neighborhoodNotification);
|
|
if (Common::File::exists("Images/TSA/Blank TSA.movie"))
|
|
_blankMovie.initFromMovieFile("Images/TSA/Blank TSA.movie");
|
|
_blankMovie.setVolume(_vm->getSoundFXLevel());
|
|
_blankMovie.setDisplayOrder(kNavMovieOrder + 1);
|
|
_blankMovie.startDisplaying();
|
|
_ripTimer.setDisplayOrder(kRipTimerOrder);
|
|
_ripTimer.startDisplaying();
|
|
|
|
if (!GameState.getTSASeenRobotGreeting())
|
|
forceStridingStop(kTSA03, kNorth, kNoAlternateID);
|
|
|
|
_sprite1.setDisplayOrder(kMonitorLayer);
|
|
_sprite1.startDisplaying();
|
|
_sprite2.setDisplayOrder(kMonitorLayer);
|
|
_sprite2.startDisplaying();
|
|
_sprite3.setDisplayOrder(kMonitorLayer);
|
|
_sprite3.startDisplaying();
|
|
|
|
// Fix a mistake in the world builder tables.
|
|
HotspotInfoTable::Entry *entry = findHotspotEntry(kTSA23WestChipsSpotID);
|
|
entry->hotspotItem = kPegasusBiochip;
|
|
}
|
|
|
|
void FullTSA::dieUncreatedInTSA() {
|
|
die(kDeathUncreatedInTSA);
|
|
}
|
|
|
|
void FullTSA::start() {
|
|
g_energyMonitor->stopEnergyDraining();
|
|
|
|
if (_vm->isDVD()) {
|
|
_entranceMusic.attachFader(&_entranceFader);
|
|
_entranceMusic.initFromAIFFFile("Sounds/TSA/TSA Entrance.32K.AIFF");
|
|
_entranceFader.setMasterVolume(_vm->getAmbienceLevel() / 2);
|
|
}
|
|
if (!GameState.getScoringEnterTSA()) {
|
|
_utilityFuse.primeFuse(GameState.getTSAFuseTimeLimit());
|
|
_utilityFuse.setFunctor(new Common::Functor0Mem<void, FullTSA>(this, &FullTSA::dieUncreatedInTSA));
|
|
_utilityFuse.lightFuse();
|
|
} else if (GameState.getTSAState() == kTSAPlayerDetectedRip || GameState.getTSAState() == kTSAPlayerNeedsHistoricalLog) {
|
|
_ripTimer.initImage();
|
|
_ripTimer.moveElementTo(kRipTimerLeft, kRipTimerTop);
|
|
_ripTimer.setSegment(0, kRipTimeLimit, kRipTimeScale);
|
|
_ripTimer.setTime(GameState.getRipTimerTime());
|
|
_ripTimer.start();
|
|
}
|
|
|
|
Neighborhood::start();
|
|
}
|
|
|
|
void FullTSA::flushGameState() {
|
|
GameState.setRipTimerTime(_ripTimer.getTime());
|
|
GameState.setTSAFuseTimeLimit(_utilityFuse.getTimeRemaining());
|
|
}
|
|
|
|
Common::String FullTSA::getBriefingMovie() {
|
|
Common::String movieName = Neighborhood::getBriefingMovie();
|
|
|
|
if (movieName.empty()) {
|
|
RoomID room = GameState.getCurrentRoom();
|
|
|
|
switch (GameState.getTSAState()) {
|
|
case kTSAPlayerNotArrived:
|
|
case kTSAPlayerForcedReview:
|
|
if (room >= kTSA16 && room <= kTSA0B)
|
|
return "Images/AI/TSA/XT01A";
|
|
|
|
return "Images/AI/TSA/XT01";
|
|
case kTSAPlayerDetectedRip:
|
|
case kTSAPlayerNeedsHistoricalLog:
|
|
return "Images/AI/TSA/XT02";
|
|
case kTSAPlayerGotHistoricalLog:
|
|
case kTSAPlayerInstalledHistoricalLog:
|
|
return "Images/AI/TSA/XT03";
|
|
default:
|
|
switch (getCurrentActivation()) {
|
|
case kActivationJumpToPrehistoric:
|
|
g_AIChip->showBriefingClicked();
|
|
startExtraSequenceSync(kTSA37PegasusAI2, kHintInterruption);
|
|
startExtraSequenceSync(kTSA37AI2ToPrehistoric, kFilterNoInput);
|
|
g_AIChip->clearClicked();
|
|
break;
|
|
case kActivationJumpToNorad:
|
|
g_AIChip->showBriefingClicked();
|
|
startExtraSequenceSync(kTSA37PegasusAI7, kHintInterruption);
|
|
startExtraSequenceSync(kTSA37AI7ToNorad, kFilterNoInput);
|
|
g_AIChip->clearClicked();
|
|
break;
|
|
case kActivationJumpToMars:
|
|
g_AIChip->showBriefingClicked();
|
|
startExtraSequenceSync(kTSA37PegasusAI6, kHintInterruption);
|
|
startExtraSequenceSync(kTSA37AI6ToMars, kFilterNoInput);
|
|
g_AIChip->clearClicked();
|
|
break;
|
|
case kActivationJumpToWSC:
|
|
g_AIChip->showBriefingClicked();
|
|
startExtraSequenceSync(kTSA37PegasusAI5, kHintInterruption);
|
|
startExtraSequenceSync(kTSA37AI5ToWSC, kFilterNoInput);
|
|
g_AIChip->clearClicked();
|
|
break;
|
|
default:
|
|
if (GameState.allTimeZonesFinished())
|
|
return "Images/AI/TSA/XT05";
|
|
|
|
return "Images/AI/TSA/XT04";
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
return movieName;
|
|
}
|
|
|
|
Common::String FullTSA::getEnvScanMovie() {
|
|
Common::String movieName = Neighborhood::getEnvScanMovie();
|
|
|
|
if (movieName.empty()) {
|
|
switch (GameState.getTSAState()) {
|
|
case kTSAPlayerNotArrived:
|
|
case kTSAPlayerForcedReview:
|
|
case kTSAPlayerDetectedRip:
|
|
case kTSAPlayerNeedsHistoricalLog:
|
|
return "Images/AI/TSA/XTE1";
|
|
default:
|
|
if (GameState.getCurrentRoom() == kTSA37) {
|
|
g_AIChip->showEnvScanClicked();
|
|
startExtraSequenceSync(kTSA37EnvironmentalScan, kHintInterruption);
|
|
|
|
switch (getCurrentActivation()) {
|
|
case kActivationJumpToPrehistoric:
|
|
startExtraSequenceSync(kTSA37AI2ToPrehistoric, kFilterNoInput);
|
|
break;
|
|
case kActivationJumpToNorad:
|
|
startExtraSequenceSync(kTSA37AI7ToNorad, kFilterNoInput);
|
|
showExtraView(kTSA37JumpToNoradMenu);
|
|
break;
|
|
case kActivationJumpToMars:
|
|
startExtraSequenceSync(kTSA37AI6ToMars, kFilterNoInput);
|
|
showExtraView(kTSA37JumpToMarsMenu);
|
|
break;
|
|
case kActivationJumpToWSC:
|
|
startExtraSequenceSync(kTSA37AI5ToWSC, kFilterNoInput);
|
|
showExtraView(kTSA37JumpToWSCMenu);
|
|
break;
|
|
default:
|
|
startExtraSequenceSync(kTSA37AI4ToMainMenu, kFilterNoInput);
|
|
break;
|
|
}
|
|
|
|
g_AIChip->clearClicked();
|
|
} else if (GameState.allTimeZonesFinished()) {
|
|
return "Images/AI/TSA/XTE1";
|
|
} else {
|
|
return "Images/AI/TSA/XTE2";
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
return movieName;
|
|
}
|
|
|
|
uint FullTSA::getNumHints() {
|
|
uint numHints = Neighborhood::getNumHints();
|
|
|
|
if (numHints == 0) {
|
|
switch (GameState.getTSAState()) {
|
|
case kRobotsAtCommandCenter:
|
|
case kRobotsAtFrontDoor:
|
|
case kRobotsAtReadyRoom:
|
|
if (GameState.getCurrentRoom() == kTSA0B && GameState.getTSA0BZoomedIn())
|
|
numHints = 3;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
return numHints;
|
|
}
|
|
|
|
Common::String FullTSA::getHintMovie(uint hintNum) {
|
|
Common::String movieName = Neighborhood::getHintMovie(hintNum);
|
|
|
|
if (movieName.empty())
|
|
movieName = Common::String::format("Images/AI/TSA/XT20NH%d", hintNum);
|
|
|
|
return movieName;
|
|
}
|
|
|
|
void FullTSA::loadAmbientLoops() {
|
|
RoomID room = GameState.getCurrentRoom();
|
|
|
|
switch (GameState.getTSAState()) {
|
|
case kTSAPlayerDetectedRip:
|
|
case kTSAPlayerNeedsHistoricalLog:
|
|
if (_vm->isDVD()) {
|
|
if ((room >= kTSA16 && room <= kTSA0B) || (room >= kTSA21Cyan && room <= kTSA24Cyan) || (room >= kTSA21Red && room <= kTSA24Red))
|
|
loadLoopSound1("Sounds/TSA/TSA CLAXON.44K.AIFF", 0x100 * 3 / 16, 0, 0);
|
|
else if (room == kTSA25Cyan || room == kTSA25Red)
|
|
loadLoopSound1("Sounds/TSA/TSA CLAXON.44K.AIFF", 0x100 / 8, 0, 0);
|
|
else
|
|
loadLoopSound1("Sounds/TSA/TSA EchoClaxon.22K.AIFF", 0x100 * 3 / 16, 0, 0);
|
|
} else {
|
|
if ((room >= kTSA16 && room <= kTSA0B) || (room >= kTSA21Cyan && room <= kTSA24Cyan) || (room >= kTSA21Red && room <= kTSA24Red))
|
|
loadLoopSound1("Sounds/TSA/TSA CLAXON.22K.AIFF", 0x100 / 4, 0, 0);
|
|
else if (room == kTSA25Cyan || room == kTSA25Red)
|
|
loadLoopSound1("Sounds/TSA/TSA CLAXON.22K.AIFF", 0x100 / 6, 0, 0);
|
|
else
|
|
loadLoopSound1("Sounds/TSA/TSA EchoClaxon.22K.AIFF", 0x100 / 4, 0, 0);
|
|
}
|
|
break;
|
|
default:
|
|
if (_vm->isDVD()) {
|
|
if ((room >= kTSA00 && room <= kTSA02) || (room >= kTSA03 && room <= kTSA15) || (room >= kTSA26 && room <= kTSA37))
|
|
loadLoopSound1("Sounds/TSA/T01NAE.NEW.32K.AIFF", 0x100 * 3 / 4, 0, 0);
|
|
else if (room >= kTSA16 && room <= kTSA0B)
|
|
loadLoopSound1("Sounds/TSA/T14SAEO1.32K.AIFF", 0x100 * 3 / 4, 0, 0);
|
|
else if (room >= kTSA21Cyan && room <= kTSA25Red)
|
|
loadLoopSound1("Sounds/TSA/T15SAE01.32K.AIFF", 0x100 * 3 / 4, 0, 0);
|
|
} else {
|
|
if ((room >= kTSA00 && room <= kTSA02) || (room >= kTSA03 && room <= kTSA15) || (room >= kTSA26 && room <= kTSA37))
|
|
loadLoopSound1("Sounds/TSA/T01NAE.NEW.22K.AIFF");
|
|
else if (room >= kTSA16 && room <= kTSA0B)
|
|
loadLoopSound1("Sounds/TSA/T14SAEO1.22K.AIFF");
|
|
else if (room >= kTSA21Cyan && room <= kTSA25Red)
|
|
loadLoopSound1("Sounds/TSA/T15SAE01.22K.AIFF");
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
short FullTSA::getStaticCompassAngle(const RoomID room, const DirectionConstant dir) {
|
|
int16 result = Neighborhood::getStaticCompassAngle(room, dir);
|
|
|
|
switch (room) {
|
|
case kTSA08:
|
|
result += kCompassShift;
|
|
break;
|
|
case kTSA09:
|
|
result -= kCompassShift;
|
|
break;
|
|
case kTSA10:
|
|
result += kCompassShift * 2;
|
|
break;
|
|
case kTSA11:
|
|
case kTSA22Cyan:
|
|
case kTSA22Red:
|
|
result -= kCompassShift * 2;
|
|
break;
|
|
case kTSA12:
|
|
result += kCompassShift * 3;
|
|
break;
|
|
case kTSA13:
|
|
result -= kCompassShift * 3;
|
|
break;
|
|
case kTSA14:
|
|
case kTSA16:
|
|
case kTSA17:
|
|
case kTSA18:
|
|
case kTSA19:
|
|
result += kCompassShift * 4;
|
|
break;
|
|
case kTSA0B:
|
|
result += kCompassShift * 4;
|
|
|
|
if (dir == kWest)
|
|
result += 30;
|
|
else if (dir == kEast)
|
|
result -= 30;
|
|
break;
|
|
case kTSA33:
|
|
result += kCompassShift * 4;
|
|
break;
|
|
case kTSA15:
|
|
case kTSA21Cyan:
|
|
case kTSA24Cyan:
|
|
case kTSA25Cyan:
|
|
case kTSA21Red:
|
|
case kTSA24Red:
|
|
case kTSA25Red:
|
|
case kTSA26:
|
|
case kTSA27:
|
|
case kTSA28:
|
|
case kTSA29:
|
|
case kTSA30:
|
|
result -= kCompassShift * 4;
|
|
break;
|
|
case kTSA23Cyan:
|
|
case kTSA23Red:
|
|
result -= kCompassShift * 6;
|
|
break;
|
|
case kTSA32:
|
|
result -= kCompassShift * 8;
|
|
break;
|
|
case kTSA34:
|
|
result -= kCompassShift * 12;
|
|
break;
|
|
case kTSA35:
|
|
result += kCompassShift * 8;
|
|
break;
|
|
case kTSA37:
|
|
result -= kCompassShift * 2;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
void FullTSA::getExitCompassMove(const ExitTable::Entry &exitEntry, FaderMoveSpec &compassMove) {
|
|
Neighborhood::getExitCompassMove(exitEntry, compassMove);
|
|
|
|
switch (MakeRoomView(exitEntry.room, exitEntry.direction)) {
|
|
case MakeRoomView(kTSA01, kSouth):
|
|
compassMove.insertFaderKnot(exitEntry.movieStart, -180);
|
|
compassMove.insertFaderKnot(exitEntry.movieStart + kFullTSAFrameDuration * 3, -180);
|
|
compassMove.insertFaderKnot(exitEntry.movieStart + kFullTSAFrameDuration * 33,
|
|
getStaticCompassAngle(exitEntry.exitRoom, exitEntry.exitDirection));
|
|
break;
|
|
case MakeRoomView(kTSA11, kEast):
|
|
if (getCurrentAlternate() == kAltTSARobotsAtReadyRoom) {
|
|
compassMove.makeTwoKnotFaderSpec(kFullTSAMovieScale, exitEntry.movieStart,
|
|
getStaticCompassAngle(kTSA11, kEast), exitEntry.movieEnd,
|
|
getStaticCompassAngle(kTSA13, kEast));
|
|
compassMove.insertFaderKnot(exitEntry.movieStart + kFullTSAFrameDuration * 13, compassMove.getNthKnotValue(1));
|
|
}
|
|
break;
|
|
case MakeRoomView(kTSA34, kNorth):
|
|
compassMove.insertFaderKnot(exitEntry.movieStart + kFullTSAFrameDuration * 48,
|
|
getStaticCompassAngle(exitEntry.room, exitEntry.direction));
|
|
compassMove.insertFaderKnot(exitEntry.movieStart + kFullTSAFrameDuration * 68,
|
|
getStaticCompassAngle(exitEntry.exitRoom, exitEntry.exitDirection));
|
|
break;
|
|
case MakeRoomView(kTSA37, kNorth):
|
|
compassMove.insertFaderKnot(exitEntry.movieStart + kFullTSAFrameDuration * 38,
|
|
getStaticCompassAngle(exitEntry.room, exitEntry.direction));
|
|
compassMove.insertFaderKnot(exitEntry.movieStart + kFullTSAFrameDuration * 64,
|
|
getStaticCompassAngle(exitEntry.room, exitEntry.direction) + kCompassShift * 3 / 2);
|
|
compassMove.insertFaderKnot(exitEntry.movieStart + kFullTSAFrameDuration * 105,
|
|
getStaticCompassAngle(exitEntry.exitRoom, exitEntry.exitDirection));
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void FullTSA::getExtraCompassMove(const ExtraTable::Entry &extraEntry, FaderMoveSpec &compassMove) {
|
|
int16 angle;
|
|
|
|
switch (extraEntry.extra) {
|
|
case kTSA0BEastTurnLeft:
|
|
case kTSA0BNorthTurnLeft:
|
|
angle =getStaticCompassAngle(GameState.getCurrentRoom(), GameState.getCurrentDirection());
|
|
compassMove.makeTwoKnotFaderSpec(_navMovie.getScale(), extraEntry.movieStart, angle,
|
|
extraEntry.movieEnd, angle - 60);
|
|
break;
|
|
case kTSA0BNorthTurnRight:
|
|
case kTSA0BWestTurnRight:
|
|
angle = getStaticCompassAngle(GameState.getCurrentRoom(), GameState.getCurrentDirection());
|
|
compassMove.makeTwoKnotFaderSpec(_navMovie.getScale(), extraEntry.movieStart, angle,
|
|
extraEntry.movieEnd, angle + 60);
|
|
break;
|
|
case kTSA22RedEastZoomInSequence:
|
|
angle = getStaticCompassAngle(GameState.getCurrentRoom(), GameState.getCurrentDirection());
|
|
compassMove.makeTwoKnotFaderSpec(_navMovie.getScale(), extraEntry.movieStart, angle,
|
|
extraEntry.movieEnd, angle);
|
|
compassMove.insertFaderKnot(extraEntry.movieStart + 1200, angle - kCompassShift * 2);
|
|
compassMove.insertFaderKnot(extraEntry.movieStart + 8160, angle - kCompassShift * 2);
|
|
compassMove.insertFaderKnot(extraEntry.movieStart + 9840, angle);
|
|
break;
|
|
case kTSA23RedWestVaultZoomInSequence:
|
|
angle = getStaticCompassAngle(GameState.getCurrentRoom(), GameState.getCurrentDirection());
|
|
compassMove.makeTwoKnotFaderSpec(_navMovie.getScale(), extraEntry.movieStart, angle,
|
|
extraEntry.movieEnd, angle);
|
|
compassMove.insertFaderKnot(extraEntry.movieStart + 1200, angle - kCompassShift * 2);
|
|
compassMove.insertFaderKnot(extraEntry.movieStart + 10100, angle - kCompassShift * 2);
|
|
compassMove.insertFaderKnot(extraEntry.movieStart + 11880, angle);
|
|
break;
|
|
default:
|
|
Neighborhood::getExtraCompassMove(extraEntry, compassMove);
|
|
break;
|
|
}
|
|
}
|
|
|
|
uint16 FullTSA::getDateResID() const {
|
|
return kDate2318ID;
|
|
}
|
|
|
|
TimeValue FullTSA::getViewTime(const RoomID room, const DirectionConstant direction) {
|
|
ExtraID extraID = 0xffffffff;
|
|
|
|
switch (MakeRoomView(room, direction)) {
|
|
case MakeRoomView(kTSA0B, kEast):
|
|
if (GameState.getTSA0BZoomedIn())
|
|
switch (GameState.getTSAState()) {
|
|
case kTSAPlayerInstalledHistoricalLog:
|
|
case kTSABossSawHistoricalLog:
|
|
case kRobotsAtCommandCenter:
|
|
case kRobotsAtFrontDoor:
|
|
case kRobotsAtReadyRoom:
|
|
extraID = s_historicalLogViews[getHistoricalLogIndex()];
|
|
break;
|
|
default:
|
|
extraID = kTSA0BEastZoomedView;
|
|
break;
|
|
}
|
|
break;
|
|
case MakeRoomView(kTSA0B, kNorth):
|
|
if (GameState.getTSA0BZoomedIn())
|
|
switch (GameState.getTSAState()) {
|
|
case kTSAPlayerNeedsHistoricalLog:
|
|
extraID = kTSA0BNorthRipView1;
|
|
break;
|
|
default:
|
|
extraID = kTSA0BNorthZoomedView;
|
|
break;
|
|
}
|
|
break;
|
|
case MakeRoomView(kTSA0B, kWest):
|
|
if (GameState.getTSA0BZoomedIn())
|
|
extraID = kTSA0BWestZoomedView;
|
|
break;
|
|
case MakeRoomView(kTSA22Red, kEast):
|
|
if (_privateFlags.getFlag(kTSAPrivateKeyVaultOpenFlag)) {
|
|
if (_vm->itemInLocation(kJourneymanKey, kFullTSAID, kTSA22Red, kEast))
|
|
extraID = kTSA22RedEastVaultViewWithKey;
|
|
else
|
|
extraID = kTSA22RedEastVaultViewNoKey;
|
|
}
|
|
break;
|
|
case MakeRoomView(kTSA23Red, kWest):
|
|
if (_privateFlags.getFlag(kTSAPrivateChipVaultOpenFlag)) {
|
|
if (_vm->itemInLocation(kPegasusBiochip, kFullTSAID, kTSA23Red, kWest))
|
|
extraID = kTSA23RedWestVaultViewWithChips;
|
|
else
|
|
extraID = kTSA23RedWestVaultViewNoChips;
|
|
}
|
|
break;
|
|
case MakeRoomView(kTSA37, kNorth):
|
|
switch (GameState.getTSAState()) {
|
|
case kTSAPlayerGotHistoricalLog:
|
|
extraID = kTSA37ReviewRequiredToExit;
|
|
break;
|
|
case kPlayerFinishedWithTSA:
|
|
extraID = kTSA37CongratulationsToExit;
|
|
break;
|
|
default:
|
|
extraID = kTSA37AI3ToHorse;
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (extraID != 0xffffffff) {
|
|
ExtraTable::Entry entry;
|
|
getExtraEntry(extraID, entry);
|
|
return entry.movieEnd - 1;
|
|
}
|
|
|
|
return Neighborhood::getViewTime(room, direction);
|
|
}
|
|
|
|
void FullTSA::findSpotEntry(const RoomID room, const DirectionConstant direction, SpotFlags flags, SpotTable::Entry &entry) {
|
|
switch (MakeRoomView(room, direction)) {
|
|
case MakeRoomView(kTSA0B, kNorth):
|
|
case MakeRoomView(kTSA0B, kEast):
|
|
case MakeRoomView(kTSA0B, kWest):
|
|
if (!GameState.getTSA0BZoomedIn())
|
|
Neighborhood::findSpotEntry(room, direction, flags, entry);
|
|
break;
|
|
default:
|
|
Neighborhood::findSpotEntry(room, direction, flags, entry);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void FullTSA::getExtraEntry(const uint32 id, ExtraTable::Entry &extraEntry) {
|
|
Neighborhood::getExtraEntry(id, extraEntry);
|
|
|
|
if (id == kTSA0BShowGuardRobots)
|
|
extraEntry.movieStart += kFullTSAFrameDuration * 3;
|
|
}
|
|
|
|
void FullTSA::showViewFrame(TimeValue viewTime) {
|
|
if ((int32)viewTime >= 0) {
|
|
_turnPush.hide();
|
|
_navMovie.stop();
|
|
_navMovie.setFlags(0);
|
|
if (_blankMovie.isMovieValid() &&
|
|
(GameState.getTSAState() == kRobotsAtCommandCenter ||
|
|
GameState.getTSAState() == kRobotsAtFrontDoor ||
|
|
GameState.getTSAState() == kRobotsAtReadyRoom) &&
|
|
(GameState.getCurrentRoom() == kTSA0A ||
|
|
GameState.getCurrentRoom() == kTSA06) &&
|
|
(GameState.getCurrentDirection() == kEast ||
|
|
GameState.getCurrentDirection() == kWest)) {
|
|
viewTime = 0;
|
|
if (GameState.getCurrentRoom() == kTSA06)
|
|
viewTime = 2 * _blankMovie.getScale();
|
|
if (GameState.getCurrentDirection() == kWest)
|
|
viewTime += _blankMovie.getScale();
|
|
|
|
_navMovie.hide();
|
|
_blankMovie.setSegment(0, _blankMovie.getDuration());
|
|
_blankMovie.setTime(viewTime);
|
|
|
|
Common::Rect pushBounds;
|
|
_turnPush.getBounds(pushBounds);
|
|
|
|
_blankMovie.moveElementTo(pushBounds.left, pushBounds.top);
|
|
_blankMovie.show();
|
|
_blankMovie.redrawMovieWorld();
|
|
} else {
|
|
_blankMovie.hide();
|
|
_navMovie.setSegment(0, _navMovie.getDuration());
|
|
_navMovie.setTime(viewTime);
|
|
|
|
Common::Rect pushBounds;
|
|
_turnPush.getBounds(pushBounds);
|
|
|
|
_navMovie.moveElementTo(pushBounds.left, pushBounds.top);
|
|
_navMovie.show();
|
|
_navMovie.redrawMovieWorld();
|
|
}
|
|
}
|
|
}
|
|
|
|
void FullTSA::pickedUpItem(Item *item) {
|
|
BiochipItem *biochip;
|
|
|
|
switch (item->getObjectID()) {
|
|
case kJourneymanKey:
|
|
GameState.setScoringGotJourneymanKey(true);
|
|
break;
|
|
case kPegasusBiochip:
|
|
biochip = (BiochipItem *)_vm->getAllItems().findItemByID(kMapBiochip);
|
|
_vm->addItemToBiochips(biochip);
|
|
GameState.setScoringGotPegasusBiochip(true);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void FullTSA::playExtraMovie(const ExtraTable::Entry &extraEntry, const NotificationFlags flags, const InputBits interruptionInput) {
|
|
switch (extraEntry.extra) {
|
|
case kTSA0BNorthZoomIn:
|
|
if (_privateFlags.getFlag(kTSAPrivateLogReaderOpenFlag)) {
|
|
_privateFlags.setFlag(kTSAPrivateLogReaderOpenFlag, false);
|
|
requestExtraSequence(kTSA0BNorthHistLogClose, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA0BNorthZoomIn, kExtraCompletedFlag, kFilterNoInput);
|
|
} else {
|
|
Neighborhood::playExtraMovie(extraEntry, flags, interruptionInput);
|
|
}
|
|
break;
|
|
case kTSA0BNorthZoomOut:
|
|
if (_ripTimer.isVisible())
|
|
_ripTimer.hide();
|
|
|
|
shutDownRobotMonitor();
|
|
Neighborhood::playExtraMovie(extraEntry, flags, interruptionInput);
|
|
break;
|
|
case kTSA0BEastZoomOut:
|
|
shutDownComparisonMonitor();
|
|
Neighborhood::playExtraMovie(extraEntry, flags, interruptionInput);
|
|
break;
|
|
default:
|
|
Neighborhood::playExtraMovie(extraEntry, flags, interruptionInput);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void FullTSA::startDoorOpenMovie(const TimeValue startTime, const TimeValue stopTime) {
|
|
switch (GameState.getCurrentRoomAndView()) {
|
|
case MakeRoomView(kTSA00, kNorth):
|
|
if (GameState.getLastNeighborhood() != kFullTSAID) {
|
|
startExtraSequence(kTSAArriveFromCaldoria, kDoorOpenCompletedFlag, kFilterNoInput);
|
|
return;
|
|
}
|
|
break;
|
|
case MakeRoomView(kTSA02, kNorth):
|
|
if (!GameState.getTSAIDedAtDoor()) {
|
|
GameState.setTSAIDedAtDoor(true);
|
|
requestExtraSequence(kTSA02NorthZoomIn, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA02NorthTenSecondDoor, 0, kFilterNoInput);
|
|
|
|
if (GameState.getTSASeenAgent3AtDoor()) {
|
|
requestExtraSequence(kTSA02NorthZoomOut, kExtraCompletedFlag, kFilterNoInput);
|
|
} else {
|
|
GameState.setTSASeenAgent3AtDoor(true);
|
|
requestExtraSequence(kTSA02NorthZoomOut, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA02NorthDoorWithAgent3, kDoorOpenCompletedFlag, kFilterNoInput);
|
|
}
|
|
return;
|
|
}
|
|
break;
|
|
case MakeRoomView(kTSA03, kSouth):
|
|
if (GameState.getTSAState() == kRobotsAtFrontDoor) {
|
|
playDeathExtra(kTSA03SouthRobotDeath, kDeathShotByTSARobots);
|
|
return;
|
|
}
|
|
break;
|
|
case MakeRoomView(kTSA16, kNorth):
|
|
if (GameState.getTSAState() == kRobotsAtCommandCenter) {
|
|
playDeathExtra(kTSA16NorthRobotDeath, kDeathShotByTSARobots);
|
|
return;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
Neighborhood::startDoorOpenMovie(startTime, stopTime);
|
|
}
|
|
|
|
void FullTSA::startTurnPush(const TurnDirection turnDirection, const TimeValue newView, const DirectionConstant nextDir) {
|
|
if (g_AIArea)
|
|
g_AIArea->lockAIOut();
|
|
|
|
_vm->_cursor->hide();
|
|
|
|
GameState.setNextDirection(nextDir);
|
|
|
|
_interruptionFilter = kFilterNoInput;
|
|
_turnPush.stopFader();
|
|
|
|
// Set up callback.
|
|
_turnPushCallBack.setCallBackFlag(kTurnCompletedFlag);
|
|
_turnPushCallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
|
|
|
|
// Stop nav movie.
|
|
_navMovie.stop();
|
|
_navMovie.setFlags(0);
|
|
|
|
if (_blankMovie.isMovieValid() &&
|
|
(GameState.getTSAState() == kRobotsAtCommandCenter ||
|
|
GameState.getTSAState() == kRobotsAtFrontDoor ||
|
|
GameState.getTSAState() == kRobotsAtReadyRoom) &&
|
|
(GameState.getCurrentRoom() == kTSA0A || GameState.getCurrentRoom() == kTSA06) &&
|
|
(nextDir == kEast || nextDir == kWest)) {
|
|
TimeValue newRobotView = 0;
|
|
if (GameState.getCurrentRoom() == kTSA06)
|
|
newRobotView = 2 * _blankMovie.getScale();
|
|
if (nextDir == kWest)
|
|
newRobotView += _blankMovie.getScale();
|
|
|
|
_blankMovie.setSegment(0, _blankMovie.getDuration());
|
|
|
|
_pushIn.initFromMovieFrame(_blankMovie.getMovie(), newRobotView);
|
|
_turnPush.setInAndOutElements(&_pushIn, &_navMovie);
|
|
} else {
|
|
// Set segment of nav movie to whole movie, so that subsequent initFromMovieFrame
|
|
// will work.
|
|
_navMovie.setSegment(0, _navMovie.getDuration());
|
|
|
|
_pushIn.initFromMovieFrame(_navMovie.getMovie(), newView);
|
|
if (_blankMovie.isMovieValid() &&
|
|
(GameState.getTSAState() == kRobotsAtCommandCenter ||
|
|
GameState.getTSAState() == kRobotsAtFrontDoor ||
|
|
GameState.getTSAState() == kRobotsAtReadyRoom) &&
|
|
(GameState.getCurrentRoom() == kTSA0A ||
|
|
GameState.getCurrentRoom() == kTSA06))
|
|
_turnPush.setInAndOutElements(&_pushIn, &_blankMovie);
|
|
else
|
|
_turnPush.setInAndOutElements(&_pushIn, &_navMovie);
|
|
}
|
|
|
|
_blankMovie.hide();
|
|
_navMovie.hide();
|
|
|
|
switch (turnDirection) {
|
|
case kTurnLeft:
|
|
_turnPush.setSlideDirection(kSlideRightMask);
|
|
break;
|
|
case kTurnRight:
|
|
_turnPush.setSlideDirection(kSlideLeftMask);
|
|
break;
|
|
case kTurnUp:
|
|
_turnPush.setSlideDirection(kSlideDownMask);
|
|
break;
|
|
case kTurnDown:
|
|
_turnPush.setSlideDirection(kSlideUpMask);
|
|
break;
|
|
}
|
|
|
|
_turnPush.show();
|
|
|
|
FaderMoveSpec moveSpec;
|
|
moveSpec.makeTwoKnotFaderSpec(60, 0, 0, 15, 1000);
|
|
_turnPush.startFader(moveSpec);
|
|
|
|
if (g_compass) {
|
|
_turnPush.pauseFader();
|
|
|
|
int32 startAngle = getStaticCompassAngle(GameState.getCurrentRoom(), GameState.getCurrentDirection());
|
|
int32 stopAngle = getStaticCompassAngle(GameState.getCurrentRoom(), nextDir);
|
|
|
|
if (turnDirection == kTurnLeft) {
|
|
if (startAngle < stopAngle)
|
|
startAngle += 360;
|
|
} else {
|
|
if (stopAngle < startAngle)
|
|
stopAngle += 360;
|
|
}
|
|
|
|
FaderMoveSpec turnSpec;
|
|
_turnPush.getCurrentFaderMove(turnSpec);
|
|
|
|
FaderMoveSpec compassMove;
|
|
compassMove.makeTwoKnotFaderSpec(turnSpec.getFaderScale(), turnSpec.getNthKnotTime(0), startAngle, turnSpec.getNthKnotTime(1), stopAngle);
|
|
g_compass->startFader(compassMove);
|
|
}
|
|
|
|
_turnPushCallBack.cancelCallBack();
|
|
_turnPush.continueFader();
|
|
|
|
do {
|
|
InputDevice.pumpEvents();
|
|
|
|
_vm->checkCallBacks();
|
|
_vm->refreshDisplay();
|
|
_vm->_system->delayMillis(10);
|
|
} while (_turnPush.isFading());
|
|
|
|
_turnPush.stopFader();
|
|
_neighborhoodNotification.setNotificationFlags(kTurnCompletedFlag, kTurnCompletedFlag);
|
|
}
|
|
|
|
InputBits FullTSA::getInputFilter() {
|
|
InputBits result = Neighborhood::getInputFilter();
|
|
|
|
switch (GameState.getCurrentRoom()) {
|
|
case kTSA0B:
|
|
if (GameState.getT0BMonitorMode() != kMonitorNeutral)
|
|
// Only allow a click.
|
|
result &= JMPPPInput::getClickInputFilter();
|
|
break;
|
|
case kTSA37:
|
|
// Can't move forward in Pegasus. Only press the exit button.
|
|
result &= ~(kFilterUpButton | kFilterUpAuto);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
void FullTSA::turnLeft() {
|
|
switch (GameState.getCurrentRoomAndView()) {
|
|
case MakeRoomView(kTSA15, kNorth):
|
|
if (GameState.getTSAState() == kTSAPlayerNeedsHistoricalLog)
|
|
setCurrentAlternate(kAltTSANormal);
|
|
break;
|
|
case MakeRoomView(kTSA0B, kNorth):
|
|
if (_ripTimer.isVisible())
|
|
_ripTimer.hide();
|
|
releaseSprites();
|
|
break;
|
|
case MakeRoomView(kTSA0B, kEast):
|
|
shutDownComparisonMonitor();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
Neighborhood::turnLeft();
|
|
}
|
|
|
|
void FullTSA::turnRight() {
|
|
switch (GameState.getCurrentRoomAndView()) {
|
|
case MakeRoomView(kTSA15, kSouth):
|
|
if (GameState.getTSAState() == kTSAPlayerNeedsHistoricalLog)
|
|
setCurrentAlternate(kAltTSANormal);
|
|
break;
|
|
case MakeRoomView(kTSA0B, kNorth):
|
|
if (_ripTimer.isVisible())
|
|
_ripTimer.hide();
|
|
releaseSprites();
|
|
break;
|
|
case MakeRoomView(kTSA0B, kEast):
|
|
shutDownComparisonMonitor();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
Neighborhood::turnRight();
|
|
}
|
|
|
|
void FullTSA::openDoor() {
|
|
FaderMoveSpec spec;
|
|
|
|
switch (GameState.getCurrentRoomAndView()) {
|
|
case MakeRoomView(kTSA14, kSouth):
|
|
if (_vm->isDVD()) {
|
|
spec.makeTwoKnotFaderSpec(10, 0, 255, 5, 0);
|
|
_entranceFader.startFader(spec);
|
|
}
|
|
break;
|
|
case MakeRoomView(kTSA15, kSouth):
|
|
if (_vm->isDVD()) {
|
|
spec.makeTwoKnotFaderSpec(10, 0, 255, 5, 0);
|
|
_entranceFader.startFader(spec);
|
|
}
|
|
if (GameState.getTSAState() == kTSAPlayerNeedsHistoricalLog || GameState.getTSAState() == kRobotsAtFrontDoor)
|
|
setCurrentAlternate(kAltTSARedAlert);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
Neighborhood::openDoor();
|
|
}
|
|
|
|
void FullTSA::doorOpened() {
|
|
if (_vm->isDVD()) {
|
|
switch (GameState.getCurrentRoomAndView()) {
|
|
case MakeRoomView(kTSA02, kNorth):
|
|
if (_lastExtra == kTSA02NorthDoorWithAgent3 && g_arthurChip) {
|
|
if (_vm->getRandomBit())
|
|
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB36", kArthurTSASawAgent3);
|
|
else
|
|
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB37", kArthurTSASawAgent3);
|
|
}
|
|
break;
|
|
case MakeRoomView(kTSA16, kSouth):
|
|
case MakeRoomView(kTSA21Cyan, kSouth):
|
|
_entranceMusic.stopSound();
|
|
break;
|
|
}
|
|
}
|
|
Neighborhood::doorOpened();
|
|
}
|
|
|
|
CanMoveForwardReason FullTSA::canMoveForward(ExitTable::Entry &entry) {
|
|
if (GameState.getCurrentRoomAndView() == MakeRoomView(kTSA25Red, kNorth))
|
|
return kCantMoveBlocked;
|
|
|
|
return Neighborhood::canMoveForward(entry);
|
|
}
|
|
|
|
void FullTSA::moveForward() {
|
|
ExitTable::Entry exitEntry;
|
|
CanMoveForwardReason moveReason = kCanMoveForward;
|
|
FaderMoveSpec spec;
|
|
|
|
if (_vm->isDVD()) {
|
|
moveReason = canMoveForward(exitEntry);
|
|
if (moveReason == kCanMoveForward &&
|
|
GameState.getCurrentRoomAndView() == MakeRoomView(kTSA02, kNorth) &&
|
|
!GameState.allTimeZonesFinished()) {
|
|
_entranceMusic.playSound();
|
|
spec.makeOneKnotFaderSpec(255);
|
|
_entranceFader.startFader(spec);
|
|
}
|
|
}
|
|
Neighborhood::moveForward();
|
|
if (moveReason == kCanMoveForward && GameState.getCurrentRoomAndView() == MakeRoomView(kTSA01, kSouth) &&
|
|
GameState.allTimeZonesFinished() && g_arthurChip)
|
|
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA51", kArthurTSALeaving);
|
|
}
|
|
|
|
CanOpenDoorReason FullTSA::canOpenDoor(DoorTable::Entry &entry) {
|
|
switch (GameState.getCurrentRoomAndView()) {
|
|
case MakeRoomView(kTSA02, kNorth):
|
|
if (!GameState.getTSAFrontDoorUnlockedOutside())
|
|
return kCantOpenLocked;
|
|
break;
|
|
case MakeRoomView(kTSA03, kSouth):
|
|
if (!GameState.getTSAFrontDoorUnlockedInside())
|
|
return kCantOpenLocked;
|
|
break;
|
|
case MakeRoomView(kTSA16, kNorth):
|
|
if (GameState.getTSACommandCenterLocked())
|
|
return kCantOpenLocked;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return Neighborhood::canOpenDoor(entry);
|
|
}
|
|
|
|
void FullTSA::bumpIntoWall() {
|
|
requestSpotSound(kTSABumpIntoWallIn, kTSABumpIntoWallOut, kFilterAllInput, 0);
|
|
Neighborhood::bumpIntoWall();
|
|
}
|
|
|
|
void FullTSA::downButton(const Input &input) {
|
|
switch (GameState.getCurrentRoomAndView()) {
|
|
case MakeRoomView(kTSA0B, kEast):
|
|
if (GameState.getTSA0BZoomedIn())
|
|
startExtraSequence(kTSA0BEastZoomOut, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case MakeRoomView(kTSA0B, kNorth):
|
|
if (GameState.getTSA0BZoomedIn())
|
|
startExtraSequence(kTSA0BNorthZoomOut, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case MakeRoomView(kTSA0B, kWest):
|
|
if (GameState.getTSA0BZoomedIn() && GameState.getT0BMonitorMode() == kMonitorNeutral)
|
|
startExtraSequence(kTSA0BWestZoomOut, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
default:
|
|
Neighborhood::downButton(input);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void FullTSA::activateOneHotspot(HotspotInfoTable::Entry &entry, Hotspot *spot) {
|
|
switch (spot->getObjectID()) {
|
|
case kTSA0BEastLeftRewindSpotID:
|
|
case kTSA0BEastLeftPlaySpotID:
|
|
if (_privateFlags.getFlag(kTSAPrivatePlayingRightComparisonFlag))
|
|
spot->setInactive();
|
|
else
|
|
Neighborhood::activateOneHotspot(entry, spot);
|
|
break;
|
|
case kTSA0BEastRightRewindSpotID:
|
|
case kTSA0BEastRightPlaySpotID:
|
|
if (_privateFlags.getFlag(kTSAPrivatePlayingLeftComparisonFlag))
|
|
spot->setInactive();
|
|
else
|
|
Neighborhood::activateOneHotspot(entry, spot);
|
|
break;
|
|
default:
|
|
Neighborhood::activateOneHotspot(entry, spot);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void FullTSA::activateHotspots() {
|
|
Neighborhood::activateHotspots();
|
|
|
|
switch (MakeRoomView(GameState.getCurrentRoom(), GameState.getCurrentDirection())) {
|
|
case MakeRoomView(kTSA02, kNorth):
|
|
if (!GameState.getTSAFrontDoorUnlockedOutside())
|
|
_vm->getAllHotspots().activateOneHotspot(kTSA02DoorSpotID);
|
|
break;
|
|
case MakeRoomView(kTSA0A, kEast):
|
|
if (GameState.getTSAState() == kRobotsAtCommandCenter ||
|
|
GameState.getTSAState() == kRobotsAtFrontDoor ||
|
|
GameState.getTSAState() == kRobotsAtReadyRoom)
|
|
_vm->getAllHotspots().deactivateOneHotspot(kTSA0AEastSpotID);
|
|
break;
|
|
case MakeRoomView(kTSA0A, kWest):
|
|
if (GameState.getTSAState() == kRobotsAtCommandCenter ||
|
|
GameState.getTSAState() == kRobotsAtFrontDoor ||
|
|
GameState.getTSAState() == kRobotsAtReadyRoom)
|
|
_vm->getAllHotspots().deactivateOneHotspot(kTSA0AWastSpotID);
|
|
break;
|
|
case MakeRoomView(kTSA0B, kEast):
|
|
if (GameState.getTSA0BZoomedIn())
|
|
switch (GameState.getTSAState()) {
|
|
case kTSAPlayerInstalledHistoricalLog:
|
|
case kTSABossSawHistoricalLog:
|
|
case kRobotsAtCommandCenter:
|
|
case kRobotsAtFrontDoor:
|
|
case kRobotsAtReadyRoom:
|
|
if (getCurrentActivation() != kActivateTSA0BComparisonVideo) {
|
|
_vm->getAllHotspots().activateOneHotspot(kTSA0BEastCompareNoradSpotID);
|
|
_vm->getAllHotspots().activateOneHotspot(kTSA0BEastCompareMarsSpotID);
|
|
_vm->getAllHotspots().activateOneHotspot(kTSA0BEastCompareCaldoriaSpotID);
|
|
_vm->getAllHotspots().activateOneHotspot(kTSA0BEastCompareWSCSpotID);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case MakeRoomView(kTSA0B, kNorth):
|
|
if (GameState.getTSA0BZoomedIn())
|
|
switch (GameState.getTSAState()) {
|
|
case kRobotsAtCommandCenter:
|
|
case kRobotsAtFrontDoor:
|
|
case kRobotsAtReadyRoom:
|
|
_vm->getAllHotspots().activateOneHotspot(kTSA0BNorthRobotsToCommandCenterSpotID);
|
|
_vm->getAllHotspots().activateOneHotspot(kTSA0BNorthRobotsToReadyRoomSpotID);
|
|
_vm->getAllHotspots().activateOneHotspot(kTSA0BNorthRobotsToFrontDoorSpotID);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void FullTSA::clickInHotspot(const Input &input, const Hotspot *clickedSpot) {
|
|
switch (clickedSpot->getObjectID()) {
|
|
case kTSAGTOtherSpotID:
|
|
showExtraView(kTSAGTOtherChoice);
|
|
playSpotSoundSync(kTSANoOtherDestinationIn, kTSANoOtherDestinationOut);
|
|
showExtraView(kTSAGTCardSwipe);
|
|
break;
|
|
case kTSA02DoorSpotID:
|
|
GameState.setTSAFrontDoorUnlockedOutside(true);
|
|
Neighborhood::clickInHotspot(input, clickedSpot);
|
|
break;
|
|
case kTSA03EastJimenezSpotID:
|
|
if (_vm->isDVD() && JMPPPInput::isEasterEggModifierInput(input))
|
|
startExtraSequence(kEasterEggJimenez, kExtraCompletedFlag, kFilterNoInput);
|
|
else
|
|
startExtraLongSequence(kTSA03JimenezZoomIn, kTSA03JimenezZoomOut, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kTSA03WestCrenshawSpotID:
|
|
startExtraLongSequence(kTSA03CrenshawZoomIn, kTSA03CrenshawZoomOut, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kTSA04EastMatsumotoSpotID:
|
|
startExtraLongSequence(kTSA04MatsumotoZoomIn, kTSA04MatsumotoZoomOut, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kTSA04WestCastilleSpotID:
|
|
if (_vm->isDVD() && JMPPPInput::isEasterEggModifierInput(input))
|
|
startExtraSequence(kEasterEggCastillo, kExtraCompletedFlag, kFilterNoInput);
|
|
else
|
|
startExtraLongSequence(kTSA04CastilleZoomIn, kTSA04CastilleZoomOut, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kTSA05EastSinclairSpotID:
|
|
if (_vm->isDVD() && JMPPPInput::isEasterEggModifierInput(input))
|
|
startExtraSequence(kEasterEggSinclair, kExtraCompletedFlag, kFilterNoInput);
|
|
else
|
|
startExtraLongSequence(kTSA05SinclairZoomIn, kTSA05SinclairZoomOut, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kTSA05WestWhiteSpotID:
|
|
startExtraLongSequence(kTSA05WhiteZoomIn, kTSA05WhiteZoomOut, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kTSA0BEastCompareNoradSpotID:
|
|
initializeComparisonMonitor(kMonitorNoradComparison, kTSA0BNoradComparisonView);
|
|
break;
|
|
case kTSA0BEastCompareMarsSpotID:
|
|
initializeComparisonMonitor(kMonitorMarsComparison, kTSA0BMarsComparisonView);
|
|
break;
|
|
case kTSA0BEastCompareCaldoriaSpotID:
|
|
initializeComparisonMonitor(kMonitorCaldoriaComparison, kTSA0BCaldoriaComparisonView);
|
|
break;
|
|
case kTSA0BEastCompareWSCSpotID:
|
|
initializeComparisonMonitor(kMonitorWSCComparison, kTSA0BWSCComparisonView);
|
|
break;
|
|
case kTSA0BEastCloseVideoSpotID:
|
|
_navMovie.stop();
|
|
_sprite3.show();
|
|
_vm->delayShell(1, 2);
|
|
_sprite3.hide();
|
|
initializeComparisonMonitor(kMonitorNeutral, 0);
|
|
break;
|
|
case kTSA0BEastLeftPlaySpotID:
|
|
playLeftComparison();
|
|
break;
|
|
case kTSA0BEastRightPlaySpotID:
|
|
playRightComparison();
|
|
break;
|
|
|
|
// Command center
|
|
case kTSA0BWestTheorySpotID:
|
|
initializeTBPMonitor(kMonitorTheory, kTSA0BTBPTheoryHighlight);
|
|
break;
|
|
case kTSA0BWestBackgroundSpotID:
|
|
initializeTBPMonitor(kMonitorBackground, kTSA0BTBPBackgroundHighlight);
|
|
break;
|
|
case kTSA0BWestProcedureSpotID:
|
|
initializeTBPMonitor(kMonitorProcedure, kTSA0BTBPProcedureHighlight);
|
|
break;
|
|
case kTSA0BWestCloseVideoSpotID:
|
|
_navMovie.stop();
|
|
_sprite2.show();
|
|
_vm->delayShell(1, 2);
|
|
_sprite2.hide();
|
|
initializeTBPMonitor(kMonitorNeutral, 0);
|
|
break;
|
|
case kTSA0BWestPlayVideoSpotID:
|
|
playTBPMonitor();
|
|
break;
|
|
case kTSA0BEastLeftRewindSpotID:
|
|
case kTSA0BEastRightRewindSpotID:
|
|
case kTSA0BWestRewindVideoSpotID:
|
|
if ((GameState.getT0BMonitorMode() & kPlayingAnyMask) != 0) {
|
|
bool playing = _navMovie.isRunning();
|
|
if (playing)
|
|
_navMovie.stop();
|
|
|
|
if (clickedSpot->getObjectID() == kTSA0BEastRightRewindSpotID)
|
|
_sprite2.show();
|
|
else
|
|
_sprite1.show();
|
|
|
|
_vm->delayShell(1, 2);
|
|
|
|
if (clickedSpot->getObjectID() == kTSA0BEastRightRewindSpotID)
|
|
_sprite2.hide();
|
|
else
|
|
_sprite1.hide();
|
|
|
|
_navMovie.setTime(GameState.getT0BMonitorStart());
|
|
|
|
if (playing) {
|
|
_navMovie.start();
|
|
} else {
|
|
_privateFlags.setFlag(kTSAPrivatePlayingLeftComparisonFlag, false);
|
|
_privateFlags.setFlag(kTSAPrivatePlayingRightComparisonFlag, false);
|
|
}
|
|
}
|
|
break;
|
|
case kTSA22EastMonitorSpotID:
|
|
requestExtraSequence(kTSA22RedEastZoomInSequence, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kTSA23WestMonitorSpotID:
|
|
requestExtraSequence(kTSA23RedWestVaultZoomInSequence, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kTSA0BNorthRobotsToCommandCenterSpotID:
|
|
_sprite1.setCurrentFrameIndex(kRedirectionCCDoorSprite);
|
|
_sprite1.show();
|
|
_vm->delayShell(1, 2);
|
|
_sprite1.hide();
|
|
|
|
switch (GameState.getTSAState()) {
|
|
case kRobotsAtCommandCenter:
|
|
// Nothing
|
|
break;
|
|
case kRobotsAtFrontDoor:
|
|
GameState.setTSAState(kRobotsAtCommandCenter);
|
|
_sprite2.setCurrentFrameIndex(kRedirectionNewTargetSprite);
|
|
startExtraSequence(kTSA0BRobotsFromFrontDoorToCommandCenter, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kRobotsAtReadyRoom:
|
|
GameState.setTSAState(kRobotsAtCommandCenter);
|
|
_sprite2.setCurrentFrameIndex(kRedirectionNewTargetSprite);
|
|
startExtraSequence(kTSA0BRobotsFromReadyRoomToCommandCenter, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case kTSA0BNorthRobotsToReadyRoomSpotID:
|
|
_sprite1.setCurrentFrameIndex(kRedirectionRRDoorSprite);
|
|
_sprite1.show();
|
|
_vm->delayShell(1, 2);
|
|
_sprite1.hide();
|
|
|
|
switch (GameState.getTSAState()) {
|
|
case kRobotsAtCommandCenter:
|
|
GameState.setTSAState(kRobotsAtReadyRoom);
|
|
_sprite2.setCurrentFrameIndex(kRedirectionNewTargetSprite);
|
|
startExtraSequence(kTSA0BRobotsFromCommandCenterToReadyRoom, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kRobotsAtFrontDoor:
|
|
GameState.setTSAState(kRobotsAtReadyRoom);
|
|
_sprite2.setCurrentFrameIndex(kRedirectionNewTargetSprite);
|
|
startExtraSequence(kTSA0BRobotsFromFrontDoorToReadyRoom, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kRobotsAtReadyRoom:
|
|
// Nothing
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case kTSA0BNorthRobotsToFrontDoorSpotID:
|
|
_sprite1.setCurrentFrameIndex(kRedirectionFDDoorSprite);
|
|
_sprite1.show();
|
|
_vm->delayShell(1, 2);
|
|
_sprite1.hide();
|
|
|
|
switch (GameState.getTSAState()) {
|
|
case kRobotsAtCommandCenter:
|
|
GameState.setTSAState(kRobotsAtFrontDoor);
|
|
_sprite2.setCurrentFrameIndex(kRedirectionNewTargetSprite);
|
|
startExtraSequence(kTSA0BRobotsFromCommandCenterToFrontDoor, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kRobotsAtFrontDoor:
|
|
// Nothing
|
|
break;
|
|
case kRobotsAtReadyRoom:
|
|
GameState.setTSAState(kRobotsAtFrontDoor);
|
|
_sprite2.setCurrentFrameIndex(kRedirectionNewTargetSprite);
|
|
startExtraSequence(kTSA0BRobotsFromReadyRoomToFrontDoor, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
// Pegasus
|
|
case kTSA37NorthJumpToPrehistoricSpotID:
|
|
startExtraSequence(kTSA37PegasusDepart, kExtraCompletedFlag, kFilterNoInput);
|
|
if (g_arthurChip) {
|
|
if (_vm->getRandomBit())
|
|
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA30", kArthurTSAUsedPegasus);
|
|
else
|
|
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA35", kArthurTSAUsedPegasus);
|
|
}
|
|
break;
|
|
case kTSA37NorthExitSpotID:
|
|
_sprite2.setCurrentFrameIndex(1);
|
|
_vm->delayShell(1, 2);
|
|
releaseSprites();
|
|
moveForward();
|
|
break;
|
|
case kTSA37NorthJumpMenuSpotID:
|
|
_sprite2.setCurrentFrameIndex(1);
|
|
_vm->delayShell(1, 2);
|
|
releaseSprites();
|
|
break;
|
|
case kTSA37NorthJumpToNoradSpotID:
|
|
GameState.setTSAState(kPlayerOnWayToNorad);
|
|
requestExtraSequence(kTSA37JumpToNorad, 0, kFilterNoInput);
|
|
|
|
if (!GameState.getBeenToNorad()) {
|
|
requestExtraSequence(kTSA37NoradToAI7, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA37PegasusAI7, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA37AI7ToNorad, 0, kFilterNoInput);
|
|
GameState.setBeenToNorad(true);
|
|
}
|
|
|
|
requestExtraSequence(kTSA37NoradToDepart, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA37PegasusDepart, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kTSA37NorthJumpToMarsSpotID:
|
|
GameState.setTSAState(kPlayerOnWayToMars);
|
|
requestExtraSequence(kTSA37JumpToMars, 0, kFilterNoInput);
|
|
|
|
if (!GameState.getBeenToMars()) {
|
|
requestExtraSequence(kTSA37MarsToAI6, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA37PegasusAI6, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA37AI6ToMars, 0, kFilterNoInput);
|
|
GameState.setBeenToMars(true);
|
|
}
|
|
|
|
requestExtraSequence(kTSA37MarsToDepart, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA37PegasusDepart, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kTSA37NorthJumpToWSCSpotID:
|
|
GameState.setTSAState(kPlayerOnWayToWSC);
|
|
requestExtraSequence(kTSA37JumpToWSC, 0, kFilterNoInput);
|
|
|
|
if (!GameState.getBeenToWSC()) {
|
|
requestExtraSequence(kTSA37WSCToAI5, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA37PegasusAI5, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA37AI5ToWSC, 0, kFilterNoInput);
|
|
GameState.setBeenToWSC(true);
|
|
}
|
|
|
|
requestExtraSequence(kTSA37WSCToDepart, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA37PegasusDepart, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
default:
|
|
Neighborhood::clickInHotspot(input, clickedSpot);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void FullTSA::showMainJumpMenu() {
|
|
ExtraID jumpMenuView = kTSA37JumpMenu000;
|
|
|
|
if (GameState.getNoradFinished())
|
|
jumpMenuView += 4;
|
|
if (GameState.getMarsFinished())
|
|
jumpMenuView += 2;
|
|
if (GameState.getWSCFinished())
|
|
jumpMenuView += 1;
|
|
|
|
showExtraView(jumpMenuView);
|
|
setCurrentActivation(kActivationMainJumpMenu);
|
|
}
|
|
|
|
void FullTSA::playTBPMonitor() {
|
|
InputDevice.waitInput(kFilterAllButtons);
|
|
|
|
if ((GameState.getT0BMonitorMode() & kPlayingTBPMask) == 0) {
|
|
ExtraID extra;
|
|
|
|
switch (GameState.getT0BMonitorMode() & kRawModeMask) {
|
|
case kMonitorTheory:
|
|
GameState.setTSASeenTheory(true);
|
|
extra = kTSA0BTBPTheory;
|
|
GameState.setScoringSawTheory(true);
|
|
break;
|
|
case kMonitorBackground:
|
|
GameState.setTSASeenBackground(true);
|
|
extra = kTSA0BTBPBackground;
|
|
GameState.setScoringSawBackground(true);
|
|
break;
|
|
case kMonitorProcedure:
|
|
GameState.setTSASeenProcedure(true);
|
|
extra = kTSA0BTBPProcedure;
|
|
GameState.setScoringSawProcedure(true);
|
|
break;
|
|
default:
|
|
error("Invalid monitor mode");
|
|
}
|
|
|
|
GameState.setT0BMonitorMode(GameState.getT0BMonitorMode() | kPlayingTBPMask);
|
|
|
|
ExtraTable::Entry entry;
|
|
getExtraEntry(extra, entry);
|
|
_lastExtra = extra;
|
|
|
|
GameState.setT0BMonitorStart(entry.movieStart + kFullTSAFrameDuration * 5);
|
|
startMovieSequence(GameState.getT0BMonitorStart(), entry.movieEnd, kExtraCompletedFlag, false, kFilterAllInput);
|
|
} else if (_navMovie.isRunning()) {
|
|
_navMovie.stop();
|
|
} else {
|
|
_navMovie.start();
|
|
}
|
|
}
|
|
|
|
void FullTSA::initializeTBPMonitor(const int newMode, const ExtraID highlightExtra) {
|
|
GameState.setT0BMonitorMode(newMode);
|
|
|
|
if (newMode != kMonitorNeutral) {
|
|
showExtraView(highlightExtra);
|
|
_vm->delayShell(1, 2);
|
|
setCurrentActivation(kActivateTSA0BTBPVideo);
|
|
_sprite1.addPICTResourceFrame(kTBPRewindPICTID, false, 0, 0);
|
|
_sprite1.moveElementTo(kTBPRewindLeft, kTBPRewindTop);
|
|
_sprite1.setCurrentFrameIndex(0);
|
|
_sprite2.addPICTResourceFrame(kTBPCloseBoxPICTID, false, 0, 0);
|
|
_sprite2.moveElementTo(kTBPCloseLeft, kTBPCloseTop);
|
|
_sprite2.setCurrentFrameIndex(0);
|
|
playTBPMonitor();
|
|
} else {
|
|
if (GameState.getTSAState() == kTSAPlayerForcedReview && GameState.getTSASeenTheory() &&
|
|
GameState.getTSASeenBackground() && GameState.getTSASeenProcedure()) {
|
|
setOffRipAlarm();
|
|
} else {
|
|
setCurrentActivation(kActivateTSA0BZoomedIn);
|
|
updateViewFrame();
|
|
}
|
|
|
|
releaseSprites();
|
|
}
|
|
|
|
// Only allow input if we're not in the middle of series of queue requests.
|
|
if (actionQueueEmpty())
|
|
_interruptionFilter = kFilterAllInput;
|
|
}
|
|
|
|
void FullTSA::startUpComparisonMonitor() {
|
|
releaseSprites();
|
|
|
|
_sprite1.addPICTResourceFrame(kComparisonHiliteNoradPICTID, false,
|
|
kComparisonHiliteNoradLeft - kComparisonHiliteSpriteLeft,
|
|
kComparisonHiliteNoradTop - kComparisonHiliteSpriteTop);
|
|
_sprite1.addPICTResourceFrame(kComparisonHiliteMarsPICTID, false,
|
|
kComparisonHiliteMarsLeft - kComparisonHiliteSpriteLeft,
|
|
kComparisonHiliteMarsTop - kComparisonHiliteSpriteTop);
|
|
_sprite1.addPICTResourceFrame(kComparisonHiliteCaldoriaPICTID, false,
|
|
kComparisonHiliteCaldoriaLeft - kComparisonHiliteSpriteLeft,
|
|
kComparisonHiliteCaldoriaTop - kComparisonHiliteSpriteTop);
|
|
_sprite1.addPICTResourceFrame(kComparisonHiliteWSCPICTID, false,
|
|
kComparisonHiliteWSCLeft - kComparisonHiliteSpriteLeft,
|
|
kComparisonHiliteWSCTop - kComparisonHiliteSpriteTop);
|
|
|
|
_sprite1.setCurrentFrameIndex(0);
|
|
_sprite1.moveElementTo(kComparisonHiliteSpriteLeft, kComparisonHiliteSpriteTop);
|
|
|
|
_sprite2.addPICTResourceFrame(kComparisonChancesNoradPICTID, false,
|
|
kComparisonChancesNoradLeft - kComparisonChancesSpriteLeft,
|
|
kComparisonChancesNoradTop - kComparisonChancesSpriteTop);
|
|
_sprite2.addPICTResourceFrame(kComparisonChancesMarsPICTID, false,
|
|
kComparisonChancesMarsLeft - kComparisonChancesSpriteLeft,
|
|
kComparisonChancesMarsTop - kComparisonChancesSpriteTop);
|
|
_sprite2.addPICTResourceFrame(kComparisonChancesCaldoriaPICTID, false,
|
|
kComparisonChancesCaldoriaLeft - kComparisonChancesSpriteLeft,
|
|
kComparisonChancesCaldoriaTop - kComparisonChancesSpriteTop);
|
|
_sprite2.addPICTResourceFrame(kComparisonChancesWSCPICTID, false,
|
|
kComparisonChancesWSCLeft - kComparisonChancesSpriteLeft,
|
|
kComparisonChancesWSCTop - kComparisonChancesSpriteTop);
|
|
|
|
_sprite2.setCurrentFrameIndex(0);
|
|
_sprite2.moveElementTo(kComparisonChancesSpriteLeft, kComparisonChancesSpriteTop);
|
|
updateViewFrame();
|
|
}
|
|
|
|
void FullTSA::shutDownComparisonMonitor() {
|
|
releaseSprites();
|
|
}
|
|
|
|
void FullTSA::initializeComparisonMonitor(const int newMode, const ExtraID comparisonView) {
|
|
GameState.setT0BMonitorMode(newMode);
|
|
_privateFlags.setFlag(kTSAPrivatePlayingLeftComparisonFlag, false);
|
|
_privateFlags.setFlag(kTSAPrivatePlayingRightComparisonFlag, false);
|
|
|
|
if (newMode != kMonitorNeutral) {
|
|
shutDownComparisonMonitor();
|
|
setCurrentActivation(kActivateTSA0BComparisonVideo);
|
|
_sprite1.addPICTResourceFrame(kComparisonLeftRewindPICTID, false, 0, 0);
|
|
_sprite1.moveElementTo(kComparisonLeftRewindLeft, kComparisonLeftRewindTop);
|
|
_sprite1.setCurrentFrameIndex(0);
|
|
_sprite2.addPICTResourceFrame(kComparisonRightRewindPICTID, false, 0, 0);
|
|
_sprite2.moveElementTo(kComparisonRightRewindLeft, kComparisonRightRewindTop);
|
|
_sprite2.setCurrentFrameIndex(0);
|
|
_sprite3.addPICTResourceFrame(kComparisonCloseBoxPICTID, false, 0, 0);
|
|
_sprite3.moveElementTo(kComparisonCloseLeft, kComparisonCloseTop);
|
|
_sprite3.setCurrentFrameIndex(0);
|
|
showExtraView(comparisonView);
|
|
} else {
|
|
if (GameState.getTSAState() == kTSAPlayerInstalledHistoricalLog &&
|
|
GameState.getTSASeenNoradNormal() &&
|
|
GameState.getTSASeenNoradAltered() &&
|
|
GameState.getTSASeenMarsNormal() &&
|
|
GameState.getTSASeenMarsAltered() &&
|
|
GameState.getTSASeenCaldoriaNormal() &&
|
|
GameState.getTSASeenCaldoriaAltered() &&
|
|
GameState.getTSASeenWSCNormal() &&
|
|
GameState.getTSASeenWSCAltered()) {
|
|
GameState.setTSAState(kTSABossSawHistoricalLog);
|
|
requestExtraSequence(kTSA0BEastZoomOut, kExtraCompletedFlag, kFilterNoInput);
|
|
requestExtraSequence(kTSA0BEastTurnLeft, kExtraCompletedFlag, kFilterNoInput);
|
|
requestExtraSequence(kTSA0BNorthZoomIn, kExtraCompletedFlag, kFilterNoInput);
|
|
} else {
|
|
setCurrentActivation(kActivateTSA0BZoomedIn);
|
|
releaseSprites();
|
|
startUpComparisonMonitor();
|
|
}
|
|
}
|
|
|
|
// Only allow input if we're not in the middle of series of queue requests.
|
|
if (actionQueueEmpty())
|
|
_interruptionFilter = kFilterAllInput;
|
|
}
|
|
|
|
void FullTSA::playLeftComparison() {
|
|
InputDevice.waitInput(kFilterAllButtons);
|
|
|
|
if ((GameState.getT0BMonitorMode() & kPlayingLeftComparisonMask) == 0) {
|
|
ExtraID extra;
|
|
|
|
switch (GameState.getT0BMonitorMode() & kRawModeMask) {
|
|
case kMonitorNoradComparison:
|
|
GameState.setTSASeenNoradAltered(true);
|
|
extra = kTSA0BNoradAltered;
|
|
GameState.setScoringSawNoradAltered(true);
|
|
break;
|
|
case kMonitorMarsComparison:
|
|
GameState.setTSASeenMarsAltered(true);
|
|
extra = kTSA0BMarsAltered;
|
|
GameState.setScoringSawMarsAltered(true);
|
|
break;
|
|
case kMonitorCaldoriaComparison:
|
|
GameState.setTSASeenCaldoriaAltered(true);
|
|
extra = kTSA0BCaldoriaAltered;
|
|
GameState.setScoringSawCaldoriaAltered(true);
|
|
break;
|
|
case kMonitorWSCComparison:
|
|
GameState.setTSASeenWSCAltered(true);
|
|
extra = kTSA0BWSCAltered;
|
|
GameState.setScoringSawWSCAltered(true);
|
|
break;
|
|
default:
|
|
error("Invalid monitor mode");
|
|
}
|
|
|
|
GameState.setT0BMonitorMode(GameState.getT0BMonitorMode() | kPlayingLeftComparisonMask);
|
|
|
|
ExtraTable::Entry entry;
|
|
getExtraEntry(extra, entry);
|
|
_lastExtra = extra;
|
|
|
|
// skip first five frames of movie
|
|
// (this is a dissolve that doesn't belong...)
|
|
GameState.setT0BMonitorStart(entry.movieStart + kFullTSAFrameDuration * 5);
|
|
_privateFlags.setFlag(kTSAPrivatePlayingLeftComparisonFlag);
|
|
|
|
// Allow clicking...
|
|
startMovieSequence(GameState.getT0BMonitorStart(), entry.movieEnd,
|
|
kExtraCompletedFlag, false, JMPPPInput::getClickInputFilter());
|
|
} else if (_navMovie.isRunning()) {
|
|
_navMovie.stop();
|
|
} else {
|
|
_navMovie.start();
|
|
}
|
|
}
|
|
|
|
void FullTSA::playRightComparison() {
|
|
InputDevice.waitInput(kFilterAllButtons);
|
|
|
|
if ((GameState.getT0BMonitorMode() & kPlayingRightComparisonMask) == 0) {
|
|
ExtraID extra;
|
|
|
|
switch (GameState.getT0BMonitorMode() & kRawModeMask) {
|
|
case kMonitorNoradComparison:
|
|
GameState.setTSASeenNoradNormal(true);
|
|
extra = kTSA0BNoradUnaltered;
|
|
GameState.setScoringSawNoradNormal(true);
|
|
break;
|
|
case kMonitorMarsComparison:
|
|
GameState.setTSASeenMarsNormal(true);
|
|
extra = kTSA0BMarsUnaltered;
|
|
GameState.setScoringSawMarsNormal(true);
|
|
break;
|
|
case kMonitorCaldoriaComparison:
|
|
GameState.setTSASeenCaldoriaNormal(true);
|
|
extra = kTSA0BCaldoriaUnaltered;
|
|
GameState.setScoringSawCaldoriaNormal(true);
|
|
break;
|
|
case kMonitorWSCComparison:
|
|
GameState.setTSASeenWSCNormal(true);
|
|
extra = kTSA0BWSCUnaltered;
|
|
GameState.setScoringSawWSCNormal(true);
|
|
break;
|
|
default:
|
|
error("Invalid monitor mode");
|
|
}
|
|
|
|
GameState.setT0BMonitorMode(GameState.getT0BMonitorMode() | kPlayingRightComparisonMask);
|
|
|
|
ExtraTable::Entry entry;
|
|
getExtraEntry(extra, entry);
|
|
_lastExtra = extra;
|
|
|
|
// skip first five frames of movie
|
|
// (this is a dissolve that doesn't belong...)
|
|
GameState.setT0BMonitorStart(entry.movieStart + kFullTSAFrameDuration * 5);
|
|
_privateFlags.setFlag(kTSAPrivatePlayingRightComparisonFlag);
|
|
|
|
// Allow clicking...
|
|
startMovieSequence(GameState.getT0BMonitorStart(), entry.movieEnd,
|
|
kExtraCompletedFlag, false, JMPPPInput::getClickInputFilter());
|
|
} else if (_navMovie.isRunning()) {
|
|
_navMovie.stop();
|
|
} else {
|
|
_navMovie.start();
|
|
}
|
|
}
|
|
|
|
// When this function is called, the player is zoomed up on the center monitor, and the
|
|
// TSA state is kTSABossSawHistoricalLog.
|
|
void FullTSA::startRobotGame() {
|
|
requestExtraSequence(kTSA0BNorthCantChangeHistory, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA0BAIInterruption, kExtraCompletedFlag, kFilterNoInput);
|
|
requestExtraSequence(kTSA0BShowGuardRobots, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA0BRobotsToCommandCenter, kExtraCompletedFlag, kFilterNoInput);
|
|
}
|
|
|
|
void FullTSA::startUpRobotMonitor() {
|
|
releaseSprites();
|
|
|
|
_sprite1.addPICTResourceFrame(kRedirectionCCRolloverPICTID, true,
|
|
kRedirectionCCRolloverLeft - kRedirectionSprite1Left,
|
|
kRedirectionCCRolloverTop - kRedirectionSprite1Top);
|
|
_sprite1.addPICTResourceFrame(kRedirectionRRRolloverPICTID, true,
|
|
kRedirectionRRRolloverLeft - kRedirectionSprite1Left,
|
|
kRedirectionRRRolloverTop - kRedirectionSprite1Top);
|
|
_sprite1.addPICTResourceFrame(kRedirectionFDRolloverPICTID, true,
|
|
kRedirectionFDRolloverLeft - kRedirectionSprite1Left,
|
|
kRedirectionFDRolloverTop - kRedirectionSprite1Top);
|
|
_sprite1.addPICTResourceFrame(kRedirectionCCDoorPICTID, true,
|
|
kRedirectionCCDoorLeft - kRedirectionSprite1Left,
|
|
kRedirectionCCDoorTop - kRedirectionSprite1Top);
|
|
_sprite1.addPICTResourceFrame(kRedirectionRRDoorPICTID, true,
|
|
kRedirectionRRDoorLeft - kRedirectionSprite1Left,
|
|
kRedirectionRRDoorTop - kRedirectionSprite1Top);
|
|
_sprite1.addPICTResourceFrame(kRedirectionFDDoorPICTID, true,
|
|
kRedirectionFDDoorLeft - kRedirectionSprite1Left,
|
|
kRedirectionFDDoorTop - kRedirectionSprite1Top);
|
|
_sprite1.addPICTResourceFrame(kRedirectionClosePICTID, false,
|
|
kRedirectionCloseLeft - kRedirectionSprite1Left,
|
|
kRedirectionCloseTop - kRedirectionSprite1Top);
|
|
_sprite1.moveElementTo(kRedirectionSprite1Left, kRedirectionSprite1Top);
|
|
|
|
_sprite2.addPICTResourceFrame(kRedirectionSecuredPICTID, false,
|
|
kRedirectionSecuredLeft - kRedirectionSprite2Left,
|
|
kRedirectionSecuredTop - kRedirectionSprite2Top);
|
|
_sprite2.addPICTResourceFrame(kRedirectionNewTargetPICTID, false,
|
|
kRedirectionNewTargetLeft - kRedirectionSprite2Left,
|
|
kRedirectionNewTargetTop - kRedirectionSprite2Top);
|
|
_sprite2.moveElementTo(kRedirectionSprite2Left, kRedirectionSprite2Top);
|
|
|
|
switch (GameState.getTSAState()) {
|
|
case kRobotsAtCommandCenter:
|
|
showExtraView(kTSA0BNorthRobotsAtCCView);
|
|
break;
|
|
case kRobotsAtFrontDoor:
|
|
showExtraView(kTSA0BNorthRobotsAtFDView);
|
|
break;
|
|
case kRobotsAtReadyRoom:
|
|
showExtraView(kTSA0BNorthRobotsAtRRView);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void FullTSA::shutDownRobotMonitor() {
|
|
releaseSprites();
|
|
}
|
|
|
|
// Assume this is called only when zoomed in at T0B west
|
|
void FullTSA::setOffRipAlarm() {
|
|
GameState.setTSAState(kTSAPlayerDetectedRip);
|
|
_ripTimer.initImage();
|
|
_ripTimer.moveElementTo(kRipTimerLeft, kRipTimerTop);
|
|
_ripTimer.setSegment(0, kRipTimeLimit, kRipTimeScale);
|
|
_ripTimer.start();
|
|
loadAmbientLoops();
|
|
startExtraSequenceSync(kTSA0BRipAlarmScreen, kFilterNoInput);
|
|
_vm->delayShell(2, 1); // Two seconds..
|
|
requestExtraSequence(kTSA0BWestZoomOut, kExtraCompletedFlag, kFilterNoInput);
|
|
requestExtraSequence(kTSA0BWestTurnRight, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA0BNorthZoomIn, kExtraCompletedFlag, kFilterNoInput);
|
|
requestExtraSequence(kTSA0BNorthFinallyHappened, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA0BShowRip1, kExtraCompletedFlag, kFilterNoInput);
|
|
}
|
|
|
|
void FullTSA::checkContinuePoint(const RoomID room, const DirectionConstant direction) {
|
|
switch (MakeRoomView(room, direction)) {
|
|
case MakeRoomView(kTSA04, kNorth):
|
|
case MakeRoomView(kTSA14, kEast):
|
|
case MakeRoomView(kTSA15, kWest):
|
|
case MakeRoomView(kTSA16, kNorth):
|
|
case MakeRoomView(kTSA16, kSouth):
|
|
case MakeRoomView(kTSA21Cyan, kSouth):
|
|
case MakeRoomView(kTSA21Red, kSouth):
|
|
case MakeRoomView(kTSA26, kNorth):
|
|
makeContinuePoint();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void FullTSA::arriveAt(const RoomID room, const DirectionConstant direction) {
|
|
checkRobotLocations(room, direction);
|
|
Neighborhood::arriveAt(room, direction);
|
|
|
|
switch (MakeRoomView(room, direction)) {
|
|
case MakeRoomView(kTSADeathRoom, kNorth):
|
|
case MakeRoomView(kTSADeathRoom, kSouth):
|
|
case MakeRoomView(kTSADeathRoom, kEast):
|
|
case MakeRoomView(kTSADeathRoom, kWest):
|
|
die(kDeathShotByTSARobots);
|
|
break;
|
|
case MakeRoomView(kTSA00, kNorth):
|
|
if (GameState.getLastNeighborhood() != kFullTSAID) {
|
|
makeContinuePoint();
|
|
openDoor();
|
|
} else {
|
|
setCurrentActivation(kActivateTSAReadyForCard);
|
|
loopExtraSequence(kTSATransporterArrowLoop, 0);
|
|
}
|
|
break;
|
|
case MakeRoomView(kTSA01, kNorth):
|
|
if (g_arthurChip)
|
|
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA22", kArthurTSAEnteredCave);
|
|
break;
|
|
case MakeRoomView(kTSA03, kNorth):
|
|
case MakeRoomView(kTSA05, kNorth):
|
|
case MakeRoomView(kTSA0A, kNorth):
|
|
case MakeRoomView(kTSA06, kNorth):
|
|
if (_utilityFuse.isFuseLit())
|
|
_utilityFuse.stopFuse();
|
|
GameState.setScoringEnterTSA(true);
|
|
break;
|
|
case MakeRoomView(kTSA04, kNorth):
|
|
if (_utilityFuse.isFuseLit())
|
|
_utilityFuse.stopFuse();
|
|
if (!GameState.getTSASeenRobotGreeting())
|
|
startExtraSequence(kTSA04NorthRobotGreeting, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case MakeRoomView(kTSA07, kNorth):
|
|
if (_utilityFuse.isFuseLit())
|
|
_utilityFuse.stopFuse();
|
|
GameState.setScoringEnterTSA(true);
|
|
if (g_arthurChip)
|
|
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA23", kArthurTSAReachedJunction);
|
|
break;
|
|
case MakeRoomView(kTSA03, kSouth):
|
|
GameState.setTSAFrontDoorUnlockedInside(GameState.getTSAState() == kRobotsAtFrontDoor || GameState.allTimeZonesFinished());
|
|
break;
|
|
case MakeRoomView(kTSA0A, kEast):
|
|
case MakeRoomView(kTSA0A, kWest):
|
|
if (GameState.getTSAState() == kTSAPlayerNotArrived)
|
|
setCurrentActivation(kActivateTSARobotsAwake);
|
|
break;
|
|
case MakeRoomView(kTSA0B, kNorth):
|
|
if (GameState.getTSA0BZoomedIn()) {
|
|
setCurrentActivation(kActivateTSA0BZoomedIn);
|
|
|
|
switch (GameState.getTSAState()) {
|
|
case kTSAPlayerNeedsHistoricalLog:
|
|
_ripTimer.show();
|
|
break;
|
|
case kRobotsAtCommandCenter:
|
|
case kRobotsAtFrontDoor:
|
|
case kRobotsAtReadyRoom:
|
|
startUpRobotMonitor();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
} else {
|
|
setCurrentActivation(kActivateTSA0BZoomedOut);
|
|
|
|
switch (GameState.getTSAState()) {
|
|
case kTSAPlayerNotArrived:
|
|
requestExtraSequence(kTSA0BNorthZoomIn, kExtraCompletedFlag, kFilterNoInput);
|
|
requestExtraSequence(kTSA0BNorthYoureBusted, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA0BNorthZoomOut, kExtraCompletedFlag, kFilterNoInput);
|
|
requestExtraSequence(kTSA0BNorthTurnLeft, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA0BWestZoomIn, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kTSAPlayerGotHistoricalLog:
|
|
startExtraSequence(kTSA0BNorthHistLogOpen, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
case MakeRoomView(kTSA0B, kSouth):
|
|
GameState.setTSA0BZoomedIn(false);
|
|
setCurrentActivation(kActivateTSA0BZoomedOut);
|
|
break;
|
|
case MakeRoomView(kTSA0B, kWest):
|
|
if (GameState.getTSA0BZoomedIn()) {
|
|
setCurrentActivation(kActivateTSA0BZoomedIn);
|
|
initializeTBPMonitor(kMonitorNeutral, 0);
|
|
} else {
|
|
setCurrentActivation(kActivateTSA0BZoomedOut);
|
|
}
|
|
break;
|
|
case MakeRoomView(kTSA0B, kEast):
|
|
if (GameState.getTSA0BZoomedIn()) {
|
|
setCurrentActivation(kActivateTSA0BZoomedIn);
|
|
|
|
switch (GameState.getTSAState()) {
|
|
case kTSAPlayerInstalledHistoricalLog:
|
|
case kTSABossSawHistoricalLog:
|
|
case kRobotsAtCommandCenter:
|
|
case kRobotsAtFrontDoor:
|
|
case kRobotsAtReadyRoom:
|
|
initializeComparisonMonitor(kMonitorNeutral, 0);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
} else {
|
|
setCurrentActivation(kActivateTSA0BZoomedOut);
|
|
}
|
|
break;
|
|
case MakeRoomView(kTSA21Red, kSouth):
|
|
if (GameState.getTSAState() == kRobotsAtFrontDoor)
|
|
GameState.setScoringWentToReadyRoom2(true);
|
|
break;
|
|
case MakeRoomView(kTSA22Red, kEast):
|
|
if (!_vm->playerHasItemID(kJourneymanKey))
|
|
setCurrentActivation(kActivationDoesntHaveKey);
|
|
break;
|
|
case MakeRoomView(kTSA23Red, kWest):
|
|
if (!_vm->playerHasItemID(kPegasusBiochip))
|
|
setCurrentActivation(kActivationDoesntHaveChips);
|
|
break;
|
|
case MakeRoomView(kTSA25Red, kNorth):
|
|
arriveAtTSA25Red();
|
|
break;
|
|
case MakeRoomView(kTSA34, kSouth):
|
|
if (GameState.getLastRoom() == kTSA37) {
|
|
closeDoorOffScreen(kTSA37, kNorth);
|
|
if (_vm->isDVD() && GameState.allTimeZonesFinished() && !_playedSolvedMusicCue) {
|
|
_solvedMusicCue.initFromAIFFFile("Sounds/TSA/TSA NORM.32K.AIFF");
|
|
_solvedMusicCue.setVolume(_vm->getAmbienceLevel());
|
|
_solvedMusicCue.playSound();
|
|
_playedSolvedMusicCue = true;
|
|
}
|
|
}
|
|
break;
|
|
case MakeRoomView(kTSA37, kNorth):
|
|
arriveAtTSA37();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void FullTSA::checkRobotLocations(const RoomID room, const DirectionConstant dir) {
|
|
switch (room) {
|
|
case kTSA03:
|
|
case kTSA04:
|
|
case kTSA05:
|
|
case kTSA06:
|
|
case kTSA0A:
|
|
case kTSA07:
|
|
case kTSA08:
|
|
case kTSA09:
|
|
case kTSA10:
|
|
case kTSA11:
|
|
case kTSA12:
|
|
case kTSA13:
|
|
case kTSA14:
|
|
case kTSA15:
|
|
switch (GameState.getTSAState()) {
|
|
case kRobotsAtFrontDoor:
|
|
setCurrentAlternate(kAltTSARobotsAtFrontDoor);
|
|
break;
|
|
case kRobotsAtReadyRoom:
|
|
setCurrentAlternate(kAltTSARobotsAtReadyRoom);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case kTSA16:
|
|
if (dir == kNorth) {
|
|
switch (GameState.getTSAState()) {
|
|
case kRobotsAtCommandCenter:
|
|
if (!_privateFlags.getFlag(kTSAPrivateSeenRobotWarningFlag)) {
|
|
if (_vm->isChattyAI())
|
|
g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/TSA/XT11WB", false, kWarningInterruption);
|
|
_privateFlags.setFlag(kTSAPrivateSeenRobotWarningFlag, true);
|
|
}
|
|
break;
|
|
case kRobotsAtFrontDoor:
|
|
setCurrentAlternate(kAltTSARobotsAtFrontDoor);
|
|
break;
|
|
case kRobotsAtReadyRoom:
|
|
setCurrentAlternate(kAltTSARobotsAtReadyRoom);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void FullTSA::arriveAtTSA25Red() {
|
|
if (!_vm->playerHasItemID(kJourneymanKey))
|
|
startExtraSequence(kTSA25NorthDeniedNoKey, kExtraCompletedFlag, kFilterNoInput);
|
|
else if (!_vm->playerHasItemID(kPegasusBiochip))
|
|
startExtraSequence(kTSA25NorthDeniedNoChip, kExtraCompletedFlag, kFilterNoInput);
|
|
else if (GameState.getTSABiosuitOn())
|
|
startExtraSequence(kTSA25NorthAlreadyHaveSuit, kExtraCompletedFlag, kFilterNoInput);
|
|
else
|
|
startExtraSequence(kTSA25NorthPutOnSuit, kExtraCompletedFlag, kFilterNoInput);
|
|
}
|
|
|
|
void FullTSA::arriveAtTSA37() {
|
|
_ripTimer.stop();
|
|
_ripTimer.releaseImage();
|
|
|
|
switch (GameState.getTSAState()) {
|
|
case kTSAPlayerNeedsHistoricalLog:
|
|
startExtraLongSequence(kTSA37HorseToAI1, kTSA37AI2ToPrehistoric, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kPlayerOnWayToPrehistoric:
|
|
setCurrentActivation(kActivationJumpToPrehistoric);
|
|
showExtraView(kTSA37AI2ToPrehistoric);
|
|
break;
|
|
case kTSAPlayerGotHistoricalLog:
|
|
initializePegasusButtons(false);
|
|
break;
|
|
case kPlayerWentToPrehistoric:
|
|
case kPlayerOnWayToNorad:
|
|
case kPlayerOnWayToMars:
|
|
case kPlayerOnWayToWSC:
|
|
startExtraSequence(kTSA37TimeJumpToPegasus, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kRobotsAtFrontDoor:
|
|
startExtraLongSequence(kTSA37HorseToColonel2, kTSA37AI4ToMainMenu, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kPlayerLockedInPegasus:
|
|
showMainJumpMenu();
|
|
break;
|
|
case kPlayerFinishedWithTSA:
|
|
initializePegasusButtons(true);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void FullTSA::turnTo(const DirectionConstant newDirection) {
|
|
Neighborhood::turnTo(newDirection);
|
|
|
|
switch (MakeRoomView(GameState.getCurrentRoom(), newDirection)) {
|
|
case MakeRoomView(kTSA03, kSouth):
|
|
if (GameState.getTSAState() == kRobotsAtFrontDoor || GameState.allTimeZonesFinished())
|
|
GameState.setTSAFrontDoorUnlockedInside(true);
|
|
else
|
|
GameState.setTSAFrontDoorUnlockedInside(false);
|
|
break;
|
|
case MakeRoomView(kTSA0A, kEast):
|
|
case MakeRoomView(kTSA0A, kWest):
|
|
setCurrentActivation(kActivateTSARobotsAwake);
|
|
break;
|
|
case MakeRoomView(kTSA0B, kEast):
|
|
if (GameState.getTSA0BZoomedIn())
|
|
setCurrentActivation(kActivateTSA0BZoomedIn);
|
|
else
|
|
setCurrentActivation(kActivateTSA0BZoomedOut);
|
|
|
|
GameState.setT0BMonitorMode(GameState.getT0BMonitorMode() & ~kPlayingAnyMask);
|
|
|
|
if (_privateFlags.getFlag(kTSAPrivateLogReaderOpenFlag))
|
|
_privateFlags.setFlag(kTSAPrivateLogReaderOpenFlag, false);
|
|
|
|
switch (GameState.getTSAState()) {
|
|
case kTSAPlayerInstalledHistoricalLog:
|
|
case kTSABossSawHistoricalLog:
|
|
case kRobotsAtCommandCenter:
|
|
case kRobotsAtFrontDoor:
|
|
case kRobotsAtReadyRoom:
|
|
if (GameState.getTSA0BZoomedIn())
|
|
startUpComparisonMonitor();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case MakeRoomView(kTSA0B, kNorth):
|
|
if (GameState.getTSA0BZoomedIn())
|
|
setCurrentActivation(kActivateTSA0BZoomedIn);
|
|
else
|
|
setCurrentActivation(kActivateTSA0BZoomedOut);
|
|
|
|
GameState.setT0BMonitorMode(GameState.getT0BMonitorMode() & ~kPlayingAnyMask);
|
|
|
|
switch (GameState.getTSAState()) {
|
|
case kTSAPlayerNeedsHistoricalLog:
|
|
if (GameState.getTSA0BZoomedIn())
|
|
_ripTimer.show();
|
|
break;
|
|
case kTSAPlayerGotHistoricalLog:
|
|
if (!GameState.getTSA0BZoomedIn())
|
|
startExtraSequence(kTSA0BNorthHistLogOpen, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kTSAPlayerInstalledHistoricalLog:
|
|
if (GameState.getTSA0BZoomedIn()) {
|
|
if ((GameState.getTSASeenNoradNormal() || GameState.getTSASeenNoradAltered()) &&
|
|
(GameState.getTSASeenMarsNormal() || GameState.getTSASeenMarsAltered()) &&
|
|
(GameState.getTSASeenCaldoriaNormal() || GameState.getTSASeenCaldoriaAltered()) &&
|
|
(GameState.getTSASeenWSCNormal() || GameState.getTSASeenWSCAltered())) {
|
|
GameState.setTSAState(kTSABossSawHistoricalLog);
|
|
startRobotGame();
|
|
}
|
|
}
|
|
break;
|
|
case kRobotsAtCommandCenter:
|
|
case kRobotsAtFrontDoor:
|
|
case kRobotsAtReadyRoom:
|
|
if (GameState.getTSA0BZoomedIn())
|
|
startExtraSequence(kTSA0BShowGuardRobots, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case MakeRoomView(kTSA0B, kWest):
|
|
if (GameState.getTSA0BZoomedIn())
|
|
setCurrentActivation(kActivateTSA0BZoomedIn);
|
|
else
|
|
setCurrentActivation(kActivateTSA0BZoomedOut);
|
|
|
|
GameState.setT0BMonitorMode(GameState.getT0BMonitorMode() & ~kPlayingAnyMask);
|
|
|
|
if (_privateFlags.getFlag(kTSAPrivateLogReaderOpenFlag))
|
|
_privateFlags.setFlag(kTSAPrivateLogReaderOpenFlag, false);
|
|
|
|
if (GameState.getTSA0BZoomedIn())
|
|
initializeTBPMonitor(kMonitorNeutral, 0);
|
|
break;
|
|
case MakeRoomView(kTSA0B, kSouth):
|
|
GameState.setTSA0BZoomedIn(false);
|
|
setCurrentActivation(kActivateTSA0BZoomedOut);
|
|
break;
|
|
case MakeRoomView(kTSA16, kNorth):
|
|
switch (GameState.getTSAState()) {
|
|
case kRobotsAtCommandCenter:
|
|
if (!_privateFlags.getFlag(kTSAPrivateSeenRobotWarningFlag)) {
|
|
if (_vm->isChattyAI())
|
|
g_AIArea->playAIMovie(kRightAreaSignature, "Images/AI/TSA/XT11WB", false, kWarningInterruption);
|
|
_privateFlags.setFlag(kTSAPrivateSeenRobotWarningFlag, true);
|
|
}
|
|
break;
|
|
case kRobotsAtFrontDoor:
|
|
setCurrentAlternate(kAltTSARobotsAtFrontDoor);
|
|
break;
|
|
case kRobotsAtReadyRoom:
|
|
setCurrentAlternate(kAltTSARobotsAtReadyRoom);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case MakeRoomView(kTSA22Red, kEast):
|
|
if (!_vm->playerHasItemID(kJourneymanKey))
|
|
setCurrentActivation(kActivationDoesntHaveKey);
|
|
break;
|
|
case MakeRoomView(kTSA22Red, kNorth):
|
|
case MakeRoomView(kTSA22Red, kSouth):
|
|
if (_privateFlags.getFlag(kTSAPrivateKeyVaultOpenFlag)) {
|
|
playSpotSoundSync(kTSAVaultCloseIn, kTSAVaultCloseOut);
|
|
_privateFlags.setFlag(kTSAPrivateKeyVaultOpenFlag, false);
|
|
}
|
|
|
|
setCurrentActivation(kActivateHotSpotAlways);
|
|
break;
|
|
case MakeRoomView(kTSA23Red, kWest):
|
|
if (!_vm->playerHasItemID(kPegasusBiochip))
|
|
setCurrentActivation(kActivationDoesntHaveChips);
|
|
break;
|
|
case MakeRoomView(kTSA23Red, kNorth):
|
|
case MakeRoomView(kTSA23Red, kSouth):
|
|
if (_privateFlags.getFlag(kTSAPrivateChipVaultOpenFlag)) {
|
|
playSpotSoundSync(kTSAVaultCloseIn, kTSAVaultCloseOut);
|
|
_privateFlags.setFlag(kTSAPrivateChipVaultOpenFlag, false);
|
|
}
|
|
|
|
setCurrentActivation(kActivateHotSpotAlways);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
// Make sure the TBP monitor is forced neutral.
|
|
GameState.setT0BMonitorMode(kMonitorNeutral);
|
|
}
|
|
|
|
void FullTSA::closeDoorOffScreen(const RoomID room, const DirectionConstant) {
|
|
switch (room) {
|
|
case kTSA00:
|
|
case kTSA01:
|
|
if (GameState.getCurrentRoom() == kTSA01 || GameState.getCurrentRoom() == kTSA02)
|
|
playSpotSoundSync(kTSAGTDoorCloseIn, kTSAGTDoorCloseOut);
|
|
break;
|
|
case kTSA02:
|
|
case kTSA03:
|
|
playSpotSoundSync(kTSAEntryDoorCloseIn, kTSAEntryDoorCloseOut);
|
|
break;
|
|
case kTSA14:
|
|
case kTSA15:
|
|
case kTSA16:
|
|
case kTSA21Cyan:
|
|
case kTSA21Red:
|
|
playSpotSoundSync(kTSAInsideDoorCloseIn, kTSAInsideDoorCloseOut);
|
|
break;
|
|
case kTSA34:
|
|
case kTSA37:
|
|
playSpotSoundSync(kTSAPegasusDoorCloseIn, kTSAPegasusDoorCloseOut);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void FullTSA::startExtraSequence(const ExtraID extraID, const NotificationFlags flags, const InputBits interruptionFilter) {
|
|
static const TimeValue times[3][2] = {
|
|
{ 0, 11720 },
|
|
{ 11720, 19840 },
|
|
{ 19840, 29960 }
|
|
};
|
|
TimeValue segmentStart = 0, segmentStop = 0;
|
|
bool loopSequence = false;
|
|
Common::Rect pushBounds;
|
|
NotificationFlags extraFlags;
|
|
|
|
switch (extraID) {
|
|
case kEasterEggJimenez:
|
|
case kEasterEggCastillo:
|
|
case kEasterEggSinclair:
|
|
_turnPush.getBounds(pushBounds);
|
|
_extraMovie.initFromMovieFile("Images/TSA/Wacky TSA.movie");
|
|
segmentStart = times[extraID - 1000][0];
|
|
segmentStop = times[extraID - 1000][1];
|
|
loopSequence = false;
|
|
|
|
_lastExtra = extraID;
|
|
_turnPush.hide();
|
|
|
|
if (!loopSequence && g_AIArea)
|
|
g_AIArea->lockAIOut();
|
|
|
|
extraFlags = flags;
|
|
_interruptionFilter = interruptionFilter;
|
|
// Stop the nav movie before doing anything else
|
|
_navMovie.stop();
|
|
_navMovie.stopDisplaying();
|
|
|
|
_extraMovie.setVolume(_vm->getSoundFXLevel());
|
|
_extraMovie.moveElementTo(pushBounds.left, pushBounds.top);
|
|
_extraMovie.setDisplayOrder(kNavMovieOrder + 1);
|
|
_extraMovie.startDisplaying();
|
|
_extraMovie.show();
|
|
_extraMovie.setFlags(0);
|
|
_extraMovie.setSegment(segmentStart, segmentStop);
|
|
_extraMovie.setTime(segmentStart);
|
|
if (loopSequence)
|
|
_extraMovie.setFlags(kLoopTimeBase);
|
|
else
|
|
extraFlags |= kNeighborhoodMovieCompletedFlag;
|
|
_extraMovieCallBack.cancelCallBack();
|
|
_extraMovieCallBack.initCallBack(&_extraMovie, kCallBackAtExtremes);
|
|
if (extraFlags != 0) {
|
|
_extraMovieCallBack.setCallBackFlag(extraFlags);
|
|
_extraMovieCallBack.scheduleCallBack(kTriggerAtStop, 0, 0);
|
|
}
|
|
_extraMovie.start();
|
|
break;
|
|
default:
|
|
Neighborhood::startExtraSequence(extraID, flags, interruptionFilter);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void FullTSA::receiveNotification(Notification *notification, const NotificationFlags flags) {
|
|
ExtraID lastExtra = _lastExtra;
|
|
|
|
if ((flags & kExtraCompletedFlag) != 0) {
|
|
switch (lastExtra) {
|
|
case kTSA0BEastTurnLeft:
|
|
// Need to check this here because turnTo will call _navMovie.stop,
|
|
// so it has to happen before Neighborhood::receiveNotification,
|
|
// which may end up starting another sequence...
|
|
turnTo(kNorth);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
Neighborhood::receiveNotification(notification, flags);
|
|
|
|
InventoryItem *item;
|
|
bool doArthurSawBustMovie, doArthurRedirectedRobotsMovie;
|
|
|
|
if ((flags & kExtraCompletedFlag) != 0) {
|
|
// Only allow input if we're not in the middle of series of queue requests.
|
|
if (actionQueueEmpty())
|
|
_interruptionFilter = kFilterAllInput;
|
|
|
|
doArthurSawBustMovie = false;
|
|
doArthurRedirectedRobotsMovie = false;
|
|
switch (lastExtra) {
|
|
case kTSAGTCardSwipe:
|
|
item = (InventoryItem *)_vm->getAllItems().findItemByID(kKeyCard);
|
|
_vm->addItemToInventory(item);
|
|
setCurrentActivation(kActivateTSAReadyToTransport);
|
|
break;
|
|
case kTSAGTGoToCaldoria:
|
|
_vm->jumpToNewEnvironment(kCaldoriaID, kCaldoria44, kEast);
|
|
|
|
if (GameState.allTimeZonesFinished())
|
|
GameState.setScoringWentAfterSinclair(true);
|
|
break;
|
|
case kTSAGTGoToTokyo:
|
|
case kTSAGTGoToBeach:
|
|
if (GameState.allTimeZonesFinished())
|
|
die(kDeathSinclairShotDelegate);
|
|
else
|
|
die(kDeathUncreatedInTSA);
|
|
break;
|
|
case kTSA02NorthZoomOut:
|
|
openDoor();
|
|
break;
|
|
|
|
// Hall of suspects.
|
|
case kTSA04NorthRobotGreeting:
|
|
GameState.setTSASeenRobotGreeting(true);
|
|
restoreStriding(kTSA03, kNorth, kNoAlternateID);
|
|
break;
|
|
case kTSA03JimenezZoomIn:
|
|
GameState.setScoringSawBust1(true);
|
|
doArthurSawBustMovie = true;
|
|
break;
|
|
case kTSA03CrenshawZoomIn:
|
|
GameState.setScoringSawBust2(true);
|
|
doArthurSawBustMovie = true;
|
|
break;
|
|
case kTSA04MatsumotoZoomIn:
|
|
GameState.setScoringSawBust3(true);
|
|
doArthurSawBustMovie = true;
|
|
break;
|
|
case kTSA04CastilleZoomIn:
|
|
GameState.setScoringSawBust4(true);
|
|
doArthurSawBustMovie = true;
|
|
break;
|
|
case kTSA05SinclairZoomIn:
|
|
GameState.setScoringSawBust5(true);
|
|
doArthurSawBustMovie = true;
|
|
break;
|
|
case kTSA05WhiteZoomIn:
|
|
GameState.setScoringSawBust6(true);
|
|
doArthurSawBustMovie = true;
|
|
break;
|
|
case kEasterEggJimenez:
|
|
case kEasterEggCastillo:
|
|
case kEasterEggSinclair:
|
|
_extraMovie.stopDisplaying();
|
|
_extraMovie.releaseMovie();
|
|
_navMovie.startDisplaying();
|
|
doArthurSawBustMovie = true;
|
|
break;
|
|
case kTSA0AEastRobot:
|
|
if (g_arthurChip)
|
|
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA48", kArthurTSAClickedRobot1);
|
|
break;
|
|
case kTSA0AWestRobot:
|
|
if (g_arthurChip)
|
|
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA53", kArthurTSAClickedRobot2);
|
|
break;
|
|
|
|
// Command center
|
|
// Historical comparison...
|
|
case kTSA0BEastZoomIn:
|
|
GameState.setTSA0BZoomedIn(true);
|
|
setCurrentActivation(kActivateTSA0BZoomedIn);
|
|
GameState.setT0BMonitorMode(GameState.getT0BMonitorMode() & ~kPlayingAnyMask);
|
|
|
|
switch (GameState.getTSAState()) {
|
|
case kTSAPlayerInstalledHistoricalLog:
|
|
case kTSABossSawHistoricalLog:
|
|
case kRobotsAtCommandCenter:
|
|
case kRobotsAtFrontDoor:
|
|
case kRobotsAtReadyRoom:
|
|
startUpComparisonMonitor();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case kTSA0BEastZoomOut:
|
|
GameState.setTSA0BZoomedIn(false);
|
|
setCurrentActivation(kActivateTSA0BZoomedOut);
|
|
|
|
switch (GameState.getTSAState()) {
|
|
case kTSABossSawHistoricalLog:
|
|
// Prevent current view from activating.
|
|
break;
|
|
default:
|
|
activateCurrentView(GameState.getCurrentRoom(), GameState.getCurrentDirection(),
|
|
kSpotOnTurnMask);
|
|
break;
|
|
}
|
|
break;
|
|
case kTSA0BComparisonStartup:
|
|
if ((flags & kActionRequestCompletedFlag) != 0) {
|
|
_privateFlags.setFlag(kTSAPrivateLogReaderOpenFlag, false);
|
|
GameState.setTSAState(kTSAPlayerInstalledHistoricalLog);
|
|
turnTo(kEast);
|
|
}
|
|
|
|
startUpComparisonMonitor();
|
|
break;
|
|
case kTSA0BNoradAltered:
|
|
case kTSA0BMarsAltered:
|
|
case kTSA0BCaldoriaAltered:
|
|
case kTSA0BWSCAltered:
|
|
case kTSA0BNoradUnaltered:
|
|
case kTSA0BMarsUnaltered:
|
|
case kTSA0BCaldoriaUnaltered:
|
|
case kTSA0BWSCUnaltered:
|
|
initializeComparisonMonitor(kMonitorNeutral, 0);
|
|
break;
|
|
|
|
// Center monitor.
|
|
case kTSA0BNorthZoomIn:
|
|
GameState.setTSA0BZoomedIn(true);
|
|
setCurrentActivation(kActivateTSA0BZoomedIn);
|
|
GameState.setT0BMonitorMode(GameState.getT0BMonitorMode() & ~kPlayingAnyMask);
|
|
|
|
switch (GameState.getTSAState()) {
|
|
case kTSAPlayerNeedsHistoricalLog:
|
|
startExtraSequence(kTSA0BShowRip1, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kTSABossSawHistoricalLog:
|
|
case kTSAPlayerInstalledHistoricalLog:
|
|
if ((GameState.getTSASeenNoradNormal() || GameState.getTSASeenNoradAltered()) &&
|
|
(GameState.getTSASeenMarsNormal() || GameState.getTSASeenMarsAltered()) &&
|
|
(GameState.getTSASeenCaldoriaNormal() || GameState.getTSASeenCaldoriaAltered()) &&
|
|
(GameState.getTSASeenWSCNormal() || GameState.getTSASeenWSCAltered())) {
|
|
GameState.setTSAState(kTSABossSawHistoricalLog);
|
|
startRobotGame();
|
|
}
|
|
break;
|
|
case kRobotsAtCommandCenter:
|
|
case kRobotsAtFrontDoor:
|
|
case kRobotsAtReadyRoom:
|
|
startExtraSequence(kTSA0BShowGuardRobots, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case kTSA0BNorthZoomOut:
|
|
GameState.setTSA0BZoomedIn(false);
|
|
setCurrentActivation(kActivateTSA0BZoomedOut);
|
|
break;
|
|
case kTSA0BShowRip1:
|
|
GameState.setTSAState(kTSAPlayerNeedsHistoricalLog);
|
|
GameState.setTSACommandCenterLocked(false);
|
|
|
|
if ((flags & kActionRequestCompletedFlag) != 0)
|
|
turnTo(kNorth);
|
|
|
|
_ripTimer.show();
|
|
break;
|
|
case kTSA0BNorthHistLogOpen:
|
|
setCurrentActivation(kActivationLogReaderOpen);
|
|
_privateFlags.setFlag(kTSAPrivateLogReaderOpenFlag, true);
|
|
break;
|
|
case kTSA0BRobotsToCommandCenter:
|
|
GameState.setTSAState(kRobotsAtCommandCenter);
|
|
// Fall through
|
|
case kTSA0BShowGuardRobots:
|
|
startUpRobotMonitor();
|
|
// Fall through
|
|
case kTSA0BRobotsFromCommandCenterToFrontDoor:
|
|
case kTSA0BRobotsFromReadyRoomToFrontDoor:
|
|
doArthurRedirectedRobotsMovie = true;
|
|
// falls through
|
|
case kTSA0BRobotsFromCommandCenterToReadyRoom:
|
|
case kTSA0BRobotsFromReadyRoomToCommandCenter:
|
|
case kTSA0BRobotsFromFrontDoorToCommandCenter:
|
|
case kTSA0BRobotsFromFrontDoorToReadyRoom:
|
|
_sprite2.setCurrentFrameIndex(kRedirectionSecuredSprite);
|
|
_sprite2.show();
|
|
break;
|
|
case kTSA0BAIInterruption:
|
|
if (g_arthurChip)
|
|
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA52", kArthurTSAConfinedByBaldwin);
|
|
break;
|
|
|
|
// TBP monitor.
|
|
case kTSA0BWestZoomIn:
|
|
GameState.setTSA0BZoomedIn(true);
|
|
setCurrentActivation(kActivateTSA0BZoomedIn);
|
|
|
|
if (GameState.getTSAState() == kTSAPlayerNotArrived) {
|
|
turnTo(kWest);
|
|
GameState.setTSACommandCenterLocked(true);
|
|
GameState.setTSAState(kTSAPlayerForcedReview);
|
|
}
|
|
|
|
initializeTBPMonitor(kMonitorNeutral, 0);
|
|
if (GameState.getTSAState() == kTSAPlayerForcedReview && g_arthurChip)
|
|
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA55", kArthurTSAOpenTBPMonitor);
|
|
break;
|
|
case kTSA0BWestZoomOut:
|
|
GameState.setTSA0BZoomedIn(false);
|
|
setCurrentActivation(kActivateTSA0BZoomedOut);
|
|
GameState.setT0BMonitorMode(kMonitorNeutral);
|
|
|
|
switch (GameState.getTSAState()) {
|
|
case kTSAPlayerDetectedRip:
|
|
// Keep the current view from activating.
|
|
break;
|
|
default:
|
|
activateCurrentView(GameState.getCurrentRoom(), GameState.getCurrentDirection(),
|
|
kSpotOnTurnMask);
|
|
break;
|
|
}
|
|
break;
|
|
case kTSA0BTBPTheory:
|
|
case kTSA0BTBPBackground:
|
|
case kTSA0BTBPProcedure:
|
|
initializeTBPMonitor(kMonitorNeutral, 0);
|
|
break;
|
|
|
|
// Ready room
|
|
case kTSA22RedEastZoomInSequence:
|
|
_privateFlags.setFlag(kTSAPrivateKeyVaultOpenFlag, true);
|
|
setCurrentActivation(kActivationKeyVaultOpen);
|
|
if (g_arthurChip)
|
|
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA50", kArthurTSASawJourneymanKey);
|
|
break;
|
|
case kTSA23RedWestVaultZoomInSequence:
|
|
_privateFlags.setFlag(kTSAPrivateChipVaultOpenFlag, true);
|
|
setCurrentActivation(kActivationChipVaultOpen);
|
|
if (g_arthurChip)
|
|
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA54", kArthurTSASawBiochips);
|
|
break;
|
|
case kTSA25NorthPutOnSuit:
|
|
GameState.setTSABiosuitOn(true);
|
|
GameState.setScoringGotBiosuit(true);
|
|
// Fall through...
|
|
case kTSA25NorthAlreadyHaveSuit:
|
|
requestExtraSequence(kTSA25NorthDescending1, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kTSA25NorthDescending1:
|
|
requestExtraSequence(kTSA25NorthDescending2, kExtraCompletedFlag, kFilterNoInput);
|
|
if (GameState.getTSAState() != kTSAPlayerNeedsHistoricalLog && g_arthurChip)
|
|
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA04", kArthurTSAUsedTurbolift);
|
|
break;
|
|
case kTSA25NorthDescending2:
|
|
arriveAt(kTSA26, kNorth);
|
|
break;
|
|
|
|
// Pegasus.
|
|
case kTSA37HorseToAI1:
|
|
case kTSA37AI2ToPrehistoric:
|
|
setCurrentActivation(kActivationJumpToPrehistoric);
|
|
GameState.setTSAState(kPlayerOnWayToPrehistoric);
|
|
break;
|
|
case kTSA37PegasusDepart:
|
|
_vm->setLastEnergyValue(kFullEnergy);
|
|
|
|
switch (GameState.getTSAState()) {
|
|
case kPlayerOnWayToPrehistoric:
|
|
_vm->jumpToNewEnvironment(kPrehistoricID, kPrehistoric02, kSouth);
|
|
GameState.setPrehistoricSeenTimeStream(false);
|
|
GameState.setPrehistoricSeenFlyer1(false);
|
|
GameState.setPrehistoricSeenFlyer2(false);
|
|
GameState.setPrehistoricSeenBridgeZoom(false);
|
|
GameState.setPrehistoricBreakerThrown(false);
|
|
GameState.setScoringGoToPrehistoric(true);
|
|
GameState.setTSAState(kPlayerWentToPrehistoric);
|
|
break;
|
|
case kPlayerOnWayToNorad:
|
|
_vm->jumpToNewEnvironment(kNoradAlphaID, kNorad01, kSouth);
|
|
GameState.setNoradSeenTimeStream(false);
|
|
GameState.setNoradGassed(true);
|
|
GameState.setNoradFillingStationOn(false);
|
|
GameState.setNoradN22MessagePlayed(false);
|
|
GameState.setNoradPlayedGlobeGame(false);
|
|
GameState.setNoradBeatRobotWithClaw(false);
|
|
GameState.setNoradBeatRobotWithDoor(false);
|
|
GameState.setNoradRetScanGood(false);
|
|
GameState.setNoradWaitingForLaser(false);
|
|
GameState.setNoradSubRoomPressure(9);
|
|
GameState.setNoradSubPrepState(kSubNotPrepped);
|
|
break;
|
|
case kPlayerOnWayToMars:
|
|
_vm->jumpToNewEnvironment(kMarsID, kMars0A, kNorth);
|
|
GameState.setMarsSeenTimeStream(false);
|
|
GameState.setMarsHeardUpperPodMessage(false);
|
|
GameState.setMarsRobotThrownPlayer(false);
|
|
GameState.setMarsHeardCheckInMessage(false);
|
|
GameState.setMarsPodAtUpperPlatform(false);
|
|
GameState.setMarsSeenThermalScan(false);
|
|
GameState.setMarsArrivedBelow(false);
|
|
GameState.setMarsSeenRobotAtReactor(false);
|
|
GameState.setMarsAvoidedReactorRobot(false);
|
|
GameState.setMarsLockFrozen(false);
|
|
GameState.setMarsLockBroken(false);
|
|
GameState.setMarsSecurityDown(false);
|
|
GameState.setMarsAirlockOpen(false);
|
|
GameState.setMarsReadyForShuttleTransport(false);
|
|
GameState.setMarsFinishedCanyonChase(false);
|
|
GameState.setMarsThreadedMaze(false);
|
|
GameState.setMarsSawRobotLeave(false);
|
|
break;
|
|
case kPlayerOnWayToWSC:
|
|
_vm->jumpToNewEnvironment(kWSCID, kWSC01, kWest);
|
|
GameState.setWSCSeenTimeStream(false);
|
|
GameState.setWSCPoisoned(false);
|
|
GameState.setWSCAnsweredAboutDart(false);
|
|
GameState.setWSCRemovedDart(false);
|
|
GameState.setWSCAnalyzerOn(false);
|
|
GameState.setWSCDartInAnalyzer(false);
|
|
GameState.setWSCAnalyzedDart(false);
|
|
GameState.setWSCSawMorph(false);
|
|
GameState.setWSCDesignedAntidote(false);
|
|
GameState.setWSCOfficeMessagesOpen(false);
|
|
GameState.setWSCSeenNerd(false);
|
|
GameState.setWSCHeardPage1(false);
|
|
GameState.setWSCHeardPage2(false);
|
|
GameState.setWSCHeardCheckIn(false);
|
|
GameState.setWSCDidPlasmaDodge(false);
|
|
GameState.setWSCSeenSinclairLecture(false);
|
|
GameState.setWSCBeenAtWSC93(false);
|
|
GameState.setWSCCatwalkDark(false);
|
|
GameState.setWSCRobotDead(false);
|
|
GameState.setWSCRobotGone(false);
|
|
break;
|
|
default:
|
|
break;
|
|
};
|
|
break;
|
|
case kTSA37TimeJumpToPegasus:
|
|
if (g_energyMonitor)
|
|
g_energyMonitor->stopEnergyDraining();
|
|
|
|
switch (GameState.getTSAState()) {
|
|
case kPlayerWentToPrehistoric:
|
|
arriveFromPrehistoric();
|
|
break;
|
|
case kPlayerOnWayToNorad:
|
|
arriveFromNorad();
|
|
break;
|
|
case kPlayerOnWayToMars:
|
|
arriveFromMars();
|
|
break;
|
|
case kPlayerOnWayToWSC:
|
|
arriveFromWSC();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case kTSA37DownloadToOpMemReview:
|
|
if (_vm->itemInBiochips(kOpticalBiochip)) {
|
|
switch (GameState.getTSAState()) {
|
|
case kPlayerOnWayToNorad:
|
|
g_opticalChip->playOpMemMovie(kPoseidonSpotID);
|
|
break;
|
|
case kPlayerOnWayToMars:
|
|
g_opticalChip->playOpMemMovie(kAriesSpotID);
|
|
break;
|
|
case kPlayerOnWayToWSC:
|
|
g_opticalChip->playOpMemMovie(kMercurySpotID);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (GameState.allTimeZonesFinished()) {
|
|
requestExtraSequence(kTSA37OpMemReviewToAllClear, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA37AllClearToCongratulations, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA37Congratulations, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA37CongratulationsToExit, kExtraCompletedFlag, kFilterNoInput);
|
|
} else {
|
|
requestExtraSequence(kTSA37OpMemReviewToMainMenu, kExtraCompletedFlag, kFilterNoInput);
|
|
}
|
|
break;
|
|
case kTSA37RecallToDownload:
|
|
case kTSA37ReviewRequiredToExit:
|
|
GameState.setTSAState(kTSAPlayerGotHistoricalLog);
|
|
initializePegasusButtons(kPegasusUnresolved);
|
|
break;
|
|
case kTSA37ZoomToMainMenu:
|
|
case kTSA37HorseToColonel2:
|
|
case kTSA37DownloadToMainMenu:
|
|
case kTSA37OpMemReviewToMainMenu:
|
|
case kTSA37AI4ToMainMenu:
|
|
GameState.setTSAState(kPlayerLockedInPegasus);
|
|
showMainJumpMenu();
|
|
makeContinuePoint();
|
|
break;
|
|
case kTSA37JumpToNoradMenu:
|
|
setCurrentActivation(kActivationJumpToNorad);
|
|
break;
|
|
case kTSA37JumpToMarsMenu:
|
|
setCurrentActivation(kActivationJumpToMars);
|
|
break;
|
|
case kTSA37JumpToWSCMenu:
|
|
setCurrentActivation(kActivationJumpToWSC);
|
|
break;
|
|
case kTSA37CancelNorad:
|
|
case kTSA37CancelMars:
|
|
case kTSA37CancelWSC:
|
|
showMainJumpMenu();
|
|
break;
|
|
case kTSA37CongratulationsToExit:
|
|
GameState.setTSAState(kPlayerFinishedWithTSA);
|
|
initializePegasusButtons(true);
|
|
if (g_arthurChip) {
|
|
if (_vm->getRandomBit())
|
|
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA49", kArthurTSASawBaldwinSayGo);
|
|
else
|
|
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB22", kArthurTSASawBaldwinSayGo);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (g_arthurChip) {
|
|
if (doArthurSawBustMovie)
|
|
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA21", kArthurTSASawBust);
|
|
else if (doArthurRedirectedRobotsMovie && GameState.getTSAState() == kRobotsAtFrontDoor)
|
|
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA02", kArthurTSARedirectedRobots);
|
|
}
|
|
}
|
|
|
|
g_AIArea->checkMiddleArea();
|
|
}
|
|
|
|
void FullTSA::setSoundFXLevel(const uint16 level) {
|
|
Neighborhood::setSoundFXLevel(level);
|
|
if (_extraMovie.isMovieValid())
|
|
_extraMovie.setVolume(level);
|
|
}
|
|
|
|
void FullTSA::setAmbienceLevel(const uint16 level) {
|
|
Neighborhood::setAmbienceLevel(level);
|
|
if (_entranceMusic.isSoundLoaded())
|
|
_entranceFader.setMasterVolume(level);
|
|
if (_solvedMusicCue.isSoundLoaded())
|
|
_solvedMusicCue.setVolume(level);
|
|
}
|
|
|
|
void FullTSA::arriveFromPrehistoric() {
|
|
if (_vm->playerHasItemID(kHistoricalLog)) {
|
|
GameState.setScoringFinishedPrehistoric();
|
|
requestExtraSequence(kTSA37RecallToDownload, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA37DownloadToColonel1, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA37Colonel1, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA37Colonel1ToReviewRequired, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA37ReviewRequiredToExit, kExtraCompletedFlag, kFilterNoInput);
|
|
} else {
|
|
// Make sure rip timer is going...
|
|
startExtraSequence(kTSA37DownloadToMainMenu, kExtraCompletedFlag, kFilterNoInput);
|
|
}
|
|
}
|
|
|
|
void FullTSA::arriveFromNorad() {
|
|
requestExtraSequence(kTSA37RecallToDownload, 0, kFilterNoInput);
|
|
|
|
if (GameState.getNoradFinished() && !GameState.getScoringFinishedNorad()) {
|
|
GameState.setScoringFinishedNorad();
|
|
requestExtraSequence(kTSA37DownloadToOpMemReview, kExtraCompletedFlag, kFilterNoInput);
|
|
} else {
|
|
requestExtraSequence(kTSA37DownloadToMainMenu, kExtraCompletedFlag, kFilterNoInput);
|
|
}
|
|
}
|
|
|
|
void FullTSA::arriveFromMars() {
|
|
requestExtraSequence(kTSA37RecallToDownload, 0, kFilterNoInput);
|
|
|
|
if (GameState.getMarsFinished() && !GameState.getScoringFinishedMars()) {
|
|
GameState.setScoringFinishedMars();
|
|
requestExtraSequence(kTSA37DownloadToOpMemReview, kExtraCompletedFlag, kFilterNoInput);
|
|
} else {
|
|
requestExtraSequence(kTSA37DownloadToMainMenu, kExtraCompletedFlag, kFilterNoInput);
|
|
}
|
|
}
|
|
|
|
void FullTSA::arriveFromWSC() {
|
|
requestExtraSequence(kTSA37RecallToDownload, 0, kFilterNoInput);
|
|
|
|
if (GameState.getWSCFinished() && !GameState.getScoringFinishedWSC()) {
|
|
GameState.setScoringFinishedWSC();
|
|
requestExtraSequence(kTSA37DownloadToOpMemReview, kExtraCompletedFlag, kFilterNoInput);
|
|
} else {
|
|
requestExtraSequence(kTSA37DownloadToMainMenu, kExtraCompletedFlag, kFilterNoInput);
|
|
}
|
|
}
|
|
|
|
void FullTSA::initializePegasusButtons(bool resolved) {
|
|
if (resolved) {
|
|
_sprite1.addPICTResourceFrame(kResolvedPICTID, false, 0, 0);
|
|
_sprite1.moveElementTo(kResolvedLeft, kResolvedTop);
|
|
} else {
|
|
_sprite1.addPICTResourceFrame(kUnresolvedPICTID, false, 0, 0);
|
|
_sprite1.moveElementTo(kUnresolvedLeft, kUnresolvedTop);
|
|
}
|
|
|
|
_sprite1.setCurrentFrameIndex(0);
|
|
_sprite1.show();
|
|
|
|
_sprite2.addPICTResourceFrame(kExitPICTID, false, kExitLeft - kExitHilitedLeft, kExitTop - kExitHilitedTop);
|
|
_sprite2.addPICTResourceFrame(kExitHilitedPICTID, false, 0, 0);
|
|
_sprite2.moveElementTo(kExitHilitedLeft, kExitHilitedTop);
|
|
setCurrentActivation(kActivationReadyToExit);
|
|
_sprite2.setCurrentFrameIndex(0);
|
|
_sprite2.show();
|
|
}
|
|
|
|
Hotspot *FullTSA::getItemScreenSpot(Item *item, DisplayElement *element) {
|
|
switch (item->getObjectID()) {
|
|
case kJourneymanKey:
|
|
return _vm->getAllHotspots().findHotspotByID(kTSA22EastKeySpotID);
|
|
break;
|
|
case kPegasusBiochip:
|
|
return _vm->getAllHotspots().findHotspotByID(kTSA23WestChipsSpotID);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return Neighborhood::getItemScreenSpot(item, element);
|
|
}
|
|
|
|
void FullTSA::dropItemIntoRoom(Item *item, Hotspot *dropSpot) {
|
|
Neighborhood::dropItemIntoRoom(item, dropSpot);
|
|
|
|
switch (item->getObjectID()) {
|
|
case kKeyCard:
|
|
if (dropSpot->getObjectID() == kTSAGTCardDropSpotID)
|
|
startExtraSequence(kTSAGTCardSwipe, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kHistoricalLog:
|
|
if (dropSpot->getObjectID() == kTSA0BNorthHistLogSpotID) {
|
|
requestExtraSequence(kTSA0BNorthHistLogCloseWithLog, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA0BNorthTurnRight, 0, kFilterNoInput);
|
|
requestExtraSequence(kTSA0BEastZoomIn, kExtraCompletedFlag, kFilterNoInput);
|
|
requestExtraSequence(kTSA0BComparisonStartup, kExtraCompletedFlag, kFilterNoInput);
|
|
GameState.setScoringPutLogInReader(true);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
uint FullTSA::getHistoricalLogIndex() {
|
|
uint index;
|
|
|
|
if (GameState.getTSASeenNoradNormal() && GameState.getTSASeenNoradAltered())
|
|
index = 8;
|
|
else
|
|
index = 0;
|
|
|
|
if (GameState.getTSASeenMarsNormal() && GameState.getTSASeenMarsAltered())
|
|
index += 4;
|
|
|
|
if (GameState.getTSASeenCaldoriaNormal() && GameState.getTSASeenCaldoriaAltered())
|
|
index += 2;
|
|
|
|
if (GameState.getTSASeenWSCNormal() && GameState.getTSASeenWSCAltered())
|
|
index += 1;
|
|
|
|
return index;
|
|
}
|
|
|
|
void FullTSA::handleInput(const Input &input, const Hotspot *cursorSpot) {
|
|
switch (MakeRoomView(GameState.getCurrentRoom(), GameState.getCurrentDirection())) {
|
|
case MakeRoomView(kTSA0B, kEast):
|
|
if (GameState.getTSA0BZoomedIn() && !_navMovie.isRunning() && GameState.getT0BMonitorMode() == kMonitorNeutral) {
|
|
switch (GameState.getTSAState()) {
|
|
case kTSAPlayerInstalledHistoricalLog:
|
|
case kTSABossSawHistoricalLog:
|
|
case kRobotsAtCommandCenter:
|
|
case kRobotsAtFrontDoor:
|
|
case kRobotsAtReadyRoom:
|
|
if (cursorSpot) {
|
|
switch (cursorSpot->getObjectID()) {
|
|
case kTSA0BEastCompareNoradSpotID:
|
|
_sprite1.setCurrentFrameIndex(0);
|
|
_sprite2.setCurrentFrameIndex(0);
|
|
_sprite1.show();
|
|
_sprite2.show();
|
|
break;
|
|
case kTSA0BEastCompareMarsSpotID:
|
|
_sprite1.setCurrentFrameIndex(1);
|
|
_sprite2.setCurrentFrameIndex(1);
|
|
_sprite1.show();
|
|
_sprite2.show();
|
|
break;
|
|
case kTSA0BEastCompareCaldoriaSpotID:
|
|
_sprite1.setCurrentFrameIndex(2);
|
|
_sprite2.setCurrentFrameIndex(2);
|
|
_sprite1.show();
|
|
_sprite2.show();
|
|
break;
|
|
case kTSA0BEastCompareWSCSpotID:
|
|
_sprite1.setCurrentFrameIndex(3);
|
|
_sprite2.setCurrentFrameIndex(3);
|
|
_sprite1.show();
|
|
_sprite2.show();
|
|
break;
|
|
default:
|
|
_sprite1.hide();
|
|
_sprite2.hide();
|
|
break;
|
|
}
|
|
} else {
|
|
_sprite1.hide();
|
|
_sprite2.hide();
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
case MakeRoomView(kTSA0B, kNorth):
|
|
if (GameState.getTSA0BZoomedIn() && !_navMovie.isRunning()) {
|
|
switch (GameState.getTSAState()) {
|
|
case kRobotsAtCommandCenter:
|
|
case kRobotsAtFrontDoor:
|
|
case kRobotsAtReadyRoom:
|
|
if (cursorSpot) {
|
|
switch (cursorSpot->getObjectID()) {
|
|
case kTSA0BNorthRobotsToCommandCenterSpotID:
|
|
_sprite1.setCurrentFrameIndex(kRedirectionCCRolloverSprite);
|
|
_sprite1.show();
|
|
break;
|
|
case kTSA0BNorthRobotsToReadyRoomSpotID:
|
|
_sprite1.setCurrentFrameIndex(kRedirectionRRRolloverSprite);
|
|
_sprite1.show();
|
|
break;
|
|
case kTSA0BNorthRobotsToFrontDoorSpotID:
|
|
_sprite1.setCurrentFrameIndex(kRedirectionFDRolloverSprite);
|
|
_sprite1.show();
|
|
break;
|
|
default:
|
|
_sprite1.hide();
|
|
break;
|
|
}
|
|
} else {
|
|
_sprite1.hide();
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
Neighborhood::handleInput(input, cursorSpot);
|
|
}
|
|
|
|
void FullTSA::releaseSprites() {
|
|
_sprite1.hide();
|
|
_sprite2.hide();
|
|
_sprite3.hide();
|
|
_sprite1.discardFrames();
|
|
_sprite2.discardFrames();
|
|
_sprite3.discardFrames();
|
|
}
|
|
|
|
bool FullTSA::canSolve() {
|
|
return GameState.getCurrentRoomAndView() == MakeRoomView(kTSA0B, kNorth) &&
|
|
GameState.getTSA0BZoomedIn() &&
|
|
(GameState.getTSAState() == kRobotsAtCommandCenter ||
|
|
GameState.getTSAState() == kRobotsAtFrontDoor ||
|
|
GameState.getTSAState() == kRobotsAtReadyRoom);
|
|
}
|
|
|
|
void FullTSA::doSolve() {
|
|
// REROUTING ROBOTS
|
|
|
|
_sprite1.setCurrentFrameIndex(kRedirectionFDDoorSprite);
|
|
_sprite1.show();
|
|
_vm->delayShell(1, 2);
|
|
_sprite1.hide();
|
|
|
|
switch (GameState.getTSAState()) {
|
|
case kRobotsAtCommandCenter:
|
|
GameState.setTSAState(kRobotsAtFrontDoor);
|
|
_sprite2.setCurrentFrameIndex(kRedirectionNewTargetSprite);
|
|
startExtraSequence(kTSA0BRobotsFromCommandCenterToFrontDoor, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
case kRobotsAtFrontDoor:
|
|
// Nothing
|
|
break;
|
|
case kRobotsAtReadyRoom:
|
|
GameState.setTSAState(kRobotsAtFrontDoor);
|
|
_sprite2.setCurrentFrameIndex(kRedirectionNewTargetSprite);
|
|
startExtraSequence(kTSA0BRobotsFromReadyRoomToFrontDoor, kExtraCompletedFlag, kFilterNoInput);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void FullTSA::updateCursor(const Common::Point where, const Hotspot *cursorSpot) {
|
|
if (cursorSpot) {
|
|
switch (cursorSpot->getObjectID()) {
|
|
case kTSA0BEastMonitorSpotID:
|
|
case kTSA0BNorthMonitorSpotID:
|
|
case kTSA0BWestMonitorSpotID:
|
|
case kTSA22EastMonitorSpotID:
|
|
case kTSA23WestMonitorSpotID:
|
|
_vm->_cursor->setCurrentFrameIndex(1);
|
|
return;
|
|
case kTSA0BEastMonitorOutSpotID:
|
|
case kTSA0BNorthMonitorOutSpotID:
|
|
case kTSA0BWestMonitorOutSpotID:
|
|
_vm->_cursor->setCurrentFrameIndex(2);
|
|
return;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
Neighborhood::updateCursor(where, cursorSpot);
|
|
}
|
|
|
|
Common::String FullTSA::getNavMovieName() {
|
|
return "Images/TSA/Full TSA.movie";
|
|
}
|
|
|
|
Common::String FullTSA::getSoundSpotsName() {
|
|
return "Sounds/TSA/TSA Spots";
|
|
}
|
|
|
|
} // End of namespace Pegasus
|