Initial commit
This commit is contained in:
270
engines/pegasus/items/biochips/arthurchip.cpp
Normal file
270
engines/pegasus/items/biochips/arthurchip.cpp
Normal file
@@ -0,0 +1,270 @@
|
||||
/* 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/pegasus.h"
|
||||
#include "pegasus/ai/ai_area.h"
|
||||
#include "pegasus/items/biochips/arthurchip.h"
|
||||
|
||||
namespace Common {
|
||||
DECLARE_SINGLETON(Pegasus::ArthurManager);
|
||||
}
|
||||
|
||||
namespace Pegasus {
|
||||
|
||||
static const char *kArthurWisdomMovies[] = {
|
||||
"Images/AI/Globals/XGLOBA01",
|
||||
"Images/AI/Globals/XGLOBA03",
|
||||
"Images/AI/Globals/XGLOBA06",
|
||||
"Images/AI/Globals/XGLOBA07",
|
||||
"Images/AI/Globals/XGLOBA09",
|
||||
"Images/AI/Globals/XGLOBA17",
|
||||
"Images/AI/Globals/XGLOBA18",
|
||||
"Images/AI/Globals/XGLOBA25",
|
||||
"Images/AI/Globals/XGLOBA26",
|
||||
"Images/AI/Globals/XGLOBA27",
|
||||
"Images/AI/Globals/XGLOBA28",
|
||||
"Images/AI/Globals/XGLOBA30",
|
||||
"Images/AI/Globals/XGLOBA34",
|
||||
"Images/AI/Globals/XGLOBA35",
|
||||
"Images/AI/Globals/XGLOBA43",
|
||||
"Images/AI/Globals/XGLOBA50",
|
||||
"Images/AI/Globals/XGLOBA56",
|
||||
"Images/AI/Globals/XGLOBA59",
|
||||
"Images/AI/Globals/XGLOBA63",
|
||||
"Images/AI/Globals/XGLOBB10",
|
||||
"Images/AI/Globals/XGLOBB11",
|
||||
"Images/AI/Globals/XGLOBB12",
|
||||
"Images/AI/Globals/XGLOBB13",
|
||||
"Images/AI/Globals/XGLOBB14",
|
||||
"Images/AI/Globals/XGLOBB15",
|
||||
"Images/AI/Globals/XGLOBB16",
|
||||
"Images/AI/Globals/XGLOBB17",
|
||||
"Images/AI/Globals/XGLOBB18",
|
||||
"Images/AI/Globals/XGLOBB19",
|
||||
"Images/AI/Globals/XGLOBB20",
|
||||
"Images/AI/Globals/XGLOBB21",
|
||||
"Images/AI/Globals/XGLOBB22",
|
||||
"Images/AI/Globals/XGLOBB23",
|
||||
"Images/AI/Globals/XGLOBB24",
|
||||
"Images/AI/Globals/XGLOBB25",
|
||||
"Images/AI/Globals/XGLOBB26",
|
||||
"Images/AI/Globals/XGLOBB27",
|
||||
"Images/AI/Globals/XGLOBB28",
|
||||
"Images/AI/Globals/XGLOBB29",
|
||||
"Images/AI/Globals/XGLOBB30",
|
||||
"Images/AI/Globals/XGLOBB31",
|
||||
"Images/AI/Globals/XGLOBB32",
|
||||
"Images/AI/Globals/XGLOBB33",
|
||||
"Images/AI/Globals/XGLOBB34",
|
||||
"Images/AI/Globals/XGLOBB35",
|
||||
"Images/AI/Globals/XGLOBB36",
|
||||
"Images/AI/Globals/XGLOBB37",
|
||||
"Images/AI/Globals/XGLOBB38",
|
||||
"Images/AI/Globals/XGLOBB39",
|
||||
"Images/AI/Globals/XGLOBB43",
|
||||
"Images/AI/Globals/XGLOBB44",
|
||||
"Images/AI/Globals/XGLOBA62"
|
||||
};
|
||||
|
||||
ArthurChip *g_arthurChip = nullptr;
|
||||
|
||||
ArthurChip::ArthurChip(const ItemID id, const NeighborhoodID neighborhood, const RoomID room, const DirectionConstant direction) :
|
||||
BiochipItem(id, neighborhood, room, direction), _arthurWisdomHotspot(kArthurWisdomSpotID),
|
||||
_chattyArthurHotspot(kChattyArthurSpotID), _chattyAIHotspot(kChattyAISpotID),
|
||||
_arthurHeadHotspot(kArthurHeadSpotID) {
|
||||
_lastArthurMovie = "";
|
||||
|
||||
_arthurWisdomHotspot.setArea(Common::Rect(kAIMiddleAreaLeft + 20, kAIMiddleAreaTop + 27, kAIMiddleAreaLeft + 20 + 161, kAIMiddleAreaTop + 27 + 30));
|
||||
_arthurWisdomHotspot.setHotspotFlags(kArthurBiochipSpotFlag);
|
||||
g_allHotspots.push_back(&_arthurWisdomHotspot);
|
||||
|
||||
_chattyArthurHotspot.setArea(Common::Rect(kAIMiddleAreaLeft + 100, kAIMiddleAreaTop + 67, kAIMiddleAreaLeft + 100 + 20, kAIMiddleAreaTop + 67 + 20));
|
||||
_chattyArthurHotspot.setHotspotFlags(kArthurBiochipSpotFlag);
|
||||
g_allHotspots.push_back(&_chattyArthurHotspot);
|
||||
|
||||
_chattyAIHotspot.setArea(Common::Rect(kAIMiddleAreaLeft + 130, kAIMiddleAreaTop + 67, kAIMiddleAreaLeft + 130 + 20, kAIMiddleAreaTop + 67 + 20));
|
||||
_chattyAIHotspot.setHotspotFlags(kArthurBiochipSpotFlag);
|
||||
g_allHotspots.push_back(&_chattyAIHotspot);
|
||||
|
||||
_arthurHeadHotspot.setArea(Common::Rect(kAIRightAreaLeft, kAIRightAreaTop, kAIRightAreaLeft + kAIRightAreaWidth, kAIRightAreaTop + kAIRightAreaHeight));
|
||||
_arthurHeadHotspot.setHotspotFlags(kArthurBiochipSpotFlag);
|
||||
g_allHotspots.push_back(&_arthurHeadHotspot);
|
||||
|
||||
setItemState(kArthur000);
|
||||
|
||||
g_arthurChip = this;
|
||||
}
|
||||
|
||||
ArthurChip::~ArthurChip() {
|
||||
g_arthurChip = nullptr;
|
||||
|
||||
g_allHotspots.removeOneHotspot(kArthurWisdomSpotID);
|
||||
g_allHotspots.removeOneHotspot(kChattyArthurSpotID);
|
||||
g_allHotspots.removeOneHotspot(kChattyAISpotID);
|
||||
g_allHotspots.removeOneHotspot(kArthurHeadSpotID);
|
||||
}
|
||||
|
||||
void ArthurChip::select() {
|
||||
BiochipItem::select();
|
||||
setUpArthurChip();
|
||||
}
|
||||
|
||||
void ArthurChip::setUpArthurChip() {
|
||||
ItemState state = getItemState();
|
||||
|
||||
if (g_vm->isChattyArthur()) {
|
||||
if (g_AIArea && g_vm->isChattyAI()) {
|
||||
if (state != kArthur002)
|
||||
setItemState(kArthur000);
|
||||
} else if (state != kArthur102) {
|
||||
setItemState(kArthur100);
|
||||
}
|
||||
} else {
|
||||
if (g_AIArea && g_vm->isChattyAI()) {
|
||||
if (state != kArthur012)
|
||||
setItemState(kArthur010);
|
||||
} else if (state != kArthur112) {
|
||||
setItemState(kArthur110);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ArthurChip::activateArthurHotspots() {
|
||||
_arthurWisdomHotspot.setActive();
|
||||
_chattyArthurHotspot.setActive();
|
||||
_chattyAIHotspot.setActive();
|
||||
_arthurHeadHotspot.setActive();
|
||||
}
|
||||
|
||||
void ArthurChip::clickInArthurHotspot(HotSpotID id) {
|
||||
ItemState state, newState;
|
||||
|
||||
if (id == kArthurHeadSpotID) {
|
||||
if (_lastArthurMovie != "")
|
||||
playArthurMovie(_lastArthurMovie);
|
||||
return;
|
||||
}
|
||||
|
||||
newState = state = getItemState();
|
||||
switch (state) {
|
||||
case kArthur000:
|
||||
switch (id) {
|
||||
case kArthurWisdomSpotID:
|
||||
newState = kArthur002;
|
||||
break;
|
||||
case kChattyArthurSpotID:
|
||||
newState = kArthur010;
|
||||
break;
|
||||
case kChattyAISpotID:
|
||||
newState = kArthur100;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case kArthur010:
|
||||
switch (id) {
|
||||
case kArthurWisdomSpotID:
|
||||
newState = kArthur012;
|
||||
break;
|
||||
case kChattyArthurSpotID:
|
||||
newState = kArthur000;
|
||||
break;
|
||||
case kChattyAISpotID:
|
||||
newState = kArthur110;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case kArthur100:
|
||||
switch (id) {
|
||||
case kArthurWisdomSpotID:
|
||||
newState = kArthur102;
|
||||
break;
|
||||
case kChattyArthurSpotID:
|
||||
newState = kArthur110;
|
||||
break;
|
||||
case kChattyAISpotID:
|
||||
newState = kArthur010;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case kArthur110:
|
||||
switch (id) {
|
||||
case kArthurWisdomSpotID:
|
||||
newState = kArthur112;
|
||||
break;
|
||||
case kChattyArthurSpotID:
|
||||
newState = kArthur100;
|
||||
break;
|
||||
case kChattyAISpotID:
|
||||
newState = kArthur010;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
setItemState(newState);
|
||||
switch (id) {
|
||||
case kArthurWisdomSpotID:
|
||||
playArthurMovie(kArthurWisdomMovies[g_vm->getRandomNumber((
|
||||
sizeof(kArthurWisdomMovies) / sizeof(const char *)) - 1)]);
|
||||
break;
|
||||
case kChattyArthurSpotID:
|
||||
g_vm->setChattyArthur(!g_vm->isChattyArthur());
|
||||
break;
|
||||
case kChattyAISpotID:
|
||||
g_vm->setChattyAI(!g_vm->isChattyAI());
|
||||
break;
|
||||
}
|
||||
|
||||
setItemState(state);
|
||||
}
|
||||
|
||||
void ArthurChip::playArthurMovie(const Common::Path &movieName) {
|
||||
if (g_AIArea) {
|
||||
g_AIArea->playAIMovie(kRightAreaSignature, movieName, false, kHintInterruption);
|
||||
if (movieName != "Images/AI/Globals/XGLOB00" &&
|
||||
movieName != "Images/AI/Globals/XGLOB01" &&
|
||||
movieName != "Images/AI/Globals/XGLOBAA0" &&
|
||||
movieName != "Images/AI/Globals/XGLOBAA1" &&
|
||||
movieName != "Images/AI/Globals/XGLOBAA2")
|
||||
_lastArthurMovie = movieName;
|
||||
}
|
||||
}
|
||||
|
||||
bool ArthurChip::playArthurMovieForEvent(const Common::Path &movieName, ArthurEvent event) {
|
||||
if (g_vm->isDVD() && g_vm->playerHasItemID(kArthurBiochip) &&
|
||||
g_vm->isChattyArthur() && !Arthur._arthurFlags.getFlag(event)) {
|
||||
Arthur._arthurFlags.setFlag(event, true);
|
||||
playArthurMovie(movieName);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void ArthurManager::resetArthurState() {
|
||||
bool savedGameFlag = _arthurFlags.getFlag(kArthurLoadedSavedGame);
|
||||
_arthurFlags.clearAllFlags();
|
||||
_arthurFlags.setFlag(kArthurLoadedSavedGame, savedGameFlag);
|
||||
}
|
||||
|
||||
} // End of namespace Pegasus
|
||||
Reference in New Issue
Block a user