mirror of
https://github.com/1dot13/source.git
synced 2026-09-09 14:46:05 +02:00
CalcMoraleNew (AI_NEW_MORALE option):
- more aggressive AI - limit AI morale when soldier is under heavy fire git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8916 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
+48
-10
@@ -3908,11 +3908,11 @@ INT8 CalcMoraleNew(SOLDIERTYPE *pSoldier)
|
|||||||
bMoraleCategory++;
|
bMoraleCategory++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// limit AI morale depending on morale and suppression shock
|
// limit AI morale when soldier is under heavy fire
|
||||||
if( pSoldier->aiData.bShock )
|
if (pSoldier->ShockLevelPercent() > 75)
|
||||||
{
|
bMoraleCategory = min(bMoraleCategory, MORALE_NORMAL);
|
||||||
bMoraleCategory = min(bMoraleCategory, (20 + pSoldier->aiData.bMorale - 20 * min(3, pSoldier->aiData.bShock / 5)) / 20);
|
else if (pSoldier->ShockLevelPercent() > 50)
|
||||||
}
|
bMoraleCategory = min(bMoraleCategory, MORALE_CONFIDENT);
|
||||||
|
|
||||||
// prevent hopeless morale when not under attack
|
// prevent hopeless morale when not under attack
|
||||||
if (bMoraleCategory == MORALE_HOPELESS && !pSoldier->aiData.bUnderFire)
|
if (bMoraleCategory == MORALE_HOPELESS && !pSoldier->aiData.bUnderFire)
|
||||||
@@ -3920,15 +3920,53 @@ INT8 CalcMoraleNew(SOLDIERTYPE *pSoldier)
|
|||||||
bMoraleCategory = MORALE_WORRIED;
|
bMoraleCategory = MORALE_WORRIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if adjustments made it outside the allowed limits
|
// check limits
|
||||||
if (bMoraleCategory < MORALE_HOPELESS)
|
bMoraleCategory = max(bMoraleCategory, MORALE_HOPELESS);
|
||||||
bMoraleCategory = MORALE_HOPELESS;
|
bMoraleCategory = min(bMoraleCategory, MORALE_FEARLESS);
|
||||||
else if (bMoraleCategory > MORALE_FEARLESS)
|
|
||||||
bMoraleCategory = MORALE_FEARLESS;
|
|
||||||
|
|
||||||
return(bMoraleCategory);
|
return(bMoraleCategory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOLEAN AICheckSpecialRole(SOLDIERTYPE *pSoldier)
|
||||||
|
{
|
||||||
|
if (AICheckIsSniper(pSoldier) || AICheckIsMachinegunner(pSoldier) || AICheckIsMortarOperator(pSoldier) || AICheckIsRadioOperator(pSoldier) || AICheckIsCommander(pSoldier))
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN WeAttack(INT8 bTeam)
|
||||||
|
{
|
||||||
|
if (bTeam >= MAXTEAMS)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bTeam != ENEMY_TEAM)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check that every soldier has SEEKENEMY order
|
||||||
|
SOLDIERTYPE * pFriend;
|
||||||
|
|
||||||
|
// Run through each friendly.
|
||||||
|
for (UINT8 iCounter = gTacticalStatus.Team[bTeam].bFirstID; iCounter <= gTacticalStatus.Team[bTeam].bLastID; iCounter++)
|
||||||
|
{
|
||||||
|
pFriend = MercPtrs[iCounter];
|
||||||
|
|
||||||
|
if (pFriend &&
|
||||||
|
pFriend->bActive &&
|
||||||
|
pFriend->stats.bLife >= OKLIFE &&
|
||||||
|
pFriend->aiData.bOrders != SEEKENEMY)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
UINT8 CountNearbyFriendsLastAttackHit( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT8 ubDistance )
|
UINT8 CountNearbyFriendsLastAttackHit( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT8 ubDistance )
|
||||||
{
|
{
|
||||||
CHECKF(pSoldier);
|
CHECKF(pSoldier);
|
||||||
|
|||||||
@@ -351,6 +351,7 @@ BOOLEAN CorpseMilitiaTeam(ROTTING_CORPSE *pCorpse);
|
|||||||
BOOLEAN NorthSpot(INT32 sSpot, INT8 bLevel);
|
BOOLEAN NorthSpot(INT32 sSpot, INT8 bLevel);
|
||||||
BOOLEAN SoldierAI(SOLDIERTYPE *pSoldier);
|
BOOLEAN SoldierAI(SOLDIERTYPE *pSoldier);
|
||||||
|
|
||||||
|
BOOLEAN WeAttack(INT8 bTeam);
|
||||||
BOOLEAN CheckSuppressionDirection(SOLDIERTYPE *pSoldier, INT32 sTargetGridNo, INT8 bTargetLevel);
|
BOOLEAN CheckSuppressionDirection(SOLDIERTYPE *pSoldier, INT32 sTargetGridNo, INT8 bTargetLevel);
|
||||||
|
|
||||||
UINT8 AIDirection(INT32 sSpot1, INT32 sSpot2);
|
UINT8 AIDirection(INT32 sSpot1, INT32 sSpot2);
|
||||||
@@ -379,6 +380,8 @@ BOOLEAN AICheckIsGLOperator(SOLDIERTYPE *pSoldier);
|
|||||||
BOOLEAN AICheckIsOfficer(SOLDIERTYPE *pSoldier);
|
BOOLEAN AICheckIsOfficer(SOLDIERTYPE *pSoldier);
|
||||||
BOOLEAN AICheckIsCommander(SOLDIERTYPE *pSoldier);
|
BOOLEAN AICheckIsCommander(SOLDIERTYPE *pSoldier);
|
||||||
|
|
||||||
|
BOOLEAN AICheckSpecialRole(SOLDIERTYPE *pSoldier);
|
||||||
|
|
||||||
// *************************************************************
|
// *************************************************************
|
||||||
// Knowledge functions
|
// Knowledge functions
|
||||||
// *************************************************************
|
// *************************************************************
|
||||||
|
|||||||
Reference in New Issue
Block a user