reman3/Rayman_X/cpa/tempgrp/GAM/Actions/MSWay.c

587 lines
19 KiB
C
Raw Blame History

/*=========================================================================
* MSWay.cpp : MSWay's functions
* Version 1.0
* Creation date January 21, 1997
* Revision date
*
* That file needs to be compatible for all platforms.
*
* (c) Ubi Studios 1996
*==========================================================================
* Remarks :
* Allocation of MSWay fields are made inside the AI module memory block
* Error raised when handling MSWay fields are raised from AI error module
*==========================================================================*/
/*******************************************************/
/**** For the structures and variables declarations ****/
/*******************************************************/
#define D_MSWay_StructureDefine
#define D_MSWay_VariableDefine
#include "ToolsCPA.h"
#include "Options/Options.h"
#include "Macros.h"
#include "Actions/AllActs.h"
#include "Structur/MemGame.h"
#include "Structur/ErrGame.h"
#include "Structur/Objects.h"
#include "Structur/GameScpt.h"
#include "Structur/StdObjSt.h"
#include "Structur/EngMode.h"
#include "Basic.h"
#include "ObjInit.h"
#include "ZeMem.h"
/*ANNECY JMD{*/
#define _WP_D_WPGRAPH_FRIEND_
#include "AI/AIBASE/WPgraphe.h"
#undef _WP_D_WPGRAPH_FRIEND_
/*ENDANNECY JMD }*/
#include "AI.h"
#include "safe.h" /*BART*/
/*-----------------------------------------------------------------------------
* Description : MSWay's object action script callback
*-----------------------------------------------------------------------------
* Input : Object pointer
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 01/10/96 Author : Francois
*-----------------------------------------------------------------------------
* Modification date : Modification Author : Albert Pais
* Modifications :
* Effective implementation for MS Way
*-----------------------------------------------------------------------------
* Script Section Template for MS Way :
* :MSWay(NbrOfWay)
* Way(FileName,SectionNameOfWay1)
* Way(FileName,SectionNameOfWay2)
* ....
* Way(FileName,SectionNameOfWayNbrOfWay)
* :EndSection
*---------------------------------------------------------------------------*/
#if defined(GAM_USE_SCRIPT)
SCR_tde_Anl_ReturnValue fn_eMSWayScriptCallBack(SCR_tdst_File_Description *_p_stHandle,char *_p_szName,char *_d_szPars[],SCR_tde_Anl_Action _eAction)
{
SCRIPT_tdeReturnValue eReturnValue = R_SCRIPT_NormalReturn;
MS_tdxHandleToMSWay h_MSWay;
struct tdstEngineObject_ *p_stEngineObject;
SCR_M_RdL0_GetSectionLong(C_ParentSection,0,struct tdstEngineObject_ *, p_stEngineObject);
if (M_IsTitle)
{
MMG_fn_vBeginMemoryInfo (MMG_C_lTypeMiniStructure , MMG_C_lSubTypeMSWay , p_stEngineObject);
h_MSWay = fn_h_MSWayRealAlloc();
MMG_fn_vEndMemoryInfo ();
p_stEngineObject->h_MSWay=h_MSWay;
/* Push the result :*/
SCR_M_RdL0_SetSectionLong(C_ThisSection,0,h_MSWay);
}
return(eReturnValue);
}
#endif /* GAM_USE_SCRIPT */
/*-----------------------------------------------------------------------------
* Description : MSWay's mini-structure sizeof
*-----------------------------------------------------------------------------
* Input : None
* Output : Size of
*-----------------------------------------------------------------------------
* Creation date : 14/10/96 Author : Francois
*-----------------------------------------------------------------------------
* Modification date : January 21,1997 Modification Author : Albert Pais
* Modifications : Effective implementation for MS Way
*---------------------------------------------------------------------------*/
unsigned long fn_ulMSWaySizeOf()
{
return(sizeof(struct tdstMSWay_));
}
/*-----------------------------------------------------------------------------
* Description : MSWay's object action allocation
*-----------------------------------------------------------------------------
* Input : Object pointer
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 01/10/96 Author : Francois
*-----------------------------------------------------------------------------
* Modification date : January 21,1997 Modification Author : Albert Pais
* Modifications : Effective implementation for MS Way
*---------------------------------------------------------------------------*/
void fn_vMSWayAlloc(struct tdstEngineObject_ *p_stObject)
{
if (p_stObject==NULL)
M_GameFatalError(E_uwGameMiniStructObjectNull);
if (MSWAY_M_hGetMSWayFromEngineObject(p_stObject)!=MSWAY_M_hInvalidMsWayHandle)
M_GameFatalError(E_uwGameMiniStructAllocAlreadyAlloc);
MMG_fn_vBeginMemoryInfo (MMG_C_lTypeMiniStructure , MMG_C_lSubTypeMSWay , p_stObject);
MSWAY_M_hGetMSWayFromEngineObject(p_stObject) = fn_h_MSWayRealAlloc();
MMG_fn_vEndMemoryInfo ();
}
MS_tdxHandleToMSWay fn_h_MSWayRealAlloc()
{
MS_tdxHandleToMSWay h_MSWay;
h_MSWay = (MS_tdxHandleToMSWay)M_p_GameMallocInHLM(fn_ulMSWaySizeOf());
MSWay_fn_vInitPath (h_MSWay);
return(h_MSWay);
}
/*-----------------------------------------------------------------------------
* Description : MSWay's object action free
*-----------------------------------------------------------------------------
* Input : Object pointer
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 01/10/96 Author : Francois
*-----------------------------------------------------------------------------
* Modification date : January 22,1997 Modification Author : Alb
* Modifications : Effective implementation for MS Way
*---------------------------------------------------------------------------*/
void fn_vMSWayFree(struct tdstEngineObject_ *p_stObject)
{
MS_tdxHandleToMSWay hMSWay;
if (p_stObject==NULL)
M_GameFatalError(E_uwGameMiniStructObjectNull);
hMSWay = MSWAY_M_hGetMSWayFromEngineObject(p_stObject);
if (hMSWay==MSWAY_M_hInvalidMsWayHandle)
M_GameFatalError(E_uwGameMiniStructNull);
/*ANNECY Bart#02 27/05/98 {*/
MSWay_fn_vDesinitPath(hMSWay);
/*ENDANNECY Bart#02 }*/
/* Destroy the object :*/
/* dfm
MSWay_fn_v_DestroyListOfWay
(
MSWAY_M_hGetMSWayFromEngineObject(p_stObject)
);
*/
MMG_fn_vAddMemoryInfo( MMG_C_lTypeMiniStructure , MMG_C_lSubTypeMSWay , p_stObject );
M_GameFreeInHLM(p_stObject->h_MSWay);
}
/*-----------------------------------------------------------------------------
* Description : MSWay's object action initialisation
*-----------------------------------------------------------------------------
* Input : When this function's called (see ObjInit.h)
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 01/10/96 Author : Francois
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void fn_vMSWayInit(struct tdstEngineObject_ *p_stObject,enum tdeObjectTreeInit_ eObjectInit)
{
MS_tdxHandleToMSWay hMSWay;
if (p_stObject==NULL)
M_GameFatalError(E_uwGameMiniStructObjectNull);
hMSWay = MSWAY_M_hGetMSWayFromEngineObject(p_stObject);
if (hMSWay==MSWAY_M_hInvalidMsWayHandle)
M_GameFatalError(E_uwGameMiniStructNull);
MSWay_fn_vInitPath (hMSWay);
}
/*-----------------------------------------------------------------------------
* Description : MSWay's object action desinitialisation
*-----------------------------------------------------------------------------
* Input : When this function's called (see ObjInit.h)
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 01/10/96 Author : Francois
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void fn_vMSWayDesinit(struct tdstEngineObject_ *p_stObject,enum tdeObjectTreeInit_ eObjectInit)
{
MS_tdxHandleToMSWay hMSWay;
if (p_stObject==NULL)
M_GameFatalError(E_uwGameMiniStructObjectNull);
hMSWay = MSWAY_M_hGetMSWayFromEngineObject(p_stObject);
if (hMSWay==MSWAY_M_hInvalidMsWayHandle)
M_GameFatalError(E_uwGameMiniStructNull);
MSWay_fn_vDesinitPath(hMSWay);
}
/*-----------------------------------------------------------------------------
* Description : MSWay's object copy clone action
*-----------------------------------------------------------------------------
* Input : Handle to destination, handle to source
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 30/06/97 Author : Olivier Jourdan
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void fn_vMSWayCopyClone(struct tdstEngineObject_ * _p_stObjectDest,struct tdstEngineObject_ * _p_stObjectSrc)
{
/*ANNECY Bart#02 27/05/98 {*/
MSWay_fn_vDesinitPath(_p_stObjectDest->h_MSWay); /* Just To Be Sure !*/
/*ENDANNECY Bart#02 }*/
memcpy(_p_stObjectDest->h_MSWay,_p_stObjectSrc->h_MSWay,fn_ulMSWaySizeOf());
/*ANNECY Bart#02 27/05/98 {*/
MSWay_fn_vInitPath (_p_stObjectDest->h_MSWay); /* Just To Be Sure !*/
/*ENDANNECY Bart#02 }*/
}
/*-----------------------------------------------------------------------------
* Description : compute the second pass for :
* - list of way
* - waypoint
* - way
*-----------------------------------------------------------------------------
* Input : None
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 13/05/97 Author : Jacques Th<54>noz
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
#if defined(GAM_USE_SCRIPT)
void fn_vWaypointSecondPass (void)
{
WP_fnv_WayPoint_LinkTableSecondPass ();
}
#endif /* GAM_USE_SCRIPT */
/*JMD*************************************************************************
* manage graph ( the m_hPath member )
*****************************************************************************
*
* waypoint are stored in the reversed order the last one is at index 0
* (see WPG_fn_hShortestPath() that built the list from the destination
* to the source, that the algorithme !) so we must read them in reverse
* order
*****************************************************************************/
void MSWay_fn_vInitPath (MS_tdxHandleToMSWay hWay)
{
/*
if ( hWay ) {
hWay->m_hPath = NULL ;
hWay->m_lIndex = -1 ;
hWay->m_bIsCircular = 0;
}
*/
MSWay_fn_vDesinitPath(hWay); /* because we want to be sure that this new graph does not ecrase an old one that would not been desalloued*/
}
void MSWay_fn_vDesinitPath(MS_tdxHandleToMSWay hWay)
{
if ( hWay )
{
if ( hWay->m_hPath )
{
#ifdef GAM_USE_SCRIPT
if (hWay->m_hPath->m_szReferenceSection[0] == '@') /*BART*/
#endif
WPG_fn_vDestroy (hWay->m_hPath) ;
}
hWay->m_hPath = NULL ;
hWay->m_lIndex = -1 ;
hWay->m_bIsCircular = 0;
}
}
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
WP_tdHandleOfGraph MSWay_fn_hGetPathFormPerso (HIE_tdxHandleToSuperObject hSuperObject)
{
MS_tdxHandleToMSWay h_MSWay;
h_MSWay = M_GetMSHandle(hSuperObject, MSWay);
if ( h_MSWay )
return ( h_MSWay->m_hPath ) ;
return (NULL) ;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
void MSWay_fn_vSetPath(MS_tdxHandleToMSWay hWay, WP_tdHandleOfGraph hPath, char _bIsCircular)
{
if ( hWay && hPath )
{
if ( hWay->m_hPath != NULL )
{
#ifdef GAM_USE_SCRIPT
/*if (hWay->m_hPath->m_szNameOfGraph[0] == 0) // no name => not a real graph, so you can destroy it ! !*/
if (hWay->m_hPath->m_szReferenceSection[0] == '@') /*BART*/
#endif
WPG_fn_vDestroy (hWay->m_hPath) ;
}
hWay->m_hPath = hPath ;
/* hWay->m_lIndex = WPG_fn_lNumberOfWaypointOfGraph (hPath) - 1 ;*/
hWay->m_lIndex = 0 ;
hWay->m_bIsCircular = _bIsCircular;
}
}
long MSWay_fn_lGetNumberWayPointInPath (MS_tdxHandleToMSWay hWay)
{
if ( hWay && hWay->m_hPath )
return (LST2_M_DynamicGetNumberOfElements(&hWay->m_hPath->m_hListOfNode)) ;
return (-1) ;
}
long MSWay_fn_lGetCurrentIndexInPath (MS_tdxHandleToMSWay hWay)
{
if (hWay && hWay->m_hPath)
return (hWay->m_lIndex) ;
return (-1) ;
}
long MSWay_fn_lGetLastIndexInPath (MS_tdxHandleToMSWay hWay)
{
if ( hWay && hWay->m_hPath )
return (LST2_M_DynamicGetNumberOfElements(&hWay->m_hPath->m_hListOfNode)-1) ;
/* return (0) ;*/
return (-1) ;
}
long MSWay_fn_lGetFirstIndexInPath (MS_tdxHandleToMSWay hWay)
{
if ( hWay && hWay->m_hPath )
return (0) ;
return (-1) ;
}
long MSWay_fn_lSetCurrentIndexInPath (MS_tdxHandleToMSWay hWay, long _lIndex)
{
long lNbOfElts;
if ( hWay != NULL && hWay->m_hPath )
{
lNbOfElts = LST2_M_DynamicGetNumberOfElements(&hWay->m_hPath->m_hListOfNode);
if (hWay->m_bIsCircular)
{
_lIndex %= lNbOfElts;
if (_lIndex<0) _lIndex+=lNbOfElts;
}
if (_lIndex>=lNbOfElts)
_lIndex = lNbOfElts-1;
if (_lIndex<0)
_lIndex = 0;
hWay->m_lIndex = _lIndex ;
return (hWay->m_lIndex) ;
}
return (-1) ;
}
long MSWay_fn_lLookForWPInMSWay(MS_tdxHandleToMSWay _hWay, WP_tdhWayPoint _hWayPoint)
{
long lNbOfElts;
int iIndex;
WP_tdhGraphNode hElement;
if ( _hWay && _hWay->m_hPath )
{
lNbOfElts = LST2_M_DynamicGetNumberOfElements(&_hWay->m_hPath->m_hListOfNode);
LST2_M_DynamicForEachElementOf(&_hWay->m_hPath->m_hListOfNode, hElement, iIndex)
{
if (_hWayPoint == hElement->m_hWayPoint)
return ((long)(lNbOfElts - iIndex - 1) );
}
}
return(-1);
}
long MSWay_fn_lIncrementCurrentIndexInPath (MS_tdxHandleToMSWay hWay, int iStep)
{
long lNbOfElts;
SAF_M_AssertWithMsg((hWay != NULL),"MsWay non alloue")
if (hWay == NULL)
return (-1);
SAF_M_AssertWithMsg((hWay->m_hPath != NULL),"MsWay non initialise")
if ( hWay->m_hPath )
{
lNbOfElts = LST2_M_DynamicGetNumberOfElements(&hWay->m_hPath->m_hListOfNode);
if (hWay->m_bIsCircular)
{
hWay->m_lIndex += iStep;
hWay->m_lIndex %= lNbOfElts;
if (hWay->m_lIndex<0) hWay->m_lIndex+=lNbOfElts;
return (hWay->m_lIndex);
}
else
{
if ( (hWay->m_lIndex + iStep >= 0) &&
(hWay->m_lIndex + iStep < lNbOfElts ) )
{
hWay->m_lIndex += iStep ;
return (hWay->m_lIndex) ;
}
}
}
return (-1) ;
}
WP_tdhWayPoint MSWay_fn_hGetWayPointOfPath (MS_tdxHandleToMSWay hWay, int iIndex)
{
WP_tdhGraphNode hElement ;
int i, k ;
long lNbOfElts;
if ( hWay && hWay->m_hPath)
{
lNbOfElts = LST2_M_DynamicGetNumberOfElements(&hWay->m_hPath->m_hListOfNode);
if (hWay->m_bIsCircular)
{
iIndex %= lNbOfElts;
if (iIndex<0) iIndex+=lNbOfElts;
}
else
{
if (iIndex < 0 || iIndex >= lNbOfElts )
return(NULL);
}
k = lNbOfElts - iIndex - 1;
LST2_M_DynamicGetElementNumber(&hWay->m_hPath->m_hListOfNode, hElement, k, i)
return (hElement->m_hWayPoint);
}
return (NULL) ;
}
unsigned long MSWay_fn_ulGetCapsForNextWayPointOfPath (MS_tdxHandleToMSWay hWay, int iIndex)
{
WP_tdhWayPoint hWayPoint1, hWayPoint2 ;
unsigned long ulNewCaps ;
long lNbOfElts;
if ( hWay && hWay->m_hPath != NULL)
{
lNbOfElts = LST2_M_DynamicGetNumberOfElements(&hWay->m_hPath->m_hListOfNode);
if (hWay->m_bIsCircular)
{
iIndex %= lNbOfElts;
if (iIndex<0) iIndex+=lNbOfElts;
}
if ( iIndex >= 0 && iIndex < lNbOfElts )
{
hWayPoint1 = MSWay_fn_hGetWayPointOfPath(hWay, iIndex ) ;
hWayPoint2 = MSWay_fn_hGetWayPointOfPath(hWay, iIndex+1 ) ;
if ( hWayPoint2 )
{
if (WPG_fn_lGetLinkCapabilities (hWay->m_hPath, hWayPoint1, hWayPoint2, &ulNewCaps)== -1 )
return (0);
return ( ulNewCaps ) ;
}
}
}
return (0) ;
}
long MSWay_fn_lChangeCapsForNextWayPointOfPath (MS_tdxHandleToMSWay hWay, int iIndex, unsigned long ulNewCaps, long lValue)
{
WP_tdhWayPoint hWayPoint1, hWayPoint2 ;
long lNbOfElts;
if ( hWay && hWay->m_hPath != NULL)
{
lNbOfElts = LST2_M_DynamicGetNumberOfElements(&hWay->m_hPath->m_hListOfNode);
if (hWay->m_bIsCircular)
{
iIndex %= lNbOfElts;
if (iIndex<0) iIndex+=lNbOfElts;
}
if ( iIndex >= 0 && iIndex < lNbOfElts )
{
hWayPoint1 = MSWay_fn_hGetWayPointOfPath(hWay, iIndex ) ;
hWayPoint2 = MSWay_fn_hGetWayPointOfPath(hWay, iIndex+1 ) ;
if ( hWayPoint2 )
{
return (WPG_fn_lChangeLinkCapabilities (hWay->m_hPath, hWayPoint1, hWayPoint2, ulNewCaps, lValue)); /* -1 if error*/
}
}
}
return (-1) ;
}
long MSWay_fn_lGetWeightForNextWayPointOfPath (MS_tdxHandleToMSWay hWay, int iIndex)
{
WP_tdhWayPoint hWayPoint1, hWayPoint2 ;
long lValue ;
long lNbOfElts;
if ( hWay && hWay->m_hPath != NULL)
{
lNbOfElts = LST2_M_DynamicGetNumberOfElements(&hWay->m_hPath->m_hListOfNode);
if (hWay->m_bIsCircular)
{
iIndex %= lNbOfElts;
if (iIndex<0) iIndex+=lNbOfElts;
}
if ( iIndex >= 0 && iIndex < lNbOfElts )
{
hWayPoint1 = MSWay_fn_hGetWayPointOfPath(hWay, iIndex ) ;
hWayPoint2 = MSWay_fn_hGetWayPointOfPath(hWay, iIndex+1 ) ;
if ( hWayPoint2 )
{
if (WPG_fn_lGetLinkWeight (hWay->m_hPath, hWayPoint1, hWayPoint2, &lValue)== -1 )
return (0);
return ( lValue ) ;
}
}
}
return (0) ;
}
long MSWay_fn_lChangeWeightForNextWayPointOfPath (MS_tdxHandleToMSWay hWay, int iIndex, long lWeight)
{
WP_tdhWayPoint hWayPoint1, hWayPoint2 ;
long lNbOfElts;
if ( hWay && hWay->m_hPath != NULL)
{
lNbOfElts = LST2_M_DynamicGetNumberOfElements(&hWay->m_hPath->m_hListOfNode);
if (hWay->m_bIsCircular)
{
iIndex %= lNbOfElts;
if (iIndex<0) iIndex+=lNbOfElts;
}
if ( iIndex >= 0 && iIndex < lNbOfElts )
{
hWayPoint1 = MSWay_fn_hGetWayPointOfPath(hWay, iIndex ) ;
hWayPoint2 = MSWay_fn_hGetWayPointOfPath(hWay, iIndex+1 ) ;
if ( hWayPoint2 )
{
return (WPG_fn_lChangeLinkWeight (hWay->m_hPath, hWayPoint1, hWayPoint2, lWeight)); /* -1 if error*/
}
}
}
return (-1) ;
}