/*
 **************************************************************************************************
 **************************************************************************************************
 **************************************************************************************************
 **************************************************************************************************
 */
extern
#ifdef _DEBUG
"C"
#endif
unsigned long fn_ulDetermineUsefulDT();
 
#define D_CineInfo_StructureDefine
 
#include "AIUseCPA.h"
#include "AIMacros.h"
 
#include "StrIntel.h"
#include "Intell.h"
#include "ActParam.h"
#include "Action.h"
#include "Convert.h"
#include "EnumAct.h"
 
#include "Gam.h"
 
#include "specif/AITools.h"
#include "CAM_Base.h"
#include "CAM_Tool.h"
 
/*
 *=================================================================================================
 *=================================================================================================
 */
void fnv_MoveAToB
(
	HIE_tdxHandleToSuperObject	p_SuperObjPerso,
	MTH3D_tdstVector			*_p_stSource,
	MTH3D_tdstVector			*_p_stDest,
	MTH3D_tdstVector			*_p_stCurrent,
	int							_iTime,
	int							_iAccel
)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
	MTH_tdxReal			xDist, xActDist, xSpeed, xTemp;
	long				lTime;
	MTH3D_tdstVector	stTempVector;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	/* Total dist to move */
	MTH3D_M_vSubVector(&stTempVector, _p_stDest, _p_stSource);
	xDist = MTH3D_M_xNormVector(&stTempVector);
 
	/* Dist already moved */
	MTH3D_M_vSubVector(&stTempVector, _p_stCurrent, _p_stSource);
	xActDist = MTH3D_M_xNormVector(&stTempVector);
 
	/* Max speed depending on total time and distance */
	xSpeed = MTH_M_xDiv(xDist, MTH_M_xLongToReal(_iTime));
 
	/* Time elapsed since beginning */
	lTime = g_stEngineStructure.stEngineTimer.ulCurrentTimerCount - fn_lGetActionParamlValue(5, p_SuperObjPerso);
 
	/* Accel */
	if(lTime < _iAccel)
	{
		xSpeed = MTH_M_xMul(MTH_M_xDiv(xSpeed, MTH_M_xLongToReal(_iAccel)), lTime);
	}
 
	/* Decel */
	if(lTime > _iTime - _iAccel)
	{
		xTemp = MTH_M_xMul(MTH_M_xLongToReal(lTime), -MTH_M_xDiv(xSpeed, MTH_M_xLongToReal(_iAccel)));
		xSpeed = MTH_M_xAdd(xTemp, MTH_M_xDiv(MTH_M_xMul(MTH_M_xLongToReal(_iTime), xSpeed), MTH_M_xFloatToReal(_iAccel)));
	}
 
	/* New pos */
	MTH3D_M_vSubVector(&stTempVector, _p_stDest, _p_stSource);
	MTH3D_M_vNormalizeVector(&stTempVector, &stTempVector);
 
	xSpeed = MTH_M_xMul(xSpeed, fn_ulDetermineUsefulDT());
	MTH3D_M_vMulScalarVector(&stTempVector, xSpeed, &stTempVector);
	MTH3D_M_vAddVector(_p_stDest, &stTempVector, _p_stCurrent);
}
 
/*
 *=================================================================================================
 *=================================================================================================
 */
void fnv_TurnAWithB
(
	HIE_tdxHandleToSuperObject	p_SuperObjPerso,
	MTH3D_tdstVector			*_p_stSource,
	MTH3D_tdstVector			*_p_stPointAxis,
	MTH3D_tdstVector			*_p_stAxis,
	MTH3D_tdstVector			*_p_stCurrent,
	MTH_tdxReal					_xAngle,
	int							_iTime,
	int							_iAccel
)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
	MTH_tdxReal			xActAngle, xSpeed, xTemp;
	long				lTime;
	MTH3D_tdstVector	stTempVector, stTempVector1;
	MTH_tdstRotation	stRotation;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	/* Angle already move */
	MTH3D_M_vSubVector(&stTempVector, _p_stCurrent, _p_stPointAxis);
	CAM_fn_vComputeProjection(&stTempVector, &stTempVector, _p_stAxis);
	MTH3D_M_vSubVector(&stTempVector1, _p_stSource, _p_stPointAxis);
	CAM_fn_vComputeProjection(&stTempVector1, &stTempVector1, _p_stAxis);
 
	xActAngle = CAM_fn_xComputeRotation(&stTempVector1, &stTempVector, NULL);
 
	/* Max speed depending on total time and distance */
	xSpeed = MTH_M_xDiv(_xAngle, MTH_M_xLongToReal(_iTime));
 
	/* Time elapsed since beginning */
	lTime = g_stEngineStructure.stEngineTimer.ulCurrentTimerCount - fn_lGetActionParamlValue(5, p_SuperObjPerso);
 
	/* Accel */
	if(lTime < _iAccel)
	{
		xSpeed = MTH_M_xMul(MTH_M_xDiv(xSpeed, MTH_M_xLongToReal(_iAccel)), lTime);
	}
 
	/* Decel */
	if(lTime > _iTime - _iAccel)
	{
		xTemp = MTH_M_xMul(MTH_M_xLongToReal(lTime), -MTH_M_xDiv(xSpeed, MTH_M_xLongToReal(_iAccel)));
		xSpeed = MTH_M_xAdd(xTemp, MTH_M_xDiv(MTH_M_xMul(MTH_M_xLongToReal(_iTime), xSpeed), MTH_M_xFloatToReal(_iAccel)));
	}
 
	/* New pos */
	MTH3D_M_vCopyVector(&stRotation.m_stAxis, _p_stAxis);
	xSpeed = MTH_M_xMul(xSpeed, fn_ulDetermineUsefulDT());
	stRotation.m_xAngle = xSpeed;
	MTH3D_M_vSubVector(&stTempVector, _p_stCurrent, _p_stPointAxis);
	MTH_p_stRotationMulVector(&stRotation, &stTempVector, _p_stSource);
	MTH3D_M_vAddVector(_p_stSource, _p_stSource, _p_stPointAxis);
}
 
 
/*
 **************************************************************************************************
 **************************************************************************************************
 **************************************************************************************************
 **************************************************************************************************
 */
 
 
/*
 *=================================================================================================
 *=================================================================================================
 */
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
 
tdstNodeInterpret *fn_p_stCamCineInit(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    MS_tdxHandleToCineinfo	hCineinfo;
	MTH3D_tdstVector		stTempVector;
	enum tdeMetaActionId_	eMetaActionId = M_eMetaActionIdInterpret(p_stTree-1);
	tdstGetSetParam			stParam;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	hCineinfo = M_GetMSHandle(p_SuperObjPerso, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineinfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
	/* No meca */
	M_GetMSHandle(p_SuperObjPerso, StandardGame)->ulCustomBits |= 0x8000;
 
	MTH3D_M_vSetVectorElements(&stTempVector, MTH_C_ZERO, MTH_C_ZERO, MTH_C_ONE);
	switch(eMetaActionId)
	{
	case eMetaAction_CamCineMoveAToBTgtC:
	case eMetaAction_CamCineMoveAToBTgtAC:
	case eMetaAction_CamCinePosAMoveTgtBToC:
 
		M_EvalNextParameter(&stParam);
        fn_vSetActionParamp_stVertex(0, p_SuperObjPerso, &M_GetSetParam_stVertexValue(&stParam));
		M_EvalNextParameter(&stParam);
        fn_vSetActionParamp_stVertex(1, p_SuperObjPerso, &M_GetSetParam_stVertexValue(&stParam));
		M_EvalNextParameter(&stParam);
        fn_vSetActionParamp_stVertex(2, p_SuperObjPerso, &M_GetSetParam_stVertexValue(&stParam));
		M_EvalNextParameter(&stParam);
		fn_vSetActionParamlValue(3, p_SuperObjPerso, M_ReturnParam_lValue(&stParam));
		M_EvalNextParameter(&stParam);
		fn_vSetActionParamlValue(4, p_SuperObjPerso, M_ReturnParam_lValue(&stParam));
 
 		fn_vSetActionParamlValue(5, p_SuperObjPerso, g_stEngineStructure.stEngineTimer.ulCurrentTimerCount);
		CAM_fn_vForceCameraPos(p_SuperObjPerso, fn_p_stGetActionParamp_stVertex(0,p_SuperObjPerso));
		if(eMetaActionId == eMetaAction_CamCinePosAMoveTgtBToC)
		{
			CAM_fn_vForceCameraTgt(p_SuperObjPerso, fn_p_stGetActionParamp_stVertex(1,p_SuperObjPerso), &stTempVector);
			/* To remember actual target */
			fn_vSetActionParamp_stVertex(0, p_SuperObjPerso, fn_p_stGetActionParamp_stVertex(1,p_SuperObjPerso));
		}
		else
			CAM_fn_vForceCameraTgt(p_SuperObjPerso, fn_p_stGetActionParamp_stVertex(2,p_SuperObjPerso), &stTempVector);
		break;
 
	case eMetaAction_CamCinePosATgtB:
		M_EvalNextParameter(&stParam);
        fn_vSetActionParamp_stVertex(0, p_SuperObjPerso, &M_GetSetParam_stVertexValue(&stParam));
		M_EvalNextParameter(&stParam);
        fn_vSetActionParamp_stVertex(1, p_SuperObjPerso, &M_GetSetParam_stVertexValue(&stParam));
		M_EvalNextParameter(&stParam);
		fn_vSetActionParamlValue(2, p_SuperObjPerso, M_ReturnParam_lValue(&stParam));
 
 		fn_vSetActionParamlValue(3, p_SuperObjPerso, g_stEngineStructure.stEngineTimer.ulCurrentTimerCount);
		CAM_fn_vForceCameraPos(p_SuperObjPerso, fn_p_stGetActionParamp_stVertex(0,p_SuperObjPerso));
		CAM_fn_vForceCameraTgt(p_SuperObjPerso, fn_p_stGetActionParamp_stVertex(1,p_SuperObjPerso), &stTempVector);
		break;
 
	case eMetaAction_CamCinePosATgtBTurnPosH:
	case eMetaAction_CamCinePosATgtBTurnTgtH:
	case eMetaAction_CamCinePosATgtBTurnPosV:
	case eMetaAction_CamCinePosATgtBTurnTgtV:
 
		M_EvalNextParameter(&stParam);
        fn_vSetActionParamp_stVertex(0, p_SuperObjPerso, &M_GetSetParam_stVertexValue(&stParam));
		M_EvalNextParameter(&stParam);
        fn_vSetActionParamp_stVertex(1, p_SuperObjPerso, &M_GetSetParam_stVertexValue(&stParam));
		M_EvalNextParameter(&stParam);
        fn_vSetActionParamxValue(2, p_SuperObjPerso, M_GetSetParam_xValue(&stParam));
		M_EvalNextParameter(&stParam);
        fn_vSetActionParamlValue(3, p_SuperObjPerso, M_ReturnParam_lValue(&stParam));
		M_EvalNextParameter(&stParam);
        fn_vSetActionParamlValue(4, p_SuperObjPerso, M_ReturnParam_lValue(&stParam));
 
 		fn_vSetActionParamlValue(5, p_SuperObjPerso, g_stEngineStructure.stEngineTimer.ulCurrentTimerCount);
		CAM_fn_vForceCameraPos(p_SuperObjPerso, fn_p_stGetActionParamp_stVertex(0,p_SuperObjPerso));
		CAM_fn_vForceCameraTgt(p_SuperObjPerso, fn_p_stGetActionParamp_stVertex(1,p_SuperObjPerso), &stTempVector);
		if((eMetaActionId == eMetaAction_CamCinePosATgtBTurnTgtH) || (eMetaActionId == eMetaAction_CamCinePosATgtBTurnTgtV))
		{
			/* To remember actual target */
			fn_vSetActionParamp_stVertex(0, p_SuperObjPerso, fn_p_stGetActionParamp_stVertex(1,p_SuperObjPerso));
		}
		break;
 
	default:
		break;
	}
 
	return p_stTree;
}
 
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
 
 
/*
 **************************************************************************************************
 **************************************************************************************************
 **************************************************************************************************
 **************************************************************************************************
 */
 
 
/*
 *=================================================================================================
 *=================================================================================================
 */
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
 
tducActionReturn fn_ucCamCineMoveAToBTgtC(HIE_tdxHandleToSuperObject p_SuperObjPerso)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    MS_tdxHandleToCineinfo	hCineinfo;
	MTH3D_tdstVector		stTempVector, stCurrentCameraPos;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	hCineinfo = M_GetMSHandle(p_SuperObjPerso, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineinfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
	/* Test end of meta action */
	if
	(
		g_stEngineStructure.stEngineTimer.ulCurrentTimerCount >=
		((unsigned long) fn_lGetActionParamlValue(5, p_SuperObjPerso)+(unsigned long) fn_lGetActionParamlValue(3, p_SuperObjPerso))
	)
	{
		CAM_fn_vForceCameraPos(p_SuperObjPerso, fn_p_stGetActionParamp_stVertex(1,p_SuperObjPerso));
		MTH3D_M_vSetVectorElements(&stTempVector, MTH_C_ZERO, MTH_C_ZERO, MTH_C_ONE);
		CAM_fn_vForceCameraTgt(p_SuperObjPerso, fn_p_stGetActionParamp_stVertex(2,p_SuperObjPerso), &stTempVector);
		/* Meca */
		M_GetMSHandle(p_SuperObjPerso, StandardGame)->ulCustomBits &= ~0x8000;
		return C_DefaultMetaActionFinished;
	}
 
	/* Actual camera pos */
	POS_fn_vGetTranslationVector
	(
		HIE_fn_hGetSuperObjectGlobalMatrix(p_SuperObjPerso),
		&stCurrentCameraPos
	);
 
	MTH3D_M_vCopyVector(&stTempVector, fn_p_stGetActionParamp_stVertex(1,p_SuperObjPerso));
	fnv_MoveAToB
	(
		p_SuperObjPerso,
		fn_p_stGetActionParamp_stVertex(0,p_SuperObjPerso),
		&stTempVector,
		&stCurrentCameraPos,
		fn_lGetActionParamlValue(3, p_SuperObjPerso),
		fn_lGetActionParamlValue(4, p_SuperObjPerso)
	);
	CAM_fn_vForceCameraPos(p_SuperObjPerso, &stTempVector);
	MTH3D_M_vSetVectorElements(&stTempVector, MTH_C_ZERO, MTH_C_ZERO, MTH_C_ONE);
	CAM_fn_vForceCameraTgt(p_SuperObjPerso, fn_p_stGetActionParamp_stVertex(2,p_SuperObjPerso), &stTempVector);
 
	return C_DefaultMetaActionNotFinished;
}
 
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
 
/*
 *=================================================================================================
 *=================================================================================================
 */
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
tducActionReturn fn_ucCamCineMoveAToBTgtAC(HIE_tdxHandleToSuperObject p_SuperObjPerso)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    MS_tdxHandleToCineinfo	hCineinfo;
	MTH3D_tdstVector		stTempVector, stTempVector1, stCurrentCameraPos;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	hCineinfo = M_GetMSHandle(p_SuperObjPerso, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineinfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
	/* Test end of meta action */
	if
	(
		g_stEngineStructure.stEngineTimer.ulCurrentTimerCount >=
		((unsigned long) fn_lGetActionParamlValue(5, p_SuperObjPerso)+(unsigned long) fn_lGetActionParamlValue(3, p_SuperObjPerso))
	)
	{
		CAM_fn_vForceCameraPos(p_SuperObjPerso, fn_p_stGetActionParamp_stVertex(1,p_SuperObjPerso));
		MTH3D_M_vSubVector(&stTempVector1, fn_p_stGetActionParamp_stVertex(2,p_SuperObjPerso), fn_p_stGetActionParamp_stVertex(0,p_SuperObjPerso));
		MTH3D_M_vAddVector(&stTempVector1, &stTempVector1, fn_p_stGetActionParamp_stVertex(1,p_SuperObjPerso));
		MTH3D_M_vSetVectorElements(&stTempVector, MTH_C_ZERO, MTH_C_ZERO, MTH_C_ONE);
		CAM_fn_vForceCameraTgt(p_SuperObjPerso, &stTempVector1, &stTempVector);
		/* Meca */
		M_GetMSHandle(p_SuperObjPerso, StandardGame)->ulCustomBits &= ~0x8000;
		return C_DefaultMetaActionFinished;
	}
 
	/* Actual camera pos */
	POS_fn_vGetTranslationVector
	(
		HIE_fn_hGetSuperObjectGlobalMatrix(p_SuperObjPerso),
		&stCurrentCameraPos
	);
 
	MTH3D_M_vCopyVector(&stTempVector, fn_p_stGetActionParamp_stVertex(1,p_SuperObjPerso));
	fnv_MoveAToB
	(
		p_SuperObjPerso,
		fn_p_stGetActionParamp_stVertex(0,p_SuperObjPerso),
		&stTempVector,
		&stCurrentCameraPos,
		fn_lGetActionParamlValue(3, p_SuperObjPerso),
		fn_lGetActionParamlValue(4, p_SuperObjPerso)
	);
	CAM_fn_vForceCameraPos(p_SuperObjPerso, &stTempVector);
 
	MTH3D_M_vSubVector(&stTempVector1, fn_p_stGetActionParamp_stVertex(2,p_SuperObjPerso), fn_p_stGetActionParamp_stVertex(0,p_SuperObjPerso));
	MTH3D_M_vAddVector(&stTempVector1, &stTempVector1, &stTempVector);
	MTH3D_M_vSetVectorElements(&stTempVector, MTH_C_ZERO, MTH_C_ZERO, MTH_C_ONE);
	CAM_fn_vForceCameraTgt(p_SuperObjPerso, &stTempVector1, &stTempVector);
 
	return C_DefaultMetaActionNotFinished;
}
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
 
/*
 *=================================================================================================
 *=================================================================================================
 */
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
tducActionReturn fn_ucCamCinePosATgtB(HIE_tdxHandleToSuperObject p_SuperObjPerso)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    MS_tdxHandleToCineinfo	hCineinfo;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	hCineinfo = M_GetMSHandle(p_SuperObjPerso, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineinfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
	/* Test end of meta action */
	if
	(
		g_stEngineStructure.stEngineTimer.ulCurrentTimerCount >=
		((unsigned long) fn_lGetActionParamlValue(3, p_SuperObjPerso)+(unsigned long) fn_lGetActionParamlValue(2, p_SuperObjPerso))
	)
	{
		/* Meca */
		M_GetMSHandle(p_SuperObjPerso, StandardGame)->ulCustomBits &= ~0x8000;
		return C_DefaultMetaActionFinished;
	}
 
	return C_DefaultMetaActionNotFinished;
}
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
 
/*
 *=================================================================================================
 *=================================================================================================
 */
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
tducActionReturn fn_ucCamCinePosAMoveTgtBToC(HIE_tdxHandleToSuperObject p_SuperObjPerso)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    MS_tdxHandleToCineinfo	hCineinfo;
	MTH3D_tdstVector		stTempVector, stTempVector1, stCurrentTarget;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	hCineinfo = M_GetMSHandle(p_SuperObjPerso, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineinfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
	/* Test end of meta action */
	if
	(
		g_stEngineStructure.stEngineTimer.ulCurrentTimerCount >=
		((unsigned long) fn_lGetActionParamlValue(5, p_SuperObjPerso)+(unsigned long) fn_lGetActionParamlValue(3, p_SuperObjPerso))
	)
	{
		MTH3D_M_vSetVectorElements(&stTempVector1, MTH_C_ZERO, MTH_C_ZERO, MTH_C_ONE);
		CAM_fn_vForceCameraTgt(p_SuperObjPerso, fn_p_stGetActionParamp_stVertex(2,p_SuperObjPerso), &stTempVector1);
		/* Meca */
		M_GetMSHandle(p_SuperObjPerso, StandardGame)->ulCustomBits &= ~0x8000;
		return C_DefaultMetaActionFinished;
	}
 
	/* Current target */
	MTH3D_M_vCopyVector(&stCurrentTarget, fn_p_stGetActionParamp_stVertex(0,p_SuperObjPerso));
 
	MTH3D_M_vCopyVector(&stTempVector, fn_p_stGetActionParamp_stVertex(2,p_SuperObjPerso));
	fnv_MoveAToB
	(
		p_SuperObjPerso,
		fn_p_stGetActionParamp_stVertex(1,p_SuperObjPerso),
		&stTempVector,
		&stCurrentTarget,
		fn_lGetActionParamlValue(3, p_SuperObjPerso),
		fn_lGetActionParamlValue(4, p_SuperObjPerso)
	);
	MTH3D_M_vSetVectorElements(&stTempVector1, MTH_C_ZERO, MTH_C_ZERO, MTH_C_ONE);
	CAM_fn_vForceCameraTgt(p_SuperObjPerso, &stTempVector, &stTempVector1);
 
	/* Remember actual target */
    fn_vSetActionParamp_stVertex(0, p_SuperObjPerso, &stTempVector);
 
	return C_DefaultMetaActionNotFinished;
}
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
 
 
 
 
 
 
/*
 *=================================================================================================
 *=================================================================================================
 */
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
tducActionReturn fn_ucCamCinePosATgtBTurnPosH(HIE_tdxHandleToSuperObject p_SuperObjPerso)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    MS_tdxHandleToCineinfo		hCineinfo;
	MTH3D_tdstVector			stTempVector, stCurrentCameraPos, stAxis;
	POS_tdstCompletePosition	*p_stPersoGlobalMatrix;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	hCineinfo = M_GetMSHandle(p_SuperObjPerso, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineinfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
	/* Test end of meta action */
	if
	(
		g_stEngineStructure.stEngineTimer.ulCurrentTimerCount >=
		((unsigned long) fn_lGetActionParamlValue(5, p_SuperObjPerso)+(unsigned long) fn_lGetActionParamlValue(3, p_SuperObjPerso))
	)
	{
		/* Meca */
		M_GetMSHandle(p_SuperObjPerso, StandardGame)->ulCustomBits &= ~0x8000;
		return C_DefaultMetaActionFinished;
	}
 
	/* Actual camera pos */
	POS_fn_vGetTranslationVector
	(
		HIE_fn_hGetSuperObjectGlobalMatrix(p_SuperObjPerso),
		&stCurrentCameraPos
	);
 
	/* Rotation axis is camera Z */
	p_stPersoGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(p_SuperObjPerso);
	POS_fn_vGetRotationMatrix(p_stPersoGlobalMatrix, &stTempVector, &stTempVector, &stAxis);
 
	MTH3D_M_vCopyVector(&stTempVector, fn_p_stGetActionParamp_stVertex(0,p_SuperObjPerso));
	fnv_TurnAWithB
	(
		p_SuperObjPerso,
		&stTempVector,
		fn_p_stGetActionParamp_stVertex(1,p_SuperObjPerso),
		&stAxis,
		&stCurrentCameraPos,
		fn_xGetActionParamxValue(2, p_SuperObjPerso),
		fn_lGetActionParamlValue(3, p_SuperObjPerso),
		fn_lGetActionParamlValue(4, p_SuperObjPerso)
	);
	CAM_fn_vForceCameraPos(p_SuperObjPerso, &stTempVector);
	MTH3D_M_vSetVectorElements(&stTempVector, MTH_C_ZERO, MTH_C_ZERO, MTH_C_ONE);
	CAM_fn_vForceCameraTgt(p_SuperObjPerso, fn_p_stGetActionParamp_stVertex(1,p_SuperObjPerso), &stTempVector);
 
	return C_DefaultMetaActionNotFinished;
}
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
 
/*
 *=================================================================================================
 *=================================================================================================
 */
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
tducActionReturn fn_ucCamCinePosATgtBTurnPosV(HIE_tdxHandleToSuperObject p_SuperObjPerso)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    MS_tdxHandleToCineinfo	hCineinfo;
	MTH3D_tdstVector		stTempVector, stCurrentCameraPos, stAxis;
	POS_tdstCompletePosition	*p_stPersoGlobalMatrix;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	hCineinfo = M_GetMSHandle(p_SuperObjPerso, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineinfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
	/* Test end of meta action */
	if
	(
		g_stEngineStructure.stEngineTimer.ulCurrentTimerCount >=
		((unsigned long) fn_lGetActionParamlValue(5, p_SuperObjPerso)+(unsigned long) fn_lGetActionParamlValue(3, p_SuperObjPerso))
	)
	{
		/* Meca */
		M_GetMSHandle(p_SuperObjPerso, StandardGame)->ulCustomBits &= ~0x8000;
		return C_DefaultMetaActionFinished;
	}
 
	/* Actual camera pos */
	POS_fn_vGetTranslationVector
	(
		HIE_fn_hGetSuperObjectGlobalMatrix(p_SuperObjPerso),
		&stCurrentCameraPos
	);
 
	/* Rotation axis is camera X */
	p_stPersoGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(p_SuperObjPerso);
	POS_fn_vGetRotationMatrix(p_stPersoGlobalMatrix, &stAxis, &stTempVector, &stTempVector);
 
	MTH3D_M_vCopyVector(&stTempVector, fn_p_stGetActionParamp_stVertex(0,p_SuperObjPerso));
	fnv_TurnAWithB
	(
		p_SuperObjPerso,
		&stTempVector,
		fn_p_stGetActionParamp_stVertex(1,p_SuperObjPerso),
		&stAxis,
		&stCurrentCameraPos,
		fn_xGetActionParamxValue(2, p_SuperObjPerso),
		fn_lGetActionParamlValue(3, p_SuperObjPerso),
		fn_lGetActionParamlValue(4, p_SuperObjPerso)
	);
	CAM_fn_vForceCameraPos(p_SuperObjPerso, &stTempVector);
	MTH3D_M_vSetVectorElements(&stTempVector, MTH_C_ZERO, MTH_C_ZERO, MTH_C_ONE);
	CAM_fn_vForceCameraTgt(p_SuperObjPerso, fn_p_stGetActionParamp_stVertex(1,p_SuperObjPerso), &stTempVector);
 
	return C_DefaultMetaActionNotFinished;
}
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
 
/*
 *=================================================================================================
 *=================================================================================================
 */
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
tducActionReturn fn_ucCamCinePosATgtBTurnTgtH(HIE_tdxHandleToSuperObject p_SuperObjPerso)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    MS_tdxHandleToCineinfo	hCineinfo;
	MTH3D_tdstVector		stCurrentCameraPos, stTempVector, stTempVector1, stAxis;
	POS_tdstCompletePosition	*p_stPersoGlobalMatrix;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	hCineinfo = M_GetMSHandle(p_SuperObjPerso, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineinfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
	/* Test end of meta action */
	if
	(
		g_stEngineStructure.stEngineTimer.ulCurrentTimerCount >=
		((unsigned long) fn_lGetActionParamlValue(5, p_SuperObjPerso)+(unsigned long) fn_lGetActionParamlValue(3, p_SuperObjPerso))
	)
	{
		/* Meca */
		M_GetMSHandle(p_SuperObjPerso, StandardGame)->ulCustomBits &= ~0x8000;
		return C_DefaultMetaActionFinished;
	}
 
	/* Actual camera pos */
	POS_fn_vGetTranslationVector
	(
		HIE_fn_hGetSuperObjectGlobalMatrix(p_SuperObjPerso),
		&stCurrentCameraPos
	);
 
	/* Rotation axis is camera Z */
	p_stPersoGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(p_SuperObjPerso);
	POS_fn_vGetRotationMatrix(p_stPersoGlobalMatrix, &stTempVector, &stTempVector, &stAxis);
 
	MTH3D_M_vCopyVector(&stTempVector, fn_p_stGetActionParamp_stVertex(1,p_SuperObjPerso));
	fnv_TurnAWithB
	(
		p_SuperObjPerso,
		&stTempVector,
		&stCurrentCameraPos,
		&stAxis,
		fn_p_stGetActionParamp_stVertex(0,p_SuperObjPerso),
		fn_xGetActionParamxValue(2, p_SuperObjPerso),
		fn_lGetActionParamlValue(3, p_SuperObjPerso),
		fn_lGetActionParamlValue(4, p_SuperObjPerso)
	);
	MTH3D_M_vSetVectorElements(&stTempVector1, MTH_C_ZERO, MTH_C_ZERO, MTH_C_ONE);
	CAM_fn_vForceCameraTgt(p_SuperObjPerso, &stTempVector, &stTempVector1);
 
	/* Remember actual target */
    fn_vSetActionParamp_stVertex(0, p_SuperObjPerso, &stTempVector);
 
	return C_DefaultMetaActionNotFinished;
}
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
 
/*
 *=================================================================================================
 *=================================================================================================
 */
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
tducActionReturn fn_ucCamCinePosATgtBTurnTgtV(HIE_tdxHandleToSuperObject p_SuperObjPerso)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    MS_tdxHandleToCineinfo		hCineinfo;
	MTH3D_tdstVector			stCurrentCameraPos, stTempVector, stTempVector1, stAxis;
	POS_tdstCompletePosition	*p_stPersoGlobalMatrix;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	hCineinfo = M_GetMSHandle(p_SuperObjPerso, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineinfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
	/* Test end of meta action */
	if
	(
		g_stEngineStructure.stEngineTimer.ulCurrentTimerCount >=
		((unsigned long) fn_lGetActionParamlValue(5, p_SuperObjPerso)+(unsigned long) fn_lGetActionParamlValue(3, p_SuperObjPerso))
	)
	{
		/* Meca */
		M_GetMSHandle(p_SuperObjPerso, StandardGame)->ulCustomBits &= ~0x8000;
		return C_DefaultMetaActionFinished;
	}
 
	/* Actual camera pos */
	POS_fn_vGetTranslationVector
	(
		HIE_fn_hGetSuperObjectGlobalMatrix(p_SuperObjPerso),
		&stCurrentCameraPos
	);
 
	/* Rotation axis is camera X */
	p_stPersoGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(p_SuperObjPerso);
	POS_fn_vGetRotationMatrix(p_stPersoGlobalMatrix, &stAxis, &stTempVector, &stTempVector);
 
	MTH3D_M_vCopyVector(&stTempVector, fn_p_stGetActionParamp_stVertex(1,p_SuperObjPerso));
	fnv_TurnAWithB
	(
		p_SuperObjPerso,
		&stTempVector,
		&stCurrentCameraPos,
		&stAxis,
		fn_p_stGetActionParamp_stVertex(0,p_SuperObjPerso),
		fn_xGetActionParamxValue(2, p_SuperObjPerso),
		fn_lGetActionParamlValue(3, p_SuperObjPerso),
		fn_lGetActionParamlValue(4, p_SuperObjPerso)
	);
	MTH3D_M_vSetVectorElements(&stTempVector1, MTH_C_ZERO, MTH_C_ZERO, MTH_C_ONE);
	CAM_fn_vForceCameraTgt(p_SuperObjPerso, &stTempVector, &stTempVector1);
 
	/* Remember actual target */
    fn_vSetActionParamp_stVertex(0, p_SuperObjPerso, &stTempVector);
 
	return C_DefaultMetaActionNotFinished;
}
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
 
