Morale changes for AI soldiers:

- GetMoraleModifier: use bMorale for both player and AI.
- CalcSuppressionTolerance: use morale as a base for tolerance for AI soldiers.
- HandleSuppressionFire: morale loss for AI soldiers.
- EVENT_BeginMercTurn: increase morale for AI soldiers.
- TacticalCreateSoldier: Set morale = 60 + 2 * bExpLevel + Random(20) when creating AI soldier.

NEW_SUPPRESSION_CODE: UseGun, UseGunNCTH: reduce shock when firing gun.
AI_NEW_MORALE: limit AI morale depending on morale and shock level.

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@9181 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Sevenfm
2021-10-15 05:52:09 +00:00
parent 7a7f554908
commit 7978ad77f3
6 changed files with 98 additions and 32 deletions
+48
View File
@@ -2460,6 +2460,30 @@ BOOLEAN UseGunNCTH( SOLDIERTYPE *pSoldier , INT32 sTargetGridNo )
OBJECTTYPE* pObjAttHand = pSoldier->GetUsedWeapon( &pSoldier->inv[ pSoldier->ubAttackingHand ] );
UINT16 usUBItem = pSoldier->GetUsedWeaponNumber( &pSoldier->inv[ pSoldier->ubAttackingHand ] );
// sevenfm: reduce shock when firing gun, for autofire shots - apply once
SOLDIERTYPE* pTarget = SimpleFindSoldier(sTargetGridNo, pSoldier->bTargetLevel);
if (gGameExternalOptions.fNewSuppressionCode &&
Item[usUBItem].usItemClass == IC_GUN &&
pTarget &&
(pSoldier->bDoBurst == 1 || pSoldier->bDoBurst == 0))
{
UINT16 noisefactor = GetPercentNoiseVolume(pObjHand);
UINT8 ubDamage = Weapon[usUBItem].ubImpact;
INT8 bShotsToFire = 1;
if (pSoldier->bDoBurst)
{
bShotsToFire = pSoldier->bDoAutofire ? pSoldier->bDoAutofire : GetShotsPerBurst(pObjHand);
}
// calculate shock reduction value 0-50%
UINT8 ubShockReductPercent = (50 - 400 / (bShotsToFire + 8)) * noisefactor * Weapon[usUBItem].ubAttackVolume / (50 * 100);
if (pSoldier->IsValidSecondHandShot())
ubShockReductPercent = ubShockReductPercent * 3 / 2;
ubShockReductPercent = __min(50, ubShockReductPercent);
pSoldier->aiData.bShock -= pSoldier->aiData.bShock * ubShockReductPercent / 100;
}
// CALC MUZZLE SWAY
if ( Item[ usUBItem ].usItemClass == IC_THROWING_KNIFE )
{
@@ -3201,6 +3225,30 @@ BOOLEAN UseGun( SOLDIERTYPE *pSoldier , INT32 sTargetGridNo )
usItemNum = pSoldier->usAttackingWeapon;
// sevenfm: reduce shock when firing gun, for autofire shots - apply once
SOLDIERTYPE* pTarget = SimpleFindSoldier(sTargetGridNo, pSoldier->bTargetLevel);
if (gGameExternalOptions.fNewSuppressionCode &&
Item[usUBItem].usItemClass == IC_GUN &&
pTarget &&
(pSoldier->bDoBurst == 1 || pSoldier->bDoBurst == 0))
{
UINT16 noisefactor = GetPercentNoiseVolume(pObjUsed);
UINT8 ubDamage = Weapon[usUBItem].ubImpact;
INT8 bShotsToFire = 1;
if (pSoldier->bDoBurst)
{
bShotsToFire = pSoldier->bDoAutofire ? pSoldier->bDoAutofire : GetShotsPerBurst(pObjUsed);
}
// calculate shock reduction value 0-50%
UINT8 ubShockReductPercent = (50 - 400 / (bShotsToFire + 8)) * noisefactor * Weapon[usUBItem].ubAttackVolume / (50 * 100);
if (pSoldier->IsValidSecondHandShot())
ubShockReductPercent = ubShockReductPercent * 3 / 2;
ubShockReductPercent = __min(50, ubShockReductPercent);
pSoldier->aiData.bShock -= pSoldier->aiData.bShock * ubShockReductPercent / 100;
}
// DEDUCT APs
if (pSoldier->bDoBurst)
{