1006 lines
32 KiB
C
1006 lines
32 KiB
C
/*=========================================================================
|
||
* 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 <direct.h> /**** pour les tests ****/
|
||
#else /* U64 */
|
||
#include <cpa_std.h>
|
||
#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 <sys/types.h>
|
||
#include <sys/timeb.h>
|
||
#include <time.h>
|
||
|
||
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;
|
||
}
|