diff options
-rwxr-xr-x | engines/pegasus/interaction.h | 110 | ||||
-rw-r--r-- | engines/pegasus/neighborhood/neighborhood.cpp | 32 | ||||
-rw-r--r-- | engines/pegasus/neighborhood/neighborhood.h | 4 |
3 files changed, 131 insertions, 15 deletions
diff --git a/engines/pegasus/interaction.h b/engines/pegasus/interaction.h new file mode 100755 index 0000000000..b54c59ea38 --- /dev/null +++ b/engines/pegasus/interaction.h @@ -0,0 +1,110 @@ +/* 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 2 + * 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef PEGASUS_INTERACTION_H +#define PEGASUS_INTERACTION_H + +#include "pegasus/input.h" +#include "pegasus/util.h" + +namespace Pegasus { + +static const tInteractionID kNoInteractionID = -1; + +class Neighborhood; + +class GameInteraction : public IDObject, public InputHandler { +public: + GameInteraction(const tInteractionID id, Neighborhood *nextHandler) : IDObject(id), InputHandler((InputHandler *)nextHandler) { + _isInteracting = false; + _savedHandler = 0; + _owner = nextHandler; + } + + // If the interaction is open (_isInteracting == true), it's too late to do anything + // about it here. + virtual ~GameInteraction() {} + + // startInteraction and stopInteraction are called by the outside world to + // start and stop the interaction sequence. + // isInteracting returns a bool indicating whether or not the interaction + // is going. + void startInteraction() { + if (!isInteracting()) { + openInteraction(); + initInteraction(); + _isInteracting = true; + _savedHandler = InputHandler::setInputHandler(this); + } + } + void stopInteraction() { + if (isInteracting()) { + closeInteraction(); + _isInteracting = false; + if (InputHandler::_inputHandler == this) + InputHandler::setInputHandler(_savedHandler); + } + } + void startOverInteraction() { + if (isInteracting()) + resetInteraction(); + } + bool isInteracting() const { return _isInteracting; } + Neighborhood *getOwner() const { return _owner; } + + virtual Common::String getBriefingMovie() { return ""; } + virtual Common::String getEnvScanMovie() { return ""; } + virtual long getNumHints() { return 0; } + virtual Common::String getHintMovie(uint) { return ""; } + virtual bool canSolve() { return false; } + + virtual void setSoundFXLevel(const uint16) {} + virtual void setAmbienceLevel(const uint16) {} + + virtual void doSolve() {} + +protected: + // Subclasses override openInteraction and closeInteraction to perform + // specific initialization and cleanup. Override resetInteraction to + // "start the interaction over." resetInteraction is called only when + // the interaction is already open. + // These functions are only called in pairs, never two opens or closes + // in a row. + virtual void openInteraction() {} + virtual void initInteraction() {} + virtual void closeInteraction() {} + virtual void resetInteraction() {} + + InputHandler *_savedHandler; + Neighborhood *_owner; + +private: + // Private so that only StartInteraction and StopInteraction can touch it. + bool _isInteracting; +}; + +} // End of namespace Pegasus + +#endif diff --git a/engines/pegasus/neighborhood/neighborhood.cpp b/engines/pegasus/neighborhood/neighborhood.cpp index f92c2b76dd..936f4ff44f 100644 --- a/engines/pegasus/neighborhood/neighborhood.cpp +++ b/engines/pegasus/neighborhood/neighborhood.cpp @@ -31,6 +31,7 @@ #include "pegasus/energymonitor.h" #include "pegasus/gamestate.h" #include "pegasus/input.h" +#include "pegasus/interaction.h" #include "pegasus/interface.h" #include "pegasus/pegasus.h" #include "pegasus/ai/ai_area.h" @@ -499,37 +500,43 @@ bool operator!=(const tQueueRequest &arg1, const tQueueRequest &arg2) { } Common::String Neighborhood::getBriefingMovie() { - // TODO: Interaction check + if (_currentInteraction) + return _currentInteraction->getBriefingMovie(); return Common::String(); } Common::String Neighborhood::getEnvScanMovie() { - // TODO: Interaction check + if (_currentInteraction) + return _currentInteraction->getEnvScanMovie(); return Common::String(); } uint Neighborhood::getNumHints() { - // TODO: Interaction check + if (_currentInteraction) + return _currentInteraction->getNumHints(); return 0; } Common::String Neighborhood::getHintMovie(uint hintNum) { - // TODO: Interaction check + if (_currentInteraction) + return _currentInteraction->getHintMovie(hintNum); return Common::String(); } bool Neighborhood::canSolve() { - // TODO: Interaction check + if (_currentInteraction) + return _currentInteraction->canSolve(); return false; } void Neighborhood::doSolve() { - // TODO: Interaction check + if (_currentInteraction) + _currentInteraction->doSolve(); } bool Neighborhood::okayToJump() { @@ -902,9 +909,8 @@ void Neighborhood::setSoundFXLevel(const uint16 fxLevel) { _navMovie.setVolume(fxLevel); if (_spotSounds.isSoundLoaded()) _spotSounds.setVolume(fxLevel); - // TODO - //if (_currentInteraction) - // _currentInteraction->setSoundFXLevel(fxLevel); + if (_currentInteraction) + _currentInteraction->setSoundFXLevel(fxLevel); } void Neighborhood::setAmbienceLevel(const uint16 ambientLevel) { @@ -912,9 +918,8 @@ void Neighborhood::setAmbienceLevel(const uint16 ambientLevel) { _loop1Fader.setMasterVolume(_vm->getAmbienceLevel()); if (_soundLoop2.isSoundLoaded()) _loop2Fader.setMasterVolume(_vm->getAmbienceLevel()); - // TODO - //if (_currentInteraction) - // _currentInteraction->setAmbienceLevel(ambientLevel); + if (_currentInteraction) + _currentInteraction->setAmbienceLevel(ambientLevel); } // Force the exit taken from (room, direction, alternate) to come to a stop. @@ -1241,7 +1246,8 @@ void Neighborhood::throwAwayInterface() { g_AIArea->removeAllRules(); } - // TODO: Interaction + if (_currentInteraction) + newInteraction(kNoInteractionID); _croppedMovie.releaseMovie(); diff --git a/engines/pegasus/neighborhood/neighborhood.h b/engines/pegasus/neighborhood/neighborhood.h index b06fb7532a..805d8a2fd2 100644 --- a/engines/pegasus/neighborhood/neighborhood.h +++ b/engines/pegasus/neighborhood/neighborhood.h @@ -91,6 +91,7 @@ struct tQueueRequest { bool operator==(const tQueueRequest &arg1, const tQueueRequest &arg2); bool operator!=(const tQueueRequest &arg1, const tQueueRequest &arg2); +class GameInteraction; class Neighborhood; class StriderCallBack : public TimeBaseCallBack { @@ -329,8 +330,7 @@ protected: // Nav hiding (for info support...) bool _isRunning; - // TODO - //GameInteraction *_currentInteraction; + GameInteraction *_currentInteraction; bool _doneWithInteraction; Movie _croppedMovie; |