3661 lines
126 KiB
C++
3661 lines
126 KiB
C++
/************************************************************************************************
|
||
* Name: Functio1.c *
|
||
* Use : Function for AI of Rayman II and Egypte *
|
||
* Authors: Yann Le Tensorer, Christophe Giraud, Jacques Thenoz, Benoit Germain, *
|
||
* (c) UBI Simulations Annecy *
|
||
************************************************************************************************/
|
||
/*XB*/
|
||
#include "GAM\GamOpt.h"
|
||
/*End XB*/
|
||
|
||
#if (defined(ACTIVE_EXEC_CHECKING) && defined(ACTIVE_EDITOR)) || defined(ACTIVE_AIDEBUG)
|
||
extern AI_tdstMind *p_stCurrentMind; /*declared in Intell.c*/
|
||
#endif
|
||
|
||
/*#define AI_RAY2EGYPTE_COLLIDE_RANGE (MTH_tdxReal)10 // Range of collide function (meter)*/
|
||
|
||
/* CT - 8/12/1997*/
|
||
#define C_ucPlanxOy 0
|
||
#define C_ucPlanyOz 1
|
||
#define C_ucPlanzOx 2
|
||
|
||
/*VLTEMPORARY*/
|
||
/* Oliv' - Portage v14*/
|
||
#ifndef U64
|
||
#include "x:\cpa\tempgrp\gliglou\multidrv\inc\dispmode.h"
|
||
#endif /* U64 */
|
||
/* EndOfOliv'*/
|
||
/*EVL*/
|
||
|
||
/* For resolution switching...*/
|
||
#ifdef U64
|
||
#include "u_boot.h"
|
||
#include "u_cfb.h"
|
||
#include "U_zbuf.h"
|
||
#include "GLD/Specif/u_vpt.h"
|
||
extern short g_wWhichFrameBuffer;
|
||
#endif /*U64*/
|
||
|
||
/****************************** Private Data ***************************************************/
|
||
MTH3D_tdstVector g_stCollideParameterPoint;
|
||
MTH3D_tdstVector g_stCollideParameterVector;
|
||
MTH3D_tdstVector g_stCollideResultPoint;
|
||
MTH3D_tdstVector g_stCollideResultVector;
|
||
HIE_tdxHandleToSuperObject g_hSuperObjectHit;
|
||
unsigned long g_ulMode=0xFFFFFFFF;
|
||
unsigned long g_ulCollideTimeCounter=0;
|
||
/* it is possible to override the no raytrace flag once if desired thanks to this variable:*/
|
||
unsigned long g_ulOverRideRayTraceSpoMask = HIE_C_Flag_ulNotHitByRayTrace;
|
||
|
||
#ifdef __cplusplus
|
||
extern "C"
|
||
{
|
||
#endif
|
||
extern unsigned long g_ulSpoMask;
|
||
|
||
#if !defined(U64) && defined(_DEBUG)
|
||
/* for drawing the raytrace segments in engine mode*/
|
||
extern unsigned char g_ucDisplayRayTraceSegments;
|
||
extern MTH3D_tdstVector g_stRayTraceSegmentOrigin[30];
|
||
extern MTH3D_tdstVector g_stRayTraceSegmentEnd[30];
|
||
extern short g_wRayTraceSegmentLife[30];
|
||
#endif /* !U64 && _DEBUG */
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#ifndef U64
|
||
/*********** FabPerez ****************/
|
||
#include <stdlib.h>
|
||
#include <direct.h>
|
||
#include <errno.h>
|
||
|
||
#ifdef __cplusplus
|
||
extern "C"
|
||
{
|
||
#endif
|
||
|
||
extern long fn_lGetNbAvailableSlotsPc();
|
||
extern char * fn_bGetStringSlotDate(unsigned long _ulSlotId);
|
||
extern long fn_bRecupSlotNum(long lSlotPosId);
|
||
extern char * fn_cRecupSlotName(long lSlotPosId);
|
||
extern char g_a_szSlotNames[4];
|
||
extern StructRecupPosSlot * g_p_LastStructRecupPosSlot;
|
||
extern BOOL fn_bEraseGameInSlotList( long lSlotId);
|
||
extern unsigned char g_ucNbSaveGameSlots;
|
||
extern BOOL g_bIsGameAlreadyExist;
|
||
extern int fn_iVersionN64_PC(void);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
/*************Fin Fab Perez *************/
|
||
#endif // !U64
|
||
|
||
/****************************** Private Function ***********************************************/
|
||
void fn_vComputeCollideResult (HIE_tdxHandleToSuperObject hSender)
|
||
{
|
||
/* Oliv' - Portage v14*/
|
||
/* HIE_tdxHandleToSuperObject hHiearchyRoot = NULL;*/
|
||
/* EndOfOliv'*/
|
||
HIE_tdxHandleToSuperObject hSuperObjectHit,hSaveSO;
|
||
HIE_tdxHandleToSuperObject hCurrentPerso;
|
||
SECT_tdxHandleOfElementLstCharacter hCharacterList;
|
||
MTH3D_tdstVector stCollidepoint;
|
||
MTH3D_tdstVector stCollideVector;
|
||
HIE_tdxHandleToSuperObject hSector1,hSector/*,hSector2*/;
|
||
SECT_tdxHandleOfElementLstGraphicInteraction hList;
|
||
SECT_tdxHandleOfElementLstActivityInteraction hInterList;
|
||
long i,j;
|
||
BOOL bDynamCollide = FALSE;
|
||
|
||
MTH3D_M_vNullVector (&stCollideVector);
|
||
MTH3D_M_vNullVector (&g_stCollideResultPoint);
|
||
MTH3D_M_vNullVector (&g_stCollideResultVector);
|
||
g_hSuperObjectHit = NULL;
|
||
hSaveSO = NULL;
|
||
hSuperObjectHit = NULL;
|
||
|
||
#if !defined(U64) && defined(_DEBUG)
|
||
if ( g_ucDisplayRayTraceSegments )
|
||
{
|
||
int i;
|
||
for ( i = 0; i < 30; i ++ )
|
||
if ( g_wRayTraceSegmentLife[i] <= 0 )
|
||
{
|
||
g_stRayTraceSegmentOrigin[i] = g_stCollideParameterPoint;
|
||
MTH3D_M_vAddVector(&g_stRayTraceSegmentEnd[i], &g_stCollideParameterPoint, &g_stCollideParameterVector);
|
||
g_wRayTraceSegmentLife[i] = 100;
|
||
break;
|
||
}
|
||
}
|
||
#endif /* !U64 && _DEBUG */
|
||
|
||
/* find the starting sector*/
|
||
hSector1 = SECT_fn_hResearchInWhatSectorIAm(SECT_hFatherSector,&g_stCollideParameterPoint);
|
||
MTH3D_M_vNullVector (&stCollidepoint);
|
||
|
||
/* g_stCollideParameterPoint contains the starting point*/
|
||
/* g_stCollideParameterVector contains the vector for detection*/
|
||
if (g_ulMode != 1)
|
||
{
|
||
/* if there is a static detection*/
|
||
|
||
/* test on a sector, so set global mask to check SPO shadow flag :*/
|
||
g_ulSpoMask = g_ulOverRideRayTraceSpoMask;
|
||
if (hSector1==NULL)
|
||
{
|
||
/* the starting point is not in a sector... collision on the hole static world ! */
|
||
HIE_bIntersectSegmentWithFirstSuperObject(&g_stCollideParameterPoint,&g_stCollideParameterVector,SECT_hFatherSector, &g_stCollideResultPoint, &g_stCollideResultVector, &g_hSuperObjectHit);
|
||
}
|
||
else
|
||
{
|
||
/* detection on 1st sector...*/
|
||
HIE_bIntersectSegmentWithFirstSuperObject(&g_stCollideParameterPoint,&g_stCollideParameterVector, hSector1, &g_stCollideResultPoint, &g_stCollideResultVector, &g_hSuperObjectHit);
|
||
/* FBF correction pb detection*/
|
||
/* if(HIE_bIntersectSegmentWithFirstSuperObject(&g_stCollideParameterPoint,&g_stCollideParameterVector, hSector1, &g_stCollideResultPoint, &g_stCollideResultVector, &g_hSuperObjectHit))
|
||
{
|
||
// collision detected in first sector
|
||
if (g_ulMode == 0)
|
||
{
|
||
// no dynamic detection asked --> return
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
// static collision in sector 1 & dynamic collision asked --> seek dynamic collision only in sector 1 !
|
||
// look in the list of the sector
|
||
// test on an actor, so set global mask not to check SPO shadow flag :
|
||
g_ulSpoMask = 0;
|
||
SECT_M_ForEachCharListInSector(hSector1,hCharacterList,i)
|
||
{
|
||
hCurrentPerso = SECT_GetCharacterInList(hCharacterList);
|
||
if (hCurrentPerso != hSender)
|
||
{
|
||
if ( (fn_ulStandardGameGetCustomBitsSO(hCurrentPerso) & GAM_C_CustBitRayHit) && // hit by ray tracing
|
||
(fn_bf1StandardGameGetIsActive(M_GetMSHandle(hCurrentPerso,StandardGame))) ) // active
|
||
{
|
||
if (HIE_bIntersectSegmentWithFirstSuperObject (&g_stCollideParameterPoint, &g_stCollideParameterVector,hCurrentPerso,&g_stCollideResultPoint, &g_stCollideResultVector, &hSuperObjectHit))
|
||
{
|
||
// dynamic collision detected --> return the actor !
|
||
while (HIE_fn_bIsSuperObjectValid (hSuperObjectHit) && HIE_fn_ulGetSuperObjectType(hSuperObjectHit)!=HIE_C_ulActor)
|
||
{
|
||
// while superobjecthit is not an actor, seek
|
||
hSuperObjectHit = HIE_fn_hGetSuperObjectFather(hSuperObjectHit);
|
||
}
|
||
// if we arrived to an actor --> return it !
|
||
if (HIE_fn_bIsSuperObjectValid (hSuperObjectHit))
|
||
g_hSuperObjectHit = hSuperObjectHit;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
// and return result !
|
||
return;
|
||
}
|
||
|
||
}*/
|
||
|
||
/* detection on all others sectors*/
|
||
SECT_M_ForEachGraphicNodeInGraphicInteractionList(hSector1, hList, i)
|
||
{
|
||
/* if the sector is a mode look only, stop searching !*/
|
||
if (SCT_fn_wGetModeInGraphicList(hList) == C_SECT_ModeLookOnly)
|
||
break;
|
||
hSector = SECT_GetSectorInGraphicList(hList);
|
||
/* if the sector is virtual, forget about it !*/
|
||
if (!SECT_fn_bIsThisSectorVirtual(hSector))
|
||
{
|
||
HIE_bIntersectSegmentWithFirstSuperObject(&g_stCollideParameterPoint,&g_stCollideParameterVector, hSector, &g_stCollideResultPoint, &g_stCollideResultVector, &g_hSuperObjectHit);
|
||
}
|
||
}
|
||
}
|
||
|
||
/* if no dynamic detection asked --> return*/
|
||
if (g_ulMode == 0)
|
||
{
|
||
return;
|
||
}
|
||
}
|
||
/* now, dynamic world...*/
|
||
/* test on an actor, so set global mask not to check SPO shadow flag :*/
|
||
g_ulSpoMask = 0;
|
||
/* look in current sector first !*/
|
||
SECT_M_ForEachCharListInSector(hSector1,hCharacterList,i)
|
||
{
|
||
hCurrentPerso = SECT_GetCharacterInList(hCharacterList);
|
||
/* if perso to detect is the perso that asked detection, don't detect*/
|
||
if (hCurrentPerso != hSender)
|
||
{
|
||
if ( (fn_ulStandardGameGetCustomBitsSO(hCurrentPerso) & GAM_C_CustBitRayHit) && /* hit by ray tracing*/
|
||
(fn_bf1StandardGameGetIsActive(M_GetMSHandle(hCurrentPerso,StandardGame))) ) /* active*/
|
||
{
|
||
if (HIE_bIntersectSegmentWithFirstSuperObject (&g_stCollideParameterPoint, &g_stCollideParameterVector,hCurrentPerso,&g_stCollideResultPoint, &g_stCollideResultVector, &hSuperObjectHit))
|
||
{
|
||
bDynamCollide = TRUE;
|
||
/* dynamic collision detected --> return the actor !*/
|
||
while (HIE_fn_bIsSuperObjectValid (hSuperObjectHit) && HIE_fn_ulGetSuperObjectType(hSuperObjectHit)!=HIE_C_ulActor)
|
||
{
|
||
/* while superobjecthit is not an actor, seek */
|
||
hSuperObjectHit = HIE_fn_hGetSuperObjectFather(hSuperObjectHit);
|
||
}
|
||
/* if we arrived to an actor --> return it !*/
|
||
if (HIE_fn_bIsSuperObjectValid (hSuperObjectHit))
|
||
g_hSuperObjectHit = hSuperObjectHit;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
/* if dynam collision in first sector --> stop*/
|
||
/* FBF correction pb detection*/
|
||
/* if (bDynamCollide)
|
||
return;
|
||
*/
|
||
|
||
/* look in every active sector...*/
|
||
SECT_M_ForEachActivityNodeInActivityInteractionList(hSector1,hInterList,i)
|
||
{
|
||
MTH3D_tdstVector stMin, stMax;
|
||
SECT_tdxHandleOfSectorObject hSectorObject;
|
||
|
||
hSector = SECT_GetSectorInActivityList(hInterList);
|
||
hSectorObject = (SECT_tdxHandleOfSectorObject) HIE_fn_hGetSuperObjectObject(hSector);
|
||
/* if the sector border is not in intersection with the segment, don't scan its characters*/
|
||
/* get the border box of the sector*/
|
||
SECT_fn_vGetMinPointInBorder(hSectorObject, &stMin);
|
||
SECT_fn_vGetMaxPointInBorder(hSectorObject, &stMax);
|
||
if (INT_fn_bDetectIntersectSegmentWithBox ( &g_stCollideParameterPoint,&g_stCollideParameterVector,&stMin,&stMax,NULL))
|
||
{
|
||
/* ok, intersection between sector border and segment, so scan characters*/
|
||
SECT_M_ForEachCharListInSector(hSector,hCharacterList,j)
|
||
{
|
||
hCurrentPerso = SECT_GetCharacterInList(hCharacterList);
|
||
if (hCurrentPerso != hSender)
|
||
{
|
||
if ( (fn_ulStandardGameGetCustomBitsSO(hCurrentPerso) & GAM_C_CustBitRayHit) && /* hit by ray tracing*/
|
||
(fn_bf1StandardGameGetIsActive(M_GetMSHandle(hCurrentPerso,StandardGame))) ) /* active*/
|
||
{
|
||
if (HIE_bIntersectSegmentWithFirstSuperObject (&g_stCollideParameterPoint, &g_stCollideParameterVector,hCurrentPerso,&g_stCollideResultPoint, &g_stCollideResultVector, &hSuperObjectHit))
|
||
{
|
||
/* dynamic collision detected --> return the actor !*/
|
||
while (HIE_fn_bIsSuperObjectValid (hSuperObjectHit) && HIE_fn_ulGetSuperObjectType(hSuperObjectHit)!=HIE_C_ulActor)
|
||
{
|
||
/* while superobjecthit is not an actor, seek */
|
||
hSuperObjectHit = HIE_fn_hGetSuperObjectFather(hSuperObjectHit);
|
||
}
|
||
/* if we arrived to an actor --> return it !*/
|
||
if (HIE_fn_bIsSuperObjectValid (hSuperObjectHit))
|
||
g_hSuperObjectHit = hSuperObjectHit;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
/*ANNECY CG {*/
|
||
/***************************************************************************
|
||
* Function : PAD_VitessePadAnalogique *
|
||
* Use : Entier Angle = FUN_VitessePadAnalogique( Entier X, Entier Y ) *
|
||
* Author : Christophe Giraud *
|
||
* Date of last modification: 20/02/98 *
|
||
***************************************************************************/
|
||
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
tdstNodeInterpret *fn_p_stCode4VitessePadAnalogique(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
enum tdeFuncId_ eFuncId=M_eFuncIdInterpret(p_stTree-1);
|
||
|
||
switch(eFuncId)
|
||
{
|
||
case eFunc_VitessePadAnalogique:
|
||
{
|
||
long lSpeedFromIA;
|
||
MTH_tdxReal xXvalue,
|
||
xYvalue,
|
||
xSpeedX,
|
||
xSpeedY;
|
||
MTH3D_tdstVector stSpeedVector;
|
||
|
||
/* Get X Value*/
|
||
M_EvalNextParameter(p_stValue);
|
||
xYvalue = MTH_M_xNeg( M_ReturnParam_xValue(p_stValue) );
|
||
|
||
/* Get Y Value*/
|
||
M_EvalNextParameter(p_stValue);
|
||
xXvalue = MTH_M_xNeg( M_ReturnParam_xValue(p_stValue) );
|
||
|
||
/* Get Speed for x or z value (ex: VitesseMarcheVarappe)*/
|
||
M_EvalNextParameter(p_stValue);
|
||
lSpeedFromIA = M_ReturnParam_lValue(p_stValue);
|
||
|
||
/* Compute Speed X*/
|
||
xSpeedX = MTH_M_xMul( lSpeedFromIA, MTH_M_xDiv( xXvalue, 100 ) );
|
||
|
||
/* Compute Speed Y*/
|
||
xSpeedY = MTH_M_xMul( lSpeedFromIA, MTH_M_xDiv( xYvalue, 100 ) );
|
||
|
||
/* Compute Speed Vector*/
|
||
MTH3D_M_vNullVector( &stSpeedVector );
|
||
MTH3D_M_vSetXofVector( &stSpeedVector, xSpeedX );
|
||
MTH3D_M_vSetZofVector( &stSpeedVector, xSpeedY );
|
||
MTH3D_M_vNormalizeVector( &stSpeedVector, &stSpeedVector )
|
||
MTH3D_M_vMulScalarVector( &stSpeedVector, lSpeedFromIA, &stSpeedVector );
|
||
|
||
/*MTH3D_M_xNormVector( &stSpeedVector );*/
|
||
M_Full_GetSetParam_p_stVertex( p_stValue, &stSpeedVector );
|
||
}
|
||
return p_stTree;
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
|
||
}
|
||
|
||
|
||
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
M_AIFatalError(E_uwAIFatalNotValidFunction);
|
||
#endif
|
||
return(p_stTree);
|
||
|
||
}
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
|
||
/***********************************************************************
|
||
* Function : Vecteur = ZON_LitCentreZDM *
|
||
* Use : Vecteur = ZON_LitCentreZDM( ZDM ) *
|
||
* Function : Vecteur = ZON_LitCentreZDE *
|
||
* Use : Vecteur = ZON_LitCentreZDE( ZDE ) *
|
||
* Function : Vecteur = ZON_LitCentreZDD *
|
||
* Use : Vecteur = ZON_LitCentreZDD( ZDD ) *
|
||
* Author : Christophe Giraud *
|
||
* Date of last modification: 21/01/98 *
|
||
***********************************************************************/
|
||
tdstNodeInterpret *fn_p_stCode4LitCentreZDx(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
tdstGetSetParam stParam; /* exchange structure*/
|
||
HIE_tdxHandleToSuperObject hPerso; /* Handle of the character*/
|
||
ACP_tdxHandleOfObject hGeoObj; /* Handle of the geometric object*/
|
||
long lZoneNumber; /* Number of the zone*/
|
||
MTH3D_tdstVector stVectorMin,
|
||
stVectorMax;
|
||
ACP_tdxIndex xMaxPoint,
|
||
xMinPoint;
|
||
|
||
enum tdeFuncId_ eFuncId = M_eFuncIdInterpret(p_stTree-1);
|
||
|
||
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
fn_vGetUltraOperatorPerso(fn_ucGetFunctionUltraOperator(eFuncId),p_SuperObjPerso,&hPerso);
|
||
|
||
/* Get second parameter that is a ZDM*/
|
||
M_EvalNextParameter( &stParam );
|
||
lZoneNumber = (long) M_GetSetParam_lZDMIdValue( &stParam );
|
||
|
||
|
||
switch( eFuncId )
|
||
{
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
case eFunc_LitCentreZDM:
|
||
/* Get handle about geometric object of the ZDM*/
|
||
hGeoObj = fn_hGetGeometricZdxOfTypeAtIndex( C_ucTypeZdm, (unsigned short)(lZoneNumber-1), hPerso );
|
||
break;
|
||
|
||
case eFunc_LitCentreZDE:
|
||
/* Get handle about geometric object of the ZDE*/
|
||
hGeoObj = fn_hGetGeometricZdxOfTypeAtIndex( C_ucTypeZde, (unsigned short)(lZoneNumber-1), hPerso );
|
||
break;
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
|
||
case eFunc_LitCentreZDD:
|
||
/* Get handle about geometric object of the ZDD*/
|
||
hGeoObj = fn_hGetGeometricZdxOfTypeAtIndex( C_ucTypeZdd, (unsigned short)(lZoneNumber-1), hPerso );
|
||
break;
|
||
|
||
default:
|
||
/* Function does not existe*/
|
||
M_AIFatalError(E_uwAIFatalNotValidFunction);
|
||
return(p_stTree);
|
||
break;
|
||
}
|
||
|
||
if( hGeoObj )
|
||
{
|
||
switch( *hGeoObj->d_xListOfElementsTypes )
|
||
{
|
||
case GEO_C_xElementPoints: /* It's a point:*/
|
||
case GEO_C_xElementSpheres: /* It's a sphere:*/
|
||
{
|
||
/* Return the center*/
|
||
M_Full_GetSetParam_p_stVertex( p_stValue, &hGeoObj->d_stListOfPoints[0] );
|
||
}
|
||
break;
|
||
|
||
case GEO_C_xElementAlignedBoxes: /* It's a box.*/
|
||
{
|
||
/* Get MinPoint and MaxPoint of the box*/
|
||
GEO_vGetMinMaxPointOfIndexedAlignedBox( hGeoObj, 0, 0, &xMinPoint, &xMaxPoint );
|
||
|
||
/* Get MinVector and MaxVector of the box*/
|
||
GEO_vGetPointOfObject( hGeoObj, &stVectorMin, xMinPoint );
|
||
GEO_vGetPointOfObject( hGeoObj, &stVectorMax, xMaxPoint );
|
||
|
||
/* Compute center*/
|
||
MTH3D_M_vMiddleVector( &stVectorMin, &stVectorMin, &stVectorMax );
|
||
|
||
/* Return vector*/
|
||
M_Full_GetSetParam_p_stVertex( p_stValue, &stVectorMin );
|
||
}
|
||
break;
|
||
|
||
default:
|
||
{
|
||
/* Return a null vector*/
|
||
MTH3D_M_vNullVector( &stVectorMin );
|
||
M_Full_GetSetParam_p_stVertex( p_stValue, &stVectorMin );
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
/* Return a null vector*/
|
||
MTH3D_M_vNullVector( &stVectorMin );
|
||
M_Full_GetSetParam_p_stVertex( p_stValue, &stVectorMin );
|
||
}
|
||
|
||
return(p_stTree);
|
||
|
||
}
|
||
/**************************************************************************
|
||
* Function : Vecteur = ZON_LitDimensionZDM *
|
||
* Use : Vecteur = ZON_LitDimensionZDM( ZDM ) *
|
||
* Function : Vecteur = ZON_LitDimensionZDE *
|
||
* Use : Vecteur = ZON_LitDimensionZDE( ZDE ) *
|
||
* Function : Vecteur = ZON_LitDimensionZDD *
|
||
* Use : Vecteur = ZON_LitDimensionZDD( ZDD ) *
|
||
* Author : Yann Le Guyader *
|
||
* Date of last modification: 09/03/98 *
|
||
***************************************************************************/
|
||
tdstNodeInterpret *fn_p_stCode4LitDimensionZDx(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
tdstGetSetParam stParam; /* exchange structure*/
|
||
HIE_tdxHandleToSuperObject hPerso; /* Handle of the character*/
|
||
ACP_tdxHandleOfObject hGeoObj; /* Handle of the geometric object*/
|
||
long lZoneNumber; /* Number of the zone*/
|
||
MTH3D_tdstVector stVectorMin,
|
||
stVectorMax;
|
||
ACP_tdxIndex xMaxPoint,
|
||
xMinPoint;
|
||
|
||
enum tdeFuncId_ eFuncId = M_eFuncIdInterpret(p_stTree-1);
|
||
|
||
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
fn_vGetUltraOperatorPerso(fn_ucGetFunctionUltraOperator(eFuncId),p_SuperObjPerso,&hPerso);
|
||
|
||
/* Get First parameter that is a ZDM*/
|
||
M_EvalNextParameter( &stParam );
|
||
lZoneNumber = (long) M_GetSetParam_lZDMIdValue( &stParam );
|
||
|
||
|
||
switch( eFuncId )
|
||
{
|
||
case eFunc_LitDimensionZDM:
|
||
/* Get handle about geometric object of the ZDM*/
|
||
hGeoObj = fn_hGetGeometricZdxOfTypeAtIndex( C_ucTypeZdm, (unsigned short)(lZoneNumber-1), hPerso );
|
||
break;
|
||
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
case eFunc_LitDimensionZDE:
|
||
/* Get handle about geometric object of the ZDE*/
|
||
hGeoObj = fn_hGetGeometricZdxOfTypeAtIndex( C_ucTypeZde, (unsigned short)(lZoneNumber-1), hPerso );
|
||
break;
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
|
||
case eFunc_LitDimensionZDD:
|
||
/* Get handle about geometric object of the ZDD*/
|
||
hGeoObj = fn_hGetGeometricZdxOfTypeAtIndex( C_ucTypeZdd, (unsigned short)(lZoneNumber-1), hPerso );
|
||
break;
|
||
|
||
default:
|
||
{
|
||
/* Function does not existe*/
|
||
M_AIFatalError(E_uwAIFatalNotValidFunction);
|
||
return(p_stTree);
|
||
break;
|
||
}
|
||
}
|
||
|
||
if( hGeoObj )
|
||
{
|
||
switch( *hGeoObj->d_xListOfElementsTypes )
|
||
{
|
||
case GEO_C_xElementSpheres: /* It's a sphere:*/
|
||
{
|
||
MTH_tdxReal xRadius;
|
||
xRadius = GEO_xGetRadiusOfIndexedSphere(hGeoObj, 0, 0);
|
||
MTH3D_M_vSetVectorElements(&stVectorMin, xRadius, xRadius, xRadius);
|
||
}
|
||
break;
|
||
|
||
case GEO_C_xElementAlignedBoxes: /* It's a box.*/
|
||
{
|
||
/* Get MinPoint and MaxPoint of the box*/
|
||
GEO_vGetMinMaxPointOfIndexedAlignedBox( hGeoObj, 0, 0, &xMinPoint, &xMaxPoint );
|
||
|
||
/* Get MinVector and MaxVector of the box*/
|
||
GEO_vGetPointOfObject( hGeoObj, &stVectorMin, xMinPoint );
|
||
GEO_vGetPointOfObject( hGeoObj, &stVectorMax, xMaxPoint );
|
||
|
||
MTH3D_M_vSetVectorElements(&stVectorMin,
|
||
MTH_M_xAbs(MTH_M_xSub(stVectorMin.xX,stVectorMax.xX)),
|
||
MTH_M_xAbs(MTH_M_xSub(stVectorMin.xY,stVectorMax.xY)),
|
||
MTH_M_xAbs(MTH_M_xSub(stVectorMin.xZ,stVectorMax.xZ)));
|
||
}
|
||
break;
|
||
|
||
default:
|
||
{
|
||
/* Return a null vector*/
|
||
MTH3D_M_vNullVector( &stVectorMin );
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
MTH3D_M_vNullVector( &stVectorMin );
|
||
}
|
||
/* Return a null vector*/
|
||
M_Full_GetSetParam_p_stVertex( p_stValue, &stVectorMin );
|
||
return(p_stTree);
|
||
|
||
}
|
||
|
||
|
||
/***********************************************************************
|
||
* Function : Vecteur = ZON_LitAxeZDM *
|
||
* Use : Vecteur = ZON_LitAxeZDM( Perso, ZDM ) *
|
||
* Function : Vecteur = ZON_LitAxeZDE *
|
||
* Use : Vecteur = ZON_LitAxeZDE( Perso, ZDE ) *
|
||
* Function : Vecteur = ZON_LitAxeZDD *
|
||
* Use : Vecteur = ZON_LitAxeZDD( Perso, ZDD ) *
|
||
* Author : Christophe Giraud *
|
||
* Date of last modification: 23/01/98 *
|
||
***********************************************************************/
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
tdstNodeInterpret *fn_p_stCode4LitAxeZDx(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
tdstGetSetParam stParam; /* exchange structure*/
|
||
HIE_tdxHandleToSuperObject hPerso; /* Handle of the character*/
|
||
ACP_tdxHandleOfObject hGeoObj; /* Handle of the geometric object*/
|
||
long lZoneNumber, /* Number of the zone*/
|
||
lLocalGlobal;
|
||
MTH_tdxReal fMinX,
|
||
fMinY,
|
||
fMinZ,
|
||
fMaxX,
|
||
fMaxY,
|
||
fMaxZ;
|
||
MTH3D_tdstVector stVectorMin,
|
||
stVectorMax,
|
||
stAxisVector;
|
||
ACP_tdxIndex xMaxPoint,
|
||
xMinPoint;
|
||
|
||
enum tdeFuncId_ eFuncId = M_eFuncIdInterpret(p_stTree-1);
|
||
|
||
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
fn_vGetUltraOperatorPerso(fn_ucGetFunctionUltraOperator(eFuncId),p_SuperObjPerso,&hPerso);
|
||
|
||
/* Get second parameter that is a ZDM*/
|
||
M_EvalNextParameter( &stParam );
|
||
lZoneNumber = (long) M_GetSetParam_lZDMIdValue( &stParam );
|
||
|
||
/* Get third parameter that is a Boolean*/
|
||
M_EvalNextParameter(p_stValue);
|
||
lLocalGlobal = M_GetSetParam_lValue(p_stValue);
|
||
|
||
switch( eFuncId )
|
||
{
|
||
case eFunc_LitAxeZDM:
|
||
/* Get handle about geometric object of the ZDM*/
|
||
hGeoObj = fn_hGetGeometricZdxOfTypeAtIndex( C_ucTypeZdm, (unsigned short)(lZoneNumber-1), hPerso );
|
||
break;
|
||
|
||
case eFunc_LitAxeZDE:
|
||
/* Get handle about geometric object of the ZDE*/
|
||
hGeoObj = fn_hGetGeometricZdxOfTypeAtIndex( C_ucTypeZde, (unsigned short)(lZoneNumber-1), hPerso );
|
||
break;
|
||
|
||
case eFunc_LitAxeZDD:
|
||
/* Get handle about geometric object of the ZDD*/
|
||
hGeoObj = fn_hGetGeometricZdxOfTypeAtIndex( C_ucTypeZdd, (unsigned short)(lZoneNumber-1), hPerso );
|
||
break;
|
||
|
||
default:
|
||
{
|
||
/* Function does not existe*/
|
||
M_AIFatalError(E_uwAIFatalNotValidFunction);
|
||
return(p_stTree);
|
||
break;
|
||
}
|
||
}
|
||
|
||
/* Initialize to 0, 0, 0*/
|
||
MTH3D_M_vNullVector( &stAxisVector );
|
||
|
||
if( hGeoObj )
|
||
{
|
||
switch( *hGeoObj->d_xListOfElementsTypes )
|
||
{
|
||
case GEO_C_xElementAlignedBoxes: /* It's a box.*/
|
||
{
|
||
/* Get MinPoint and MaxPoint of the box*/
|
||
GEO_vGetMinMaxPointOfIndexedAlignedBox( hGeoObj, 0, 0, &xMinPoint, &xMaxPoint );
|
||
|
||
/* Get MinVector and MaxVector of the box*/
|
||
GEO_vGetPointOfObject( hGeoObj, &stVectorMin, xMinPoint );
|
||
GEO_vGetPointOfObject( hGeoObj, &stVectorMax, xMaxPoint );
|
||
|
||
/* Get all points of MinVector and MaxVector*/
|
||
MTH3D_M_vGetVectorElements(&fMinX,&fMinY,&fMinZ,&stVectorMin);
|
||
MTH3D_M_vGetVectorElements(&fMaxX,&fMaxY,&fMaxZ,&stVectorMax);
|
||
|
||
/* Get lenght for X, Y, Z*/
|
||
fMaxX -= fMinX;
|
||
fMaxY -= fMinY;
|
||
fMaxZ -= fMinZ;
|
||
|
||
/* Set normed Axis of the box*/
|
||
if ( fMaxX>fMaxY && fMaxX>fMaxZ )
|
||
{
|
||
MTH3D_M_vSetXofVector( &stAxisVector, 1.0f );
|
||
}
|
||
|
||
if ( fMaxY>fMaxX && fMaxY>fMaxZ )
|
||
{
|
||
MTH3D_M_vSetYofVector( &stAxisVector, 1.0f );
|
||
}
|
||
|
||
if ( fMaxZ>fMaxX && fMaxZ>fMaxY )
|
||
{
|
||
MTH3D_M_vSetZofVector( &stAxisVector, 1.0f );
|
||
}
|
||
}
|
||
break;
|
||
|
||
default:
|
||
{
|
||
/* Return a null vector*/
|
||
MTH3D_M_vNullVector( &stVectorMin );
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
/* Return a null vector*/
|
||
MTH3D_M_vNullVector( &stVectorMin );
|
||
}
|
||
|
||
|
||
if ( lLocalGlobal == TRUE )
|
||
{
|
||
GEO_tdxHandleToMatrix hMatrix;
|
||
|
||
/* get character local matrix */
|
||
hMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(p_SuperObjPerso);
|
||
|
||
/* compute the global vector */
|
||
POS_fn_vRotateVector(&stAxisVector,hMatrix, &stAxisVector);
|
||
}
|
||
|
||
/* Return vector*/
|
||
M_Full_GetSetParam_p_stVertex( p_stValue, &stAxisVector );
|
||
|
||
return(p_stTree);
|
||
|
||
}
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
|
||
|
||
|
||
/********************************************************************
|
||
* Function : Vecteur = Func_VecteurPointAxe() *
|
||
* Function : Vecteur = Func_VecteurPointSegment(point, debut, dir) *
|
||
* Use : Vecteur = Func_VecteurPointAxe( point, SegDebut, SegFin) *
|
||
* Date of last modification: 10/02/98 *
|
||
********************************************************************/
|
||
tdstNodeInterpret *fn_p_stCode4VecteurPointAxe(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
tdstGetSetParam stParam1, stParam2, stParam3; /* exchange structure*/
|
||
MTH3D_tdstVector stvVector, stdVector, stOMVector, *p_stMVector, *p_stOVector, *p_stuVector;
|
||
enum tdeFuncId_ eFuncId = M_eFuncIdInterpret(p_stTree-1);
|
||
|
||
/*
|
||
-> ->
|
||
u v
|
||
O --------->-------> P
|
||
\ Q|
|
||
\ |
|
||
\ | ->
|
||
\ | d
|
||
\ |
|
||
\ |
|
||
\ |
|
||
\ |
|
||
\|
|
||
M
|
||
*/
|
||
|
||
/* Get first parameter : Point M*/
|
||
M_EvalNextParameter( &stParam1 );
|
||
p_stMVector = &M_GetSetParam_stVectorValue( &stParam1 );
|
||
|
||
/* Get second parameter : First extremity of segment O*/
|
||
M_EvalNextParameter( &stParam2 );
|
||
p_stOVector = &M_GetSetParam_stVectorValue( &stParam2 );
|
||
|
||
/* Get second parameter : second extremity of segment P / direction vector*/
|
||
M_EvalNextParameter( &stParam3 );
|
||
p_stuVector = &M_GetSetParam_stVectorValue( &stParam3 );
|
||
|
||
switch( eFuncId )
|
||
{
|
||
case eFunc_VecteurPointSegment:
|
||
{
|
||
MTH_tdxReal xNormOP, xNormV;
|
||
MTH3D_tdstVector stPVector = *p_stuVector; /*save the position of the far extremity, in case we need it*/
|
||
|
||
/* Compute Vector OM*/
|
||
MTH3D_M_vSubVector( &stOMVector, p_stMVector, p_stOVector );
|
||
|
||
/*transform into vector from O to P (normalized)*/
|
||
MTH3D_M_vSubVector(p_stuVector, p_stuVector, p_stOVector);
|
||
if
|
||
(
|
||
MTH_M_bIsNullWithEpsilon(MTH3D_M_xGetXofVector(p_stuVector), MTH_M_xDoubleToReal(1.0e-4))
|
||
&& MTH_M_bIsNullWithEpsilon(MTH3D_M_xGetYofVector(p_stuVector), MTH_M_xDoubleToReal(1.0e-4))
|
||
&& MTH_M_bIsNullWithEpsilon(MTH3D_M_xGetZofVector(p_stuVector), MTH_M_xDoubleToReal(1.0e-4))
|
||
)
|
||
{
|
||
/*segment is of null length: return the vector from our position to either point*/
|
||
MTH3D_M_vNegVector(&stdVector, &stOMVector);
|
||
}
|
||
else
|
||
{
|
||
/* remember the segment length*/
|
||
xNormOP = MTH3D_M_xNormVector(p_stuVector);
|
||
MTH3D_M_vNormalizeVector(p_stuVector, p_stuVector);
|
||
|
||
/* See if OQ and OP look the same way*/
|
||
xNormV = MTH3D_M_xDotProductVector(&stOMVector, p_stuVector); /* |OM|.cos (because |OP| = |u| = 1)*/
|
||
/* Compute d = MQ*/
|
||
if ( MTH_M_bLessZero(xNormV) ) /* closest point on the line is beyond the first extremity of the segment*/
|
||
{
|
||
/* vector goes from M to O*/
|
||
MTH3D_M_vNegVector(&stdVector, &stOMVector);
|
||
}
|
||
else
|
||
{
|
||
/*compute v = OQ*/
|
||
MTH3D_M_vMulScalarVector(&stvVector, xNormV, p_stuVector); /* v = |OM|.cos = OQ*/
|
||
/* get the length of the segment from O to the closest point*/
|
||
if ( MTH_M_bGreater(xNormV, xNormOP)) /* closest point on the line is beyond the second extremity of the segment*/
|
||
{
|
||
/*vector goes from M to P*/
|
||
MTH3D_M_vSubVector( &stdVector, &stPVector, p_stMVector);
|
||
}
|
||
else /* closest point is really on the segment*/
|
||
{
|
||
/* vector goes from M to Q : d = OQ - OM = MQ*/
|
||
MTH3D_M_vSubVector( &stdVector, &stvVector, &stOMVector);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
|
||
//#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
case eFunc_VecteurPointAxe:
|
||
{
|
||
/* Compute Vector OM*/
|
||
MTH3D_M_vSubVector( &stOMVector, p_stMVector, p_stOVector );
|
||
|
||
/* Compute v*/
|
||
if
|
||
(
|
||
MTH_M_bIsNullWithEpsilon(MTH3D_M_xGetXofVector(p_stuVector), MTH_M_xDoubleToReal(1.0e-4))
|
||
&& MTH_M_bIsNullWithEpsilon(MTH3D_M_xGetYofVector(p_stuVector), MTH_M_xDoubleToReal(1.0e-4))
|
||
&& MTH_M_bIsNullWithEpsilon(MTH3D_M_xGetZofVector(p_stuVector), MTH_M_xDoubleToReal(1.0e-4))
|
||
)
|
||
{
|
||
/*if the axis direction is not valid, return NULL*/
|
||
MTH3D_M_vNullVector(&stdVector);
|
||
}
|
||
else
|
||
{
|
||
MTH_tdxReal xTmp;
|
||
MTH3D_M_vNormalizeVector(p_stuVector, p_stuVector); /* normalize axis direction*/
|
||
xTmp = MTH3D_M_xDotProductVector(&stOMVector, p_stuVector);
|
||
MTH3D_M_vMulScalarVector(&stvVector, xTmp, p_stuVector);
|
||
/* Compute d, du point vers le segment*/
|
||
MTH3D_M_vSubVector( &stdVector, &stvVector, &stOMVector);
|
||
}
|
||
}
|
||
break;
|
||
//#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
|
||
default:
|
||
{
|
||
/* Function does not existe*/
|
||
M_AIFatalError(E_uwAIFatalNotValidFunction);
|
||
return(p_stTree);
|
||
break;
|
||
}
|
||
}
|
||
|
||
/* Return vector*/
|
||
M_Full_GetSetParam_p_stVertex( p_stValue, &stdVector );
|
||
|
||
return(p_stTree);
|
||
|
||
}
|
||
|
||
/*******************************************************************
|
||
* Function : LitPositionZDM *
|
||
* Use : LitPositionZDM( Perso, ZDM ) *
|
||
* Function : LitPositionZDE *
|
||
* Use : LitPositionZDE( Perso, ZDE ) *
|
||
* Function : LitPositionZDD *
|
||
* Use : LitPositionZDD( Perso, ZDD ) *
|
||
* Author : Christophe Giraud *
|
||
* Date of last modification: 06/03/98 *
|
||
*******************************************************************/
|
||
tdstNodeInterpret *fn_p_stCode4LitPositionZDx(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
tdstGetSetParam stParam; /* exchange structure*/
|
||
HIE_tdxHandleToSuperObject hPerso; /* Handle of the character*/
|
||
ACP_tdxHandleOfObject hGeoObj; /* Handle of the geometric object*/
|
||
long lZoneNumber; /* Number of the zone*/
|
||
MTH3D_tdstVector stVectorMin;
|
||
ACP_tdxIndex xMaxPoint,
|
||
xMinPoint;
|
||
|
||
enum tdeFuncId_ eFuncId = M_eFuncIdInterpret(p_stTree-1);
|
||
|
||
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
fn_vGetUltraOperatorPerso(fn_ucGetFunctionUltraOperator(eFuncId),p_SuperObjPerso,&hPerso);
|
||
|
||
/* Get second parameter that is a ZDM*/
|
||
M_EvalNextParameter( &stParam );
|
||
lZoneNumber = (long) M_GetSetParam_lZDMIdValue( &stParam );
|
||
|
||
|
||
switch( eFuncId )
|
||
{
|
||
case eFunc_LitPositionZDM:
|
||
/* Get handle about goemetric object of the ZDM*/
|
||
hGeoObj = fn_hGetGeometricZdxOfTypeAtIndex( C_ucTypeZdm, (unsigned short)(lZoneNumber-1), hPerso );
|
||
break;
|
||
|
||
case eFunc_LitPositionZDE:
|
||
/* Get handle about goemetric object of the ZDE*/
|
||
hGeoObj = fn_hGetGeometricZdxOfTypeAtIndex( C_ucTypeZde, (unsigned short)(lZoneNumber-1), hPerso );
|
||
break;
|
||
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
case eFunc_LitPositionZDD:
|
||
/* Get handle about goemetric object of the ZDD*/
|
||
hGeoObj = fn_hGetGeometricZdxOfTypeAtIndex( C_ucTypeZdd, (unsigned short)(lZoneNumber-1), hPerso );
|
||
break;
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
|
||
default:
|
||
{
|
||
/* Function does not existe*/
|
||
M_AIFatalError(E_uwAIFatalNotValidFunction);
|
||
return(p_stTree);
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
/*
|
||
if( hGeoObj )
|
||
{
|
||
// Return position of the zone
|
||
M_Full_GetSetParam_p_stVertex( p_stValue, &hGeoObj->d_stListOfPoints[0] );
|
||
return(p_stTree);
|
||
}
|
||
*/
|
||
|
||
/* Move geometric object*/
|
||
if( hGeoObj )
|
||
{
|
||
switch( *hGeoObj->d_xListOfElementsTypes )
|
||
{
|
||
case GEO_C_xElementPoints: /* It's a point:*/
|
||
case GEO_C_xElementSpheres: /* It's a sphere:*/
|
||
M_Full_GetSetParam_p_stVertex( p_stValue, &hGeoObj->d_stListOfPoints[0] );
|
||
return(p_stTree);
|
||
break;
|
||
|
||
|
||
case GEO_C_xElementAlignedBoxes: /* It's a box.*/
|
||
case GEO_C_xElementCones: /* It's a cone:*/
|
||
/* Get MinPoint and MaxPoint of the box*/
|
||
GEO_vGetMinMaxPointOfIndexedAlignedBox ( hGeoObj, 0, 0, &xMinPoint, &xMaxPoint );
|
||
|
||
/* Get MinVector and MaxVector of the box*/
|
||
GEO_vGetPointOfObject( hGeoObj, &stVectorMin, xMinPoint );
|
||
|
||
M_Full_GetSetParam_p_stVertex( p_stValue, &stVectorMin );
|
||
return(p_stTree);
|
||
break;
|
||
}
|
||
}
|
||
|
||
return(p_stTree);
|
||
|
||
}
|
||
|
||
|
||
/*******************************************************************
|
||
* Function: VitesseHorizontaleDuPerso *
|
||
* Use : "perso".VitesseHorizontaleDuPerso( Number of frames ) *
|
||
* Function: VitesseVerticaleDuPerso *
|
||
* Use : "perso".VitesseVerticaleDuPerso( Number of frames ) *
|
||
* Use for : Return the value of the global speed for N frames *
|
||
* Author : Christophe Giraud *
|
||
* Date of last modification: 17/10/97 *
|
||
*******************************************************************/
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
|
||
tdstNodeInterpret *fn_p_stCode4VitesseHorizontaleDuPerso(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
DNM_tdstReport *p_stDynamReport;
|
||
/* MTH3D_tdstVector stSpeed; // Vector for average speed*/
|
||
MTH_tdxReal xValue = 0; /* Variable to stock the return value of the function*/
|
||
/* xNumberOfFrames; // Number of frames wanted to compute global speed*/
|
||
/* tdstGetSetParam stParam ; // Structure d'<27>change*/
|
||
enum tdeFuncId_ eFuncId=M_eFuncIdInterpret(p_stTree-1);
|
||
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
HIE_tdxHandleToSuperObject hNewSuperObjPerso;
|
||
fn_vGetUltraOperatorPerso(fn_ucGetFunctionUltraOperator(eFuncId),p_SuperObjPerso,&hNewSuperObjPerso);
|
||
|
||
if ( (p_stDynamReport = fn_pstGetDNMReport(hNewSuperObjPerso)) == NULL )
|
||
{
|
||
return p_stTree;
|
||
}
|
||
|
||
switch(eFuncId)
|
||
{
|
||
case eFunc_VitesseHorizontaleDuPerso:
|
||
{
|
||
|
||
/* ANNECY MT - 25/08/98 {
|
||
// Evaluation of next parameter
|
||
M_EvalNextParameter( &stParam );
|
||
|
||
// Get number of frames
|
||
xNumberOfFrames = (MTH_tdxReal) (M_ReturnParam_lValue( &stParam )<<4);
|
||
|
||
// Use AverageSpeed and norm vector without Z
|
||
fn_vAverageSpeed( p_SuperObjPerso, xNumberOfFrames, &stSpeed );
|
||
xValue = MTH_M_xSqrt( MTH_M_xAdd( MTH_M_xSqr(stSpeed.xX), MTH_M_xSqr(stSpeed.xY) ));
|
||
END ANNECY MT } */
|
||
|
||
/* On informe le moteur sur le type et la valeur calcul<75>e.*/
|
||
M_Full_GetSetParam_Float(p_stValue, xValue );
|
||
return(p_stTree);
|
||
break;
|
||
}
|
||
|
||
case eFunc_VitesseVerticaleDuPerso:
|
||
{
|
||
/* ANNECY MT - 25/08/98 {
|
||
// Evaluation of next parameter
|
||
M_EvalNextParameter( &stParam );
|
||
|
||
// Get number of frames
|
||
xNumberOfFrames = (MTH_tdxReal) (M_ReturnParam_lValue( &stParam )<<4);
|
||
|
||
// Use AverageSpeed and norm vector without Z
|
||
fn_vAverageSpeed( p_SuperObjPerso, xNumberOfFrames, &stSpeed );
|
||
xValue = stSpeed.xZ;
|
||
END ANNECY MT } */
|
||
|
||
/* On informe le moteur sur le type et la valeur calcul<75>e.*/
|
||
M_Full_GetSetParam_Float(p_stValue, xValue );
|
||
return(p_stTree);
|
||
break;
|
||
}
|
||
|
||
default:
|
||
break;
|
||
}
|
||
|
||
/* La fonction n'existe pas !!*/
|
||
M_AIFatalError(E_uwAIFatalNotValidFunction);
|
||
|
||
/* On informe le moteur sur l'avancement dans l'interpr<70>tation*/
|
||
return(p_stTree);
|
||
}
|
||
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
|
||
|
||
#include "FuncRay2.cxx"
|
||
|
||
|
||
/*ENDANNECY CG }*/
|
||
|
||
/******************************************************************
|
||
* Function: GetDTFunction *
|
||
* Use : LitDT () *
|
||
* Author : Jacques Th<54>noz *
|
||
* optimised by ylt september 18,1998
|
||
* Date of last modification: 21/10/97 *
|
||
******************************************************************/
|
||
tdstNodeInterpret *fn_p_stGetDTFunction(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
M_Full_GetSetParam_Float(p_stValue, MTH_M_xLongToReal(g_stEngineStructure.stEngineTimer.ulUsefulDeltaTime));
|
||
#if 0
|
||
#ifdef ACTIVE_EDITOR
|
||
/*after a 10s stabilisation delay, warn if the useful deltaT is not a frame multiple (a tolerance is accepted)*/
|
||
if ( g_stEngineStructure.stEngineTimer.ulCurrentTimerCount > 10000 )
|
||
{
|
||
/* compute the exact frame change form the delta time*/
|
||
MTH_tdxReal xFrames = MTH_M_xMul(MTH_M_xLongToReal(g_stEngineStructure.stEngineTimer.ulUsefulDeltaTime), MTH_M_xFloatToReal(0.06f));
|
||
/* check this against the closest full frames number*/
|
||
MTH_tdxReal xRounded = MTH_M_xSub(MTH_M_xLongToReal(MTH_M_xRealToLong(MTH_M_xAdd(xFrames, MTH_C_Inv2))), xFrames);
|
||
/* we accept a 10% fluctuation!*/
|
||
if ( MTH_M_bGreater(MTH_M_xAbs(xRounded), MTH_M_xDoubleToReal(0.1)) )
|
||
{
|
||
char szMsg[200];
|
||
sprintf(szMsg, "Erreur interne du moteur: le DeltaT (%d) n'est pas un multiple de la trame (16.66ms)!", g_stEngineStructure.stEngineTimer.ulUsefulDeltaTime);
|
||
SAF_M_AssertWithMsg(FALSE, szMsg);
|
||
}
|
||
}
|
||
#endif /* ACTIVE_EDITOR */
|
||
#endif
|
||
return (p_stTree);
|
||
}
|
||
|
||
|
||
/******************************************************************
|
||
* Function: GetNormalCollideVector *
|
||
* Use : v := VecteurNormalCollision () *
|
||
* Author : J Thenoz *
|
||
* Date of last modification: 20/11/97 *
|
||
******************************************************************/
|
||
tdstNodeInterpret *fn_p_stGetNormalCollideVector(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
enum tdeFuncId_ eFuncId=M_eFuncIdInterpret(p_stTree-1);
|
||
MTH3D_tdstVector stNormalVector;
|
||
DNM_tdstReport *p_stDynamReport;
|
||
DNM_tdstObstacle* p_stObstacle = NULL;
|
||
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
HIE_tdxHandleToSuperObject hNewSuperObjPerso;
|
||
fn_vGetUltraOperatorPerso(fn_ucGetFunctionUltraOperator(eFuncId),p_SuperObjPerso,&hNewSuperObjPerso);
|
||
/********************************************************************************/
|
||
MTH3D_M_vNullVector(&stNormalVector);
|
||
|
||
SAF_M_AssertWithMsg(DNM_M_bDynamicsIsCollisionReport(fn_p_stDynamGetDynamics(M_GetMSHandle(hNewSuperObjPerso,Dynam))), "la m<>canique a besoin du rapport de collisions pour cet appel");
|
||
p_stDynamReport = fn_pstGetDNMReport(hNewSuperObjPerso);
|
||
|
||
switch ( eFuncId )
|
||
{
|
||
case eFunc_GetNormalCollideVector2:
|
||
{
|
||
long lWhichObstacle;
|
||
M_EvalNextParameter(p_stValue);
|
||
lWhichObstacle = M_GetSetParam_lValue(p_stValue);
|
||
switch ( lWhichObstacle )
|
||
{
|
||
default:
|
||
SAF_M_AssertWithMsg(FALSE, "l'obstacle sp<73>cifi<66> n'est pas valide");
|
||
M_Full_GetSetParam_p_stVertex(p_stValue, &stNormalVector);
|
||
return p_stTree;
|
||
break;
|
||
|
||
case 0: /*get the last obstacle (equivalent to original version of the function)*/
|
||
p_stObstacle = DNM_M_p_stReportGetObstacle(p_stDynamReport);
|
||
break;
|
||
|
||
case 1: /*get the last ground*/
|
||
p_stObstacle = DNM_M_p_stReportGetGround(p_stDynamReport);
|
||
break;
|
||
|
||
case 2: /*get the last wall*/
|
||
p_stObstacle = DNM_M_p_stReportGetWall(p_stDynamReport);
|
||
break;
|
||
|
||
case 3: /*get the last character*/
|
||
p_stObstacle = DNM_M_p_stReportGetCharacter(p_stDynamReport);
|
||
break;
|
||
|
||
case 4: /*get the last uncollidable/water plane*/
|
||
p_stObstacle = DNM_M_p_stReportGetWater(p_stDynamReport);
|
||
break;
|
||
|
||
case 5: /* get the last ceiling*/
|
||
p_stObstacle = DNM_M_p_stReportGetCeil(p_stDynamReport);
|
||
break;
|
||
}
|
||
M_Full_GetSetParam_p_stVertex(p_stValue, DNM_M_p_stObstacleGetNorm(p_stObstacle));
|
||
}
|
||
return p_stTree;
|
||
break;
|
||
|
||
case eFunc_GetNormalCollideVector:
|
||
{
|
||
unsigned long ulSurfState = DNM_M_ulReportGetSurfaceState(p_stDynamReport);
|
||
if ( (ulSurfState & C_WOT_ulMobile) == C_WOT_ulMobile )
|
||
{
|
||
p_stObstacle = DNM_M_p_stReportGetCharacter(p_stDynamReport);
|
||
MTH3D_M_vAddVector(&stNormalVector, &stNormalVector, DNM_M_p_stObstacleGetNorm(p_stObstacle));
|
||
}
|
||
if ( (ulSurfState & C_WOT_ulGround) == C_WOT_ulGround )
|
||
{
|
||
p_stObstacle = DNM_M_p_stReportGetGround(p_stDynamReport);
|
||
MTH3D_M_vAddVector(&stNormalVector, &stNormalVector, DNM_M_p_stObstacleGetNorm(p_stObstacle));
|
||
}
|
||
if ( (ulSurfState & C_WOT_ulWall) == C_WOT_ulWall )
|
||
{
|
||
p_stObstacle = DNM_M_p_stReportGetWall(p_stDynamReport);
|
||
MTH3D_M_vAddVector(&stNormalVector, &stNormalVector, DNM_M_p_stObstacleGetNorm(p_stObstacle));
|
||
}
|
||
if ( (ulSurfState & C_WOT_ulWater) == C_WOT_ulWater )
|
||
{
|
||
p_stObstacle = DNM_M_p_stReportGetWater(p_stDynamReport);
|
||
MTH3D_M_vAddVector(&stNormalVector, &stNormalVector, DNM_M_p_stObstacleGetNorm(p_stObstacle));
|
||
}
|
||
if ( (ulSurfState & C_WOT_ulCeiling) == C_WOT_ulCeiling )
|
||
{
|
||
p_stObstacle = DNM_M_p_stReportGetCeil(p_stDynamReport);
|
||
MTH3D_M_vAddVector(&stNormalVector, &stNormalVector, DNM_M_p_stObstacleGetNorm(p_stObstacle));
|
||
}
|
||
if ( ulSurfState == C_WOT_ulNoObstacle )
|
||
{
|
||
p_stObstacle = DNM_M_p_stReportGetObstacle(p_stDynamReport);
|
||
MTH3D_M_vAddVector(&stNormalVector, &stNormalVector, DNM_M_p_stObstacleGetNorm(p_stObstacle));
|
||
}
|
||
if ( !MTH3D_M_bIsNullVector(&stNormalVector) )
|
||
{
|
||
MTH3D_M_vNormalizeVector(&stNormalVector, &stNormalVector);
|
||
}
|
||
M_Full_GetSetParam_p_stVertex(p_stValue,&stNormalVector);
|
||
}
|
||
return p_stTree;
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
M_AIFatalError(E_uwAIFatalNotValidFunction);
|
||
return(p_stTree);
|
||
}
|
||
|
||
/***************************************************************************
|
||
* Function : VecteurNormalSol
|
||
* Use : v := VecteurNormalSol ()
|
||
* Author : Jean-Marc Drouaud
|
||
* Date : 11/12/97
|
||
****************************************************************************/
|
||
/*
|
||
tdstNodeInterpret *fn_p_stGetNormalGroundVector(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
enum tdeFuncId_ eFuncId=M_eFuncIdInterpret(p_stTree-1);
|
||
|
||
if (eFuncId==eFunc_GetNormalGroundVector)
|
||
{
|
||
MTH3D_tdstVector stNormalVector;
|
||
DNM_tdstReport *p_stDynamReport;
|
||
DNM_tdstObstacle *p_stGround;
|
||
|
||
MTH3D_M_vNullVector ( &stNormalVector );
|
||
if ( (p_stDynamReport = fn_pstGetDNMReport(p_SuperObjPerso))!=NULL )
|
||
{
|
||
p_stGround = DNM_M_p_stReportGetGround(p_stDynamReport);
|
||
if (p_stGround)
|
||
MTH3D_M_vCopyVector ( &stNormalVector, DNM_M_p_stObstacleGetNorm (p_stGround) );
|
||
}
|
||
|
||
M_Full_GetSetParam_p_stVertex(p_stValue,&stNormalVector);
|
||
return (p_stTree);
|
||
}
|
||
M_AIFatalError(E_uwAIFatalNotValidFunction);
|
||
return(p_stTree);
|
||
}
|
||
*/
|
||
|
||
/******************************************************************
|
||
* Function: CollideCommunicationFunc *
|
||
* Use : entier := COL_LitTypeDeCollisionneur() *
|
||
* Use : v := COL_LitVecteurDeCollisionneur(index) *
|
||
* Use : reel := COL_LitReelDeCollisionneur(index) *
|
||
* Author : B. Germain *
|
||
* Date of last modification: 20/11/97 *
|
||
******************************************************************/
|
||
tdstNodeInterpret *fn_p_stCollideCommunicationFunc(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
enum tdeFuncId_ eFuncId = M_eFuncIdInterpret(p_stTree-1);
|
||
short wIndex = 0;
|
||
MS_tdxHandleToCollSet _hCollSet;
|
||
|
||
HIE_tdxHandleToSuperObject hNewSuperObjPerso;
|
||
fn_vGetUltraOperatorPerso(fn_ucGetFunctionUltraOperator(eFuncId),p_SuperObjPerso,&hNewSuperObjPerso);
|
||
|
||
_hCollSet = M_GetMSHandle(hNewSuperObjPerso,CollSet);
|
||
|
||
switch ( eFuncId )
|
||
{
|
||
case eFunc_GetColliderType:
|
||
if ( _hCollSet )
|
||
wIndex = fn_ucCollSetGetColliderType(_hCollSet);
|
||
M_Full_GetSetParam_Integer(p_stValue, wIndex);
|
||
break;
|
||
|
||
case eFunc_GetColliderVector:
|
||
{
|
||
/*point directly in the return value's vector field*/
|
||
MTH3D_tdstVector *p_stDstVect = &M_GetSetParam_stVertexValue(p_stValue);
|
||
|
||
M_EvalNextParameter(p_stValue);
|
||
wIndex = M_GetSetParam_wValue(p_stValue);
|
||
|
||
SAF_M_AssertWithMsg((wIndex >= 0) && (wIndex < C_wCollsetNbCollisionVectors), "L'index du vecteur sp<73>cifi<66> n'existe pas!");
|
||
if ( _hCollSet )
|
||
*p_stDstVect = fn_stCollSetGetColliderVector(_hCollSet, wIndex);
|
||
else
|
||
MTH3D_M_vNullVector(p_stDstVect);
|
||
M_GetSetParam_Type(p_stValue) = E_vt_Vector;
|
||
}
|
||
break;
|
||
|
||
case eFunc_GetColliderReal:
|
||
{
|
||
M_EvalNextParameter(p_stValue);
|
||
wIndex = M_GetSetParam_wValue(p_stValue);
|
||
SAF_M_AssertWithMsg((wIndex >= 0) && (wIndex < C_wCollsetNbCollisionReals), "L'index du r<>el sp<73>cifi<66> n'existe pas!");
|
||
M_Full_GetSetParam_Float(p_stValue, _hCollSet ? fn_xCollSetGetColliderReal(_hCollSet, wIndex) : MTH_C_ZERO );
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
return p_stTree;
|
||
}
|
||
|
||
/* ============================================================
|
||
function: GetPersoSighting
|
||
Use : v := ULTRA.ViseePerso()
|
||
author: Yann Le tensorer sept 16, 1998
|
||
==============================================================*/
|
||
tdstNodeInterpret *fn_p_stGetPersoSighting(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
enum tdeFuncId_ eFuncId = M_eFuncIdInterpret(p_stTree-1);
|
||
MTH3D_tdstVector *p_stTmpV0,*p_stTmpV1,*p_stTmpV2; /* temporary vector pointers*/
|
||
MTH3D_tdstVector *p_stResultVector = &M_GetSetParam_stVertexValue(p_stValue);
|
||
|
||
HIE_tdxHandleToSuperObject hNewSuperObjPerso;
|
||
fn_vGetUltraOperatorPerso(fn_ucGetFunctionUltraOperator(eFuncId),p_SuperObjPerso,&hNewSuperObjPerso);
|
||
|
||
/*=========== we get the sight vector of the character*/
|
||
/* GetRotationVector doesn't make any copy so it is fast...*/
|
||
POS_fn_vGetRotationVector(HIE_fn_hGetSuperObjectGlobalMatrix(hNewSuperObjPerso),&p_stTmpV0,&p_stTmpV1,&p_stTmpV2);
|
||
MTH3D_M_vNegVector(p_stResultVector,p_stTmpV1); /* objects watch in -Y, so we negate the vector*/
|
||
|
||
/* the exchange struture already contains the result vector, only the type remains to be properly set.*/
|
||
M_GetSetParam_Type(p_stValue) = E_vt_Vector;
|
||
return p_stTree;
|
||
}
|
||
|
||
|
||
|
||
/******************************************************************
|
||
* Function: 3DFunc *
|
||
* Use : v := ULTRA.PositionRelativeModule("canal") *
|
||
* Use : v := ULTRA.PositionAbsolueModule("canal") *
|
||
* Use : v := ULTRA.DeformationModule("canal") *
|
||
* Use : v := ULTRA.ViseePerso() *
|
||
* Use : v := ULTRA.AssiettePerso() *
|
||
* Use : v := ULTRA.HorizonPerso() *
|
||
* Use : v := ULTRA.ViseeModule("canal", BOOL) *
|
||
* Author : B. Germain *
|
||
* Date of last modification: 20/11/97 *
|
||
******************************************************************/
|
||
tdstNodeInterpret *fn_p_st3DFunc(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
enum tdeFuncId_ eFuncId = M_eFuncIdInterpret(p_stTree-1);
|
||
unsigned char ucChannel;
|
||
long lGlobalAxis = 1;
|
||
MTH3D_tdstVector stDstVector;
|
||
POS_tdstCompletePosition *hObjectMatrix;
|
||
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
HIE_tdxHandleToSuperObject hNewSuperObjPerso;
|
||
fn_vGetUltraOperatorPerso(fn_ucGetFunctionUltraOperator(eFuncId),p_SuperObjPerso,&hNewSuperObjPerso);
|
||
|
||
MTH3D_M_vNullVector(&stDstVector);
|
||
|
||
switch ( eFuncId )
|
||
{
|
||
case eFunc_GetPersoZoomFactor:
|
||
/*we want to read the position or zoom factor in the local matrix*/
|
||
lGlobalAxis = 0;
|
||
break;
|
||
|
||
case eFunc_GetModuleRelativePosition:
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
case eFunc_GetModuleZoomFactor:
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
/*we want to read the position or zoom factor in the local matrix*/
|
||
lGlobalAxis = 0;
|
||
/*fall through*/
|
||
|
||
case eFunc_GetModuleAbsolutePosition:
|
||
case eFunc_GetModuleSighting:
|
||
{
|
||
HIE_tdxHandleToSuperObject hChannelSuperObject;
|
||
/*read the args (use the output exchange structure to spare the stack)*/
|
||
M_EvalNextParameter(p_stValue);
|
||
ucChannel = M_GetSetParam_lValue(p_stValue);
|
||
/*if we dont know the module, return a null vector*/
|
||
if ( ucChannel == C_ucUnknownChannel )
|
||
{
|
||
M_Full_GetSetParam_p_stVertex(p_stValue,&stDstVector);
|
||
return fn_p_stSwapNextParameter(p_stTree);
|
||
break;
|
||
}
|
||
/* read the module superobject*/
|
||
hChannelSuperObject = fn_hGetSuperObjectInChannel(fn_h3dDataGetChannelSOList(M_GetMSHandle(hNewSuperObjPerso,3dData)), ucChannel);
|
||
/* if we got one, use it*/
|
||
if ( hChannelSuperObject )
|
||
{
|
||
/* FBF blindage acces modules {*/
|
||
#ifdef ACTIVE_EDITOR
|
||
fn_vCheckModuleAccess(hNewSuperObjPerso, TRUE, &ucChannel);
|
||
#endif
|
||
/* } fin blindage acces modules*/
|
||
hNewSuperObjPerso = hChannelSuperObject;
|
||
}
|
||
/*else use the actor instead (will yield strange results, but won't crash...)*/
|
||
|
||
if ( eFuncId == eFunc_GetModuleSighting )
|
||
{
|
||
M_EvalNextParameter(p_stValue);
|
||
lGlobalAxis = M_GetSetParam_lValue(p_stValue);
|
||
}
|
||
/*else
|
||
//we want to read the position in the global matrix
|
||
lGlobalAxis = 1;*/
|
||
}
|
||
/*fall through*/
|
||
|
||
case eFunc_GetPersoBanking:
|
||
case eFunc_GetPersoHorizon:
|
||
/*do nothing special (we will read the rotation vector in the global matrix)*/
|
||
break;
|
||
|
||
default:
|
||
M_AIFatalError(E_uwAIFatalNotValidFunction);
|
||
return p_stTree;
|
||
break;
|
||
}
|
||
|
||
/*get the matrix that corresponds to the coordinates system in which we want the results*/
|
||
hObjectMatrix = lGlobalAxis ? HIE_fn_hGetSuperObjectGlobalMatrix(hNewSuperObjPerso) : HIE_fn_hGetSuperObjectMatrix(hNewSuperObjPerso);
|
||
/*now do the deed*/
|
||
switch ( eFuncId )
|
||
{
|
||
case eFunc_GetPersoBanking:
|
||
{
|
||
MTH3D_tdstVector stV1, stV2;
|
||
/* ANNECY AV {*/
|
||
struct DNM_stDynamics * p_stDynamic;
|
||
MS_tdxHandleToDynam h_Dynam;
|
||
|
||
/* If the actor has tilt, we return a vertical vector*/
|
||
/* Oliv' - Portage v14 - to reduce number of warnings*/
|
||
if( (h_Dynam = M_GetMSHandle (hNewSuperObjPerso,Dynam)) != 0 ) /* = is not an error*/
|
||
{
|
||
/* Oliv' - Portage v14 - to reduce number of warnings*/
|
||
if( ((p_stDynamic = fn_p_stDynamGetDynamics (h_Dynam))!=0) && DNM_M_bDynamicsIsTilt (p_stDynamic)) /* = is not an error*/
|
||
{
|
||
MTH3D_M_vSetVectorElements (& stDstVector , MTH_C_ZERO , MTH_C_ZERO , MTH_C_ONE);
|
||
break;
|
||
}
|
||
}
|
||
/* END ANNECY AV }*/
|
||
/*get the vertical axis*/
|
||
POS_fn_vGetRotationMatrix(hObjectMatrix, &stV1, &stV2, &stDstVector);
|
||
}
|
||
break;
|
||
|
||
case eFunc_GetPersoHorizon:
|
||
{
|
||
MTH3D_tdstVector stV2, stV3;
|
||
/*get the transversal axis (means that X.z is positive when perso banks to the right)*/
|
||
POS_fn_vGetRotationMatrix(hObjectMatrix, &stDstVector, &stV2, &stV3);
|
||
}
|
||
break;
|
||
|
||
case eFunc_GetModuleSighting:
|
||
{
|
||
MTH3D_tdstVector stV1, stV3;
|
||
POS_fn_vGetRotationMatrix(hObjectMatrix, &stV1, &stDstVector, &stV3);
|
||
/*objects are suposed to watch in -Y, so negate the vector to make it point where the object is watching*/
|
||
MTH3D_M_vNegVector(&stDstVector, &stDstVector);
|
||
/*
|
||
// ANNECY AV {
|
||
// If the actor has tilt, we return a horizontal vector (if the vector is already horizontal, we don't need to test the tilt
|
||
if (eFuncId == eFunc_GetPersoSighting && ! MTH_M_bIsNullWithEpsilon (MTH3D_M_xGetZofVector (& stDstVector) , MTH_M_xFloatToReal (0.001)))
|
||
{
|
||
struct DNM_stDynamics * p_stDynamic;
|
||
MS_tdxHandleToDynam h_Dynam;
|
||
|
||
if (h_Dynam = M_GetMSHandle (hNewSuperObjPerso,Dynam)) // = is not an error
|
||
{
|
||
if ((p_stDynamic = fn_p_stDynamGetDynamics (h_Dynam)) && DNM_M_bDynamicsIsTilt (p_stDynamic)) // = is not an error
|
||
{
|
||
// We project the vector onto the horizontal plane
|
||
MTH3D_M_vSetZofVector (& stDstVector , MTH_C_ZERO);
|
||
// But we can do that only if the previous vector is not vertical
|
||
if (MTH_M_bIsNullWithEpsilon (MTH3D_M_xGetXofVector (& stDstVector) , MTH_M_xFloatToReal (0.001)) == FALSE ||
|
||
MTH_M_bIsNullWithEpsilon (MTH3D_M_xGetYofVector (& stDstVector) , MTH_M_xFloatToReal (0.001)) == FALSE)
|
||
{
|
||
MTH3D_M_vNormalizeVector (& stDstVector , & stDstVector);
|
||
}
|
||
// If it was vertical, we return a predefined vector
|
||
else MTH3D_M_vSetVectorElements (& stDstVector , MTH_C_ZERO , MTH_C_MinusONE , MTH_C_ZERO);
|
||
}
|
||
}
|
||
}
|
||
// END ANNECY AV }
|
||
*/
|
||
}
|
||
break;
|
||
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
case eFunc_GetModuleZoomFactor:
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
case eFunc_GetPersoZoomFactor:
|
||
{
|
||
MTH3D_tdstVector stV1, stV2, stV3;
|
||
/*get the scale matrix*/
|
||
POS_fn_vGetScaleMatrix(hObjectMatrix, &stV1, &stV2, &stV3);
|
||
/*and extract the norms of the transform matrix vectors*/
|
||
MTH3D_M_vSetVectorElements(&stDstVector, MTH3D_M_xNormVector(&stV1), MTH3D_M_xNormVector(&stV2), MTH3D_M_xNormVector(&stV3));
|
||
}
|
||
break;
|
||
|
||
case eFunc_GetModuleRelativePosition:
|
||
case eFunc_GetModuleAbsolutePosition:
|
||
/*extract the translation vector from the selected matrix*/
|
||
POS_fn_vGetTranslationVector(hObjectMatrix, &stDstVector);
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
M_Full_GetSetParam_p_stVertex(p_stValue, &stDstVector);
|
||
return p_stTree;
|
||
}
|
||
|
||
|
||
/**************************************************************************
|
||
* Function: NameFunc *
|
||
* Use : text := TEXT_LitNomDuJoueur() *
|
||
* Use : int := TEXT_LettreDuTexteALaPosition("texte", pos) *
|
||
* Use : int = TEXT_LitInfoSurTexteFormate("text", array, array, array) *
|
||
* *
|
||
* Author : B. Germain *
|
||
* Date of last modification: 13/03/98 *
|
||
**************************************************************************/
|
||
// FB 100899
|
||
char g_szDummy[5];
|
||
|
||
tdstNodeInterpret *fn_p_stNamesFunc(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
enum tdeFuncId_ eFuncId = M_eFuncIdInterpret(p_stTree-1);
|
||
|
||
switch ( eFuncId )
|
||
{
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
case eFunc_GetInputEntryName:
|
||
{
|
||
IPT_tdxHandleToEntryElement IPT_xHandle;
|
||
|
||
M_EvalNextParameter(p_stValue);
|
||
IPT_xHandle = (IPT_tdxHandleToEntryElement) M_GetSetParam_lValue(p_stValue);
|
||
SAF_M_AssertWithMsg(IPT_fn_szGetEntryActionName(IPT_xHandle), "Input handle n'a pas de nom");
|
||
|
||
M_Full_GetSetParam_String(p_stValue, IPT_fn_szGetEntryActionName(IPT_xHandle));
|
||
}
|
||
return p_stTree;
|
||
break; /*anti-bug GCC N64*/
|
||
|
||
case eFunc_GetFormattedTextInfo:
|
||
{
|
||
unsigned char ucArrayStartCharId, ucArrayEndCharId, ucArrayPosVectorId, ucMaxNbLines, ucCurrentLine;
|
||
tdstTfmtStatus stStatus;
|
||
tdstTfmtLineResults *d_stLineResults;
|
||
MTH_tdxReal xScreenWidth;
|
||
char *pszString;
|
||
/*get all the parameters*/
|
||
M_EvalNextParameter(p_stValue);
|
||
pszString = (char *)fn_szGetStringFromTextOrStringParam(p_stValue);
|
||
M_EvalNextParameter(p_stValue);
|
||
xScreenWidth = M_ReturnParam_xValue(p_stValue);
|
||
ucArrayStartCharId = (unsigned char) M_ucVarIdInterpret(p_stTree);
|
||
p_stTree ++;
|
||
ucArrayEndCharId = (unsigned char) M_ucVarIdInterpret(p_stTree);
|
||
p_stTree ++;
|
||
ucArrayPosVectorId = (unsigned char) M_ucVarIdInterpret(p_stTree);
|
||
p_stTree ++;
|
||
M_EvalNextParameter(p_stValue);
|
||
ucMaxNbLines = M_ReturnParam_lValue(p_stValue);
|
||
/*now lets fill the arrays properly*/
|
||
|
||
#ifndef CODEWARRIOR
|
||
d_stLineResults = (tdstTfmtLineResults *) alloca(sizeof(tdstTfmtLineResults) * ucMaxNbLines);
|
||
#else
|
||
d_stLineResults = (tdstTfmtLineResults *) __alloca(sizeof(tdstTfmtLineResults) * ucMaxNbLines);
|
||
#endif
|
||
/*start by getting all the info in our own structures. the function returns the number of exceeding lines*/
|
||
ucMaxNbLines = ucCurrentLine = TFMT_wPositionModulesAccordingToText(&stStatus, p_SuperObjPerso, pszString, 0, -1, xScreenWidth, d_stLineResults, ucMaxNbLines);
|
||
/*and fill the arrays with them*/
|
||
while ( ucCurrentLine -- )
|
||
{
|
||
M_Full_GetSetParam_Integer(p_stValue, d_stLineResults[ucCurrentLine].wStartChar);
|
||
if ( fn_ucSetDsgVar(ucArrayStartCharId, ucCurrentLine, AI_M_stGetMindOfSuperObj(p_SuperObjPerso), p_stValue) == C_INVALID_SET )
|
||
break;
|
||
M_Full_GetSetParam_Integer(p_stValue, d_stLineResults[ucCurrentLine].wEndChar);
|
||
if ( fn_ucSetDsgVar(ucArrayEndCharId, ucCurrentLine, AI_M_stGetMindOfSuperObj(p_SuperObjPerso), p_stValue) == C_INVALID_SET )
|
||
break;
|
||
M_Full_GetSetParam_p_stVertex(p_stValue, &d_stLineResults[ucCurrentLine].stLineOrigin);
|
||
if ( fn_ucSetDsgVar(ucArrayPosVectorId, ucCurrentLine, AI_M_stGetMindOfSuperObj(p_SuperObjPerso), p_stValue) == C_INVALID_SET )
|
||
break;
|
||
}
|
||
/* return the number of entries that got filled in the arrays (one for each line)*/
|
||
M_Full_GetSetParam_Integer(p_stValue, ucMaxNbLines);
|
||
}
|
||
return p_stTree;
|
||
break; /*anti-bug GCC N64*/
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
|
||
case eFunc_GetSlotName:
|
||
{
|
||
long lSlotId;
|
||
int Version = 0;
|
||
|
||
M_EvalNextParameter(p_stValue);
|
||
lSlotId = M_ReturnParam_lValue(p_stValue);
|
||
|
||
#ifdef U64
|
||
SAF_M_AssertWithMsg((lSlotId >= 1 && lSlotId <= C_ucNbSaveGameSlots),"Slot de sauvegarde inexistant");
|
||
strncpy(g_szDummy,g_stGameOptions.a_szSlotNames[lSlotId-1],3);
|
||
g_szDummy[3] ='\0';
|
||
#else /* PC */
|
||
#ifdef ACTIVE_EDITOR
|
||
Version = fn_iVersionN64_PC();
|
||
if ( Version == 1 /* U64 */)
|
||
{
|
||
SAF_M_AssertWithMsg((lSlotId >= 1 && lSlotId <= C_ucNbSaveGameSlots),"Slot de sauvegarde inexistant");
|
||
strncpy(g_szDummy,g_stGameOptions.a_szSlotNames[lSlotId-1],3);
|
||
g_szDummy[3] ='\0';
|
||
}
|
||
else if( Version == 2 /* PC */)
|
||
{
|
||
SAF_M_AssertWithMsg((lSlotId >= 1 && lSlotId <= (long) fn_lGetNbAvailableSlotsPc()),"Slot de sauvegarde inexistant");
|
||
strncpy(g_szDummy, fn_cRecupSlotName(lSlotId), 3);
|
||
g_szDummy[3] ='\0';
|
||
}
|
||
#else // PC sans editeur
|
||
SAF_M_AssertWithMsg((lSlotId >= 1 && lSlotId <= (long) fn_lGetNbAvailableSlotsPc()),"Slot de sauvegarde inexistant");
|
||
strncpy(g_szDummy, fn_cRecupSlotName(lSlotId), 3);
|
||
g_szDummy[3] ='\0';
|
||
#endif // ACTIVE_EDITOR
|
||
#endif // U64
|
||
|
||
M_Full_GetSetParam_String(p_stValue, g_szDummy/*g_stGameOptions.a_szSlotNames[lSlotId-1]*/);
|
||
}
|
||
return p_stTree;
|
||
break; /*anti-bug GCC N64*/
|
||
|
||
case eFunc_GetSlotScore:
|
||
{
|
||
long lSlotId;
|
||
int Version =0;
|
||
|
||
M_EvalNextParameter(p_stValue);
|
||
lSlotId = M_ReturnParam_lValue(p_stValue);
|
||
|
||
#ifdef U64
|
||
SAF_M_AssertWithMsg((lSlotId >= 1 && lSlotId <= C_ucNbSaveGameSlots),"Slot de sauvegarde inexistant")
|
||
strcpy(g_szDummy, &g_stGameOptions.a_szSlotNames[lSlotId-1][4] );
|
||
g_szDummy[4] = '\0';
|
||
#else /* PC */
|
||
#ifdef ACTIVE_EDITOR
|
||
Version = fn_iVersionN64_PC();
|
||
if ( Version == 1 /* U64 */)
|
||
{
|
||
SAF_M_AssertWithMsg((lSlotId >= 1 && lSlotId <= C_ucNbSaveGameSlots),"Slot de sauvegarde inexistant")
|
||
strcpy(g_szDummy, &g_stGameOptions.a_szSlotNames[lSlotId-1][4] );
|
||
g_szDummy[4] = '\0';
|
||
}
|
||
else if( Version == 2 /* PC */)
|
||
{
|
||
SAF_M_AssertWithMsg((lSlotId >= 1 && lSlotId <= (long) fn_lGetNbAvailableSlotsPc()),"Slot de sauvegarde inexistant")
|
||
strcpy(g_szDummy, fn_cRecupSlotName(lSlotId)+3);
|
||
}
|
||
#else // Pc sans editeur
|
||
SAF_M_AssertWithMsg((lSlotId >= 1 && lSlotId <= (long) fn_lGetNbAvailableSlotsPc()),"Slot de sauvegarde inexistant")
|
||
strcpy(g_szDummy, fn_cRecupSlotName(lSlotId)+3);
|
||
#endif // ACTIVE_EDITOR
|
||
#endif // U64
|
||
|
||
M_Full_GetSetParam_String(p_stValue, g_szDummy/*g_stGameOptions.a_szSlotNames[lSlotId-1]*/);
|
||
}
|
||
return p_stTree;
|
||
break; /*anti-bug GCC N64*/
|
||
|
||
|
||
case eFunc_GetSlotDate:
|
||
{
|
||
long lSlotId;
|
||
char g_szDummyDate[12];
|
||
int Version = 0;
|
||
|
||
M_EvalNextParameter(p_stValue);
|
||
lSlotId = M_ReturnParam_lValue(p_stValue);
|
||
|
||
#ifndef U64
|
||
#ifdef ACTIVE_EDITOR
|
||
Version = fn_iVersionN64_PC();
|
||
if( Version == 2 /* PC */) // pas implement<6E> pour N64
|
||
{
|
||
SAF_M_AssertWithMsg((lSlotId >= 1 && lSlotId <= (long) fn_lGetNbAvailableSlotsPc()),"Slot de sauvegarde inexistant")
|
||
strncpy(g_szDummyDate, fn_bGetStringSlotDate( fn_bRecupSlotNum( lSlotId) ), 10);
|
||
g_szDummyDate[10] = '\0';
|
||
M_Full_GetSetParam_String(p_stValue, g_szDummyDate);
|
||
}
|
||
#else // Pc sans editeur
|
||
SAF_M_AssertWithMsg((lSlotId >= 1 && lSlotId <= (long) fn_lGetNbAvailableSlotsPc()),"Slot de sauvegarde inexistant")
|
||
strncpy(g_szDummyDate, fn_bGetStringSlotDate( fn_bRecupSlotNum( lSlotId) ), 10);
|
||
g_szDummyDate[10] = '\0';
|
||
M_Full_GetSetParam_String(p_stValue, g_szDummyDate);
|
||
#endif // ACTIVE_EDITOR
|
||
#endif // !U64
|
||
|
||
}
|
||
return p_stTree;
|
||
break; // anti-bug GCC N64
|
||
|
||
case eFunc_GetStringCharAt:
|
||
{
|
||
register short wCpt = 0;
|
||
short wIndexInString = 0;
|
||
char *pszString = NULL;
|
||
|
||
/*get the string*/
|
||
M_EvalNextParameter(p_stValue);
|
||
pszString = (char *)fn_szGetStringFromTextOrStringParam(p_stValue);
|
||
|
||
/*get the index in the string*/
|
||
M_EvalNextParameter(p_stValue);
|
||
wIndexInString = M_GetSetParam_lValue(p_stValue);
|
||
|
||
/* Search the beginning of the string*/
|
||
while( pszString[wCpt++] == '/')
|
||
{
|
||
while( pszString[wCpt++] != ':' );
|
||
}
|
||
wIndexInString += wCpt-1;
|
||
|
||
/*return the ASCII code of the letter found there, or 0 if the index is oustide the string*/
|
||
if ( (wIndexInString>= 0) && (wIndexInString < (short) strlen(pszString)) )
|
||
{
|
||
M_Full_GetSetParam_Integer(p_stValue, pszString[wIndexInString]);
|
||
}
|
||
else
|
||
{
|
||
M_Full_GetSetParam_Integer(p_stValue, 0);
|
||
}
|
||
}
|
||
return p_stTree;
|
||
break; /*anti-bug GCC N64*/
|
||
|
||
default:
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
M_AIFatalError(E_uwAIFatalNotValidFunction);
|
||
#endif
|
||
return p_stTree;
|
||
break; /*anti-bug GCC N64*/
|
||
}
|
||
}
|
||
|
||
/******************************************************************
|
||
* Function: GetCollidePoint *
|
||
* Use : v := LitPointCollision () *
|
||
* Use : v := LitTauxDePenetrationCollision () *
|
||
* Author : Y Le Tensorer *
|
||
* Date of last modification: 27/11/97 *
|
||
******************************************************************/
|
||
GMT_tdxMask fn_xMaskOfObstacle(DNM_tdstObstacle *_p_stObstacle)
|
||
{
|
||
if ( _p_stObstacle )
|
||
{
|
||
GMT_tdxHandleToGameMaterial hGameMaterial = DNM_M_hObstacleGetCollidedMaterial(_p_stObstacle);
|
||
if ( GMT_fn_b_ulIsValid(hGameMaterial) )
|
||
{
|
||
GMT_tdxHandleToCollideMaterial hMaterialCollide = GMT_fn_hGetCollideMaterial(hGameMaterial);
|
||
if (hMaterialCollide && ( hMaterialCollide != GMT_C_InvalidCollideMaterial ))
|
||
return GMT_fn_hGetCollideMaterialIdentifier(hMaterialCollide);
|
||
}
|
||
}
|
||
return (GMT_tdxMask) 0;
|
||
}
|
||
|
||
tdstNodeInterpret *fn_p_stGetCollidePoint(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
enum tdeFuncId_ eFuncId=M_eFuncIdInterpret(p_stTree-1);
|
||
DNM_tdstReport *p_stDynamReport = NULL;
|
||
DNM_tdstObstacle *p_stObstacle = NULL;
|
||
GMT_tdxMask xMask = (GMT_tdxMask) 0;
|
||
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
HIE_tdxHandleToSuperObject hNewSuperObjPerso;
|
||
fn_vGetUltraOperatorPerso(fn_ucGetFunctionUltraOperator(eFuncId),p_SuperObjPerso,&hNewSuperObjPerso);
|
||
/********************************************************************************/
|
||
|
||
SAF_M_AssertWithMsg(DNM_M_bDynamicsIsCollisionReport(fn_p_stDynamGetDynamics(M_GetMSHandle(hNewSuperObjPerso,Dynam))), "la m<>canique a besoin du rapport de collisions pour cet appel");
|
||
p_stDynamReport = fn_pstGetDNMReport(hNewSuperObjPerso);
|
||
|
||
switch ( eFuncId )
|
||
{
|
||
case eFunc_GetCollideMaterialType:
|
||
{
|
||
unsigned long ulSurfState = DNM_M_ulReportGetSurfaceState(p_stDynamReport);
|
||
if ( (ulSurfState & C_WOT_ulMobile) == C_WOT_ulMobile )
|
||
{
|
||
p_stObstacle = DNM_M_p_stReportGetCharacter(p_stDynamReport);
|
||
xMask |= fn_xMaskOfObstacle(p_stObstacle);
|
||
}
|
||
if ( (ulSurfState & C_WOT_ulGround) == C_WOT_ulGround )
|
||
{
|
||
p_stObstacle = DNM_M_p_stReportGetGround(p_stDynamReport);
|
||
xMask |= fn_xMaskOfObstacle(p_stObstacle);
|
||
}
|
||
if ( (ulSurfState & C_WOT_ulWall) == C_WOT_ulWall )
|
||
{
|
||
p_stObstacle = DNM_M_p_stReportGetWall(p_stDynamReport);
|
||
xMask |= fn_xMaskOfObstacle(p_stObstacle);
|
||
}
|
||
if ( (ulSurfState & C_WOT_ulWater) == C_WOT_ulWater )
|
||
{
|
||
p_stObstacle = DNM_M_p_stReportGetWater(p_stDynamReport);
|
||
xMask |= fn_xMaskOfObstacle(p_stObstacle);
|
||
}
|
||
if ( (ulSurfState & C_WOT_ulCeiling) == C_WOT_ulCeiling )
|
||
{
|
||
p_stObstacle = DNM_M_p_stReportGetCeil(p_stDynamReport);
|
||
xMask |= fn_xMaskOfObstacle(p_stObstacle);
|
||
}
|
||
if ( ulSurfState == C_WOT_ulNoObstacle )
|
||
{
|
||
p_stObstacle = DNM_M_p_stReportGetObstacle(p_stDynamReport);
|
||
xMask |= fn_xMaskOfObstacle(p_stObstacle);
|
||
}
|
||
}
|
||
M_Full_GetSetParam_Mask(p_stValue, xMask);
|
||
return p_stTree;
|
||
break;
|
||
|
||
case eFunc_GetCollideMaterialType2:
|
||
{
|
||
long lWhichObstacle;
|
||
M_EvalNextParameter(p_stValue);
|
||
lWhichObstacle = M_GetSetParam_lValue(p_stValue);
|
||
switch ( lWhichObstacle )
|
||
{
|
||
default:
|
||
SAF_M_AssertWithMsg(FALSE, "l'obstacle sp<73>cifi<66> n'est pas valide");
|
||
M_Full_GetSetParam_Mask(p_stValue, (GMT_tdxMask) 0);
|
||
return p_stTree;
|
||
break;
|
||
|
||
case 0: /*get the last obstacle (equivalent to original version of the function)*/
|
||
p_stObstacle = DNM_M_p_stReportGetObstacle(p_stDynamReport);
|
||
break;
|
||
|
||
case 1: /*get the last ground*/
|
||
p_stObstacle = DNM_M_p_stReportGetGround(p_stDynamReport);
|
||
break;
|
||
|
||
case 2: /*get the last wall*/
|
||
p_stObstacle = DNM_M_p_stReportGetWall(p_stDynamReport);
|
||
break;
|
||
|
||
case 3: /*get the last character*/
|
||
p_stObstacle = DNM_M_p_stReportGetCharacter(p_stDynamReport);
|
||
break;
|
||
|
||
case 4: /*get the last uncollidable/water plane*/
|
||
p_stObstacle = DNM_M_p_stReportGetWater(p_stDynamReport);
|
||
break;
|
||
|
||
case 5: /* get the last ceiling*/
|
||
p_stObstacle = DNM_M_p_stReportGetCeil(p_stDynamReport);
|
||
break;
|
||
}
|
||
M_Full_GetSetParam_Mask(p_stValue, fn_xMaskOfObstacle(p_stObstacle));
|
||
}
|
||
return p_stTree;
|
||
break;
|
||
|
||
case eFunc_GetCollidePoint2:
|
||
{
|
||
MTH3D_tdstVector stNullVector = { MTH_C_ZERO, MTH_C_ZERO, MTH_C_ZERO };
|
||
long lWhichObstacle;
|
||
M_EvalNextParameter(p_stValue);
|
||
lWhichObstacle = M_GetSetParam_lValue(p_stValue);
|
||
switch ( lWhichObstacle )
|
||
{
|
||
default:
|
||
SAF_M_AssertWithMsg(FALSE, "l'obstacle sp<73>cifi<66> n'est pas valide");
|
||
M_Full_GetSetParam_p_stVertex(p_stValue, &stNullVector);
|
||
return p_stTree;
|
||
break;
|
||
|
||
case 0: /*get the last obstacle (equivalent to original version of the function)*/
|
||
p_stObstacle = DNM_M_p_stReportGetObstacle(p_stDynamReport);
|
||
break;
|
||
|
||
case 1: /*get the last ground*/
|
||
p_stObstacle = DNM_M_p_stReportGetGround(p_stDynamReport);
|
||
break;
|
||
|
||
case 2: /*get the last wall*/
|
||
p_stObstacle = DNM_M_p_stReportGetWall(p_stDynamReport);
|
||
break;
|
||
|
||
case 3: /*get the last character*/
|
||
p_stObstacle = DNM_M_p_stReportGetCharacter(p_stDynamReport);
|
||
break;
|
||
|
||
case 4: /*get the last uncollidable/water plane*/
|
||
p_stObstacle = DNM_M_p_stReportGetWater(p_stDynamReport);
|
||
break;
|
||
|
||
case 5: /* get the last ceiling*/
|
||
p_stObstacle = DNM_M_p_stReportGetCeil(p_stDynamReport);
|
||
break;
|
||
}
|
||
M_Full_GetSetParam_p_stVertex(p_stValue, DNM_M_p_stObstacleGetContact(p_stObstacle));
|
||
}
|
||
return p_stTree;
|
||
break;
|
||
|
||
case eFunc_GetHandsCollidePoint:
|
||
{
|
||
MTH3D_tdstVector *p_stCollidePoint = &M_GetSetParam_stVertexValue(p_stValue);
|
||
DNM_tdstObstacle *p_stObstacle = DNM_M_p_stReportGetGround(p_stDynamReport);
|
||
|
||
M_GetSetParam_Type(p_stValue) = E_vt_Vector;
|
||
/* if it has the hang CMT bit, it was necessarily touched by a ZDM with the hands CMT bit */
|
||
if ( GMT_fn_xTestCollideIdentifierTypeOfGameMaterial(DNM_M_hObstacleGetCollidedMaterial(p_stObstacle),0x0002) )
|
||
{
|
||
*p_stCollidePoint = *DNM_M_p_stObstacleGetContact(p_stObstacle);
|
||
}
|
||
else /* else it was touched by a normal ZDM, hence not by hands*/
|
||
{
|
||
MTH3D_M_vNullVector(p_stCollidePoint);
|
||
}
|
||
}
|
||
return (p_stTree);
|
||
break;
|
||
|
||
case eFunc_GetCollidePoint:
|
||
{
|
||
DNM_tdstObstacle *p_stObstacle = DNM_M_p_stReportGetObstacle(p_stDynamReport);
|
||
M_Full_GetSetParam_p_stVertex(p_stValue, DNM_M_p_stObstacleGetContact(p_stObstacle));
|
||
}
|
||
return (p_stTree);
|
||
break;
|
||
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
case eFunc_GetCollideRate2:
|
||
{
|
||
long lWhichObstacle;
|
||
M_EvalNextParameter(p_stValue);
|
||
lWhichObstacle = M_GetSetParam_lValue(p_stValue);
|
||
switch ( lWhichObstacle )
|
||
{
|
||
default:
|
||
SAF_M_AssertWithMsg(FALSE, "l'obstacle sp<73>cifi<66> n'est pas valide");
|
||
M_Full_GetSetParam_Float(p_stValue, MTH_C_ZERO);
|
||
return p_stTree;
|
||
break;
|
||
|
||
case 0: /*get the last obstacle (equivalent to original version of the function)*/
|
||
p_stObstacle = DNM_M_p_stReportGetObstacle(p_stDynamReport);
|
||
break;
|
||
|
||
case 1: /*get the last ground*/
|
||
p_stObstacle = DNM_M_p_stReportGetGround(p_stDynamReport);
|
||
break;
|
||
|
||
case 2: /*get the last wall*/
|
||
p_stObstacle = DNM_M_p_stReportGetWall(p_stDynamReport);
|
||
break;
|
||
|
||
case 3: /*get the last character*/
|
||
p_stObstacle = DNM_M_p_stReportGetCharacter(p_stDynamReport);
|
||
break;
|
||
|
||
case 4: /*get the last uncollidable/water plane*/
|
||
p_stObstacle = DNM_M_p_stReportGetWater(p_stDynamReport);
|
||
break;
|
||
|
||
case 5: /* get the last ceiling*/
|
||
p_stObstacle = DNM_M_p_stReportGetCeil(p_stDynamReport);
|
||
break;
|
||
}
|
||
M_Full_GetSetParam_Float(p_stValue,DNM_M_xObstacleGetRate(p_stObstacle));
|
||
}
|
||
return p_stTree;
|
||
break;
|
||
|
||
case eFunc_GetCollideRate:
|
||
{
|
||
DNM_tdstObstacle *p_stObstacle = DNM_M_p_stReportGetObstacle(p_stDynamReport);
|
||
M_Full_GetSetParam_Float(p_stValue, MTH_C_ONE);
|
||
M_Full_GetSetParam_Float(p_stValue,DNM_M_xObstacleGetRate(p_stObstacle));
|
||
}
|
||
return (p_stTree);
|
||
break;
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
|
||
default:
|
||
break;
|
||
}
|
||
|
||
M_AIFatalError(E_uwAIFatalNotValidFunction);
|
||
return(p_stTree);
|
||
}
|
||
|
||
/******************************************************************
|
||
* Function: GetLastCollisionActor *
|
||
* Use : Actor := GetLastCollisionActor(character) *
|
||
* Author : Carlos Torres *
|
||
* Date of last modification: 18/02/98 del chack always *
|
||
******************************************************************/
|
||
tdstNodeInterpret *fn_p_stGetLastCollisionActor(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
enum tdeFuncId_ eFuncId=M_eFuncIdInterpret(p_stTree-1);
|
||
HIE_tdxHandleToSuperObject p_SuperObjPersoTreated = NULL;
|
||
HIE_tdxHandleToSuperObject p_SuperObjCollidedActor = NULL;
|
||
tdstGetSetParam stParam ; /* Structure d'<27>change*/
|
||
|
||
if (eFuncId==eFunc_GetLastCollisionActor)
|
||
{
|
||
/* get the perso for which we search the last collided actor*/
|
||
M_EvalNextParameter(&stParam);
|
||
p_SuperObjPersoTreated=M_GetSetParam_p_stSupObjValue(&stParam);
|
||
|
||
SAF_M_AssertWithMsg(p_SuperObjPersoTreated, "l'acteur sp<73>cifi<66> est nul");
|
||
|
||
/* get the last collided actor*/
|
||
p_SuperObjCollidedActor = fn_hSuperObjectGetLastCollidedCharacter(p_SuperObjPersoTreated);
|
||
|
||
/* return last collided actor*/
|
||
M_Full_GetSetParam_Perso(p_stValue,p_SuperObjCollidedActor);
|
||
|
||
return (p_stTree);
|
||
}
|
||
M_AIFatalError(E_uwAIFatalNotValidFunction);
|
||
return(p_stTree);
|
||
}
|
||
|
||
|
||
|
||
|
||
/******************************************************************
|
||
* Function: GetCollide *
|
||
* Use : p := PointCollision ( point, vector, mode ) *
|
||
* v := VecteurNormalCollision ( point, vecteur, mode) *
|
||
* h := PointCollision ( point, vector )
|
||
* *
|
||
* Return point and normal vector of collide between ray *
|
||
* ( point, vector ) and : *
|
||
* - static hierarchy if mode=0 *
|
||
* - dynamic hierarchy if mode=1 *
|
||
* - dynamic+static if mode=2 *
|
||
* This function is optimized to call collision function one time *
|
||
* per tram. *
|
||
* *
|
||
* Author : J Thenoz *
|
||
* Date of last modification: 13/03/98 (YLG) *
|
||
******************************************************************/
|
||
tdstNodeInterpret *fn_p_stGetCollision(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
enum tdeFuncId_ eFuncId=M_eFuncIdInterpret(p_stTree-1);
|
||
MTH3D_tdstVector *p_stPoint;
|
||
MTH3D_tdstVector *p_stVector,stVectorSave;
|
||
unsigned long ulMode;
|
||
BOOL bCompute = FALSE;
|
||
|
||
/* read point */
|
||
M_EvalNextParameter(p_stValue);
|
||
p_stPoint=&M_GetSetParam_stVectorValue(p_stValue);
|
||
if (!MTH3D_M_bEqualVector (&g_stCollideParameterPoint,p_stPoint))
|
||
{
|
||
MTH3D_M_vCopyVector (&g_stCollideParameterPoint,p_stPoint);
|
||
bCompute = TRUE;
|
||
}
|
||
|
||
/* read vector */
|
||
M_EvalNextParameter(p_stValue);
|
||
p_stVector=&M_GetSetParam_stVectorValue(p_stValue);
|
||
if (!MTH3D_M_bEqualVector (&g_stCollideParameterVector,p_stVector))
|
||
{
|
||
MTH3D_M_vCopyVector (&g_stCollideParameterVector,p_stVector);
|
||
bCompute = TRUE;
|
||
}
|
||
|
||
/* read mode */
|
||
M_EvalNextParameter(p_stValue);
|
||
ulMode=M_GetSetParam_ulValue (p_stValue);
|
||
|
||
/* store data must be updated ?*/
|
||
if (bCompute ||
|
||
g_ulCollideTimeCounter != g_stEngineStructure.stEngineTimer.ulCurrentTimerCount ||
|
||
g_ulMode != ulMode
|
||
)
|
||
{
|
||
MTH3D_M_vCopyVector (&stVectorSave,&g_stCollideParameterVector);
|
||
g_ulCollideTimeCounter = g_stEngineStructure.stEngineTimer.ulCurrentTimerCount;
|
||
g_hSuperObjectHit = NULL;
|
||
g_ulMode = ulMode;
|
||
g_xMask = 0;
|
||
fn_vComputeCollideResult (p_SuperObjPerso);
|
||
MTH3D_M_vCopyVector (&g_stCollideParameterVector,&stVectorSave);
|
||
}
|
||
|
||
switch (eFuncId)
|
||
{
|
||
case eFunc_GetCollisionPoint:
|
||
M_Full_GetSetParam_p_stVertex(p_stValue,&g_stCollideResultPoint);
|
||
break;
|
||
|
||
case eFunc_GetCollisionVector:
|
||
M_Full_GetSetParam_p_stVertex(p_stValue,&g_stCollideResultVector);
|
||
SAF_M_AssertWithMsg(
|
||
MTH3D_M_bIsNullVector(&g_stCollideResultVector) || MTH_M_bEqualWithEpsilon(MTH3D_M_xNormVector(&g_stCollideResultVector), MTH_C_ONE, MTH_M_xFloatToReal(0.01f)),
|
||
"erreur interne du moteur: la normale calcul<75>e n'est pas norm<72>e!"
|
||
);
|
||
break;
|
||
|
||
//#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
case eFunc_GetCollisionPerso:
|
||
M_Full_GetSetParam_Perso(p_stValue,g_hSuperObjectHit);
|
||
break;
|
||
//#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
|
||
default:
|
||
break;
|
||
}
|
||
|
||
/*restore the default value (no raytrace flag is taken into account)*/
|
||
g_ulOverRideRayTraceSpoMask = HIE_C_Flag_ulNotHitByRayTrace;
|
||
|
||
return(p_stTree);
|
||
}
|
||
/******************************************************************
|
||
* Function: GetCollideWithCollideMaterial *
|
||
* Use : p := PointCollisionAvecMateriau( point, vector, mode)*
|
||
* *
|
||
* Return point and normal vector of collide between ray *
|
||
* ( point, vector ) and : *
|
||
* - static hierarchy if mode=0 *
|
||
* - dynamic hierarchy if mode=1 *
|
||
* - dynamic+static if mode=2 *
|
||
* This function is optimized to call collision function one time *
|
||
* per tram. *
|
||
* *
|
||
* Author : J Thenoz *
|
||
* Date of last modification: 13/03/98 (YLG) *
|
||
******************************************************************/
|
||
tdstNodeInterpret *fn_p_stGetCollisionWithCollideMaterial(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
MTH3D_tdstVector *p_stPoint;
|
||
MTH3D_tdstVector *p_stVector,stVectorSave;
|
||
unsigned long ulMode;
|
||
unsigned long xTestedMask;
|
||
BOOL bCompute = FALSE;
|
||
|
||
/* read point */
|
||
M_EvalNextParameter(p_stValue);
|
||
p_stPoint=&M_GetSetParam_stVectorValue(p_stValue);
|
||
if (!MTH3D_M_bEqualVector (&g_stCollideParameterPoint,p_stPoint))
|
||
{
|
||
MTH3D_M_vCopyVector (&g_stCollideParameterPoint,p_stPoint);
|
||
bCompute = TRUE;
|
||
}
|
||
|
||
/* read vector */
|
||
M_EvalNextParameter(p_stValue);
|
||
p_stVector=&M_GetSetParam_stVectorValue(p_stValue);
|
||
if (!MTH3D_M_bEqualVector (&g_stCollideParameterVector,p_stVector))
|
||
{
|
||
MTH3D_M_vCopyVector (&g_stCollideParameterVector,p_stVector);
|
||
bCompute = TRUE;
|
||
}
|
||
|
||
/* read mode */
|
||
M_EvalNextParameter(p_stValue);
|
||
ulMode=M_GetSetParam_ulValue (p_stValue);
|
||
|
||
|
||
/*read the tested CMT*/
|
||
M_EvalNextParameter(p_stValue);
|
||
xTestedMask = (unsigned long) M_GetSetParam_xMaskValue(p_stValue);
|
||
|
||
/* store data must be updated ?*/
|
||
if (bCompute ||
|
||
g_ulCollideTimeCounter != g_stEngineStructure.stEngineTimer.ulCurrentTimerCount ||
|
||
g_ulMode != ulMode
|
||
)
|
||
{
|
||
MTH3D_M_vCopyVector (&stVectorSave,&g_stCollideParameterVector);
|
||
g_xMask = xTestedMask;
|
||
g_ulCollideTimeCounter = g_stEngineStructure.stEngineTimer.ulCurrentTimerCount;
|
||
g_hSuperObjectHit = NULL;
|
||
g_ulMode = ulMode;
|
||
fn_vComputeCollideResult (p_SuperObjPerso);
|
||
MTH3D_M_vCopyVector (&g_stCollideParameterVector,&stVectorSave);
|
||
g_xMask = 0;
|
||
}
|
||
|
||
/*restore the default value (no raytrace flag is taken into account)*/
|
||
g_ulOverRideRayTraceSpoMask = HIE_C_Flag_ulNotHitByRayTrace;
|
||
|
||
M_Full_GetSetParam_p_stVertex(p_stValue,&g_stCollideResultPoint);
|
||
return(p_stTree);
|
||
}
|
||
|
||
/******************************************************************
|
||
* Function: ComputeRebondVector *
|
||
* Use : Rv := ComputeRebondVector(V,N,absorption) *
|
||
* Rv <- absorbtion*(-2*(V.N)*N + V) *
|
||
* Author : Carlos Torres *
|
||
* Date of last modification: 04/12/97 *
|
||
******************************************************************/
|
||
tdstNodeInterpret *fn_p_stComputeRebondVector(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
enum tdeFuncId_ eFuncId = M_eFuncIdInterpret(p_stTree-1);
|
||
|
||
if ( eFuncId == eFunc_ComputeRebondVector )
|
||
{
|
||
#endif /* __DEBUG_AI__ */
|
||
MTH3D_tdstVector stNormalVector; /* normal to collided surface*/
|
||
MTH3D_tdstVector stInitVector; /* Vector before rebond*/
|
||
MTH_tdxReal xCoefAbsorption; /* coef absorption of the face*/
|
||
|
||
MTH_tdxReal xReactionNorm; /* Norm of the normal reaction vector*/
|
||
MTH3D_tdstVector stReactionVector; /* Reaction Vector*/
|
||
|
||
/* get the intial vector*/
|
||
M_EvalNextParameter(p_stValue);
|
||
stInitVector = M_GetSetParam_stVectorValue(p_stValue);
|
||
/* get the face normal vector*/
|
||
M_EvalNextParameter(p_stValue);
|
||
stNormalVector = M_GetSetParam_stVectorValue(p_stValue);
|
||
SAF_M_AssertWithMsg(MTH_M_bEqualWithEpsilon(MTH3D_M_xNormVector(&stNormalVector), MTH_C_ONE, MTH_M_xFloatToReal(0.01f)), "la normale n'est pas norm<72>e!");
|
||
/* get the alpha value*/
|
||
M_EvalNextParameter(p_stValue);
|
||
xCoefAbsorption = M_ReturnParam_xValue(p_stValue);
|
||
|
||
/* -2*(V.N)*/
|
||
xReactionNorm = MTH_M_xMul(MTH_M_xFloatToReal(-2.0f),MTH3D_M_xDotProductVector(&stInitVector,&stNormalVector));
|
||
/* -2*(V.N)*N*/
|
||
MTH3D_M_vMulScalarVector(&stReactionVector,xReactionNorm,&stNormalVector);
|
||
/* -2*(V.N)*N + V*/
|
||
MTH3D_M_vAddVector(&stReactionVector,&stReactionVector,&stInitVector);
|
||
/* absorbtion*(-2*(V.N)*N + V)*/
|
||
MTH3D_M_vMulScalarVector(&stReactionVector,xCoefAbsorption,&stReactionVector);
|
||
|
||
|
||
/* return the Reaction vector*/
|
||
M_Full_GetSetParam_p_stVertex(p_stValue,&stReactionVector);
|
||
return (p_stTree);
|
||
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
}
|
||
M_AIFatalError(E_uwAIFatalNotValidFunction);
|
||
return(p_stTree);
|
||
#endif /* __DEBUG_AI__ */
|
||
}
|
||
|
||
|
||
/******************************************************************
|
||
* Function: VectorAndAngle *
|
||
* Use : alpha := VecteurAngle(U,V,Plan) *
|
||
* cos := VecteurCos(U,V) *
|
||
* sin := VecteurSin(U,V,Plan) *
|
||
* Plan xOy -> 0 *
|
||
* Plan yOz -> 1 *
|
||
* Plan zOx -> 2 *
|
||
* Author : Carlos Torres , *
|
||
* Date of last modification: 08/12/97 *
|
||
* optimized by Yann le Tensorer sept 16,1998 *
|
||
* re-optimized by Benoit Germain Jan 29,1999 *
|
||
******************************************************************/
|
||
tdstNodeInterpret *fn_p_stVectorAndAngle(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
enum tdeFuncId_ eFuncId=M_eFuncIdInterpret(p_stTree-1);
|
||
unsigned char ucPlan; /* projection plan to eval angle sign*/
|
||
ACP_tdxBool bASourceVectorIsNull = FALSE;
|
||
|
||
MTH3D_tdstVector stVectorU, stVectorV; /* First and second vectors*/
|
||
MTH3D_tdstVector stOrthVector; /* Orthogonal vector to U and V*/
|
||
MTH_tdxReal xSin,xCos,xAngle,xTmp;
|
||
|
||
#define VectorNul(v) ( MTH_M_bIsNullWithEpsilon(MTH3D_M_xGetXofVector(&v), MTH_M_xDoubleToReal(1.0e-5)) && MTH_M_bIsNullWithEpsilon(MTH3D_M_xGetYofVector(&v), MTH_M_xDoubleToReal(1.0e-5)) && MTH_M_bIsNullWithEpsilon(MTH3D_M_xGetZofVector(&v), MTH_M_xDoubleToReal(1.0e-5)) )
|
||
|
||
/* get the first vector*/
|
||
M_EvalNextParameter(p_stValue);
|
||
stVectorU = M_GetSetParam_stVectorValue(p_stValue);
|
||
/* get the second vector*/
|
||
M_EvalNextParameter(p_stValue);
|
||
stVectorV = M_GetSetParam_stVectorValue(p_stValue);
|
||
|
||
/* we normalize the two vectors */
|
||
/* QuickNormalizeVector uses a table of 1/squareroots*/
|
||
if ( !VectorNul(stVectorU) )
|
||
{
|
||
MTH3D_M_vQuickNormalizeVector(&stVectorU,&stVectorU);
|
||
}
|
||
else
|
||
bASourceVectorIsNull = TRUE;
|
||
if ( !VectorNul(stVectorV) )
|
||
{
|
||
MTH3D_M_vQuickNormalizeVector(&stVectorV,&stVectorV);
|
||
}
|
||
else
|
||
bASourceVectorIsNull = TRUE;
|
||
|
||
|
||
switch (eFuncId)
|
||
{
|
||
case eFunc_VectorAngle :
|
||
if ( bASourceVectorIsNull )
|
||
{
|
||
/* skip the projection plane argument*/
|
||
p_stTree = fn_p_stSkipThisArgument(p_stTree);
|
||
/* assume the angle is null!*/
|
||
xAngle = MTH_C_ZERO;
|
||
}
|
||
else
|
||
{
|
||
/* get the projection plan*/
|
||
M_EvalNextParameter(p_stValue);
|
||
ucPlan = M_GetSetParam_ucValue(p_stValue);
|
||
|
||
/*=========== we calculate the cos between the first vector and the second vector (the two vectors are normalized)*/
|
||
xCos = MTH3D_M_xDotProductVector(&stVectorU,&stVectorV);
|
||
|
||
if ( MTH_M_bGreater(xCos,MTH_C_ONE) )
|
||
xCos = MTH_C_ONE; /* sometimes, the inprecision makes this happen...*/
|
||
else if ( MTH_M_bLess(xCos,MTH_C_MinusONE) )
|
||
xCos = MTH_C_MinusONE;
|
||
|
||
/* Acos takes 250 cycles (on PII processor), we should perhaps make a table... (sept 21, 1998)*/
|
||
/* i tried with atan (faster than acos), but the whole is slower*/
|
||
xAngle = MTH_M_xACos(xCos);
|
||
|
||
/* Eval sign with determinant in projection plan (no need of cross product)*/
|
||
switch ( ucPlan )
|
||
{
|
||
case C_ucPlanxOy :
|
||
{
|
||
xTmp = MTH_M_xSub(MTH_M_xMul(stVectorU.xX,stVectorV.xY), MTH_M_xMul(stVectorU.xY,stVectorV.xX)); /* we calculate the determinant (in the z=0 plane)*/
|
||
if ( MTH_M_bLessZero(xTmp) )
|
||
xAngle = MTH_M_xNeg(xAngle); /* if determinant is negative, the angle is negative */
|
||
}
|
||
break;
|
||
|
||
case C_ucPlanyOz :
|
||
{
|
||
xTmp = MTH_M_xSub(MTH_M_xMul(stVectorU.xY,stVectorV.xZ), MTH_M_xMul(stVectorU.xZ,stVectorV.xY)) ; /* we calculate the determinant */
|
||
if ( MTH_M_bLessZero(xTmp) )
|
||
xAngle = MTH_M_xNeg(xAngle); /* if determinant is negative, the angle is negative */
|
||
}
|
||
break;
|
||
|
||
case C_ucPlanzOx :
|
||
{
|
||
xTmp = MTH_M_xSub(MTH_M_xMul(stVectorU.xZ,stVectorV.xX), MTH_M_xMul(stVectorU.xX,stVectorV.xZ)) ; /* we calculate the determinant */
|
||
if ( MTH_M_bLessZero(xTmp) )
|
||
xAngle = MTH_M_xNeg(xAngle); /* if determinant is negative, the angle is negative */
|
||
}
|
||
}
|
||
xAngle = MTH_M_xRadToDeg(xAngle);
|
||
}
|
||
M_Full_GetSetParam_Float(p_stValue, xAngle);
|
||
break;
|
||
|
||
case eFunc_VectorCos :
|
||
if ( bASourceVectorIsNull )
|
||
{
|
||
/* the answer is equivalent to a null angle!*/
|
||
xCos = MTH_C_ONE;
|
||
}
|
||
else
|
||
{
|
||
/*The cosinus is the result of the dot product*/
|
||
xCos = MTH3D_M_xDotProductVector(&stVectorU,&stVectorV);
|
||
/* sometimes, the inprecision makes this happen...*/
|
||
if ( MTH_M_bGreater(xCos,MTH_C_ONE) )
|
||
xCos = MTH_C_ONE;
|
||
else if ( MTH_M_bLess(xCos,MTH_C_MinusONE) )
|
||
xCos = MTH_C_MinusONE;
|
||
|
||
}
|
||
M_Full_GetSetParam_Float(p_stValue,xCos);
|
||
break;
|
||
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT 08/06/99 { */
|
||
case eFunc_VectorSin :
|
||
if ( bASourceVectorIsNull )
|
||
{
|
||
/* skip the projection plane argument*/
|
||
p_stTree = fn_p_stSkipThisArgument(p_stTree);
|
||
/* the answer is equivalent to a null angle!*/
|
||
xSin = MTH_C_ZERO;
|
||
}
|
||
else
|
||
{
|
||
/* get the projection plan*/
|
||
M_EvalNextParameter(p_stValue);
|
||
ucPlan = M_GetSetParam_ucValue(p_stValue);
|
||
|
||
/*the sinus is the norm of the cross product*/
|
||
MTH3D_M_vCrossProductVectorWithoutBuffer(&stOrthVector,&stVectorU,&stVectorV);
|
||
xSin = MTH3D_M_xQuickNormVector(&stOrthVector);
|
||
|
||
/* Eval sign with projection plan*/
|
||
switch (ucPlan)
|
||
{
|
||
case C_ucPlanxOy :
|
||
if ( MTH_M_bLessZero(MTH3D_M_xGetZofVector(&stOrthVector)) )
|
||
xSin = MTH_M_xNeg(xSin);
|
||
break;
|
||
|
||
case C_ucPlanyOz :
|
||
if ( MTH_M_bLessZero(MTH3D_M_xGetXofVector(&stOrthVector)) )
|
||
xSin = MTH_M_xNeg(xSin);
|
||
break;
|
||
|
||
case C_ucPlanzOx :
|
||
if ( MTH_M_bLessZero(MTH3D_M_xGetYofVector(&stOrthVector)) )
|
||
xSin = MTH_M_xNeg(xSin);
|
||
|
||
default :
|
||
break;
|
||
}
|
||
|
||
/* sometimes, the inprecision makes this happen...*/
|
||
if ( MTH_M_bGreater(xSin,MTH_C_ONE) )
|
||
xSin = MTH_C_ONE;
|
||
else if ( MTH_M_bLess(xSin,MTH_C_MinusONE) )
|
||
xSin = MTH_C_MinusONE;
|
||
}
|
||
M_Full_GetSetParam_Float(p_stValue,xSin);
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ } */
|
||
|
||
default :
|
||
break;
|
||
}
|
||
return p_stTree;
|
||
#undef VectorNul
|
||
}
|
||
|
||
|
||
|
||
/******************************************************************
|
||
* Function: GetMechanicParameter *
|
||
* Use : value := LitTruc () *
|
||
* Author : Jacques Th<54>noz *
|
||
* Date of last modification: 16/12/97 *
|
||
******************************************************************/
|
||
tdstNodeInterpret *fn_p_GetMechanicParameter(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
struct DNM_stDynamics* pstDynamic;
|
||
MS_tdxHandleToDynam h_Dynam;
|
||
HIE_tdxHandleToSuperObject hNewSuperObjPerso;
|
||
enum tdeFuncId_ eFuncId=M_eFuncIdInterpret(p_stTree-1);
|
||
MTH_tdxReal xNulValue = MTH_C_ZERO;
|
||
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
fn_vGetUltraOperatorPerso(fn_ucGetFunctionUltraOperator(eFuncId),p_SuperObjPerso,&hNewSuperObjPerso);
|
||
/********************************************************************************/
|
||
|
||
|
||
/* Get Dynamics structure*/
|
||
h_Dynam = M_GetMSHandle(hNewSuperObjPerso,Dynam);
|
||
if (!h_Dynam)
|
||
{
|
||
#if (defined(ACTIVE_EXEC_CHECKING) && defined(ACTIVE_EDITOR)) || defined(ACTIVE_AIDEBUG)
|
||
#if !defined(U64_AIDEBUG) /* Oliv' - 23/11/1998*/
|
||
Erm_M_UpdateLastError(AI, C_ucErmDefaultChannel, E_uwAIWarningScriptError , C_lErmNoDebugData,
|
||
C_ucErmOpenInfoWindow, C_ucNeverStopForDebug,
|
||
"You must allocate Dynamics.");
|
||
Erm_fn_iMessageBox ("You must allocate Dynamics.","STOP",MB_OK|MB_ICONERROR);
|
||
Erm_M_ClearLastError(C_ucErmDefaultChannel);
|
||
fn_vSetStopAIEngineFlag();
|
||
#endif /* !defined(U64_AIDEBUG) */
|
||
#endif /* (defined(ACTIVE_EXEC_CHECKING) && defined(ACTIVE_EDITOR)) || defined(ACTIVE_AIDEBUG) */
|
||
M_Full_GetSetParam_Float ( p_stValue, xNulValue );
|
||
return (p_stTree);
|
||
}
|
||
|
||
pstDynamic = fn_p_stDynamGetDynamics(h_Dynam);
|
||
|
||
switch (eFuncId)
|
||
{
|
||
case eFunc_GetMechanicGravityFactor :
|
||
{
|
||
MTH_tdxReal xGravity = DNM_M_xDynamicsGetGravityFactor (pstDynamic);
|
||
M_Full_GetSetParam_Float ( p_stValue, xGravity );
|
||
}
|
||
return (p_stTree);
|
||
break;
|
||
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
case eFunc_GetMechanicSlide :
|
||
{
|
||
MTH_tdxReal xSlide = DNM_M_xDynamicsGetSlide (pstDynamic);
|
||
M_Full_GetSetParam_Float ( p_stValue, xSlide );
|
||
}
|
||
return (p_stTree);
|
||
break;
|
||
|
||
case eFunc_GetMechanicRebound :
|
||
{
|
||
MTH_tdxReal xRebound = DNM_M_xDynamicsGetRebound (pstDynamic);
|
||
M_Full_GetSetParam_Float ( p_stValue, xRebound );
|
||
}
|
||
return (p_stTree);
|
||
break;
|
||
|
||
case eFunc_GetMechanicSlopeLimit :
|
||
{
|
||
MTH_tdxReal xSlopeLimit = MTH_M_xTan (MTH_M_xDegToRad (DNM_M_xDynamicsGetSlopeLimit (pstDynamic)));
|
||
M_Full_GetSetParam_Float ( p_stValue, xSlopeLimit );
|
||
}
|
||
return (p_stTree);
|
||
break;
|
||
|
||
case eFunc_GetMechanicInertiaX :
|
||
{
|
||
MTH_tdxReal xInertiaX = DNM_M_xDynamicsGetInertiaFactorX (pstDynamic);
|
||
M_Full_GetSetParam_Float ( p_stValue, xInertiaX );
|
||
}
|
||
return (p_stTree);
|
||
break;
|
||
|
||
case eFunc_GetMechanicInertiaY :
|
||
{
|
||
MTH_tdxReal xInertiaY = DNM_M_xDynamicsGetInertiaFactorY (pstDynamic);
|
||
M_Full_GetSetParam_Float ( p_stValue, xInertiaY );
|
||
}
|
||
return (p_stTree);
|
||
break;
|
||
|
||
case eFunc_GetMechanicInertiaZ :
|
||
{
|
||
MTH_tdxReal xInertiaZ = DNM_M_xDynamicsGetInertiaFactorZ (pstDynamic);
|
||
M_Full_GetSetParam_Float ( p_stValue, xInertiaZ );
|
||
}
|
||
return (p_stTree);
|
||
break;
|
||
|
||
case eFunc_GetMechanicTiltIntensity :
|
||
{
|
||
MTH_tdxReal xTiltIntensity = DNM_M_xDynamicsGetTiltIntensity (pstDynamic);
|
||
M_Full_GetSetParam_Float ( p_stValue, xTiltIntensity );
|
||
}
|
||
return (p_stTree);
|
||
break;
|
||
|
||
case eFunc_GetMechanicTiltInertia :
|
||
{
|
||
MTH_tdxReal xTiltInertia = DNM_M_xDynamicsGetTiltInertia (pstDynamic);
|
||
M_Full_GetSetParam_Float ( p_stValue, xTiltInertia );
|
||
}
|
||
return (p_stTree);
|
||
break;
|
||
|
||
case eFunc_GetMechanicTiltOrigin :
|
||
{
|
||
MTH_tdxReal xTiltOrigin = DNM_M_xDynamicsGetTiltOrigin (pstDynamic);
|
||
M_Full_GetSetParam_Float ( p_stValue, xTiltOrigin );
|
||
}
|
||
return (p_stTree);
|
||
break;
|
||
|
||
case eFunc_GetMechanicMaxSpeed :
|
||
{
|
||
MTH3D_tdstVector stSpeedLimit;
|
||
MTH3D_M_vCopyVector ( &stSpeedLimit, DNM_M_pDynamicsGetMaxSpeed (pstDynamic) );
|
||
M_Full_GetSetParam_p_stVertex (p_stValue,&stSpeedLimit);
|
||
}
|
||
return (p_stTree);
|
||
break;
|
||
|
||
case eFunc_GetMechanicStreamPriority :
|
||
{
|
||
MTH_tdxReal xStreamPriority = DNM_M_xDynamicsGetStreamPriority (pstDynamic);
|
||
M_Full_GetSetParam_Float ( p_stValue, xStreamPriority );
|
||
}
|
||
return (p_stTree);
|
||
break;
|
||
|
||
case eFunc_GetMechanicStreamSpeed :
|
||
{
|
||
MTH3D_tdstVector stStreamSpeed;
|
||
MTH3D_M_vCopyVector ( &stStreamSpeed, DNM_M_pDynamicsGetStreamSpeed (pstDynamic) );
|
||
M_Full_GetSetParam_p_stVertex (p_stValue,&stStreamSpeed);
|
||
}
|
||
return (p_stTree);
|
||
break;
|
||
|
||
case eFunc_GetMechanicStreamFactor :
|
||
{
|
||
MTH_tdxReal xStreamFactor = DNM_M_xDynamicsGetStreamFactor (pstDynamic);
|
||
M_Full_GetSetParam_Float ( p_stValue, xStreamFactor );
|
||
}
|
||
return (p_stTree);
|
||
break;
|
||
|
||
case eFunc_GetSlideFactorX :
|
||
{
|
||
MTH_tdxReal xSlideFactorX = DNM_M_xDynamicsGetSlideFactorX (pstDynamic);
|
||
M_Full_GetSetParam_Float ( p_stValue, xSlideFactorX );
|
||
}
|
||
return (p_stTree);
|
||
break;
|
||
|
||
case eFunc_GetSlideFactorY :
|
||
{
|
||
MTH_tdxReal xSlideFactorY = DNM_M_xDynamicsGetSlideFactorY (pstDynamic);
|
||
M_Full_GetSetParam_Float ( p_stValue, xSlideFactorY );
|
||
}
|
||
return (p_stTree);
|
||
break;
|
||
|
||
case eFunc_GetSlideFactorZ :
|
||
{
|
||
MTH_tdxReal xSlideFactorZ = DNM_M_xDynamicsGetSlideFactorZ (pstDynamic);
|
||
M_Full_GetSetParam_Float ( p_stValue, xSlideFactorZ );
|
||
}
|
||
return (p_stTree);
|
||
break;
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
|
||
case eFunc_GetSpeedAnim :
|
||
M_Full_GetSetParam_p_stVertex (p_stValue,DNM_M_p_stDynamicsGetSpeedAnim (pstDynamic));
|
||
return (p_stTree);
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
|
||
M_AIFatalError(E_uwAIFatalNotValidFunction);
|
||
return(p_stTree);
|
||
}
|
||
|
||
|
||
/******************************************************************
|
||
* Function: GetHierarchyLink *
|
||
* Author : Jacques Th<54>noz *
|
||
* Date of last modification: 10/02/98 *
|
||
******************************************************************/
|
||
tdstNodeInterpret *fn_p_GetHierarchyLink(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
struct DNM_stDynamics* pstDynamic;
|
||
MS_tdxHandleToDynam h_Dynam;
|
||
HIE_tdxHandleToSuperObject hNewSuperObjPerso;
|
||
HIE_tdxHandleToSuperObject hFather;
|
||
enum tdeFuncId_ eFuncId=M_eFuncIdInterpret(p_stTree-1);
|
||
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
fn_vGetUltraOperatorPerso(fn_ucGetFunctionUltraOperator(eFuncId),p_SuperObjPerso,&hNewSuperObjPerso);
|
||
/********************************************************************************/
|
||
|
||
|
||
/* Get Dynamics structure*/
|
||
h_Dynam = M_GetMSHandle(hNewSuperObjPerso,Dynam);
|
||
|
||
if (!h_Dynam)
|
||
{
|
||
#if (defined(ACTIVE_EXEC_CHECKING) && defined(ACTIVE_EDITOR)) || defined(ACTIVE_AIDEBUG)
|
||
#if !defined(U64_AIDEBUG) /* Oliv' - 23/11/1998*/
|
||
Erm_M_UpdateLastError(AI, C_ucErmDefaultChannel, E_uwAIWarningScriptError , C_lErmNoDebugData,
|
||
C_ucErmOpenInfoWindow, C_ucNeverStopForDebug,
|
||
"You must allocate Dynamics.");
|
||
Erm_fn_iMessageBox ("You must allocate Dynamics.","STOP",MB_OK|MB_ICONERROR);
|
||
Erm_M_ClearLastError(C_ucErmDefaultChannel);
|
||
fn_vSetStopAIEngineFlag();
|
||
#endif /* !defined(U64_AIDEBUG) */
|
||
#endif
|
||
return (p_stTree);
|
||
}
|
||
|
||
|
||
pstDynamic = fn_p_stDynamGetDynamics(h_Dynam);
|
||
|
||
switch (eFuncId)
|
||
{
|
||
case eFunc_HierGetFather :
|
||
/*hFather = p_SuperObjPerso;*/
|
||
hFather = hNewSuperObjPerso;
|
||
do
|
||
{
|
||
hFather = HIE_fn_hGetSuperObjectFather (hFather);
|
||
}
|
||
while (HIE_fn_bIsSuperObjectValid (hFather) && HIE_fn_ulGetSuperObjectType(hFather)!=HIE_C_ulActor);
|
||
|
||
M_Full_GetSetParam_Perso(p_stValue,hFather);
|
||
return (p_stTree);
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
|
||
M_AIFatalError(E_uwAIFatalNotValidFunction);
|
||
return(p_stTree);
|
||
}
|
||
|
||
|
||
|
||
/*******************************************************************
|
||
* Function : ZON_LitActivationZDD *
|
||
* Use : ZON_LitActivationZDD( ZDD ) *
|
||
* Function : ZON_LitActivationZDM *
|
||
* Use : ZON_LitActivationZDM( ZDM ) *
|
||
* Function : ZON_LitActivationZDE *
|
||
* Use : ZON_LitActivationZDE( ZDE ) *
|
||
* Function : ZON_LitActivationZDR *
|
||
* Use : ZON_LitActivationZDR( ZDR ) *
|
||
* *
|
||
* Author : Marc Trabucato *
|
||
* Date of last modification: 12/03/98 *
|
||
*******************************************************************/
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
tdstNodeInterpret *fn_p_GetPriviligedActivationZdx(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
tdstGetSetParam stParam; /* exchange structure*/
|
||
HIE_tdxHandleToSuperObject hPerso; /* Handle of the character*/
|
||
long lZoneNumber; /* Number of the zone*/
|
||
tdeCollSetPrivilegedActivation ePrivilege;
|
||
enum tdeFuncId_ eFuncId = M_eFuncIdInterpret(p_stTree-1);
|
||
MS_tdxHandleToCollSet hCollSet;
|
||
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
fn_vGetUltraOperatorPerso(fn_ucGetFunctionUltraOperator(eFuncId),p_SuperObjPerso,&hPerso);
|
||
|
||
hCollSet = M_GetMSHandle(hPerso,CollSet);
|
||
/* Get first parameter that is a ZDx*/
|
||
M_EvalNextParameter( &stParam );
|
||
lZoneNumber = (long) M_GetSetParam_lZDMIdValue( &stParam );
|
||
lZoneNumber--;
|
||
|
||
switch( eFuncId )
|
||
{
|
||
case eFunc_GetActivationZDD:
|
||
ePrivilege = CS_fn_eGetPrivilegedActivationZone( C_ucTypeZdd, hCollSet, (unsigned short)lZoneNumber );
|
||
M_Full_GetSetParam_Integer(p_stValue, (unsigned short)ePrivilege);
|
||
break;
|
||
|
||
case eFunc_GetActivationZDM:
|
||
ePrivilege = CS_fn_eGetPrivilegedActivationZone( C_ucTypeZdm, hCollSet, (unsigned short)lZoneNumber );
|
||
M_Full_GetSetParam_Integer(p_stValue, (unsigned short)ePrivilege);
|
||
break;
|
||
case eFunc_GetActivationZDE:
|
||
ePrivilege = CS_fn_eGetPrivilegedActivationZone( C_ucTypeZde, hCollSet, (unsigned short)lZoneNumber );
|
||
M_Full_GetSetParam_Integer(p_stValue, (unsigned short)ePrivilege);
|
||
break;
|
||
case eFunc_GetActivationZDR:
|
||
ePrivilege = CS_fn_eGetPrivilegedActivationZone( C_ucTypeZdr, hCollSet, (unsigned short)lZoneNumber );
|
||
M_Full_GetSetParam_Integer(p_stValue, (unsigned short)ePrivilege);
|
||
break;
|
||
|
||
default:
|
||
/* Function does not existe*/
|
||
M_AIFatalError(E_uwAIFatalNotValidFunction);
|
||
return(p_stTree);
|
||
break;
|
||
}
|
||
|
||
return(p_stTree);
|
||
}
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
|
||
/********************************************************************
|
||
* Functions : ACT_LitFrequenceCalculCollisions *
|
||
* : ACT_LitFrequenceCalculIA *
|
||
* : ACT_LitFrequenceCalculLumi<6D>res *
|
||
* Use : ACT_LitFrequenceCalculCollisions() *
|
||
* : ACT_LitFrequenceCalculIA() *
|
||
* : ACT_LitFrequenceCalculLumi<6D>res() *
|
||
* *
|
||
* Author : Marc Trabucato *
|
||
* Date of last modification: 12/06/98 *
|
||
********************************************************************/
|
||
|
||
tdstNodeInterpret *fn_p_GetComputationFrequency(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
HIE_tdxHandleToSuperObject hPerso; /* Handle of the character*/
|
||
unsigned char ucFrequency;
|
||
enum tdeFuncId_ eFuncId = M_eFuncIdInterpret(p_stTree-1);
|
||
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
fn_vGetUltraOperatorPerso(fn_ucGetFunctionUltraOperator(eFuncId),p_SuperObjPerso,&hPerso);
|
||
|
||
switch( eFuncId )
|
||
{
|
||
case eFunc_GetBrainFrequency:
|
||
ucFrequency = fn_uc3dDataGetBrainComputationFrequency( M_GetMSHandle(hPerso,3dData) );
|
||
M_GetSetParam_ucValue(p_stValue) = ucFrequency;
|
||
M_GetSetParam_Type (p_stValue) = E_vt_0To255;
|
||
break;
|
||
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
|
||
case eFunc_GetCollisionFrequency:
|
||
ucFrequency = fn_ucCollSetGetCollComputeFrequency( M_GetMSHandle(hPerso,CollSet) );
|
||
M_GetSetParam_ucValue(p_stValue) = ucFrequency;
|
||
M_GetSetParam_Type (p_stValue) = E_vt_0To255;
|
||
break;
|
||
|
||
case eFunc_GetLightFrequency:
|
||
#if defined(U64)
|
||
ucFrequency = 1;
|
||
#else
|
||
ucFrequency = fn_uc3dDataGetLightComputationFrequency( M_GetMSHandle(hPerso,3dData) );
|
||
#endif
|
||
M_GetSetParam_ucValue(p_stValue) = ucFrequency;
|
||
M_GetSetParam_Type (p_stValue) = E_vt_0To255;
|
||
break;
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
|
||
|
||
default:
|
||
/* Function does not existe*/
|
||
M_AIFatalError(E_uwAIFatalNotValidFunction);
|
||
return(p_stTree);
|
||
break;
|
||
}
|
||
|
||
return(p_stTree);
|
||
}
|
||
|
||
|
||
|
||
|
||
/***********************************************************************
|
||
* Function : MEC_ImpulsionSaut ( point A, point B, Zmax ) *
|
||
* Use : Impulsion := MEC_ImpulsionSaut ( point A, point B, Zmax ) *
|
||
* *
|
||
* Author : Jacques Th<54>noz *
|
||
* Date of last modification: 20/03/98 *
|
||
************************************************************************/
|
||
tdstNodeInterpret *fn_p_ComputeJumpImpulsion (HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
tdstGetSetParam stParam;
|
||
HIE_tdxHandleToSuperObject hPerso;
|
||
enum tdeFuncId_ eFuncId = M_eFuncIdInterpret(p_stTree-1);
|
||
MTH3D_tdstVector stStartPosition;
|
||
MTH3D_tdstVector stEndPosition;
|
||
MTH3D_tdstVector stImpulsion;
|
||
MTH3D_tdstVector stNullVector;
|
||
MTH_tdxReal xDeltaZ;
|
||
MTH_tdxReal xZmax;
|
||
MTH_tdxReal xG;
|
||
MTH_tdxReal xDelta;
|
||
MTH_tdxReal xt;
|
||
MTH_tdxReal xa, xb, xc;
|
||
struct DNM_stDynamics *p_stDynamic;
|
||
MS_tdxHandleToDynam h_Dynam;
|
||
|
||
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
fn_vGetUltraOperatorPerso(fn_ucGetFunctionUltraOperator(eFuncId),p_SuperObjPerso,&hPerso);
|
||
|
||
/* init the null vector*/
|
||
MTH3D_M_vNullVector(&stNullVector);
|
||
|
||
/* parameters */
|
||
M_EvalNextParameter(&stParam);
|
||
stStartPosition=M_GetSetParam_stVectorValue(&stParam);
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
stEndPosition=M_GetSetParam_stVectorValue(&stParam);
|
||
|
||
M_EvalNextParameter(&stParam);
|
||
xDeltaZ = M_ReturnParam_xValue(&stParam);
|
||
|
||
if (MTH_M_bLess ( xDeltaZ, MTH_C_ZERO ))
|
||
{
|
||
M_Full_GetSetParam_p_stVertex(p_stValue,&stNullVector);
|
||
return(p_stTree);
|
||
}
|
||
|
||
/* xZMax */
|
||
xZmax = MTH_M_xAdd ( xDeltaZ, MTH3D_M_xGetZofVector(&stEndPosition) );
|
||
if (MTH_M_bLess(xZmax,MTH3D_M_xGetZofVector(&stStartPosition)))
|
||
xZmax = MTH_M_xAdd ( xDeltaZ, MTH3D_M_xGetZofVector(&stStartPosition) );
|
||
|
||
/* return */
|
||
MTH3D_M_vNullVector (&stImpulsion);
|
||
MTH3D_M_vNullVector (&stNullVector);
|
||
M_Full_GetSetParam_p_stVertex(p_stValue,&stImpulsion);
|
||
|
||
/* Get Dynamics structure */
|
||
h_Dynam = M_GetMSHandle(hPerso,Dynam);
|
||
if (!h_Dynam)
|
||
{
|
||
#if (defined(ACTIVE_EXEC_CHECKING) && defined(ACTIVE_EDITOR)) || defined(ACTIVE_AIDEBUG)
|
||
#if !defined(U64_AIDEBUG) /* Oliv' - 23/11/1998*/
|
||
Erm_M_UpdateLastError(AI, C_ucErmDefaultChannel, E_uwAIWarningScriptError , C_lErmNoDebugData,
|
||
C_ucErmOpenInfoWindow, C_ucNeverStopForDebug,
|
||
"You must allocate Dynamics.");
|
||
Erm_fn_iMessageBox ("You must allocate Dynamics.","STOP",MB_OK|MB_ICONERROR);
|
||
Erm_M_ClearLastError(C_ucErmDefaultChannel);
|
||
fn_vSetStopAIEngineFlag();
|
||
#endif /* !defined(U64_AIDEBUG) */
|
||
#endif
|
||
M_Full_GetSetParam_p_stVertex(p_stValue,&stNullVector);
|
||
return(p_stTree);
|
||
}
|
||
p_stDynamic = fn_p_stDynamGetDynamics(h_Dynam);
|
||
if (!p_stDynamic)
|
||
{
|
||
M_Full_GetSetParam_p_stVertex(p_stValue,&stNullVector);
|
||
return (p_stTree);
|
||
}
|
||
|
||
xG = DNM_M_xDynamicsGetGravityFactor (p_stDynamic);
|
||
if (MTH_M_bIsNull(xG))
|
||
{
|
||
M_Full_GetSetParam_p_stVertex(p_stValue,&stNullVector);
|
||
return (p_stTree); /* pour le moment*/
|
||
}
|
||
|
||
/* impulsion.z */
|
||
MTH3D_M_vSetZofVector (&stImpulsion,MTH_M_xSqrt(MTH_M_xMul(MTH_M_xMul(MTH_M_xSub(xZmax,MTH3D_M_xGetZofVector(&stStartPosition)),MTH_C_2),xG)));
|
||
|
||
/* find t */
|
||
xa = MTH_M_xMul (xG,MTH_C_MinusInv2);
|
||
xb = MTH3D_M_xGetZofVector(&stImpulsion);
|
||
xc = MTH_M_xSub ( MTH3D_M_xGetZofVector(&stStartPosition), MTH3D_M_xGetZofVector(&stEndPosition) );
|
||
xDelta = MTH_M_xTrinomeDelta( xa, xb, xc);
|
||
if (MTH_M_bLess(xDelta,MTH_C_ZERO))
|
||
{
|
||
M_Full_GetSetParam_p_stVertex(p_stValue,&stNullVector);
|
||
return(p_stTree);
|
||
}
|
||
|
||
xt = MTH_M_xDiv ( MTH_M_xSub(MTH_M_xNeg(xb),MTH_M_xSqrt(xDelta)), MTH_M_xMul(MTH_C_2,xa) );
|
||
|
||
/* impulsion.x */
|
||
MTH3D_M_vSetXofVector ( &stImpulsion, MTH_M_xDiv(MTH_M_xSub(MTH3D_M_xGetXofVector(&stEndPosition),MTH3D_M_xGetXofVector(&stStartPosition)),xt) );
|
||
|
||
/* impulsion.y */
|
||
MTH3D_M_vSetYofVector ( &stImpulsion, MTH_M_xDiv(MTH_M_xSub(MTH3D_M_xGetYofVector(&stEndPosition),MTH3D_M_xGetYofVector(&stStartPosition)),xt) );
|
||
|
||
M_Full_GetSetParam_p_stVertex(p_stValue,&stImpulsion);
|
||
return(p_stTree);
|
||
}
|
||
|
||
|
||
tdstNodeInterpret *fn_p_GetBooleanInArray(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
enum tdeFuncId_ eFuncId = M_eFuncIdInterpret(p_stTree-1);
|
||
AI_tdstMind * p_stMind; /* Mind of perso (used to return paramaters to dsgVars)*/
|
||
unsigned char ucArrayId;
|
||
unsigned long ulFirstIndex;
|
||
unsigned long ulIndexFirstLong;
|
||
unsigned long ulIndexFirstBit;
|
||
#ifdef _DEBUG /* {*/
|
||
tdeDsgVarTypeId eDsgVarType;
|
||
tdstArray *p_stArray;
|
||
unsigned long ulMyVarSize;
|
||
#endif /* }*/
|
||
|
||
/* get array index*/
|
||
M_vEvalNextVarId(p_stMind, ucArrayId);
|
||
|
||
#ifdef _DEBUG /* {*/
|
||
/* ucArrayId is an array*/
|
||
eDsgVarType = M_GetDsgVarType(p_stMind,ucArrayId);
|
||
SAF_M_AssertWithMsg((fn_GetDsgVarType(eDsgVarType)==E_vt_Array), "La variable designer n'est pas un tableau")
|
||
|
||
/* verify array size*/
|
||
p_stArray = (tdstArray*)M_GetDsgVarAddr(p_stMind,ucArrayId);
|
||
ulMyVarSize = M_ARRAY_SIZE(p_stArray);
|
||
#endif /* }*/
|
||
|
||
/* get index (or min index)*/
|
||
M_EvalNextParameter(p_stValue);
|
||
ulFirstIndex = M_GetSetParam_lValue(p_stValue);
|
||
SAF_M_AssertWithMsg(ulFirstIndex, "L'index doit <20>tre > 0")
|
||
ulFirstIndex--;
|
||
|
||
ulIndexFirstLong = (ulFirstIndex >> 5);
|
||
ulIndexFirstBit = (ulFirstIndex & 31);
|
||
|
||
#ifdef _DEBUG /* {*/
|
||
SAF_M_AssertWithMsg((ulMyVarSize>ulIndexFirstLong), "Le tableau n'est pas assez grand")
|
||
#endif /* }*/
|
||
|
||
/* default*/
|
||
M_Full_GetSetParam_Integer(p_stValue , 0);
|
||
|
||
switch(eFuncId)
|
||
{
|
||
case eFunc_GetBooleanInArray:
|
||
{
|
||
if (fn_ucGetDsgVar(ucArrayId , (unsigned char) ulIndexFirstLong , p_stMind , p_stValue) == C_VALID_GET)
|
||
{
|
||
unsigned long ulValue = M_GetSetParam_lValue(p_stValue);
|
||
|
||
M_Full_GetSetParam_Integer(p_stValue , (ulValue & (1 << ulIndexFirstBit)) ? TRUE : FALSE);
|
||
}
|
||
break;
|
||
}
|
||
case eFunc_GetNumberOfBooleanInArray:
|
||
{
|
||
unsigned long ulLastIndex;
|
||
unsigned long ulIndexLastLong;
|
||
unsigned long ulIndexLastBit;
|
||
unsigned long ulNumberOfBits;
|
||
unsigned long ulIndexLong;
|
||
|
||
/* get max index*/
|
||
M_EvalNextParameter(p_stValue);
|
||
ulLastIndex = M_GetSetParam_lValue(p_stValue);
|
||
SAF_M_AssertWithMsg((ulLastIndex >= ulFirstIndex), "Le second index doit <20>tre > au premier")
|
||
ulLastIndex--;
|
||
|
||
ulIndexLastLong = (ulLastIndex >> 5);
|
||
ulIndexLastBit = (ulLastIndex & 31);
|
||
#ifdef _DEBUG /* {*/
|
||
SAF_M_AssertWithMsg((ulMyVarSize>ulIndexLastLong), "Le tableau n'est pas assez grand")
|
||
#endif /* }*/
|
||
/**/
|
||
ulNumberOfBits = 0;
|
||
for (ulIndexLong = ulIndexFirstLong ; ulIndexLong <= ulIndexLastLong ; ulIndexLong++)
|
||
{
|
||
if (fn_ucGetDsgVar(ucArrayId , (unsigned char) ulIndexLong , p_stMind , p_stValue) == C_VALID_GET)
|
||
{
|
||
unsigned long ulValue = M_GetSetParam_lValue(p_stValue);
|
||
unsigned long ulFirstBit = (ulIndexLong == ulIndexFirstLong ? ulIndexFirstBit : 0);
|
||
unsigned long ulLastBit = (ulIndexLong == ulIndexLastLong ? ulIndexLastBit : 31);
|
||
unsigned long ulIndexBit;
|
||
|
||
for (ulIndexBit = ulFirstBit ; ulIndexBit <= ulLastBit ; ulIndexBit++)
|
||
{
|
||
if (ulValue & (1<<ulIndexBit)) ulNumberOfBits++;
|
||
}
|
||
}
|
||
}
|
||
M_Full_GetSetParam_Integer(p_stValue , ulNumberOfBits);
|
||
break;
|
||
}
|
||
|
||
default:
|
||
/* Function does not existe*/
|
||
M_AIFatalError(E_uwAIFatalNotValidFunction);
|
||
return(p_stTree);
|
||
break;
|
||
}
|
||
return(p_stTree);
|
||
}
|
||
|
||
/***********************************************************************
|
||
* Function : BUT_GetButtonName ( Button ) *
|
||
************************************************************************/
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT 08/06/99 { */
|
||
tdstNodeInterpret *fn_p_stGetButtonName(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
tdstGetSetParam stParam;
|
||
IPT_tdxHandleToEntryElement IPT_xHandle;
|
||
M_EvalNextParameter(&stParam);
|
||
|
||
/* get button handle*/
|
||
IPT_xHandle = (IPT_tdxHandleToEntryElement) M_GetSetParam_lValue(&stParam);
|
||
/* LOL*/
|
||
#ifndef U64
|
||
M_Full_GetSetParam_String(p_stValue,IPT_fn_szGetStringOf(IPT_xHandle));
|
||
#else
|
||
M_PrintfStopErrorN64(("Function fn_p_stGetButtonName invalidate for N64"));
|
||
#endif
|
||
return(p_stTree);
|
||
}
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ } */
|
||
/***********************************************************************
|
||
* Function : VID_GetDriversAvailable ( )
|
||
* return LONG *
|
||
************************************************************************/
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT 08/06/99 { */
|
||
#if (!defined U64)
|
||
tdstNodeInterpret *fn_p_stGetDriversAvailable(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
long lDriver= 0;
|
||
|
||
M_Full_GetSetParam_Integer(p_stValue,lDriver);
|
||
return(p_stTree);
|
||
}
|
||
#endif /* U64*/
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ } */
|
||
/***********************************************************************
|
||
* Function : TEXT_GetCurrentLanguageId ( )
|
||
* return LONG *
|
||
************************************************************************/
|
||
tdstNodeInterpret *fn_p_stGetCurrentLanguageId(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
M_Full_GetSetParam_Integer(p_stValue,(long)g_stEngineStructure.ucCurrentLanguage);
|
||
return(p_stTree);
|
||
}
|
||
/***********************************************************************
|
||
* Function : TEXT_GetNbLanguages ( )
|
||
* return LONG *
|
||
************************************************************************/
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT 08/06/99 { */
|
||
tdstNodeInterpret *fn_p_stGetNbLanguages(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
M_Full_GetSetParam_Integer(p_stValue,(long)g_stEngineStructure.ucNbLanguages);
|
||
return(p_stTree);
|
||
}
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ } */
|
||
/***********************************************************************
|
||
* Function : TEXT_GetLanguageText ( Id )
|
||
* return LONG *
|
||
************************************************************************/
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT 08/06/99 { */
|
||
tdstNodeInterpret *fn_p_stGetLanguageText(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
tdstGetSetParam stParam;
|
||
M_EvalNextParameter(&stParam);
|
||
|
||
M_Full_GetSetParam_String(p_stValue,g_stEngineStructure.p_stLanguageTable[M_GetSetParam_lValue(&stParam)].szLanguageText);
|
||
return(p_stTree);
|
||
}
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ } */
|
||
|
||
|
||
/***********************************************************************
|
||
* Function : TEXT_TexteEnEntier ( TEXTE )
|
||
* return entier *
|
||
************************************************************************/
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT 08/06/99 { */
|
||
tdstNodeInterpret *fn_p_stTextToInt(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
tdstGetSetParam stParam;
|
||
char* pszString;
|
||
|
||
/* Get String */
|
||
M_EvalNextParameter(&stParam);
|
||
pszString = (char *)fn_szGetStringFromTextOrStringParam(&stParam);
|
||
|
||
M_Full_GetSetParam_Integer ( p_stValue, atoi(pszString) );
|
||
|
||
return(p_stTree);
|
||
}
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ } */
|
||
|
||
|
||
/***********************************************************************
|
||
* Functions :
|
||
Option_GetVolumeMusical()
|
||
Option_GetVolumeEffets()
|
||
* return entier *
|
||
************************************************************************/
|
||
tdstNodeInterpret *fn_p_stOptionRecupererFunc(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
enum tdeFuncId_ eFuncId = M_eFuncIdInterpret(p_stTree-1);
|
||
long lValue;
|
||
|
||
switch (eFuncId)
|
||
{
|
||
case eFunc_GetMusicVolume:
|
||
lValue = SND_fn_lGetVolumeLineSound(g_lSoundVolumeLineMusic);
|
||
break;
|
||
|
||
case eFunc_GetSfxVolume:
|
||
lValue = SND_fn_lGetVolumeLineSound(g_lSoundVolumeLineSound);
|
||
// Oliv' - 29/07/1999 - scale Fx volume to 0-100 instead of 0-127
|
||
#ifdef U64
|
||
lValue *= 1.27f;
|
||
#endif /* N64 */
|
||
// EndOfOliv'
|
||
break;
|
||
|
||
default :
|
||
M_AIFatalError(E_uwAIFatalNotValidFunction);
|
||
return(p_stTree);
|
||
break;
|
||
}
|
||
|
||
M_Full_GetSetParam_Integer (p_stValue, lValue);
|
||
return(p_stTree);
|
||
|
||
}
|
||
/***********************************************************************
|
||
* Functions :
|
||
OPTION_SlotIsValid(Long)
|
||
* return entier *
|
||
************************************************************************/
|
||
tdstNodeInterpret *fn_p_stOptionSlotIsValid(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
long lValue;
|
||
|
||
M_EvalNextParameter(p_stValue);
|
||
lValue = M_GetSetParam_lValue(p_stValue);
|
||
|
||
M_Full_GetSetParam_Integer (p_stValue, (long)GAM_fn_bIsSlotValid((short)lValue));
|
||
return(p_stTree);
|
||
}
|
||
/***********************************************************************
|
||
* Functions :
|
||
VID_GetNbAvailableResolution()
|
||
* return entier
|
||
************************************************************************/
|
||
tdstNodeInterpret *fn_p_stGetNbAvailableResolution(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
/* LOL*/
|
||
#ifndef U64
|
||
M_Full_GetSetParam_Integer (p_stValue, (long)GLI_fn_lGetNumberOfDisplayModes());
|
||
#else
|
||
M_Full_GetSetParam_Integer (p_stValue, (osMemSize>4*1024*1024 ? 2 : 1)); /*AR9811*/
|
||
#endif
|
||
|
||
return(p_stTree);
|
||
}
|
||
/***********************************************************************
|
||
* Functions :
|
||
VID_GetCurrentResolution()
|
||
* return entier
|
||
************************************************************************/
|
||
#ifdef U64
|
||
extern char g_bMustSwitchResolution;
|
||
#endif
|
||
tdstNodeInterpret *fn_p_stGetCurrentResolution(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
/* LOL*/
|
||
#ifndef U64
|
||
M_Full_GetSetParam_Integer (p_stValue, (long)GLI_fn_lGetCurrentDisplayMode() );
|
||
#else
|
||
if (g_bMustSwitchResolution==0)
|
||
{
|
||
M_Full_GetSetParam_Integer (p_stValue, (SCREEN_WD==MIN_SCREEN_WD ? 0 : 1));
|
||
}
|
||
else
|
||
{
|
||
M_Full_GetSetParam_Integer (p_stValue, (g_bMustSwitchResolution-1));
|
||
}
|
||
#endif
|
||
|
||
return(p_stTree);
|
||
}
|
||
/***********************************************************************
|
||
* Functions :
|
||
VID_GetResolutionName(Long)
|
||
* return entier
|
||
************************************************************************/
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT 08/06/99 { */
|
||
tdstNodeInterpret *fn_p_stGetNameResolution(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
long lValue;
|
||
static char szName[60];
|
||
|
||
|
||
M_EvalNextParameter(p_stValue);
|
||
lValue = M_GetSetParam_lValue(p_stValue);
|
||
|
||
/* LOL*/
|
||
#ifndef U64
|
||
GLI_fn_lGetDisplayModeDescription( lValue, szName );
|
||
#else
|
||
if(lValue==0)
|
||
strcpy( szName,"LOW" );
|
||
else
|
||
strcpy( szName,"HIGH" );
|
||
#endif
|
||
|
||
/*
|
||
if (lValue == 0)
|
||
strcpy(szName,"800x600");
|
||
else if (lValue == 1)
|
||
strcpy(szName,"640x480");
|
||
*/
|
||
|
||
M_Full_GetSetParam_String(p_stValue,szName);
|
||
return(p_stTree);
|
||
}
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ } */
|
||
|
||
|
||
/***********************************************************************
|
||
* Functions :
|
||
VID_GetBrightness()
|
||
* return entier
|
||
************************************************************************/
|
||
tdstNodeInterpret *fn_p_stGetBrightness(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
/* A REMPLIR*/
|
||
#ifndef U64
|
||
M_Full_GetSetParam_Integer (p_stValue, GLI_fn_lGetBrightness());
|
||
#else /* U64 */
|
||
M_Full_GetSetParam_Integer (p_stValue, 1);
|
||
#endif /* U64 */
|
||
return(p_stTree);
|
||
}
|
||
|
||
|
||
#ifdef U64
|
||
extern long fn_lGetNbAvailableSlots();
|
||
#endif
|
||
|
||
/***********************************************************************
|
||
* Functions :
|
||
OPTION_GetNbSlotsAvailable
|
||
Parametre: taille d'une sauvegarde
|
||
* return nombre de slots possible
|
||
************************************************************************/
|
||
tdstNodeInterpret *fn_p_stGetNbSlotsAvailable(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
long lValue;
|
||
|
||
|
||
M_EvalNextParameter(p_stValue);
|
||
lValue = M_GetSetParam_lValue(p_stValue);
|
||
|
||
#ifdef U64
|
||
M_Full_GetSetParam_Integer (p_stValue, (long)fn_lGetNbAvailableSlots()); // Fonction Version 64
|
||
#else
|
||
M_Full_GetSetParam_Integer (p_stValue, (long)fn_lGetNbAvailableSlotsPc() ); // Fonction Diff pour PC (dans GamOpt.c)
|
||
#endif // U64
|
||
|
||
return(p_stTree);
|
||
}
|
||
|
||
/***********************************************************************
|
||
* Functions :
|
||
VID_GetTextureFiltering
|
||
VID_GetAntiAliasing
|
||
|
||
* return:
|
||
0: OFF
|
||
1: ON
|
||
************************************************************************/
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT 08/06/99 { */
|
||
tdstNodeInterpret *fn_p_stGetVideoOptions(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
enum tdeFuncId_ eFuncId = M_eFuncIdInterpret(p_stTree-1);
|
||
|
||
#ifndef U64
|
||
M_Full_GetSetParam_Integer (p_stValue, (long)1);
|
||
#else
|
||
/* PARTIE A REMPLIR PAR L EQUIPE U64*/
|
||
switch (eFuncId)
|
||
{
|
||
case eFunc_GetTextureFiltering:
|
||
break;
|
||
case eFunc_GetAntiAliasing:
|
||
break;
|
||
/* XB 05/05/99 */
|
||
default:
|
||
break;
|
||
/* End XB */
|
||
}
|
||
#endif
|
||
|
||
return(p_stTree);
|
||
}
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ } */
|
||
|
||
/***********************************************************************
|
||
* Functions :
|
||
ACT_GetSaturationDistance
|
||
ACT_GetBackGroundDistance
|
||
|
||
* return:
|
||
************************************************************************/
|
||
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT 08/06/99 { */
|
||
tdstNodeInterpret *fn_p_stGetMSSoundValues(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
HIE_tdxHandleToSuperObject hPerso; /* Handle of the character*/
|
||
enum tdeFuncId_ eFuncId = M_eFuncIdInterpret(p_stTree-1);
|
||
MS_tdxHandleToMSSound hMSSound;
|
||
unsigned long ulValue = 0;
|
||
SndReal xSndValue;
|
||
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
fn_vGetUltraOperatorPerso(fn_ucGetFunctionUltraOperator(eFuncId),p_SuperObjPerso,&hPerso);
|
||
|
||
hMSSound = M_GetMSHandle(hPerso,MSSound);
|
||
|
||
if(hMSSound)
|
||
{
|
||
switch (eFuncId)
|
||
{
|
||
case eFunc_GetSaturationDistance:
|
||
xSndValue = fn_xMSSoundGetSaturationDistance(hMSSound);
|
||
ulValue = M_RealToIntSnd(xSndValue);
|
||
break;
|
||
case eFunc_GetBackgroundDistance:
|
||
xSndValue = fn_xMSSoundGetBackGroundDistance(hMSSound);
|
||
ulValue = M_RealToIntSnd(xSndValue);
|
||
break;
|
||
default:
|
||
M_AIFatalError(E_uwAIFatalNotValidFunction);
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
SAF_M_AssertWithMsg((hMSSound!=NULL), "La MSSound de l'acteur n'est pas allou<6F>e")
|
||
}
|
||
|
||
M_Full_GetSetParam_Integer(p_stValue,ulValue);
|
||
|
||
return(p_stTree);
|
||
}
|
||
#endif /* _AI_EXCLUDE_NEVER_USED_ } */
|
||
|
||
/***********************************************************************
|
||
* Functions :
|
||
ACT_LitLimiteEloignement
|
||
ACT_LitZoneMinTransparence
|
||
ACT_LitZoneMaxTransparence
|
||
|
||
* return:
|
||
************************************************************************/
|
||
tdstNodeInterpret *fn_p_stGetStdGameLimit(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
HIE_tdxHandleToSuperObject hPerso; /* Handle of the character*/
|
||
enum tdeFuncId_ eFuncId = M_eFuncIdInterpret(p_stTree-1);
|
||
MS_tdxHandleToStandardGame hStdGame;
|
||
unsigned long ulValue = 0;
|
||
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
fn_vGetUltraOperatorPerso(fn_ucGetFunctionUltraOperator(eFuncId),p_SuperObjPerso,&hPerso);
|
||
|
||
hStdGame = M_GetMSHandle(hPerso,StandardGame);
|
||
|
||
if(hStdGame)
|
||
{
|
||
switch (eFuncId)
|
||
{
|
||
case eFunc_GetTooFarLimit:
|
||
ulValue = fn_ucStandardGameGetTooFarLimit(hStdGame);
|
||
break;
|
||
case eFunc_GetTransparencyZoneMin:
|
||
ulValue = fn_ucStandardGameGetTransparencyZoneMin(hStdGame);
|
||
break;
|
||
case eFunc_GetTransparencyZoneMax:
|
||
ulValue = fn_ucStandardGameGetTransparencyZoneMax(hStdGame);
|
||
break;
|
||
default:
|
||
M_AIFatalError(E_uwAIFatalNotValidFunction);
|
||
break;
|
||
}
|
||
}
|
||
|
||
M_Full_GetSetParam_Integer(p_stValue,ulValue);
|
||
|
||
return(p_stTree);
|
||
}
|
||
|
||
/* ANNECY MT - 30/03/99 { PC Protection Code*/
|
||
|
||
|
||
#if !defined(U64) /* { */
|
||
/* Lettre du CDROM */
|
||
#if defined(__cplusplus)
|
||
extern "C"
|
||
{
|
||
#endif
|
||
extern char g_cCDROM;
|
||
#if defined(__cplusplus)
|
||
}
|
||
#endif
|
||
|
||
|
||
/* ANNECY OA - 04/08/99 { */
|
||
typedef long (*ptrFunction)(char *_szFileName, tdstLoaderHandler *stHandler);
|
||
void fn_vInitLoaderHandler(tdstLoaderHandler *stLoader);
|
||
tdstNodeInterpret *fn_p_ExecuteVariable(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
enum tdeFuncId_ eFuncId = M_eFuncIdInterpret(p_stTree-1);
|
||
AI_tdstMind *p_stMind; /* Mind of perso (used to return paramaters to dsgVars)*/
|
||
long lResult = 0;
|
||
|
||
if (eFuncId==eFunc_ExecuteVariable)
|
||
{
|
||
tdstLoaderHandler stLoader;
|
||
long lCodePos, lParamPos;
|
||
char *pcCode, *pcParameter;
|
||
|
||
/* Recherche des positions du code et du parametre */
|
||
M_vEvalNextVarId(p_stMind, lCodePos);
|
||
|
||
/* Recherche des pointeurs sur le code et le parametre */
|
||
pcCode = (char *)((tdstArray *)(M_GetDsgVarAddr(p_stMind, lCodePos)))->d_ArrayElement;
|
||
if (*pcCode != 0)
|
||
{
|
||
M_vEvalNextVarId(p_stMind, lParamPos);
|
||
pcParameter = (char *)((tdstArray *)(M_GetDsgVarAddr(p_stMind, lParamPos)))->d_ArrayElement;
|
||
|
||
/* Initialisation du handler */
|
||
fn_vInitLoaderHandler(&stLoader);
|
||
|
||
/* lecteur du CDROM en parametre ? */
|
||
M_EvalNextParameter(p_stValue);
|
||
|
||
if (M_ReturnParam_lValue(p_stValue))
|
||
{
|
||
*pcParameter = g_cCDROM;
|
||
}
|
||
|
||
/* Execution du code */
|
||
lResult = ((ptrFunction)pcCode)(pcParameter, &stLoader);
|
||
}
|
||
else
|
||
{
|
||
p_stTree = fn_p_stSkipThisArgument(p_stTree);
|
||
p_stTree = fn_p_stSkipThisArgument(p_stTree);
|
||
}
|
||
}
|
||
|
||
M_Full_GetSetParam_Integer(p_stValue, lResult);
|
||
return(p_stTree);
|
||
}
|
||
/* END ANNECY OA } */
|
||
|
||
|
||
/***********************************************************************
|
||
* Functions :
|
||
ACT_CalculeClefProtection
|
||
|
||
* return:
|
||
* Author: MT
|
||
************************************************************************/
|
||
tdstNodeInterpret *fn_p_stComputeProtectKey(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
tdstGetSetParam stParam; /* exchange structure*/
|
||
HIE_tdxHandleToSuperObject hPerso; /* Handle of the character*/
|
||
enum tdeFuncId_ eFuncId = M_eFuncIdInterpret(p_stTree-1);
|
||
unsigned long ulValue = 0;
|
||
DWORD dwInitKey;
|
||
|
||
/********************************************************************************/
|
||
/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
|
||
/********************************************************************************/
|
||
fn_vGetUltraOperatorPerso(fn_ucGetFunctionUltraOperator(eFuncId),p_SuperObjPerso,&hPerso);
|
||
|
||
M_EvalNextParameter( &stParam );
|
||
dwInitKey = (long) M_GetSetParam_ulValue( &stParam );
|
||
|
||
switch (eFuncId)
|
||
{
|
||
case eFunc_ComputeProtectKey:
|
||
ulValue = (unsigned long)SNA_fn_dwGetProtectionKey(dwInitKey);
|
||
break;
|
||
}
|
||
|
||
M_Full_GetSetParam_Integer(p_stValue,ulValue);
|
||
|
||
return(p_stTree);
|
||
}
|
||
|
||
/***********************************************************************
|
||
* Functions :
|
||
MATH_Xor
|
||
|
||
* return:
|
||
* Author: MT
|
||
************************************************************************/
|
||
tdstNodeInterpret *fn_p_stComputeXor(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
tdstGetSetParam stParam1,stParam2; /* exchange structure*/
|
||
enum tdeFuncId_ eFuncId = M_eFuncIdInterpret(p_stTree-1);
|
||
unsigned long ulValue = 0;
|
||
unsigned long ulParam1 , ulParam2;
|
||
DWORD dwOffset = (DWORD)PTC_GetModuleHandle(NULL);
|
||
|
||
M_EvalNextParameter( &stParam1 );
|
||
|
||
ulParam1 = M_GetSetParam_ulValue( &stParam1 );
|
||
|
||
if (eFuncId == eFunc_GetMemoryValue)
|
||
{
|
||
ulValue = *(DWORD*)(ulParam1 + dwOffset);
|
||
}
|
||
else
|
||
{
|
||
M_EvalNextParameter( &stParam2 );
|
||
|
||
ulParam2 = M_GetSetParam_ulValue( &stParam2 );
|
||
|
||
switch (eFuncId)
|
||
{
|
||
case eFunc_Xor:
|
||
ulValue = (unsigned long)(ulParam1 ^ ulParam2);
|
||
break;
|
||
/* ANNECY OA - 26/08/99 { */
|
||
case eFunc_And:
|
||
ulValue = (unsigned long)(ulParam1 & ulParam2);
|
||
break;
|
||
case eFunc_Or:
|
||
ulValue = (unsigned long)(ulParam1 | ulParam2);
|
||
break;
|
||
/* END ANNECY OA } */
|
||
case eFunc_DivUnsigned:
|
||
ulValue = (unsigned long)(ulParam1 / ulParam2);
|
||
break;
|
||
case eFunc_MulUnsigned:
|
||
ulValue = (unsigned long)(ulParam1 * ulParam2);
|
||
break;
|
||
case eFunc_AddUnsigned:
|
||
ulValue = (unsigned long)(ulParam1 + ulParam2);
|
||
break;
|
||
case eFunc_SubUnsigned:
|
||
ulValue = (unsigned long)(ulParam1 - ulParam2);
|
||
break;
|
||
}
|
||
}
|
||
M_GetSetParam_ulValue(p_stValue) = ulValue;
|
||
M_GetSetParam_Type(p_stValue) = E_vt_PositiveInteger;
|
||
|
||
return(p_stTree);
|
||
}
|
||
|
||
/* ANNECY OA - 26/08/99 { */
|
||
tdstNodeInterpret *fn_p_stComputeNot(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
tdstGetSetParam stParam1; /* exchange structure*/
|
||
unsigned long ulValue = 0;
|
||
unsigned long ulParam1;
|
||
DWORD dwOffset = (DWORD)PTC_GetModuleHandle(NULL);
|
||
|
||
M_EvalNextParameter( &stParam1 );
|
||
|
||
ulParam1 = M_GetSetParam_ulValue( &stParam1 );
|
||
|
||
ulValue = (unsigned long)(~ulParam1);
|
||
|
||
M_GetSetParam_ulValue(p_stValue) = ulValue;
|
||
M_GetSetParam_Type(p_stValue) = E_vt_PositiveInteger;
|
||
|
||
return(p_stTree);
|
||
}
|
||
/* END ANNECY OA } */
|
||
|
||
|
||
|
||
#endif /* U64 } */
|
||
|
||
/* END ANNECY MT } */
|