reman3/Rayman_X/cpa/tempgrp/GAM/specif/Initeng.cxx

1382 lines
49 KiB
C++

#include "CMP.h"
#include "Options\specif\SubMapPs.h"
#include "ago.h"
extern POS_tdstCompletePosition *POS_g_p_stIdentityMatrix;
#if defined (ACTIVE_EDITOR)
BOOL g_bSectionSoundFoundInLevelDSC;
#endif /*ACTIVE_EDITOR*/
/* ANNECY MT - 30/03/99 { PC Protection */
#ifndef U64
void fn_vCopyProtectKeyToModels();
void fn_vCopyChecksumToModels();
#ifndef ACTIVE_EDITOR
#ifdef _DEBUG
EXTERN ACP_tdxBool g_bDreamcast;
EXTERN void MDS_fn_vGenerateDCData(char, char);
#endif /* _DEBUG */
#endif /* ACTIVE_EDITOR */
EXTERN ACP_tdxBool g_bDumpMemory;
#endif /* U64 */
/* END ANNECY MT } */
extern tdstEngineObject *g_AlphabetCharacterPointer;
extern ACP_tdxBool g_bInGameMenu;
/* Modif 03/07/98 : init interpolation and keep anim of char. in the fix - Carlos Torres*/
void fn_vFirstInitEngine( void )
{
SndBool bRet;
BOOL bHasSwapped=FALSE;
SND_tdstInitStruct SndInit;
char a256_cName[256];
strcpy(a256_cName, fn_szGetGameDataPath());
strcat(a256_cName, "\\world\\levels\\fix.ptx");
TEX_SetNameOfBinaryFile((unsigned char *)a256_cName);
g_stEngineStructure.hGLDDevice = fn_hGetGLDDevice(0);
g_stEngineStructure.hGLDViewport = fn_hGetGLDViewport(0);
g_stEngineStructure.hDrawSem = fn_hGetDrawSemaphore();
g_stEngineStructure.eInputMode = IM_Normal;
g_stEngineStructure.eDisplayFixMode = DFM_DisplayAll;
LST2_M_DynamicInitAnchor(&g_stEngineStructure.hCameraList);
LST2_M_DynamicInitAnchor(&g_stEngineStructure.hMainCharacterList);
LST2_M_DynamicInitAnchor(&g_stEngineStructure.hAlwaysActiveCharactersList);
g_stEngineStructure.ucPreviousLevel = 0;
g_stEngineStructure.ucExitIdToQuitPrevLevel = 0;
g_stEngineStructure.ucLevelGlobalCounter = 0;
/*fn_vFreeNextLevelPositionName();*/
MTH_M_vInit();
/*g_b_lSurfacesOn = TRUE;*/
g_ucIsEdInGhostMode = 0;
/* ANNECY MT - 25/06/99 { */
#if !defined(U64) && defined(_DEBUG)
g_ucSlowDownEngine = 0;
g_ucSlowDownTime = 0;
#endif
/* END ANNECY MT } */
/**** Initialize the engine clock ****/
fn_vFirstInitEngineClock();
/**** Verify some program's variable ****/
fn_vVerifySomeProgramVariables();
GLI_xInitGli();
fn_vInitFrameLenght ();
GAM_fn_vCreateGameDeviceAndViewPorts();
#ifdef ACTIVE_EDITOR
// fn_vSwapDeviceToFullScreen();
#endif
VIG_fn_vInitDeviceVignette(g_stEngineStructure.hGLDDevice,g_stEngineStructure.hGLDFixViewport,g_stEngineStructure.hDrawSem);
VIG_fn_vInitVignette();
FON_fn_vInitFonts();
/* ANNECY AV DEMO {*/
DEMO_fn_vAllocateMemory ();
/* END ANNECY AV }*/
/* GuS 98/08/11*/
if ( SNA_fn_ucGetLoadDscType() == SNA_C_LoadBinaryDsc )
{
/* read Directories Description*/
SNA_M_ReadSingleSectionFromDscFile();
}
/* if we are not going to load binary data, then the game script is parsed normally*/
if (
(SNA_fn_ucGetLoadType()!=SNA_LOAD_SNAPSHOT)
&& (SNA_fn_ucGetLoadDscType()!=SNA_C_LoadBinaryDsc)
)
fn_vLoadGameScript();
else
/* Else, we compute witch part of the game desc are to be loaded.*/
fn_vLoadReducedGameScript();
/* init interpol module*/
fn_v_InitInterpol();
if (SNA_fn_ucGetLoadType()!=SNA_LOAD_SNAPSHOT)
{
fn_vInitAI(FALSE);
#ifndef U64
DEMO_fn_vInitGMTFixList ();
#endif /* U64 */
}
#ifndef RETAIL /* { */
else
fn_vInitAI(TRUE);
#endif /* RETAIL } */
/* SOUND: After fn_vLoadGameScript/ Before fn_bLoadCurrentGameOptions(for fn_lInitSoundForAnim)*/
/***** Init sound engine:*/
SND_fn_vSetSoftDirectory(fn_szGetEngineDLLPath());
fn_vInitSoundStruct((void*)&SndInit); /*fct defined by GameITF*/
SND_fn_iInitSound(&SndInit);
bRet=SIF_fn_bInitSoundInfos();
SND_fn_vSetDopplerFactorSound(SND_C_NO_DOPPLER);
/**** fin int sound*/
bRet=SND_fn_bInitDataLoadSnd("Rayman2");
if ( SNA_fn_ucGetLoadDscType() == SNA_C_LoadBinaryDsc )
{
/* Read all sections from the binarized game.dsc.*/
SNA_M_ReadAllRemainingSectionsFromDscFile();
/* Then close it*/
SNA_M_EndReadFromCurrentDscFile();
}
/**** init sound objects*/
fn_lInitSoundForAnim();
fn_vInitMicrosFunction();
/* fin magouille son*/
/* SOUND fin*/
/*Init VDO lib*/
#if defined(GAM_VIDEO)
VDO_fn_xInitAVI(fn_hGetApplicationInstance(),g_stEngineStructure.hDrawSem);
#endif /* GAM_VIDEO*/
fn_bDestroySavedGame(0); /* destroy the temporary save slot if it exists*/
fn_vInitAllLinkTables(); /* initialise link tables before loading menus*/
/*** Initialize the collision object used for acceleration ***/
#ifndef RETAIL /* { */
if ((SNA_fn_ucGetLoadType()==SNA_SAVE_SNAPSHOT))
{
char szFileName[_MAX_PATH];
/*
sprintf(szFileName,"%s\\Fix.vgm",fn_szGetLevelsDataPath());
SNA_fn_xWriteOpenVignetteTableFile(szFileName);
*/
sprintf(szFileName,"%s\\Fix.snd",fn_szGetLevelsDataPath());
SNA_fn_xWriteOpenSoundTableFile(szFileName);
}
#endif /* RETAIL } */
GAM_fn_vCreateListOfLevel();
/**** Init all object's type structures ****/
fn_vFirstInitObjectTypeStructure();
#ifndef RETAIL /* { */
if (SNA_fn_ucGetLoadType()!=SNA_LOAD_SNAPSHOT)
{
unsigned char ucOldACPModeMalloc;
ucOldACPModeMalloc = GEO_M_ucGetMemMallocMode();
GEO_xSelectMemoryChannel(ACP_FixMemoryChannel);
POS_fn_vInitPos();
GEO_xSelectMemoryChannel(ucOldACPModeMalloc);
fn_vLoadGameFixScript();
fn_vInitObjectsInTheFix();
}
#endif /* RETAIL } */
/* keep the anim load in the fix*/
fn_v_UnclearPreviousLoadedAnims();
#ifndef RETAIL /* { */
if ((SNA_fn_ucGetLoadType()==SNA_SAVE_SNAPSHOT))
{
char szFileName[_MAX_PATH];
sprintf(szFileName,"%s\\Fix.snd",fn_szGetLevelsDataPath());
}
else if (SNA_fn_ucGetLoadType()==SNA_LOAD_SNAPSHOT)
#endif /* RETAIL } */
fn_vLoadFix();
/*
if (SNA_fn_ucGetLoadType()==SNA_LOAD_SNAPSHOT)
{
char szFileName[_MAX_PATH];
sprintf(szFileName,"%s\\world\\levels\\Fix.gpt",fn_szGetGameDataPath());
SNA_fn_xReadOpenGlobalPointersFile(szFileName);
POS_g_p_stIdentityMatrix=(POS_tdstCompletePosition *)SNA_fn_vReadPointerFromGlobalPointersFile();
SNA_fn_vCloseGlobalPointersFile();
POS_g_p_stIdentityMatrix->ulType = POS_C_ulIdentityMatrixFlag;
MTH3D_M_vNullVector(&(POS_g_p_stIdentityMatrix->stTranslationVector));
MTH3D_M_vSetIdentityMatrix(&(POS_g_p_stIdentityMatrix->stRotationMatrix));
MTH3D_M_vSetIdentityMatrix(&(POS_g_p_stIdentityMatrix->stTransformMatrix));
}
*/
fn_bLoadCurrentGameOptions();
PLA_fn_vCreateAndInitHeaps();
/*** Initialize the collision object used for acceleration ***/
fn_vFirstTimeInitCollisionGeometricObject();
/* ANNECY MT - 28/08/98 {*/
POS_fn_vSetIdentityMatrix(&g_stEngineStructure.stMainCharacterPosition);
POS_fn_vSetIdentityMatrix(&g_stEngineStructure.stMainCameraPosition);
g_stEngineStructure.bResurection = FALSE;
/* END ANNECY MT }*/
/* Init water streak and bubble effects */
/* Do not delete*/
fn_vInitBubbleEffect();
fn_vInitWaterStreakEffect();
SHW_fn_vInitShadow(g_stEngineStructure.hGLDDevice);
HIE_fn_vCreateMatrixStack();
#ifndef U64
#ifndef ACTIVE_EDITOR
#ifdef _DEBUG
if (g_bDreamcast)
MDS_fn_vGenerateDCData(1, 1);
#endif /* _DEBUG */
#endif /* ACTIVE_EDITOR */
#endif /* U64 */
#ifndef RETAIL /* } */
if (SNA_fn_ucGetLoadType()==SNA_SAVE_SNAPSHOT)
{
fn_vSaveFix(TRUE);
SNA_fn_vCloseSoundTableFile();
}
if (SNA_fn_ucGetLoadType()==SNA_LOAD_SCRIPT)
GLI_vEndofGeometricLoad();
#endif /* RETAIL */
GEO_fn_vInitBoundingVolumeMaterial();
SNA_fn_vSetSaveLoadLevel();
TFMT_vSetDefaultValuesCharacter(MTH_C_ONE, MTH_C_2, MTH_C_ZERO);
}
/*-----------------------------------------------------------------------------
* Description : Init engine when the application just run
*-----------------------------------------------------------------------------
* Input :
* Output :
*-----------------------------------------------------------------------------
* Creation date : 25/04/97 Author : Francois
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void fn_vInitEngineWhenInitApplication(void)
{
Erm_M_InitErrMsg(Game);
fn_vComputeTempDataPath();
GAM_fn_vReadUbiIniFileForGame();
GAM_fn_vTreatExeParameters();
g_stEngineStructure.eEngineMode = EM_ModeStartingProgram;
SCR_fn_v_Mem_InitWithMemLevel(g_SCR_a9MemTable);
GEO_xInitGEOError();
IPT_fn_vFirstInitInput();
RND_fn_vFirstInitRandom();
CMP_fn_vFirstInit();
SAI_fn_vFirstInit();
TMP_fn_vFirstInit();
FIL_fn_vFirstInit();
VIG_fn_vFirstInit();
PO_fn_vFirstInit();
fn_vFirstInitAIMemory();
fn_vFirstInitGameMemory();
POS_fn_vFirstInit();
fn_vInitAndRegisterAllScriptSections();
SCR_fn_v_Mem_SetCurrentLevel(GAM_C_FixScriptPriority);
SCR_fn_v_Mem_SetCurrentLinkLevel(GAM_C_FixScriptPriority);
SNA_fn_vSetSaveLoadFix();
/* GuS 98/08/06*/
if ( SNA_fn_ucGetLoadDscType() == SNA_C_LoadBinaryDsc )
{
/* Load game.dsb that is obtained by binarization of some files (Game.dsc, Game.mem, Game.rnd & Game.pgb)*/
/* Here is the first time the GameDsc File is used, so prepare it for reading.*/
SNA_M_BeginReadFromDscFile( SNA_C_GameDscFile );
/* Read the memory description from the file.*/
SNA_M_ReadSingleSectionFromDscFile();
}
else
{
/* If we are goind to create the .dsb, open the game.dsb for writing.*/
#ifndef RETAIL
if( SNA_fn_ucGetLoadDscType() == SNA_C_SaveBinaryDsc )
SNA_M_BeginWriteToDscFile( SNA_C_GameDscFile );
#endif
SNA_fn_vSetLoadType(SNA_LOAD_SCRIPT);
fn_vLoadGameMemoryScript();
}
GAM_fn_vSetEngineInFixMode();
}
/*-----------------------------------------------------------------------------
* Description : Load one level
*-----------------------------------------------------------------------------
* Input :
* Output :
*-----------------------------------------------------------------------------
* Creation date :
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void fn_vInitLevelLoop()
{
char szLevelSnapshotFilename[_MAX_PATH],szFileName[_MAX_PATH];
static HIE_tdxHandleToSuperObject hPreviousWorld=NULL;
FIL_tdxHandleToFileNameList hLevelNameList;
SCT_fn_vInitMaterialForGoThrough();
/* Clear Anim of a previous level and keep the fix*/
fn_v_ClearLoadedAnims(FALSE);
/* Init for the save of global fog*/
GLI_g_bSaveFog = FALSE;
GLD_bSetBackgroundColorForDevice(fn_hGetGLDDevice(0), RGB(0,0,0));
g_AlphabetCharacterPointer = NULL;
g_bInGameMenu = FALSE;
SCR_fn_v_Mem_SetCurrentLevel(GAM_C_LevelDynamicScriptPriority);
SCR_fn_v_Mem_SetCurrentLinkLevel(GAM_C_LevelDynamicScriptPriority);
#ifndef RETAIL
if ( SNA_fn_ucGetLoadDscType() == SNA_C_SaveBinaryDsc )
{
/* Binarization of some game infos.*/
SNA_M_BeginWriteToDscFile( SNA_C_LevelDscFile );
}
else
#endif
if ( SNA_fn_ucGetLoadDscType() == SNA_C_LoadBinaryDsc )
{
/* Load level.dsb that is obtained by binarization of some files (Level.dsc & Level.pgb)*/
/* Here is the first time the Level Dsc File is used, so prepare it for reading.*/
SNA_M_BeginReadFromDscFile( SNA_C_LevelDscFile );
/* Read the level memory desc.*/
SNA_M_ReadSingleSectionFromDscFile();
/* Keep the file opened for further reading.*/
}
#ifndef RETAIL /* { */
if ( SNA_fn_ucGetLoadDscType() != SNA_C_LoadBinaryDsc )
{
if (g_cMemMode)
/* For binarization, we read Level.mem and not LevelName\levelName.mem*/
SCR_fnp_st_RdL0_AnalyseSection("level.mem", SCR_CDF_uw_Anl_Normal);
else
{
sprintf(szFileName,"%s\\%s.%s",fn_p_szGetLevelName(),fn_p_szGetLevelName(),C_MemoryDescriptionSuffixe);
SCR_fnp_st_RdL0_AnalyseSection(szFileName, SCR_CDF_uw_Anl_Normal);
}
}
#endif /* RETAIL } */
SCR_fn_v_Mem_SetCurrentLevel(GAM_C_LevelScriptPriority);
SCR_fn_v_Mem_SetCurrentLinkLevel(GAM_C_LevelScriptPriority);
if ( SNA_fn_ucGetLoadDscType() == SNA_C_LoadBinaryDsc )
{
/* Read the vignette desc*/
SNA_M_ReadSingleSectionFromDscFile();
#if defined(_DEBUG)
fn_vChangeWindowTitle("Chargement de la map");
#endif /* _DEBUG */
/* Read level desc*/
SNA_M_ReadAllRemainingSectionsFromDscFile();
/* For the moment, no other information is stored in this file, so :*/
SNA_M_EndReadFromCurrentDscFile();
}
else
{
sprintf(szFileName,"%s\\%s.%s",fn_p_szGetLevelName(),fn_p_szGetLevelName(),VIG_C_ScriptPgbSuffixe);
if (!SCR_fn_c_RdL0_IsSectionExists(szFileName))
sprintf(szFileName,"default.%s",VIG_C_ScriptPgbSuffixe);
SCR_fnp_st_RdL0_AnalyseSection(szFileName, SCR_CDF_uw_Anl_Normal);
fn_vChangeWindowTitle("Chargement de la map");
sprintf(szFileName,"%s\\%s.%s",fn_p_szGetLevelName(),fn_p_szGetLevelName(),C_ScriptDescriptionSuffixe);
#if defined (ACTIVE_EDITOR)
g_bSectionSoundFoundInLevelDSC = FALSE;
#endif /*ACTIVE_EDITOR*/
SCR_fnp_st_RdL0_AnalyseSection(szFileName, SCR_CDF_uw_Anl_Normal);
#if defined (ACTIVE_EDITOR)
if (!g_bSectionSoundFoundInLevelDSC)
MessageBox(NULL,"Add section {LevelSoundBanks:}", "Missing information in *.dsc in the current level", MB_OK);
#endif /*ACTIVE_EDITOR*/
#ifndef RETAIL /* { */
if ( SNA_fn_ucGetLoadDscType() == SNA_C_SaveBinaryDsc )
SNA_M_EndWriteToCurrentDscFile();
#endif /* RETAIL } */
}
#ifndef RETAIL /* { */
if (SNA_fn_ucGetLoadType()==SNA_LOAD_SCRIPT)
{
fn_vStandardInitLevelLoop();
GLI_vEndofGeometricLoad();
fn_vCopyChecksumToModels();
}
else/* Load or Save binary data for a level*/
#endif /* RETAIL } */
{
#ifdef D_USE_LIPSYNC
ACP_tdxBool bLipsSynchPresent;
#endif /* D_USE_LIPSYNC*/
sprintf(szFileName,"%s\\%s\\%s.ptx",fn_szGetLevelsDataPath(),fn_p_szGetLevelName(),fn_p_szGetLevelName());
TEX_SetNameOfBinaryFile((unsigned char *)szFileName);
sprintf(szLevelSnapshotFilename,"%s\\%s\\%s.sna",fn_szGetLevelsDataPath(),fn_p_szGetLevelName(),fn_p_szGetLevelName());
if (SNA_fn_ucGetLoadType()==SNA_LOAD_SNAPSHOT)
{
/* Load Binary data for the level*/
MC_tdxHandleToMainCharacterNode hMainCharNode;
unsigned long i;
unsigned char ucDummy;
float xDumpNear;
char p_cDummy[_MAX_PATH];
char szTrueFirstLevelNameInBin[_MAX_PATH];
short wDummy;
void *vDummy;
tdeEngineMode eLocalEngineMode;
unsigned char ucDummyPrevLevel, ucDummyExit;
#ifndef RETAIL
char a_szLevelName[80][_MAX_NAME_LEVEL];
unsigned char ucNumberOfLevels;
#endif
tdstEngineTimerStructure stSaveTimer;
struct GLI_tdstCamera_ *p_stCamera;
/* ID of levels : for loading relocation tables. */
unsigned char ucIDOfLevelToLoad = SNA_fn_ucGetLevelID( fn_p_szGetLevelName() );
GLI_xGetViewportCamera ( g_stEngineStructure.hGLDDevice,g_stEngineStructure.hGLDViewport,&p_stCamera);
if(!p_stCamera)
{
GLI_xCreateCamera (&(p_stCamera),GLI_C_lPersCamWithoutDistorsion);
GLI_xSetCameraAspectAndRatio (p_stCamera,1.5, 0.75);
GLI_xSetViewportCamera( g_stEngineStructure.hGLDDevice,
g_stEngineStructure.hGLDViewport,
p_stCamera ) ;
}
SNA_fn_vSetSaveLoadLevel();
SNA_M_ReInitLoadRelocationTable();
#ifdef D_USE_LIPSYNC
sprintf(szFileName,"%s\\%s\\%s.lsy",fn_szGetLevelsDataPath(),fn_p_szGetLevelName(),fn_p_szGetLevelName());
SNA_M_vSetNextRelocationFileToLoad( ucIDOfLevelToLoad, SNA_C_ucLipsSyncRelocationTable );
bLipsSynchPresent=SNA_fn_xReadOpenLipsSynchTableFile(szFileName);
/* Version hybride*/
if (bLipsSynchPresent)
{
sprintf(szFileName,"%s\\%s\\%s.bls",fn_szGetLevelsDataPath(),fn_p_szGetLevelName(),fn_p_szGetLevelName());
fn_vReadAllLipsSynchroBlocs(szFileName);
}
#endif /* D_USE_LIPSYNC*/
/* ANNECY OA - 12/07/99 { */
/* Load dummy datas : for protections */
SNA_M_LoadUnusedRelocationTable();
/* END ANNECY OA } */
/* read level.sna*/
SNA_M_vSetNextRelocationFileToLoad( ucIDOfLevelToLoad, SNA_C_ucSNARelocationTable );
SNA_fn_bReadAllMemoryBlocks(szLevelSnapshotFilename);
/* ANNECY OA - 12/07/99 { */
/* Load dummy datas : for protections */
SNA_M_LoadUnusedRelocationTable();
/* END ANNECY OA } */
SNA_M_vSetNextRelocationFileToLoad( ucIDOfLevelToLoad, SNA_C_ucGlobalPointersRelocationTable );
sprintf(szFileName,"%s\\%s\\%s.gpt",fn_szGetLevelsDataPath(),fn_p_szGetLevelName(),fn_p_szGetLevelName());
SNA_fn_xReadOpenGlobalPointersFile(szFileName);
/*//////*/
/* read all global pointers and structures saved during the binarization */
/*//////*/
/* Init Position of perso in Fix*/
{
unsigned long i;
POS_tdstCompletePosition *p_stMatrix;
tdstEngineObject *p_stEngine;
static char cFirst=0;
HIE_tdxHandleToSuperObject h_SupObject;
float fTransparenceLevel;
SNA_g_stFixInfo.ulNbObject = SNA_fn_vReadPointerFromGlobalPointersFile();
for(i=0;i<SNA_g_stFixInfo.ulNbObject;i++)
{
SNA_g_stFixInfo.a20_stObjects[i]=(tdstEngineObject*)SNA_fn_vReadPointerFromGlobalPointersFile();
if( fn_h_StandardGameGetSuperObject(SNA_g_stFixInfo.a20_stObjects[i]->h_StandardGame) !=NULL )
{
h_SupObject = (struct HIE_tdstSuperObject_ *)SNA_fn_vReadPointerFromGlobalPointersFile();
p_stEngine=M_GetEngineObject(h_SupObject);
fn_vStandardGameSetSuperObject(p_stEngine->h_StandardGame, h_SupObject );
SNA_g_stFixInfo.a20_stObjects[i]=p_stEngine;
p_stMatrix=fn_p_st3dDataGetMatrix(p_stEngine->h_3dData);
SNA_fn_vReadStructureFromGlobalPointersFile((unsigned long *)p_stMatrix,sizeof(POS_tdstCompletePosition));
HIE_fn_SO_vSetFlags(h_SupObject, (unsigned long)SNA_fn_vReadPointerFromGlobalPointersFile() );
SNA_fn_vReadStructureFromGlobalPointersFile( (unsigned long *)&fTransparenceLevel, sizeof(float) );
LST2_M_DynamicSetNextElement( h_SupObject, (HIE_tdxHandleToSuperObject)SNA_fn_vReadPointerFromGlobalPointersFile() );
LST2_M_DynamicSetPrevElement( h_SupObject, (HIE_tdxHandleToSuperObject)SNA_fn_vReadPointerFromGlobalPointersFile() );
LST2_M_DynamicSetFather( h_SupObject, (HIE_tdxHandleToSuperObject)SNA_fn_vReadPointerFromGlobalPointersFile() );
HIE_fn_vSetSuperObjectTransparenceLevel( h_SupObject, fTransparenceLevel );
if(cFirst==0)
{
p_stEngine->h_StandardGame->ucMiscFlags &= ~GAM_C_AllSecondPassDone;
}
else
{
/* Init dynam MS for perso in the fix (and not for always !)*/
if(M_GetMSHandle(h_SupObject,Dynam)!=NULL)
fn_vDynamInit(p_stEngine,OTI_WhenGameStart);
}
}
}
cFirst=1;
}
gp_stActualWorld=(HIE_tdxHandleToSuperObject)SNA_fn_vReadPointerFromGlobalPointersFile();
gp_stDynamicWorld=(HIE_tdxHandleToSuperObject)SNA_fn_vReadPointerFromGlobalPointersFile();
gp_stInactiveDynamicWorld=(HIE_tdxHandleToSuperObject)SNA_fn_vReadPointerFromGlobalPointersFile();
SECT_hFatherSector=(HIE_tdxHandleToSuperObject)SNA_fn_vReadPointerFromGlobalPointersFile();
g_hLoadedSuperObjectRoot = SECT_hFatherSector;
gs_hFirstSubMapPosition=(tdstSubMapPosition *)SNA_fn_vReadPointerFromGlobalPointersFile();
SNA_fn_vReadStructureFromGlobalPointersFile((unsigned long *)&g_stAlways,sizeof(tdstAlways));
LST2_M_DynamicSetFirstElement( &(g_stAlways.ALW_h_LstAlwaysModel), (ALW_tdxHandleToModelList)SNA_fn_vReadPointerFromGlobalPointersFile() );
LST2_M_DynamicSetLastElement( &(g_stAlways.ALW_h_LstAlwaysModel), (ALW_tdxHandleToModelList)SNA_fn_vReadPointerFromGlobalPointersFile() );
{
ALW_tdxHandleToModelList h_FirstAlwaysInLevel;
ALW_tdxHandleToModelList hCurrent, hNext;
/* The always list model is both in fix memory and level memory,*/
/* so we read the pointer that goes from fix to level...*/
h_FirstAlwaysInLevel = (ALW_tdxHandleToModelList)SNA_fn_vReadPointerFromGlobalPointersFile();
if( SNA_g_stFixInfo.h_LastAlwaysInTheFix != NULL )
{
LST2_M_DynamicSetNextElement( SNA_g_stFixInfo.h_LastAlwaysInTheFix, h_FirstAlwaysInLevel );
if( h_FirstAlwaysInLevel )
LST2_M_DynamicSetPrevElement( h_FirstAlwaysInLevel, SNA_g_stFixInfo.h_LastAlwaysInTheFix );
}
/* Validate the list to restore father link */
SNA_M_vValidateLst(&g_stAlways.ALW_h_LstAlwaysModel, (LST2_M_DynamicGetLastElement(&g_stAlways.ALW_h_LstAlwaysModel)), hCurrent, hNext);
}
{
tdhHandleToObjectTypeElement hElement;
hElement = (tdhHandleToObjectTypeElement) SNA_fn_vReadPointerFromGlobalPointersFile();
if( SNA_g_stFixInfo.hLastFamilyTypeInTheFix != NULL && hElement != NULL )
LST2_M_DynamicSetPrevElement( hElement, SNA_g_stFixInfo.hLastFamilyTypeInTheFix);
hElement = (tdhHandleToObjectTypeElement) SNA_fn_vReadPointerFromGlobalPointersFile();
if( SNA_g_stFixInfo.hLastModelTypeInTheFix != NULL && hElement != NULL )
LST2_M_DynamicSetPrevElement( hElement, SNA_g_stFixInfo.hLastModelTypeInTheFix);
hElement = (tdhHandleToObjectTypeElement) SNA_fn_vReadPointerFromGlobalPointersFile();
if( SNA_g_stFixInfo.hLastPersonalTypeInTheFix != NULL && hElement != NULL )
LST2_M_DynamicSetPrevElement( hElement, SNA_g_stFixInfo.hLastPersonalTypeInTheFix);
}
SNA_fn_vReadStructureFromGlobalPointersFile((unsigned long *)&g_stObjectTypes,sizeof(tdstObjectType));
/* Correct the list*/
{
tdhHandleToObjectTypeElement hCurrent,hNext,hLastElement;
hLastElement=LST2_M_DynamicGetLastElement(&g_stObjectTypes.hFamilyType);
SNA_M_vValidateLst(&g_stObjectTypes.hFamilyType, hLastElement, hCurrent, hNext);
hLastElement=LST2_M_DynamicGetLastElement(&g_stObjectTypes.hModelType);
SNA_M_vValidateLst(&g_stObjectTypes.hModelType, hLastElement, hCurrent, hNext);
hLastElement=LST2_M_DynamicGetLastElement(&g_stObjectTypes.hPersonalType);
SNA_M_vValidateLst(&g_stObjectTypes.hPersonalType, hLastElement, hCurrent, hNext);
}
/* save some values that should not be replaced when reading the whole structure from the file*/
hLevelNameList = g_stEngineStructure.hLevelNameList;
eLocalEngineMode = g_stEngineStructure.eEngineMode;
strcpy(szTrueFirstLevelNameInBin,g_stEngineStructure.szFirstLevelName);
strcpy(p_cDummy,g_stEngineStructure.szNextLevelName);
vDummy = g_stEngineStructure.hDrawSem;
wDummy = g_stEngineStructure.stEngineTimer.sTimerHandle;
ucDummyPrevLevel = g_stEngineStructure.ucPreviousLevel;
ucDummyExit = g_stEngineStructure.ucExitIdToQuitPrevLevel;
xDumpNear = ((GLI_tdstSpecificAttributesFor3D *)g_stEngineStructure.stFixViewportAttr.p_vSpecificToXD)->xNear;
memcpy( &stSaveTimer, &g_stEngineStructure.stEngineTimer, sizeof(tdstEngineTimerStructure) );
#ifndef RETAIL
memcpy( a_szLevelName, g_stEngineStructure.a_szLevelName, sizeof(a_szLevelName) );
ucNumberOfLevels = g_stEngineStructure.ucNumberOfLevels;
#endif
/* read the structure from the file*/
SNA_fn_vReadStructureFromGlobalPointersFile((unsigned long *)&g_stEngineStructure,sizeof(tdstEngineStructure));
/* restore the values that were changed when the structure was filled from the data file */
#ifndef RETAIL
memcpy( g_stEngineStructure.a_szLevelName, a_szLevelName, sizeof(a_szLevelName) );
g_stEngineStructure.ucNumberOfLevels = ucNumberOfLevels;
#endif
((GLI_tdstSpecificAttributesFor3D *)g_stEngineStructure.stFixViewportAttr.p_vSpecificToXD)->p_stCam = g_stEngineStructure.p_stFixCamera;
((GLI_tdstSpecificAttributesFor3D *)g_stEngineStructure.stFixViewportAttr.p_vSpecificToXD)->xNear = xDumpNear;
strcpy(g_stEngineStructure.szFirstLevelName,szTrueFirstLevelNameInBin);
strcpy(g_stEngineStructure.szNextLevelName,p_cDummy);
g_stEngineStructure.stEngineTimer.sTimerHandle=wDummy;
g_stEngineStructure.ucPreviousLevel = ucDummyPrevLevel;
g_stEngineStructure.ucExitIdToQuitPrevLevel = ucDummyExit;
g_stEngineStructure.hDrawSem=vDummy;
memcpy( &g_stEngineStructure.stEngineTimer, &stSaveTimer, sizeof(tdstEngineTimerStructure) );
g_stEngineStructure.hLevelNameList=hLevelNameList;
g_stEngineStructure.eEngineMode = eLocalEngineMode;
{
tdxHandleToFamilyList hCurrentFamily,hNextFamily,hLastElementFamily;
hLastElementFamily=LST2_M_DynamicGetLastElement(&g_stEngineStructure.hFamilyList);
SNA_M_vValidateLst(&g_stEngineStructure.hFamilyList, hLastElementFamily, hCurrentFamily, hNextFamily);
}
gp_stLight=(struct GLI_tdstLight_ *)SNA_fn_vReadPointerFromGlobalPointersFile();
hMainCharNode=(MC_tdxHandleToMainCharacterNode)SNA_fn_vReadPointerFromGlobalPointersFile();
LST2_M_DynamicSetFirstElement(&g_stEngineStructure.hMainCharacterList, hMainCharNode);
g_hCharacterLauchingSoundEvents=(HIE_tdxHandleToSuperObject)SNA_fn_vReadPointerFromGlobalPointersFile();
g_hShadowPolygonVisualMaterial=(ACP_tdxHandleOfMaterial)SNA_fn_vReadPointerFromGlobalPointersFile();
g_hShadowPolygonGameMaterialInit=(GMT_tdxHandleToGameMaterial)SNA_fn_vReadPointerFromGlobalPointersFile();
g_hShadowPolygonGameMaterial=(GMT_tdxHandleToGameMaterial)SNA_fn_vReadPointerFromGlobalPointersFile();
g_p_stTextureOfTextureShadow=(GLI_tdstTexture *)SNA_fn_vReadPointerFromGlobalPointersFile();
COL_g_d_lTaggedFacesTable = (long *)SNA_fn_vReadPointerFromGlobalPointersFile();
for (i=0;i<SHW_C_xNbMaxOfShadows;i++)
{
g_p_hHandleOfElementForShadow[i]=(ACP_tdxHandleOfElement)SNA_fn_vReadPointerFromGlobalPointersFile();
p_hHandleOfGeometricShadowObject[i]=(ACP_tdxHandleOfObject)SNA_fn_vReadPointerFromGlobalPointersFile();
}
g_hDemoSOList=(DEMO_tdxHandleToDemoSOList)SNA_fn_vReadPointerFromGlobalPointersFile();
g_hDemoGMTLevelList=(DEMO_tdxHandleToDemoGMTList)SNA_fn_vReadPointerFromGlobalPointersFile();
/* Retrieve stack infos for all stacks in anim player.*/
SNA_fn_vReadArrayWithoutPointerFromGlobalPointersFile( tdstStacks, eStackNbMax, sizeof(tdstStackInfos) );
{
/**
* Now, load the LEVEL part of each stack. (from reset position to end of the stack)
* Stacks are retrieved with SNA_fn_vReadArrayWithoutPointerFromGlobalPointersFile
* except the Event stack, witch uses SNA_fn_vReadArrayFromGlobalPointersFile
*/
unsigned long ulResetPos;
ulResetPos = tdstStacks[eStackA3dGENERAL].ulResetPos;
SNA_fn_vReadArrayWithoutPointerFromGlobalPointersFile( (p_stA3dGENERAL+ulResetPos), (tdstStacks[eStackA3dGENERAL].ulStackPos-ulResetPos), sizeof(tdstA3dGENERAL) );
ulResetPos = tdstStacks[eStackVertexes].ulResetPos;
SNA_fn_vReadArrayWithoutPointerFromGlobalPointersFile( (p_a3_xVectors+ulResetPos), (tdstStacks[eStackVertexes].ulStackPos-ulResetPos), sizeof(tdxVector3) );
ulResetPos = tdstStacks[eStackQuaternions].ulResetPos;
SNA_fn_vReadArrayWithoutPointerFromGlobalPointersFile( (p_a4_xQuaternions+ulResetPos), (tdstStacks[eStackQuaternions].ulStackPos-ulResetPos), sizeof(tdxSShortQuater4) );
ulResetPos = tdstStacks[eStackHierarchies].ulResetPos;
SNA_fn_vReadArrayWithoutPointerFromGlobalPointersFile( (p_stHierarchies+ulResetPos), (tdstStacks[eStackHierarchies].ulStackPos-ulResetPos), sizeof(tdstHierarchy) );
ulResetPos = tdstStacks[eStackNTTO].ulResetPos;
SNA_fn_vReadArrayWithoutPointerFromGlobalPointersFile( (p_stNTTO+ulResetPos), (tdstStacks[eStackNTTO].ulStackPos-ulResetPos), sizeof(tdstNTTO) );
ulResetPos = tdstStacks[eStackOnlyFrames].ulResetPos;
SNA_fn_vReadArrayWithoutPointerFromGlobalPointersFile( (p_stOnlyFrames+ulResetPos), (tdstStacks[eStackOnlyFrames].ulStackPos-ulResetPos), sizeof(tdstOnlyFrame) );
ulResetPos = tdstStacks[eStackChannels].ulResetPos;
SNA_fn_vReadArrayWithoutPointerFromGlobalPointersFile( (p_stChannels+ulResetPos), (tdstStacks[eStackChannels].ulStackPos-ulResetPos), sizeof(tdstChannel) );
ulResetPos = tdstStacks[eStackFrames].ulResetPos;
SNA_fn_vReadArrayWithoutPointerFromGlobalPointersFile( (p_stFrames+ulResetPos), (tdstStacks[eStackFrames].ulStackPos-ulResetPos), sizeof(tdstFrame) );
ulResetPos = tdstStacks[eStackFramesKF].ulResetPos;
SNA_fn_vReadArrayWithoutPointerFromGlobalPointersFile( (p_stFramesKF+ulResetPos), (tdstStacks[eStackFramesKF].ulStackPos-ulResetPos), sizeof(tdstFrameKF) );
ulResetPos = tdstStacks[eStackKeyFrames].ulResetPos;
SNA_fn_vReadArrayWithoutPointerFromGlobalPointersFile( (p_stKeyFrames+ulResetPos), (tdstStacks[eStackKeyFrames].ulStackPos-ulResetPos), sizeof(tdstKeyFrame) );
ulResetPos = tdstStacks[eStackEvents].ulResetPos;
SNA_fn_vReadArrayFromGlobalPointersFile( (p_stEvents+ulResetPos), (tdstStacks[eStackEvents].ulStackPos-ulResetPos), sizeof(tdstEvent) );
ulResetPos = tdstStacks[eStackMorphData].ulResetPos;
SNA_fn_vReadArrayWithoutPointerFromGlobalPointersFile( (p_stMorphData+ulResetPos), (tdstStacks[eStackMorphData].ulStackPos-ulResetPos), sizeof(tdstMorphData) );
} /* End of stack loading */
g_AlphabetCharacterPointer = (tdstEngineObject *)SNA_fn_vReadPointerFromGlobalPointersFile();
SNA_fn_vCloseGlobalPointersFile();
LST2_M_DynamicInitAnchor(&g_stEngineStructure.hCameraList);
SNA_M_vSetNextRelocationFileToLoad( ucIDOfLevelToLoad, SNA_C_ucTexturesRelocationTable );
GLI_vEndofGeometricLoad();
/* Take care of the progress bar*/
VIG_fn_vAddToProgressBar(1);
/* ANNECY OA - 12/07/99 { */
/* Load dummy datas : for protections */
SNA_M_LoadUnusedRelocationTable();
/* END ANNECY OA } */
SNA_M_vSetNextRelocationFileToLoad( ucIDOfLevelToLoad, SNA_C_ucSoundRelocationTable );
sprintf(szFileName,"%s\\%s\\%s.snd",fn_szGetLevelsDataPath(),fn_p_szGetLevelName(),fn_p_szGetLevelName());
SNA_fn_xReadOpenSoundTableFile(szFileName);
SNA_fn_vReadAndUpdateSoundPointers(szFileName);
/* ANNECY OA - 12/07/99 { */
/* Load dummy datas : for protections */
SNA_M_LoadUnusedRelocationTable();
/* END ANNECY OA } */
#ifdef D_USE_LIPSYNC
if (bLipsSynchPresent)
SNA_fn_vReadAndUpdateLipsSynchPointers();
#endif /* D_USE_LIPSYNC*/
/**** Init all object when the player enter the map ****/
SNA_fn_vSetLoadType(4);
#if (defined(USE_PROFILER) && !defined(PRESS_DEMO) && !defined(U64))
GAM_fn_vRasterDumpInit ();
#endif
/* ANNECY MT - 30/03/99 { PC Protection */
#ifndef U64
fn_vCopyProtectKeyToModels ();
#endif
/* END ANNECY MT } */
fn_vInitAllObjectsWhenMapJustLoaded();
/* Take care of the progress bar*/
VIG_fn_vAddToProgressBar(1);
CAM_fn_vInitCameras();
/* ANNECY OA - 16/07/99 { */
SNA_g_dwNumberOfRelocationTableLoaded = PTC_fn_lGetRandom();
/* END ANNECY OA } */
/* ANNECY MT - 28/06/99 { */
/* fn_vStartEngineClock(); */
/* END ANNECY MT } */
fn_vInitDeadLoop();
if ( g_stEngineStructure.eEngineMode==EM_ModeEnterLevel )
{
char cDoInit = 0;
if( fn_bLoadLevelSaveGameAfterLoadLevel() )
{
SAI_fn_bInitAllWhen(SAI_eInitWhenLevelGameSavedLoaded);
cDoInit = 1;
}
if( fn_bLoadPlayerSaveGameAfterLoadLevel() )
{
SAI_fn_bInitAllWhen(SAI_eInitWhenPlayerGameSavedLoaded);
cDoInit = 1;
}
if( cDoInit )
fn_vInitAllObjectsWhenSavedGameJustLoaded();
}
/*bart990105 :*/
if (fn_bIsEngineInPause())
fn_vChangeWindowTitle("Rayman II - pause");
else
fn_vChangeWindowTitle("Rayman II");
SNA_fn_vSetLoadType(SNA_LOAD_SNAPSHOT);
}
#ifndef RETAIL /* { */
else if (SNA_fn_ucGetLoadType()==SNA_SAVE_SNAPSHOT)
{
/* Binarization of a level*/
MC_tdxHandleToMainCharacterNode hMainCharNode;
unsigned long i;
SNA_fn_vSetSaveLoadLevel();
/* Write level.snd*/
sprintf(szFileName,"%s\\%s\\%s.snd",fn_szGetLevelsDataPath(),fn_p_szGetLevelName(),fn_p_szGetLevelName());
SNA_fn_xWriteOpenSoundTableFile(szFileName);
#ifdef D_USE_LIPSYNC
/* MR0912*/
sprintf(szFileName,"%s\\%s\\%s.lsy",fn_szGetLevelsDataPath(),fn_p_szGetLevelName(),fn_p_szGetLevelName());
SNA_fn_xWriteOpenLipsSynchTableFile(szFileName);
/* Version hybride*/
sprintf(szFileName,"%s\\%s\\%s.bls",fn_szGetLevelsDataPath(),fn_p_szGetLevelName(),fn_p_szGetLevelName());
fn_vOpenWriteLipsSynchroBloc(szFileName);
#endif /* D_USE_LIPSYNC*/
fn_vStandardInitLevelLoop();
GLI_vEndofGeometricLoad();
/* ANNECY OA - 04/08/99 { */
fn_vCopyChecksumToModels();
/* END ANNECY OA } */
/* Write level.sna*/
SNA_fn_vWriteAllMemoryBlocks(szLevelSnapshotFilename);
sprintf(szFileName,"%s\\%s\\%s.ptx",fn_szGetLevelsDataPath(),fn_p_szGetLevelName(),fn_p_szGetLevelName());
TEX_SetNameOfBinaryFile((unsigned char *)szFileName);
SNA_fn_vSetSaveLoadLevel();
/* Open level.gpt*/
sprintf(szFileName,"%s\\%s\\%s.gpt",fn_szGetLevelsDataPath(),fn_p_szGetLevelName(),fn_p_szGetLevelName());
SNA_fn_xWriteOpenGlobalPointersFile(szFileName);
/*//////*/
/* Save some global pointers and structures*/
/*//////*/
/* Save Position of perso in Fix*/
{
unsigned long i;
POS_tdstCompletePosition *p_stMatrix;
HIE_tdxHandleToSuperObject h_SupObject;
float fTransparenceLevel;
SNA_fn_vWritePointerInGlobalPointersFile((unsigned long) SNA_g_stFixInfo.ulNbObject);
for(i=0;i<SNA_g_stFixInfo.ulNbObject;i++)
{
SNA_fn_vWritePointerInGlobalPointersFile((unsigned long) SNA_g_stFixInfo.a20_stObjects[i]);
if(!fn_ucIsAnAlwaysModel(SNA_g_stFixInfo.a20_stObjects[i]))
{
h_SupObject = fn_h_StandardGameGetSuperObject(SNA_g_stFixInfo.a20_stObjects[i]->h_StandardGame);
SNA_fn_vWritePointerInGlobalPointersFile((unsigned long)h_SupObject);
fTransparenceLevel = HIE_fn_fGetSuperObjectTransparenceLevel( h_SupObject );
p_stMatrix=fn_p_st3dDataGetMatrix(SNA_g_stFixInfo.a20_stObjects[i]->h_3dData);
SNA_fn_vWriteStructureInGlobalPointersFile((unsigned long *)p_stMatrix,sizeof(POS_tdstCompletePosition ));
SNA_fn_vWritePointerInGlobalPointersFile( HIE_fn_SO_ulGetFlags(h_SupObject) );
SNA_fn_vWriteStructureInGlobalPointersFile( &fTransparenceLevel, sizeof(float) );
SNA_fn_vWritePointerInGlobalPointersFile( (unsigned long)LST2_M_DynamicGetNextElement( h_SupObject ) );
SNA_fn_vWritePointerInGlobalPointersFile( (unsigned long)LST2_M_DynamicGetPrevElement( h_SupObject ) );
SNA_fn_vWritePointerInGlobalPointersFile( (unsigned long)LST2_M_DynamicGetFather( h_SupObject ) );
}
}
}
SNA_fn_vWritePointerInGlobalPointersFile((unsigned long) gp_stActualWorld);
SNA_fn_vWritePointerInGlobalPointersFile((unsigned long) gp_stDynamicWorld);
SNA_fn_vWritePointerInGlobalPointersFile((unsigned long) gp_stInactiveDynamicWorld);
SNA_fn_vWritePointerInGlobalPointersFile((unsigned long) SECT_hFatherSector);
SNA_fn_vWritePointerInGlobalPointersFile((unsigned long) gs_hFirstSubMapPosition);
/* Always */
/* Write global structure*/
SNA_fn_vWriteStructureInGlobalPointersFile(&g_stAlways,sizeof(tdstAlways));
SNA_fn_vWritePointerInGlobalPointersFile((unsigned long)HIE_M_hFirstChild( &(g_stAlways.ALW_h_LstAlwaysModel)));
SNA_fn_vWritePointerInGlobalPointersFile((unsigned long)HIE_M_hLastChild( &(g_stAlways.ALW_h_LstAlwaysModel)));
/* The always list model is both in fix memory and level memory,*/
/* so we save the pointer that goes from fix to level...*/
if( SNA_g_stFixInfo.h_LastAlwaysInTheFix != NULL )
{
SNA_fn_vWritePointerInGlobalPointersFile( (unsigned long) LST2_M_DynamicGetNextElement( SNA_g_stFixInfo.h_LastAlwaysInTheFix ));
}
else
{
SNA_fn_vWritePointerInGlobalPointersFile( (unsigned long) NULL );
}
if( SNA_g_stFixInfo.hLastFamilyTypeInTheFix != NULL )
SNA_fn_vWritePointerInGlobalPointersFile( (unsigned long) LST2_M_DynamicGetNextElement( SNA_g_stFixInfo.hLastFamilyTypeInTheFix ));
else
SNA_fn_vWritePointerInGlobalPointersFile( (unsigned long) NULL );
if( SNA_g_stFixInfo.hLastModelTypeInTheFix != NULL )
SNA_fn_vWritePointerInGlobalPointersFile( (unsigned long) LST2_M_DynamicGetNextElement( SNA_g_stFixInfo.hLastModelTypeInTheFix ));
else
SNA_fn_vWritePointerInGlobalPointersFile( (unsigned long) NULL );
if( SNA_g_stFixInfo.hLastPersonalTypeInTheFix != NULL )
SNA_fn_vWritePointerInGlobalPointersFile( (unsigned long) LST2_M_DynamicGetNextElement( SNA_g_stFixInfo.hLastPersonalTypeInTheFix ));
else
SNA_fn_vWritePointerInGlobalPointersFile( (unsigned long) NULL );
SNA_fn_vWriteStructureInGlobalPointersFile(&g_stObjectTypes,sizeof(tdstObjectType));
SNA_fn_vWriteStructureInGlobalPointersFile(&g_stEngineStructure,sizeof(tdstEngineStructure));
SNA_fn_vWritePointerInGlobalPointersFile((unsigned long) gp_stLight);
hMainCharNode=LST2_M_DynamicGetFirstElement(&g_stEngineStructure.hMainCharacterList);
SNA_fn_vWritePointerInGlobalPointersFile((unsigned long) hMainCharNode);
SNA_fn_vWritePointerInGlobalPointersFile((unsigned long) g_hCharacterLauchingSoundEvents);
SNA_fn_vWritePointerInGlobalPointersFile((unsigned long) g_hShadowPolygonVisualMaterial);
SNA_fn_vWritePointerInGlobalPointersFile((unsigned long) g_hShadowPolygonGameMaterialInit);
SNA_fn_vWritePointerInGlobalPointersFile((unsigned long) g_hShadowPolygonGameMaterial);
SNA_fn_vWritePointerInGlobalPointersFile((unsigned long) g_p_stTextureOfTextureShadow);
SNA_fn_vWritePointerInGlobalPointersFile((unsigned long) COL_g_d_lTaggedFacesTable);
for (i=0;i<SHW_C_xNbMaxOfShadows;i++)
{
SNA_fn_vWritePointerInGlobalPointersFile((unsigned long) g_p_hHandleOfElementForShadow[i]);
SNA_fn_vWritePointerInGlobalPointersFile((unsigned long) p_hHandleOfGeometricShadowObject[i]);
}
SNA_fn_vWritePointerInGlobalPointersFile((unsigned long) g_hDemoSOList);
SNA_fn_vWritePointerInGlobalPointersFile((unsigned long) g_hDemoGMTLevelList);
/* Save stack infos for all stacks in anim player.*/
SNA_fn_vWriteArrayWithoutPointerInGlobalPointersFile( tdstStacks, eStackNbMax, sizeof(tdstStackInfos) );
{
/**
* Now, save the LEVEL part of each stack. (from reset position to end of the stack)
*
* Most of these stacks are just datas (no pointer).
* BUT :
* - They contains datas for both Fix and Level.
* - They are located in a block of the Fix
* - We need to save their "Level part" in the Level.
* So they are saved in the global pointer file...
*
* All the stacks are saved using SNA_fn_vWriteArrayWithoutPointerInGlobalPointersFile,
* except the one for Events that is saved using SNA_fn_vWriteArrayInGlobalPointersFile.
*/
unsigned long ulResetPos;
ulResetPos = tdstStacks[eStackA3dGENERAL].ulResetPos;
SNA_fn_vWriteArrayWithoutPointerInGlobalPointersFile( p_stA3dGENERAL+ulResetPos, (tdstStacks[eStackA3dGENERAL].ulStackPos-ulResetPos), sizeof(tdstA3dGENERAL) );
ulResetPos = tdstStacks[eStackVertexes].ulResetPos;
SNA_fn_vWriteArrayWithoutPointerInGlobalPointersFile( p_a3_xVectors+ulResetPos, (tdstStacks[eStackVertexes].ulStackPos-ulResetPos), sizeof(tdxVector3) );
ulResetPos = tdstStacks[eStackQuaternions].ulResetPos;
SNA_fn_vWriteArrayWithoutPointerInGlobalPointersFile( p_a4_xQuaternions+ulResetPos, (tdstStacks[eStackQuaternions].ulStackPos-ulResetPos), sizeof(tdxSShortQuater4) );
ulResetPos = tdstStacks[eStackHierarchies].ulResetPos;
SNA_fn_vWriteArrayWithoutPointerInGlobalPointersFile( p_stHierarchies+ulResetPos, (tdstStacks[eStackHierarchies].ulStackPos-ulResetPos), sizeof(tdstHierarchy) );
ulResetPos = tdstStacks[eStackNTTO].ulResetPos;
SNA_fn_vWriteArrayWithoutPointerInGlobalPointersFile( p_stNTTO+ulResetPos, (tdstStacks[eStackNTTO].ulStackPos-ulResetPos), sizeof(tdstNTTO) );
ulResetPos = tdstStacks[eStackOnlyFrames].ulResetPos;
SNA_fn_vWriteArrayWithoutPointerInGlobalPointersFile( p_stOnlyFrames+ulResetPos, (tdstStacks[eStackOnlyFrames].ulStackPos-ulResetPos), sizeof(tdstOnlyFrame) );
ulResetPos = tdstStacks[eStackChannels].ulResetPos;
SNA_fn_vWriteArrayWithoutPointerInGlobalPointersFile( p_stChannels+ulResetPos, (tdstStacks[eStackChannels].ulStackPos-ulResetPos), sizeof(tdstChannel) );
ulResetPos = tdstStacks[eStackFrames].ulResetPos;
SNA_fn_vWriteArrayWithoutPointerInGlobalPointersFile( p_stFrames+ulResetPos, (tdstStacks[eStackFrames].ulStackPos-ulResetPos), sizeof(tdstFrame) );
ulResetPos = tdstStacks[eStackFramesKF].ulResetPos;
SNA_fn_vWriteArrayWithoutPointerInGlobalPointersFile( p_stFramesKF+ulResetPos, (tdstStacks[eStackFramesKF].ulStackPos-ulResetPos), sizeof(tdstFrameKF) );
ulResetPos = tdstStacks[eStackKeyFrames].ulResetPos;
SNA_fn_vWriteArrayWithoutPointerInGlobalPointersFile( p_stKeyFrames+ulResetPos, (tdstStacks[eStackKeyFrames].ulStackPos-ulResetPos), sizeof(tdstKeyFrame) );
ulResetPos = tdstStacks[eStackEvents].ulResetPos;
SNA_fn_vWriteArrayInGlobalPointersFile( p_stEvents+ulResetPos, (tdstStacks[eStackEvents].ulStackPos-ulResetPos), sizeof(tdstEvent) );
ulResetPos = tdstStacks[eStackMorphData].ulResetPos;
SNA_fn_vWriteArrayWithoutPointerInGlobalPointersFile( p_stMorphData+ulResetPos, (tdstStacks[eStackMorphData].ulStackPos-ulResetPos), sizeof(tdstMorphData) );
} /* End of stack save */
SNA_fn_vWritePointerInGlobalPointersFile( (unsigned long)g_AlphabetCharacterPointer);
SNA_fn_vCloseSoundTableFile();
#ifdef D_USE_LIPSYNC
SNA_fn_vCloseLipsSynchTableFile();
fn_vCloseWriteLipsSynchroBloc();
#endif /* D_USE_LIPSYNC*/
SNA_fn_vCloseGlobalPointersFile();
}
#endif /* RETAIL } */
}
#ifndef U64
#ifndef ACTIVE_EDITOR
if (g_bDumpMemory)
MMG_fn_vDumpMemory();
#ifdef _DEBUG
if (g_bDreamcast)
MDS_fn_vGenerateDCData(0, 1);
#endif /* _DEBUG */
#endif /* ACTIVE_EDITOR */
#endif /* U64 */
if
(
g_stEngineStructure.eEngineMode==EM_ModeEnterLevel ||
g_stEngineStructure.eEngineMode==EM_ModeEnterGame
)
{
if( g_bBeginMapSoundEventFlag )
{
GAM_fn_lSaveBlockEventSlotMemory(g_stBeginMapSoundEvent.pstPtr,0);
SND_fn_lSendRequestSound(SND_C_OBJET_FANTOME,g_lSoundObjectTypeMusic,g_stBeginMapSoundEvent,0,NULL);
}
}
InitArrayOfDynamicFunction ( g_a_pfnDynamicFunction );
IPT_fn_vResetInputEntry();
PLA_fn_vInitHeaps();
bFirst=FALSE;
{
char szFileName[_MAX_PATH];
fn_zsGetActualLevelFilename(szFileName,VIG_C_ScriptPgbSuffixe);
VIG_fn_vSaveProgressBarLevelInfo(&VIG_g_stActualVignette,szFileName);
VIG_fn_vAddToProgressBar(1);
VIG_fn_vRefreshActualVignette();
VIG_fn_vFreeVignette(&VIG_g_stActualVignette);
}
/*
* initialisation variable pour WaterPlane + sinus effect + global fog
*/
GLI_cGlobalFogIsOn = 0;
GLI_vInitWaterplaneModule();
#ifndef U64
#ifndef RETAIL /* { */
/* set mirror flag only in script*/
if( SNA_fn_ucGetLoadType() != SNA_LOAD_SNAPSHOT )
SCT_fn_vInitMirrorFlagForAllSectors(SECT_hFatherSector);
#endif /* RETAIL } */
#endif
/*
* when this is not the first level we loaded, some IPT actions might have been deactivated by the AIs of
* instances in the previous level -> we have to restore them.
*/
IPT_fn_vActivateAllEntryElements ( ) ;
/* make sure that no button that the player keeps pressed right now will be marked as "Just Pressed" */
IPT_fn_vReadInput ( ) ;
IPT_fn_vReadInput ( ) ;
g_hSOCurrentMainSector = NULL;
g_hSOPreviousMainSector = NULL;
AGO_vInit() ;
/* once the level is loaded, the language definitions are known, hance we can select the current language from the ubi.ini file */
{
char szBuffer [ _MAX_PATH ] ;
int j ;
szBuffer [ 0 ] = 0 ;
GAM_fn_vReadStringInUbiIniFile ( "RAYMAN2" , "Language" , _MAX_PATH, szBuffer ) ;
j = 0 ;
g_stEngineStructure . ucCurrentLanguage = 0 ;
while ( j < g_stEngineStructure . ucNbLanguages )
{
if ( stricmp ( szBuffer , g_stEngineStructure . p_stLanguageTable [ j ] . szLanguageCode ) == 0 )
{
g_stEngineStructure . ucCurrentLanguage = ( unsigned char ) j ;
break ;
}
j ++ ;
}
}
}
/*-----------------------------------------------------------------------------
* Description : It is the desinitialization of the engine when map just ended
*-----------------------------------------------------------------------------
* Input :
* Output :
*-----------------------------------------------------------------------------
* Creation date : 27/08/96 Author : Francois
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications : 03/04/98 Carlos Torres RAZ g_hLoadedSuperObjectRoot
* Modifications :
*---------------------------------------------------------------------------*/
extern void fn_vLastDeinitMorphTaskList();
extern void GAM_fn_vRasterDumpDesInit ();
void fn_vDesInitLevelLoop()
{
/**** Initialize the Dead loop members ****/
fn_vDesInitDeadLoop();
/**** Stop the timer ****/
fn_vStopEngineClock();
SPO_ReinitSuperimposedArray();
/**** Kill all level always ****/
fn_vKillAllAlwaysModel();
fn_vLastDesinitAlwaysStructure();
MGT_fn_vLastDesInitMagnet();
PRF_fn_vReinitAllChrono ();
/* Stop the music:*/
SND_fn_vKillObjectSound2(SND_C_OBJET_FANTOME,g_lSoundObjectTypeMusic);
/* Reinit Doppler effect*/
SND_fn_vSetDopplerFactorSound(SND_C_NO_DOPPLER);
/**** Desinit all object's type structure ****/
#ifndef RETAIL /* { */
if (SNA_fn_ucGetLoadType()==SNA_LOAD_SCRIPT)
fn_vFreeAllObjectTypeForPriority(E_ucGameLevelMemory);
#endif /* RETAIL } */
fn_vDesinitFamilyStructureForPriority(E_ucGameLevelMemory);
/**** Free all super engine's objects ****/
fn_vDestroyAllHierarchy(gp_stActualWorld);
/* Erase the MorphList array. */
/* Have to do do it AFTER char desinit that can free some elements of the array.*/
fn_vLastDeinitMorphTaskList();
g_hLoadedSuperObjectRoot=NULL;
SND_fn_vKillAllObjectSound();
#ifndef U64
DEMO_fn_vDesInitLevel ();
#endif
/**** Free and delete non fixed memory*/
fn_vRemoveAllMicros();
fn_vFreeLevelAllowedMemory();
fn_vDeleteAllLevelReUsableSections();
LST2_M_DynamicInitAnchor(&g_stEngineStructure.hCameraList);
LST2_M_DynamicInitAnchor(&g_stEngineStructure.hMainCharacterList);
LST2_M_DynamicInitAnchor(&g_stEngineStructure.hAlwaysActiveCharactersList);
fn_vReputGameViewportCamera();
/* GuS : We don't use FixLvl pointers anymore...
if(SNA_fn_ucGetLoadType()==SNA_LOAD_SNAPSHOT)
{
SNA_fn_bDelocateMemoryBlocks();
}
*/
#if (defined(USE_PROFILER) && !defined(PRESS_DEMO) && !defined(U64))
GAM_fn_vRasterDumpDesInit ();
#endif
}
void fn_vDesinitEngineWhenLeaveApplication(void)
{
Mmg_fn_vStopMmgModule();
MMG_fn_vDesinitMemoryRasterDeclaration ();
}
/* ANNECY MT - 30/03/99 { Pc Protection */
void fn_vInitAlwaysModelToProtection(long _lType)
{
#if !defined(PRESS_DEMO)
unsigned long i;
ALW_tdxHandleToModelList h_AlwaysModelChild;
/* ANNECY OA - 04/08/99 { */
HIE_tdxHandleToSuperObject hCharacter;
/* END ANNECY OA } */
LST2_M_DynamicForEachElementOf(&(g_stAlways.ALW_h_LstAlwaysModel),h_AlwaysModelChild,i)
{
tdstEngineObject *p_stObject = h_AlwaysModelChild->p_stAlwaysObject;
MS_tdxHandleToStandardGame h_StdGame = p_stObject -> h_StandardGame;
if (h_StdGame && (h_StdGame -> ulCustomBits & GAM_C_CustBitProtection))
{
AI_tdstMind *p_stMind;
MS_tdxHandleToBrain h_Brain;
static char cFastC = 1;
struct AI_tdstAIModel_ *p_stAIModel;
if((h_Brain = p_stObject -> h_Brain) == NULL )
continue;
if((p_stMind = M_pstGetMindOfBrain(h_Brain)) == NULL)
continue;
p_stAIModel = p_stMind->p_stAIModel;
/* ANNECY OA - 22/07/99 { */
// if (p_stAIModel -> CFast_lFunction >= 0) // ASK: ???
{
if (_lType == 0)
{
/* init values after binary loading */
fn_vInitDesignerVariablesWithProtectKeyInModel (p_stMind);
fn_vInitDesignerVariablesWithComputedDatas (p_stMind);
}
#if defined(PTC_SYSTEM_ACTIVED) && !defined(RETAIL)
else if (_lType == 1)
{
/* init values after script loading */
fn_vInitDesignerVariablesWithChecksumInModel (p_stObject, p_stMind);
fn_vInitDesignerVariablesWithCode (p_stObject, p_stMind);
}
#endif /* PTC_SYSTEM_ACTIVED && !RETAIL */
/* END ANNECY OA } */
}
// p_stAIModel -> CFast_lFunction = -1;
}
}
/* ANNECY OA - 30/07/99 { */
HIE_M_ForEachChildOf(gp_stDynamicWorld,hCharacter,i)
{
tdstEngineObject *p_stObject = (tdstEngineObject *)HIE_fn_hGetSuperObjectObject(hCharacter);
MS_tdxHandleToStandardGame h_StdGame = p_stObject -> h_StandardGame;
if (h_StdGame && (h_StdGame -> ulCustomBits & GAM_C_CustBitProtection))
{
AI_tdstMind *p_stMind;
MS_tdxHandleToBrain h_Brain;
static char cFastC = 1;
struct AI_tdstAIModel_ *p_stAIModel;
if((h_Brain = p_stObject -> h_Brain) == NULL )
continue;
if((p_stMind = M_pstGetMindOfBrain(h_Brain)) == NULL)
continue;
p_stAIModel = p_stMind->p_stAIModel;
{
if (_lType == 0)
{
/* Init values after binary loading */
fn_vInitDesignerVariablesWithProtectKeyInModel (p_stMind);
fn_vInitDesignerVariablesWithComputedDatas (p_stMind);
}
#if defined(PTC_SYSTEM_ACTIVED) && !defined(RETAIL)
else if (_lType == 1)
{
/* Init values after script loading */
fn_vInitDesignerVariablesWithChecksumInModel (p_stObject, p_stMind);
fn_vInitDesignerVariablesWithCode (p_stObject, p_stMind);
}
#endif /* PTC_SYSTEM_ACTIVED && !RETAIL */
}
}
}
/* END ANNECY OA } */
#endif /* PRESS_DEMO */
}
void fn_vCopyProtectKeyToModels()
{
#if !defined(PRESS_DEMO)
DWORD i;
/* ANNECY OA - 04/08/99 { */
// if (SNA_fn_bBigFileUsed ())
/* END ANNECY OA } */
{
fn_vInitAlwaysModelToProtection (0);
}
/* ANNECY OA - 16/07/99 { */
for(i = 0; i < SNA_g_dwNumberOfRelocationTableLoaded; ++i)
{
SNA_g_a_dwInitKeyRelocationTableLoaded[i] = PTC_fn_lGetRandom();
SNA_g_a_dwProtectKeyRelocationTableLoaded[i] = PTC_fn_lGetRandom();
}
/* END ANNECY OA } */
#endif /* PRESS_DEMO */
}
void fn_vCopyChecksumToModels()
{
#if !defined(PRESS_DEMO)
fn_vInitAlwaysModelToProtection (1);
#endif /* PRESS_DEMO */
}
/* END ANNECY MT } */