/*========================================================================= * CPAEngin.cpp : Kernel base of CPA project. * This is a part of the CPA project. * * Version 1.0 * Creation date 20/06/96 * Revision date * * That file is C pure (it's a .CPP cause of ACTIVE_EDITOR capabilities). * That file needs to be compatible for all platforms. * * (c) Ubi Studios 1996 *=======================================================================*/ #if !defined(U64) #include /**** pour les tests ****/ #else /* U64 */ #include #endif /* U64 */ #include "ToolsCPA.h" #include "Main.h" #include "Options/InLine.h" #include "Macros.h" #include "Actions/AllActs.h" #include "Structur/Objects.h" #include "Structur/EngMode.h" #include "Structur/ErrGame.h" #include "Structur/Input_S.h" #include "Structur/MemGame.h" #include "Structur/StdObjSt.h" #include "Always.h" #include "Basic.h" #include "Engine.h" #include "InitEng.h" #include "Input.h" #include "GameEng.h" #include "GamSave.h" /*#include "GamExtra.h"*/ #include "GamOpt.h" #include "ObjInit.h" #include "ObjType.h" #include "zemem.h" #include "acp_driver.h" #ifdef GAM_USE_SNA #include "sna.h" #endif /* GAM_USE_SNA */ #include "PRF.h" extern void GAM_fn_vRasterDisplayInit (); /*XB(Profile)*/ #ifdef U64 /*#define ASM_PROFILER*/ #ifdef ASM_PROFILER extern void fn_vInitProfile(void); extern unsigned long *g_p_ulNbEngineFrames; #endif /* ASM_PROFILER */ #endif /* U64 */ /* ANNECY AV DEMO {*/ #ifndef U64 #include "Specif/Demos.h" #ifndef RETAIL #include "PlayAnim/interpol/a3x_Mem.h" /* for fn_vAnimStackLog*/ #endif #endif /* END ANNECY AV }*/ #ifdef ACTIVE_EDITOR extern ACP_tdxBool g_bUseSAIWithEditor; #endif /* ACTIVE_EDITOR */ #ifdef U64 #include "u_cfb.h" #include "ino.h" #endif /*=========================================================================== * Pointers that can be init in fn_vChooseTheGoodInit() ==========================================================================*/ void fn_vEmptyFunction(void) {}; void (*p_fn_vReadInput)() = fn_vEngineReadInput; /**** Never change it ****/ void (*p_fn_vNetEngine)() = fn_vEmptyFunction; void (*p_fn_vEngine)() = fn_vEmptyFunction; void (*p_fn_vDisplayAll)() = fn_vEmptyFunction; /*########################################################################### * Empty functions to be fill for each project. *#########################################################################*/ /*=========================================================================== * Description: *--------------------------------------------------------------------------- * Automatic tests *--------------------------------------------------------------------------- * Revision date: * Author: YLG *=========================================================================*/ #if !defined(U64) && !defined(RETAIL) #include #include #include extern char TEST_g_cAllMaps; extern char TEST_g_cChangeMapWithRestart; extern ACP_tdxBool TEST_g_bAutomaticTest; extern char TEST_g_cWriteLogFile; extern long TEST_g_lWaitBeforeChangeLevel; extern long TEST_g_lWaitMin; extern long TEST_g_lWaitMax; extern long TEST_g_lNbChangeMapBeforeExit; extern long TEST_g_lAnimStack; extern long TEST_g_lNbMapInSequence; extern char TEST_g_a_szMapSequence[200][50]; long TEST_g_lCptWait = 0; /***************** FabPerez InfoTrame *****************/ #if defined(WIN32) && defined(_DEBUG) extern void fn_InitMapSectorStruct(void); #endif /*WIN32 _DEBUG*/ /***************** Fin FabPerez InfoTrame *****************/ void fn_vWriteAnimStackLogFile() { FILE * fLogFile; /* open file in appending mode and add log*/ fLogFile = fopen("AnimStack.log","a"); if (fLogFile) { fprintf(fLogFile,"=========> MAP : %s\n",g_stEngineStructure.szLevelName); fn_vAnimStackLog(fLogFile); fclose(fLogFile); } } /* Used for test (test.ini) * Get next level name to go to. * Return 0 if we must change level or 1 if we must exit game. */ int GAM_fn_iGetNextLevelName( char **_p_szLevelName ) { static long ucLastLevel = 0; unsigned char ucLevelId; if( TEST_g_lNbChangeMapBeforeExit-- == 0 ) { *_p_szLevelName = NULL; return 1; } switch( TEST_g_cAllMaps ) { case 0: /* Test all maps then test maps in random order */ case 1: /* Test all maps then exit */ if( ucLastLevel+1 < g_stEngineStructure.ucNumberOfLevels ) { ucLastLevel++; *_p_szLevelName = g_stEngineStructure.a_szLevelName[ ucLastLevel ]; return 0; } /* We already have tested all map */ switch( TEST_g_cAllMaps ) { case 0: /* Test all maps then test map in random order */ ucLevelId = (unsigned char)RND_fn_lGetLongRandomValue(0, 0, g_stEngineStructure.ucNumberOfLevels-1); *_p_szLevelName = g_stEngineStructure.a_szLevelName[ ucLevelId ]; return 0; break; case 1: /* Test all maps then exit */ *_p_szLevelName = NULL; return 1; break; } break; /* next case for FIRST switch */ case 2: /* Test sequence of map then exit */ if( ucLastLevel < TEST_g_lNbMapInSequence ) { *_p_szLevelName = TEST_g_a_szMapSequence[ ucLastLevel ]; ucLastLevel++; return 0; } else { *_p_szLevelName = NULL; return 1; } } } void GAM_fn_vAutomaticChangeLevelOrRestartLevel() { static long lActionCount = 0; char szActionString[100]; char *p_szNextLevelName; /* Increase trame counter */ TEST_g_lCptWait++; if( TEST_g_lCptWait >= TEST_g_lWaitBeforeChangeLevel ) { TEST_g_lWaitBeforeChangeLevel = RND_fn_lGetLongRandomValue(0, TEST_g_lWaitMin, TEST_g_lWaitMax); TEST_g_lCptWait = 0; lActionCount ++; /* If we are in RESTARTONLY mode OR if we can and choose to restart */ if( (TEST_g_cAllMaps == 3) || (TEST_g_cChangeMapWithRestart && RND_fn_lGetLongRandomValue(0, 1, 100) > 40) ) { /* Restart level */ fn_vChangeEngineMode(EM_ModePlayerDead); strcpy( szActionString, "*** Restart level" ); } else { /* Change level */ switch( GAM_fn_iGetNextLevelName( &p_szNextLevelName ) ) { case 0: /* We change level */ GAM_fn_vAskToChangeLevel( p_szNextLevelName , TRUE ); sprintf( szActionString, "--- Change to map %s", p_szNextLevelName ); break; case 1: /* We exit */ fn_vChangeEngineMode(EM_ModeStoppingProgram); strcpy( szActionString, "Stopping Program" ); break; } /* Write log file for stacks */ if (TEST_g_lAnimStack) fn_vWriteAnimStackLogFile(); } /* Write log file for level change or restart */ if( TEST_g_cWriteLogFile ) { char szLocalTime[255]; struct tm *p_stTime; time_t xTime; FILE *hFile = NULL; if( (hFile = fopen("Test.log", "a+")) != NULL ) { time ( &xTime ); p_stTime = localtime( &xTime ); sprintf( szLocalTime, "%02d/%02d/%02d %02d:%02d:%02d", p_stTime->tm_mday, p_stTime->tm_mon + 1, p_stTime->tm_year, p_stTime->tm_hour, p_stTime->tm_min, p_stTime->tm_sec ); fprintf(hFile,"%i %s at %s\n", lActionCount, szActionString, szLocalTime ); fclose( hFile ); } } } } #endif /* U64*/ /*=========================================================================== * Description: Determins if game needs to be close. * Creation date: 20 Jun 96 * Author: CB * * g_bAppSaysBye is set to '1' by application when user requests end of * game. You must test that flag to exit all your eventual loop. *--------------------------------------------------------------------------- * Return <>0 if TRUE, 0 if FALSE *--------------------------------------------------------------------------- * Revision date: Author: *=========================================================================*/ GAME_INLINE unsigned char fn_bEndOfGame(void) { unsigned char ucReturn = 0; if (g_stEngineStructure.eEngineMode==EM_ModeStoppingProgram) ucReturn = 1; return(ucReturn); } /*=========================================================================== * Description: Determins if VBL loop needs to be quit. * Creation date: 20 Jun 96 * Author: CB * * g_bAppSaysBye is set to '1' by application when user requests end of * game. You must test that flag to exit all your eventual loop. *--------------------------------------------------------------------------- * Return <>0 if TRUE, 0 if FALSE *--------------------------------------------------------------------------- * Revision date: Author: *=========================================================================*/ #ifndef U64 #ifndef ACTIVE_EDITOR #ifdef _DEBUG EXTERN ACP_tdxBool g_bDreamcast; #endif /* _DEBUG */ #endif /* ACTIVE_EDITOR */ #endif /* U64 */ GAME_INLINE unsigned char fn_bEndOfOneStep(void) { unsigned char ucReturn = 0; PRF_fn_vStartChrono( PRF_C_ulFctMainMisc, NULL ); #if defined(GAM_USE_SNA) #ifndef ACTIVE_EDITOR #ifdef _DEBUG if (g_bDreamcast) g_stEngineStructure.eEngineMode=EM_ModeStoppingProgram; #endif /* _DEBUG */ #endif /* ACTIVE_EDITOR */ #endif /* GAM_USE_SNA */ if ( g_stEngineStructure.eEngineMode==EM_ModeStoppingProgram /*||g_stEngineStructure.eEngineMode==EM_ModeQuitGame*/ ||g_stEngineStructure.eEngineMode==EM_ModeChangeLevel ||g_stEngineStructure.eEngineMode==EM_ModePlayerDead #if defined(GAM_USE_SNA) ||(SNA_fn_ucGetLoadType()==SNA_SAVE_SNAPSHOT) #endif /* GAM_USE_SNA */ ) ucReturn = 1; PRF_fn_vStopChrono( PRF_C_ulFctMainMisc, NULL ); return(ucReturn); } /*=========================================================================== * Description: Choose the good init before VBL loop. * This function needs to set p_fn_v?? pointers. * Creation date: 20 Jun 96 * Author: CB * * g_bAppSaysBye is set to '1' by application when user requests end of * game. You must test that flag to exit all your eventual loop. *--------------------------------------------------------------------------- * Return void *--------------------------------------------------------------------------- * Revision date: Author: *=========================================================================*/ #ifdef U64 void CPAK_DrawCenteredStringSet(int oy, char *opString); extern char g_bControllerWasPluggedAtInitialisation; char g_cEndOfDemo = 0; extern short g_wWhichFrameBuffer; extern char g_bMustSwitchResolution; void SwitchTo300x224(void); void SwitchTo300x224PAL(void); void SwitchTo300x224MPAL(void); void fn_vStartLoad(void); void fn_vLoadFat( short _wLevelId ); void fn_vLoadAllVector3D(U64_tdxIndex _xVector3DId,unsigned short _uwVector3DNb); void fn_vLoadAllTripledIndex(U64_tdxIndex _xTripledIndexId,unsigned short _uwTripledIndexNb); void Fon_fn_vDisplayBackGround(char *p_cDestRamAdr, char *p_cLoadRamAdr, U64_tdxIndex _xBkGrdIndex, unsigned char _ucPaletteNumber); void fn_vEndLoad(); void fn_vSwitchToDemoLevel(void); void RES_vHighOrLowResolution(int parameter); void CPAK_vDrawAButton(unsigned short *pScreen,int oX, int oY, int buttoncode); void CPAK_vGetScreenZone(int oy); void CPAK_ClearCenteredStringSet(int oy, char _cNbCar); char g_cLogoIsDisplayed = FALSE; #endif #if !defined(RETAIL) && !defined(U64) void SNA_fn_vCheckMMGBlock( unsigned char _ucModule, unsigned char _ucBlock, unsigned char _ucLog ); #endif GAME_INLINE void fn_vChooseTheGoodInit(void) { // FB for demo #ifdef U64 char cFlag = 0; unsigned long ulPreviousTime,ulInitTime; #endif switch(g_stEngineStructure.eEngineMode) { case EM_ModeStartingProgram: #ifdef U64 #ifdef ASM_PROFILER /*XB(Profile)*/ fn_vInitProfile(); #endif /* ASM_PROFILER */ #endif /* U64 */ fn_vFirstInitEngine(); /* XB 23/06/99 */ #ifndef U64 /*bart990105 :*/ if (fn_bIsEngineInPause()) fn_vChangeWindowTitle("Rayman II - pause"); else fn_vChangeWindowTitle("Rayman II"); #endif /* U64 */ /* End XB 23/06/99 */ fn_vFreeNextLevelName(); /* to make sure that everything goes fine*/ fn_vChangeEngineMode(EM_ModeEnterGame); case EM_ModeEnterGame: #ifdef GAM_USE_SNA SNA_M_InitLoadRelocationTable(); /* MT 30/03/99 : PC protection */ #endif #ifdef U64 g_stEngineStructure.xDemoMode=FALSE; if(!g_cLogoIsDisplayed) { fn_vZBufferSynchro(); fast_memclear(&cfb[g_wWhichFrameBuffer*g_ulFrameBufferSize],g_ulFrameBufferSize*2); osWritebackDCacheAll(); } // low res if (osTvType==1) SwitchTo300x224(); else if (osTvType==0) SwitchTo300x224PAL(); else SwitchTo300x224MPAL(); /*necessary for Fon_fn_vDisplayBackGround*/ fn_vStartLoad(); fn_vLoadFat(-1); Fon_fn_vDisplayBackGround((char *)(&cfb[g_wWhichFrameBuffer*g_ulFrameBufferSize]), (char *)(&cfb[(g_wWhichFrameBuffer^1)*g_ulFrameBufferSize]), /*4*/1|D_BINSCR_IsInFixFixFat, 0); CPAK_DrawCenteredStringSet(30, "990824 _ v59"); fn_vEndLoad(); if (g_bControllerWasPluggedAtInitialisation) { CPAK_vGetScreenZone(180); CPAK_vDrawAButton((&cfb[g_wWhichFrameBuffer*g_ulFrameBufferSize]), 180, 180, 3); } else { CPAK_vDrawAButton( ((unsigned short *)(&cfb[g_wWhichFrameBuffer*g_ulFrameBufferSize])),150, 180, 4); } osSetTime(0); ulPreviousTime = osGetTime(); ulInitTime = osGetTime(); if (g_bControllerWasPluggedAtInitialisation) { IPT_fn_vReadInput(); do { MON_M_vThreadStillRunning(); IPT_fn_vReadInput(); if (osGetTime()-ulPreviousTime>20000000) { ulPreviousTime = osGetTime(); cFlag=1-cFlag; if (cFlag) CPAK_ClearCenteredStringSet(180,6); else CPAK_vDrawAButton((&cfb[g_wWhichFrameBuffer*g_ulFrameBufferSize]), 180, 180, 3); } } while ((INO_fn_wJoystickButtonJustPressed(0,START_BUTTON)== C_wJoyFalse) && (osGetTime()-ulInitTime<46000000*10)); } else { while (osGetTime()-ulInitTime<46000000*5); } g_cLogoIsDisplayed = FALSE; if (osMemSize>4*1024*1024) RES_vHighOrLowResolution(2); else RES_vHighOrLowResolution(1); if ((INO_fn_wJoystickButtonJustPressed(0,START_BUTTON)== C_wJoyFalse) || !g_bControllerWasPluggedAtInitialisation) { // Launch demos INO_fn_vU64PlayDemo(); fn_vSwitchToDemoLevel(); } else { fn_vFreeNextLevelName(); } #endif GAM_fn_vActualizeAllGameViewportSize(); fn_vInitGameLoop(); p_fn_vEngine=fn_vEngine; p_fn_vDisplayAll=fn_vDisplayAll; fn_vChangeEngineMode(EM_ModePlaying); fn_vValidateAllOption(); fn_vFreeNextLevelName(); #ifdef U64 fn_vResetEngineFromPaused(); #endif /*bart990105 : fn_vResetEngineFromPaused();*/ /* CGHT*/ #if defined(GAM_USE_SNA) if (SNA_fn_ucGetLoadType()==SNA_SAVE_SNAPSHOT) { fn_vChangeEngineMode(EM_ModeStoppingProgram); } #endif /* GAM_USE_SNA */ /* ANNECY MT - 28/06/99 { */ /**** Start the timer ****/ fn_vStartEngineClock(); /* END ANNECY MT } */ break; case EM_ModeEnterLevel: GAM_fn_vActualizeAllGameViewportSize(); p_fn_vEngine=fn_vEngine; p_fn_vDisplayAll=fn_vDisplayAll; /* if we come from above, fn_vInitLevelLoop() has already been called, so dont do it twice...*/ fn_vInitLevelLoop(); fn_vChangeEngineMode(EM_ModePlaying); fn_vValidateAllOption(); /* Used for testing fragmentation of block tmp. * enable it to get file Block0a00.log in exe\main (file is updated at each level change) #if !defined(RETAIL) && !defined(U64) SNA_fn_vCheckMMGBlock( 10, 0, 1 ); #endif */ break; case EM_ModeDeadLoop: fn_vInitDeadLoop(); fn_vValidateAllOption(); fn_vChangeEngineMode(EM_ModePlaying); break; default: M_GameFatalError(E_uwGameChooseTheGoodInitInvalidMode); break; } /***************** FabPerez InfoTrame *****************/ #if defined(WIN32) && defined(_DEBUG) fn_InitMapSectorStruct(); #endif /*WIN32 _DEBUG*/ /***************** Fin FabPerez InfoTrame *****************/ } /*=========================================================================== * Description: Choose the good init after VBL loop (fn_vEndOfOneStep * returned TRUE). * Creation date: 20 Jun 96 * Author: CB * * g_bAppSaysBye is set to '1' by application when user requests end of * game. You must test that flag to exit all your eventual loop. *--------------------------------------------------------------------------- * Return void *--------------------------------------------------------------------------- * Revision date: Author: *=========================================================================*/ GAME_INLINE void fn_vChooseTheGoodDesInit(void) { switch(g_stEngineStructure.eEngineMode) { #ifndef U64 case EM_ModeStoppingProgram: /* Tests pour les fuites de mémoire :*/ fn_vDesInitLevelLoop(); fn_vLastDesinitEngine(); break; /*case EM_ModeQuitGame: fn_vDesInitGameLoop(); PRF_fn_vDesInitProfileModule (); fn_vChangeEngineMode(EM_ModeStoppingProgram); break;*/ #endif /*U64*/ case EM_ModeChangeLevel: #ifdef ACTIVE_EDITOR if (g_bUseSAIWithEditor) { #endif /* ACTIVE_EDITOR */ #ifdef U64 if (g_cEndOfDemo==0) { #endif /* If we have to save the current game status (always, except when we load a saved game).*/ if( GAM_g_ucSaveGameBeforeChangeLevel ) { /* generate a "player" saved info -> ie info that is common to all maps -> fields saved here MUST be in the FIX memory area*/ fn_bPlayerSaveGameAll(); /*inactif pour l'instant, en attendant de voir ...*/ fn_bLevelSaveGameAll(); } else GAM_g_ucSaveGameBeforeChangeLevel = 1; #ifdef U64 } #endif #ifdef ACTIVE_EDITOR } #endif /* ACTIVE_EDITOR */ fn_vDesInitLevelLoop(); //FB for demo #ifdef U64 if (g_cEndOfDemo) { g_cEndOfDemo = 0; fn_vChangeEngineMode(EM_ModeEnterGame); } else { fn_vSetLevelName(fn_p_szGetNextLevelName()); fn_vChangeEngineMode(EM_ModeEnterLevel); } #else fn_vSetLevelName(fn_p_szGetNextLevelName()); fn_vChangeEngineMode(EM_ModeEnterLevel); #endif break; case EM_ModePlayerDead: fn_vDesInitDeadLoop(); fn_vChangeEngineMode(EM_ModeDeadLoop); break; default: M_GameFatalError(E_uwGameChooseTheGoodDesinitInvalidMode); break; } } /*########################################################################### * * CPA COMMON ENGINE FUNCTIONS. * *#########################################################################*/ /*=========================================================================== * Description: Call at each trame. * Creation date: 20 Jun 96 * Author: CB *--------------------------------------------------------------------------- * Return void *--------------------------------------------------------------------------- * Revision date: Author: *=========================================================================*/ GAME_INLINE void fn_vOneTrame(void) { #ifdef U64 #ifdef ASM_PROFILER /*XB(Profile)*/ (*g_p_ulNbEngineFrames)++; #endif /* ASM_PROFILER */ #endif /* U64 */ #ifdef _DEBUG #ifndef ACTIVE_EDITOR fn_vGameTestMemory(); #endif #endif PRF_fn_vStartChrono( PRF_C_ulFctDisplay , PRF_C_pvRest ); PRF_fn_vStartChrono( PRF_C_ulFctDisplayCommon , PRF_C_pvGetDevice ); /* XB 23/06/99 */ #ifndef U64 g_stEngineStructure.hGLDDevice = fn_hGetGLDDevice(0); g_stEngineStructure.hGLDViewport = fn_hGetGLDViewport(0); g_stEngineStructure.hDrawSem = fn_hGetDrawSemaphore(); #endif /* U64 */ /* End XB 23/06/99 */ PRF_fn_vStopChrono( PRF_C_ulFctDisplayCommon , PRF_C_pvGetDevice ); PRF_fn_vStopChrono( PRF_C_ulFctDisplay , PRF_C_pvRest ); /* * BE CAREFUL !!! * Net library must not be called beetween * - IDirectDrawSurface::Lock and IDirectDrawSurface::Unlock * - IDirectDrawSurface::GetDC and IDirectDrawSurface::ReleaseDC * So thanks MicroFlop ! */ PRF_fn_vStartChrono( PRF_C_ulFctMainMisc, NULL ); p_fn_vNetEngine(); /* For multi player game */ PRF_fn_vStopChrono( PRF_C_ulFctMainMisc, NULL ); #if !defined(PRESS_DEMO) /**************** FabPerez SectorAnalyse ************/ /*****************************************************/ #if defined(WIN32) && defined(_DEBUG) fn_RecupInfoTrameSecteur(); #endif /*WIN32 & _DEBUG*/ /************** Fin FabPerez SectorAnalyse ***********/ /******************************************************/ #endif /* PRESS_DEMO */ if (fn_bEndOfGame()) { return; } p_fn_vEngine(); /* Engine one step */ if (g_stEngineStructure.eEngineMode==EM_ModeStoppingProgram) { return; } /* LOL #if !defined(U64) || !defined(RETAIL)*/ #if !defined(U64) && !defined(RETAIL) if (TEST_g_bAutomaticTest) GAM_fn_vAutomaticChangeLevelOrRestartLevel(); #endif /* U64 & RETAIL*/ p_fn_vDisplayAll(); /* Display all results */ /* PRF_fn_vStartChrono( PRF_C_ulFctDisplaySpecific, PRF_C_pvRest ); GLI_vEndOfTurnEngine(); PRF_fn_vStopChrono( PRF_C_ulFctDisplaySpecific, PRF_C_pvRest ); */ #if defined(ACTIVE_EDITOR) PRF_fn_vStartChrono( PRF_C_ulFctEditor, NULL ); fn_vEditorDrawObjectExpect0(); PRF_fn_vStopChrono( PRF_C_ulFctEditor, NULL ); #endif /* ACTIVE_EDITOR */ #ifdef ACTIVE_EDITOR PRF_fn_vStartChrono( PRF_C_ulFctEditor, NULL ); /* To refresh all editors with actual engine datas */ fn_vEditorDataHasChange(); PRF_fn_vStopChrono( PRF_C_ulFctEditor, NULL ); #endif /* ACTIVE_EDITOR */ PRF_fn_vStartChrono( PRF_C_ulFctInput, NULL ); p_fn_vReadInput(); /* Read input from user */ PRF_fn_vStopChrono( PRF_C_ulFctInput, NULL ); /* ANNECY AV DEMO {*/ #ifndef U64 DEMO_fn_vCloseFirstInit(); #endif /* END ANNECY AV }*/ } /*=========================================================================== * Description: Main loop of engine. * In WIN32, that thread is paused when we are in edit mode, * so it's not used to test M_bEditorsActive(). * Creation date: 20 Jun 96 * Author: CB *--------------------------------------------------------------------------- * Return code for end of application *--------------------------------------------------------------------------- * Revision date: Author: *=========================================================================*/ unsigned int fn_uiEngineMainLoop(void) { unsigned long ulTimeMainLoop; short wTimerMainLoop; stTimerCount stTimerCountMainLoop; unsigned long ulTimerFrequency; /*XB980517 (from Oliv')*/ #if defined(USE_PROFILER) && !defined(PRESS_DEMO) PRF_fn_vInitProfileModule (); PRF_fn_vInitChrono ( PRF_C_ulFctMainLoop , "Total", 16 , 2 ); /*PRF_GLI PRF_fn_vInitChrono ( PRF_C_ulFctDisplay , "Display", 2048, 13);*/ PRF_fn_vInitChrono ( PRF_C_ulFctDisplay , "Display", 3000, 20); PRF_fn_vInitChrono ( PRF_C_ulFctAI , "AI", 1024, 128); PRF_fn_vInitChrono ( PRF_C_ulFctCollisions , "All Collisions", 1024, 128); PRF_fn_vInitChrono ( PRF_C_ulFctCollisionsChar , "Collisions with others Actors", 1024, 128); PRF_fn_vInitChrono ( PRF_C_ulFctDNM , "Mechanics", 1024, 128); PRF_fn_vInitChrono ( PRF_C_ulFctAnimPlayer , "Player", 1024 ,128); PRF_fn_vInitChrono ( PRF_C_ulFctInput , "Input", 8 , 2 ); PRF_fn_vInitChrono ( PRF_C_ulFctEditor , "Editor", 8 , 2 ); PRF_fn_vInitChrono ( PRF_C_ulFctSound , "Sound", 128, 5); PRF_fn_vInitChrono ( PRF_C_ulFctFlip , "Flip", 64 , 2 ); PRF_fn_vInitChrono ( PRF_C_ulFctMainMisc , "Misc", 512 , 2 ); PRF_fn_vInitChrono ( PRF_C_ulFctIADNMPLAMisc , "Misc AI/DNM/PLA", 512 , 2 ); PRF_fn_vInitChrono ( PRF_C_ulFctHIE , "AI+DNM+PLA", 8 , 2 ); PRF_fn_vInitChrono ( PRF_C_ulWaitFor3dFx , "Wait for 3dFx", 8 , 2 ); PRF_fn_vInitChrono ( PRF_C_ulFctDisplaySpecific , "Display Specific", 1500, 5 ); PRF_fn_vInitChrono ( PRF_C_ulFctDisplayCommon , "Display Specific 2", 3072, 10 ); PRF_fn_vInitChrono ( PRF_C_ulFctDisplaySprite , "Display Sprite", 128, 10 ); /*VL raster and var for GLI*/ PRF_fn_vInitChrono ( PRF_C_ulGLI1 , "Gli1" , 512, 2 ); PRF_fn_vInitChrono ( PRF_C_ulGLI2 , "Gli2" , 512, 2 ); PRF_fn_vInitChrono ( PRF_C_ulGLI3 , "Gli3" , 512, 2 ); PRF_fn_vInitChrono ( PRF_C_ulGLI4 , "Gli4" , 512, 2 ); PRF_fn_vInitChrono ( PRF_C_ulGLI5 , "Gli5" , 512, 2 ); PRF_fn_vInitChrono ( PRF_C_ulGLI6 , "Gli6" , 512, 2 ); PRF_fn_vInitChrono ( PRF_C_ulGLI7 , "Gli7" , 512, 2 ); PRF_fn_vInitChrono ( PRF_C_ulGLI8 , "Gli8" , 512, 2 ); PRF_fn_vInitVariable ( PRF_C_ulVarGLI1 , "VarGli1", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarGLI2 , "VarGli2", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarGLI3 , "VarGli3", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarGLI4 , "VarGli4", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarGLI5 , "VarGli5", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarGLI6 , "VarGli6", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarGLI7 , "VarGli7", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarGLI8 , "VarGli8", 512 , 4 ); /*EVL*/ /*VL raster and var for GLI*/ PRF_fn_vInitChrono ( PRF_C_ulGLI1 , "Gli1" , 512, 2 ); PRF_fn_vInitChrono ( PRF_C_ulGLI2 , "Gli2" , 512, 2 ); PRF_fn_vInitChrono ( PRF_C_ulGLI3 , "Gli3" , 512, 2 ); PRF_fn_vInitChrono ( PRF_C_ulGLI4 , "Gli4" , 512, 2 ); PRF_fn_vInitChrono ( PRF_C_ulGLI5 , "Gli5" , 512, 2 ); PRF_fn_vInitChrono ( PRF_C_ulGLI6 , "Gli6" , 512, 2 ); PRF_fn_vInitChrono ( PRF_C_ulGLI7 , "Gli7" , 512, 2 ); PRF_fn_vInitChrono ( PRF_C_ulGLI8 , "Gli8" , 512, 2 ); PRF_fn_vInitVariable ( PRF_C_ulVarGLI1 , "VarGli1", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarGLI2 , "VarGli2", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarGLI3 , "VarGli3", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarGLI4 , "VarGli4", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarGLI5 , "VarGli5", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarGLI6 , "VarGli6", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarGLI7 , "VarGli7", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarGLI8 , "VarGli8", 512 , 4 ); /*EVL*/ PRF_fn_vInitVariable ( PRF_C_ulVarCurrentSector , "Current Sector", 3 , 3 ); PRF_fn_vInitVariable ( PRF_C_ulVarDynObjects , "dynam objects", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarStaObjects , "static objects", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarFixObjects , "Fix objects", 128 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarShwObjects , "Shadow objects", 128 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarDynFaces , "dynam faces", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarStaFaces , "static faces", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarFixFaces , "Fix faces", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarShwFaces , "Shadow faces", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarSectors , "nb displayed sectors", 64, 128); PRF_fn_vInitVariable ( PRF_C_ulVarStaColl , "Number of objects of the map in collision with the main character", 512, 128); PRF_fn_vInitVariable ( PRF_C_ulVarDynColl , "Number of actors in collision with the main character", 512, 128); PRF_fn_vInitVariable ( PRF_C_ulVarDynElements , "Dynam Elements", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarStaElements , "Static Elements", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarFixElements , "Fix Elements", 512 , 4 ); PRF_fn_vInitVariable ( PRF_C_ulVarShwElements , "Shadow Elements", 512 , 4 ); PRF_fn_vSetIndependantVariableName( PRF_C_ulIdpNbSkippedAnims , "Skipped anims" ); PRF_fn_vSetIndependantVariableName( PRF_C_ulIdpNbMaxAllocSPO , "max alloc PLA SPO" ); PRF_fn_vSetIndependantVariableName( PRF_C_ulIdpNbAllocSPO , "alloc PLA SPO" ); PRF_fn_vSetIndependantVariableName( PRF_C_ulIdpNbMaxAllocCHA , "max alloc Channels" ); PRF_fn_vSetIndependantVariableName( PRF_C_ulIdpNbAllocCHA , "alloc Channels" ); #ifdef U64 PRF_fn_vSetIndependantVariableName( PRF_C_ulIdpGfxList , "GfxList usage" ); PRF_fn_vSetIndependantVariableName( PRF_C_ulIdpMaxGfxList , "Max GfxList usage" ); PRF_fn_vSetIndependantVariableName( PRF_C_ulIdpAllowedGfxList , "Allowed GfxList usage" ); PRF_fn_vSetIndependantVariableName( PRF_C_ulIdpGfxList2 , "GfxList2 usage" ); PRF_fn_vSetIndependantVariableName( PRF_C_ulIdpMaxGfxList2 , "Max GfxList2 usage" ); PRF_fn_vSetIndependantVariableName( PRF_C_ulIdpAllowedGfxList2 , "Allowed GfxList2 usage" ); PRF_fn_vSetIndependantVariableName( PRF_C_ulIdpMtxList , "MtxList usage" ); PRF_fn_vSetIndependantVariableName( PRF_C_ulIdpMaxMtxList , "Max MtxList usage" ); PRF_fn_vSetIndependantVariableName( PRF_C_ulIdpAllowedMtxList , "Allowed MtxList usage" ); PRF_fn_vSetIndependantVariableName( PRF_C_ulIdpLightList , "LightList usage" ); PRF_fn_vSetIndependantVariableName( PRF_C_ulIdpMaxLightList , "Max LightList usage" ); PRF_fn_vSetIndependantVariableName( PRF_C_ulIdpAllowedLightList, "Allowed LightList usage" ); PRF_fn_vSetIndependantVariableName( PRF_C_ulIdpMaxMainStackSize , "Max MainStack usage" ); PRF_fn_vSetIndependantVariableName( PRF_C_ulIdpAllowedMainStackSize,"Allowed MainStack usage" ); PRF_fn_vSetIndependantVariableName( PRF_C_ulIdpMaxNbCollisions , "Max Nb Collisions" ); PRF_fn_vSetIndependantVariableName( PRF_C_ulIdpAllowedNbCollisions, "Allowed Nb Collisions" ); PRF_fn_vSetIndependantVariableName( PRF_C_ulIdpAAMode,"AA Mode" ); #endif GAM_fn_vRasterDisplayInit (); #endif /* USE_PROFILER && PRESS_DEMO */ #ifdef USE_DIRECTX wTimerMainLoop = TMR_fn_wCreateTimer(C_wTimerFrequencyMedium); TMR_fn_wGetTimerFrequency(wTimerMainLoop,&ulTimerFrequency); ulTimerFrequency /= 1000000; #endif /*g_b_lBackFaceOn = 0;*/ while (!fn_bEndOfGame()) { fn_vChooseTheGoodInit(); PRF_fn_vStartChrono( PRF_C_ulFctMainLoop, NULL ); while(!fn_bEndOfOneStep()) /* App can force engine to stop in WIN32 */ { #ifdef USE_DIRECTX TMR_fn_wResetTimer(wTimerMainLoop); TMR_fn_wStartTimer(wTimerMainLoop); #endif /**** Save the game ****/ #if !defined(ACTIVE_EDITOR) /* if (g_stSavedGame.bSaveAsked&&!fn_bIsCommandsDisplayed()) { fn_bPlayerSaveGameAll(); fn_vDisplayCommandValue(TRUE); } if (g_stExtrasGame.bSaveAsked&&!fn_bIsCommandsDisplayed()) { fn_bSaveCurrentExtrasGame(); fn_vDisplayCommandValue(TRUE); } */ #endif /* ACTIVE_EDITOR */ #if defined(WIN32) PRF_fn_vStartChrono( PRF_C_ulFctMainMisc, NULL ); fn_vCheckPause(); fn_vCheckEnd(); PRF_fn_vStopChrono( PRF_C_ulFctMainMisc, NULL ); if (g_stEngineStructure.eEngineMode!=EM_ModeStoppingProgram) #endif /* WIN32 */ /* One VBL step */ fn_vOneTrame(); //chbani #ifdef USE_DIRECTX TMR_fn_wStopTimer(wTimerMainLoop); TMR_fn_wReadTimer( wTimerMainLoop, &stTimerCountMainLoop); ulTimeMainLoop = stTimerCountMainLoop.m_ulLowPart/ulTimerFrequency;//MicroSecond { int diff ; static int sFrameDisared = 16666 ;//micro sec 60 FPS if(sFrameDisared > ulTimeMainLoop ) { diff = (sFrameDisared - ulTimeMainLoop)/1000;//milsecond Sleep(diff); } } #endif } PRF_fn_vStopChrono( PRF_C_ulFctMainLoop, NULL ); fn_vChooseTheGoodDesInit(); } /**** tell the appli that it's over...*/ #if defined(WIN32) fn_vEngineHasFinished(); #endif return 0; }