renamed the state types.

This commit is contained in:
Christoph Oelckers 2023-10-18 19:05:27 +02:00
parent dc846ca27b
commit 0aaefceb04
10 changed files with 61 additions and 60 deletions

View file

@ -78,7 +78,7 @@ void aiPlay3DSound(DBloodActor* actor, int soundid, AI_SFX_PRIORITY a3, int play
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void aiNewState(DBloodActor* actor, AISTATES* pAIState) void aiNewState(DBloodActor* actor, AISTATE* pAIState)
{ {
DUDEINFO* pDudeInfo = getDudeInfo(actor); DUDEINFO* pDudeInfo = getDudeInfo(actor);
actor->xspr.stateTimer = pAIState->stateTicks; actor->xspr.stateTimer = pAIState->stateTicks;
@ -101,7 +101,7 @@ void aiNewState(DBloodActor* actor, AISTATES* pAIState)
// //
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
AISTATES* FindState(FName name); AISTATE* FindState(FName name);
void aiNewState(DBloodActor* actor, FName nAIState) void aiNewState(DBloodActor* actor, FName nAIState)
{ {

View file

@ -29,7 +29,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
BEGIN_BLD_NS BEGIN_BLD_NS
struct AISTATES { struct AISTATE {
int stateType; // By NoOne: current type of state. Basically required for kModernDudeTargetChanger, but can be used for something else. int stateType; // By NoOne: current type of state. Basically required for kModernDudeTargetChanger, but can be used for something else.
int seqId; int seqId;
int stateTicks; int stateTicks;
@ -38,19 +38,7 @@ struct AISTATES {
VMFunction* enterFunc; VMFunction* enterFunc;
VMFunction* moveFunc; VMFunction* moveFunc;
VMFunction* thinkFunc; VMFunction* thinkFunc;
AISTATES* nextState; AISTATE* nextState;
};
struct AISTATE_TPL {
int stateType; // By NoOne: current type of state. Basically required for kModernDudeTargetChanger, but can be used for something else.
int seqId;
VMNativeFunction** funcId;
int stateTicks;
VMNativeFunction** enterFunc;
VMNativeFunction** moveFunc;
VMNativeFunction** thinkFunc;
AISTATE_TPL *nextState;
}; };
enum AI_SFX_PRIORITY { enum AI_SFX_PRIORITY {

View file

@ -786,7 +786,7 @@ DEFINE_PROPERTY(dmgcontrol, IIIIIII, BloodActor)
// this is rather makeshift for now, it needs to be cleaned up once the native states are gone. // this is rather makeshift for now, it needs to be cleaned up once the native states are gone.
// it only supports the minimum needed set of features to allow getting rid of them and takes all available shortcuts. // it only supports the minimum needed set of features to allow getting rid of them and takes all available shortcuts.
TArray<AISTATES> allStates; TArray<AISTATE> allStates;
DEFINE_PROPERTY(aistate, SSIIGGGGs, BloodActor) DEFINE_PROPERTY(aistate, SSIIGGGGs, BloodActor)
{ {
@ -805,11 +805,11 @@ DEFINE_PROPERTY(aistate, SSIIGGGGs, BloodActor)
next = _next; next = _next;
} }
int seqno = (int)strtol(seq + 1, nullptr, 10); // skip the '+', this needs to be done better later. int seqno = (int)strtol(seq + 1, nullptr, 10); // skip the '+', this needs to be done better later.
AISTATES state = { type, seqno, duration, FName(label), action, enter, move, tick, (AISTATES*)(intptr_t)(FName(next).GetIndex()) }; AISTATE state = { type, seqno, duration, FName(label), action, enter, move, tick, (AISTATE*)(intptr_t)(FName(next).GetIndex()) };
allStates.Push(state); allStates.Push(state);
} }
AISTATES* FindState(FName name) AISTATE* FindState(FName name)
{ {
int index = name.GetIndex() - NAME_genIdle; int index = name.GetIndex() - NAME_genIdle;
if (index < allStates.SSize()) return &allStates[index]; if (index < allStates.SSize()) return &allStates[index];

View file

@ -170,7 +170,7 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, AISTATE*& w, AISTA
#endif #endif
#else #else
FSerializer& Serialize(FSerializer& arc, const char* keyname, AISTATES*& w, AISTATES** def) FSerializer& Serialize(FSerializer& arc, const char* keyname, AISTATE*& w, AISTATE** def)
{ {
return arc; return arc;
} }

View file

@ -57,11 +57,11 @@ struct walltypedisk
BEGIN_BLD_NS BEGIN_BLD_NS
class DBloodActor; class DBloodActor;
struct AISTATES; struct AISTATE;
struct XSPRITE { struct XSPRITE {
AISTATES* aiState; // ai AISTATE* aiState; // ai
union union
{ {
uint32_t flags; uint32_t flags;

View file

@ -393,6 +393,19 @@ VMNativeFunction** const gCdudeCustomCallback[] =
}; };
// statically initializable state template. This has to take the function descriptors by reference so it can be done in a static context.
struct AISTATE_TPL {
int stateType; // By NoOne: current type of state. Basically required for kModernDudeTargetChanger, but can be used for something else.
int seqId;
VMNativeFunction** funcId;
int stateTicks;
VMNativeFunction** enterFunc;
VMNativeFunction** moveFunc;
VMNativeFunction** thinkFunc;
AISTATE_TPL* nextState;
};
// Land, Crouch, Swim (proper order matters!) // Land, Crouch, Swim (proper order matters!)
AISTATE_TPL gCdudeStateTemplate[kCdudeStateNormalMax][kCdudePostureMax] = AISTATE_TPL gCdudeStateTemplate[kCdudeStateNormalMax][kCdudePostureMax] =
{ {
@ -822,7 +835,7 @@ void DCustomDude::ProcessEffects(void)
} }
} }
bool DCustomDude::NewState(AISTATES* pState) bool DCustomDude::NewState(AISTATE* pState)
{ {
if (!IsMorphing()) if (!IsMorphing())
{ {
@ -849,8 +862,8 @@ bool DCustomDude::NewState(AISTATES* pState)
void DCustomDude::NewState(int nStateType, int nTimeOverride) void DCustomDude::NewState(int nStateType, int nTimeOverride)
{ {
AISTATES* pTmp = &states[nStateType][posture]; AISTATE* pTmp = &states[nStateType][posture];
AISTATES* pState = &states[nStateType][kCdudePostureL]; AISTATE* pState = &states[nStateType][kCdudePostureL];
if (pTmp->seqId > 0) if (pTmp->seqId > 0)
pState = pTmp; pState = pTmp;
@ -861,7 +874,7 @@ void DCustomDude::NewState(int nStateType, int nTimeOverride)
} }
} }
void DCustomDude::NextState(AISTATES* pState, int nTimeOverride) void DCustomDude::NextState(AISTATE* pState, int nTimeOverride)
{ {
pSpr->xspr.aiState->nextState = pState; pSpr->xspr.aiState->nextState = pState;
if (pSpr->xspr.aiState->nextState && nTimeOverride > 0) if (pSpr->xspr.aiState->nextState && nTimeOverride > 0)
@ -879,7 +892,7 @@ void DCustomDude::SyncState(void)
if (pSpr->xspr.aiState && FindState(pSpr->xspr.aiState, &t1, &t2) && t2 != posture) if (pSpr->xspr.aiState && FindState(pSpr->xspr.aiState, &t1, &t2) && t2 != posture)
{ {
t2 = pSpr->xspr.stateTimer; // save time t2 = pSpr->xspr.stateTimer; // save time
AISTATES* pState = &states[t1][posture]; AISTATE* pState = &states[t1][posture];
NewState(pState); NewState(pState);
if (pState->stateTicks) if (pState->stateTicks)
@ -887,7 +900,7 @@ void DCustomDude::SyncState(void)
} }
} }
bool DCustomDude::FindState(AISTATES* pState, int* nStateType, int* nPosture) bool DCustomDude::FindState(AISTATE* pState, int* nStateType, int* nPosture)
{ {
return setup.FindAiState(states, countof(states), pState, nStateType, nPosture); return setup.FindAiState(states, countof(states), pState, nStateType, nPosture);
} }
@ -1089,10 +1102,10 @@ void DCustomDude::Recoil(void)
pSpr->dudeExtra.teslaHit = 0; pSpr->dudeExtra.teslaHit = 0;
} }
AISTATES* DCustomDude::PickDeath(int nDmgType) AISTATE* DCustomDude::PickDeath(int nDmgType)
{ {
int i, nRand = Random(kCdudePostureMax); int i, nRand = Random(kCdudePostureMax);
AISTATES* pDeath = &states[kCdudeStateDeathBase + nDmgType][nRand]; AISTATE* pDeath = &states[kCdudeStateDeathBase + nDmgType][nRand];
if (pDeath->seqId > 0) if (pDeath->seqId > 0)
return pDeath; return pDeath;
@ -1111,7 +1124,7 @@ AISTATES* DCustomDude::PickDeath(int nDmgType)
void DCustomDude::Kill(DBloodActor* pFrom, int nDmgType, int nDmg) void DCustomDude::Kill(DBloodActor* pFrom, int nDmgType, int nDmg)
{ {
GAMEOPTIONS* pOpt = &gGameOptions; GAMEOPTIONS* pOpt = &gGameOptions;
AISTATES* pDeath; AISTATE* pDeath;
int i; int i;
if (IsDying()) if (IsDying())
@ -1632,7 +1645,7 @@ void CUSTOMDUDE_SETUP::RandomizeDudeSettings()
for (i = 0; i < countof(states); i++) for (i = 0; i < countof(states); i++)
{ {
AISTATES* pState = pDude->states[states[i]]; AISTATE* pState = pDude->states[states[i]];
for (j = 0; j < kCdudePostureMax; j++) for (j = 0; j < kCdudePostureMax; j++)
{ {
nTime = pState->stateTicks; nTime = pState->stateTicks;
@ -1671,7 +1684,7 @@ void CUSTOMDUDE_SETUP::Setup(DBloodActor* pSpr)
setup.DoSetup(pSpr); setup.DoSetup(pSpr);
} }
static void Copy(AISTATES* to, AISTATE_TPL* from) static void Copy(AISTATE* to, AISTATE_TPL* from)
{ {
to->name = NAME_None; // needs special handling to->name = NAME_None; // needs special handling
to->stateType = from->stateType; to->stateType = from->stateType;
@ -1687,7 +1700,7 @@ static void Copy(AISTATES* to, AISTATE_TPL* from)
void CUSTOMDUDE_SETUP::DoSetup(DBloodActor* pSpr) void CUSTOMDUDE_SETUP::DoSetup(DBloodActor* pSpr)
{ {
AISTATE_TPL* pModel; AISTATE_TPL* pModel;
AISTATES* pState; AISTATE* pState;
int nStateType, nPosture; int nStateType, nPosture;
int i, j; int i, j;
@ -1737,7 +1750,7 @@ void CUSTOMDUDE_SETUP::DoSetup(DBloodActor* pSpr)
// copy dying states // copy dying states
pModel = gCdudeStateDyingTemplate; pModel = gCdudeStateDyingTemplate;
AISTATES* nextState = FindState(NAME_cdudeDeath); AISTATE* nextState = FindState(NAME_cdudeDeath);
for (i = kCdudeStateDeathBase; i < kCdudeStateDeathMax; i++) for (i = kCdudeStateDeathBase; i < kCdudeStateDeathMax; i++)
{ {
for (j = 0; j < kCdudePostureMax; j++) for (j = 0; j < kCdudePostureMax; j++)
@ -2004,7 +2017,7 @@ void CUSTOMDUDE_SETUP::WeaponSoundSetDefault(CUSTOMDUDE_WEAPON* pWeapon)
void CUSTOMDUDE_SETUP::AnimationConvert(int baseID) void CUSTOMDUDE_SETUP::AnimationConvert(int baseID)
{ {
const SEQCOMPAT* pEntry; const SEQCOMPAT* pEntry;
AISTATES* pState; AISTATE* pState;
int i, j, nSeq; int i, j, nSeq;
for (i = 0; i < kCdudeStateMax; i++) for (i = 0; i < kCdudeStateMax; i++)
@ -2028,14 +2041,14 @@ void CUSTOMDUDE_SETUP::AnimationConvert(int baseID)
} }
} }
void CUSTOMDUDE_SETUP::AnimationFill(AISTATES* pState, int nAnim) void CUSTOMDUDE_SETUP::AnimationFill(AISTATE* pState, int nAnim)
{ {
for (int i = 0; i < kCdudePostureMax; i++) pState[i].seqId = nAnim; for (int i = 0; i < kCdudePostureMax; i++) pState[i].seqId = nAnim;
} }
void CUSTOMDUDE_SETUP::AnimationFill(void) void CUSTOMDUDE_SETUP::AnimationFill(void)
{ {
AISTATES* pState; AISTATE* pState;
int i, j; int i, j;
for (i = 0; i < kCdudeStateMax; i++) for (i = 0; i < kCdudeStateMax; i++)
@ -2184,7 +2197,7 @@ void CUSTOMDUDE_SETUP::SoundFill(void)
void CUSTOMDUDE_SETUP::FindLargestPic(void) void CUSTOMDUDE_SETUP::FindLargestPic(void)
{ {
int i, j, nHeigh = 0; int i, j, nHeigh = 0;
AISTATES* pState; AISTATE* pState;
const Seq* pSeq; const Seq* pSeq;
for (i = 0; i < kCdudeStateMax; i++) for (i = 0; i < kCdudeStateMax; i++)
@ -2428,7 +2441,7 @@ void CUSTOMDUDEV2_SETUP::SetupVelocity(void)
} }
} }
void CUSTOMDUDEV2_SETUP::SetupAnimation(AISTATES* pState, bool asPosture) void CUSTOMDUDEV2_SETUP::SetupAnimation(AISTATE* pState, bool asPosture)
{ {
AnimationFill(pState, 0); // clear seqID first AnimationFill(pState, 0); // clear seqID first
ParseAnimation(pValue, pState, asPosture); ParseAnimation(pValue, pState, asPosture);
@ -2486,7 +2499,7 @@ void CUSTOMDUDEV2_SETUP::SetupAnimation(void)
} }
else if (rngok(pParam->id, kCdudeStateDeathBase, kCdudeStateDeathMax)) else if (rngok(pParam->id, kCdudeStateDeathBase, kCdudeStateDeathMax))
{ {
AISTATES* pState = pDude->states[pParam->id]; AISTATE* pState = pDude->states[pParam->id];
SetupAnimation(pState, false); SetupAnimation(pState, false);
} }
break; break;
@ -2649,7 +2662,7 @@ void CUSTOMDUDEV2_SETUP::SetupKnockout(void)
{ {
CUSTOMDUDE_KNOCKOUT* pKnock = &pDude->knockout; CUSTOMDUDE_KNOCKOUT* pKnock = &pDude->knockout;
int onEventDmg[3]; int onEventDmg[3];
AISTATES* pState; AISTATE* pState;
int i; int i;
/* ----------------------------------*/ /* ----------------------------------*/
@ -3192,7 +3205,7 @@ void CUSTOMDUDEV2_SETUP::SetupWeapons(void)
char tmp[64]; int range[2]; char tmp[64]; int range[2];
CUSTOMDUDE_WEAPON* pWeap; CUSTOMDUDE_WEAPON* pWeap;
AISTATES* pState; AISTATE* pState;
/* ----------------------------------*/ /* ----------------------------------*/
/* DEFAULT VALUES */ /* DEFAULT VALUES */
@ -3613,7 +3626,7 @@ bool CUSTOMDUDEV2_SETUP::ParseSound(const char* str, CUSTOMDUDE_SOUND* pSound)
return false; return false;
} }
bool CUSTOMDUDEV2_SETUP::ParseAnimation(const char* str, AISTATES* pState, bool asPosture) bool CUSTOMDUDEV2_SETUP::ParseAnimation(const char* str, AISTATE* pState, bool asPosture)
{ {
int i, j, nPar, nLen; int i, j, nPar, nLen;
int nVal; int nVal;
@ -4092,7 +4105,7 @@ void CUSTOMDUDEV1_SETUP::WeaponMeleeSet(CUSTOMDUDE_WEAPON* pWeapon)
WeaponRangeSet(pWeapon, 0, 512); WeaponRangeSet(pWeapon, 0, 512);
AISTATES* pState = pDude->states[pWeapon->stateID]; AISTATE* pState = pDude->states[pWeapon->stateID];
for (int i = 0; i < kCdudePostureMax; i++) for (int i = 0; i < kCdudePostureMax; i++)
{ {
if (!helperSeqTriggerExists(pState->seqId)) if (!helperSeqTriggerExists(pState->seqId))

View file

@ -1218,7 +1218,7 @@ class DCustomDude : public DObject
CUSTOMDUDE_KNOCKOUT knockout; // knock control CUSTOMDUDE_KNOCKOUT knockout; // knock control
CUSTOMDUDE_DROPITEM dropItem; // drop item control CUSTOMDUDE_DROPITEM dropItem; // drop item control
CUSTOMDUDE_EFFECT effects[kCdudeMaxEffectGroups]; // fx, gib effect stuff CUSTOMDUDE_EFFECT effects[kCdudeMaxEffectGroups]; // fx, gib effect stuff
AISTATES states[kCdudeStateMax][kCdudePostureMax]; // includes states for weapons AISTATE states[kCdudeStateMax][kCdudePostureMax]; // includes states for weapons
TArray<TObjPtr<DBloodActor*>> pSlaves; // summoned dudes under control of this dude TArray<TObjPtr<DBloodActor*>> pSlaves; // summoned dudes under control of this dude
TArray<int> triggerSeqs; // this originally hacked the global ser TArray<int> triggerSeqs; // this originally hacked the global ser
uint8_t medium ; // medium in which it can live uint8_t medium ; // medium in which it can live
@ -1283,12 +1283,12 @@ class DCustomDude : public DObject
void Kill(DBloodActor* nFrom, int nDmgType, int nDmg); void Kill(DBloodActor* nFrom, int nDmgType, int nDmg);
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
bool CanMove(sectortype* pXSect, bool Crusher, bool Water, bool Uwater, bool Depth, double bottom, double floorZ); bool CanMove(sectortype* pXSect, bool Crusher, bool Water, bool Uwater, bool Depth, double bottom, double floorZ);
bool FindState(AISTATES* pState, int* nStateType, int* nPosture); bool FindState(AISTATE* pState, int* nStateType, int* nPosture);
void NewState(int nStateType, int nTimeOverride = -1); void NewState(int nStateType, int nTimeOverride = -1);
bool NewState(AISTATES* pState); bool NewState(AISTATE* pState);
void NextState(int nStateType, int nTimeOverride = 0); void NextState(int nStateType, int nTimeOverride = 0);
void NextState(AISTATES* pState, int nTimeOverride = 0); void NextState(AISTATE* pState, int nTimeOverride = 0);
AISTATES* PickDeath(int nDmgType); AISTATE* PickDeath(int nDmgType);
void SyncState(void); void SyncState(void);
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
void LeechPickup(void); void LeechPickup(void);
@ -1343,7 +1343,7 @@ class CUSTOMDUDE_SETUP
void WeaponRangeSet(CUSTOMDUDE_WEAPON* pWeapon, int nMin, int nMax); void WeaponRangeSet(CUSTOMDUDE_WEAPON* pWeapon, int nMin, int nMax);
/*------------------------------------------------------------*/ /*------------------------------------------------------------*/
void AnimationConvert(int baseID); void AnimationConvert(int baseID);
void AnimationFill(AISTATES* pState, int nAnim); void AnimationFill(AISTATE* pState, int nAnim);
void AnimationFill(void); void AnimationFill(void);
/*------------------------------------------------------------*/ /*------------------------------------------------------------*/
void SoundConvert(int baseID); void SoundConvert(int baseID);
@ -1389,7 +1389,7 @@ class CUSTOMDUDEV2_SETUP : public CUSTOMDUDE_SETUP
bool ParseVelocity(const char* str, CUSTOMDUDE_VELOCITY* pVelocity); bool ParseVelocity(const char* str, CUSTOMDUDE_VELOCITY* pVelocity);
bool ParseAppearance(const char* str, APPEARANCE* pAppear); bool ParseAppearance(const char* str, APPEARANCE* pAppear);
bool ParseSound(const char* str, CUSTOMDUDE_SOUND* pSound); bool ParseSound(const char* str, CUSTOMDUDE_SOUND* pSound);
bool ParseAnimation(const char* str, AISTATES* pState, bool asPosture); bool ParseAnimation(const char* str, AISTATE* pState, bool asPosture);
int ParseRange(const char* str, int nValType, int out[2], int nBaseVal = 0); int ParseRange(const char* str, int nValType, int out[2], int nBaseVal = 0);
int ParseMedium(const char* str); int ParseMedium(const char* str);
bool ParseOffsets(const char* str, DVector3& pOut); bool ParseOffsets(const char* str, DVector3& pOut);
@ -1417,7 +1417,7 @@ class CUSTOMDUDEV2_SETUP : public CUSTOMDUDE_SETUP
/*-------------------------------------------------*/ /*-------------------------------------------------*/
void SetupGeneral(void); void SetupGeneral(void);
void SetupVelocity(void); void SetupVelocity(void);
void SetupAnimation(AISTATES* pState, bool asPosture); void SetupAnimation(AISTATE* pState, bool asPosture);
void SetupAnimation(void); void SetupAnimation(void);
void SetupSound(CUSTOMDUDE_SOUND* pSound); void SetupSound(CUSTOMDUDE_SOUND* pSound);
void SetupMovePattern(void); void SetupMovePattern(void);

View file

@ -307,7 +307,7 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, CUSTOMDUDE_DROPITE
return arc; return arc;
} }
FSerializer& Serialize(FSerializer& arc, const char* keyname, AISTATES& w, AISTATES* def) FSerializer& Serialize(FSerializer& arc, const char* keyname, AISTATE& w, AISTATE* def)
{ {
if (arc.BeginObject(keyname)) if (arc.BeginObject(keyname))
{ {

View file

@ -7043,7 +7043,7 @@ void aiPatrolState(DBloodActor* actor, int state)
for (i = 0; i < kPatrolStateSize; i++) for (i = 0; i < kPatrolStateSize; i++)
{ {
FName name = ENamedName(int(NAME_genPatrolState_0) + i); FName name = ENamedName(int(NAME_genPatrolState_0) + i);
AISTATES* const newState = FindState(name); AISTATE* const newState = FindState(name);
if (newState->stateType != state) if (newState->stateType != state)
continue; continue;
@ -7058,7 +7058,7 @@ void aiPatrolState(DBloodActor* actor, int state)
continue; continue;
DCustomDude* pDude = cdudeGet(actor); DCustomDude* pDude = cdudeGet(actor);
AISTATES* pState = pDude->states[0]; AISTATE* pState = pDude->states[0];
seq = pState[seq].seqId; seq = pState[seq].seqId;
if (seq <= 0) if (seq <= 0)
continue; continue;

View file

@ -350,19 +350,19 @@ inline int aiPatrolGetVelocity(int speed, int value) {
return (value > 0) ? ClipRange((speed / 3) + (2500 * value), 0, 0x47956) : speed; return (value > 0) ? ClipRange((speed / 3) + (2500 * value), 0, 0x47956) : speed;
} }
inline bool aiPatrolWaiting(AISTATES* pAiState) { inline bool aiPatrolWaiting(AISTATE* pAiState) {
return (pAiState && pAiState->stateType >= kAiStatePatrolWaitL && pAiState->stateType <= kAiStatePatrolWaitW); return (pAiState && pAiState->stateType >= kAiStatePatrolWaitL && pAiState->stateType <= kAiStatePatrolWaitW);
} }
inline bool aiPatrolMoving(AISTATES* pAiState) { inline bool aiPatrolMoving(AISTATE* pAiState) {
return (pAiState && pAiState->stateType >= kAiStatePatrolMoveL && pAiState->stateType <= kAiStatePatrolMoveW); return (pAiState && pAiState->stateType >= kAiStatePatrolMoveL && pAiState->stateType <= kAiStatePatrolMoveW);
} }
inline bool aiPatrolTurning(AISTATES* pAiState) { inline bool aiPatrolTurning(AISTATE* pAiState) {
return (pAiState && pAiState->stateType >= kAiStatePatrolTurnL && pAiState->stateType <= kAiStatePatrolTurnW); return (pAiState && pAiState->stateType >= kAiStatePatrolTurnL && pAiState->stateType <= kAiStatePatrolTurnW);
} }
inline bool aiInPatrolState(AISTATES* pAiState) { inline bool aiInPatrolState(AISTATE* pAiState) {
return (pAiState && pAiState->stateType >= kAiStatePatrolBase && pAiState->stateType < kAiStatePatrolMax); return (pAiState && pAiState->stateType >= kAiStatePatrolBase && pAiState->stateType < kAiStatePatrolMax);
} }