| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- /*
- ** 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/mainloop.cpp $*
- * *
- * $Author:: Tom_s $*
- * *
- * $Modtime:: 2/21/02 3:13p $*
- * *
- * $Revision:: 77 $*
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #include "mainloop.h"
- #include "init.h"
- #include "shutdown.h"
- #include "timemgr.h"
- #include "input.h"
- #include "gamemode.h"
- #include "debug.h"
- #include "msgloop.h"
- #include "wwprofile.h"
- #include "cnetwork.h"
- #include "miscutil.h"
- //#include "gamesettings.h"
- #include "WWAudio.H"
- #include "devoptions.h"
- #include "multihud.h"
- #include "gamedata.h"
- #include "diagnostics.h"
- #include "wwprofile.h"
- #include "crandom.h"
- #include "dialogmgr.h"
- #include "ccamera.h"
- #include "pathmgr.h"
- #include "networkobjectmgr.h"
- #include "WebBrowser.h"
- #include "autostart.h"
- #include "gameinitmgr.h"
- #include "servercontrol.h"
- #include "consolemode.h"
- #include "gamespyadmin.h"
- #include "demosupport.h"
- #include "GameSpy_QnR.h"
- /*
- **
- */
- bool RunMainLoop = true;
- int ExitCode = EXIT_SUCCESS;
- void Stop_Main_Loop(int exitCode)
- {
- RunMainLoop = false;
- ExitCode = exitCode;
- }
- void _Game_Main_Loop_Loop(void)
- {
- WWPROFILE( "Main Loop" );
- unsigned long time1 = TIMEGETTIME();
- TimeManager::Update();
- Input::Update();
- { WWPROFILE( "Pathfind Evaluate" );
- if (COMBAT_CAMERA != NULL) {
- Vector3 camera_pos = COMBAT_CAMERA->Get_Position();
- PathMgrClass::Resolve_Paths( camera_pos );
- }
- }
- { WWPROFILE( "Think" );
- GameModeManager::Think();
- GameInitMgrClass::Think();
- }
- { WWPROFILE( "Dialog Mgr Update" );
- DialogMgrClass::On_Frame_Update ();
- }
- { WWPROFILE( "Network Object Mgr Think" );
- NetworkObjectMgrClass::Think ();
- ServerControl.Service();
- }
- { WWPROFILE("GameSpy_QnR");
- GameSpyQnR.Think();
- }
- if (cGameSpyAdmin::Is_Gamespy_Game()) {
- WWPROFILE( "cGameSpyAdmin Think" );
- cGameSpyAdmin::Think();
- }
- //
- // If the following assert hits it may indicate that your
- // working directory pathname got cleared in the project settings.
- //
- WWASSERT(GameModeManager::Find("Combat") != NULL);
- if (!GameModeManager::Find("Combat")->Is_Active()) {
- cNetwork::Update();
- }
- // Denzil - Embedded browser
- if (WebBrowser::IsWebPageDisplayed() == false) {
- GameModeManager::Render();
- }
- if (AutoRestart.Is_Active()) {
- AutoRestart.Think();
- }
- { WWPROFILE("ConsoleBox");
- ConsoleBox.Think();
- }
- DEMO_SECURITY_CHECK;
- { WWPROFILE( "Audio" );
- if (!ConsoleBox.Is_Exclusive()) {
- WWAudioClass::Get_Instance ()->On_Frame_Update (0);
- }
- }
- // Give the sound manager a chance to think
- // PROFILE( "Audio", WWAudioClass::Get_Instance ()->On_Frame_Update (0) );
- Windows_Message_Handler();
- #ifdef WWDEBUG
- // Sometimes it is useful to be able to artificially lower the frame rate
- Sleep(cDevOptions::DesiredFrameSleepMs.Get());
- #endif
- #if 0
- { WWPROFILE( "Random" );
- // spin the Random Generator, a little
- int count = FreeRandom.Get_Int( 5 );
- while ( count-- > 0 ) {
- FreeRandom.Get_Int();
- }
- }
- #endif
- DebugManager::Update();
- /*
- ** Sleep for a while if we are hogging the CPU.
- */
- if (cNetwork::I_Am_Only_Server()) {
- unsigned long time2 = TIMEGETTIME();
- if (time2 >= time1) {
- /*
- ** 16 (approx) for 60 fps. (1000/60)
- */
- unsigned long diff = time2 - time1;
- if (diff < 16) {
- unsigned long sleep_time = 16 - (time2 - time1);
- Sleep(sleep_time);
- }
- }
- }
- }
- /*
- ** MAIN GAME LOOP
- */
- int Game_Main_Loop(void)
- {
- const unsigned long servicetime = 1000; // Time in milliseconds.
- unsigned long time;
- // Only run main loop if the init is succesful!
- if (Game_Init()) {
- while ( RunMainLoop ) {
- _Game_Main_Loop_Loop();
- }
- // IML: Allow a short period to process any outstanding sound effects before shutdown.
- time = TIMEGETTIME();
- while (TIMEGETTIME() - time < servicetime) {
- WWAudioClass::Get_Instance ()->On_Frame_Update (0);
- }
- Game_Shutdown();
- }
- return ExitCode;
- }
|