1792 lines
58 KiB
C
1792 lines
58 KiB
C
/*---------------------------------------------------------------------------*/
|
||
/* Cond.cpp : Definition of general Condition.*/
|
||
/* auteur : Olivier Didelot.*/
|
||
/* date : 07/10/1996*/
|
||
/* 970131 : O.C. conditions and keywords tables + beginning of Lint verifications*/
|
||
/* modify : Olivier Couvreur*/
|
||
/* date : 03/02/1997 Lint 2 warnings excepted those specified at the end of AIMacros.h*/
|
||
/* Testing float's for equality (lines 112 and 115) we're waiting for MTH update*/
|
||
/* modify : Olivier Couvreur*/
|
||
/* date : 18/02/1997 CPA_EXPORT + new functions for editor*/
|
||
/* modify : Olivier Couvreur*/
|
||
/* date : 21/02/1997 Add <= , >= conditions and some keywords for editor + rewrite of sz????NameFromId functions*/
|
||
/* modify : 11/03/1997 CollideWithWall and CollideWithGround Conditions*/
|
||
/* modify : 03/04/1997 new button conditions*/
|
||
/* modify : Olivier Couvreur*/
|
||
/* date : 27/06/1997 Conditions use function pointers*/
|
||
/*---------------------------------------------------------------------------*/
|
||
#include "AIUseCPA.h"
|
||
|
||
#include "specif/AIOption.h"
|
||
#include "AIMacros.h"
|
||
#include "AI_Erm.h"
|
||
#include "AI_Struc.h"
|
||
#include "StrIntel.h"
|
||
#include "Intell.h"
|
||
#include "DsgMem.h" /* for fn_bFindPersoInList*/
|
||
#include "specif/AITools.h"
|
||
#include "EnumCond.h"
|
||
#include "Operator.h"
|
||
#include "EnumOper.h"
|
||
#include "Convert.h"
|
||
#include "safe.h"
|
||
|
||
#define _WP_D_WAYPOINT_FRIEND_
|
||
#include "WPWayPt.h"
|
||
#include "TMR.h"
|
||
|
||
#include "GAM\specif\DS_TouchPanel.h" //chbani TouchPanel for DS
|
||
MTH3D_tdstVector gv_LatestStyletTP, gv_CurrentStyletTP;
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
|
||
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
|
||
ACP_tdxBool fn_bIsInComport(HIE_tdxHandleToSuperObject p_stAimedPerso, long lNumComport)
|
||
{
|
||
tdstIntelligence *p_stAimedPersoIntel = AI_M_p_stGetIntelligence(AI_M_stGetMindOfSuperObj(p_stAimedPerso));
|
||
return (M_GetCurrentComport(p_stAimedPersoIntel) == M_GetComportN(p_stAimedPersoIntel, lNumComport));
|
||
}
|
||
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
|
||
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
ACP_tdxBool fn_bTestTypeOfGameMaterial(GMT_tdxHandleToGameMaterial hGameMat, GMT_tdxMask xTestMask)
|
||
{
|
||
GMT_tdxHandleToCollideMaterial hCollMat;
|
||
GMT_tdxMask xCollMask;
|
||
|
||
if (!GMT_fn_b_ulIsValid(hGameMat))
|
||
return FALSE;
|
||
hCollMat = GMT_fn_hGetCollideMaterial(hGameMat);
|
||
if (hCollMat == (GMT_tdxHandleToCollideMaterial)GMT_C_InvalidCollideMaterial)
|
||
return FALSE;
|
||
xCollMask = GMT_fn_hGetCollideMaterialIdentifier(hCollMat);
|
||
return ((xCollMask & xTestMask) == xTestMask);
|
||
}
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
ACP_tdxBool fn_bIsTypeOfGMT(HIE_tdxHandleToSuperObject p_SuperObjPerso, GMT_tdxMask xTestMask)
|
||
{
|
||
DNM_tdstReport *p_stDynamReport;
|
||
|
||
if ((p_stDynamReport = fn_pstGetDNMReport(p_SuperObjPerso)) == NULL)
|
||
return FALSE;
|
||
return fn_bTestTypeOfGameMaterial(DNM_M_hObstacleGetCollidedMaterial(DNM_M_p_stReportGetGround(p_stDynamReport)), xTestMask);
|
||
}
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
#if !defined(OPTIMIZED_COMMAND)
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
tdstNodeInterpret *fn_p_stDefaultCondition(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
p_SuperObjPerso=p_SuperObjPerso;
|
||
*p_lValue=(long) FALSE;
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
M_AIFatalError(E_uwAIFatalNotValidCondition);
|
||
#endif
|
||
return(p_stTree);
|
||
}
|
||
#endif /* _DEBUG_AI__*/
|
||
#endif /* OPTIMIZED_COMMAND*/
|
||
|
||
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
tdstNodeInterpret *fn_p_stComparisonCondition(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
tdstGetSetParam stParam1, stParam2;
|
||
enum tdeCondId_ eCondId=M_eCondIdInterpret(p_stTree-1);
|
||
long lIsFloat;
|
||
MTH_tdxReal xParam1,xParam2;
|
||
|
||
M_EvalNextTwoParameter();
|
||
|
||
/* look if both parameters are of the same type*/
|
||
lIsFloat = (long)M_GetSetParam_Type(&stParam1);
|
||
if (lIsFloat == (long)M_GetSetParam_Type(&stParam2))
|
||
{
|
||
if (lIsFloat == E_vt_Float)
|
||
{
|
||
/* both are float*/
|
||
xParam1 = M_GetSetParam_xValue(&stParam1);
|
||
xParam2 = M_GetSetParam_xValue(&stParam2);
|
||
}
|
||
else if (lIsFloat == E_vt_Vector)
|
||
{
|
||
switch (eCondId)
|
||
{
|
||
case eCond_Equal :
|
||
*p_lValue = MTH3D_M_bEqualVector(&M_GetSetParam_stVectorValue(&stParam1) , &M_GetSetParam_stVectorValue(&stParam2));
|
||
break;
|
||
|
||
case eCond_Different :
|
||
*p_lValue = !MTH3D_M_bEqualVector(&M_GetSetParam_stVectorValue(&stParam1) , &M_GetSetParam_stVectorValue(&stParam2));
|
||
break;
|
||
|
||
default:
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
M_AIFatalError(E_uwAIFatalNotValidCondition);
|
||
#endif
|
||
*p_lValue=(long) FALSE;
|
||
break;
|
||
}
|
||
return(p_stTree);
|
||
}
|
||
else
|
||
{
|
||
/* both are long...*/
|
||
switch (eCondId)
|
||
{
|
||
case eCond_Equal :
|
||
*p_lValue = (M_GetSetParam_lValue(&stParam1) == M_GetSetParam_lValue(&stParam2));
|
||
break;
|
||
|
||
case eCond_Different :
|
||
*p_lValue = (M_GetSetParam_lValue(&stParam1) != M_GetSetParam_lValue(&stParam2));
|
||
break;
|
||
|
||
case eCond_Lesser :
|
||
*p_lValue = (M_GetSetParam_lValue(&stParam1) < M_GetSetParam_lValue(&stParam2));
|
||
break;
|
||
|
||
case eCond_Greater :
|
||
*p_lValue = (M_GetSetParam_lValue(&stParam1) > M_GetSetParam_lValue(&stParam2));
|
||
break;
|
||
|
||
case eCond_LesserOrEqual :
|
||
*p_lValue = (M_GetSetParam_lValue(&stParam1) <= M_GetSetParam_lValue(&stParam2));
|
||
break;
|
||
|
||
case eCond_GreaterOrEqual:
|
||
*p_lValue = (M_GetSetParam_lValue(&stParam1) >= M_GetSetParam_lValue(&stParam2));
|
||
break;
|
||
|
||
default:
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
M_AIFatalError(E_uwAIFatalNotValidCondition);
|
||
#endif
|
||
*p_lValue=(long) FALSE;
|
||
break;
|
||
}
|
||
return(p_stTree);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
/* types are different --> translate into float*/
|
||
if (lIsFloat == E_vt_Float)
|
||
{
|
||
xParam1 = M_ReturnParam_xValue(&stParam1);
|
||
xParam2 = MTH_M_xLongToReal(M_GetSetParam_lValue(&stParam2));
|
||
}
|
||
else
|
||
{
|
||
xParam1 = MTH_M_xLongToReal(M_GetSetParam_lValue(&stParam1));
|
||
xParam2 = M_ReturnParam_xValue(&stParam2);
|
||
}
|
||
}
|
||
|
||
switch (eCondId)
|
||
{
|
||
case eCond_Equal :
|
||
*p_lValue = MTH_M_bEqual(xParam1, xParam2);
|
||
break;
|
||
|
||
case eCond_Different :
|
||
*p_lValue = MTH_M_bDifferent(xParam1, xParam2);
|
||
break;
|
||
|
||
case eCond_Lesser :
|
||
*p_lValue = MTH_M_bLess(xParam1, xParam2);
|
||
break;
|
||
|
||
case eCond_Greater :
|
||
*p_lValue = MTH_M_bGreater(xParam1, xParam2);
|
||
break;
|
||
|
||
case eCond_LesserOrEqual :
|
||
*p_lValue = MTH_M_bLessEqual(xParam1, xParam2);
|
||
break;
|
||
|
||
case eCond_GreaterOrEqual:
|
||
*p_lValue = MTH_M_bGreaterEqual(xParam1, xParam2);
|
||
break;
|
||
|
||
default:
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
M_AIFatalError(E_uwAIFatalNotValidCondition);
|
||
#endif
|
||
*p_lValue=(long) FALSE;
|
||
break;
|
||
}
|
||
return(p_stTree);
|
||
}
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
tdstNodeInterpret *fn_p_stBooleanCondition(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
tdstGetSetParam stValue;
|
||
enum tdeCondId_ eCondId=M_eCondIdInterpret(p_stTree-1);
|
||
|
||
/* first parameter*/
|
||
M_EvalNextParameter(&stValue);
|
||
*p_lValue=M_GetSetParam_lValue(&stValue);
|
||
|
||
switch (eCondId)
|
||
{
|
||
case eCond_Et :
|
||
if (*p_lValue==FALSE)
|
||
{
|
||
#if defined(OPTIMIZE_SWAP_PARAMETER)
|
||
if(M_NodeToSkip(p_stTree))
|
||
{
|
||
p_stTree+=M_NodeToSkip(p_stTree);
|
||
}
|
||
else
|
||
{
|
||
tdstNodeInterpret *p_stTreeInit=p_stTree;
|
||
p_stTree = fn_p_stSwapNextParameter(p_stTree);
|
||
M_NodeToSkip(p_stTreeInit)=(unsigned short) (p_stTree-p_stTreeInit);
|
||
}
|
||
#else
|
||
p_stTree = fn_p_stSwapNextParameter(p_stTree);
|
||
#endif
|
||
}
|
||
else
|
||
{
|
||
/* second parameters*/
|
||
M_EvalNextParameter(&stValue);
|
||
*p_lValue= M_GetSetParam_lValue(&stValue);
|
||
}
|
||
return(p_stTree);
|
||
break;
|
||
|
||
case eCond_Ou :
|
||
if (*p_lValue!=FALSE)
|
||
{
|
||
/*CBOPT*/
|
||
#if defined(OPTIMIZE_SWAP_PARAMETER)
|
||
if(M_NodeToSkip(p_stTree))
|
||
{
|
||
p_stTree+=M_NodeToSkip(p_stTree);
|
||
}
|
||
else
|
||
{
|
||
tdstNodeInterpret *p_stTreeInit=p_stTree;
|
||
p_stTree = fn_p_stSwapNextParameter(p_stTree);
|
||
M_NodeToSkip(p_stTreeInit)=(unsigned short) (p_stTree-p_stTreeInit);
|
||
}
|
||
#else
|
||
p_stTree = fn_p_stSwapNextParameter(p_stTree);
|
||
#endif
|
||
}
|
||
else
|
||
{
|
||
/* second parameters*/
|
||
M_EvalNextParameter(&stValue);
|
||
*p_lValue= M_GetSetParam_lValue(&stValue);
|
||
}
|
||
return(p_stTree);
|
||
break;
|
||
|
||
case eCond_Not :
|
||
*p_lValue = (long) ((*p_lValue==FALSE) ? TRUE : FALSE);
|
||
return(p_stTree);
|
||
break;
|
||
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
case eCond_XOr:
|
||
{
|
||
long l1 = *p_lValue;
|
||
M_EvalNextParameter(&stValue);
|
||
*p_lValue = (l1 ^ *p_lValue) ? TRUE : FALSE;
|
||
return(p_stTree);
|
||
}
|
||
break;
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
|
||
default:
|
||
break;
|
||
|
||
}
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
M_AIFatalError(E_uwAIFatalNotValidCondition);
|
||
#endif
|
||
*p_lValue=(long) FALSE;
|
||
return(p_stTree);
|
||
}
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
tdstNodeInterpret *fn_p_stButtonCondition(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
tdstGetSetParam stValue;
|
||
enum tdeCondId_ eCondId=M_eCondIdInterpret(p_stTree-1);
|
||
IPT_tdxHandleToEntryElement IPT_xHandle;
|
||
|
||
/* get button handle*/
|
||
M_EvalNextParameter(&stValue);
|
||
IPT_xHandle=(IPT_tdxHandleToEntryElement) M_GetSetParam_lValue(&stValue);
|
||
|
||
switch (eCondId)
|
||
{
|
||
/* pressed*/
|
||
case eCond_PressedBut:
|
||
*p_lValue = (long) (IPT_fn_bIsValidated(IPT_xHandle));
|
||
return(p_stTree);
|
||
break;
|
||
|
||
/* just pressed*/
|
||
case eCond_JustPressedBut:
|
||
*p_lValue = (long) (IPT_fn_bIsJustValidated(IPT_xHandle));
|
||
return(p_stTree);
|
||
break;
|
||
|
||
/* released*/
|
||
case eCond_ReleasedBut:
|
||
*p_lValue = (long) (IPT_fn_bIsInvalidated(IPT_xHandle));
|
||
return(p_stTree);
|
||
break;
|
||
|
||
/* just released*/
|
||
case eCond_JustReleasedBut:
|
||
*p_lValue = (long) (IPT_fn_bIsJustInvalidated(IPT_xHandle));
|
||
return(p_stTree);
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
M_AIFatalError(E_uwAIFatalNotValidCondition);
|
||
#endif
|
||
*p_lValue=(long) FALSE;
|
||
return(p_stTree);
|
||
}
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
tdstNodeInterpret *fn_p_stZDDCondition(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
tdstGetSetParam stParam;
|
||
HIE_tdxHandleToSuperObject hCharacter1=NULL;
|
||
HIE_tdxHandleToSuperObject hCharacter2=NULL;
|
||
enum tdeCondId_ eCondId=M_eCondIdInterpret(p_stTree-1);
|
||
|
||
/* get common parameters*/
|
||
M_EvalNextParameter(&stParam);
|
||
hCharacter1=M_GetSetParam_p_stSupObjValue(&stParam);
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
|
||
switch (eCondId)
|
||
{
|
||
case eCond_CollidePersoZDDNoWithPerso:
|
||
/* test if there is collision between a ZDD character of a perso and another perso*/
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
case eCond_CollideModuleZDDNoWithPerso:
|
||
/* test if there is collision between a ZDD module of a perso and another perso*/
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
{
|
||
unsigned char ucModuleOrCharacter=(eCondId==eCond_CollidePersoZDDNoWithPerso)?AI_ZDX_CHARACTER:AI_ZDX_MODULE;
|
||
unsigned char ucChannelNumber=(unsigned char) M_GetSetParam_lModuleValue(&stParam);
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
hCharacter2=M_GetSetParam_p_stSupObjValue(&stParam);
|
||
|
||
/*if (eCondId==eCond_CollidePersoZDDNoWithPerso)
|
||
{
|
||
ucModuleOrCharacter=AI_ZDX_CHARACTER;
|
||
}*/
|
||
/*
|
||
else if (eCondId==eCond_CollideModuleZDDNoWithPerso)
|
||
{
|
||
ucModuleOrCharacter=AI_ZDX_MODULE;
|
||
}
|
||
*/
|
||
if (hCharacter1)
|
||
*p_lValue=(long) fn_bIsCharacterTWODetectedByThisZddOfCharacterOne(hCharacter1,ucModuleOrCharacter,ucChannelNumber,hCharacter2);
|
||
else
|
||
*p_lValue=(long) FALSE;
|
||
};
|
||
return(p_stTree);
|
||
break;
|
||
|
||
case eCond_CollidePersoAllZDDWithPerso:
|
||
/* test if there is collision between at least one ZDD of a perso and another perso*/
|
||
{
|
||
hCharacter2=M_GetSetParam_p_stSupObjValue(&stParam);
|
||
if( hCharacter1 && hCharacter2)
|
||
*p_lValue=(long) fn_bIsCharacterTWODetectedByCharacterOne(hCharacter1,hCharacter2);
|
||
else
|
||
*p_lValue=(long) FALSE;
|
||
}
|
||
return(p_stTree);
|
||
break;
|
||
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
/* test if there is collision between a ZDD character of a perso and any other perso*/
|
||
case eCond_CollidePersoZDDWithAnyPerso:
|
||
/* test if there is collision betwwen a ZDD module of a perso and any other perso*/
|
||
case eCond_CollideModuleZDDWithAnyPerso:
|
||
{
|
||
unsigned char ucChannelNumber=0;
|
||
unsigned char ucModuleOrCharacter=(eCondId==eCond_CollidePersoZDDWithAnyPerso)?AI_ZDX_CHARACTER:AI_ZDX_MODULE;
|
||
|
||
ucChannelNumber=(unsigned char) M_GetSetParam_lModuleValue(&stParam);
|
||
|
||
if (hCharacter1)
|
||
*p_lValue=(long) fn_ucAtLeastOnePersoInZdd(hCharacter1, ucModuleOrCharacter, ucChannelNumber);
|
||
else
|
||
*p_lValue=(long) FALSE;
|
||
}
|
||
return(p_stTree);
|
||
break;
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
|
||
default:
|
||
break;
|
||
|
||
}
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
M_AIFatalError(E_uwAIFatalNotValidCondition);
|
||
#endif
|
||
*p_lValue=(long) FALSE;
|
||
return(p_stTree);
|
||
}
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
tdstNodeInterpret *fn_p_stZDECondition(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
tdstGetSetParam stParam;
|
||
HIE_tdxHandleToSuperObject hCharacter1=NULL;
|
||
HIE_tdxHandleToSuperObject hCharacter2=NULL;
|
||
enum tdeCondId_ eCondId=M_eCondIdInterpret(p_stTree-1);
|
||
|
||
switch (eCondId)
|
||
{
|
||
case eCond_CollidePersoZDENoWithPersoZDENo:
|
||
/* test if there is collision between a ZDE character of a perso and a ZDE character of another perso*/
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
case eCond_CollideModuleZDENoWithPersoZDENo:
|
||
/* test if there is collision between a ZDD module of a perso and a ZDE character of another perso*/
|
||
case eCond_CollidePersoZDENoWithModuleZDENo:
|
||
/* test if there is collision between a ZDD character of a perso and a ZDE module of another perso*/
|
||
case eCond_CollideModuleZDENoWithModuleZDENo:
|
||
/* test if there is collision between a ZDD module of a perso and a ZDE module of another perso*/
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
{
|
||
unsigned char ucChannelNumber1=0,ucChannelNumber2=0;
|
||
unsigned char ucModuleOrCharacter1=0,ucModuleOrCharacter2=0;
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
hCharacter1= M_GetSetParam_p_stSupObjValue(&stParam);
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
ucChannelNumber1=(unsigned char) M_GetSetParam_lModuleValue(&stParam);
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
hCharacter2=M_GetSetParam_p_stSupObjValue(&stParam);
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
ucChannelNumber2=(unsigned char) M_GetSetParam_lModuleValue(&stParam);
|
||
|
||
if (eCondId==eCond_CollidePersoZDENoWithPersoZDENo)
|
||
{
|
||
ucModuleOrCharacter1=AI_ZDX_CHARACTER;
|
||
ucModuleOrCharacter2=AI_ZDX_CHARACTER;
|
||
}
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
else if (eCondId==eCond_CollideModuleZDENoWithPersoZDENo)
|
||
{
|
||
ucModuleOrCharacter1=AI_ZDX_MODULE;
|
||
ucModuleOrCharacter2=AI_ZDX_CHARACTER;
|
||
}
|
||
else if (eCondId==eCond_CollidePersoZDENoWithModuleZDENo)
|
||
{
|
||
ucModuleOrCharacter1=AI_ZDX_CHARACTER;
|
||
ucModuleOrCharacter2=AI_ZDX_MODULE;
|
||
}
|
||
else if (eCondId==eCond_CollideModuleZDENoWithModuleZDENo)
|
||
{
|
||
ucModuleOrCharacter1=AI_ZDX_MODULE;
|
||
ucModuleOrCharacter2=AI_ZDX_MODULE;
|
||
}
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
if (hCharacter1 && hCharacter2)
|
||
*p_lValue=(long) fn_bThisZdeFromOneVsThisZdeFromTwo(hCharacter1,ucModuleOrCharacter1,ucChannelNumber1,hCharacter2,ucModuleOrCharacter2,ucChannelNumber2);
|
||
else
|
||
*p_lValue=(long) FALSE;
|
||
}
|
||
return(p_stTree);
|
||
break;
|
||
|
||
case eCond_CollidePersoZDENoWithPersoTypeZDE:
|
||
/* test if there is collision between a peculiar ZDE character of a perso and a ZDE (of certain type) of another perso*/
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
case eCond_CollideModuleZDENoWithPersoTypeZDE:
|
||
/* test if there is collision between a peculiar ZDE module of a perso and a ZDE (of certain type) of another perso*/
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
{
|
||
unsigned char ucChannelNumber;
|
||
unsigned char ucModuleOrCharacter=0;
|
||
GMT_tdxMask xMask;
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
hCharacter1= M_GetSetParam_p_stSupObjValue(&stParam);
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
ucChannelNumber=(unsigned char) M_GetSetParam_lModuleValue(&stParam);
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
hCharacter2=M_GetSetParam_p_stSupObjValue(&stParam);
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
xMask=(GMT_tdxMask) M_GetSetParam_xMaskValue(&stParam);
|
||
|
||
if (eCondId==eCond_CollidePersoZDENoWithPersoTypeZDE)
|
||
{
|
||
ucModuleOrCharacter=AI_ZDX_CHARACTER;
|
||
}
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
else if (eCondId==eCond_CollideModuleZDENoWithPersoTypeZDE)
|
||
{
|
||
ucModuleOrCharacter=AI_ZDX_MODULE;
|
||
}
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
if (hCharacter1 && hCharacter2)
|
||
*p_lValue=(long) fn_bThisZdeFromOneVsAllZdeFromTwo(hCharacter1,ucModuleOrCharacter,ucChannelNumber,hCharacter2,xMask);
|
||
else
|
||
*p_lValue=(long) FALSE;
|
||
}
|
||
return(p_stTree);
|
||
break;
|
||
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
case eCond_CollidePersoTypeZDEWithPersoTypeZDE:
|
||
/* test if there is collision between a ZDE (of a certain type) of a perso and a ZDE (of a certain type) of another perso*/
|
||
case eCond_CollidePersoTypeZDEWithPersoAllZDE:
|
||
/* test if there is collision between a ZDE (of a certain type) of a perso and at least one ZDE of another perso*/
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
case eCond_CollidePersoAllZDEWithPersoAllZDE:
|
||
/* test if there is collision between at least one ZDE of a perso and a ZDE of another perso*/
|
||
case eCond_CollidePersoAllZDEWithPersoTypeZDE:
|
||
/* test if there is collision between at least one ZDE of a perso and a ZDE (of a certain type) of another perso*/
|
||
{
|
||
GMT_tdxMask xMask1;
|
||
GMT_tdxMask xMask2;
|
||
|
||
GMT_fn_vResetEntireMask(&xMask1);
|
||
GMT_fn_vResetEntireMask(&xMask2);
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
hCharacter1=M_GetSetParam_p_stSupObjValue(&stParam);
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
if (eCondId==eCond_CollidePersoAllZDEWithPersoAllZDE)
|
||
{
|
||
hCharacter2=M_GetSetParam_p_stSupObjValue(&stParam);
|
||
}
|
||
else
|
||
if (eCondId==eCond_CollidePersoAllZDEWithPersoTypeZDE)
|
||
{
|
||
hCharacter2=M_GetSetParam_p_stSupObjValue(&stParam);
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
xMask2=(GMT_tdxMask) M_GetSetParam_xMaskValue(&stParam);
|
||
}
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
else
|
||
if (eCondId==eCond_CollidePersoTypeZDEWithPersoAllZDE)
|
||
{
|
||
xMask1=(GMT_tdxMask) M_GetSetParam_xMaskValue(&stParam);
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
hCharacter2=M_GetSetParam_p_stSupObjValue(&stParam);
|
||
}
|
||
else
|
||
if (eCondId==eCond_CollidePersoTypeZDEWithPersoTypeZDE)
|
||
{
|
||
xMask1=(GMT_tdxMask) M_GetSetParam_xMaskValue(&stParam);
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
hCharacter2=M_GetSetParam_p_stSupObjValue(&stParam);
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
xMask2=(GMT_tdxMask) M_GetSetParam_xMaskValue(&stParam);
|
||
}
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
|
||
if (hCharacter1 && hCharacter2)
|
||
*p_lValue=(long) fn_bThisTypeFromOneVsThisTypeFromTwo(hCharacter1,xMask1,hCharacter2,xMask2);
|
||
else
|
||
*p_lValue=(long) FALSE;
|
||
}
|
||
return(p_stTree);
|
||
break;
|
||
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
/* test if there is collision between a ZDE character of a perso and a type of ZDE (of any other perso)*/
|
||
case eCond_CollidePersoZDENoWithTypeZDE:
|
||
/* test if there is collision betwwen a ZDE module of a perso and a type of ZDE (of any other perso)*/
|
||
case eCond_CollideModuleZDENoWithTypeZDE:
|
||
{
|
||
unsigned char ucModuleOrCharacter=(eCondId==eCond_CollidePersoZDENoWithTypeZDE)?AI_ZDX_CHARACTER:AI_ZDX_MODULE;
|
||
unsigned char ucChannelNumber=0;
|
||
GMT_tdxMask xMask;
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
hCharacter1= M_GetSetParam_p_stSupObjValue(&stParam);
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
ucChannelNumber=(unsigned char) M_GetSetParam_lModuleValue(&stParam);
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
xMask=(GMT_tdxMask) M_GetSetParam_xMaskValue(&stParam);
|
||
|
||
if (hCharacter1)
|
||
*p_lValue=(long) fn_ucAtLeastOnePersoInZde(hCharacter1, ucModuleOrCharacter, ucChannelNumber, xMask);
|
||
else
|
||
*p_lValue=(long) FALSE;
|
||
}
|
||
return(p_stTree);
|
||
break;
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
|
||
default:
|
||
break;
|
||
}
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
M_AIFatalError(E_uwAIFatalNotValidCondition);
|
||
#endif
|
||
*p_lValue=(long) FALSE;
|
||
return(p_stTree);
|
||
}
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
tdstNodeInterpret *fn_p_stReportOnSurfaceCondition(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
DNM_tdstReport *p_stDynamReport;
|
||
enum tdeCondId_ eCondId=M_eCondIdInterpret(p_stTree-1);
|
||
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
HIE_tdxHandleToSuperObject hNewSuperObjPerso;
|
||
fn_vGetUltraOperatorPerso(fn_ucGetConditionUltraOperator(eCondId),p_SuperObjPerso,&hNewSuperObjPerso);
|
||
/********************************************************************************/
|
||
if ((p_stDynamReport=fn_pstGetDNMReport(hNewSuperObjPerso))==NULL)
|
||
{
|
||
*p_lValue = (long)FALSE;
|
||
return p_stTree;
|
||
}
|
||
else
|
||
{
|
||
unsigned long ulSurfState = DNM_M_ulReportGetSurfaceState(p_stDynamReport);
|
||
switch (eCondId)
|
||
{
|
||
case eCond_CollideWithGround:
|
||
*p_lValue = (long)((ulSurfState & C_WOT_ulGround) == C_WOT_ulGround);
|
||
return p_stTree;
|
||
break;
|
||
|
||
case eCond_CollideWithWall:
|
||
*p_lValue = (long)((ulSurfState & C_WOT_ulWall) == C_WOT_ulWall);
|
||
return p_stTree;
|
||
break;
|
||
|
||
case eCond_CollideWithNothing:
|
||
*p_lValue = (long)(ulSurfState == C_WOT_ulNoObstacle);
|
||
return p_stTree;
|
||
break;
|
||
|
||
/*case eCond_CollideWithSlope:
|
||
*p_lValue = (long)((ulSurfState & C_WOT_ulSlope) == C_WOT_ulSlope);
|
||
return p_stTree;
|
||
break;*/
|
||
|
||
/*case eCond_CollideWithAttic:
|
||
*p_lValue = (long)((ulSurfState & C_WOT_ulAttic) == C_WOT_ulAttic);
|
||
return p_stTree;
|
||
break;*/
|
||
|
||
case eCond_CollideWithCeiling:
|
||
*p_lValue = (long)((ulSurfState & C_WOT_ulCeiling) == C_WOT_ulCeiling);
|
||
return p_stTree;
|
||
break;
|
||
|
||
case eCond_CollideWithPerso:
|
||
*p_lValue = (long)((ulSurfState & C_WOT_ulMobile) == C_WOT_ulMobile);
|
||
return p_stTree;
|
||
break;
|
||
|
||
/*case eCond_CollideWithTrap:
|
||
*p_lValue = (long)(ulSurfState == C_WOT_ulTrap);
|
||
return p_stTree;
|
||
break;*/
|
||
|
||
case eCond_CollideWithWater:
|
||
*p_lValue = (long)((ulSurfState & C_WOT_ulWater) == C_WOT_ulWater);
|
||
return p_stTree;
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
*p_lValue = (long)FALSE;
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
M_AIFatalError(E_uwAIFatalNotValidCondition);
|
||
#endif
|
||
return p_stTree;
|
||
}
|
||
|
||
|
||
tdstNodeInterpret *fn_p_stReportThisPerso(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
DNM_tdstReport *p_stDynamReport;
|
||
tdstGetSetParam stParam;
|
||
enum tdeCondId_ eCondId=M_eCondIdInterpret(p_stTree-1);
|
||
DNM_tdstObstacle* p_stCharacterObstacle;
|
||
HIE_tdxHandleToSuperObject hPersoSupObj;
|
||
HIE_tdxHandleToSuperObject hSupObj;
|
||
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
HIE_tdxHandleToSuperObject hNewSuperObjPerso;
|
||
fn_vGetUltraOperatorPerso(fn_ucGetConditionUltraOperator(eCondId),p_SuperObjPerso,&hNewSuperObjPerso);
|
||
/********************************************************************************/
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
hPersoSupObj=M_GetSetParam_p_stSupObjValue(&stParam);
|
||
|
||
if ((p_stDynamReport=fn_pstGetDNMReport(hNewSuperObjPerso))==NULL)
|
||
{
|
||
*p_lValue = (long)FALSE;
|
||
return p_stTree;
|
||
}
|
||
|
||
if ( (DNM_M_ulReportGetSurfaceState(p_stDynamReport)&C_WOT_ulMobile) == C_WOT_ulMobile )
|
||
{
|
||
p_stCharacterObstacle = DNM_M_p_stReportGetCharacter(p_stDynamReport);
|
||
|
||
hSupObj = DNM_M_p_stObstacleGetObject (p_stCharacterObstacle);
|
||
if (HIE_fn_bIsSuperObjectValid(hSupObj))
|
||
{
|
||
*p_lValue = ( MEC_fn_hGetFatherActor (hSupObj) == hPersoSupObj );
|
||
return p_stTree;
|
||
}
|
||
}
|
||
|
||
*p_lValue = (long)FALSE;
|
||
return p_stTree;
|
||
}
|
||
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
tdstNodeInterpret *fn_p_stReportOnZDMSurfaceCondition(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
tdstGetSetParam stParam;
|
||
DNM_tdstReport *p_stDynamReport;
|
||
unsigned long ulSurfState;
|
||
GMT_tdxMask xTestMask;
|
||
enum tdeCondId_ eCondId=M_eCondIdInterpret(p_stTree-1);
|
||
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
HIE_tdxHandleToSuperObject hNewSuperObjPerso;
|
||
fn_vGetUltraOperatorPerso(fn_ucGetConditionUltraOperator(eCondId),p_SuperObjPerso,&hNewSuperObjPerso);
|
||
/********************************************************************************/
|
||
/**** BEWARE ULTRA ****/
|
||
if ((p_stDynamReport=fn_pstGetDNMReport(hNewSuperObjPerso))==NULL)
|
||
{
|
||
*p_lValue = (long)FALSE;
|
||
return p_stTree;
|
||
}
|
||
|
||
ulSurfState = DNM_M_ulReportGetSurfaceState(p_stDynamReport);
|
||
/* Eval type of ZDM.*/
|
||
M_EvalNextParameter(&stParam);
|
||
xTestMask = (GMT_tdxMask) M_GetSetParam_xMaskValue(&stParam);
|
||
|
||
switch (eCondId)
|
||
{
|
||
case eCond_ZDMCollideWithGround:
|
||
if ((ulSurfState & C_WOT_ulGround) == C_WOT_ulGround)
|
||
*p_lValue = (long)fn_bTestTypeOfGameMaterial(DNM_M_hObstacleGetMyMaterial(DNM_M_p_stReportGetGround(p_stDynamReport)), xTestMask);
|
||
else
|
||
*p_lValue = (long)FALSE;
|
||
return p_stTree;
|
||
break;
|
||
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
case eCond_ZDMCollideWithWall:
|
||
if ((ulSurfState & C_WOT_ulWall) == C_WOT_ulWall)
|
||
*p_lValue = (long)fn_bTestTypeOfGameMaterial(DNM_M_hObstacleGetMyMaterial(DNM_M_p_stReportGetWall(p_stDynamReport)), xTestMask);
|
||
else
|
||
*p_lValue = (long)FALSE;
|
||
return p_stTree;
|
||
break;
|
||
|
||
case eCond_ZDMCollideWithNothing:
|
||
if (ulSurfState != C_WOT_ulNoObstacle) /* Careful C_WOT_ulNoObstacle == 0*/
|
||
{
|
||
if ( ((ulSurfState & C_WOT_ulGround) == C_WOT_ulGround)
|
||
/*|| ((ulSurfState & C_WOT_ulSlope) == C_WOT_ulSlope)*/ )
|
||
*p_lValue = (long)!fn_bTestTypeOfGameMaterial(DNM_M_hObstacleGetMyMaterial(DNM_M_p_stReportGetGround(p_stDynamReport)), xTestMask);
|
||
else if ( ((ulSurfState & C_WOT_ulWall) == C_WOT_ulWall) /*|| ((ulSurfState & C_WOT_ulAttic) == C_WOT_ulAttic)*/ )
|
||
*p_lValue = (long)!fn_bTestTypeOfGameMaterial(DNM_M_hObstacleGetMyMaterial(DNM_M_p_stReportGetWall(p_stDynamReport)), xTestMask);
|
||
else if ((ulSurfState & C_WOT_ulCeiling) == C_WOT_ulCeiling)
|
||
*p_lValue = (long)!fn_bTestTypeOfGameMaterial(DNM_M_hObstacleGetMyMaterial(DNM_M_p_stReportGetCeil(p_stDynamReport)), xTestMask);
|
||
else
|
||
*p_lValue = (long)TRUE;
|
||
}
|
||
else
|
||
*p_lValue = (long)TRUE;
|
||
return p_stTree;
|
||
break;
|
||
|
||
/*case eCond_ZDMCollideWithSlope:
|
||
if ((ulSurfState & C_WOT_ulSlope) == C_WOT_ulSlope)
|
||
*p_lValue = (long)fn_bTestTypeOfGameMaterial(DNM_M_hObstacleGetMyMaterial(DNM_M_p_stReportGetGround(p_stDynamReport)), xTestMask);
|
||
else
|
||
*p_lValue = (long)FALSE;
|
||
return p_stTree;
|
||
break;*/
|
||
|
||
/*case eCond_ZDMCollideWithAttic:
|
||
if ((ulSurfState & C_WOT_ulAttic) == C_WOT_ulAttic)
|
||
*p_lValue = (long)fn_bTestTypeOfGameMaterial(DNM_M_hObstacleGetMyMaterial(DNM_M_p_stReportGetWall(p_stDynamReport)), xTestMask);
|
||
else
|
||
*p_lValue = (long)FALSE;
|
||
return p_stTree;
|
||
break;*/
|
||
|
||
case eCond_ZDMCollideWithCeiling:
|
||
if ((ulSurfState & C_WOT_ulCeiling) == C_WOT_ulCeiling)
|
||
*p_lValue = (long)fn_bTestTypeOfGameMaterial(DNM_M_hObstacleGetMyMaterial(DNM_M_p_stReportGetCeil(p_stDynamReport)), xTestMask);
|
||
else
|
||
*p_lValue = (long)FALSE;
|
||
return p_stTree;
|
||
break;
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
|
||
default:
|
||
break;
|
||
}
|
||
*p_lValue = (long) FALSE;
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
M_AIFatalError(E_uwAIFatalNotValidCondition);
|
||
#endif
|
||
return p_stTree;
|
||
}
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
tdstNodeInterpret *fn_p_stListCondition(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
tdstGetSetParam stParam1, stParam2;
|
||
enum tdeCondId_ eCondId=M_eCondIdInterpret(p_stTree-1);
|
||
|
||
switch(eCondId)
|
||
{
|
||
/* List*/
|
||
case eCond_IsPersoInList :
|
||
M_EvalNextTwoParameter();
|
||
*p_lValue = (long)fn_bFindPersoInList((tdstList *)M_GetSetParam_Dsg_List(&stParam1),M_GetSetParam_p_stSupObjValue(&stParam2));
|
||
return(p_stTree);
|
||
break;
|
||
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT 07/06/99 { */
|
||
case eCond_IsModelInList :
|
||
M_EvalNextTwoParameter();
|
||
*p_lValue = (long)fn_bFindModelInList((tdstList *)M_GetSetParam_Dsg_List(&stParam1),M_GetSetParam_p_stModel(&stParam2));
|
||
return(p_stTree);
|
||
break;
|
||
|
||
case eCond_IsFamilyInList :
|
||
M_EvalNextTwoParameter();
|
||
*p_lValue = (long)fn_bFindFamilyInList((tdstList *)M_GetSetParam_Dsg_List(&stParam1),M_GetSetParam_hFamily(&stParam2));
|
||
return(p_stTree);
|
||
break;
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ } */
|
||
|
||
case eCond_ListEmptyTest :
|
||
M_EvalNextParameter(&stParam1);
|
||
*p_lValue = (long)M_bListEmptyTest((tdstList *) M_GetSetParam_Dsg_List(&stParam1)) ;
|
||
return(p_stTree);
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
*p_lValue = (long) FALSE;
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
M_AIFatalError(E_uwAIFatalNotValidCondition);
|
||
#endif
|
||
return(p_stTree);
|
||
}
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
tdstNodeInterpret *fn_p_stTimeCondition(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
tdstGetSetParam stParam;
|
||
unsigned long ulCurrentTime=g_stEngineStructure.stEngineTimer.ulCurrentTimerCount;
|
||
unsigned long ulSavedTime,ulDeltaTime,ulLimitDeltaTime;
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
ulSavedTime=M_GetSetParam_ulTimeValue(&stParam);
|
||
M_EvalNextParameter(&stParam);
|
||
ulLimitDeltaTime=M_GetSetParam_ulTimeValue(&stParam);
|
||
|
||
if (ulCurrentTime>=ulSavedTime)
|
||
{
|
||
ulDeltaTime=ulCurrentTime-ulSavedTime;
|
||
}
|
||
else
|
||
{
|
||
ulDeltaTime = (unsigned long)(-(long)(ulCurrentTime-ulSavedTime));
|
||
}
|
||
*p_lValue=(ulDeltaTime>=ulLimitDeltaTime);
|
||
|
||
return(p_stTree);
|
||
}
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
tdstNodeInterpret *fn_p_stValidityCondition(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
tdstGetSetParam stParam;
|
||
enum tdeCondId_ eCondId=M_eCondIdInterpret(p_stTree-1);
|
||
|
||
#if defined(__DEBUG_AI__)
|
||
fn_vSetDontCheckNULLFlag(1);
|
||
#endif /*__DEBUG_AI__*/
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
#if defined(__DEBUG_AI__)
|
||
fn_vSetDontCheckNULLFlag(-1);
|
||
#endif /*__DEBUG_AI__ */
|
||
|
||
|
||
switch(eCondId)
|
||
{
|
||
case eCond_IsValidText:
|
||
*p_lValue = (long) ( M_GetSetParam_hText(&stParam) != FON_C_xInvalidTextHandle );
|
||
return(p_stTree);
|
||
break;
|
||
|
||
case eCond_IsValidObject:
|
||
{
|
||
MS_tdxHandleToStandardGame hStdGame;
|
||
tdstEngineObject *hObject = M_GetSetParam_p_stEngineObjValue(&stParam);
|
||
*p_lValue = (long) ( ( hObject != NULL ) /* the objet is valid*/
|
||
&& ( (hStdGame = hObject->h_StandardGame) != NULL ) /* it is not a destroyed always*/
|
||
&& !fn_bf1StandardGameGetIsDesactivateAtAll(hStdGame) /* the object isn't definitively dead*/
|
||
);
|
||
}
|
||
return(p_stTree);
|
||
break;
|
||
|
||
case eCond_IsValidWayPoint:
|
||
*p_lValue=(long) ((M_GetSetParam_WayPointValue(&stParam))!=WP_C_hWayPointInvalid);
|
||
return(p_stTree);
|
||
break;
|
||
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
case eCond_IsValidGMT:
|
||
*p_lValue=(long) ((M_GetSetParam_hGameMaterial(&stParam))!=NULL);
|
||
return(p_stTree);
|
||
break;
|
||
|
||
case eCond_IsValidAction:
|
||
*p_lValue=(long) ((M_GetSetParam_ActionValue(&stParam))!=NULL);
|
||
return(p_stTree);
|
||
break;
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
|
||
default:
|
||
break;
|
||
}
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
M_AIFatalError(E_uwAIFatalNotValidCondition);
|
||
#endif
|
||
*p_lValue=(long) FALSE;
|
||
return(p_stTree);
|
||
}
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
tdstNodeInterpret *fn_p_stMiscCondition(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
tdstGetSetParam stParam;
|
||
enum tdeCondId_ eCondId=M_eCondIdInterpret(p_stTree-1);
|
||
|
||
switch ( eCondId )
|
||
{
|
||
case eCond_EngineReinitRequested :
|
||
/* true if a previously processed character requested an engine reinit */
|
||
*p_lValue = (long) ( g_stEngineStructure . eEngineMode != EM_ModePlaying ) ;
|
||
return p_stTree;
|
||
break;
|
||
|
||
case eCond_CmtIdentifierContainsMask:
|
||
{
|
||
GMT_tdxMask xTestedMask, xBits;
|
||
/*read the tested CMT*/
|
||
M_EvalNextParameter(&stParam);
|
||
xTestedMask = (GMT_tdxMask) M_GetSetParam_xMaskValue(&stParam);
|
||
/*read the bits to test it against*/
|
||
M_EvalNextParameter(&stParam);
|
||
xBits = (GMT_tdxMask) M_GetSetParam_xMaskValue(&stParam);
|
||
/*if the cmt contains some or all the test bits, the condition is true*/
|
||
*p_lValue = (long) (( xTestedMask & xBits ) ? TRUE : FALSE);
|
||
}
|
||
return p_stTree;
|
||
break;
|
||
|
||
case eCond_HitByCollider:
|
||
{
|
||
MS_tdxHandleToCollSet hCollSet = M_GetMSHandle(p_SuperObjPerso,CollSet);
|
||
if ( (*p_lValue = ((hCollSet && fn_ucCollSetGetColliderPriority(hCollSet)) ? TRUE : FALSE)) )
|
||
/*clear, so that another collision information may be recorded next time*/
|
||
fn_vCollSetSetColliderPriority(hCollSet, 0);
|
||
}
|
||
return p_stTree;
|
||
break;
|
||
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
case eCond_IsTypeOfGMTCollide:
|
||
{
|
||
GMT_tdxMask xTestMask;
|
||
unsigned long ulSurfState;
|
||
DNM_tdstReport *p_stDynamReport;
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
|
||
if ((p_stDynamReport=fn_pstGetDNMReport(p_SuperObjPerso))==NULL)
|
||
{
|
||
*p_lValue = (long)FALSE;
|
||
return p_stTree;
|
||
break;
|
||
}
|
||
|
||
ulSurfState = DNM_M_ulReportGetSurfaceState(p_stDynamReport);
|
||
if (ulSurfState != C_WOT_ulNoObstacle)
|
||
{
|
||
xTestMask = (GMT_tdxMask) M_GetSetParam_xMaskValue(&stParam);
|
||
|
||
*p_lValue = fn_bIsTypeOfGMT(p_SuperObjPerso, xTestMask);
|
||
}
|
||
else
|
||
*p_lValue = FALSE;
|
||
}
|
||
return(p_stTree);
|
||
break;
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
|
||
/* Comport or Reflex*/
|
||
case eCond_IsInReflexComport:
|
||
case eCond_IsInComport:
|
||
{
|
||
HIE_tdxHandleToSuperObject hTempPerso;
|
||
tdstIntelligence *p_stIntelligence;
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
hTempPerso=M_GetSetParam_p_stSupObjValue(&stParam);
|
||
|
||
SAF_M_AssertWithMsg(hTempPerso, "l'acteur sp<73>cifi<66> est nul");
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
p_stIntelligence = (eCondId == eCond_IsInComport) ? AI_M_p_stGetIntelligence(AI_M_stGetMindOfSuperObj(hTempPerso))
|
||
: AI_M_p_stGetReflex(AI_M_stGetMindOfSuperObj(hTempPerso));
|
||
|
||
if (p_stIntelligence!=NULL)
|
||
*p_lValue = (long) (M_GetCurrentComport(p_stIntelligence) == M_GetSetParam_pComport(&stParam) );
|
||
else
|
||
*p_lValue =(long) FALSE;
|
||
}
|
||
return(p_stTree);
|
||
break;
|
||
|
||
/* Special*/
|
||
case eCond_IsInAction:
|
||
M_EvalNextParameter(&stParam);
|
||
*p_lValue = (unsigned long)PLA_fn_bTestCurrentAction(p_SuperObjPerso, M_GetSetParam_ActionValue(&stParam));
|
||
return(p_stTree);
|
||
break;
|
||
|
||
case eCond_ChangeActionEnable:
|
||
M_EvalNextParameter(&stParam);
|
||
*p_lValue = (unsigned long)PLA_fn_bTestNewState(p_SuperObjPerso, M_GetSetParam_ActionValue(&stParam));
|
||
return(p_stTree);
|
||
break;
|
||
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
case eCond_IsThereMechEvent:
|
||
{
|
||
unsigned char ucVarId;
|
||
unsigned short uwNbFrame;
|
||
#if defined(__DEBUG_AI__)
|
||
M_AI_DEBUG_ASSERT((M_GetTypeInterpret(p_stTree) == E_ti_DsgVarRef), E_uwAIBadLeftInAffectation);
|
||
#endif
|
||
ucVarId = (unsigned char) M_ucVarIdInterpret(p_stTree);
|
||
p_stTree++;
|
||
uwNbFrame = fn_uwGetNbEngineFrameSinceLastMechEvent(p_SuperObjPerso);
|
||
if (uwNbFrame != LME_INVALID)
|
||
{ /* Affect DsgVar with the number of frame.*/
|
||
M_Full_GetSetParam_Integer(&stParam, uwNbFrame);
|
||
if (fn_ucSetDsgVar(ucVarId, 0,AI_M_stGetMindOfSuperObj(p_SuperObjPerso), &stParam) == C_INVALID_SET)
|
||
{
|
||
/* error or not error ????*/
|
||
*p_lValue = (long) FALSE;
|
||
}
|
||
else
|
||
*p_lValue = (long) TRUE;
|
||
}
|
||
else
|
||
*p_lValue = (long) FALSE;
|
||
}
|
||
return(p_stTree);
|
||
break;
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
|
||
default:
|
||
break;
|
||
}
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
M_AIFatalError(E_uwAIFatalNotValidCondition);
|
||
#endif
|
||
*p_lValue=(long) FALSE;
|
||
return(p_stTree);
|
||
}
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
#ifdef D_USE_LIPSYNC
|
||
tdstNodeInterpret *fn_p_stLipsSynchroCondition(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
enum tdeCondId_ eCondId=M_eCondIdInterpret(p_stTree-1);
|
||
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
HIE_tdxHandleToSuperObject hNewSuperObjPerso;
|
||
fn_vGetUltraOperatorPerso(fn_ucGetConditionUltraOperator(eCondId),p_SuperObjPerso,&hNewSuperObjPerso);
|
||
/********************************************************************************/
|
||
|
||
*p_lValue = (long)fn_bIsDiscussionOver(hNewSuperObjPerso);
|
||
return p_stTree;
|
||
}
|
||
#endif /* D_USE_LIPSYNC*/
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
unsigned char fn_bPerso1Point1IntersectPerso2Point2(HIE_tdxHandleToSuperObject hPerso1, MTH3D_tdstVector *p_stVertex1,HIE_tdxHandleToSuperObject hPerso2, MTH3D_tdstVector *p_stVertex2)
|
||
{
|
||
MTH3D_tdstVector stTempVector;
|
||
HIE_tdxHandleToSuperObject hSector1,hSector2,hSector;
|
||
int i;
|
||
SECT_tdxHandleOfElementLstGraphicInteraction hList;
|
||
|
||
hSector1=GAM_fn_hGetCurrentSector(hPerso1);
|
||
if (hSector1==NULL) return FALSE;
|
||
|
||
hSector2=GAM_fn_hGetCurrentSector(hPerso2);
|
||
if (hSector2==NULL) return FALSE;
|
||
|
||
MTH3D_M_vSubVector(&stTempVector, p_stVertex2, p_stVertex1);
|
||
|
||
if(HIE_bDetectIntersectSegmentWithSuperObject(p_stVertex1/*, p_stVertex2*/, &stTempVector, hSector1))
|
||
return TRUE;
|
||
|
||
if(hSector1 != hSector2)
|
||
{
|
||
if( HIE_bDetectIntersectSegmentWithSuperObject(p_stVertex1/*,p_stVertex2*/, &stTempVector, hSector2))
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
SECT_M_ForEachGraphicNodeInGraphicInteractionList(hSector1, hList, i)
|
||
{
|
||
hSector = SECT_GetSectorInGraphicList(hList);
|
||
|
||
if( (hSector != hSector2) && HIE_bDetectIntersectSegmentWithSuperObject(p_stVertex1/*,p_stVertex2*/,
|
||
&stTempVector,hSector))
|
||
{
|
||
return TRUE;
|
||
}
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
tdstNodeInterpret *fn_p_stSectorCondition(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
tdstGetSetParam stParam;
|
||
enum tdeCondId_ eCondId=M_eCondIdInterpret(p_stTree-1);
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
HIE_tdxHandleToSuperObject hNewSuperObjPerso;
|
||
fn_vGetUltraOperatorPerso(fn_ucGetConditionUltraOperator(eCondId),p_SuperObjPerso,&hNewSuperObjPerso);
|
||
/********************************************************************************/
|
||
|
||
switch (eCondId)
|
||
{
|
||
case eCond_SeePerso:
|
||
{
|
||
HIE_tdxHandleToSuperObject pPerso1=hNewSuperObjPerso;
|
||
HIE_tdxHandleToSuperObject pPerso2;
|
||
MTH3D_tdstVector stVertex1,stVertex2;
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
pPerso2=M_GetSetParam_p_stSupObjValue(&stParam);
|
||
|
||
SAF_M_AssertWithMsg(pPerso2, "l'acteur sp<73>cifi<66> est nul");
|
||
|
||
fn_vGetCenterOfBoundingVolume(pPerso1,&stVertex1);
|
||
fn_vGetCenterOfBoundingVolume(pPerso2,&stVertex2);
|
||
/* both centers are in world coordinates*/
|
||
|
||
*p_lValue = (long) (!fn_bPerso1Point1IntersectPerso2Point2(pPerso1,&stVertex1,pPerso2,&stVertex2));
|
||
return(p_stTree);
|
||
break;
|
||
}
|
||
|
||
default:
|
||
break;
|
||
}
|
||
*p_lValue = (long) FALSE;
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
M_AIFatalError(E_uwAIFatalNotValidCondition);
|
||
#endif
|
||
return p_stTree;
|
||
}
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
tdstNodeInterpret *fn_p_stLightCondition(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
enum tdeCondId_ eCondId=M_eCondIdInterpret(p_stTree-1); /* should be eCond_IsLightOn*/
|
||
MS_tdxHandleToMSLight h_MSLight;
|
||
long lValue=FALSE;
|
||
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
HIE_tdxHandleToSuperObject hNewSuperObjPerso;
|
||
fn_vGetUltraOperatorPerso(fn_ucGetConditionUltraOperator(eCondId),p_SuperObjPerso,&hNewSuperObjPerso);
|
||
/********************************************************************************/
|
||
|
||
/* BEWARE_ULTRA */
|
||
h_MSLight=M_GetEngineObject(hNewSuperObjPerso)->h_MSLight;
|
||
if (h_MSLight!=NULL)
|
||
{
|
||
switch(eCondId)
|
||
{
|
||
case eCond_IsPersoLightOn:
|
||
lValue=(long) fn_ucMSLightGetOnOff(h_MSLight);
|
||
break;
|
||
case eCond_IsPersoLightPulseOn:
|
||
lValue=(long) fn_bMSLightGetPulse(h_MSLight);
|
||
break;
|
||
case eCond_IsPersoLightGyroPhareOn:
|
||
lValue=(long) fn_bMSLightGetGiroPhare(h_MSLight);
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
*p_lValue=lValue;
|
||
return(p_stTree);
|
||
}
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
tdstNodeInterpret *fn_p_st_ActivationCondition(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
enum tdeCondId_ eCondId=M_eCondIdInterpret(p_stTree-1); /* should be eCond_IsActivable*/
|
||
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
HIE_tdxHandleToSuperObject hNewSuperObjPerso;
|
||
fn_vGetUltraOperatorPerso(fn_ucGetConditionUltraOperator(eCondId),p_SuperObjPerso,&hNewSuperObjPerso);
|
||
/********************************************************************************/
|
||
|
||
*p_lValue=(long) M_ObjectIsActivable(M_GetEngineObject(hNewSuperObjPerso));
|
||
return (p_stTree);
|
||
}
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
|
||
tdstNodeInterpret *fn_p_st_HandledCondition(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
tdstGetSetParam stParam;
|
||
/*enum tdeCondId_ eCondId = M_eCondIdInterpret(p_stTree-1); // should be eCond_IsAlreadyHandled*/
|
||
M_EvalNextParameter( &stParam );
|
||
|
||
SAF_M_AssertWithMsg(M_GetSetParam_p_stEngineObjValue(&stParam), "l'acteur sp<73>cifi<66> est nul");
|
||
SAF_M_AssertWithMsg(M_GetSetParam_p_stEngineObjValue(&stParam) != HIE_fn_hGetSuperObjectObject(p_SuperObjPerso), "cette condition ne doit pas <20>tre appel<65>e sur soi-m<>me");
|
||
SAF_M_AssertWithMsg(M_GetSetParam_p_stEngineObjValue(&stParam)->h_StandardGame, "l'acteur sp<73>cifi<66> n'existe plus (always d<>truit ?)");
|
||
|
||
*p_lValue = (long) M_ObjectIsAlreadyTreated(M_GetSetParam_p_stEngineObjValue(&stParam));
|
||
return (p_stTree);
|
||
}
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
tdstNodeInterpret *fn_p_st_UserEvent_IsSet(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *_p_lValue)
|
||
{
|
||
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
||
tdstGetSetParam stParam;
|
||
unsigned char ucEventIndex, ucVarId = 0;
|
||
enum tdeCondId_ eCondId=M_eCondIdInterpret(p_stTree-1);
|
||
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
||
|
||
switch ( eCondId )
|
||
{
|
||
default:
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
M_AIFatalError(E_uwAIFatalNotValidCondition);
|
||
#endif
|
||
return (p_stTree);
|
||
break;
|
||
|
||
case eCond_UserEvent_IsSet:
|
||
case eCond_UserEvent_IsSet2:
|
||
M_EvalNextParameter( &stParam );
|
||
ucEventIndex = (unsigned char) M_GetSetParam_lValue( &stParam );
|
||
if ( eCondId == eCond_UserEvent_IsSet2 )
|
||
{
|
||
ucVarId = (unsigned char) M_ucVarIdInterpret(p_stTree);
|
||
p_stTree ++;
|
||
}
|
||
}
|
||
|
||
if ( ucEventIndex <= (C_ucEvent_User7 - C_ucEvent_User0) )
|
||
{
|
||
MTH3D_tdstVector stPosition;
|
||
*_p_lValue = fn_b3dDataGetUserEventFlag( M_GetMSHandle( p_SuperObjPerso, 3dData), ucEventIndex, &stPosition );
|
||
/* if there is an event and we want to retrieve its position in the AI*/
|
||
if ( (*_p_lValue) && (eCondId == eCond_UserEvent_IsSet2) )
|
||
{
|
||
/* modify the designer variable with the result, condition fails if we could not do it*/
|
||
M_Full_GetSetParam_p_stVertex(&stParam, &stPosition);
|
||
if ( fn_ucSetDsgVar(ucVarId, 0, AI_M_stGetMindOfSuperObj(p_SuperObjPerso), &stParam) == C_INVALID_SET )
|
||
*_p_lValue = FALSE;
|
||
}
|
||
}
|
||
else
|
||
*_p_lValue = FALSE;
|
||
|
||
return(p_stTree);
|
||
}
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
tdstNodeInterpret *fn_p_stAlw_IsMine(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
||
tdstGetSetParam stParam;
|
||
HIE_tdxHandleToSuperObject hNewSuperObjPerso;
|
||
tdstEngineObject *hAlwaysObject;
|
||
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
||
|
||
/* Get ultra operator */
|
||
fn_vGetUltraOperatorPerso(fn_ucGetConditionUltraOperator(eCond_Alw_IsMine),p_SuperObjPerso,&hNewSuperObjPerso);
|
||
|
||
/* get always, without checking its validity, so that the call can replace ObjetValide() */
|
||
#if defined(__DEBUG_AI__)
|
||
fn_vSetDontCheckNULLFlag(1);
|
||
#endif /* __DEBUG_AI__ */
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
|
||
#if defined(__DEBUG_AI__)
|
||
fn_vSetDontCheckNULLFlag(-1);
|
||
#endif /* __DEBUG_AI__ */
|
||
|
||
|
||
hAlwaysObject = M_GetSetParam_p_stEngineObjValue(&stParam);
|
||
|
||
*p_lValue = (hAlwaysObject && hAlwaysObject->h_StandardGame) /* if always is still active, check it is ours*/
|
||
? (long) fn_ucIsAlwaysGeneratedByMe( M_GetSetParam_p_stSupObjValue(&stParam), hNewSuperObjPerso)
|
||
: 0; /* else it is not*/
|
||
return(p_stTree);
|
||
}
|
||
|
||
#include "Cond1.cxx"
|
||
|
||
/* FQ IAenC*/
|
||
tdstNodeInterpret *fn_p_stDummyCondition(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
#ifdef U64
|
||
enum tdeCondId_ eCondId=M_eCondIdInterpret(p_stTree-1);
|
||
M_PrintfStopErrorN64(("DummyCondition %d, spo=0x%x!!", eCondId, p_SuperObjPerso));
|
||
#endif /* U64 */
|
||
|
||
*p_lValue=TRUE;
|
||
return p_stTree;
|
||
}
|
||
|
||
/*KWN : begin***********************************************************************************************************************************************/
|
||
tdstNodeInterpret *fn_p_stStyletCondition(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
enum tdeCondId_ eCondId = M_eCondIdInterpret(p_stTree-1);
|
||
*p_lValue=(long) FALSE;
|
||
|
||
switch (eCondId)
|
||
{
|
||
/* pressed*/
|
||
case eCond_StyletPressed:
|
||
*p_lValue=(long) ( DS_bTPPressed());
|
||
break;
|
||
|
||
/* just pressed*/
|
||
case eCond_StyletJustPressed:
|
||
*p_lValue=(long) ( DS_bTPJustPressed());
|
||
break;
|
||
|
||
/* just released*/
|
||
case eCond_StyletJustReleased:
|
||
*p_lValue=(long) ( DS_bTPJustReleased());
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
|
||
return(p_stTree);
|
||
}
|
||
|
||
tdstNodeInterpret *fn_p_stStyletSlice(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
|
||
tdstGetSetParam stParam;
|
||
MTH3D_tdstVector stVector01,stVector02,stTemp;
|
||
unsigned long ulCurrentBits;
|
||
int iScreenX;
|
||
int iScreenY;
|
||
|
||
*p_lValue=(long) FALSE;
|
||
|
||
M_EvalNextParameter( &stParam );
|
||
stVector01 = M_GetSetParam_stVectorValue(&stParam); //Down
|
||
M_EvalNextParameter( &stParam );
|
||
stVector02 = M_GetSetParam_stVectorValue(&stParam); //Up
|
||
|
||
ulCurrentBits = fn_ulStandardGameGetCustomBits(M_GetMSHandle(p_SuperObjPerso,StandardGame));
|
||
if( ulCurrentBits & GAM_C_CustBitOutOfVisibility)
|
||
return(p_stTree);
|
||
|
||
if( DS_bTPPressed() == false )
|
||
return(p_stTree);
|
||
|
||
if( stVector01.xY < stVector02.xY)
|
||
{
|
||
stTemp = stVector01;
|
||
stVector01 = stVector02;
|
||
stVector02 = stTemp;
|
||
}
|
||
|
||
if( stVector01.xX < 0.0f || stVector01.xX > 1000.0f
|
||
|| stVector02.xX < 0.0f || stVector02.xX > 1000.0f )
|
||
return(p_stTree);
|
||
|
||
if( stVector01.xY > 1000.0f )
|
||
stVector01.xY = 1000.0f;
|
||
|
||
if( stVector02.xY < 0.0f )
|
||
stVector01.xY = 0.0f;
|
||
|
||
DS_bTPGetPosition(&iScreenX,&iScreenY);
|
||
|
||
if ( DS_bTPJustPressed() )
|
||
{
|
||
gv_CurrentStyletTP.xX = MTH_M_xMul(MTH_M_xLongToReal(iScreenX), MTH_M_xFloatToReal(1000.0f / (float)g_stEngineStructure.stViewportAttr.dwWidth));
|
||
gv_CurrentStyletTP.xY = MTH_M_xMul(MTH_M_xLongToReal(iScreenY), MTH_M_xFloatToReal(1000.0f / (float)g_stEngineStructure.stViewportAttr.dwHeight));
|
||
gv_LatestStyletTP = gv_CurrentStyletTP;
|
||
}
|
||
else
|
||
{
|
||
float f_a,fSpeed,C_SpeedLimite;
|
||
MTH3D_tdstVector vSpeed;
|
||
|
||
stTemp = gv_CurrentStyletTP;
|
||
gv_CurrentStyletTP.xX = MTH_M_xMul(MTH_M_xLongToReal(iScreenX), MTH_M_xFloatToReal(1000.0f / (float)g_stEngineStructure.stViewportAttr.dwWidth));
|
||
gv_CurrentStyletTP.xY = MTH_M_xMul(MTH_M_xLongToReal(iScreenY), MTH_M_xFloatToReal(1000.0f / (float)g_stEngineStructure.stViewportAttr.dwHeight));
|
||
|
||
if( stTemp.xX != gv_CurrentStyletTP.xX || stTemp.xY != gv_CurrentStyletTP.xY )
|
||
gv_LatestStyletTP = stTemp;
|
||
|
||
C_SpeedLimite = MTH_M_xFloatToReal(255.0f);
|
||
f_a = MTH_M_xMul(MTH_M_xAdd(stVector01.xX,stVector02.xX), MTH_M_xFloatToReal(0.5));
|
||
|
||
if( (MTH_M_xSign(gv_LatestStyletTP.xX - f_a)*MTH_M_xSign(gv_CurrentStyletTP.xX - f_a)) <= 0 )
|
||
{
|
||
MTH3D_M_vSubVector(&vSpeed, &gv_LatestStyletTP , &gv_CurrentStyletTP) ;
|
||
fSpeed = MTH_M_xAdd(MTH_M_xMul(vSpeed.xX,vSpeed.xX) , MTH_M_xMul(vSpeed.xY,vSpeed.xY));
|
||
if ( MTH_M_bGreaterEqual(gv_CurrentStyletTP.xY,stVector02.xY) && MTH_M_bLessEqual(gv_CurrentStyletTP.xY,stVector01.xY) )
|
||
{
|
||
if MTH_M_bGreater(fSpeed,C_SpeedLimite)
|
||
*p_lValue=(long) TRUE;
|
||
}
|
||
}
|
||
}
|
||
|
||
return(p_stTree);
|
||
}
|
||
|
||
tdstNodeInterpret *fn_p_stCheckStyletRotation(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
tdstGetSetParam stParam;
|
||
MTH3D_tdstVector stCentre, stStyletPos;
|
||
int iScreenX, iScreenY;
|
||
unsigned long ulCurrentTime_R, ulCurrentTime_L, C_DelaiMAX, C_Limite;
|
||
unsigned long ulCurrentBits;
|
||
BOOL b_Right;
|
||
|
||
C_DelaiMAX = 500;
|
||
|
||
*p_lValue=(long) FALSE;
|
||
|
||
M_EvalNextParameter( &stParam );
|
||
stCentre = M_GetSetParam_stVectorValue(&stParam);
|
||
M_EvalNextParameter( &stParam );
|
||
C_Limite = M_GetSetParam_ulValue(&stParam);
|
||
M_EvalNextParameter( &stParam );
|
||
b_Right = M_GetSetParam_lValue(&stParam);
|
||
|
||
ulCurrentBits = fn_ulStandardGameGetCustomBits(M_GetMSHandle(p_SuperObjPerso,StandardGame));
|
||
if( DS_bTPPressed() == false || (ulCurrentBits & GAM_C_CustBitOutOfVisibility) )
|
||
return(p_stTree);
|
||
|
||
DS_bTPGetPosition(&iScreenX,&iScreenY);
|
||
iScreenX = MTH_M_xMul(MTH_M_xLongToReal(iScreenX), MTH_M_xFloatToReal(1000.0f / (float)g_stEngineStructure.stViewportAttr.dwWidth));
|
||
iScreenY = MTH_M_xMul(MTH_M_xLongToReal(iScreenY), MTH_M_xFloatToReal(1000.0f / (float)g_stEngineStructure.stViewportAttr.dwHeight));
|
||
|
||
if( iScreenX < (stCentre.xX - C_Limite)|| iScreenX > (stCentre.xX + C_Limite)
|
||
|| iScreenY < (stCentre.xY - C_Limite)|| iScreenY > (stCentre.xY + C_Limite) )
|
||
return(p_stTree);
|
||
|
||
stStyletPos.xX = MTH_M_xLongToReal(iScreenX);
|
||
stStyletPos.xY = MTH_M_xLongToReal(iScreenY);
|
||
stStyletPos.xZ = 0.0f;
|
||
|
||
if( DS_bTPJustPressed() )
|
||
{
|
||
fn_InitStyletRotationDATA(stCentre,stStyletPos,true);
|
||
fn_InitStyletRotationDATA(stCentre,stStyletPos,false);
|
||
}
|
||
else
|
||
{
|
||
if ( b_Right )
|
||
{
|
||
ulCurrentTime_R = g_stEngineStructure.stEngineTimer.ulCurrentTimerCount;
|
||
if ( (ulCurrentTime_R - ulSavedTime_R) < C_DelaiMAX )
|
||
{
|
||
if ( fni_GetStyletCurrentSector(stCentre,stStyletPos) == TAB_IDxNextSector_R[i_IDX_R] )
|
||
i_IDX_R ++;
|
||
|
||
if ( i_IDX_R == 4)
|
||
{
|
||
*p_lValue=(long) TRUE;
|
||
fn_InitStyletRotationDATA(stCentre,stStyletPos,true);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
fn_InitStyletRotationDATA(stCentre,stStyletPos,true);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
ulCurrentTime_L = g_stEngineStructure.stEngineTimer.ulCurrentTimerCount;
|
||
if ( (ulCurrentTime_L - ulSavedTime_L) < C_DelaiMAX )
|
||
{
|
||
if ( fni_GetStyletCurrentSector(stCentre,stStyletPos) == TAB_IDxNextSector_L[i_IDX_L] )
|
||
i_IDX_L ++;
|
||
|
||
if ( i_IDX_L == 4)
|
||
{
|
||
*p_lValue=(long) TRUE;
|
||
fn_InitStyletRotationDATA(stCentre,stStyletPos,false);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
fn_InitStyletRotationDATA(stCentre,stStyletPos,false);
|
||
}
|
||
}
|
||
}
|
||
|
||
return(p_stTree);
|
||
}
|
||
|
||
tdstNodeInterpret *fn_p_stCheckStyletGratter(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, long *p_lValue)
|
||
{
|
||
tdstGetSetParam stParam;
|
||
MTH3D_tdstVector stLimiteL, stLimiteR, stOldStyletPos, stvTemp;
|
||
int iScreenX, iScreenY;
|
||
unsigned long ulCurrentTimeAction, ulDelaiActionMAX, C_InactifDELAYMAX;
|
||
unsigned long ulCurrentBits;
|
||
float C_StyletSpeedMIN;
|
||
|
||
C_InactifDELAYMAX = 300;
|
||
C_StyletSpeedMIN = 10.0f;
|
||
|
||
*p_lValue=(long) FALSE;
|
||
|
||
M_EvalNextParameter( &stParam );
|
||
stLimiteL = M_GetSetParam_stVectorValue(&stParam);
|
||
M_EvalNextParameter( &stParam );
|
||
stLimiteR = M_GetSetParam_stVectorValue(&stParam);
|
||
M_EvalNextParameter( &stParam );
|
||
ulDelaiActionMAX = M_GetSetParam_ulValue(&stParam);
|
||
|
||
ulCurrentBits = fn_ulStandardGameGetCustomBits(M_GetMSHandle(p_SuperObjPerso,StandardGame));
|
||
if( DS_bTPPressed() == false || (ulCurrentBits & GAM_C_CustBitOutOfVisibility) )
|
||
{
|
||
g_ulTimeAction = g_stEngineStructure.stEngineTimer.ulCurrentTimerCount;
|
||
return(p_stTree);
|
||
}
|
||
|
||
DS_bTPGetPosition(&iScreenX,&iScreenY);
|
||
iScreenX = MTH_M_xMul(MTH_M_xLongToReal(iScreenX), MTH_M_xFloatToReal(1000.0f / (float)g_stEngineStructure.stViewportAttr.dwWidth));
|
||
iScreenY = MTH_M_xMul(MTH_M_xLongToReal(iScreenY), MTH_M_xFloatToReal(1000.0f / (float)g_stEngineStructure.stViewportAttr.dwHeight));
|
||
|
||
if( iScreenX < stLimiteL.xX || iScreenX > stLimiteR.xX
|
||
|| iScreenY < stLimiteL.xY || iScreenY > stLimiteR.xY )
|
||
{
|
||
g_ulTimeAction = g_stEngineStructure.stEngineTimer.ulCurrentTimerCount;
|
||
return(p_stTree);
|
||
}
|
||
|
||
stOldStyletPos = g_stStyletPos;
|
||
|
||
g_stStyletPos.xX = MTH_M_xLongToReal(iScreenX);
|
||
g_stStyletPos.xY = MTH_M_xLongToReal(iScreenY);
|
||
g_stStyletPos.xZ = 0.0f;
|
||
|
||
MTH3D_M_vSubVector(&stvTemp,&stOldStyletPos,&g_stStyletPos);
|
||
|
||
if ( MTH3D_M_xNormVector(&stvTemp) < C_StyletSpeedMIN )
|
||
g_ulTimeInactif += g_stEngineStructure.stEngineTimer.ulUsefulDeltaTime;
|
||
else
|
||
g_ulTimeInactif = 0;
|
||
|
||
if ( g_ulTimeInactif > C_InactifDELAYMAX)
|
||
{
|
||
g_ulTimeAction = g_stEngineStructure.stEngineTimer.ulCurrentTimerCount;
|
||
return(p_stTree);
|
||
}
|
||
|
||
ulCurrentTimeAction = g_stEngineStructure.stEngineTimer.ulCurrentTimerCount;
|
||
if ( (ulCurrentTimeAction - g_ulTimeAction) > ulDelaiActionMAX)
|
||
{
|
||
*p_lValue=(long) TRUE;
|
||
g_ulTimeInactif = 0;
|
||
g_ulTimeAction = g_stEngineStructure.stEngineTimer.ulCurrentTimerCount;
|
||
}
|
||
|
||
|
||
return(p_stTree);
|
||
}
|
||
/*KWN : End***********************************************************************************************************************************************/
|
||
/************************************************************************************************************************************************/
|
||
|
||
/*
|
||
*=================================================================================================
|
||
*=================================================================================================
|
||
*/
|
||
#if !defined(OPTIMIZED_COMMAND)
|
||
#include "ProtCond.h"
|
||
|
||
void fn_vInitConditionEntries(void)
|
||
{
|
||
/* Init*/
|
||
#if defined(__DEBUG_AI__)
|
||
fn_vInitConditionTable(fn_p_stDefaultCondition);
|
||
#endif /* __DEBUG_AI__*/
|
||
|
||
/* Condition definition*/
|
||
#define M_DEFINE_CONDITION(a,b,english,c,d,e,f) \
|
||
fn_vDefineConditionEntry(M_CONDITION_ENTRY(a,b,english,c,d,e)); \
|
||
fn_vSetConditionUltraOperator(a,f);
|
||
#include "DefCond.h"
|
||
#undef M_DEFINE_CONDITION
|
||
|
||
/* Check*/
|
||
#if defined(__DEBUG_AI__)
|
||
fn_vCheckConditionTable(fn_p_stDefaultCondition);
|
||
#endif /* __DEBUG_AI__*/
|
||
|
||
}
|
||
#endif /* OPTIMIZED_COMMAND*/
|
||
|