| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387 |
- /*
- ** 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.cpp $*
- * *
- * $Author:: Steve_t $*
- * *
- * $Modtime:: 1/02/02 2:27a $*
- * *
- * $Revision:: 61 $*
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #include "gamemode.h"
- #include "wwprofile.h"
- #include "ww3d.h"
- #include "wwdebug.h"
- #include "miscutil.h"
- #include "slist.h"
- //#include "menu.h"
- #include "textdisplay.h"
- #include "thread.h"
- #include <stdio.h>
- #include "backgroundmgr.h"
- #include "render2d.h"
- #include "dazzle.h"
- #include "combat.h"
- #include "meshmdl.h"
- #include "rinfo.h"
- #include "objectives.h"
- #include "messagewindow.h"
- #include "dialogmgr.h"
- #include "pscene.h"
- #include "phys.h"
- #include "ccamera.h"
- #include "diagnostics.h"
- #include "dx8wrapper.h"
- #include "sortingrenderer.h"
- #include "textureloader.h"
- #include "binkmovie.h"
- //#include "helptext.h"
- #include "cnetwork.h"
- #include "dx8rendererdebugger.h"
- #include "consolemode.h"
- /*
- ** The gamemode list
- */
- SList<GameModeClass> GameModeList;
- Vector3 GameModeManager::BackgroundColor(0,0,0);
- int GameMajorModeClass::NumActiveMajorModes = 0;
- static unsigned _HiddenFrameCount=0;
- /*
- ** make sure we only have 1 active majormode
- */
- void GameMajorModeClass::Activate()
- {
- if ( State == GAME_MODE_INACTIVE ) {
- NumActiveMajorModes++;
- assert ( NumActiveMajorModes == 1 );
- }
- GameModeClass::Activate();
- }
- void GameMajorModeClass::Deactivate()
- {
- if ( !Is_Inactive() ) {
- NumActiveMajorModes--;
- assert ( NumActiveMajorModes == 0 );
- }
- GameModeClass::Deactivate();
- }
- /*
- **
- */
- void GameModeManager::Destroy( GameModeClass *mode )
- {
- assert( mode != NULL );
- mode->Deactivate();
- mode->Safely_Deactivate();
- Remove( mode );
- delete mode;
- }
- /*
- **
- */
- GameModeClass *GameModeManager::Add( GameModeClass *mode )
- {
- GameModeList.Add_Tail( mode );
- return mode;
- }
- void GameModeManager::Remove( GameModeClass *mode )
- {
- GameModeList.Remove( mode );
- }
- int GameModeManager::Count()
- {
- return GameModeList.Get_Count();
- }
- /*
- **
- */
- void GameModeManager::Destroy_All( void )
- {
- while ( Count() ) {
- Destroy( GameModeList.Remove_Tail() );
- }
- }
- void GameModeManager::List_Active_Game_Modes(void)
- {
- if (!Get_Text_Display()) {
- return;
- }
- WWASSERT(Get_Text_Display() != NULL);
- Get_Text_Display()->Print_System("Active game modes:");
- for (SLNode<GameModeClass> * game_mode_node = GameModeList.Head();
- game_mode_node != NULL; game_mode_node = game_mode_node->Next()) {
- GameModeClass * p_mode = game_mode_node->Data();
- WWASSERT(p_mode != NULL);
- if (p_mode->Is_Active()) {
- Get_Text_Display()->Print_System( " %s", p_mode->Name() );
- //Debug_Say((mode_str));
- }
- }
- }
- /*
- ** let all non inactive game modes think
- */
- void GameModeManager::Think( void )
- {
- for ( SLNode<GameModeClass> *game_mode_node = GameModeList.Head();
- game_mode_node != NULL;
- game_mode_node = game_mode_node->Next()) {
- GameModeClass *mode = game_mode_node->Data();
- //if ( mode->Get_State() != GAME_MODE_INACTIVE &&
- // mode->Get_State() != GAME_MODE_INACTIVE_PENDING ) {
- //if ( mode->Get_State() != GAME_MODE_INACTIVE &&
- if ( !mode->Is_Inactive() ) {
- // char name[80];
- // sprintf( name, "Think - %s", mode->Name() );
- mode->Think();
- }
- mode->Safely_Deactivate(); // if required
- }
- BINKMovie::Update();
- }
- void GameModeManager::Safely_Deactivate(void)
- {
- WWPROFILE( "Deactivate" );
- //
- // This method safely deactivates any inactive pending mode without
- // attempting a think
- //
- for (SLNode<GameModeClass> *game_mode_node = GameModeList.Head();
- game_mode_node != NULL; game_mode_node = game_mode_node->Next()) {
- GameModeClass * p_mode = game_mode_node->Data();
- WWASSERT(p_mode != NULL);
- p_mode->Safely_Deactivate(); // if required
- }
- }
- /*
- ** let all non inactive game modes draw
- */
- void GameModeManager::Render( void )
- {
- WWPROFILE( "Render" );
- if (!ConsoleBox.Is_Exclusive()) {
- bool clear=true;
- bool old_enable_draw=DX8Wrapper::_Is_Triangle_Draw_Enabled();
- bool old_enable_sorting_draw=SortingRendererClass::_Is_Triangle_Draw_Enabled();
- if (_HiddenFrameCount) {
- DX8Wrapper::_Enable_Triangle_Draw(false);
- SortingRendererClass::_Enable_Triangle_Draw(false);
- clear=false;
- }
- // Update the mesh debugger. This doesn't do anything at all unless the debugger is
- // enabled, so it is safe to always call it
- DX8RendererDebugger::Update();
- bool do_pscene = (COMBAT_SCENE != NULL) && !cNetwork::I_Am_Only_Server();
- if (!GameInFocus) do_pscene=false; // Don't render the game scene if the applicationisn't active
- if (do_pscene) {
- //
- // Don't pre-process the combat scene (does VIS and stuff) if
- // the game isn't active. (This gives us a menu performance boost).
- //
- if (Find( "Combat" )->Is_Active()) {
- COMBAT_SCENE->Pre_Render_Processing(*COMBAT_CAMERA);
- }
- }
- {
- WWPROFILE( "Begin_Render" );
- WW3D::Begin_Render (clear, clear, BackgroundMgrClass::Get_Clear_Color());
- }
- if (GameInFocus) {
- WWPROFILE( "Render Game Modes" );
- for ( SLNode<GameModeClass> *game_mode_node = GameModeList.Head();
- game_mode_node != NULL;
- game_mode_node = game_mode_node->Next()) {
- GameModeClass *mode = game_mode_node->Data();
- if ( mode->Get_State() != GAME_MODE_INACTIVE ) {
- mode->Render();
- }
- }
- }
- {
- WWPROFILE( "Message Window" );
- if (CombatManager::Get_Message_Window () != NULL) {
- CombatManager::Get_Message_Window ()->Render();
- }
- }
- {
- WWPROFILE( "ObjectiveViewer" );
- ObjectiveManager::Render_Viewer();
- }
- {
- WWPROFILE( "DialogMgr" );
- DialogMgrClass::Render();
- }
- {
- WWPROFILE( "cDiagnostics" );
- cDiagnostics::Render();
- }
- /*
- {
- WWPROFILE( "cHelpText" );
- cHelpText::Render();
- }
- */
- // Only update the movie when the application is active
- if (GameInFocus) {
- WWPROFILE( "BINK" );
- BINKMovie::Render();
- }
- {
- WWPROFILE( "End_Render" );
- WW3D::End_Render();
- }
- if (do_pscene) {
- COMBAT_SCENE->Post_Render_Processing();
- }
- {
- WWPROFILE( "Switch_Thread" );
- ThreadClass::Switch_Thread(); // This is important when working with multiple threads!
- }
- if (_HiddenFrameCount) {
- _HiddenFrameCount--;
- DX8Wrapper::_Enable_Triangle_Draw(old_enable_draw);
- SortingRendererClass::_Enable_Triangle_Draw(old_enable_sorting_draw);
- TextureLoader::Flush_Pending_Load_Tasks();
- }
- }
- }
- void GameModeManager::Hide_Render_Frames(unsigned frame_count)
- {
- _HiddenFrameCount=frame_count;
- }
- /*
- ** find a registered game mode by name
- */
- GameModeClass *GameModeManager::Find( const char * name )
- {
- for ( SLNode<GameModeClass> *game_mode_node = GameModeList.Head();
- game_mode_node != NULL;
- game_mode_node = game_mode_node->Next()) {
- GameModeClass *mode = game_mode_node->Data();
- if ( !stricmp( name, mode->Name() ) ) {
- return mode;
- }
- }
- return NULL;
- }
- //-----------------------------------------------------------------------------
- void GameModeClass::Activate()
- {
- if (State == GAME_MODE_INACTIVE) {
- Init();
- State = GAME_MODE_ACTIVE;
- }
- if (State == GAME_MODE_INACTIVE_PENDING) {
- State = GAME_MODE_ACTIVE;
- }
- }
- //-----------------------------------------------------------------------------
- void GameModeClass::Deactivate()
- {
- if (!Is_Inactive()) {
- State = GAME_MODE_INACTIVE_PENDING;
- }
- }
- //-----------------------------------------------------------------------------
- void GameModeClass::Safely_Deactivate()
- {
- if (State == GAME_MODE_INACTIVE_PENDING) {
- Shutdown();
- State = GAME_MODE_INACTIVE;
- }
- }
- //-----------------------------------------------------------------------------
- void GameModeClass::Suspend()
- {
- if (State == GAME_MODE_ACTIVE) {
- State = GAME_MODE_SUSPENDED;
- }
- }
- //-----------------------------------------------------------------------------
- void GameModeClass::Resume()
- {
- if (State == GAME_MODE_SUSPENDED) {
- State = GAME_MODE_ACTIVE;
- }
- }
|