404 lines
12 KiB
C
404 lines
12 KiB
C
/*---------------------------------------------------------------------------*/
|
||
/* 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*/
|
||
|