mirror of
https://github.com/1dot13/source.git
synced 2026-08-05 14:00:23 +02:00
Use TACTICAL_RANGE instead of DAY_VISION_RANGE for AI calculations.
Implemented Black cover advance code for AI: try to get closer to enemy using cover if soldier has low CTH or enemy too far for shooting or soldier has high morale or no cover at spot. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8931 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
@@ -442,28 +442,28 @@ INT32 CalcCoverValue(SOLDIERTYPE *pMe, INT32 sMyGridNo, INT32 iMyThreat, INT32 i
|
||||
// sevenfm: special calculations for zombies: zombie is very dangerous at close range
|
||||
if (pHim->IsZombie() || !AICheckHasGun(pHim))
|
||||
{
|
||||
if (sDist < (INT32)(DAY_VISION_RANGE / 2))
|
||||
if (sDist < (INT32)(TACTICAL_RANGE / 2))
|
||||
{
|
||||
// 100 - 25
|
||||
bHisCTGT = 100 - 150 * sDist / DAY_VISION_RANGE;
|
||||
bHisCTGT = 100 - 150 * sDist / TACTICAL_RANGE;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 25 - 0
|
||||
bHisCTGT = 100 * DAY_VISION_RANGE * DAY_VISION_RANGE / (16 * sDist * sDist);
|
||||
bHisCTGT = 100 * TACTICAL_RANGE * TACTICAL_RANGE / (16 * sDist * sDist);
|
||||
}
|
||||
}
|
||||
|
||||
// sevenfm: if soldier has no gun, use different calculation
|
||||
if (pMe->IsZombie() || !AICheckHasGun(pMe))
|
||||
{
|
||||
if (sDist < (INT32)(DAY_VISION_RANGE / 2))
|
||||
if (sDist < (INT32)(TACTICAL_RANGE / 2))
|
||||
{
|
||||
bMyCTGT = 100 - 150 * sDist / DAY_VISION_RANGE;
|
||||
bMyCTGT = 100 - 150 * sDist / TACTICAL_RANGE;
|
||||
}
|
||||
else
|
||||
{
|
||||
bMyCTGT = 100 * DAY_VISION_RANGE * DAY_VISION_RANGE / (16 * sDist * sDist);
|
||||
bMyCTGT = 100 * TACTICAL_RANGE * TACTICAL_RANGE / (16 * sDist * sDist);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -473,13 +473,13 @@ INT32 CalcCoverValue(SOLDIERTYPE *pMe, INT32 sMyGridNo, INT32 iMyThreat, INT32 i
|
||||
iMyPosValue = bMyCTGT * iMyThreat * iMyAPsLeft;
|
||||
|
||||
// add penalty to enemy position, bonus to my position if soldier has cover at spot
|
||||
// max 25% at DAY_VISION_RANGE/2, 0 at zero range
|
||||
// max 25% at TACTICAL_RANGE / 2, 0 at zero range
|
||||
if( gGameExternalOptions.fAIBetterCover )
|
||||
{
|
||||
UINT8 ubCoverBonus = 25;
|
||||
if (sDist < (INT32)(DAY_VISION_RANGE / 2))
|
||||
if (sDist < (INT32)(TACTICAL_RANGE / 2))
|
||||
{
|
||||
ubCoverBonus = ubCoverBonus * 2 * sDist / DAY_VISION_RANGE;
|
||||
ubCoverBonus = ubCoverBonus * 2 * sDist / TACTICAL_RANGE;
|
||||
}
|
||||
if (!pHim->IsZombie() && AICheckHasGun(pHim) && AnyCoverFromSpot(sMyGridNo, bMyLevel, sHisGridNo, bHisLevel))
|
||||
{
|
||||
@@ -536,7 +536,7 @@ INT32 CalcCoverValue(SOLDIERTYPE *pMe, INT32 sMyGridNo, INT32 iMyThreat, INT32 i
|
||||
if (gGameExternalOptions.fAIBetterCover)
|
||||
{
|
||||
if (!AnyCoverFromSpot(sMyGridNo, bMyLevel, sHisGridNo, bHisLevel) &&
|
||||
CountSeenEnemiesLastTurn(pMe) > CountNearbyFriends(pMe, sMyGridNo, DAY_VISION_RANGE / 2))
|
||||
CountSeenEnemiesLastTurn(pMe) > CountNearbyFriends(pMe, sMyGridNo, TACTICAL_RANGE / 2))
|
||||
{
|
||||
iRangeFactor = iRangeFactor * (100 - bHisCTGT * __min(Threat[uiThreatIndex].iAPs, APBPConstants[AP_MAXIMUM]) / APBPConstants[AP_MAXIMUM]) / 100;
|
||||
}
|
||||
@@ -787,7 +787,7 @@ INT32 FindBestNearbyCover(SOLDIERTYPE *pSoldier, INT32 morale, INT32 *piPercentB
|
||||
// sevenfm: sight test
|
||||
if( gGameExternalOptions.fAIBetterCover )
|
||||
{
|
||||
if ( LocationToLocationLineOfSightTest( Threat[uiLoop].sGridNo, Threat[uiLoop].pOpponent->pathing.bLevel, pSoldier->sGridNo, pSoldier->pathing.bLevel, TRUE, DAY_VISION_RANGE * 2, STANDING_LOS_POS, PRONE_LOS_POS ) )
|
||||
if ( LocationToLocationLineOfSightTest( Threat[uiLoop].sGridNo, Threat[uiLoop].pOpponent->pathing.bLevel, pSoldier->sGridNo, pSoldier->pathing.bLevel, TRUE, MAX_VISION_RANGE, STANDING_LOS_POS, PRONE_LOS_POS ) )
|
||||
//if ( SoldierToVirtualSoldierLineOfSightTest( Threat[uiLoop].pOpponent, pSoldier->sGridNo, pSoldier->pathing.bLevel, ANIM_PRONE, TRUE, NO_DISTANCE_LIMIT ) )
|
||||
{
|
||||
fProneCover = FALSE;
|
||||
@@ -1053,7 +1053,7 @@ INT32 FindBestNearbyCover(SOLDIERTYPE *pSoldier, INT32 morale, INT32 *piPercentB
|
||||
// sevenfm: sight test
|
||||
if( gGameExternalOptions.fAIBetterCover )
|
||||
{
|
||||
if ( LocationToLocationLineOfSightTest( Threat[uiLoop].sGridNo, Threat[uiLoop].pOpponent->pathing.bLevel, sGridNo, pSoldier->pathing.bLevel, TRUE, DAY_VISION_RANGE * 2, STANDING_LOS_POS, PRONE_LOS_POS ) )
|
||||
if ( LocationToLocationLineOfSightTest( Threat[uiLoop].sGridNo, Threat[uiLoop].pOpponent->pathing.bLevel, sGridNo, pSoldier->pathing.bLevel, TRUE, MAX_VISION_RANGE, STANDING_LOS_POS, PRONE_LOS_POS ) )
|
||||
//if ( SoldierToVirtualSoldierLineOfSightTest( Threat[uiLoop].pOpponent, sGridNo, pSoldier->pathing.bLevel, ANIM_PRONE, TRUE, -1 ) != 0 )
|
||||
{
|
||||
fProneCover = FALSE;
|
||||
@@ -3329,7 +3329,7 @@ INT32 FindAdvanceSpot(SOLDIERTYPE *pSoldier, INT32 sTargetSpot, INT8 bAction, UI
|
||||
}
|
||||
|
||||
// skip locations too close to target spot
|
||||
if (PythSpacesAway(sGridNo, sTargetSpot) < (INT16)(DAY_VISION_RANGE / 4))
|
||||
if (PythSpacesAway(sGridNo, sTargetSpot) < (INT16)(TACTICAL_RANGE / 4))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@@ -3613,7 +3613,7 @@ INT32 FindRetreatSpot(SOLDIERTYPE *pSoldier)
|
||||
// skip if too close to enemy
|
||||
//sClosestOpponent = ClosestKnownOpponent(pSoldier, NULL, NULL);
|
||||
sDistance = PythSpacesAway(sGridNo, sClosestOpponent);
|
||||
if (sDistance < (INT16)(DAY_VISION_RANGE / 2))
|
||||
if (sDistance < (INT16)(TACTICAL_RANGE / 2))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user