This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Commando/gamemode.h

163 lines
5.8 KiB
C++

/*
** 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 <http://www.gnu.org/licenses/>.
*/
/***********************************************************************************************
*** 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