/*========================================================================= * Objinit.c : Initialize all object's models. * This is a part of the Game project. * * Version 1.0 * Creation date 09/08/96 * Revision date * * That file needs to be compatible for all platforms. * * (c) Ubi Studios 1996 *=======================================================================*/ #include #define D_State_Define #include "ToolsCPA.h" #include "Options/Options.h" #include "Macros.h" #include "Actions/AllActs.h" #include "Structur/Objects.h" #include "Structur/EngMode.h" #include "Structur/ErrGame.h" #include "Structur/MemGame.h" #include "Structur/StdObjSt.h" #include "Always.h" #include "Basic.h" #include "Family.h" #include "GameEng.h" #include "InitEng.h" #include "MainChar.h" #include "Micros.h" #include "ObjInit.h" #include "PlayAnim/PlayAnim.h" #include "ObjType.h" #include "ZeMem.h" #include "Toolcam.h" #include "Structur/state.h" #ifdef GAM_USE_SNA #include "sna\snaglob.h" #endif /* GAM_USE_SNA */ #if defined (ACTIVE_EDITOR) || defined (RETAIL) #define ENGassert(param) #else #define ENGassert(param) assert(param) #endif /*----------------------------------------------------------------------------- * Description : Free a world hierarchy *----------------------------------------------------------------------------- * Input : Super Object * Output : Void *----------------------------------------------------------------------------- * Creation date : 12/11/96 Author : Francois *----------------------------------------------------------------------------- * Modification date : Modification Author : * Modifications : *---------------------------------------------------------------------------*/ extern ACP_tdxBool fn_bIsInFix(struct tdstEngineObject_ *p_stObject); void fn_vDestroyAllHierarchy(HIE_tdxHandleToSuperObject p_stSuperObject) { HIE_tdxHandleToSuperObject p_stChild,p_stNextChild; long i; HIE_M_ForEachMovingChildOf(p_stSuperObject,p_stChild,p_stNextChild,i) { fn_vDestroyAllHierarchy(p_stChild); } HIE_fn_vIsolate(p_stSuperObject); #ifdef U64 if ( (HIE_fn_ulGetSuperObjectType(p_stSuperObject) == HIE_C_ulActor) && !fn_ucIsAnAlwaysObject(M_GetEngineObject(p_stSuperObject)) ) { /* desinit*/ fn_vDesinitOneObject(M_GetEngineObject(p_stSuperObject),OTI_MapLoaded); } #else #if defined(GAM_USE_SNA) switch(HIE_fn_ulGetSuperObjectType(p_stSuperObject)) { case HIE_C_ulActor: if ( !fn_ucIsAnAlwaysObject(M_GetEngineObject(p_stSuperObject)) ) { /* We desinit the object*/ /* - if it is in the fix because fix objects must not be deleted*/ /* - if we load snapshot because in this case there is no need to delete it*/ if ( fn_bIsInFix(M_GetEngineObject(p_stSuperObject)) || SNA_fn_ucGetLoadType() == SNA_LOAD_SNAPSHOT) { /* desinit*/ fn_vDesinitOneObject(M_GetEngineObject(p_stSuperObject),OTI_MapLoaded); } else { fn_p_stFreeEngineSuperObject(p_stSuperObject); } } break; } #endif /* GAM_USE_SNA */ #endif /* U64*/ } /*----------------------------------------------------------------------------- * Description : *----------------------------------------------------------------------------- * Input : * Output : *----------------------------------------------------------------------------- * Creation date : 25/06/98 Author : Marc *----------------------------------------------------------------------------- * Modification date : Modification Author : * Modifications : *---------------------------------------------------------------------------*/ #ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */ void fn_vDestroyAllTheWorld() { fn_vDestroyAllHierarchy(gp_stDynamicWorld); fn_vDestroyAllHierarchy(gp_stInactiveDynamicWorld); } #endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */ /*----------------------------------------------------------------------------- * Description : Free a Character's SuperObject *----------------------------------------------------------------------------- * Input : Pointer to the super object * Output : Pointer to the super object (NULL if OK) *----------------------------------------------------------------------------- * Creation date : 15/10/96 Author : Francois *----------------------------------------------------------------------------- * Modification date : Modification Author : * Modifications : *---------------------------------------------------------------------------*/ #ifndef _FIRE_DEADCODE_U64_ HIE_tdxHandleToSuperObject fn_p_stFreeEngineSuperObject(HIE_tdxHandleToSuperObject p_stSuperObject) { tdstEngineObject *p_stEngineObject; long lSuperObjectType; p_stEngineObject = (struct tdstEngineObject_ *)HIE_fn_hGetSuperObjectObject(p_stSuperObject); lSuperObjectType = HIE_fn_ulGetSuperObjectType(p_stSuperObject); if (lSuperObjectType==HIE_C_ulActor) { fn_p_stFreeEngineObject(p_stEngineObject); HIE_fn_vDestroySuperObject(p_stSuperObject); } else M_GameWarningError(E_uwGameFreeEngineSuperObjectNoCharacter); return(p_stSuperObject); } #endif /* _FIRE_DEADCODE_U64_ */ /*----------------------------------------------------------------------------- * Description : Free a engine object *----------------------------------------------------------------------------- * Input : Pointer to the object * Output : Pointer of the object (NULL if succes) *----------------------------------------------------------------------------- * Creation date : 09/10/96 Author : Francois *----------------------------------------------------------------------------- * Modification date : Modification Author : * Modifications : *---------------------------------------------------------------------------*/ #ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */ struct tdstEngineObject_ *fn_p_stFreeEngineObject(struct tdstEngineObject_ *p_stTempObject) { long i; for(i=(sizeof(tdstEngineObject)/sizeof(void*))-1;i>=0;i--) { if (M_VoidMiniStructurePointer(p_stTempObject,i)!=NULL) /* M_ForAllMiniStructureExceptNULL(p_stTempObject,i)*/ { g_a_stStructureHandleFunction[i].p_fn_vFreeFunction(p_stTempObject); } } MMG_fn_vAddMemoryInfo( MMG_C_lTypeGAM , MMG_C_lSubTypeEngineObject , 0 ); M_GameFreeInHLM(p_stTempObject); return(p_stTempObject); } #endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */ /*----------------------------------------------------------------------------- * Description : Initialisation of an object *----------------------------------------------------------------------------- * Input : object structure pointer * Output : None *----------------------------------------------------------------------------- * Creation date : 28/02/96 Author : Francois *----------------------------------------------------------------------------- * Modification date : Modification Author : * Modifications : *---------------------------------------------------------------------------*/ void fn_vInitOneObject(struct tdstEngineObject_ *p_stObject,enum tdeObjectTreeInit_ eObjIniType) { long i; if (p_stObject->h_3dData==NULL||p_stObject->h_StandardGame==NULL) M_GameFatalError(E_uwGameInitDesinitOneObjectNullPointer); if (M_ObjectGetFamilyType(p_stObject)==C_InvalidObjectType) M_GameInformationError(E_uwGameInitOneObjectInvalidObject); M_ForAllMiniStructureExceptNULL(p_stObject,i) { g_a_stStructureHandleFunction[i].p_fn_vInitFunction(p_stObject,eObjIniType); } if (eObjIniType==OTI_MapLoaded) fn_vAllSecondPassAreDone(p_stObject->h_StandardGame); } /*----------------------------------------------------------------------------- * Description : Desinitialisation of an object *----------------------------------------------------------------------------- * Input : object structure pointer * Output : None *----------------------------------------------------------------------------- * Creation date : 28/02/96 Author : Francois *----------------------------------------------------------------------------- * Modification date : Modification Author : * Modifications : *---------------------------------------------------------------------------*/ void fn_vDesinitOneObject(struct tdstEngineObject_ *p_stObject,enum tdeObjectTreeInit_ eObjIniType) { long i; if (p_stObject->h_3dData==NULL||p_stObject->h_StandardGame==NULL) M_GameFatalError(E_uwGameInitDesinitOneObjectNullPointer); if (M_ObjectGetFamilyType(p_stObject)==C_InvalidObjectType) M_GameInformationError(E_uwGameInitOneObjectInvalidObject); M_ForAllMiniStructureExceptNULL(p_stObject,i) { g_a_stStructureHandleFunction[i].p_fn_vDesinitFunction(p_stObject,eObjIniType); } } void fn_vForceActiveAnObject(struct tdstEngineObject_ *p_stObject) { struct MTH3D_tdstVector_ hPosition; POS_tdstCompletePosition *hMatrix; HIE_tdxHandleToSuperObject hFather; hFather = HIE_fn_hGetSuperObjectFather( M_GetSuperObject(p_stObject) ); if( hFather == gp_stInactiveDynamicWorld ) { if( fn_ucStandardGameGetPlatFormType(M_GetMSHandle(M_GetSuperObject(p_stObject),StandardGame))!=0 ) { HIE_fn_vSuperObjectAddHead(gp_stDynamicWorld,M_GetSuperObject(p_stObject)); } else { HIE_fn_vSuperObjectAddTail(gp_stDynamicWorld,M_GetSuperObject(p_stObject)); } } M_CheckPointer(HIE_fn_hGetSuperObjectFather(M_GetSuperObject(p_stObject))); hMatrix = HIE_fn_hGetSuperObjectGlobalMatrix( HIE_fn_hGetSuperObjectFather( M_GetSuperObject(p_stObject) ) ); POS_fn_vGetTranslationVector( HIE_fn_hGetSuperObjectMatrix(M_GetSuperObject(p_stObject)) ,&hPosition); POS_fn_vMulMatrixVertex( &hPosition, hMatrix, &hPosition ); fn_vSectInfoInitForSingleCharacter(M_GetSuperObject(p_stObject),&hPosition); fn_vStandardGameSetIsActivable(p_stObject->h_StandardGame,1); M_ActivateObject(p_stObject); /* if (fn_ul3dDataGetTimeDelay(p_stObject->h_3dData))*/ { /*fn_v3dDataSetStartTime(p_stObject->h_3dData,g_stEngineStructure.stEngineTimer.ulCurrentTimerCount-fn_ul3dDataGetTimeDelay(p_stObject->h_3dData)+fn_ul3dDataGetStartTime(p_stObject->h_3dData));*/ fn_v3dDataSetStartTime(p_stObject->h_3dData,g_stEngineStructure.stEngineTimer.ulCurrentTimerCount); fn_v3dDataSetTimePreviousFrame(p_stObject->h_3dData,g_stEngineStructure.stEngineTimer.ulCurrentTimerCount); } /* reactive an object, so create its element3d array if necessary*/ if (fn_p_st3dDataGetCurrentFrame(p_stObject->h_3dData)->p_stArrayOfElts3d == NULL) { tdstAnim3d * p_stCurrentAnim; ENGassert(fn_h3dDataGetCurrentState(p_stObject->h_3dData) != NULL); if (fn_h3dDataGetCurrentState(p_stObject->h_3dData)) { p_stCurrentAnim = fn_h3dDataGetCurrentState(p_stObject->h_3dData)->p_stAnim; if (p_stCurrentAnim) { /* ANNECY MT - 22/09/98 {*/ /*MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeAnimation , p_stObject->h_3dData->h_Family);*/ /*fn_p_st3dDataGetCurrentFrame(p_stObject->h_3dData)->p_stArrayOfElts3d = (tdstElement3d*)TMP_M_p_Malloc(sizeof(tdstElement3d) * p_stCurrentAnim->ucMaxNumberOfElements);*/ fn_p_st3dDataGetCurrentFrame(p_stObject->h_3dData)->p_stAnim = NULL; /*memset(fn_p_st3dDataGetCurrentFrame(p_stObject->h_3dData)->p_stArrayOfElts3d,0,sizeof(tdstElement3d) * p_stCurrentAnim->ucMaxNumberOfElements);*/ fn_vAllocArrayOfElts3d (p_stObject -> h_3dData , p_stCurrentAnim->ucMaxNumberOfElements); /* END ANNECY MT }*/ } } /* reinit anim reference to force interpolation to re-create frame*/ fn_p_st3dDataGetCurrentFrame(p_stObject->h_3dData)->p_stAnim = NULL; } } #ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */ void fn_vActiveAnObject(struct tdstEngineObject_ *p_stObject) { if (!fn_bf1StandardGameGetIsDesactivateAtAll(p_stObject->h_StandardGame)) { fn_vForceActiveAnObject(p_stObject); } } #endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */ void fn_vDesactiveAnObject(struct tdstEngineObject_ *p_stObject) { PLA_fn_vDesInitAllChildOfCharacter(M_GetSuperObject(p_stObject),p_stObject); SND_fn_vKillObjectSound2((long)M_GetSuperObject(p_stObject),g_lSoundObjectTypeAnim); if( !fn_bf1StandardGameGetIsDesactivateAtAll(p_stObject->h_StandardGame) && M_ObjectIsActivable(p_stObject) ) { fn_vStandardGameSetIsActivable(p_stObject->h_StandardGame,0); fn_vStandardGameSetIsDesactivateAtAll(p_stObject->h_StandardGame,0); M_UnactivateObject(p_stObject); } } void fn_vKillEngineObjectNotAlways(struct tdstEngineObject_ *p_stObject) { PLA_fn_vDesInitAllChildOfCharacter(M_GetSuperObject(p_stObject),p_stObject); /* switch(fn_eStandardGameGetInitFlagWhenDeadOrTaken(p_stObject->h_StandardGame)) { case OI_WhenPlayerGoOutOfActionZone: fn_vStandardGameSetIsActivable(p_stObject->h_StandardGame,1); fn_vStandardGameSetIsDesactivateAtAll(p_stObject->h_StandardGame,0); break; case OI_Always: fn_vStandardGameSetIsActivable(p_stObject->h_StandardGame,1); fn_vStandardGameSetIsDesactivateAtAll(p_stObject->h_StandardGame,0); fn_vInitOneObject(p_stObject,OTI_Always); break; case OI_WhenPlayerIsDead: fn_vStandardGameSetIsActivable(p_stObject->h_StandardGame,0); fn_vStandardGameSetIsDesactivateAtAll(p_stObject->h_StandardGame,0); break; case OI_NeverBackWhenTaken: fn_vStandardGameSetIsActivable(p_stObject->h_StandardGame,0); fn_vStandardGameSetIsDesactivateAtAll(p_stObject->h_StandardGame,1); break; case OI_WhenMapJustLoaded: case OI_WhenSavedGameJustLoaded: case OI_WhenGeneratorIsDesactivated: fn_vStandardGameSetIsActivable(p_stObject->h_StandardGame,0); fn_vStandardGameSetIsDesactivateAtAll(p_stObject->h_StandardGame,0); break; } */ if(!fn_bf1StandardGameGetIsDesactivateAtAll(p_stObject->h_StandardGame)) { /* dead*/ fn_vStandardGameSetIsDesactivateAtAll(p_stObject->h_StandardGame,1); /* definitively ????*/ if (fn_eStandardGameGetInitFlagWhenDeadOrTaken(p_stObject->h_StandardGame) == OI_NeverBackWhenTaken) fn_vStandardGameSetIsActivable(p_stObject->h_StandardGame,0); else fn_vStandardGameSetIsActivable(p_stObject->h_StandardGame,1); /* reinit ???*/ if (fn_eStandardGameGetInitFlagWhenDeadOrTaken(p_stObject->h_StandardGame) == OI_Always) fn_vInitOneObject(p_stObject,OTI_Always); else M_UnactivateObject(p_stObject); } /*kill the eventual attached Sound Object*/ SND_fn_vKillObjectSound2((long)M_GetSuperObject(p_stObject),g_lSoundObjectTypeAnim); } void fn_vKillEngineObjectOrAlwaysByPointer(struct tdstEngineObject_ *p_stObject) { if (M_ObjectGetFamilyType(p_stObject)!=C_InvalidObjectType) { if (M_ObjectGetPersonalType(p_stObject)>=C_AlwaysObjectType) fn_vKillAlwaysByPersonalType(M_ObjectGetPersonalType(p_stObject)); else fn_vKillEngineObjectNotAlways(p_stObject); } else M_GameWarningError(E_uwGameKillOneEngineObjectInvalid); } #ifndef _FIRE_DEADCODE_U64_ void fn_vKillEngineObjectOrAlwaysByPersonalType(tdObjectType otPersonalType) { if (otPersonalType!=C_InvalidObjectType) { if (otPersonalType>=C_AlwaysObjectType) fn_vKillAlwaysByPersonalType(otPersonalType); else { /**** look for object's pointer ****/ fn_vKillEngineObjectNotAlways(fn_p_stFindObjectByItsPersonalType(otPersonalType,gp_stActualWorld)); } } else M_GameWarningError(E_uwGameKillOneEngineObjectInvalid); } #endif /* _FIRE_DEADCODE_U64_ */ /*----------------------------------------------------------------------------- * Description : Initialisation of all object when * a new game start *----------------------------------------------------------------------------- * Input : None * Output : None *----------------------------------------------------------------------------- * Creation date : 28/02/96 Author : Francois *----------------------------------------------------------------------------- * Modification date : Modification Author : * Modifications : *---------------------------------------------------------------------------*/ void fn_vInitAllObjectsWhenNewGameStart(void) { } /*************************************************************************/ void fn_vInitAllObjectsWhenMapJustLoaded(void) { HIE_fn_vInitMatrixStack(); fn_vInitAllObjectTree(OTI_MapLoaded,gp_stDynamicWorld); fn_vInitAlwaysModel(OTI_MapLoaded); } /*************************************************************************/ void fn_vInitAllObjectsWorld(enum tdeObjectTreeInit_ eObjIniType) { fn_vInitAllObjectTree(eObjIniType,gp_stDynamicWorld); fn_vInitAllObjectTree(eObjIniType,gp_stInactiveDynamicWorld); } /*************************************************************************/ void fn_vInitAllObjectsWhenSavedGameJustLoaded(void) { HIE_fn_vInitMatrixStack(); fn_vInitAllObjectsWorld(OTI_LoadSavedGame); fn_vInitAlwaysModel(OTI_LoadSavedGame); } /*************************************************************************/ void fn_vReInitActorsWhenSectorBecomesActive(HIE_tdxHandleToSuperObject _hSector) { SECT_tdxHandleOfElementLstCharacter hCharacterList,hNextCharacterList; HIE_tdxHandleToSuperObject hTreatCharacter; tdstEngineObject *p_stTreatObject; long j; SECT_M_ForEachXMovingCharListInSector(_hSector,hCharacterList,hNextCharacterList,j) { hTreatCharacter = SECT_GetCharacterInList(hCharacterList); p_stTreatObject = (tdstEngineObject *)HIE_fn_hGetSuperObjectObject(hTreatCharacter); /* ANNECY MT - 16/12/98 {*/ /*////////////////////// Previous test ( ( ( fn_eStandardGameGetInitFlagWhenDeadOrTaken(p_stTreatObject->h_StandardGame) == OI_WhenPlayerGoOutOfActionZone || fn_eStandardGameGetInitFlagWhenDeadOrTaken(p_stTreatObject->h_StandardGame) == OI_Always ) && fn_bf1StandardGameGetIsDesactivateAtAll(p_stTreatObject->h_StandardGame) ) || (fn_eStandardGameGetInitFlagWhenOutOfZone(p_stTreatObject->h_StandardGame) == OI_WhenPlayerGoOutOfActionZone) ); //////////////////////*/ if( (fn_bf1StandardGameGetIsDesactivateAtAll(p_stTreatObject->h_StandardGame) /* perso is dead*/ && ((fn_eStandardGameGetInitFlagWhenDeadOrTaken(p_stTreatObject->h_StandardGame) == OI_WhenPlayerGoOutOfActionZone) || (fn_eStandardGameGetInitFlagWhenDeadOrTaken(p_stTreatObject->h_StandardGame) == OI_Always) ) ) || (!fn_bf1StandardGameGetIsDesactivateAtAll(p_stTreatObject->h_StandardGame) /* perso is alive*/ && (fn_eStandardGameGetInitFlagWhenOutOfZone(p_stTreatObject->h_StandardGame) == OI_WhenPlayerGoOutOfActionZone) ) ) /* END ANNECY MT }*/ { if( !fn_ucIsAnAlwaysObject(p_stTreatObject) #ifndef U64 && g_DEMO_KeybTest != DEMO_PLAY #endif ) fn_vInitOneObject(p_stTreatObject,OTI_WhenGoOutOfZone); } } } /*************************************************************************/ /* Modif : 22/05/98 loop to take perso in new active sector*/ void fn_vInitObjectsWhenPlayerChangeSector(HIE_tdxHandleToSuperObject hCharacter, HIE_tdxHandleToSuperObject hCurrentSector, HIE_tdxHandleToSuperObject hPreviousSector) { long i,j; HIE_tdxHandleToSuperObject hListInActiveSector; HIE_tdxHandleToSuperObject hListInPreviousSector; SECT_tdxHandleOfElementLstActivityInteraction hActivityListInActiveSector; SECT_tdxHandleOfElementLstActivityInteraction hActivityListInPreviousSector; unsigned char bSectorWasAndIsActive; // reInit actors when inactive sectors become active // Sectors in Activation List of CurrentSector SECT_M_ForEachActivityNodeInActivityInteractionList(hCurrentSector,hActivityListInActiveSector,i) { bSectorWasAndIsActive = FALSE; hListInActiveSector = SECT_GetSectorInActivityList(hActivityListInActiveSector); if (hListInActiveSector==hPreviousSector) bSectorWasAndIsActive = TRUE; else { SECT_M_ForEachActivityNodeInActivityInteractionList(hPreviousSector,hActivityListInPreviousSector,j) { hListInPreviousSector = SECT_GetSectorInActivityList(hActivityListInPreviousSector); if (hListInPreviousSector==hListInActiveSector) bSectorWasAndIsActive = TRUE; } } if (bSectorWasAndIsActive == FALSE) { fn_vReInitActorsWhenSectorBecomesActive(hListInActiveSector); } } // Current Sector bSectorWasAndIsActive = FALSE; SECT_M_ForEachActivityNodeInActivityInteractionList(hPreviousSector,hActivityListInPreviousSector,j) { hListInPreviousSector = SECT_GetSectorInActivityList(hActivityListInPreviousSector); if (hListInPreviousSector==hCurrentSector) bSectorWasAndIsActive = TRUE; } if (bSectorWasAndIsActive == FALSE) { fn_vReInitActorsWhenSectorBecomesActive(hCurrentSector); } } /*************************************************************************/ /*----------------------------------------------------------------------------- * Description : Initialisation of all object when * the map just loaded *----------------------------------------------------------------------------- * Input : None * Output : None *----------------------------------------------------------------------------- * Creation date : 28/02/96 Author : Francois *----------------------------------------------------------------------------- * Modification date : Modification Author : * Modifications : *---------------------------------------------------------------------------*/ void fn_vForceReinitAllObjects() { HIE_fn_vInitMatrixStack(); fn_vInitAllObjectsWorld(OTI_ReinitTheMap); fn_vInitAlwaysModel(OTI_ReinitTheMap); CAM_fn_vReInitCameras(); } /*----------------------------------------------------------------------------- * Description : The player is dead, we must reinit the map by doing a dead loop * *----------------------------------------------------------------------------- * Input : None * Output : None *----------------------------------------------------------------------------- * Creation date : 25/06/97 Author : Francois *----------------------------------------------------------------------------- * Modification date : 13/09/97 Modification Author : Olivier * Modifications : Special Position Flag use *---------------------------------------------------------------------------*/ void fn_vSnifThePlayerIsDead(void) { /* #ifndef ACTIVE_EDITOR*/ /* fn_vStandardGameChangePositionFromSpecialPositionFlag();*/ /* #endif /* ACTIVE_EDITOR */ /* ANNECY MT - 28/08/98 {*/ /* No resurection*/ POS_fn_vSetIdentityMatrix(&g_stEngineStructure.stMainCharacterPosition); POS_fn_vSetIdentityMatrix(&g_stEngineStructure.stMainCameraPosition); g_stEngineStructure.bResurection = FALSE; /* END ANNECY MT }*/ /* JO 27/11/97*/ /*SND_fn_vKillAllObjectSound();*/ SND_fn_vKillAllObjectTypeSound( g_lSoundObjectTypeAnim ); #ifdef D_USE_LIPSYNC SND_fn_vKillAllObjectTypeSound( g_lSoundObjectTypeLipsSynchro ); #endif fn_vChangeEngineMode(EM_ModePlayerDead); } /*----------------------------------------------------------------------------- * Description : The player is dead, we must reinit the map by doing a dead loop * Must replace fn_vSnifThePlayerIsDead * *----------------------------------------------------------------------------- * Input : BOOLEAN * Output : None *----------------------------------------------------------------------------- * Creation date : 02/10/97 Author : Olivier *----------------------------------------------------------------------------- * Modification date : Modification Author : * Modifications : *---------------------------------------------------------------------------*/ /* void fn_vSnifThePlayerIsDeadWithOption(ACP_tdxBool _bSpecialPositionUse) { #ifndef ACTIVE_EDITOR if( _bSpecialPositionUse ) fn_vStandardGameChangePositionFromSpecialPositionFlag(); #endif // ACTIVE_EDITOR // JO 27/11/97 //SND_fn_vKillAllObjectSound(); SND_fn_vKillAllObjectTypeSound( g_lSoundObjectTypeAnim ); SND_fn_vKillAllObjectTypeSound( g_lSoundObjectTypeLipsSynchro ); fn_vChangeEngineMode(EM_ModePlayerDead); } */ /*----------------------------------------------------------------------------- * Description : The player is dead, we must reinit the map by doing a * dead loop. * Principal character is initialized at characterOne's * position, and principal camera at CharacterTwo's * position, if SpecialPositionFlag(s) are valid. * Else, the fn_vSnifThePlayerIsDeadWithOption function * is called. * *----------------------------------------------------------------------------- * Input : two characters * Output : None *----------------------------------------------------------------------------- * Creation date : 26/11/97 Author : Olivier *----------------------------------------------------------------------------- * Modification date : Modification Author : * Modifications : *---------------------------------------------------------------------------*/ void fn_vSnifThePlayerIsDeadWithResurrectionAt(HIE_tdxHandleToSuperObject _hCharacterPositionOne,HIE_tdxHandleToSuperObject _hCharacterPositionTwo) { /* ANNECY MT - 28/08/98 {*/ HIE_tdxHandleToSuperObject hMaincharacter = MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode() ); g_stEngineStructure.bResurection = FALSE; /* save Main Character Resurection Position*/ if(_hCharacterPositionOne && hMaincharacter) { /* save initial position*/ POS_fn_vCopyMatrix ( &g_stEngineStructure.stMainCharacterPosition, fn_p_st3dDataGetMatrixInit(M_GetMSHandle(hMaincharacter,3dData)) ); /* set initial position to resurection position*/ POS_fn_vCopyMatrix ( fn_p_st3dDataGetMatrixInit(M_GetMSHandle(hMaincharacter,3dData)), HIE_fn_hGetSuperObjectGlobalMatrix(_hCharacterPositionOne) ); g_stEngineStructure.bResurection = TRUE; } else if(hMaincharacter) { /* save initial position*/ POS_fn_vCopyMatrix ( &g_stEngineStructure.stMainCharacterPosition, fn_p_st3dDataGetMatrixInit(M_GetMSHandle(hMaincharacter,3dData)) ); g_stEngineStructure.bResurection = TRUE; } /* save Main Camera Resurection Position*/ if(_hCharacterPositionTwo && g_stEngineStructure.h_StdCamCaracter) { /* save initial position*/ POS_fn_vCopyMatrix ( &g_stEngineStructure.stMainCameraPosition, fn_p_st3dDataGetMatrixInit(M_GetMSHandle(g_stEngineStructure.h_StdCamCaracter,3dData)) ); /* set initial position to resurection position*/ POS_fn_vCopyMatrix ( fn_p_st3dDataGetMatrixInit(M_GetMSHandle(g_stEngineStructure.h_StdCamCaracter,3dData)), HIE_fn_hGetSuperObjectGlobalMatrix(_hCharacterPositionTwo) ); g_stEngineStructure.bResurection = TRUE; } else if(g_stEngineStructure.h_StdCamCaracter) { /* save initial position*/ POS_fn_vCopyMatrix ( &g_stEngineStructure.stMainCameraPosition, fn_p_st3dDataGetMatrixInit(M_GetMSHandle(g_stEngineStructure.h_StdCamCaracter,3dData)) ); g_stEngineStructure.bResurection = TRUE; } /* END ANNECY MT }*/ /* JO 27/11/97*/ SND_fn_vKillAllObjectTypeSound( g_lSoundObjectTypeAnim ); #ifdef D_USE_LIPSYNC SND_fn_vKillAllObjectTypeSound( g_lSoundObjectTypeLipsSynchro ); #endif fn_vChangeEngineMode(EM_ModePlayerDead); } /*----------------------------------------------------------------------------- * Description : Initialisation of all object when * the player just dead *----------------------------------------------------------------------------- * Input : None * Output : None *----------------------------------------------------------------------------- * Creation date : 28/02/96 Author : Francois *----------------------------------------------------------------------------- * Modification date : Modification Author : * Modifications : *---------------------------------------------------------------------------*/ void fn_vInitAllObjectsWhenPlayerDead(void) { HIE_fn_vInitMatrixStack(); fn_vInitAllObjectsWorld(OTI_PlayerDead); fn_vInitAlwaysModel(OTI_PlayerDead); } /*----------------------------------------------------------------------------- * Description : Read the objects tree and initialize engine objects * recursive function *----------------------------------------------------------------------------- * Input : Initialisation's type * Output : None *----------------------------------------------------------------------------- * Creation date : 06/09/96 Author : Francois *----------------------------------------------------------------------------- * Modification date : Modification Author : * Modifications : *---------------------------------------------------------------------------*/ void fn_vInitAllObjectTree(enum tdeObjectTreeInit_ eObjIniType,HIE_tdxHandleToSuperObject p_stSupObject) { HIE_tdxHandleToSuperObject p_stChild; long i; tdstEngineObject *p_stObject; unsigned long ulSuperObjectType; tdxHandleToFamilyList hFamily; MS_tdxHandleTo3dData h3dData; /**** Calculate absolute matrix ****/ HIE_fn_vPushMatrix(p_stSupObject); GEO_M_vCopyMatrix(HIE_fn_hGetSuperObjectGlobalMatrix(p_stSupObject),g_p_stCurrentMatrix); HIE_fn_vInvalidateOneGlobalMatrix(p_stSupObject); /**** We cover all tree ****/ HIE_M_ForEachChildOf(p_stSupObject,p_stChild,i) fn_vInitAllObjectTree(eObjIniType,p_stChild); HIE_fn_vPopMatrix(); /**** We initialize this object ****/ p_stObject = (tdstEngineObject *)HIE_fn_hGetSuperObjectObject(p_stSupObject); ulSuperObjectType = HIE_fn_ulGetSuperObjectType(p_stSupObject); if (p_stObject==NULL && (ulSuperObjectType & (HIE_C_ulSuperObject | HIE_C_ulNoAction)) == 0) { M_GameFatalError(E_uwGameInitAllObjectTreeNullPointer); } if (ulSuperObjectType == HIE_C_ulActor) { switch (eObjIniType) { /* ANNECY MT - 28/08/98 {*/ case OTI_ReinitTheMap: fn_vInitOneObject(p_stObject,eObjIniType); /* always*/ break; /* END ANNECY MT }*/ case OTI_MapLoaded: case OTI_LoadSavedGame: /**** Initialisation ****/ if ( ( fn_eStandardGameGetInitFlagWhenDeadOrTaken(p_stObject->h_StandardGame) == OI_WhenPlayerGoOutOfActionZone || fn_eStandardGameGetInitFlagWhenDeadOrTaken(p_stObject->h_StandardGame) == OI_Always || fn_eStandardGameGetInitFlagWhenDeadOrTaken(p_stObject->h_StandardGame) == OI_WhenPlayerIsDead || fn_eStandardGameGetInitFlagWhenDeadOrTaken(p_stObject->h_StandardGame) == OI_WhenMapJustLoaded || fn_eStandardGameGetInitFlagWhenDeadOrTaken(p_stObject->h_StandardGame) == OI_WhenSavedGameJustLoaded ) || ( fn_eStandardGameGetInitFlagWhenDeadOrTaken(p_stObject->h_StandardGame) == OI_NeverBackWhenTaken && !fn_bf1StandardGameGetIsDesactivateAtAll(p_stObject->h_StandardGame) ) ) { if (eObjIniType==OTI_LoadSavedGame&&fn_eStandardGameGetInitFlagWhenDeadOrTaken(p_stObject->h_StandardGame) == OI_WhenSavedGameJustLoaded) fn_vInitOneObject(p_stObject,OTI_ReinitTheMap); else fn_vInitOneObject(p_stObject,eObjIniType); } else /**** Do not initialise it ****/ { fn_vDesinitOneObject(p_stObject,eObjIniType); } /* CGHT 15/05/97*/ h3dData=M_GetMSHandle(p_stSupObject,3dData); hFamily=fn_h3dDataGetFamily(h3dData); HIE_fn_vSetSuperObjectBoundingVolume(p_stSupObject,(void *)(hFamily->hBoundingSphere)); break; case OTI_AlwaysCreated: case OTI_PlayerDead: if ( ( fn_eStandardGameGetInitFlagWhenDeadOrTaken(p_stObject->h_StandardGame) == OI_WhenPlayerGoOutOfActionZone || fn_eStandardGameGetInitFlagWhenDeadOrTaken(p_stObject->h_StandardGame) == OI_Always || fn_eStandardGameGetInitFlagWhenDeadOrTaken(p_stObject->h_StandardGame) == OI_WhenPlayerIsDead ) || ( fn_eStandardGameGetInitFlagWhenDeadOrTaken(p_stObject->h_StandardGame) == OI_NeverBackWhenTaken && !fn_bf1StandardGameGetIsDesactivateAtAll(p_stObject->h_StandardGame) ) || ( fn_eStandardGameGetInitFlagWhenDeadOrTaken(p_stObject->h_StandardGame) == OI_WhenMapJustLoaded && !fn_bf1StandardGameGetIsDesactivateAtAll(p_stObject->h_StandardGame) ) ) /**** Initialise it ****/ { fn_vInitOneObject(p_stObject,eObjIniType); } else /**** Do not initialise it ****/ { fn_vDesinitOneObject(p_stObject,eObjIniType); } break; default : M_GameFatalError(E_uwGameInitAllObjectTreeBadInitType); break; } /* Update Global Matrix for correct DNM Init.*/ HIE_fn_vPushMatrix(p_stSupObject); HIE_fn_vPopMatrix(); /* Init DNM Object*/ if(M_GetMSHandle(p_stSupObject,Dynam)!=NULL) { fn_vDynamInit(p_stObject,eObjIniType); } } } /* Create a child for a super object*/ #ifdef ACTIVE_EDITOR void fn_vAddChildToSuperObject(HIE_tdxHandleToSuperObject hChild,char *szFamily,char *szModel,char *szPersonal) { tdstEngineObject * p_stObject; p_stObject=(tdstEngineObject*)HIE_fn_hGetSuperObjectObject(hChild); fn_vStandardGameSetPersonalType(p_stObject->h_StandardGame,fn_otFindOrAddPersonalTypeOfPersonalTypeName(szPersonal)); fn_vStandardGameSetFamilyType(p_stObject->h_StandardGame,fn_otFindOrAddFamilyTypeOfFamilyTypeName(szFamily)); fn_vStandardGameSetModelType(p_stObject->h_StandardGame,fn_otFindOrAddModelTypeOfModelTypeName(szModel)); fn_v3dDataSetFamily(p_stObject->h_3dData,fn_hFindOrAddFAmily(fn_otStandardGameGetFamilyType(p_stObject->h_StandardGame))); PLA_fn_vInitNewState(hChild,fn_h3dDataGetInitialState(p_stObject->h_3dData)); PLA_fn_bDoFirstInitOfAnimPlayerForCharacter(hChild,fn_h3dDataGetInitialState(p_stObject->h_3dData)->p_stAnim); } #endif /* ACTIVE_EDITOR */