#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;ih_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;ih_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 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 } */