reman3/Rayman_X/cpa/tempgrp/AI/AIGame/Keyword.c

404 lines
12 KiB
C
Raw Blame History

/*---------------------------------------------------------------------------*/
/* KeyWord.c : Definition of general keyword.*/
/* auteur : Olivier Couvreur.*/
/* date : 19/08/1997*/
/*---------------------------------------------------------------------------*/
#ifdef _DEBUG
extern "C" char gcGlobAleat;
#else
extern char gcGlobAleat;
#endif
#include "AIUseCPA.h"
#include "specif/AIOption.h"
#include "AIMacros.h"
#include "AI_Erm.h"
#include "AI_Struc.h"
#include "StrIntel.h"
#include "Intell.h"
#include "EnumKey.h"
#include "ActConst.h"
#if defined(ACTIVE_AIDEBUG)
#include "specif/AID_Trac.h"
#include "AID_Erm.h"
#endif
/************************************************************************************/
/* HERE IS THE BEGINNING /
/************************************************************************************/
#if !defined(OPTIMIZED_COMMAND)
#if defined(__DEBUG_AI__)
tdstNodeInterpret *fn_p_stDefaultKeyWord(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
{
p_SuperObjPerso=p_SuperObjPerso;
p_stValue=p_stValue;
#if defined(__DEBUG_AI__)
M_AIFatalError(E_uwAIFatalUnknownKeyWord);
#endif
return(p_stTree);
}
#endif /* _DEBUG_AI__*/
#endif /* OPTIMIZED_COMMAND*/
#if defined(ACTIVE_EDITOR)
tdstNodeInterpret *fn_p_stMiscKeyWord(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
{
p_SuperObjPerso=p_SuperObjPerso;
p_stValue=p_stValue;
p_stTree=p_stTree;
#if defined(__DEBUG_AI__)
M_AIFatalError(E_uwAIFatalUnknownKeyWord);
#endif /* DEBUG_AI*/
return(p_stTree);
}
#endif /* ACTIVE_EDITOR*/
tdstNodeInterpret *fn_p_stNoActionKeyWord(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
{
M_Full_GetSetParam_Action(p_stValue, NULL);
return(p_stTree);
}
tdstNodeInterpret *fn_p_stMeKeyWord(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
{
M_GetSetParam_p_stEngineObjValue(p_stValue) = M_GetEngineObject(p_SuperObjPerso);
M_GetSetParam_Type(p_stValue) = E_vt_Perso;
return(p_stTree);
}
tdstNodeInterpret *fn_p_stMainActorKeyWord(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
{
M_GetSetParam_p_stEngineObjValue(p_stValue) = M_GetEngineObject(MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode()));
M_GetSetParam_Type(p_stValue) = E_vt_Perso;
return(p_stTree);
}
/*tdstNodeInterpret *fn_p_stWorldKeyWord(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
{
M_GetSetParam_p_stEngineObjValue(p_stValue) = M_GetEngineObject(g_stEngineStructure.h_WorldCaracter);
M_GetSetParam_Type(p_stValue) = E_vt_Perso;
return(p_stTree);
}*/
/* ANNECY OA - 13/08/99 { */
#ifndef U64
tdstNodeInterpret *fn_p_stNoSuperObjectKeyWord(HIE_tdxHandleToSuperObject p_SuperObj, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
{
M_GetSetParam_p_stEngineObjValue(p_stValue) = NULL;
M_GetSetParam_Type(p_stValue) = E_vt_SuperObject;
return(p_stTree);
}
#endif
/* END ANNECY OA } */
tdstNodeInterpret *fn_p_stNobodyKeyWord(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
{
M_GetSetParam_p_stEngineObjValue(p_stValue) = NULL;
M_GetSetParam_Type(p_stValue) = E_vt_Perso;
return(p_stTree);
}
tdstNodeInterpret *fn_p_stNowhereKeyWord(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
{
M_Full_GetSetParam_WayPoint(p_stValue,WP_C_hWayPointInvalid);
return(p_stTree);
}
tdstNodeInterpret *fn_p_stEmptyTextKeyWord(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
{
M_Full_GetSetParam_hText(p_stValue, FON_C_xInvalidTextHandle);
return(p_stTree);
}
/*ANNECY Bart 06/02/98 {*/
tdstNodeInterpret *fn_p_stCapsNullKeyWord(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
{
M_Full_GetSetParam_Caps(p_stValue, 0);
return(p_stTree);
}
tdstNodeInterpret *fn_p_stNoGraphKeyWord(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
{
M_Full_GetSetParam_Graph(p_stValue, NULL); /* NULL ?*/
return(p_stTree);
}
/*ENDANNECY Bart }*/
static tdstNodeInterpret *fn_p_stSkipThenElseParameter(tdstNodeInterpret *p_stTree, tdstNodeInterpret *p_stTreeInit)
{
#if defined(OPTIMIZE_SWAP_PARAMETER)
if(M_NodeToSkip(p_stTreeInit))/*CBOPT p_stTree*/
{
return (p_stTreeInit+M_NodeToSkip(p_stTreeInit)); /* Swap "then/else" parameter.*/
}
else
{
p_stTree = fn_p_stSwapNextParameter(p_stTree + 1); /* Swap "then/else" parameter.*/
M_NodeToSkip(p_stTreeInit)=(unsigned short) (p_stTree-p_stTreeInit);
}
#else
p_stTree++; /* Swap Then/Else node.*/
p_stTree = fn_p_stSwapNextParameter(p_stTree); /* Swap "then/else" parameter.*/
#endif /* OPTIMIZE_SWAP_PARAMETER*/
return p_stTree;
}
tdstNodeInterpret *fn_p_stThenKeyWord(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
{
return fn_p_stIntelligenceEvalTreeEngine(p_SuperObjPerso, p_stTree, p_stValue);
}
tdstNodeInterpret *fn_p_stElseKeyWord(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
{
p_stTree--; /* Fixe tree on Else Node.*/
return fn_p_stSkipThenElseParameter(p_stTree, p_stTree);
}
#ifndef U64 /* AR9809*/
extern char gcGlobAleat;
#ifdef __DEBUG_AI__
__declspec(dllexport) char gcSimulateRelease = 0;
#else
__declspec(dllexport) char gcSimulateRelease = 1;
#endif
#else
char gcSimulateRelease = 1;
#endif /*U64*/
#ifndef U64 /* AR9809*/
__declspec(dllexport) char gcSimulateNotU64 = 0;
#else
char gcSimulateNotU64 = 1;
#endif /*U64*/
/************************************************************************************/
tdstNodeInterpret *fn_p_stIfDebug(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
{
enum tdeKeyWordId_ eKeyId=M_eKeyWordIdInterpret(p_stTree-1);
p_SuperObjPerso=p_SuperObjPerso;
p_stValue=p_stValue;
if((eKeyId == eKeyWord_IfDebug) && (gcSimulateRelease))
{
p_stTree = fn_p_stSkipThenElseParameter(p_stTree-1, p_stTree-1);
}
M_Full_GetSetParam_ActionReturn(p_stValue, C_ACTION_ENGINE_CONTINUE);
return(p_stTree);
}
/************************************************************************************/
tdstNodeInterpret *fn_p_stIfNotU64(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
{
enum tdeKeyWordId_ eKeyId=M_eKeyWordIdInterpret(p_stTree-1);
p_SuperObjPerso=p_SuperObjPerso;
p_stValue=p_stValue;
if((eKeyId == eKeyWord_IfNotU64) && (gcSimulateNotU64))
{
p_stTree = fn_p_stSkipThenElseParameter(p_stTree-1, p_stTree-1);
}
M_Full_GetSetParam_ActionReturn(p_stValue, C_ACTION_ENGINE_CONTINUE);
return(p_stTree);
}
/************************************************************************************/
tdstNodeInterpret *fn_p_stIfKeyWord(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
{
tdstNodeInterpret *p_stTreeInit=p_stTree-1; /* p_stTreeInit link to If node.*/
char cMax = 0;
if(M_eKeyWordIdInterpret(p_stTreeInit) == eKeyWord_If)
{
M_EvalNextParameter(p_stValue);
}
else
{
switch(M_eKeyWordIdInterpret(p_stTreeInit))
{
case eKeyWord_If2:
cMax = gcGlobAleat & 0x01;
goto ComIf;
case eKeyWord_If4:
cMax = gcGlobAleat & 0x03;
goto ComIf;
case eKeyWord_If8:
cMax = gcGlobAleat & 0x07;
goto ComIf;
case eKeyWord_If16:
cMax = gcGlobAleat & 0x0F;
goto ComIf;
ComIf:
if(cMax)
{
M_GetSetParam_lValue(p_stValue) = 0;
/*
* bidouille pour <20>viter les plantages dans le cas d'un if - cond - then avec qu'un seul
* noeud au milieu.
* p_stTreeInit = If (profondeur n) , p_stTree = Cond (prof n+1)
* la ligne suivante recherche le then de m<>me niveau que le if (p_stTree + 2)
*/
p_stTree = fn_p_stSkipThenElseParameter(p_stTreeInit, p_stTree);
}
else
{
M_EvalNextParameter(p_stValue);
}
break;
case eKeyWord_IfNot:
M_EvalNextParameter(p_stValue);
M_GetSetParam_lValue(p_stValue) = M_GetSetParam_lValue(p_stValue) != 0 ? 0 : 1;
break;
/*XB(07/01/98)*/
default:
break;
/*End XB*/
}
}
/* Eval the condition*/
/*M_EvalNextParameter(p_stValue);*/
if (M_GetSetParam_lValue(p_stValue) != 0)
{ /* Condition is True.*/
#if defined(ACTIVE_AIDEBUG)
AIDebug_M_SetKeyWord
(
AI_M_stGetMindOfSuperObj(p_SuperObjPerso),
p_stValue,
p_stTree
);
#endif /*ACTIVE_AIDEBUG*/
p_stTree++; /* Swap Then node.*/
/*p_stTree = fn_p_stIntelligenceEvalTreeEngine(p_SuperObjPerso, p_stTree, p_stValue); // Eval "then" parameter.
if ( (M_GetTypeInterpret(p_stTree) == E_ti_KeyWord)
&& (M_eKeyWordIdInterpret(p_stTree) == eKeyWord_Else))
{ // There is Else node.
return fn_p_stSkipThenElseParameter(p_stTree, p_stTree);
}*/
}
else
{ /* Condition is False.*/
if (!M_IsTheEndOfTree(p_stTree))
p_stTree = fn_p_stSkipThenElseParameter(p_stTree, p_stTreeInit);
if (M_DepthInterpret(p_stTree) == M_DepthInterpret(p_stTreeInit))
{
if ( (M_GetTypeInterpret(p_stTree) == E_ti_KeyWord)
&& (M_eKeyWordIdInterpret(p_stTree) == eKeyWord_Else))
{
#if defined(ACTIVE_AIDEBUG)
AIDebug_M_SetKeyWord
(
AI_M_stGetMindOfSuperObj(p_SuperObjPerso),
p_stValue,
p_stTree
);
#endif /*ACTIVE_AIDEBUG*/
p_stTree++; /* Swap Else node.*/
}
/* Eval next parameter.*/
/*M_EvalNextParameter(p_stValue);*/
}
}
M_Full_GetSetParam_ActionReturn(p_stValue, C_ACTION_ENGINE_CONTINUE);
return(p_stTree);
}
tdstNodeInterpret *fn_p_stEngineGotoKeyWord(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
{
char szForErrorString[200];
tdstNodeInterpret *p_stTempTree;
long lValue;
M_EvalNextParameter(p_stValue);
lValue = M_ReturnParam_lValue(p_stValue);
M_Full_GetSetParam_ActionReturn(p_stValue, C_ACTION_ENGINE_CONTINUE);
if (lValue == 0)
{
sprintf(szForErrorString,"parameter zero in %s", AI_M_szGetSuperObjectName(p_SuperObjPerso));
M_AIWarningErrorAndNeverStopForDebug(E_uwAIWarningEngineGoto,C_ucErmOpenInfoWindow,szForErrorString);
}
else
if (lValue < 0)
{
tdstNodeInterpret *p_stBeginTree = M_GetNodeInterpret(M_GetRuleN(g_p_stIntelligence, g_ucNRule));
p_stTempTree = p_stTree+lValue;
if (p_stTempTree < p_stBeginTree)
{
sprintf(szForErrorString,"out of interpret tree (negative) in %s", AI_M_szGetSuperObjectName(p_SuperObjPerso));
M_AIWarningErrorAndNeverStopForDebug(E_uwAIWarningEngineGoto,C_ucErmOpenInfoWindow,szForErrorString);
}
else
return p_stTempTree;
}
else
/* lValue > 0*/
{
long i;
p_stTempTree = p_stTree;
for (i = 0; i < lValue; i++)
{
if (M_IsTheEndOfTree(p_stTempTree))
{
sprintf(szForErrorString,"out of interpret tree (positive) in %s", AI_M_szGetSuperObjectName(p_SuperObjPerso));
M_AIWarningErrorAndNeverStopForDebug(E_uwAIWarningEngineGoto,C_ucErmOpenInfoWindow,szForErrorString);
return p_stTree;
}
else
p_stTempTree++;
}
return p_stTempTree;
}
return(p_stTree);
}
/************************************************************************************/
/* HERE IS THE END */
/************************************************************************************/
/****************************************************************************************/
/* to call once before anything else related to KeyWord */
/****************************************************************************************/
#if !defined(OPTIMIZED_COMMAND)
#include "Convert.h"
#include "ProtCond.h"
void fn_vInitKeyWordEntries(void)
{
/* Init*/
#if defined(__DEBUG_AI__)
fn_vInitKeyWordTable(fn_p_stDefaultKeyWord);
#endif
/* KeyWord definition*/
#define M_DEFINE_KEYWORD(a,b,english,c,d,e,f) fn_vDefineKeyWordEntry(M_KEYWORD_ENTRY(a,b,english,c,d,e,f));
#include "DefKey.h"
#undef M_DEFINE_KEYWORD
/* Check*/
#if defined(__DEBUG_AI__)
fn_vCheckKeyWordTable(fn_p_stDefaultKeyWord);
#endif /* __DEBUG_AI__*/
}
#endif /* OPTIMIZED_COMMAND*/