471 lines
16 KiB
C
471 lines
16 KiB
C
#define D_StdGame_StructureDefine
|
||
#define D_Brain_StructureDefine
|
||
|
||
#include "ToolsCPA.h"
|
||
|
||
#include "Options/Options.h"
|
||
#include "Macros.h"
|
||
|
||
#include "Structur/input_s.h"
|
||
#include "Structur/ErrGame.h"
|
||
#include "Structur/EngMode.h"
|
||
#include "Actions/AllActs.h"
|
||
|
||
#include "structur/objects.h"
|
||
#include "STRUCTUR/StdObjSt.h"
|
||
#include "Structur/State.h"
|
||
|
||
#include "GameEng.h"
|
||
#include "ia_dnm.h"
|
||
#include "PlayAnim/PlayAnim.h"
|
||
|
||
#include "safe.h" /*BART*/
|
||
|
||
#include "PRF.h"
|
||
|
||
/*ANNECY 27/11/97 CT{*/
|
||
#include "ia_dnm1.cxx"
|
||
/*ENDANNECY CT}*/
|
||
|
||
//XB 05/08/99
|
||
#include "AI/AIBase/Specif/AIOption.h"
|
||
//End XB
|
||
|
||
#if (defined(USE_PROFILER) && !defined(PRESS_DEMO) && !defined(U64))
|
||
extern void GAM_fn_vRasterDumpUpdate(unsigned long,unsigned long,unsigned long,unsigned long,unsigned long);
|
||
#endif
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Inits the array of functions for mechanics.
|
||
*-----------------------------------------------------------------------------
|
||
* Input : pointer on the list of PAirOfFunctions
|
||
* Output : None
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 05/02/97 Author : Frederic
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : 13/06/97 Modification Author : S Leroy
|
||
* Modifications :
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : 30/06/98 Modification Author : J Thenoz
|
||
* Modifications : parsing functions disapear
|
||
*---------------------------------------------------------------------------*/
|
||
void InitArrayOfDynamicFunction(struct DNM_stDynamics* (**p_fnDynamicFunction)(struct DNM_stDynamics*,HIE_tdxHandleToSuperObject,struct DNM_stParsingDatas *,DNM_tdxHandleToMecIdentityCard,MTH_tdxReal) )
|
||
{
|
||
p_fnDynamicFunction[DNM_eCamera] = DNM_p_stDynamicsCameraMechanics;
|
||
p_fnDynamicFunction[DNM_eBase] = MEC_p_stDynamicsBaseMechanics;
|
||
}
|
||
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Gets the handle on Identity Card from a perso
|
||
*-----------------------------------------------------------------------------
|
||
* Input : Handle on the SuperObject
|
||
* Output : Handle
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 07/04/97 Author :Frederic
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
|
||
DNM_tdxHandleToMecIdentityCard fn_h_GetCurrentDNMIdCard(HIE_tdxHandleToSuperObject p_SuperObjPerso)
|
||
{
|
||
|
||
tdxHandleToState hCurrentState;
|
||
|
||
hCurrentState = fn_h3dDataGetCurrentState(M_GetMSHandle(p_SuperObjPerso,3dData));
|
||
if( hCurrentState==NULL)
|
||
return NULL;
|
||
return fn_hGetStateMechanicsIdCard(hCurrentState);
|
||
}
|
||
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Transfers the speed information from the Anim-Player
|
||
* to the Mechanics Structure
|
||
*-----------------------------------------------------------------------------
|
||
* Input : Handle on the SuperObject
|
||
* Output : None
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : 10/03/97 Author :Frederic
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : Modification Author :
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
/* MR0605*/
|
||
void fn_vTransferSpeedInformationPLA_DNM(HIE_tdxHandleToSuperObject p_SuperObjPerso,short sLastFrame)
|
||
{
|
||
MS_tdxHandleToDynam h_Dynam;
|
||
DNM_tdstDynamics *p_stDynamics;
|
||
MTH3D_tdstVector *p_MthVector;
|
||
MTH3D_tdstMatrix *p_MthRotationMatrix;
|
||
|
||
|
||
if((h_Dynam = M_GetMSHandle(p_SuperObjPerso,Dynam)) == NULL )
|
||
return;
|
||
if((p_stDynamics = fn_p_stDynamGetDynamics(h_Dynam)) == NULL)
|
||
return;
|
||
|
||
/* MR0605*/
|
||
p_MthVector = PLA_fn_stGetLinearSpeedVector(p_SuperObjPerso,sLastFrame);
|
||
p_MthRotationMatrix = PLA_fn_stGetAngularSpeedMatrix(p_SuperObjPerso,sLastFrame);
|
||
|
||
if(p_MthVector)
|
||
{
|
||
/* JT 211298*/
|
||
/*if (!MTH3D_M_bIsNullVector(p_MthVector))*/ DNM_M_vDynamicsSetSpeedAnim ( p_stDynamics, p_MthVector );
|
||
}
|
||
|
||
if(p_MthRotationMatrix)
|
||
MEC_vImposeRelativeRotation ( p_stDynamics, p_MthRotationMatrix );
|
||
}
|
||
|
||
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Makes a character react: Intelligence / Reflex
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on the SO
|
||
* Output : None
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : ../10/96 Author :Fr<46>d<EFBFBD>ric
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : 21/10/97 Modification Author : Olivier Didelot
|
||
* Modifications :
|
||
*---------------------------------------------------------------------------*/
|
||
void fn_vMakeCharacterThink(HIE_tdxHandleToSuperObject p_stSuperObj)
|
||
{
|
||
AI_tdstMind *p_stMind;
|
||
MS_tdxHandleToBrain h_Brain;
|
||
//XB 05/08/99
|
||
#ifndef D_THROW_CFAST_AI
|
||
//End XB
|
||
static char cFastC = 1;
|
||
//XB 05/08/99
|
||
#endif /* D_THROW_CFAST_AI */
|
||
//End XB
|
||
struct AI_tdstAIModel_ *p_stAIModel;
|
||
/* ANNECY MT - 19/10/98 {*/
|
||
#if (defined(USE_PROFILER) && !defined(PRESS_DEMO) && !defined(U64))
|
||
long lDuration;
|
||
#endif
|
||
/* END ANNECY MT }*/
|
||
|
||
fn_v3dDataUpdateBrainCounter(p_stSuperObj);
|
||
|
||
if(!fn_b3dDataCanComputeBrain(p_stSuperObj))
|
||
return;
|
||
if((h_Brain = M_GetMSHandle(p_stSuperObj,Brain)) == NULL )
|
||
return;
|
||
if((p_stMind = M_pstGetMindOfBrain(h_Brain)) == NULL)
|
||
return;
|
||
|
||
p_stAIModel = p_stMind->p_stAIModel;
|
||
|
||
/* A global value depending on aleat number of instance and current trame counter */
|
||
fn_v3dDataUpdateMainBrainCounter(M_GetMSHandle(p_stSuperObj,3dData));
|
||
gcGlobAleat = (char) fn_uw3dDataGetMainBrainCounter(M_GetMSHandle(p_stSuperObj,3dData));
|
||
|
||
/* ANNECY MT - 19/10/98 {*/
|
||
#if (defined(USE_PROFILER) && !defined(PRESS_DEMO) && !defined(U64))
|
||
#pragma warning (disable : 4146)
|
||
lDuration = -TMR_fn_ulFastGetInternalCounter();
|
||
#pragma warning (default : 4146)
|
||
#endif
|
||
/* END ANNECY MT }*/
|
||
PRF_fn_vStartChrono( PRF_C_ulFctAI, p_stSuperObj );
|
||
|
||
//XB 05/08/99
|
||
#ifndef D_THROW_CFAST_AI
|
||
//End XB
|
||
/* CFast. Don't do reflex and intelligence, but only call big C function */
|
||
if ( cFastC && p_stAIModel && (p_stAIModel->CFast_bIsC) && (p_stAIModel->CFast_lFunction) )
|
||
{
|
||
CFast_gast_ArrayFunctions[p_stAIModel->CFast_lFunction].mfnv_Function(p_stSuperObj);
|
||
}
|
||
else
|
||
//XB 05/08/99
|
||
#endif /* D_THROW_CFAST_AI */
|
||
//End XB
|
||
{
|
||
if (!fn_bDoReflexPerso(p_stSuperObj))
|
||
{
|
||
/* because of killperso*/
|
||
if((h_Brain = M_GetMSHandle(p_stSuperObj,Brain)) != NULL )
|
||
if((p_stMind = M_pstGetMindOfBrain(h_Brain)) != NULL)
|
||
fn_bDoIntelligencePerso(p_stSuperObj);
|
||
}
|
||
}
|
||
|
||
PRF_fn_vStopChrono( PRF_C_ulFctAI, p_stSuperObj );
|
||
|
||
/* ANNECY MT - 19/10/98 {*/
|
||
#if (defined(USE_PROFILER) && !defined(PRESS_DEMO) && !defined(U64))
|
||
lDuration += TMR_fn_ulFastGetInternalCounter();
|
||
if(M_GetMSHandle(p_stSuperObj,StandardGame))
|
||
{
|
||
GAM_fn_vRasterDumpUpdate((unsigned long)fn_otStandardGameGetModelType(M_GetMSHandle(p_stSuperObj,StandardGame)),lDuration,0,0,0);
|
||
}
|
||
#endif
|
||
/* END ANNECY MT }*/
|
||
return;
|
||
}
|
||
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Makes a character mechanically react
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on the SO
|
||
* Output : None
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : ../10/96 Author :Fr<46>d<EFBFBD>ric
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : 30-05-97 Modification Author : JMS
|
||
* Modifications : take into account the father
|
||
*-----------------------------------------------------------------------------
|
||
* Modification date : 30-06-98 Modification Author : J Thenoz
|
||
* Modifications : delete requests treatment
|
||
*---------------------------------------------------------------------------*/
|
||
void fn_vMakeCharacterMechanicallyReact(HIE_tdxHandleToSuperObject p_stSuperObj)
|
||
{
|
||
MS_tdxHandleToDynam h_Dynam;
|
||
DNM_tdstDynamics *p_stDynamics;
|
||
DNM_tdxHandleToMecIdentityCard h_IdentityCard;
|
||
/* ANNECY MT - 19/10/98 {*/
|
||
#if (defined(USE_PROFILER) && !defined(PRESS_DEMO) && !defined(U64))
|
||
long lDuration;
|
||
#endif
|
||
/* END ANNECY MT }*/
|
||
|
||
if((h_Dynam = M_GetMSHandle(p_stSuperObj,Dynam)) == NULL )
|
||
return;
|
||
if((p_stDynamics = fn_p_stDynamGetDynamics(h_Dynam)) == NULL)
|
||
return;
|
||
|
||
/* ANNECY MT - 19/10/98 {*/
|
||
#if (defined(USE_PROFILER) && !defined(PRESS_DEMO) && !defined(U64))
|
||
#pragma warning (disable : 4146)
|
||
lDuration = -TMR_fn_ulFastGetInternalCounter();
|
||
#pragma warning (default : 4146)
|
||
#endif
|
||
/* END ANNECY MT }*/
|
||
|
||
PRF_fn_vStartChrono( PRF_C_ulFctDNM, p_stSuperObj );
|
||
|
||
h_IdentityCard = fn_h_GetCurrentDNMIdCard(p_stSuperObj);
|
||
|
||
/* dynamic change */
|
||
if (DNM_M_pDynamicsGetCurrentIdCard(p_stDynamics)!=h_IdentityCard)
|
||
DNM_fn_vChangeIdCard (p_stDynamics, h_IdentityCard);
|
||
|
||
/* dynamic function call */
|
||
if(h_IdentityCard != NULL)
|
||
{
|
||
g_a_pfnDynamicFunction[DNM_fn_eIdentityCardGetType(h_IdentityCard)]
|
||
(
|
||
p_stDynamics,
|
||
p_stSuperObj,
|
||
fn_p_stDynamGetParsingDatas(M_GetMSHandle(p_stSuperObj,Dynam)),
|
||
h_IdentityCard,
|
||
M_xGetUsefulDeltaTimeInSeconds(g_stEngineStructure.stEngineTimer)
|
||
);
|
||
|
||
/* Translate state datas*/
|
||
if (DNM_M_bDynamicsIsCollisionReport(p_stDynamics)) DNM_M_ReportStateTranslate(DNM_M_p_stDynamicsGetReport(p_stDynamics));
|
||
fn_vDynamSetUsedMechanics(h_Dynam,DNM_fn_eIdentityCardGetType(h_IdentityCard));
|
||
}
|
||
|
||
PRF_fn_vStopChrono( PRF_C_ulFctDNM, p_stSuperObj );
|
||
|
||
/* ANNECY MT - 19/10/98 {*/
|
||
#if (defined(USE_PROFILER) && !defined(PRESS_DEMO) && !defined(U64))
|
||
lDuration += TMR_fn_ulFastGetInternalCounter();
|
||
if(M_GetMSHandle(p_stSuperObj,StandardGame))
|
||
{
|
||
GAM_fn_vRasterDumpUpdate((unsigned long)fn_otStandardGameGetModelType(M_GetMSHandle(p_stSuperObj,StandardGame)),0,0,lDuration,0);
|
||
}
|
||
#endif
|
||
/* END ANNECY MT }*/
|
||
}
|
||
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : Makes a character react: Intelligence / Reflex + Mechanics
|
||
*-----------------------------------------------------------------------------
|
||
* Input : a pointer on the SO
|
||
* Output : None
|
||
*-----------------------------------------------------------------------------
|
||
* Creation date : ../10/96 Author :Frederic
|
||
*-----------------------------------------------------------------------------
|
||
* Modifications : CT 18/02/98 delete update using report
|
||
*---------------------------------------------------------------------------*/
|
||
char gcGlobAleat = 0;
|
||
void fn_vMakeCharacterReact(HIE_tdxHandleToSuperObject p_stSuperObj)
|
||
{
|
||
unsigned long ulCurrentBits;
|
||
MS_tdxHandleToStandardGame hStdGame = M_GetMSHandle(p_stSuperObj,StandardGame);
|
||
|
||
#ifdef ACTIVE_EDITOR
|
||
char* pMsg;
|
||
char MyMsg[1024]="";
|
||
char MyTitle[256];
|
||
char* pMyComport;
|
||
char szMyFamily[256];
|
||
char* pMyModel;
|
||
char* pMyPersoName;
|
||
struct AI_tdstMind_ *p_stMind;
|
||
ACP_tdxBool bAIPlayed = FALSE ;
|
||
#endif
|
||
|
||
SAF_M_Try /*BART*/
|
||
|
||
ulCurrentBits = fn_ulStandardGameGetCustomBits(hStdGame);
|
||
|
||
/* if both bits are set, we are not displayed, and passivity is required.*/
|
||
/* in all other cases, either we are visible and we act, or no passivity is required, whether we are visible or not!*/
|
||
if ( (ulCurrentBits & (GAM_C_CustBitUnseenFrozen | GAM_C_CustBitOutOfVisibility)) != (GAM_C_CustBitUnseenFrozen | GAM_C_CustBitOutOfVisibility) )
|
||
{
|
||
/* if no AI is required, or if we are too far to take AI into account, skip AI!*/
|
||
if
|
||
(
|
||
!(
|
||
(ulCurrentBits & GAM_C_CustBitNoAI)
|
||
||
|
||
((ulCurrentBits & GAM_C_CustBitNoAIWhenTooFar) && fn_bStandardGameIsTooFar(hStdGame))
|
||
)
|
||
)
|
||
{
|
||
#ifdef ACTIVE_EDITOR
|
||
bAIPlayed = TRUE ;
|
||
sprintf (MyTitle,"Erreur dans une IA !");
|
||
#endif
|
||
fn_vMakeCharacterThink(p_stSuperObj);
|
||
|
||
/* the AI might have destroyed the instance, so check that it is still valid!*/
|
||
if ( (hStdGame = M_GetMSHandle(p_stSuperObj,StandardGame)) != NULL ) /*VOLUNTARY ASSIGNMENT*/
|
||
{
|
||
/*the AI might have changed some bits, so read them again!*/
|
||
ulCurrentBits = fn_ulStandardGameGetCustomBits(hStdGame);
|
||
}
|
||
}
|
||
|
||
/* if no meca is required or we are too far to take it into account, skip it */
|
||
if
|
||
(
|
||
hStdGame /* the object still exists (hence it is not a destroyed always)*/
|
||
&&
|
||
!(
|
||
(ulCurrentBits & GAM_C_CustBitNoMechanic)
|
||
||
|
||
(
|
||
(ulCurrentBits & GAM_C_CustBitNoMecaWhenTooFar)
|
||
&& fn_bStandardGameIsTooFar(hStdGame)
|
||
)
|
||
)
|
||
)
|
||
{
|
||
#ifdef ACTIVE_EDITOR
|
||
sprintf (MyTitle,"Erreur dans la m<>canique !");
|
||
#endif
|
||
fn_vMakeCharacterMechanicallyReact(p_stSuperObj);
|
||
}
|
||
/* jt 010499 comment<6E> car les designers utilisent syst<73>matiquement des plateformes sans m<>ca avant qu'un acteur devienne fils
|
||
#if defined(ACTIVE_EDITOR) && defined(__DEBUG_AI__)
|
||
else if ( hStdGame )
|
||
{
|
||
if ( fn_bStandardGameIsAPlatform(p_stSuperObj) && M_GetMSHandle((p_stSuperObj), Brain) && bAIPlayed )
|
||
{
|
||
char szMsg[512], *pszPersoName;
|
||
int i, iNbActorChildren = 0;
|
||
HIE_tdxHandleToSuperObject hChild;
|
||
|
||
sprintf (MyTitle,"Erreur dans la m<>canique !");
|
||
strcpy(szMsg, "une plateforme qui a des fils et une IA doit imp<6D>rativement traiter sa m<>canique!\n Les fils sont:");
|
||
HIE_M_ForEachChildOf(p_stSuperObj,hChild,i)
|
||
{
|
||
if ( HIE_fn_ulGetSuperObjectType(hChild) == HIE_C_ulActor )
|
||
{
|
||
tdstEngineObject *hChildActor = (tdstEngineObject *) HIE_fn_hGetSuperObjectObject(hChild);
|
||
strcat(szMsg, "\n\t- ");
|
||
|
||
if (hChildActor->h_Brain && hChildActor->h_Brain->p_stMind)
|
||
{
|
||
pszPersoName = hChildActor->h_Brain->p_stMind->szPersoName;
|
||
}
|
||
else
|
||
{
|
||
pszPersoName = "**unknown**";
|
||
}
|
||
strcat(szMsg, pszPersoName);
|
||
iNbActorChildren ++;
|
||
}
|
||
}
|
||
SAF_M_AssertWithMsg((iNbActorChildren == 0), szMsg);
|
||
}
|
||
}
|
||
#endif
|
||
*/
|
||
}
|
||
|
||
SAF_M_CatchWithMsg(pMsg) /* BART*/
|
||
#ifdef ACTIVE_EDITOR
|
||
if ( M_GetMSHandle((p_stSuperObj), Brain) )
|
||
{
|
||
p_stMind = AI_M_stGetMindOfSuperObj(p_stSuperObj);
|
||
strcpy(szMyFamily, M_GetNameComport(M_GetCurrentComport(M_GetIntellOrReflex(p_stMind))) );
|
||
|
||
pMyComport = strrchr(szMyFamily, ':')+1;
|
||
pMyModel = strchr(szMyFamily, '\\');
|
||
*(pMyModel++) = 0;
|
||
*(strchr(pMyModel, '\\')) = 0;
|
||
|
||
/*if ( strlen(pMyPersoName) == 0)*/
|
||
if (fn_ucIsAnAlwaysObject(M_GetEngineObject(p_stSuperObj)))
|
||
{
|
||
sprintf(MyMsg,"sur un ALWAYS\nFamille : %s\nModel : %s\nComportement : %s\nDescription : \n ->%s\n",
|
||
szMyFamily,
|
||
pMyModel,
|
||
pMyComport,
|
||
pMsg);
|
||
}
|
||
else
|
||
{
|
||
pMyPersoName = AI_M_szGetPersoName(p_stMind);
|
||
sprintf(MyMsg,"sur l'instance \"%s\"\nFamille : %s\nModel : %s\nComportement : %s\nDescription : \n ->%s\n",
|
||
pMyPersoName,
|
||
szMyFamily,
|
||
pMyModel,
|
||
pMyComport,
|
||
pMsg);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
sprintf(
|
||
MyMsg, "sur un acteur sans IA, dans l'<27>tat %s\nDescription : \n ->%s\n",
|
||
fn_p_szGetStateName(fn_h3dDataGetCurrentState(M_GetMSHandle((p_stSuperObj), 3dData))),
|
||
pMsg
|
||
) ;
|
||
p_stMind = NULL ;
|
||
}
|
||
/*pMyPersoName = AI_M_szGetPersoName(p_stMind);*/
|
||
|
||
|
||
Erm_fn_iMessageBox(MyMsg, MyTitle, MB_TOPMOST| MB_ICONEXCLAMATION | MB_OK);
|
||
fn_vForceEditor();
|
||
#endif
|
||
|
||
SAF_M_EndCatch /*BART*/
|
||
}
|
||
|
||
|
||
#ifndef _DEBUG
|
||
#pragma optimize( "t", off )
|
||
#endif
|
||
|
||
|
||
#ifndef _DEBUG
|
||
#pragma optimize( "", on )
|
||
#endif
|