void PressureDoor::stopChangingPressure() { Neighborhood *owner; switch (GameState.getNoradSubRoomPressure()) { case 11: _typeMovie.setSegment(kMaxPressureLoopStart * _typeScale, kMaxPressureLoopStop * _typeScale); _typeMovie.setFlags(kLoopTimeBase); _typeMovie.show(); _typeMovie.start(); break; case 10: _typeMovie.setSegment(kCautionLoopStart * _typeScale, kCautionLoopStop * _typeScale); _typeMovie.setFlags(kLoopTimeBase); _typeMovie.show(); _typeMovie.start(); break; case kNormalSubRoomPressure: owner = getOwner(); _typeMovie.setSegment(kOpeningDoorLoopStart * _typeScale, kOpeningDoorLoopStop * _typeScale); _typeMovie.setFlags(kLoopTimeBase); _typeMovie.show(); _gameState = kPlayingDoneMessage; owner->requestDelay(2, 1, kFilterNoInput, kDelayCompletedFlag); _typeMovie.start(); break; default: _typeMovie.hide(); break; } }
void PressureDoor::doSolve() { if (_playingAgainstRobot) { GameState.setNoradSubRoomPressure(11); _levelsMovie.setTime((11 + kPressureBase) * _levelsScale); _levelsMovie.redrawMovieWorld(); _typeMovie.setSegment(kMaxPressureLoopStart * _typeScale, kMaxPressureLoopStop * _typeScale); _typeMovie.setFlags(kLoopTimeBase); _typeMovie.show(); _typeMovie.start(); g_AIArea->checkMiddleArea(); } else { GameState.setNoradSubRoomPressure(kNormalSubRoomPressure); _levelsMovie.setTime((kNormalSubRoomPressure + kPressureBase) * _levelsScale); _levelsMovie.redrawMovieWorld(); _typeMovie.setSegment(kOpeningDoorLoopStart * _typeScale, kOpeningDoorLoopStop * _typeScale); _typeMovie.setFlags(kLoopTimeBase); _typeMovie.show(); Neighborhood *owner = getOwner(); owner->requestDelay(2, 1, kFilterNoInput, kDelayCompletedFlag); _gameState = kPlayingDoneMessage; _typeMovie.start(); g_AIArea->checkMiddleArea(); } }
void PressureDoor::receiveNotification(Notification *notification, const NotificationFlags flags) { Neighborhood *owner = getOwner(); if (notification == _neighborhoodNotification) { if (_playingAgainstRobot && (flags & kExtraCompletedFlag) != 0) { ExtraTable::Entry entry; switch (_robotState) { case kPlayingRobotApproaching: _utilityTimer.stop(); if (GameState.getNoradSubRoomPressure() == kMaxPressure) { owner->getExtraEntry(kN59PlayerWins1, entry); _utilityTimer.setSegment(entry.movieStart, entry.movieEnd); _utilityTimer.setTime(entry.movieStart); _utilityCallBack.setCallBackFlag(kDoorJumpsUpFlag); _punchInTime = kLoopPunchInTime + entry.movieStart; _utilityCallBack.scheduleCallBack(kTriggerTimeFwd, _punchInTime, kNavTimeScale); owner->startExtraSequence(kN59PlayerWins1, kExtraCompletedFlag, kFilterNoInput); _utilityTimer.start(); _robotState = kRobotDying; } else { owner->getExtraEntry(kN59RobotPunchLoop, entry); _utilityTimer.setSegment(entry.movieStart, entry.movieEnd); _utilityTimer.setTime(entry.movieStart); _utilityCallBack.setCallBackFlag(kDoorJumpsUpFlag); _punchInTime = kLoopPunchInTime + entry.movieStart; _utilityCallBack.scheduleCallBack(kTriggerTimeFwd, _punchInTime, kNavTimeScale); owner->startSpotLoop(entry.movieStart, entry.movieEnd, kExtraCompletedFlag); _utilityTimer.start(); _robotState = kRobotPunching; _punchCount = 1; } break; case kRobotPunching: if (GameState.getNoradSubRoomPressure() == kMaxPressure) { owner->startExtraSequence(kN59PlayerWins1, kExtraCompletedFlag, kFilterNoInput); _robotState = kRobotDying; } else if (++_punchCount >= kMaxPunches) { _robotState = kRobotComingThrough; owner->getExtraEntry(kN59RobotWins, entry); _utilityTimer.stop(); _utilityTimer.setSegment(entry.movieStart, entry.movieEnd); _utilityTimer.setTime(entry.movieStart); _utilityCallBack.cancelCallBack(); _utilityCallBack.setCallBackFlag(kDoorCrushedFlag); _utilityCallBack.scheduleCallBack(kTriggerTimeFwd, kPunchThroughTime + entry.movieStart, kNavTimeScale); owner->startExtraSequence(kN59RobotWins, kExtraCompletedFlag, kFilterNoInput); _utilityTimer.start(); } else { _utilityCallBack.setCallBackFlag(kDoorJumpsUpFlag); _utilityCallBack.scheduleCallBack(kTriggerTimeFwd, _punchInTime, kNavTimeScale); owner->scheduleNavCallBack(kExtraCompletedFlag); } break; case kRobotComingThrough: g_system->delayMillis(2 * 1000); ((PegasusEngine *)g_engine)->die(kDeathRobotThroughNoradDoor); break; case kRobotDying: _robotState = kRobotDead; _levelsMovie.stop(); _levelsMovie.setSegment((kNormalSubRoomPressure + kPressureBase) * _levelsScale, (GameState.getNoradSubRoomPressure() + kPressureBase) * _levelsScale + 1); _levelsMovie.setTime((GameState.getNoradSubRoomPressure() + kPressureBase) * _levelsScale); _pressureCallBack.setCallBackFlag(kPressureDroppingFlag); _pressureCallBack.scheduleCallBack(kTriggerAtStart, 0, 0); _typeMovie.stop(); _typeMovie.setSegment(0, _typeMovie.getDuration()); _typeMovie.setTime(kDecreasingPressureTime * _typeScale); _typeMovie.redrawMovieWorld(); _typeMovie.show(); _downButton.show(); _downButton.setCurrentFrameIndex(1); _gameState = kGameOver; allowInput(false); _levelsMovie.setRate(Common::Rational(-4, 3)); // Should match door tracker. break; case kRobotDead: allowInput(true); ((NoradDelta *)owner)->playerBeatRobotWithDoor(); owner->requestDeleteCurrentInteraction(); break; } } if ((flags & (kDelayCompletedFlag | kSpotSoundCompletedFlag)) != 0) { switch (_gameState) { case kPlayingPressureMessage: _typeMovie.setTime(kEqualizeTime * _typeScale); _typeMovie.redrawMovieWorld(); owner->requestDelay(1, 5, kFilterNoInput, 0); owner->requestSpotSound(_equalizeSoundIn, _equalizeSoundOut, kFilterNoInput, 0); owner->requestDelay(1, 5, kFilterNoInput, kDelayCompletedFlag); _gameState = kPlayingEqualizeMessage; break; case kPlayingEqualizeMessage: _gameState = kWaitingForPlayer; stopChangingPressure(); break; case kPlayingDoneMessage: _gameState = kWaitingForPlayer; _typeMovie.stop(); _typeMovie.setFlags(0); _typeMovie.hide(); if (!_playingAgainstRobot) ((Norad *)_owner)->doneWithPressureDoor(); break; } } } else if (notification == &_pressureNotification) { switch (flags) { case kSplashFinished: _levelsMovie.stop(); _levelsMovie.setSegment(0, _levelsMovie.getDuration()); _levelsMovie.setTime((GameState.getNoradSubRoomPressure() + kPressureBase) * _levelsScale); _levelsMovie.redrawMovieWorld(); if (GameState.getNoradSubRoomPressure() != kNormalSubRoomPressure) { _typeMovie.show(); owner->requestDelay(1, 5, kFilterNoInput, 0); owner->requestSpotSound(_pressureSoundIn, _pressureSoundOut, kFilterNoInput, 0); owner->requestDelay(1, 5, kFilterNoInput, kDelayCompletedFlag); _gameState = kPlayingPressureMessage; } else { _gameState = kWaitingForPlayer; } break; case kPressureDroppingFlag: _levelsMovie.stop(); _levelsMovie.hide(); _typeMovie.stop(); _typeMovie.hide(); _upButton.hide(); _downButton.hide(); owner->startExtraSequence(kN59PlayerWins2, kExtraCompletedFlag, kFilterNoInput); break; } } else if (notification == &_utilityNotification) { switch (flags) { case kDoorJumpsUpFlag: _utilityCallBack.setCallBackFlag(kDoorJumpsBackFlag); _utilityCallBack.scheduleCallBack(kTriggerTimeFwd, _punchInTime + kNavTimePerFrame, kNavTimeScale); _levelsMovie.hide(); _typePunched = _typeMovie.isVisible(); if (_typePunched == true) _typeMovie.hide(); _upButton.hide(); _downButton.hide(); break; case kDoorJumpsBackFlag: _levelsMovie.show(); _upButton.show(); _downButton.show(); if (_typePunched) _typeMovie.show(); break; case kDoorCrushedFlag: _levelsMovie.hide(); _typeMovie.hide(); _upButton.hide(); _downButton.hide(); break; } } }