reman3/Rayman_X/cpa/tempgrp/AI/AIBase/ActTable.c

495 lines
17 KiB
C

/*---------------------------------------------------------------------------*/
/* Action table functions for intelligence engine*/
/* author : Olivier Couvreur*/
/* modify : 07/11/96 Olivier Couvreur */
/* modify : 03/02/97 Olivier Couvreur Lint 0 warnings */
/* modify : 26/02/97 Olivier Couvreur added Schedule support + Lint 0 warnings*/
/* modify : 05/03/97 Olivier Couvreur added Schedule function + Lint 0 warnings*/
/* modify : 25/03/97 Olivier Couvreur added REVERSE_RULES support + optimizations (not yet activated)*/
/*---------------------------------------------------------------------------*/
#include "AIUseCPA.h"
#include "specif/AIOption.h"
#include "specif/ActTable.h"
#include "StrIntel.h"
#include "Action.h"
/*****************************************************************************************************/
/* here we can have more than one action in action table */
/* XB 20/05/1999 */
#ifndef D_THROW_COMPLEX_ACTION_TABLE
/* OPTIMIZE_ACTION_TABLE is defined in AIOption.h*/
/* check if a rule is in action table : return entry number*/
unsigned char fn_ucIsRuleInActionTable(tdstIntelligence *p_stIntelligence,unsigned char ucNumRule)
{
/* Modif YLG*/
unsigned char ucNbEntries;
ucNbEntries = M_ActionTableNbEntries(p_stIntelligence);
if (M_IsActionTableUsed(p_stIntelligence))
{
unsigned char ucCurrentEntry;
struct tdstActionTableEntry_ *p_stEntry;
p_stEntry = &(M_ActionTableEntryN(p_stIntelligence, 0));
for (ucCurrentEntry=0;ucCurrentEntry<ucNbEntries;ucCurrentEntry++, p_stEntry++)
{
if (p_stEntry->bUsed)
{
if (p_stEntry->ucNumRule==ucNumRule)
{
return(ucCurrentEntry);
}
}
}
}
return (ucNbEntries);
}
/* check if a rule and a node are in action table : return entry number*/
unsigned char fn_ucIsRuleAndNodeInActionTable(tdstIntelligence *p_stIntelligence,unsigned char ucNumRule,tdstNodeInterpret *p_stNode)
{
/* Modif YLG*/
unsigned char ucNbEntries;
ucNbEntries = M_ActionTableNbEntries(p_stIntelligence);
if (M_IsActionTableUsed(p_stIntelligence))
{
unsigned char ucCurrentEntry;
struct tdstActionTableEntry_ *p_stEntry;
p_stEntry = &(M_ActionTableEntryN(p_stIntelligence, 0));
for (ucCurrentEntry=0;ucCurrentEntry<ucNbEntries;ucCurrentEntry++, p_stEntry++)
{
/* if (M_ActionTableUseFlag(p_stIntelligence,ucCurrentEntry))*/
if (p_stEntry->bUsed)
{
/* if (M_ActionTableNumRule(p_stIntelligence,ucCurrentEntry)==ucNumRule)*/
if (p_stEntry->ucNumRule==ucNumRule)
{
/* if (M_ActionTableNumNode(p_stIntelligence,ucCurrentEntry)==p_stNode)*/
if (p_stEntry->p_stNode ==p_stNode)
{
return(ucCurrentEntry);
}
}
}
}
}
/* return(M_ActionTableNbEntries(p_stIntelligence));*/
return (ucNbEntries);
}
/* find a free entry in action table : return entry number*/
unsigned char fn_ucFindPlaceInActionTable(tdstIntelligence *p_stIntelligence)
{
/* Modif YLG*/
unsigned char ucCurrentEntry;
unsigned char ucNbEntries;
ucNbEntries = M_ActionTableNbEntries(p_stIntelligence);
/* if (M_ActionTableNbEntriesUsed(p_stIntelligence)<M_ActionTableNbEntries(p_stIntelligence))*/
if (M_ActionTableNbEntriesUsed(p_stIntelligence)<ucNbEntries)
{
struct tdstActionTableEntry_ *p_stEntry;
p_stEntry = &(M_ActionTableEntryN(p_stIntelligence, 0));
/* for (ucCurrentEntry=0;ucCurrentEntry<M_ActionTableNbEntries(p_stIntelligence);ucCurrentEntry++)*/
for (ucCurrentEntry=0;ucCurrentEntry<ucNbEntries;ucCurrentEntry++,p_stEntry++)
{
/* if (!M_ActionTableUseFlag(p_stIntelligence,ucCurrentEntry))*/
if (!p_stEntry->bUsed)
{
return(ucCurrentEntry);
}
}
}
/* return(M_ActionTableNbEntries(p_stIntelligence));*/
return (ucNbEntries);
}
static void fn_vInitActionTableEntry(tdstIntelligence *p_stIntelligence,unsigned char ucNEntry,unsigned char ucNumRule,tdstNodeInterpret *p_stNode,unsigned char bfUsed)
{
/* modif YLG*/
M_ActionTableUseActionReturn(p_stIntelligence,ucNEntry) = g_ucUseDefaultActionReturn;
M_ActionTableNewActionReturn(p_stIntelligence,ucNEntry) = g_ucNewActionReturn;
M_ActionTableUseFlag(p_stIntelligence,ucNEntry)=bfUsed;
M_ActionTableNumNode(p_stIntelligence,ucNEntry)=p_stNode;
M_ActionTableNumRule(p_stIntelligence,ucNEntry)=ucNumRule;
memset(&(M_ActionTableParam(p_stIntelligence,ucNEntry)),0,sizeof(M_ActionTableParam(p_stIntelligence,ucNEntry)));
}
#if !defined(OPTIMIZE_ACTION_TABLE)
/* internal function*/
void fn_vUpdateActionTable(tdstIntelligence *p_stIntelligence)
{
unsigned char ucCurrentEntry;
M_ActionTableNbEntriesUsed(p_stIntelligence)=0;
for (ucCurrentEntry=0;ucCurrentEntry<M_ActionTableNbEntries(p_stIntelligence);ucCurrentEntry++)
{
if (M_ActionTableUseFlag(p_stIntelligence,ucCurrentEntry))
{
/*update NbEntriesUsed */
M_ActionTableNbEntriesUsed(p_stIntelligence)+=1;
}
}
}
#endif
/* use current entry in action table*/
void fn_vUseCurrentActionTableEntry(tdstIntelligence *p_stIntelligence,unsigned char ucNRule,tdstNodeInterpret *p_stNode)
{
#if defined(OPTIMIZE_ACTION_TABLE)
unsigned char ucCurrentEntry=M_ActionTableCurrentEntry(p_stIntelligence);
if (!M_ActionTableUseFlag(p_stIntelligence,ucCurrentEntry))
{
fn_vInitActionTableEntry(p_stIntelligence,ucCurrentEntry,ucNRule,p_stNode,1);
M_ActionTableNbEntriesUsed(p_stIntelligence)++;
}
#else
/* reinit current entry in action table*/
fn_vInitActionTableEntry(p_stIntelligence,M_ActionTableCurrentEntry(p_stIntelligence),ucNRule,p_stNode,1);
/* update action table*/
fn_vUpdateActionTable(p_stIntelligence);
#endif /* reinit current entry in action table*/
}
/* free current entry in action table*/
void fn_vUnuseCurrentActionTableEntry(tdstIntelligence *p_stIntelligence)
{
/* YLG Modif*/
#if defined(OPTIMIZE_ACTION_TABLE)
unsigned char ucCurrentEntry=M_ActionTableCurrentEntry(p_stIntelligence);
if (M_ActionTableUseFlag(p_stIntelligence,ucCurrentEntry))
{
fn_vInitActionTableEntry(p_stIntelligence,ucCurrentEntry,0,NULL,0);
M_ActionTableNbEntriesUsed(p_stIntelligence)--;
}
#else
/* reinit current entry in action table*/
fn_vInitActionTableEntry(p_stIntelligence,M_ActionTableCurrentEntry(p_stIntelligence),0,NULL,0);
/* update action table*/
fn_vUpdateActionTable(p_stIntelligence);
#endif
}
void fn_vUnuseAllRulesWhichHaveGreaterNumRule(struct tdstIntelligence_ *p_stIntelligence,unsigned char ucNumRule)
{
/* Modif YLG*/
unsigned char ucNbEntries;
ucNbEntries = M_ActionTableNbEntries(p_stIntelligence);
/* action table not used*/
if (M_IsActionTableUsed(p_stIntelligence))
{
unsigned char ucCurrentEntry;
struct tdstActionTableEntry_ *p_stEntry;
p_stEntry = &(M_ActionTableEntryN(p_stIntelligence, 0));
for (ucCurrentEntry=0;ucCurrentEntry<ucNbEntries;ucCurrentEntry++, p_stEntry++)
{
/* if (M_ActionTableUseFlag(p_stIntelligence,ucCurrentEntry))*/
if (p_stEntry->bUsed)
{
if (
/* exclude rule from schedule*/
/* (M_ActionTableNumRule(p_stIntelligence,ucCurrentEntry)>0)*/
/* &&(M_ActionTableNumRule(p_stIntelligence,ucCurrentEntry)>ucNumRule)*/
p_stEntry -> ucNumRule > ucNumRule
)
{
fn_vInitActionTableEntry(p_stIntelligence,ucCurrentEntry,0,NULL,0);
M_ActionTableNbEntriesUsed(p_stIntelligence)--;
}
}
}
/* update action table*/
#if !defined(OPTIMIZE_ACTION_TABLE)
fn_vUpdateActionTable(p_stIntelligence);
#endif
}
}
void fn_vUnuseAllRulesFromSchedule(struct tdstIntelligence_ *p_stIntelligence)
{
/* Modif YLG*/
unsigned char ucNbEntries;
/* action table not used*/
if (M_IsActionTableUsed(p_stIntelligence))
{
unsigned char ucCurrentEntry;
struct tdstActionTableEntry_ *p_stEntry;
ucNbEntries = M_ActionTableNbEntries(p_stIntelligence);
p_stEntry = &(M_ActionTableEntryN(p_stIntelligence, 0));
/* for (ucCurrentEntry=0;ucCurrentEntry<M_ActionTableNbEntries(p_stIntelligence);ucCurrentEntry++)*/
for (ucCurrentEntry=0;ucCurrentEntry<ucNbEntries;ucCurrentEntry++, p_stEntry++)
{
/* if (M_ActionTableUseFlag(p_stIntelligence,ucCurrentEntry))*/
if (p_stEntry->bUsed)
{
/* only rule from schedule*/
/* if (M_ActionTableNumRule(p_stIntelligence,ucCurrentEntry)==0)*/
if (p_stEntry->ucNumRule==0)
{
fn_vInitActionTableEntry(p_stIntelligence,ucCurrentEntry,0,NULL,0);
/*M_ActionTableNbEntriesUsed(p_stIntelligence)--;*/
ucNbEntries --;
}
}
}
M_ActionTableNbEntriesUsed(p_stIntelligence) = ucNbEntries;
#if !defined(OPTIMIZE_ACTION_TABLE)
/* update action table*/
fn_vUpdateActionTable(p_stIntelligence);
#endif
}
}
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
tdstNodeInterpret *fn_p_stGetScheduleFromActionTableAndClearIt(tdstIntelligence *p_stIntelligence)
{
/* MOdif ylg*/
tdstNodeInterpret *p_stFoundSchedule=NULL;
unsigned char ucNbEntries;
/* action table not used*/
if (M_IsActionTableUsed(p_stIntelligence))
{
unsigned char ucCurrentEntry;
struct tdstActionTableEntry_ *p_stEntry;
ucNbEntries = M_ActionTableNbEntries(p_stIntelligence);
p_stEntry = &(M_ActionTableEntryN(p_stIntelligence, 0));
/* loop in action table*/
/* for (ucCurrentEntry=0;ucCurrentEntry<M_ActionTableNbEntries(p_stIntelligence);ucCurrentEntry++)*/
for (ucCurrentEntry=0;ucCurrentEntry<ucNbEntries;ucCurrentEntry++, p_stEntry++)
{
/* is this entry used ?*/
/* if (M_ActionTableUseFlag(p_stIntelligence,ucCurrentEntry))*/
if (p_stEntry->bUsed)
{
/* is this entry belonging to schedule (==0) ?*/
/*if (M_ActionTableNumRule(p_stIntelligence,ucCurrentEntry)==0)*/
if (p_stEntry->ucNumRule==0)
{
/* keep the first one found*/
/*
if (p_stFoundSchedule==NULL)
{
p_stFoundSchedule=M_ActionTableNumNode(p_stIntelligence,ucCurrentEntry);
}
*/
/* keep the first one found or the first one in the schedule*/
/* if ( (p_stFoundSchedule==NULL) || (M_ActionTableNumNode(p_stIntelligence,ucCurrentEntry)<p_stFoundSchedule) )*/
if ( (p_stFoundSchedule==NULL) || (p_stEntry->p_stNode<p_stFoundSchedule) )
{
/* p_stFoundSchedule=M_ActionTableNumNode(p_stIntelligence,ucCurrentEntry);*/
p_stFoundSchedule=p_stEntry->p_stNode;
}
/* clear schedule entry*/
fn_vInitActionTableEntry(p_stIntelligence,ucCurrentEntry,0,NULL,0);
/* M_ActionTableNbEntriesUsed(p_stIntelligence)--;*/
ucNbEntries --;
}
}
}
M_ActionTableNbEntriesUsed(p_stIntelligence) = ucNbEntries;
#if !defined(OPTIMIZE_ACTION_TABLE)
/* update action table*/
fn_vUpdateActionTable(p_stIntelligence);
#endif
}
return(p_stFoundSchedule);
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/* used by InitPerso*/
void fn_vInitActionTable(tdstIntelligence *p_stIntelligence)
{
/* Modif YLG*/
unsigned char ucNEntry;
unsigned char ucNbEntries;
M_ActionTableNbEntriesUsed(p_stIntelligence)=0;
M_ActionTableCurrentEntry(p_stIntelligence)=0;
ucNbEntries = M_ActionTableNbEntries(p_stIntelligence);
/* for (ucNEntry=0;ucNEntry<M_ActionTableNbEntries(p_stIntelligence);ucNEntry++)*/
for (ucNEntry=0;ucNEntry<ucNbEntries;ucNEntry++)
{
fn_vInitActionTableEntry(p_stIntelligence,ucNEntry,0,NULL,0);
}
}
tdstNodeInterpret *fn_p_stGetTableAction(tdstIntelligence *p_stIntelligence, unsigned char ucNEntry)
{
/* Modif YLG*/
/* fn_vSetUseDefaultActionReturnValue(M_ActionTableUseActionReturn(p_stIntelligence,ucNEntry));*/
g_ucUseDefaultActionReturn = M_ActionTableUseActionReturn(p_stIntelligence,ucNEntry);
/* fn_vSetNewActionReturnValue(M_ActionTableNewActionReturn(p_stIntelligence,ucNEntry));*/
g_ucNewActionReturn = M_ActionTableNewActionReturn(p_stIntelligence,ucNEntry);
return M_ActionTableNumNode(p_stIntelligence, ucNEntry);
}
/*****************************************************************************************************/
/* here only one action in action table */
#else /* D_THROW_COMPLEX_ACTION_TABLE */
/* check if a rule is in action table : return entry number*/
unsigned char fn_ucIsRuleInActionTable(tdstIntelligence *p_stIntelligence,unsigned char ucNumRule)
{
if(M_ActionTable(p_stIntelligence))
{
struct tdstActionTableEntry_ *p_stEntry;
p_stEntry = &(M_ActionTableEntry0(p_stIntelligence));
if((p_stEntry->bUsed == TRUE) &&
(p_stEntry->ucNumRule == ucNumRule))
{
return 0;
}
}
return 1;
}
/* check if a rule and a node are in action table : return entry number*/
unsigned char fn_ucIsRuleAndNodeInActionTable(tdstIntelligence *p_stIntelligence,unsigned char ucNumRule,tdstNodeInterpret *p_stNode)
{
if(M_ActionTable(p_stIntelligence))
{
struct tdstActionTableEntry_ *p_stEntry;
p_stEntry = &(M_ActionTableEntry0(p_stIntelligence));
if((p_stEntry->bUsed == TRUE) &&
(p_stEntry->ucNumRule == ucNumRule) &&
(p_stEntry->p_stNode == p_stNode))
{
return 0;
}
}
return 1;
}
/* find a free entry in action table : return entry number*/
unsigned char fn_ucFindPlaceInActionTable(tdstIntelligence *p_stIntelligence)
{
if(M_ActionTable(p_stIntelligence))
{
if(!(M_ActionTableUseFlag0(p_stIntelligence)))
{
return 0;
}
}
return 1;
}
static void fn_vInitActionTableEntry(tdstIntelligence *p_stIntelligence,unsigned char ucNumRule,tdstNodeInterpret *p_stNode,unsigned char bfUsed)
{
struct tdstActionTableEntry_ *p_stEntry;
p_stEntry = &(M_ActionTableEntry0(p_stIntelligence));
p_stEntry->bUseDefaultActionReturn=g_ucUseDefaultActionReturn;
p_stEntry->ucNewActionReturn=g_ucNewActionReturn;
p_stEntry->bUsed=bfUsed;
p_stEntry->p_stNode=p_stNode;
p_stEntry->ucNumRule=ucNumRule;
memset(&(p_stEntry->stActionParam),0,sizeof(p_stEntry->stActionParam));
}
/* use current entry in action table*/
void fn_vUseCurrentActionTableEntry(tdstIntelligence *p_stIntelligence,unsigned char ucNRule,tdstNodeInterpret *p_stNode)
{
if(!M_ActionTableUseFlag0(p_stIntelligence))
{
fn_vInitActionTableEntry(p_stIntelligence,ucNRule,p_stNode,1);
}
}
/* free current entry in action table*/
void fn_vUnuseCurrentActionTableEntry(tdstIntelligence *p_stIntelligence)
{
if (M_ActionTableUseFlag0(p_stIntelligence))
{
fn_vInitActionTableEntry(p_stIntelligence,0,NULL,0);
}
}
void fn_vUnuseAllRulesWhichHaveGreaterNumRule(struct tdstIntelligence_ *p_stIntelligence,unsigned char ucNumRule)
{
if(M_ActionTable(p_stIntelligence))
{
struct tdstActionTableEntry_ *p_stEntry;
p_stEntry = &(M_ActionTableEntry0(p_stIntelligence));
if((p_stEntry->bUsed) &&
(p_stEntry->ucNumRule>ucNumRule))
{
fn_vInitActionTableEntry(p_stIntelligence,0,NULL,0);
}
}
}
void fn_vUnuseAllRulesFromSchedule(struct tdstIntelligence_ *p_stIntelligence)
{
if (M_ActionTable(p_stIntelligence))
{
struct tdstActionTableEntry_ *p_stEntry;
p_stEntry = &(M_ActionTableEntry0(p_stIntelligence));
/* only rule from schedule*/
if((p_stEntry->bUsed) &&
(p_stEntry->ucNumRule==0))
{
fn_vInitActionTableEntry(p_stIntelligence,0,NULL,0);
}
}
}
/* used by InitPerso*/
void fn_vInitActionTable(tdstIntelligence *p_stIntelligence)
{
if(M_ActionTable(p_stIntelligence))
{
fn_vInitActionTableEntry(p_stIntelligence,0,NULL,0);
}
}
tdstNodeInterpret *fn_p_stGetTableAction(tdstIntelligence *p_stIntelligence, unsigned char ucNEntry)
{
struct tdstActionTableEntry_ *p_stEntry;
p_stEntry = &(M_ActionTableEntry0(p_stIntelligence));
g_ucUseDefaultActionReturn = p_stEntry->bUseDefaultActionReturn;
g_ucNewActionReturn = p_stEntry->ucNewActionReturn;
return p_stEntry->p_stNode;
}
#endif /* D_THROW_COMPLEX_ACTION_TABLE */
/* End XB 20/05/1999 */