scummvm/engines/buried/environ/scene_factory.cpp
2021-12-26 18:48:43 +01:00

166 lines
6.3 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 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 "buried/biochip_right.h"
#include "buried/buried.h"
#include "buried/gameui.h"
#include "buried/invdata.h"
#include "buried/inventory_window.h"
#include "buried/message.h"
#include "buried/navarrow.h"
#include "buried/resources.h"
#include "buried/scene_view.h"
#include "buried/sound.h"
#include "buried/environ/scene_base.h"
namespace Buried {
class OldApartmentSuitCap : public SceneBase {
public:
OldApartmentSuitCap(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation)
: SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {}
int postEnterRoom(Window *viewWindow, const Location &priorLocation) override;
};
int OldApartmentSuitCap::postEnterRoom(Window *viewWindow, const Location &priorLocation) {
// Cloak before continuing
((GameUIWindow *)viewWindow->getParent())->_bioChipRightWindow->changeCurrentBioChip(kItemBioChipCloak);
((GameUIWindow *)viewWindow->getParent())->_bioChipRightWindow->sendMessage(new LButtonUpMessage(Common::Point(18, 130), 0));
// Play the second piece of the intro movie
((SceneViewWindow *)viewWindow)->playSynchronousAnimationExtern(_vm->computeFileNameResourceID(_staticData.location.timeZone, _staticData.location.environment, 3));
// Disable cloak before continuing
((SceneViewWindow *)viewWindow)->getGlobalFlags().bcCloakingEnabled = 0;
((GameUIWindow *)viewWindow->getParent())->_navArrowWindow->enableWindow(true);
((GameUIWindow *)viewWindow->getParent())->_sceneViewWindow->enableWindow(true);
((GameUIWindow *)viewWindow->getParent())->_inventoryWindow->enableWindow(true);
Common::String liveText;
if (_vm->getVersion() >= MAKEVERSION(1, 0, 4, 0))
liveText = _vm->getString(IDS_OLD_APT_RECALL_MESSAGE);
else
liveText = "Auto-recall Engaged";
((SceneViewWindow *)viewWindow)->displayLiveText(liveText, false);
// Jump to the future apartment
((SceneViewWindow *)viewWindow)->timeSuitJump(4);
return SC_TRUE;
}
bool SceneViewWindow::checkCustomAICommentDependencies(const Location &commentLocation, const AIComment &commentData) {
switch (commentLocation.timeZone) {
case 1:
return checkCustomCastleAICommentDependencies(commentLocation, commentData);
case 2:
return checkCustomMayanAICommentDependencies(commentLocation, commentData);
case 4:
return commentData.dependencyFlagOffsetB == 1; // Not sure what this one does
case 5:
return checkCustomDaVinciAICommentDependencies(commentLocation, commentData);
case 6:
return checkCustomSpaceStationAICommentDependencies(commentLocation, commentData);
}
return false;
}
bool SceneViewWindow::startEnvironmentAmbient(int oldTimeZone, int oldEnvironment, int timeZone, int environment, bool fade) {
switch (timeZone) {
case 1:
return startCastleAmbient(oldTimeZone, oldEnvironment, environment, fade);
case 2:
return startMayanAmbient(oldTimeZone, oldEnvironment, environment, fade);
case 3:
return startAgent3LairAmbient(oldTimeZone, oldEnvironment, environment, fade);
case 4:
return startFutureApartmentAmbient(oldTimeZone, oldEnvironment, environment, fade);
case 5:
return startDaVinciAmbient(oldTimeZone, oldEnvironment, environment, fade);
case 6:
return startAILabAmbient(oldTimeZone, oldEnvironment, environment, fade);
case 7:
return startAlienAmbient(oldTimeZone, oldEnvironment, environment, fade);
case 10:
return _vm->_sound->setAmbientSound();
}
return false;
}
SceneBase *SceneViewWindow::constructSceneObject(Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) {
switch (sceneStaticData.location.timeZone) {
case 0: // Miscellaneous scenes
// This seems unused?
warning("Could not create scene object for time zone %d", sceneStaticData.location.timeZone);
break;
case 1: // Castle
return constructCastleSceneObject(viewWindow, sceneStaticData, priorLocation);
case 2: // Mayan
return constructMayanSceneObject(viewWindow, sceneStaticData, priorLocation);
case 3: // Agent 3's Lair
return constructAgent3LairSceneObject(viewWindow, sceneStaticData, priorLocation);
case 4: // Future Apartment
return constructFutureApartmentSceneObject(viewWindow, sceneStaticData, priorLocation);
case 5: // Da Vinci
return constructDaVinciSceneObject(viewWindow, sceneStaticData, priorLocation);
case 6: // AI Lab
return constructAILabSceneObject(viewWindow, sceneStaticData, priorLocation);
case 7: // Alien
return constructAlienSceneObject(viewWindow, sceneStaticData, priorLocation);
case 10: // Old Apartment
return new OldApartmentSuitCap(_vm, viewWindow, sceneStaticData, priorLocation);
default:
error("Unknown time zone %d", sceneStaticData.location.timeZone);
}
return new SceneBase(_vm, viewWindow, sceneStaticData, priorLocation);
}
bool SceneViewWindow::initializeTimeZoneAndEnvironment(Window *viewWindow, int timeZone, int environment) {
switch (timeZone) {
case 1:
return initializeCastleTimeZoneAndEnvironment(viewWindow, environment);
case 2:
return initializeMayanTimeZoneAndEnvironment(viewWindow, environment);
case 3:
return initializeAgent3LairTimeZoneAndEnvironment(viewWindow, environment);
case 4:
// Nothing to do
return true;
case 5:
return initializeDaVinciTimeZoneAndEnvironment(viewWindow, environment);
case 6:
return initializeAILabTimeZoneAndEnvironment(viewWindow, environment);
case 7:
return initializeAlienTimeZoneAndEnvironment(viewWindow, environment);
}
return false;
}
} // End of namespace Buried