Initial commit
This commit is contained in:
206
engines/pegasus/items/biochips/pegasuschip.cpp
Normal file
206
engines/pegasus/items/biochips/pegasuschip.cpp
Normal file
@@ -0,0 +1,206 @@
|
||||
/* 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/energymonitor.h"
|
||||
#include "pegasus/gamestate.h"
|
||||
#include "pegasus/pegasus.h"
|
||||
#include "pegasus/items/biochips/pegasuschip.h"
|
||||
#include "pegasus/neighborhood/tsa/fulltsa.h"
|
||||
#include "pegasus/neighborhood/tsa/tinytsa.h"
|
||||
|
||||
namespace Pegasus {
|
||||
|
||||
PegasusChip::PegasusChip(const ItemID id, const NeighborhoodID neighborhood, const RoomID room, const DirectionConstant direction) :
|
||||
BiochipItem(id, neighborhood, room, direction), _recallSpot(kPegasusRecallSpotID) {
|
||||
_recallSpot.setArea(Common::Rect(kAIMiddleAreaLeft + 116, kAIMiddleAreaTop + 63, kAIMiddleAreaLeft + 184, kAIMiddleAreaTop + 91));
|
||||
_recallSpot.setHotspotFlags(kPegasusBiochipSpotFlag);
|
||||
g_allHotspots.push_back(&_recallSpot);
|
||||
setItemState(kPegasusTSA00);
|
||||
}
|
||||
|
||||
PegasusChip::~PegasusChip() {
|
||||
g_allHotspots.removeOneHotspot(kPegasusRecallSpotID);
|
||||
}
|
||||
|
||||
void PegasusChip::select() {
|
||||
BiochipItem::select();
|
||||
setUpPegasusChip();
|
||||
}
|
||||
|
||||
void PegasusChip::takeSharedArea() {
|
||||
BiochipItem::takeSharedArea();
|
||||
setUpPegasusChip();
|
||||
}
|
||||
|
||||
void PegasusChip::setUpPegasusChip() {
|
||||
switch (GameState.getCurrentNeighborhood()) {
|
||||
case kCaldoriaID:
|
||||
setItemState(kPegasusCaldoria);
|
||||
break;
|
||||
case kFullTSAID:
|
||||
case kFinalTSAID:
|
||||
case kTinyTSAID:
|
||||
setItemState(kPegasusTSA10);
|
||||
break;
|
||||
case kPrehistoricID:
|
||||
if (g_vm->playerHasItemID(kHistoricalLog))
|
||||
setItemState(kPegasusPrehistoric00);
|
||||
else
|
||||
setItemState(kPegasusPrehistoric10);
|
||||
break;
|
||||
case kMarsID:
|
||||
if (GameState.getMarsFinished())
|
||||
setItemState(kPegasusMars00);
|
||||
else
|
||||
setItemState(kPegasusMars10);
|
||||
break;
|
||||
case kWSCID:
|
||||
if (GameState.getWSCFinished())
|
||||
setItemState(kPegasusWSC00);
|
||||
else
|
||||
setItemState(kPegasusWSC10);
|
||||
break;
|
||||
case kNoradAlphaID:
|
||||
case kNoradDeltaID:
|
||||
if (GameState.getNoradFinished())
|
||||
setItemState(kPegasusNorad00);
|
||||
else
|
||||
setItemState(kPegasusNorad10);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Only does something if the chip should be announcing that the time zone is finished...
|
||||
void PegasusChip::setUpPegasusChipRude() {
|
||||
switch (GameState.getCurrentNeighborhood()) {
|
||||
case kPrehistoricID:
|
||||
if (g_vm->playerHasItemID(kHistoricalLog))
|
||||
setItemState(kPegasusPrehistoric00);
|
||||
break;
|
||||
case kMarsID:
|
||||
if (GameState.getMarsFinished())
|
||||
setItemState(kPegasusMars00);
|
||||
break;
|
||||
case kWSCID:
|
||||
if (GameState.getWSCFinished())
|
||||
setItemState(kPegasusWSC00);
|
||||
break;
|
||||
case kNoradAlphaID:
|
||||
case kNoradDeltaID:
|
||||
if (GameState.getNoradFinished())
|
||||
setItemState(kPegasusNorad00);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void PegasusChip::activatePegasusHotspots() {
|
||||
switch (GameState.getCurrentNeighborhood()) {
|
||||
case kPrehistoricID:
|
||||
// WORKAROUND: Don't allow the player to recall if they don't have
|
||||
// the historical log. Otherwise, gameplay is broken when returning
|
||||
// to the TSA.
|
||||
if (!g_vm->playerHasItemID(kHistoricalLog))
|
||||
return;
|
||||
// fall through
|
||||
case kMarsID:
|
||||
case kWSCID:
|
||||
case kNoradAlphaID:
|
||||
case kNoradDeltaID:
|
||||
_recallSpot.setActive();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void PegasusChip::clickInPegasusHotspot() {
|
||||
ItemState thisState = getItemState();
|
||||
ItemState hiliteState;
|
||||
|
||||
switch (thisState) {
|
||||
case kPegasusPrehistoric00:
|
||||
hiliteState = kPegasusPrehistoric01;
|
||||
break;
|
||||
case kPegasusPrehistoric10:
|
||||
hiliteState = kPegasusPrehistoric11;
|
||||
break;
|
||||
case kPegasusMars00:
|
||||
hiliteState = kPegasusMars01;
|
||||
break;
|
||||
case kPegasusMars10:
|
||||
hiliteState = kPegasusMars11;
|
||||
break;
|
||||
case kPegasusNorad00:
|
||||
hiliteState = kPegasusNorad01;
|
||||
break;
|
||||
case kPegasusNorad10:
|
||||
hiliteState = kPegasusNorad11;
|
||||
break;
|
||||
case kPegasusWSC00:
|
||||
hiliteState = kPegasusWSC01;
|
||||
break;
|
||||
case kPegasusWSC10:
|
||||
hiliteState = kPegasusWSC11;
|
||||
break;
|
||||
default:
|
||||
error("Invalid pegasus chip state");
|
||||
}
|
||||
|
||||
// WORKAROUND: The original called setItemState() here. However,
|
||||
// since we're overriding select() to call setUpPegasusChip(),
|
||||
// the highlighted frame is never displayed! So, we're manually
|
||||
// setting the state and selecting the item. Also of note is that
|
||||
// setItemState() for this class is effectively useless since it
|
||||
// always gets overriden in the select() function. The only reason
|
||||
// that this doesn't end in infinite recursion is because setItemState()
|
||||
// has a check against the current state to make sure you don't call
|
||||
// select() again. </rant>
|
||||
_itemState = hiliteState;
|
||||
BiochipItem::select();
|
||||
|
||||
uint32 time = g_system->getMillis();
|
||||
while (g_system->getMillis() < time + 500) {
|
||||
g_vm->refreshDisplay();
|
||||
g_system->delayMillis(10);
|
||||
}
|
||||
|
||||
setItemState(thisState);
|
||||
|
||||
if (!((Neighborhood *)g_neighborhood)->okayToJump())
|
||||
return;
|
||||
|
||||
if (g_energyMonitor)
|
||||
g_energyMonitor->stopEnergyDraining();
|
||||
|
||||
if (GameState.getTSAState() == kPlayerWentToPrehistoric || GameState.allTimeZonesFinished())
|
||||
g_vm->jumpToNewEnvironment(kFullTSAID, kTSA37, kNorth);
|
||||
else
|
||||
g_vm->jumpToNewEnvironment(kTinyTSAID, kTinyTSA37, kNorth);
|
||||
}
|
||||
|
||||
} // End of namespace Pegasus
|
||||
Reference in New Issue
Block a user