/* ** Command & Conquer Renegade(tm) ** Copyright 2025 Electronic Arts 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 . */ /*********************************************************************************************** *** Confidential - Westwood Studios *** *********************************************************************************************** * * * Project Name : Commando * * * * $Archive:: /Commando/Code/Commando/gamemode.h $* * * * $Author:: Tom_s $* * * * $Modtime:: 5/04/01 7:08p $* * * * $Revision:: 13 $* * * *---------------------------------------------------------------------------------------------* * Functions: * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #ifndef GAMEMODE_H #define GAMEMODE_H #ifndef ALWAYS_H #include "always.h" #endif #ifndef VECTOR3_H #include "vector3.h" #endif #ifndef WWDEBUG_H #include "wwdebug.h" #endif /* ** Game modes are objects to manage each of the game's modes and ** sub-modes. Primarily, each object will provide a Initializing ** routine to allow it to allocate any required resources, a Shutdown ** routine to allow it to free said resources, and a Think routine, ** which will be called each time through the main loop, allowing the ** mode to perform any necessary periodic tasks. ** ** Each mode can be Activated, Deactivated, Suspended, or Resumed */ typedef enum { GAME_MODE_ACTIVE, GAME_MODE_INACTIVE, GAME_MODE_INACTIVE_PENDING, GAME_MODE_SUSPENDED, } GameModeState; class GameModeClass { protected: GameModeState State; public: GameModeClass() { State = GAME_MODE_INACTIVE; } // starts off inactive virtual ~GameModeClass() { WWASSERT( State == GAME_MODE_INACTIVE ); } // assert inactive // gets the current state GameModeState Get_State() { return State; } virtual void Activate(); // activates the mode virtual void Deactivate(); // deactivates the mode (don't shutdown until safe) virtual void Safely_Deactivate(); // shutdown if requested virtual void Suspend(); // suspends the mode from thinking, but does not deactivate it virtual void Resume(); // resumes a suspended mode virtual bool Is_Inactive( void ) { return ( State == GAME_MODE_INACTIVE ) || ( State == GAME_MODE_INACTIVE_PENDING ); } virtual bool Is_Suspended( void ) { return ( State == GAME_MODE_SUSPENDED ); } virtual bool Is_Active( void ) { return ( State == GAME_MODE_ACTIVE ); } // the virtual functions virtual const char *Name() = 0; // the name of this mode virtual void Init() = 0; // called when the mode is activated virtual void Shutdown() = 0; // called when the mode is deactivated virtual void Render() = 0; // called each time through the main loop to draw if not inactive virtual void Think() = 0; // called each time through the main loop to think if not inactive }; /* ** Only 1 Major Game mode can be active at any time */ class GameMajorModeClass : public GameModeClass { public: virtual void Activate(); // Override Activate and Deactivate to count virtual void Deactivate(); private: static int NumActiveMajorModes; }; /* ** GameModeManager - an object to maintain a list of all GameModes */ class GameModeManager { public: /* ** Add, Remove, Destroy and count the modes */ static GameModeClass *Add( GameModeClass *mode ); // { GameModeList.Add_Tail( mode ); return mode; } static void Remove( GameModeClass *mode ); // { GameModeList.Remove( mode ); } static int Count(); // { return GameModeList.Get_Count(); } static void Destroy( GameModeClass *mode ); static void Destroy_All( void ); static void List_Active_Game_Modes(void); // diagnostic // static void Set_Background_Color( const Vector3 & color ) { BackgroundColor = color; } /* ** let all non-inactive, game modes think */ static void Think( void ); /* ** let all non-inactive, game modes draw */ static void Render( void ); /* ** find a registered game mode by name */ static GameModeClass *Find( const char * name ); //static bool IsLanNameCollisionDetected; static void Safely_Deactivate(); static void Hide_Render_Frames(unsigned frame_count); // hide rendering for n frames private: static Vector3 BackgroundColor; }; #endif // GAMEMODE_H