summaryrefslogtreecommitdiffstats
path: root/game/code/interiors/interiormanager.h
diff options
context:
space:
mode:
authorSvxy <aidan61605@gmail.com>2023-05-31 23:31:32 +0200
committerSvxy <aidan61605@gmail.com>2023-05-31 23:31:32 +0200
commiteb4b3404aa00220d659e532151dab13d642c17a3 (patch)
tree7e1107c4995489a26c4007e41b53ea8d00ab2134 /game/code/interiors/interiormanager.h
downloadThe-Simpsons-Hit-and-Run-eb4b3404aa00220d659e532151dab13d642c17a3.tar
The-Simpsons-Hit-and-Run-eb4b3404aa00220d659e532151dab13d642c17a3.tar.gz
The-Simpsons-Hit-and-Run-eb4b3404aa00220d659e532151dab13d642c17a3.tar.bz2
The-Simpsons-Hit-and-Run-eb4b3404aa00220d659e532151dab13d642c17a3.tar.lz
The-Simpsons-Hit-and-Run-eb4b3404aa00220d659e532151dab13d642c17a3.tar.xz
The-Simpsons-Hit-and-Run-eb4b3404aa00220d659e532151dab13d642c17a3.tar.zst
The-Simpsons-Hit-and-Run-eb4b3404aa00220d659e532151dab13d642c17a3.zip
Diffstat (limited to 'game/code/interiors/interiormanager.h')
-rw-r--r--game/code/interiors/interiormanager.h253
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
+