mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +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++;
|
||||
}
|
||||
|
||||
// limit AI morale depending on morale and suppression shock
|
||||
if( pSoldier->aiData.bShock )
|
||||
{
|
||||
bMoraleCategory = min(bMoraleCategory, (20 + pSoldier->aiData.bMorale - 20 * min(3, pSoldier->aiData.bShock / 5)) / 20);
|
||||
}
|
||||
// limit AI morale when soldier is under heavy fire
|
||||
if (pSoldier->ShockLevelPercent() > 75)
|
||||
bMoraleCategory = min(bMoraleCategory, MORALE_NORMAL);
|
||||
else if (pSoldier->ShockLevelPercent() > 50)
|
||||
bMoraleCategory = min(bMoraleCategory, MORALE_CONFIDENT);
|
||||
|
||||
// prevent hopeless morale when not under attack
|
||||
if (bMoraleCategory == MORALE_HOPELESS && !pSoldier->aiData.bUnderFire)
|
||||
@@ -3920,15 +3920,53 @@ INT8 CalcMoraleNew(SOLDIERTYPE *pSoldier)
|
||||
bMoraleCategory = MORALE_WORRIED;
|
||||
}
|
||||
|
||||
// if adjustments made it outside the allowed limits
|
||||
if (bMoraleCategory < MORALE_HOPELESS)
|
||||
bMoraleCategory = MORALE_HOPELESS;
|
||||
else if (bMoraleCategory > MORALE_FEARLESS)
|
||||
bMoraleCategory = MORALE_FEARLESS;
|
||||
// check limits
|
||||
bMoraleCategory = max(bMoraleCategory, MORALE_HOPELESS);
|
||||
bMoraleCategory = min(bMoraleCategory, MORALE_FEARLESS);
|
||||
|
||||
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 )
|
||||
{
|
||||
CHECKF(pSoldier);
|
||||
|
||||
@@ -351,6 +351,7 @@ BOOLEAN CorpseMilitiaTeam(ROTTING_CORPSE *pCorpse);
|
||||
BOOLEAN NorthSpot(INT32 sSpot, INT8 bLevel);
|
||||
BOOLEAN SoldierAI(SOLDIERTYPE *pSoldier);
|
||||
|
||||
BOOLEAN WeAttack(INT8 bTeam);
|
||||
BOOLEAN CheckSuppressionDirection(SOLDIERTYPE *pSoldier, INT32 sTargetGridNo, INT8 bTargetLevel);
|
||||
|
||||
UINT8 AIDirection(INT32 sSpot1, INT32 sSpot2);
|
||||
@@ -379,6 +380,8 @@ BOOLEAN AICheckIsGLOperator(SOLDIERTYPE *pSoldier);
|
||||
BOOLEAN AICheckIsOfficer(SOLDIERTYPE *pSoldier);
|
||||
BOOLEAN AICheckIsCommander(SOLDIERTYPE *pSoldier);
|
||||
|
||||
BOOLEAN AICheckSpecialRole(SOLDIERTYPE *pSoldier);
|
||||
|
||||
// *************************************************************
|
||||
// Knowledge functions
|
||||
// *************************************************************
|
||||
|
||||
Reference in New Issue
Block a user