Files
scummvm-cursorfix/engines/pegasus/neighborhood/prehistoric/prehistoric.cpp
2026-02-02 04:50:13 +01:00

817 lines
27 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 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "pegasus/compass.h"
#include "pegasus/energymonitor.h"
#include "pegasus/gamestate.h"
#include "pegasus/pegasus.h"
#include "pegasus/ai/ai_action.h"
#include "pegasus/ai/ai_area.h"
#include "pegasus/ai/ai_condition.h"
#include "pegasus/ai/ai_rule.h"
#include "pegasus/items/biochips/arthurchip.h"
#include "pegasus/neighborhood/prehistoric/prehistoric.h"
namespace Pegasus {
static const int16 s_prehistoricCompass[kPrehistoric25 + 1][4] = {
{ 0, 170, 90, 270 }, // kPrehistoric01
{ 0, 180, 90, 270 }, // kPrehistoric02
{ 10, 180, 90, 270 }, // kPrehistoric03
{ 10, 190, 90, 270 }, // kPrehistoric04
{ 10, 195, 90, 270 }, // kPrehistoric05
{ 20, 210, 90, 270 }, // kPrehistoric06
{ 20, 200, 130, 276 }, // kPrehistoric07
{ 20, 176, 110, 260 }, // kPrehistoric08
{ 20, 200, 100, 270 }, // kPrehistoric09
{ 14, 186, 100, 280 }, // kPrehistoric10
{ 26, 206, 116, 296 }, // kPrehistoric11
{ 60, 226, 140, 320 }, // kPrehistoric12
{ 0, 180, 80, 270 }, // kPrehistoric13
{ 14, 200, 106, 286 }, // kPrehistoric14
{ -10, 174, 80, 260 }, // kPrehistoric15
{ 54, 236, 140, 210 }, // kPrehistoric16
{ -24, 160, 70, 250 }, // kPrehistoric17
{ 26, 206, 140, 296 }, // kPrehistoric18
{ -16, 160, 70, 250 }, // kPrehistoric19
{ -16, 160, 70, 250 }, // kPrehistoric20
{ -10, 160, 90, 250 }, // kPrehistoric21
{ -20, 160, 70, 244 }, // kPrehistoric22
{ -20, 160, 70, 244 }, // kPrehistoric22North
{ 60, 234, 150, 330 }, // kPrehistoric23
{ 50, 230, 140, 320 }, // kPrehistoric24
{ 60, 240, 140, 330 } // kPrehistoric25
};
static const TimeValue kPrehistoricFlashlightClickIn = 0;
static const TimeValue kPrehistoricFlashlightClickOut = 138;
static const TimeValue kPrehistoricBumpIntoWallIn = 138;
static const TimeValue kPrehistoricBumpIntoWallOut = 291;
static const TimeValue kBridgeRetractIn = 291;
static const TimeValue kBridgeRetractOut = 1499;
static const TimeValue kPrehistoricWarningTimeLimit = kTenMinutes;
Prehistoric::Prehistoric(InputHandler *nextHandler, PegasusEngine *owner) : Neighborhood(nextHandler, owner, "Prehistoric", kPrehistoricID) {
setIsItemTaken(kHistoricalLog);
}
uint16 Prehistoric::getDateResID() const {
return kDatePrehistoricID;
}
void Prehistoric::init() {
Neighborhood::init();
// Forces a stop so the flashlight can turn off...
forceStridingStop(kPrehistoric12, kSouth, kNoAlternateID);
}
void Prehistoric::start() {
if (g_energyMonitor) {
g_energyMonitor->stopEnergyDraining();
g_energyMonitor->restoreLastEnergyValue();
_vm->resetEnergyDeathReason();
g_energyMonitor->startEnergyDraining();
}
Neighborhood::start();
if (GameState.getCurrentRoomAndView() == MakeRoomView(kPrehistoric02, kSouth) && g_arthurChip)
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA01", kArthurGoToPrehistoric);
}
class FinishPrehistoricAction : public AIPlayMessageAction {
public:
FinishPrehistoricAction() : AIPlayMessageAction("Images/AI/Prehistoric/XP25W", false) {}
~FinishPrehistoricAction() override {}
void performAIAction(AIRule *) override;
};
void FinishPrehistoricAction::performAIAction(AIRule *rule) {
AIPlayMessageAction::performAIAction(rule);
g_vm->die(kPlayerWonGame);
}
void Prehistoric::setUpAIRules() {
Neighborhood::setUpAIRules();
if (g_AIArea) {
if (_vm->isDemo()) {
FinishPrehistoricAction *doneAction = new FinishPrehistoricAction();
AIHasItemCondition *hasLogCondition = new AIHasItemCondition(kHistoricalLog);
AIRule *rule = new AIRule(hasLogCondition, doneAction);
g_AIArea->addAIRule(rule);
}
if (!_vm->isOldDemo()) {
AIPlayMessageAction *messageAction = new AIPlayMessageAction("Images/AI/Prehistoric/XP1NB", false);
AILocationCondition *locCondition = new AILocationCondition(1);
locCondition->addLocation(MakeRoomView(kPrehistoric16, kNorth));
AIRule *rule = new AIRule(locCondition, messageAction);
g_AIArea->addAIRule(rule);
messageAction = new AIPlayMessageAction("Images/AI/Prehistoric/XP2SB", false);
locCondition = new AILocationCondition(1);
locCondition->addLocation(MakeRoomView(kPrehistoric01, kSouth));
rule = new AIRule(locCondition, messageAction);
g_AIArea->addAIRule(rule);
messageAction = new AIPlayMessageAction("Images/AI/Prehistoric/XP2SB", false);
locCondition = new AILocationCondition(1);
locCondition->addLocation(MakeRoomView(kPrehistoric08, kEast));
rule = new AIRule(locCondition, messageAction);
g_AIArea->addAIRule(rule);
messageAction = new AIPlayMessageAction("Images/AI/Prehistoric/XP2SB", false);
locCondition = new AILocationCondition(1);
locCondition->addLocation(MakeRoomView(kPrehistoric25, kWest));
rule = new AIRule(locCondition, messageAction);
g_AIArea->addAIRule(rule);
messageAction = new AIPlayMessageAction("Images/AI/Prehistoric/XP16NB", false);
locCondition = new AILocationCondition(1);
locCondition->addLocation(MakeRoomView(kPrehistoric23, kNorth));
rule = new AIRule(locCondition, messageAction);
g_AIArea->addAIRule(rule);
messageAction = new AIPlayMessageAction("Images/AI/Prehistoric/XP18NB", false);
AITimerCondition *timerCondition = new AITimerCondition(kPrehistoricWarningTimeLimit, 1, true);
rule = new AIRule(timerCondition, messageAction);
g_AIArea->addAIRule(rule);
}
if (!_vm->isDemo()) {
AIPlayMessageAction *messageAction = new AIPlayMessageAction("Images/AI/Prehistoric/XP25W", false);
AIHasItemCondition *hasLogCondition = new AIHasItemCondition(kHistoricalLog);
AIRule *rule = new AIRule(hasLogCondition, messageAction);
g_AIArea->addAIRule(rule);
}
}
}
TimeValue Prehistoric::getViewTime(const RoomID room, const DirectionConstant direction) {
ExtraTable::Entry extra;
uint32 extraID = 0xffffffff;
switch (MakeRoomView(room, direction)) {
case MakeRoomView(kPrehistoric02, kSouth):
if (!GameState.getPrehistoricSeenTimeStream()) {
getExtraEntry(kPreArrivalFromTSA, extra);
return extra.movieStart;
}
break;
case MakeRoomView(kPrehistoric25, kEast):
if (_privateFlags.getFlag(kPrehistoricPrivateVaultOpenFlag)) {
if (_vm->itemInLocation(kHistoricalLog, kPrehistoricID, kPrehistoric25, kEast))
extraID = kPre25EastViewWithLog;
else
extraID = kPre25EastViewNoLog;
}
break;
default:
break;
}
if (extraID == 0xffffffff)
return Neighborhood::getViewTime(room, direction);
getExtraEntry(extraID, extra);
return extra.movieEnd - 1;
}
void Prehistoric::findSpotEntry(const RoomID room, const DirectionConstant direction, SpotFlags flags, SpotTable::Entry &entry) {
Neighborhood::findSpotEntry(room, direction, flags, entry);
// The original strangely disabled the loop for the two volcano spots:
// (kPrehistoric01, kSouth) and (kPrehistoric25, kSouth)
// We don't do that here.
switch (MakeRoomView(room, direction)) {
case MakeRoomView(kPrehistoric01, kEast):
if (GameState.getPrehistoricSeenFlyer1())
entry.clear();
else
GameState.setPrehistoricSeenFlyer1(true);
break;
case MakeRoomView(kPrehistoric08, kEast):
if (GameState.getPrehistoricSeenFlyer2())
entry.clear();
else
GameState.setPrehistoricSeenFlyer2(true);
break;
default:
break;
}
}
int16 Prehistoric::getStaticCompassAngle(const RoomID room, const DirectionConstant dir) {
if (room == kPrehistoricDeath)
return g_compass->getFaderValue();
return s_prehistoricCompass[room][dir];
}
void Prehistoric::getExitCompassMove(const ExitTable::Entry &exitEntry, FaderMoveSpec &compassMove) {
uint32 angle;
Neighborhood::getExitCompassMove(exitEntry, compassMove);
switch (MakeRoomView(exitEntry.room, exitEntry.direction)) {
case MakeRoomView(kPrehistoric01, kNorth):
compassMove.insertFaderKnot(exitEntry.movieStart + (exitEntry.movieEnd - exitEntry.movieStart) / 2, -10);
break;
case MakeRoomView(kPrehistoric06, kEast):
compassMove.insertFaderKnot(exitEntry.movieStart + (exitEntry.movieEnd - exitEntry.movieStart) / 4, 95);
compassMove.insertFaderKnot(exitEntry.movieStart + (exitEntry.movieEnd - exitEntry.movieStart) / 4 * 1, 100);
break;
case MakeRoomView(kPrehistoric18, kEast):
if (getCurrentAlternate() == kAltPrehistoricBridgeSet) {
compassMove.insertFaderKnot(exitEntry.movieStart + kPrehistoricFrameDuration * 11, 145);
compassMove.insertFaderKnot(exitEntry.movieStart + kPrehistoricFrameDuration * 26, 145);
compassMove.insertFaderKnot(exitEntry.movieStart + kPrehistoricFrameDuration * 39, 148);
compassMove.insertFaderKnot(exitEntry.movieStart + kPrehistoricFrameDuration * 114, 140);
} else {
compassMove.insertFaderKnot(exitEntry.movieStart + kPrehistoricFrameDuration * 10, 140);
compassMove.insertFaderKnot(exitEntry.movieStart + kPrehistoricFrameDuration * 16, 145);
compassMove.insertFaderKnot(exitEntry.movieEnd, 145);
}
break;
case MakeRoomView(kPrehistoric23, kWest):
angle = compassMove.getNthKnotValue(0);
compassMove.insertFaderKnot(exitEntry.movieStart + kPrehistoricFrameDuration * 17, angle);
compassMove.insertFaderKnot(exitEntry.movieStart + kPrehistoricFrameDuration * 32, angle - 90);
compassMove.insertFaderKnot(exitEntry.movieEnd, angle - 90);
break;
default:
break;
}
}
void Prehistoric::turnTo(const DirectionConstant newDirection) {
setCurrentAlternate(kAltPrehistoricNormal);
_privateFlags.setFlag(kPrehistoricPrivateVaultOpenFlag, false);
Neighborhood::turnTo(newDirection);
Item *keyCard;
bool doArthurFeelLikeYodelingMovie = false;
switch (GameState.getCurrentRoomAndView()) {
case MakeRoomView(kPrehistoric08, kEast):
case MakeRoomView(kPrehistoric10, kEast):
case MakeRoomView(kPrehistoric12, kEast):
case MakeRoomView(kPrehistoric14, kEast):
case MakeRoomView(kPrehistoric25, kWest):
doArthurFeelLikeYodelingMovie = true;
break;
case MakeRoomView(kPrehistoric18, kEast):
zoomToVault();
break;
case MakeRoomView(kPrehistoric18, kNorth):
case MakeRoomView(kPrehistoric18, kSouth):
if (_privateFlags.getFlag(kPrehistoricPrivateExtendedBridgeFlag)) {
playSpotSoundSync(kBridgeRetractIn, kBridgeRetractOut);
_privateFlags.setFlag(kPrehistoricPrivateExtendedBridgeFlag, false);
loadAmbientLoops();
}
// fall through
case MakeRoomView(kPrehistoric25, kEast):
setCurrentActivation(kActivationVaultClosed);
if (GameState.getCurrentRoomAndView() == MakeRoomView(kPrehistoric25, kEast) &&
!GameState.isTakenItemID(kHistoricalLog) && g_arthurChip)
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA60", kArthurPrehistoricCrossedBridge);
break;
case MakeRoomView(kPrehistoric23, kWest):
if (g_arthurChip)
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA59", kArthurPrehistoricSawEggs);
break;
case MakeRoomView(kPrehistoric16, kNorth):
case MakeRoomView(kPrehistoric21, kWest):
keyCard = _vm->getAllItems().findItemByID(kKeyCard);
if (keyCard->getItemState() == kFlashlightOff) {
keyCard->setItemState(kFlashlightOn);
playSpotSoundSync(kPrehistoricFlashlightClickIn, kPrehistoricFlashlightClickOut);
}
break;
case MakeRoomView(kPrehistoric16, kEast):
case MakeRoomView(kPrehistoric16, kWest):
case MakeRoomView(kPrehistoric21, kNorth):
case MakeRoomView(kPrehistoric21, kSouth):
keyCard = _vm->getAllItems().findItemByID(kKeyCard);
if (keyCard->getItemState() == kFlashlightOn) {
keyCard->setItemState(kFlashlightOff);
playSpotSoundSync(kPrehistoricFlashlightClickIn, kPrehistoricFlashlightClickOut);
}
break;
default:
break;
}
if (doArthurFeelLikeYodelingMovie && g_arthurChip)
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA15", kArthurPrehistoricAtCliffEdge);
}
void Prehistoric::zoomToVault() {
if (!GameState.getPrehistoricSeenBridgeZoom())
startExtraSequence(kPre18EastZoom, kExtraCompletedFlag, kFilterNoInput);
}
void Prehistoric::checkContinuePoint(const RoomID room, const DirectionConstant direction) {
switch (MakeRoomView(room, direction)) {
case MakeRoomView(kPrehistoric08, kEast):
case MakeRoomView(kPrehistoric18, kSouth):
case MakeRoomView(kPrehistoric16, kNorth):
case MakeRoomView(kPrehistoric21, kNorth):
case MakeRoomView(kPrehistoric25, kNorth):
makeContinuePoint();
break;
default:
break;
}
}
void Prehistoric::arriveAt(const RoomID room, const DirectionConstant direction) {
Item *keyCard;
bool doArthurLetsSpreadOutMovie, doArthurFeelLikeYodelingMovie;
if (MakeRoomView(room, direction) == MakeRoomView(kPrehistoric25, kEast) &&
_privateFlags.getFlag(kPrehistoricPrivateExtendedBridgeFlag)) {
_navMovie.stop();
playSpotSoundSync(kBridgeRetractIn, kBridgeRetractOut);
_privateFlags.setFlag(kPrehistoricPrivateExtendedBridgeFlag, false);
}
Neighborhood::arriveAt(room, direction);
doArthurLetsSpreadOutMovie = false;
doArthurFeelLikeYodelingMovie = false;
switch (MakeRoomView(room, direction)) {
case MakeRoomView(kPrehistoricDeath, kNorth):
case MakeRoomView(kPrehistoricDeath, kSouth):
case MakeRoomView(kPrehistoricDeath, kEast):
case MakeRoomView(kPrehistoricDeath, kWest):
if (GameState.getLastRoom() == kPrehistoric23)
die(kDeathEatenByDinosaur);
else
die(kDeathFallOffCliff);
break;
case MakeRoomView(kPrehistoric02, kSouth):
if (!GameState.getPrehistoricSeenTimeStream()) {
GameState.setPrehistoricTriedToExtendBridge(false);
GameState.setPrehistoricSeenFlyer1(false);
GameState.setPrehistoricSeenFlyer2(false);
GameState.setPrehistoricSeenBridgeZoom(false);
GameState.setPrehistoricBreakerThrown(false);
startExtraSequence(kPreArrivalFromTSA, kExtraCompletedFlag, kFilterNoInput);
}
break;
case MakeRoomView(kPrehistoric06, kNorth):
case MakeRoomView(kPrehistoric13, kWest):
doArthurLetsSpreadOutMovie = true;
break;
case MakeRoomView(kPrehistoric22North, kNorth):
if (g_arthurChip)
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBB44", kArthurPrehistoricSawBreaker);
break;
case MakeRoomView(kPrehistoric10, kEast):
case MakeRoomView(kPrehistoric12, kEast):
case MakeRoomView(kPrehistoric14, kEast):
case MakeRoomView(kPrehistoric25, kWest):
doArthurFeelLikeYodelingMovie = true;
break;
case MakeRoomView(kPrehistoric18, kEast):
zoomToVault();
break;
case MakeRoomView(kPrehistoric16, kNorth):
keyCard = _vm->getAllItems().findItemByID(kKeyCard);
if (keyCard->getItemState() == kFlashlightOff) {
keyCard->setItemState(kFlashlightOn);
playSpotSoundSync(kPrehistoricFlashlightClickIn, kPrehistoricFlashlightClickOut);
}
if (g_AIArea)
g_AIArea->checkRules();
break;
case MakeRoomView(kPrehistoric01, kSouth):
case MakeRoomView(kPrehistoric23, kNorth):
if (g_AIArea)
g_AIArea->checkRules();
break;
case MakeRoomView(kPrehistoric13, kNorth):
doArthurLetsSpreadOutMovie = true;
// falls through
case MakeRoomView(kPrehistoric08, kSouth):
case MakeRoomView(kPrehistoric10, kSouth):
case MakeRoomView(kPrehistoric12, kSouth):
case MakeRoomView(kPrehistoric14, kSouth):
case MakeRoomView(kPrehistoric15, kNorth):
case MakeRoomView(kPrehistoric16, kSouth):
case MakeRoomView(kPrehistoric17, kNorth):
case MakeRoomView(kPrehistoric18, kSouth):
case MakeRoomView(kPrehistoric19, kNorth):
case MakeRoomView(kPrehistoric20, kNorth):
case MakeRoomView(kPrehistoric21, kEast):
keyCard = _vm->getAllItems().findItemByID(kKeyCard);
if (keyCard->getItemState() == kFlashlightOn) {
keyCard->setItemState(kFlashlightOff);
playSpotSoundSync(kPrehistoricFlashlightClickIn, kPrehistoricFlashlightClickOut);
}
break;
case MakeRoomView(kPrehistoric25, kEast):
setCurrentActivation(kActivationVaultClosed);
if (!GameState.isTakenItemID(kHistoricalLog) && g_arthurChip)
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA60", kArthurPrehistoricCrossedBridge);
break;
case MakeRoomView(kPrehistoric23, kWest):
if (g_arthurChip)
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA59", kArthurPrehistoricSawEggs);
break;
default:
break;
}
if (g_arthurChip) {
if (doArthurLetsSpreadOutMovie)
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA20", kArthurPrehistoricReachedJunction);
else if (doArthurFeelLikeYodelingMovie)
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA15", kArthurPrehistoricAtCliffEdge);
}
}
void Prehistoric::loadAmbientLoops() {
RoomID room = GameState.getCurrentRoom();
switch (room) {
case kPrehistoric02:
// 1/4 volume.
if (!GameState.getPrehistoricSeenTimeStream())
break;
// Fall through
case kPrehistoric01:
case kPrehistoric03:
case kPrehistoric04:
case kPrehistoric05:
case kPrehistoric06:
case kPrehistoric07:
case kPrehistoric09:
case kPrehistoric11:
case kPrehistoric13:
case kPrehistoric15:
case kPrehistoric17:
case kPrehistoric19:
case kPrehistoric20:
// 1/4 volume.
if (_vm->isDVD()) // Updated sound for the DVD version
loadLoopSound1("Sounds/Prehistoric/P02SAL00.32K.AIFF", 64);
else
loadLoopSound1("Sounds/Prehistoric/P02SAL00.22K.AIFF", 64);
break;
case kPrehistoric08:
case kPrehistoric10:
case kPrehistoric12:
case kPrehistoric14:
case kPrehistoric16:
case kPrehistoric18:
case kPrehistoric21:
// 3/16 volume.
if (_vm->isDVD()) // Updated sound for the DVD version
loadLoopSound1("Sounds/Prehistoric/P02SAL00.32K.AIFF", 48);
else
loadLoopSound1("Sounds/Prehistoric/P02SAL00.22K.AIFF", 48);
break;
case kPrehistoric25:
// 1/8 volume.
if (_vm->isDVD()) // Updated sound for the DVD version
loadLoopSound1("Sounds/Prehistoric/P02SAL00.32K.AIFF", 32);
else
loadLoopSound1("Sounds/Prehistoric/P02SAL00.22K.AIFF", 32);
break;
case kPrehistoric22:
case kPrehistoric22North:
case kPrehistoric23:
case kPrehistoric24:
case kPrehistoricDeath:
// 0 volume.
loadLoopSound1("");
break;
default:
break;
}
switch (room) {
case kPrehistoric02:
case kPrehistoric03:
case kPrehistoric04:
case kPrehistoric05:
case kPrehistoric06:
case kPrehistoric07:
case kPrehistoric08:
case kPrehistoric09:
case kPrehistoric10:
case kPrehistoric11:
case kPrehistoric12:
case kPrehistoric13:
case kPrehistoric14:
case kPrehistoric15:
case kPrehistoric16:
case kPrehistoric17:
case kPrehistoric19:
case kPrehistoric20:
case kPrehistoric21:
case kPrehistoricDeath:
loadLoopSound2("");
break;
case kPrehistoric01:
case kPrehistoric25:
if (_vm->isDVD())
loadLoopSound2("Sounds/Prehistoric/VolcLoop.32K.AIFF", 64);
else
loadLoopSound2("Sounds/Prehistoric/VolcLoop.22K.AIFF", 64);
break;
case kPrehistoric18:
if (_privateFlags.getFlag(kPrehistoricPrivateExtendedBridgeFlag)) {
if (_vm->isDVD()) // Updated sound for the DVD version
loadLoopSound2("Sounds/Prehistoric/P18EAL00.44K.AIFF", 0x100, 0, 0);
else
loadLoopSound2("Sounds/Prehistoric/P18EAL00.22K.AIFF", 0x100, 0, 0);
} else {
loadLoopSound2("");
}
break;
case kPrehistoric23:
case kPrehistoric24:
case kPrehistoric22:
case kPrehistoric22North:
if (_vm->isDVD()) // Updated sound for the DVD version
loadLoopSound2("Sounds/Prehistoric/P24NAL00.32K.AIFF", 64);
else
loadLoopSound2("Sounds/Prehistoric/P24NAL00.22K.aiff", 64);
break;
default:
break;
}
}
void Prehistoric::activateHotspots() {
Neighborhood::activateHotspots();
switch (GameState.getCurrentRoomAndView()) {
case MakeRoomView(kPrehistoric18, kEast):
if (!_privateFlags.getFlag(kPrehistoricPrivateExtendedBridgeFlag))
_vm->getAllHotspots().activateOneHotspot(kPre18EastSpotID);
break;
case MakeRoomView(kPrehistoric22North, kNorth):
_vm->getAllHotspots().activateOneHotspot(kPre22NorthBreakerSpotID);
break;
default:
break;
}
}
void Prehistoric::clickInHotspot(const Input &input, const Hotspot *spot) {
switch (spot->getObjectID()) {
case kPre18EastSpotID:
if (GameState.getPrehistoricBreakerThrown())
startExtraSequence(kPre18EastBridgeOn, kExtraCompletedFlag, kFilterNoInput);
else
startExtraSequence(kPre18EastBridgeOut, kExtraCompletedFlag, kFilterNoInput);
break;
case kPre22NorthBreakerSpotID:
startExtraSequence(kPre22ThrowBreaker, kExtraCompletedFlag, kFilterNoInput);
break;
default:
Neighborhood::clickInHotspot(input, spot);
break;
}
}
void Prehistoric::receiveNotification(Notification *notification, const NotificationFlags flags) {
Neighborhood::receiveNotification(notification, flags);
if ((flags & kExtraCompletedFlag) != 0) {
_interruptionFilter = kFilterAllInput;
switch (_lastExtra) {
case kPreArrivalFromTSA:
GameState.setPrehistoricSeenTimeStream(true);
loadAmbientLoops();
makeContinuePoint();
break;
case kPre18EastZoom:
startExtraSequence(kPre18EastZoomOut, kExtraCompletedFlag, kFilterNoInput);
if (g_arthurChip)
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA61", kArthurPrehistoricZoomedToVault);
break;
case kPre18EastZoomOut:
GameState.setPrehistoricSeenBridgeZoom(true);
break;
case kPre18EastBridgeOn:
_privateFlags.setFlag(kPrehistoricPrivateExtendedBridgeFlag, true);
setCurrentAlternate(kAltPrehistoricBridgeSet);
GameState.setPrehistoricTriedToExtendBridge(false);
loadAmbientLoops();
GameState.setScoringExtendedBridge(true);
if (g_arthurChip) {
if (_vm->getRandomBit())
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA10", kArthurPrehistoricExtendedBridge);
else
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA56", kArthurPrehistoricExtendedBridge);
}
break;
case kPre18EastBridgeOut:
GameState.setPrehistoricTriedToExtendBridge(true);
if (g_arthurChip)
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA58", kArthurPrehistoricAttemptedBridge);
if (g_AIArea)
g_AIArea->checkMiddleArea();
break;
case kPre22ThrowBreaker:
GameState.setPrehistoricBreakerThrown(true);
GameState.setScoringThrewBreaker(true);
if (g_arthurChip)
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA57", kArthurPrehistoricBreakerThrown);
break;
case kPre25EastUnlockingVaultNoLog:
case kPre25EastUnlockingVaultWithLog:
if (!GameState.isTakenItemID(kHistoricalLog) && g_arthurChip)
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA05", kArthurPrehistoricUnlockedVault);
_vm->addItemToInventory((InventoryItem *)_vm->getAllItems().findItemByID(kJourneymanKey));
break;
default:
break;
}
} else if ((flags & kSpotCompletedFlag) != 0 &&
GameState.getCurrentRoomAndView() == MakeRoomView(kPrehistoric08, kEast)) {
if (g_arthurChip)
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA15", kArthurPrehistoricAtCliffEdge);
}
g_AIArea->checkMiddleArea();
}
void Prehistoric::spotCompleted() {
Neighborhood::spotCompleted();
if (GameState.getCurrentRoomAndView() == MakeRoomView(kPrehistoric08, kEast) && g_arthurChip)
g_arthurChip->playArthurMovieForEvent("Images/AI/Globals/XGLOBA15", kArthurPrehistoricAtCliffEdge);
}
Common::Path Prehistoric::getBriefingMovie() {
Common::Path movieName = Neighborhood::getBriefingMovie();
if (movieName.empty())
movieName = "Images/AI/Prehistoric/XPE";
return movieName;
}
Common::Path Prehistoric::getEnvScanMovie() {
Common::Path movieName = Neighborhood::getEnvScanMovie();
if (movieName.empty()) {
if (!_vm->isOldDemo()) {
switch (GameState.getCurrentRoom()) {
case kPrehistoric16:
case kPrehistoric23:
case kPrehistoric24:
return "Images/AI/Prehistoric/XP7WB";
default:
break;
}
}
return "Images/AI/Prehistoric/XP17NB";
}
return movieName;
}
uint Prehistoric::getNumHints() {
uint numHints = Neighborhood::getNumHints();
if (numHints == 0) {
switch (GameState.getCurrentRoomAndView()) {
case MakeRoomView(kPrehistoric18, kEast):
if (!GameState.getPrehistoricBreakerThrown() && GameState.getPrehistoricTriedToExtendBridge() &&
!_privateFlags.getFlag(kPrehistoricPrivateExtendedBridgeFlag))
numHints = 1;
break;
case MakeRoomView(kPrehistoric25, kEast):
if (!_privateFlags.getFlag(kPrehistoricPrivateVaultOpenFlag))
numHints = 1;
break;
default:
break;
}
}
return numHints;
}
Common::Path Prehistoric::getHintMovie(uint hintNum) {
Common::Path movieName = Neighborhood::getHintMovie(hintNum);
if (movieName.empty()) {
switch (GameState.getCurrentRoomAndView()) {
case MakeRoomView(kPrehistoric18, kEast):
return "Images/AI/Prehistoric/XP18WD";
case MakeRoomView(kPrehistoric25, kEast):
return "Images/AI/Globals/XGLOB1A";
default:
break;
}
}
return movieName;
}
bool Prehistoric::canSolve() {
return GameState.getCurrentRoomAndView() == MakeRoomView(kPrehistoric18, kEast) &&
!GameState.getPrehistoricBreakerThrown() &&
GameState.getPrehistoricTriedToExtendBridge() &&
!_privateFlags.getFlag(kPrehistoricPrivateExtendedBridgeFlag);
}
void Prehistoric::doSolve() {
GameState.setPrehistoricBreakerThrown(true);
startExtraSequence(kPre18EastBridgeOn, kExtraCompletedFlag, kFilterNoInput);
}
Hotspot *Prehistoric::getItemScreenSpot(Item *item, DisplayElement *element) {
if (item->getObjectID() == kHistoricalLog)
return _vm->getAllHotspots().findHotspotByID(kPrehistoricHistoricalLogSpotID);
return Neighborhood::getItemScreenSpot(item, element);
}
void Prehistoric::pickedUpItem(Item *item) {
switch (item->getObjectID()) {
case kHistoricalLog:
GameState.setScoringGotHistoricalLog(true);
break;
default:
break;
}
Neighborhood::pickedUpItem(item);
}
void Prehistoric::dropItemIntoRoom(Item *item, Hotspot *dropSpot) {
switch (item->getObjectID()) {
case kJourneymanKey:
Neighborhood::dropItemIntoRoom(item, dropSpot);
if (GameState.isTakenItemID(kHistoricalLog))
startExtraLongSequence(kPre25EastUnlockingVaultNoLog, kPre25EastVaultOpenNoLog, kExtraCompletedFlag, kFilterNoInput);
else
startExtraLongSequence(kPre25EastUnlockingVaultWithLog, kPre25EastVaultOpenWithLog, kExtraCompletedFlag, kFilterNoInput);
_privateFlags.setFlag(kPrehistoricPrivateVaultOpenFlag, true);
setCurrentActivation(kActivationVaultOpen);
break;
default:
Neighborhood::dropItemIntoRoom(item, dropSpot);
break;
}
}
void Prehistoric::bumpIntoWall() {
requestSpotSound(kPrehistoricBumpIntoWallIn, kPrehistoricBumpIntoWallOut, kFilterAllInput, 0);
Neighborhood::bumpIntoWall();
}
Common::Path Prehistoric::getNavMovieName() {
return "Images/Prehistoric/Prehistoric.movie";
}
Common::Path Prehistoric::getSoundSpotsName() {
return "Sounds/Prehistoric/Prehistoric Spots";
}
} // End of namespace Pegasus