diff options
Diffstat (limited to 'game/code/interiors/interiormanager.h')
-rw-r--r-- | game/code/interiors/interiormanager.h | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/game/code/interiors/interiormanager.h b/game/code/interiors/interiormanager.h new file mode 100644 index 0000000..5616c5d --- /dev/null +++ b/game/code/interiors/interiormanager.h @@ -0,0 +1,253 @@ +//============================================================================= +// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved. +// +// File: interiormanager.h +// +// Description: InteriorManager class declaration. +// +// History: + Created -- Darwin Chau +// +//============================================================================= + +#ifndef INTERIORMANAGER_H +#define INTERIORMANAGER_H + +//======================================== +// System Includes +//======================================== +#include <p3d/p3dtypes.hpp> // tUID +#include <p3d/anim/animate.hpp> // p3dCycleMode +#include <radmath/radmath.hpp> + +//======================================== +// Project Includes +//======================================== +#include <events/eventlistener.h> +#include <events/eventdata.h> +#include <presentation/presevents/presentationevent.h> +#include <mission/objectives/dialogueobjective.h> + +//======================================== +// Forward References +//======================================== +class NISEvent; +class InteriorEntranceLocator; +class Character; +class Sequencer; +class NISPlayer; +class GagDrawable; +class Gag; +class InteriorExit; +class AnimatedIcon; +class EventLocator; +class SphereTriggerVolume; + +//============================================================================== +// +// Synopsis: +// +//============================================================================== +class InteriorManager : public EventListener +{ + public: + + // Static Methods for accessing this singleton. + static InteriorManager* CreateInstance(); + static InteriorManager* GetInstance(); + static void DestroyInstance(); + + void OnBootupStart(); + void OnGameplayStart(); + void OnGameplayEnd(); + void LoadLevelGags(const rmt::Vector& startPos, bool initial = false); + + void UnloadGagSounds(); + + // start an entry (callled from EnterInterior button handler) + void Enter(InteriorEntranceLocator* entry, Character* character, Sequencer* seq); + + bool IsInside(void) { return mIn || mEntryRequested; } + bool IsEntering(void) { return mState == ENTER; } + bool IsExiting(void) { return mState == EXIT; } + tUID GetInterior(void) { return mCurrentInteriorUID;} + + void Update( unsigned int elapsedTime ); + + void CollectionEffect(const char* Name, const rmt::Vector& Pos); + + // Implement EventListener interface + virtual void HandleEvent( EventEnum id, void* pEventData ); + + struct GagBinding + { + GagBinding(); + void Clear(void); + + // data for selection of gags + tUID interiorUID; + bool random; + int weight; + + char gagFileName[13]; // force 8.3 compliance! + p3dCycleMode cycleMode; + bool triggered; + bool action; + bool retrigger; + bool useGagLocator; + tUID gagLoc; + rmt::Vector gagPos; + bool useTriggerLocator; + tUID triggerLoc; + rmt::Vector triggerPos; + float triggerRadius; + unsigned char i_S_Movie; + char gagFMVFileName[ 13 ]; // enforce 8.3 file naming. + radKey32 soundID; + bool cameraShake; + ShakeEventData shake; + float shakeDelay; + float shakeDuration; + float coinDelay; + unsigned coins; + unsigned loopIntro; + unsigned loopOutro; + char dialogChar1[DialogueObjective::MAX_CHAR_NAME_LEN]; + char dialogChar2[DialogueObjective::MAX_CHAR_NAME_LEN]; + radKey32 acceptDialogID; + radKey32 rejectDialogID; + radKey32 instructDialogID; + bool sparkle; + bool animBV; + unsigned int loadDist; + unsigned int unloadDist; + unsigned int soundLoadDist; + unsigned int soundUnloadDist; + int persistIndex; + }; + + void ExteriorCharPosn( rmt::Vector& orPosn ){ orPosn = mExitPos; } + + const tName& ClassifyPoint(const rmt::Vector& point); + + void SetISMovieDialogPlaying( bool isPlaying ) { m_isPlayingISDialog = isPlaying; } + bool IsPlayingISMovieDialog() const { return m_isPlayingISDialog; } + +private: + + // No public access to these, use singleton interface. + InteriorManager(); + ~InteriorManager(); + + // Declared but not defined to prevent copying and assignment. + InteriorManager( const InteriorManager& ); + InteriorManager& operator=( const InteriorManager& ); + + void OnMissionRestart(); + + void LoadGagNIS(tUID uid); + void ClearGags(); + void AttemptEntry(); + void SwitchToInterior(); + void ExitInterior(); + void SwitchToExterior(); + void SetupLightsAndAnims(); + + void ClearGagBindings(); + + void AddGagBinding( tUID interiorUID, + char* gagFileName, + p3dCycleMode cycleMode, + int weight, + char* gagSound ); + + void GagBegin(char* gagFileName); + GagBinding* GetBuildBinding(void); + void GagEnd(void); + + // Expose to Console + + static void ConsoleClearGagBindings( int argc, char** argv ); + static void ConsoleAddGagBinding( int argc, char** argv ); + static void ConsoleGagBegin(int argc, char** argv ); + static void ConsoleGagSetInterior(int argc, char** argv ); + static void ConsoleGagSetCycle(int argc, char** argv ); + static void ConsoleGagSetWeight(int argc, char** argv ); + static void ConsoleGagSetSound(int argc, char** argv ); + static void ConsoleGagSetTrigger(int argc, char** argv ); + static void ConsoleGagSetPosition(int argc, char** argv ); + static void ConsoleGagSetRandom(int argc, char** argv ); + static void ConsoleGagEnd(int argc, char** argv ); + static void ConsoleGagPlayFMV( int argc, char** argv ); + static void ConsoleGagSetIntro( int argc, char** argv ); + static void ConsoleGagSetOutro( int argc, char** argv ); + static void ConsoleGagSetCameraShake( int argc, char** argv ); + static void ConsoleGagSetCoins( int argc, char** argv ); + static void ConsoleGagSetSparkle( int argc, char** argv ); + static void ConsoleGagSetAnimCollision( int argc, char** argv ); + static void ConsoleGagSetLoadDistances( int argc, char** argv ); + static void ConsoleGagSetSoundLoadDistances( int argc, char** argv ); + static void ConsoleGagSetPersist( int argc, char** argv ); + static void ConsoleGagCheckCollCards(int argc, char** argv); + static void ConsoleGagCheckMovie(int argc, char** argv); + + // Pointer to the one and only instance of this singleton. + static InteriorManager* spInstance; + + enum State + { + NONE, + ENTER, + EXIT, + INSIDE, + NUM_STATES + }; + + State mState; + bool mEntryRequested; + bool mInteriorLoaded; + bool mLoadedGags; + tUID mLoadedInteriorUID; + tUID mCurrentInteriorUID; + tUID mSection; + AnimatedIcon* mCollectionEffect; + bool mIn; + + rmt::Vector mExitPos; + float mExitFacing; + + void GetExitPos(); + + static const int MAX_BINDINGS = 64; + GagBinding mGagBindings[MAX_BINDINGS]; + int mBindingCount; + + GagBinding mBuildGag; + + static const int MAX_GAGS = 32; + int mGagCount; + Gag* gags[MAX_GAGS]; + + bool mBuildingGag; + + InteriorExit* mExit; + + tFrameController* mInteriorAnimations; + + static rmt::Randomizer sRandom; + static bool sRandomSeeded; + + static unsigned sPersistGagIndex; + + bool m_isPlayingISDialog : 1; + + friend class GagDrawable; + friend class Gag; +}; + + +// A little syntactic sugar for getting at this singleton. +inline InteriorManager* GetInteriorManager() { return( InteriorManager::GetInstance() ); } + + +#endif // INTERIORMANAGER_H + |