-AI fixes for snipers

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@230 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
MaddMugsy
2006-06-14 00:17:53 +00:00
parent 52052eb0ca
commit 441b674001
+18 -38
View File
@@ -1032,7 +1032,7 @@ BOOLEAN fCivilian = (PTR_CIVILIAN && (pSoldier->ubCivilianGroup == NON_CIV_GROUP
*/ */
case FARPATROL: iChance += +25; break; case FARPATROL: iChance += +25; break;
case SEEKENEMY: iChance += -10; break; case SEEKENEMY: iChance += -10; break;
case SNIPER: iChance += -40; break; case SNIPER: iChance += -20; break;
} }
// modify chance of patrol (and whether it's a sneaky one) by attitude // modify chance of patrol (and whether it's a sneaky one) by attitude
@@ -1102,7 +1102,7 @@ BOOLEAN fCivilian = (PTR_CIVILIAN && (pSoldier->ubCivilianGroup == NON_CIV_GROUP
case POINTPATROL: iChance = -10; break; case POINTPATROL: iChance = -10; break;
case FARPATROL: iChance += +20; break; case FARPATROL: iChance += +20; break;
case SEEKENEMY: iChance += -10; break; case SEEKENEMY: iChance += -10; break;
case SNIPER: iChance += -50; break; // Madd: Snipers have no friends :( case SNIPER: iChance += -20; break;
} }
// modify for attitude // modify for attitude
@@ -1151,12 +1151,12 @@ BOOLEAN fCivilian = (PTR_CIVILIAN && (pSoldier->ubCivilianGroup == NON_CIV_GROUP
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
// SNIPERS LIKE TO CROUCH (even in green) // SNIPERS LIKE TO CROUCH (on roofs)
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("DecideActionGreen: Snipers like to crouch, sniper = %d",pSoldier->sniper)); DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("DecideActionGreen: Snipers like to crouch, sniper = %d",pSoldier->sniper));
// if not in water and not already crouched, try to crouch down first // if not in water and not already crouched, try to crouch down first
if (pSoldier->bOrders == SNIPER && !PTR_CROUCHED && IsValidStance( pSoldier, ANIM_CROUCH ) ) if (pSoldier->bOrders == SNIPER && !PTR_CROUCHED && IsValidStance( pSoldier, ANIM_CROUCH ) && pSoldier->bLevel == 1 )
{ {
if (!gfTurnBasedAI || (GetAPsToChangeStance( pSoldier, ANIM_CROUCH ) <= pSoldier->bActionPoints)) if (!gfTurnBasedAI || (GetAPsToChangeStance( pSoldier, ANIM_CROUCH ) <= pSoldier->bActionPoints))
{ {
@@ -1172,7 +1172,7 @@ BOOLEAN fCivilian = (PTR_CIVILIAN && (pSoldier->ubCivilianGroup == NON_CIV_GROUP
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("DecideActionGreen: Snipers like to raise weapons, sniper = %d",pSoldier->sniper)); DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("DecideActionGreen: Snipers like to raise weapons, sniper = %d",pSoldier->sniper));
if ( pSoldier->bOrders == SNIPER && pSoldier->sniper == 0 ) //for some reason this check doesn't work: && pSoldier->usAnimState != PickSoldierReadyAnimation( pSoldier, FALSE ) ) if ( pSoldier->bOrders == SNIPER && pSoldier->sniper == 0 && ( pSoldier->bLevel == 1 || Random(100) < 40 ) )
{ {
if (!gfTurnBasedAI || GetAPsToReadyWeapon( pSoldier, READY_RIFLE_CROUCH ) <= pSoldier->bActionPoints) if (!gfTurnBasedAI || GetAPsToReadyWeapon( pSoldier, READY_RIFLE_CROUCH ) <= pSoldier->bActionPoints)
{ {
@@ -1204,7 +1204,7 @@ DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("DecideActionGreen: Snipers like to raise
iChance = 25 + pSoldier->bBypassToGreen; iChance = 25 + pSoldier->bBypassToGreen;
// set base chance according to orders // set base chance according to orders
if (pSoldier->bOrders == STATIONARY) if (pSoldier->bOrders == STATIONARY || pSoldier->bOrders == SNIPER)
iChance += 25; iChance += 25;
if (pSoldier->bOrders == ONGUARD) if (pSoldier->bOrders == ONGUARD)
@@ -1213,8 +1213,8 @@ DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("DecideActionGreen: Snipers like to raise
if (pSoldier->bAttitude == DEFENSIVE) if (pSoldier->bAttitude == DEFENSIVE)
iChance += 25; iChance += 25;
if ( pSoldier->bOrders == SNIPER ) if ( pSoldier->bOrders == SNIPER && pSoldier->bLevel == 1)
iChance += 60; iChance += 35;
if ((INT16)PreRandom(100) < iChance) if ((INT16)PreRandom(100) < iChance)
{ {
@@ -1346,10 +1346,8 @@ INT8 DecideActionYellow(SOLDIERTYPE *pSoldier)
if ((pSoldier->bDirection != ubNoiseDir) && PythSpacesAway(pSoldier->sGridNo,sNoiseGridNo) <= MaxDistanceVisible() ) if ((pSoldier->bDirection != ubNoiseDir) && PythSpacesAway(pSoldier->sGridNo,sNoiseGridNo) <= MaxDistanceVisible() )
{ {
// set base chance according to orders // set base chance according to orders
if ((pSoldier->bOrders == STATIONARY) || (pSoldier->bOrders == ONGUARD)) if ((pSoldier->bOrders == STATIONARY) || (pSoldier->bOrders == ONGUARD) || pSoldier->bOrders == SNIPER )
iChance = 50; iChance = 50;
else if ( pSoldier->bOrders == SNIPER )
iChance = 60;
else // all other orders else // all other orders
iChance = 25; iChance = 25;
@@ -1404,7 +1402,7 @@ INT8 DecideActionYellow(SOLDIERTYPE *pSoldier)
case POINTPATROL: break; case POINTPATROL: break;
case FARPATROL: iChance += -10; break; case FARPATROL: iChance += -10; break;
case SEEKENEMY: iChance += -20; break; case SEEKENEMY: iChance += -20; break;
case SNIPER: iChance += -80; break; //Madd: sniper contacts are supposed to be automatically reported case SNIPER: iChance += -20; break; //Madd: sniper contacts are supposed to be automatically reported
} }
// modify base chance according to attitude // modify base chance according to attitude
@@ -1547,7 +1545,7 @@ INT8 DecideActionYellow(SOLDIERTYPE *pSoldier)
case POINTPATROL: break; case POINTPATROL: break;
case FARPATROL: iChance += 10; break; case FARPATROL: iChance += 10; break;
case SEEKENEMY: iChance += 25; break; case SEEKENEMY: iChance += 25; break;
case SNIPER: iChance += -30; break; case SNIPER: iChance += -20; break;
} }
// modify chance of patrol (and whether it's a sneaky one) by attitude // modify chance of patrol (and whether it's a sneaky one) by attitude
@@ -1693,7 +1691,7 @@ INT8 DecideActionYellow(SOLDIERTYPE *pSoldier)
case POINTPATROL: iChance += -10; break; case POINTPATROL: iChance += -10; break;
case FARPATROL: break; case FARPATROL: break;
case SEEKENEMY: iChance += 10; break; case SEEKENEMY: iChance += 10; break;
case SNIPER: iChance += -50; break; case SNIPER: iChance += -20; break;
} }
// modify chance of patrol (and whether it's a sneaky one) by attitude // modify chance of patrol (and whether it's a sneaky one) by attitude
@@ -1783,7 +1781,7 @@ INT8 DecideActionYellow(SOLDIERTYPE *pSoldier)
case POINTPATROL: break; case POINTPATROL: break;
case FARPATROL: iChance += -5; break; case FARPATROL: iChance += -5; break;
case SEEKENEMY: iChance += -20; break; case SEEKENEMY: iChance += -20; break;
case SNIPER: iChance += 40; break; case SNIPER: iChance += 30; break;
} }
// modify chance (and whether it's sneaky) by attitude // modify chance (and whether it's sneaky) by attitude
@@ -2466,7 +2464,7 @@ DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"decideactionred: radio red alert?");
case POINTPATROL: iChance += -5; break; case POINTPATROL: iChance += -5; break;
case FARPATROL: iChance += -10; break; case FARPATROL: iChance += -10; break;
case SEEKENEMY: iChance += -20; break; case SEEKENEMY: iChance += -20; break;
case SNIPER: iChance += -40; break; // Sniper contacts should be reported automatically case SNIPER: iChance += -20; break; // Sniper contacts should be reported automatically
} }
// modify base chance according to attitude // modify base chance according to attitude
@@ -2652,7 +2650,7 @@ DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"decideactionred: radio red alert?");
case FARPATROL: bSeekPts += 0; bHelpPts += 0; bHidePts += 0; bWatchPts += 0; break; case FARPATROL: bSeekPts += 0; bHelpPts += 0; bHidePts += 0; bWatchPts += 0; break;
case ONCALL: bSeekPts += 0; bHelpPts += +1; bHidePts += -1; bWatchPts += 0; break; case ONCALL: bSeekPts += 0; bHelpPts += +1; bHidePts += -1; bWatchPts += 0; break;
case SEEKENEMY: bSeekPts += +1; bHelpPts += 0; bHidePts += -1; bWatchPts += -1; break; case SEEKENEMY: bSeekPts += +1; bHelpPts += 0; bHidePts += -1; bWatchPts += -1; break;
case SNIPER: bSeekPts += -1; bHelpPts += -2; bHidePts += +1; bWatchPts += +2; break; case SNIPER: bSeekPts += -1; bHelpPts += 0; bHidePts += +1; bWatchPts += +1; break;
} }
// modify tendencies according to attitude // modify tendencies according to attitude
@@ -3043,24 +3041,8 @@ DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"decideactionred: radio red alert?");
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"decideactionred: couldn't hide"); DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"decideactionred: couldn't hide");
} }
} }
/////////////////////////////////////////////////////////////////////////////
// GET TO BETTER COVER
/////////////////////////////////////////////////////////////////////////////
} }
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"decideactionred: nothing to do!");
if ( ubCanMove && ( ClosestReachableDisturbance(pSoldier, TRUE, &fClimb) == NOWHERE) )
{
sBestCover = FindBestNearbyCover(pSoldier,pSoldier->bAIMorale,&iCoverPercentBetter);
if( sBestCover != NOWHERE)
{
pSoldier->usActionData = sBestCover;
return(AI_ACTION_TAKE_COVER);
}
}
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"decideactionred: nothing to do!");
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
// NOTHING USEFUL POSSIBLE! IF NPC IS CURRENTLY UNDER FIRE, TRY TO RUN AWAY // NOTHING USEFUL POSSIBLE! IF NPC IS CURRENTLY UNDER FIRE, TRY TO RUN AWAY
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
@@ -4129,10 +4111,8 @@ bCanAttack = FALSE;
// some orders are more offensive, others more defensive // some orders are more offensive, others more defensive
if (pSoldier->bOrders == SEEKENEMY) if (pSoldier->bOrders == SEEKENEMY)
iOffense += 10; iOffense += 10;
else if ((pSoldier->bOrders == STATIONARY) || (pSoldier->bOrders == ONGUARD)) else if ((pSoldier->bOrders == STATIONARY) || (pSoldier->bOrders == ONGUARD) || pSoldier->bOrders == SNIPER )
iDefense += 10; iDefense += 10;
else if (pSoldier->bOrders == SNIPER)
iDefense += 20;
switch (pSoldier->bAttitude) switch (pSoldier->bAttitude)
{ {
@@ -4766,7 +4746,7 @@ bCanAttack = FALSE;
case POINTPATROL: iChance += -5; break; case POINTPATROL: iChance += -5; break;
case FARPATROL: iChance += -10; break; case FARPATROL: iChance += -10; break;
case SEEKENEMY: iChance += -20; break; case SEEKENEMY: iChance += -20; break;
case SNIPER: iChance += -80; break; case SNIPER: iChance += -20; break;
} }
// modify base chance according to attitude // modify base chance according to attitude