mirror of
https://github.com/1dot13/source.git
synced 2026-09-02 14:36:06 +02:00
-reduced # of guys getting sniper orders - restricted to just the onguard and stationary guys. Hopefully, this will keep them out of the city assault teams & patrols.
-added some more raise weapon code for snipers who have nothing to do. This shouldn't really be required since less snipers will be present in assaults. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@259 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
@@ -127,20 +127,22 @@ void DecideToAssignSniperOrders( SOLDIERCREATE_STRUCT * pp )
|
|||||||
{
|
{
|
||||||
//Madd: decide if soldier should be a sniper
|
//Madd: decide if soldier should be a sniper
|
||||||
|
|
||||||
// 30% of anybody w/a scope and decent range being a sniper, 80% chance of a guy w/a sniper rifle being a sniper
|
if ( pp->bOrders == STATIONARY || pp->bOrders == ONGUARD )
|
||||||
if ( (GunRange(&pp->Inv[HANDPOS]) >= 40 && IsScoped(&pp->Inv[HANDPOS]) && Random(100) < 30) || ( Weapon[pp->Inv[HANDPOS].usItem].ubWeaponType == GUN_SN_RIFLE && Random(100) < 80 ) )
|
|
||||||
{
|
{
|
||||||
pp->bOrders = SNIPER;
|
// 30% of anybody w/a scope and decent range being a sniper, 80% chance of a guy w/a sniper rifle being a sniper
|
||||||
|
if ( (GunRange(&pp->Inv[HANDPOS]) >= 40 && IsScoped(&pp->Inv[HANDPOS]) && Random(100) < 30) || ( Weapon[pp->Inv[HANDPOS].usItem].ubWeaponType == GUN_SN_RIFLE && Random(100) < 80 ) )
|
||||||
|
{
|
||||||
|
pp->bOrders = SNIPER;
|
||||||
|
|
||||||
if (pp->bAttitude == BRAVEAID)
|
if (pp->bAttitude == BRAVEAID)
|
||||||
pp->bAttitude = BRAVESOLO;
|
pp->bAttitude = BRAVESOLO;
|
||||||
|
|
||||||
if (pp->bAttitude == CUNNINGAID)
|
if (pp->bAttitude == CUNNINGAID)
|
||||||
pp->bAttitude = CUNNINGSOLO;
|
pp->bAttitude = CUNNINGSOLO;
|
||||||
|
|
||||||
DebugMsg ( TOPIC_JA2AI , DBG_LEVEL_3 , String("Sniper Created") );
|
DebugMsg ( TOPIC_JA2AI , DBG_LEVEL_3 , String("Sniper Created") );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SOLDIERTYPE* TacticalCreateSoldier( SOLDIERCREATE_STRUCT *pCreateStruct, UINT8 *pubID )
|
SOLDIERTYPE* TacticalCreateSoldier( SOLDIERCREATE_STRUCT *pCreateStruct, UINT8 *pubID )
|
||||||
|
|||||||
+51
-22
@@ -981,21 +981,6 @@ BOOLEAN fCivilian = (PTR_CIVILIAN && (pSoldier->ubCivilianGroup == NON_CIV_GROUP
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
// SNIPERS GET TO COVER, EVERYONE INTO THE DARK
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
if ( (pSoldier->bOrders == SNIPER || InLightAtNight( pSoldier->sGridNo, pSoldier->bLevel )) && pSoldier->bActionPoints >= MinPtsToMove(pSoldier) )
|
|
||||||
{
|
|
||||||
pSoldier->usActionData = FindNearbyDarkerSpot( pSoldier );
|
|
||||||
if ( pSoldier->usActionData != NOWHERE )
|
|
||||||
{
|
|
||||||
// move as if leaving water or gas
|
|
||||||
return( AI_ACTION_LEAVE_WATER_GAS );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////
|
||||||
// RANDOM PATROL: determine % chance to start a new patrol route
|
// RANDOM PATROL: determine % chance to start a new patrol route
|
||||||
////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -1029,7 +1014,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 += -15; break;
|
case SNIPER: iChance += -10; 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
|
||||||
@@ -1099,7 +1084,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 += -15; break;
|
case SNIPER: iChance += -10; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// modify for attitude
|
// modify for attitude
|
||||||
@@ -1343,7 +1328,7 @@ 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) || pSoldier->bOrders == SNIPER )
|
if ((pSoldier->bOrders == STATIONARY) || (pSoldier->bOrders == ONGUARD) )
|
||||||
iChance = 50;
|
iChance = 50;
|
||||||
else // all other orders
|
else // all other orders
|
||||||
iChance = 25;
|
iChance = 25;
|
||||||
@@ -1359,7 +1344,13 @@ INT8 DecideActionYellow(SOLDIERTYPE *pSoldier)
|
|||||||
sprintf((CHAR *)tempstr,"%s - TURNS TOWARDS NOISE to face direction %d",pSoldier->name,pSoldier->usActionData);
|
sprintf((CHAR *)tempstr,"%s - TURNS TOWARDS NOISE to face direction %d",pSoldier->name,pSoldier->usActionData);
|
||||||
AIPopMessage(tempstr);
|
AIPopMessage(tempstr);
|
||||||
#endif
|
#endif
|
||||||
|
if ( pSoldier->bOrders == SNIPER )
|
||||||
|
{
|
||||||
|
if (!gfTurnBasedAI || GetAPsToReadyWeapon( pSoldier, READY_RIFLE_CROUCH ) <= pSoldier->bActionPoints)
|
||||||
|
{
|
||||||
|
pSoldier->bNextAction = AI_ACTION_RAISE_GUN;
|
||||||
|
}
|
||||||
|
}
|
||||||
return(AI_ACTION_CHANGE_FACING);
|
return(AI_ACTION_CHANGE_FACING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1542,7 +1533,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 += -15; break;
|
case SNIPER: iChance += -10; 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
|
||||||
@@ -1688,7 +1679,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 += -15; break;
|
case SNIPER: iChance += -10; 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
|
||||||
@@ -1894,6 +1885,8 @@ INT8 DecideActionRed(SOLDIERTYPE *pSoldier, UINT8 ubUnconsciousOK)
|
|||||||
(pSoldier->bNeutral && gTacticalStatus.fCivGroupHostile[pSoldier->ubCivilianGroup] == CIV_GROUP_NEUTRAL) ||
|
(pSoldier->bNeutral && gTacticalStatus.fCivGroupHostile[pSoldier->ubCivilianGroup] == CIV_GROUP_NEUTRAL) ||
|
||||||
(pSoldier->ubBodyType >= FATCIV && pSoldier->ubBodyType <= CRIPPLECIV) ) );
|
(pSoldier->ubBodyType >= FATCIV && pSoldier->ubBodyType <= CRIPPLECIV) ) );
|
||||||
|
|
||||||
|
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("DecideActionRed: soldier orders = %d",pSoldier->bOrders));
|
||||||
|
|
||||||
// if we have absolutely no action points, we can't do a thing under RED!
|
// if we have absolutely no action points, we can't do a thing under RED!
|
||||||
if (!pSoldier->bActionPoints)
|
if (!pSoldier->bActionPoints)
|
||||||
{
|
{
|
||||||
@@ -3137,10 +3130,24 @@ DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"decideactionred: radio red alert?");
|
|||||||
sprintf((CHAR *)tempstr,"%s - TURNS TOWARDS CLOSEST ENEMY to face direction %d",pSoldier->name,pSoldier->usActionData);
|
sprintf((CHAR *)tempstr,"%s - TURNS TOWARDS CLOSEST ENEMY to face direction %d",pSoldier->name,pSoldier->usActionData);
|
||||||
AIPopMessage(tempstr);
|
AIPopMessage(tempstr);
|
||||||
#endif
|
#endif
|
||||||
|
if ( pSoldier->bOrders == SNIPER )
|
||||||
|
{
|
||||||
|
if (!gfTurnBasedAI || GetAPsToReadyWeapon( pSoldier, READY_RIFLE_CROUCH ) <= pSoldier->bActionPoints)
|
||||||
|
{
|
||||||
|
pSoldier->bNextAction = AI_ACTION_RAISE_GUN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return(AI_ACTION_CHANGE_FACING);
|
return(AI_ACTION_CHANGE_FACING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if ( pSoldier->bDirection == ubOpponentDir && pSoldier->bOrders == SNIPER )
|
||||||
|
{
|
||||||
|
if (!gfTurnBasedAI || GetAPsToReadyWeapon( pSoldier, READY_RIFLE_CROUCH ) <= pSoldier->bActionPoints)
|
||||||
|
{
|
||||||
|
return AI_ACTION_RAISE_GUN;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3321,9 +3328,31 @@ DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"decideactionred: radio red alert?");
|
|||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
// If sniper and nothing else to do then raise gun, and if that doesn't find somebody then goto green
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
if ( pSoldier->bOrders == SNIPER )
|
||||||
|
{
|
||||||
|
if ( pSoldier->sniper == 0 )
|
||||||
|
{
|
||||||
|
DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("DecideActionRed: sniper raising gun..."));
|
||||||
|
if (!gfTurnBasedAI || GetAPsToReadyWeapon( pSoldier, READY_RIFLE_CROUCH ) <= pSoldier->bActionPoints)
|
||||||
|
{
|
||||||
|
pSoldier->sniper = 1;
|
||||||
|
return AI_ACTION_RAISE_GUN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pSoldier->sniper = 0;
|
||||||
|
pSoldier->bBypassToGreen = 30;
|
||||||
|
return(DecideActionGreen(pSoldier));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
// DO NOTHING: Not enough points left to move, so save them for next turn
|
// DO NOTHING: Not enough points left to move, so save them for next turn
|
||||||
////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("DecideActionRed: do nothing at all..."));
|
||||||
#ifdef DEBUGDECISIONS
|
#ifdef DEBUGDECISIONS
|
||||||
AINameMessage(pSoldier,"- DOES NOTHING (RED)",1000);
|
AINameMessage(pSoldier,"- DOES NOTHING (RED)",1000);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user