Exemple #1
0
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;
	}
}
Exemple #2
0
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();
	}
}
Exemple #3
0
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;
		}
	}
}