Files
SoaFE/DATA/XML/AI/PERCEPTUALEQUATIONS/BASICLANDEQUATIONS.XML
2026-02-28 14:00:45 -06:00

1370 lines
49 KiB
XML

<?xml version="1.0" ?>
<Equations>
<!-- Certain plans are disallowed as a defender. These plans are allowed if
It's a skirmish game
OR
It's a campaign game
AND
Offense time delay is over
AND
We're the attacker
OR
We're the defender without a base
OR
We're the defender with a base
AND
We have units to spare-significantly more units than the enemy has (landed or not)
UNUSED PARTS
*
(Script_EvaluateInGalacticContext.Evaluate{Parameter_Script_String = "Offense_Delay_Ground_Expired"})
-->
<Allowed_As_Defender_Land>
(Game.IsCampaignGame == 0)
+
(Game.IsCampaignGame == 1)
*
(
(1 - Variable_Self.IsDefender)
+
(Variable_Self.IsDefender) * (Variable_Self.BaseLevel == 0)
+
(Variable_Self.IsDefender) * (Variable_Self.BaseLevel > 0)
*
(
(
(Variable_Self.FriendlyForceUnnormalized {Parameter_Category = GameObjectCategoryType[Infantry | Vehicle | Air]}
>= (3.0 * (Variable_Enemy.FriendlyForceUnnormalized + Variable_Enemy.ReinforcementsUnnormalized)))
)
> 0
)
)
</Allowed_As_Defender_Land>
<!-- UNUSED and was having problems
<Offense_Delay_Ground_Expired>
Game.Age > Variable_Target.Hints.OffenseDelayGround
</Offense_Delay_Ground_Expired>
-->
<!--
Zero if it's disallowed
The notion is that when ever enemy weaknesses are presented, we capitolize upon them. Therefore,
Targets are prioritized for destruction first by
nearness to greater friendly forces than enemies then by
isolation from allies then by
whether their shields are in poor shape then by
how relatively weakened the target is then by
big boost for being nearly dead
how relatively weak to the rest of the enemy units it is.
Add a constant at the end to make sure that we always have at least some desire to destroy everything.
+
2.0 * (Variable_Target.ContainsHero)-->
<Should_Destroy_Land_Unit>
Function_Allowed_As_Defender_Land.Evaluate
*
(
4.0 * ((Variable_Target.Location.FriendlyForce - Variable_Target.Location.EnemyForce) > 0.0)
+
3.0 * (1.0 - Variable_Target.Location.EnemyForce)
+
2.0 * (1.0 - (Variable_Target.Shield > 0.66))
+
2.0 * (1.0 - Variable_Target.Health)
+
5.0 * (1.0 - (Variable_Target.Health > 0.8))
+
(1.0 - Variable_Target.ForceNBTD)
+
1.0
)
</Should_Destroy_Land_Unit>
<Should_Clear_Infantry>
Function_Allowed_As_Defender_Land.Evaluate
*
100.0
*
Variable_Target.EnemyUnitConcentrationNBTD {Parameter_Category = GameObjectCategoryType[Infantry]} -
Function_Should_Clear_Vehicles.Evaluate
</Should_Clear_Infantry>
<Should_Clear_Vehicles>
Function_Allowed_As_Defender_Land.Evaluate
*
5.0
*
Variable_Target.EnemyUnitConcentrationNBTD {Parameter_Category = GameObjectCategoryType[Vehicle]}
</Should_Clear_Vehicles>
<Is_Strong_Position>
Function_ReallySmall.Evaluate
*
Variable_Target.Hints.High_Ground
</Is_Strong_Position>
<!--
Low base desire
Cut desire for structures not belonging to the primary enemy
More desire for certain structures
High desire to destroy tactically active structures
Very high desire for unprotected structures
Don't attack turbolasers, there is a special plan for that
Ignore this when we may lose a land control game-->
<Should_Destroy_Structure>
Function_Allowed_As_Defender_Land.Evaluate
*
(
(0.1 * (1 - Variable_Target.Owner.IsFaction {Parameter_Faction = "Empire", Parameter_Faction = "Rebel", Parameter_Faction = "Underworld", Parameter_Faction = "Hutts"}))
+
(1.0 * (Variable_Target.Owner.IsFaction {Parameter_Faction = "Empire", Parameter_Faction = "Rebel", Parameter_Faction = "Underworld", Parameter_Faction = "Hutts"}))
)
*
(
0.001
+
(2 * Variable_Target.Type.IsType { Parameter_Type = "Ground_Ion_Cannon",
Parameter_Type = "Ground_Empire_Hypervelocity_Gun",
Parameter_Type = "Ground_Hutts_Hypervelocity_Gun",
Parameter_Type = "U_Ground_Gravity_Generator",
Parameter_Type = "E_Ground_Magnepulse_Cannon"})
+
(5.0 * Variable_Target.Type.IsType {Parameter_Type = "Empire_Anti_Aircraft_Turret",
Parameter_Type = "Rebel_Anti_Aircraft_Turret",
Parameter_Type = "Hutt_Anti_Aircraft_Turret",
Parameter_Type = "Empire_Anti_Infantry_Turret",
Parameter_Type = "Rebel_Anti_Infantry_Turret",
Parameter_Type = "Hutt_Rapid_Fire_Laser_Turret",
Parameter_Type = "Empire_Anti_Vehicle_Turret",
Parameter_Type = "Rebel_Anti_Vehicle_Turret",
Parameter_Type = "Hutt_Rocket_Turret",
Parameter_Type = "Underworld_Mass_Driver_Turret",
Parameter_Type = "Underworld_Torpedo_Turret",
Parameter_Type = "Underworld_Flak_Turret",
Parameter_Type = "Empire_Repair_Facility",
Parameter_Type = "Rebel_Repair_Facility",
Parameter_Type = "Underworld_Repair_Facility",
Parameter_Type = "Hutt_Repair_Facility",
Parameter_Type = "Rebel_Bacta_Tank",
Parameter_Type = "Empire_Bacta_Tank",
Parameter_Type = "Underworld_Bacta_Tank",
Parameter_Type = "Hutt_Bacta_Tank",
Parameter_Type = "Hutt_Guard_Tower",
Parameter_Type = "Hutt_Obelisk_Tower"
<!-- ,Parameter_Type = "FCU_Empire_Anti_Aircraft_Turret",
Parameter_Type = "FCU_Rebel_Anti_Aircraft_Turret",
Parameter_Type = "FCU_Hutt_Anti_Aircraft_Turret",
Parameter_Type = "FCU_Empire_Anti_Infantry_Turret",
Parameter_Type = "FCU_Rebel_Anti_Infantry_Turret",
Parameter_Type = "FCU_Hutt_Rapid_Fire_Laser_Turret",
Parameter_Type = "FCU_Empire_Anti_Vehicle_Turret",
Parameter_Type = "FCU_Rebel_Anti_Vehicle_Turret",
Parameter_Type = "FCU_Hutt_Rocket_Turret",
Parameter_Type = "FCU_Underworld_Mass_Driver_Turret",
Parameter_Type = "FCU_Underworld_Torpedo_Turret",
Parameter_Type = "FCU_Underworld_Flak_Turret",
Parameter_Type = "FCU_Empire_Repair_Facility",
Parameter_Type = "FCU_Rebel_Repair_Facility",
Parameter_Type = "FCU_Underworld_Repair_Facility",
Parameter_Type = "FCU_Hutt_Repair_Facility",
Parameter_Type = "FCU_Rebel_Bacta_Tank",
Parameter_Type = "FCU_Empire_Bacta_Tank",
Parameter_Type = "FCU_Underworld_Bacta_Tank",
Parameter_Type = "FCU_Hutt_Bacta_Tank",
Parameter_Type = "FCU_Hutt_Guard_Tower",
Parameter_Type = "FCU_Hutt_Obelisk_Tower"-->})
+
(10 * Variable_Target.Type.IsType { Parameter_Type = "E_Ground_Base_Shield_740",
Parameter_Type = "E_Ground_Base_Shield_370",
Parameter_Type = "R_Ground_Base_Shield_740",
Parameter_Type = "R_Ground_Base_Shield_370",
Parameter_Type = "U_Ground_Base_Shield_740",
Parameter_Type = "U_Ground_Base_Shield_370",
Parameter_Type = "H_Ground_Base_Shield_740",
Parameter_Type = "H_Ground_Base_Shield_370",
<!-- Parameter_Type = "FCU_E_Ground_Base_Shield_740",
Parameter_Type = "FCU_E_Ground_Base_Shield_370",
Parameter_Type = "FCU_R_Ground_Base_Shield_740",
Parameter_Type = "FCU_R_Ground_Base_Shield_370",
Parameter_Type = "FCU_U_Ground_Base_Shield_740",
Parameter_Type = "FCU_U_Ground_Base_Shield_370",
Parameter_Type = "FCU_H_Ground_Base_Shield_740",
Parameter_Type = "FCU_H_Ground_Base_Shield_370",
Parameter_Type = "FCU_E_Ground_Shutter_Shield",
Parameter_Type = "FCU_R_Ground_Shutter_Shield",
Parameter_Type = "FCU_U_Ground_Shutter_Shield",
Parameter_Type = "FCU_H_Ground_Shutter_Shield",-->
Parameter_Type = "H_Ground_Shutter_Shield",
Parameter_Type = "U_Ground_Shutter_Shield",
Parameter_Type = "U_Ground_Shutter_Shield_Small",
Parameter_Type = "U_Ground_Shutter_Shield_GC",
Parameter_Type = "E_Ground_Power_Generator",
Parameter_Type = "R_Ground_Power_Generator",
Parameter_Type = "U_Ground_Power_Generator",
Parameter_Type = "H_Ground_Power_Generator"
<!-- ,Parameter_Type = "FCU_E_Ground_Power_Generator",
Parameter_Type = "FCU_R_Ground_Power_Generator",
Parameter_Type = "FCU_U_Ground_Power_Generator",
Parameter_Type = "FCU_H_Ground_Power_Generator"-->})
+
(20 * Variable_Target.Type.IsType { Parameter_Type = "Empire_Ground_Mining_Facility",
Parameter_Type = "Rebel_Ground_Mining_Facility",
Parameter_Type = "Underworld_Ground_Mining_Facility",
Parameter_Type = "Hutts_Ground_Mining_Facility",
Parameter_Type = "Empire_Mineral_Processor",
Parameter_Type = "Rebel_Mineral_Processor",
Parameter_Type = "Underworld_Mineral_Processor",
Parameter_Type = "Hutts_Mineral_Processor"})
+
(15.0 * (1 - Variable_Target.Location.EnemyForce))
)
*
(1 - (Variable_Target.Type.IsType { Parameter_Type = "E_Ground_Turbolaser_Tower",
Parameter_Type = "R_Ground_Turbolaser_Tower",
Parameter_Type = "U_Ground_Turbolaser_Tower",
Parameter_Type = "H_Ground_Turbolaser_Tower",
Parameter_Type = "H_Ground_Heavy_Beam_Tower"
<!-- ,Parameter_Type = "FCU_E_Ground_Turbolaser_Tower",
Parameter_Type = "FCU_R_Ground_Turbolaser_Tower",
Parameter_Type = "FCU_U_Ground_Turbolaser_Tower",
Parameter_Type = "FCU_H_Ground_Heavy_Beam_Tower"-->}))
*
(1.0 - Function_May_Lose_Land_Control_Game.Evaluate)
</Should_Destroy_Structure>
<Should_Destroy_Turbolaser>
Function_Allowed_As_Defender_Land.Evaluate
*
(
(0.1 * (1 - Variable_Target.Owner.IsFaction {Parameter_Faction = "Empire", Parameter_Faction = "Rebel", Parameter_Faction = "Underworld", Parameter_Faction = "Hutts"}))
+
(1.0 * (Variable_Target.Owner.IsFaction {Parameter_Faction = "Empire", Parameter_Faction = "Rebel", Parameter_Faction = "Underworld", Parameter_Faction = "Hutts"}))
)
*
(1 - Variable_Target.Location.EnemyForce)
*
(Variable_Target.Type.IsType { Parameter_Type = "E_Ground_Turbolaser_Tower",
Parameter_Type = "R_Ground_Turbolaser_Tower",
Parameter_Type = "U_Ground_Turbolaser_Tower",
Parameter_Type = "H_Ground_Turbolaser_Tower",
Parameter_Type = "H_Ground_Heavy_Beam_Tower"
<!-- ,Parameter_Type = "FCU_E_Ground_Turbolaser_Tower",
Parameter_Type = "FCU_R_Ground_Turbolaser_Tower",
Parameter_Type = "FCU_U_Ground_Turbolaser_Tower",
Parameter_Type = "FCU_H_Ground_Heavy_Beam_Tower"-->})
*
50
*
(1.0 - Function_May_Lose_Land_Control_Game.Evaluate)
</Should_Destroy_Turbolaser>
<Land_Unit_Needs_Escort>
Variable_Target.Force
</Land_Unit_Needs_Escort>
<Vehicle_Needs_Escort>
Variable_Target.Force{Parameter_Category = GameObjectCategoryType[Vehicle]}
</Vehicle_Needs_Escort>
<Area_Needs_Han_Solo_Assist>
Variable_Target.EnemyForce{Parameter_Category = GameObjectCategoryType[Vehicle]}
*
Variable_Target.FriendlyForce
</Area_Needs_Han_Solo_Assist>
<!--
ignore obiwan himself
unit must be at least slightly damaged
unit must be close to the enemy
assist things with the most force
UNUSED
assist things with a lot of force that are damaged
(Variable_Target.Force - Variable_Target.Force{Parameter_Attenuator = 1.0})-->
<Needs_ObiWan_Assist>
(1 - Variable_Target.Type.IsType {Parameter_Type = "Obi_Wan_Kenobi"})
*
(((0.9 > Variable_Target.Health) + (0.9 > Variable_Target.Shield)) > 0)
*
(1000 > Variable_Target.DistanceToNearestEnemy)
*
Variable_Target.Force
</Needs_ObiWan_Assist>
<Needs_Vader_Assist>
(1 - Variable_Target.Type.IsType {Parameter_Type = "Darth_Vader", Parameter_Type = "Darth_Vader_Expansion"})
*
(((0.9 > Variable_Target.Health) + (0.9 > Variable_Target.Shield)) > 0)
*
(1000 > Variable_Target.DistanceToNearestEnemy)
*
Variable_Target.Force
</Needs_Vader_Assist>
<!-- Desire to uncover the fog of war in a zone depends on:
Not being pinned to the base
AND
Scout near the base if we haven't seen it in a while or it's early game
Scout away from the base and the enemy base if we haven't seen it in a while or it's early to mid game
Scout near the enemy base or start location if it's a campaign game or it's not early game or it hasn't been seen in a while-->
<Land_Area_Needs_Scouting>
(1 - Function_Should_Burn_Units_Land.Evaluate)
*
(0.5 + 0.5 * Game.IsCampaignGame)
*
(
15 * (500 > Variable_Target.DistanceToNearestFriendly{Parameter_Category = GameObjectCategoryType[Structure]})
* (((Variable_Target.TimeLastSeenUnnormalized > 120) + (20 > Game.Age)) > 0)
+
10 * (Variable_Target.DistanceToNearestFriendly{Parameter_Category = GameObjectCategoryType[Structure]} > 500)
* (Variable_Target.DistanceToNearestEnemy{Parameter_Category = GameObjectCategoryType[Structure]} > 500)
* (((Variable_Target.TimeLastSeenUnnormalized > 400) + (200 > Game.Age)) > 0)
* Variable_Target.TimeLastSeen
+
5 * (Variable_Target.IsEnemyStartLocation + (500 > Variable_Target.DistanceToNearestEnemy{Parameter_Category = GameObjectCategoryType[Structure]} ))
* (((Variable_Target.TimeLastSeenUnnormalized > 600) + (Game.Age > 400) + (Game.IsCampaignGame)) > 0)
* Variable_Target.TimeLastSeen
)
</Land_Area_Needs_Scouting>
<!--
Has enough time passed
Are we outnumbered Nx (by landed forces + reinforcements, and over-attenuated by health) if attacking
Are we outnumbered Nx (by landed forces, and over-attenuated by health) if defending
AND
we don't have a base left
OR the base is small and without enough turrets to defend it-->
<Want_To_Retreat_From_Land>
(1 - Game.IsSetupPhase)
*
(Game.Age > 30)
*
(
(
(1.0 - Variable_Self.IsDefender)
*
(
Variable_Enemy.LandedForceUnnormalized{Parameter_Attenuator = 1.0} >= (2.0 * Variable_Self.FriendlyForceUnnormalized{Parameter_Attenuator = 1.0} + Variable_Self.ReinforcementsUnnormalized)
)
)
+
(
Variable_Self.IsDefender
*
(Variable_Enemy.LandedForceUnnormalized{Parameter_Attenuator = 1.0} >= (2.5 * Variable_Self.FriendlyForceUnnormalized{Parameter_Attenuator = 1.0}))
*
(
((Variable_Self.BaseLevel == 0)
+
(1 > Variable_Self.BaseLevel) *
(Variable_Enemy.LandedForceUnnormalized >= (5.0 * Variable_Self.FriendlyForceUnnormalized {Parameter_Category = GameObjectCategoryType[Structure]})))
>
0
)
)
)
</Want_To_Retreat_From_Land>
<!--
Is this a campaign game (the AI doesn't retreat in skirmish)
AND
Are we capable of retreat
AND
Are we not pirates-->
<Allowed_To_Retreat_From_Land>
Game.IsCampaignGame
*
Variable_Self.CanRetreat
*
(1.0 - Variable_Self.IsFaction {Parameter_Faction = "Pirates"})
</Allowed_To_Retreat_From_Land>
<Should_Retreat_From_Land>
Function_Want_To_Retreat_From_Land.Evaluate
*
Function_Allowed_To_Retreat_From_Land.Evaluate
</Should_Retreat_From_Land>
<Game_Age>
Game.Age
</Game_Age>
<!--
Variable_Self.ReinforcementsUnnormalized
-->
<Debug_Land_1>
Variable_Self.FriendlyForceUnnormalized
+
Variable_Self.FriendlyForceUnnormalized{Parameter_Type = "MPTL"}
+
Variable_Self.FriendlyForceUnnormalized{Parameter_Type = "T2B_Tank"}
+
Variable_Self.FriendlyForceUnnormalized{Parameter_Type = "Han_Solo"}
+
Variable_Self.FriendlyForceUnnormalized{Parameter_Type = "Chewbacca"}
+
Variable_Self.FriendlyForceUnnormalized{Parameter_Type = "Droid_R2D2"}
+
Variable_Self.FriendlyForceUnnormalized{Parameter_Type = "Droid_C3P0"}
</Debug_Land_1>
<Debug_Land_2>
Variable_Self.CanRetreat *
((1.0 - Variable_Self.IsDefender) *
(Variable_Self.EnemyForce >= (2.0 * Variable_Self.FriendlyForce)) +
Variable_Self.IsDefender *
(Variable_Self.EnemyForce >= (3.0 * Variable_Self.FriendlyForce)))
</Debug_Land_2>
<!--
Can we start a bombing run?
Is our target an antiair unit?
Is our target surrounded by too much antiair threat?
Is there too much enemy antiair threat across the entire map?
Are there plenty of enemy units near the target?
-->
<Should_Bomb>
(1 - Variable_Self.IsDifficulty{Parameter_Difficulty_Level_Type = DifficultyLevelType[Easy]}) *
50.0 *
Variable_Self.IsBombingRunAvailable *
(Variable_Target.ForceUnnormalized {Parameter_Category = GameObjectCategoryType[AntiAir]} == 0.0) *
(1.0 - (Variable_Target.Location.EnemyForceUnnormalized {Parameter_Category = GameObjectCategoryType[AntiAir]} > 500.0)) *
(1.0 - (Variable_Self.EnemyForceUnnormalized {Parameter_Category = GameObjectCategoryType[AntiAir]} > 3000.0)) *
Variable_Target.Location.EnemyUnitConcentration *
Variable_Target.IsValidBombingTarget
</Should_Bomb>
<Is_Friendly_Start>
Variable_Target.IsFriendlyStartLocation
</Is_Friendly_Start>
<!--
Scale up by the normalized landed enemy presence of the appropriate category.
Big boost if we don't have at least one of these.
Scale down as the ratio of this type of turret increases
Scale down if we're close to another
UNUSED
-->
<Need_AntiVehicle_Turret>
Variable_Target.Type.IsType {Parameter_Type = "Skirmish_Build_Pad"
,Parameter_Type = "Rebel_Build_Pad"
,Parameter_Type = "Empire_Build_Pad"
,Parameter_Type = "Underworld_Build_Pad"
,Parameter_Type = "Hutt_Build_Pad"
<!-- ,Parameter_Type = "FCU_Skirmish_Build_Pad"
,Parameter_Type = "FCU_Rebel_Build_Pad"
,Parameter_Type = "FCU_Empire_Build_Pad"
,Parameter_Type = "FCU_Underworld_Build_Pad"
,Parameter_Type = "FCU_Hutt_Build_Pad"-->}
*
(1 - Variable_Target.HasBuiltObject)
*
Function_Is_Allowed_To_Build.Evaluate
*
20
*
(Game.Age > 60)
*
(1 - Function_Is_Saving_For_Refineries_Land.Evaluate)
*
(
(1 - Function_Skirmish_Upgrade_Tech.Evaluate)
+
(Variable_Target.Location.EnemyForce {Parameter_Category = GameObjectCategoryType[Vehicle]} > 0)
)
*
(0.5 + (Variable_Enemy.LandedForceUnnormalized {Parameter_Category = GameObjectCategoryType[Vehicle]} /
(Variable_Enemy.LandedForceUnnormalized + 0.00001)))
*
(
50 * (0 == Variable_Self.TacticalBuiltStructureCount {Parameter_Type = "Empire_Anti_Vehicle_Turret",
Parameter_Type = "Rebel_Anti_Vehicle_Turret",
Parameter_Type = "Pirate_Anti_Vehicle_Turret",
Parameter_Type = "Underworld_Torpedo_Turret",
Parameter_Type = "Hutt_Rocket_Turret"
<!-- ,Parameter_Type = "FCU_Empire_Anti_Vehicle_Turret",
Parameter_Type = "FCU_Rebel_Anti_Vehicle_Turret",
Parameter_Type = "FCU_Underworld_Torpedo_Turret",
Parameter_Type = "FCU_Hutt_Rocket_Turret"-->})
+
5 * (0.7 - Variable_Self.TacticalBuiltStructureCount {Parameter_Type = "Empire_Anti_Vehicle_Turret",
Parameter_Type = "Rebel_Anti_Vehicle_Turret",
Parameter_Type = "Pirate_Anti_Vehicle_Turret",
Parameter_Type = "Underworld_Torpedo_Turret",
Parameter_Type = "Hutt_Rocket_Turret"
<!-- ,Parameter_Type = "FCU_Empire_Anti_Vehicle_Turret",
Parameter_Type = "FCU_Rebel_Anti_Vehicle_Turret",
Parameter_Type = "FCU_Underworld_Torpedo_Turret",
Parameter_Type = "FCU_Hutt_Rocket_Turret"-->} / Function_Build_Pad_Count.Evaluate)
+
2 * (200 > Variable_Target.DistanceToNearestFriendly {Parameter_Category = GameObjectCategoryType[Structure]})
)
</Need_AntiVehicle_Turret>
<Need_AntiAir_Turret>
Variable_Target.Type.IsType {Parameter_Type = "Skirmish_Build_Pad"
,Parameter_Type = "Rebel_Build_Pad"
,Parameter_Type = "Empire_Build_Pad"
,Parameter_Type = "Underworld_Build_Pad"
,Parameter_Type = "Hutt_Build_Pad"
<!-- ,Parameter_Type = "FCU_Skirmish_Build_Pad"
,Parameter_Type = "FCU_Rebel_Build_Pad"
,Parameter_Type = "FCU_Empire_Build_Pad"
,Parameter_Type = "FCU_Underworld_Build_Pad"
,Parameter_Type = "FCU_Hutt_Build_Pad"-->}
*
(1 - Variable_Target.HasBuiltObject)
*
Function_Is_Allowed_To_Build.Evaluate
*
20
*
(1 - Function_Is_Saving_For_Refineries_Land.Evaluate)
*
(1 - Function_Skirmish_Upgrade_Tech.Evaluate)
*
(0.25 + (Variable_Enemy.LandedForceUnnormalized {Parameter_Category = GameObjectCategoryType[Air]} /
(Variable_Enemy.LandedForceUnnormalized + 0.00001)))
*
(
10 * (0 == Variable_Self.TacticalBuiltStructureCount {Parameter_Type = "Empire_Anti_Aircraft_Turret",
Parameter_Type = "Rebel_Anti_Aircraft_Turret",
Parameter_Type = "Pirate_Anti_Aircraft_Turret",
Parameter_Type = "Underworld_Flak_Turret",
Parameter_Type = "Hutt_Anti_Aircraft_Turret"
<!-- ,Parameter_Type = "FCU_Empire_Anti_Aircraft_Turret",
Parameter_Type = "FCU_Rebel_Anti_Aircraft_Turret",
Parameter_Type = "FCU_Underworld_Mass_Driver_Turret",
Parameter_Type = "FCU_Underworld_Flak_Turret",
Parameter_Type = "FCU_Hutt_Anti_Aircraft_Turret"-->})
+
5 * (0.3 - Variable_Self.TacticalBuiltStructureCount {Parameter_Type = "Empire_Anti_Aircraft_Turret",
Parameter_Type = "Rebel_Anti_Aircraft_Turret",
Parameter_Type = "Pirate_Anti_Aircraft_Turret",
Parameter_Type = "Underworld_Flak_Turret",
Parameter_Type = "Hutt_Anti_Aircraft_Turret"
<!-- ,Parameter_Type = "FCU_Empire_Anti_Aircraft_Turret",
Parameter_Type = "FCU_Rebel_Anti_Aircraft_Turret",
Parameter_Type = "FCU_Underworld_Mass_Driver_Turret",
Parameter_Type = "FCU_Underworld_Flak_Turret",
Parameter_Type = "FCU_Hutt_Anti_Aircraft_Turret"-->} / Function_Build_Pad_Count.Evaluate)
+
2 * (200 > Variable_Target.DistanceToNearestFriendly {Parameter_Category = GameObjectCategoryType[Structure]})
)
</Need_AntiAir_Turret>
<Need_AntiInfantry_Turret>
Variable_Target.Type.IsType {Parameter_Type = "Skirmish_Build_Pad"
,Parameter_Type = "Rebel_Build_Pad"
,Parameter_Type = "Empire_Build_Pad"
,Parameter_Type = "Underworld_Build_Pad"
,Parameter_Type = "Hutt_Build_Pad"
<!-- ,Parameter_Type = "FCU_Skirmish_Build_Pad"
,Parameter_Type = "FCU_Rebel_Build_Pad"
,Parameter_Type = "FCU_Empire_Build_Pad"
,Parameter_Type = "FCU_Hutt_Build_Pad"-->}
*
(1 - Variable_Target.HasBuiltObject)
*
Function_Is_Allowed_To_Build.Evaluate
*
10
*
(Game.Age > 60)
*
(
(1 - Function_Is_Saving_For_Refineries_Land.Evaluate)
+
(Function_Is_Saving_For_Refineries_Land.Evaluate)
*
(300 > Variable_Target.DistanceToNearestEnemy {Parameter_Type = "Skirmish_Mineral_Processor_Pad"
,Parameter_Type = "Skirmish_Outpost_Pad"
,Parameter_Type = "Hutts_Ground_Mining_Facility_Build_Pad"
,Parameter_Type = "Empire_Ground_Mining_Facility_Build_Pad"
,Parameter_Type = "Rebel_Ground_Mining_Facility_Build_Pad"})
)
*
(
(1 - Function_Skirmish_Upgrade_Tech.Evaluate)
+
(Variable_Target.Location.EnemyForce {Parameter_Category = GameObjectCategoryType[Infantry]} > 0)
)
*
(0.5 + (Variable_Enemy.LandedForceUnnormalized {Parameter_Category = GameObjectCategoryType[Infantry]} /
(Variable_Enemy.LandedForceUnnormalized + 0.00001)))
*
(
10 * (0 == Variable_Self.TacticalBuiltStructureCount {Parameter_Type = "Empire_Anti_Infantry_Turret",
Parameter_Type = "Rebel_Anti_Infantry_Turret",
Parameter_Type = "Pirate_Anti_Infantry_Turret",
Parameter_Type = "Underworld_Mass_Driver_Turret",
Parameter_Type = "Hutt_Rapid_Fire_Laser_Turret"
<!-- ,Parameter_Type = "FCU_Empire_Anti_Infantry_Turret",
Parameter_Type = "FCU_Rebel_Anti_Infantry_Turret",
Parameter_Type = "FCU_Hutt_Rapid_Fire_Laser_Turret"-->})
+
5 * (0.7 - Variable_Self.TacticalBuiltStructureCount {Parameter_Type = "Empire_Anti_Infantry_Turret",
Parameter_Type = "Rebel_Anti_Infantry_Turret",
Parameter_Type = "Pirate_Anti_Infantry_Turret",
Parameter_Type = "Underworld_Mass_Driver_Turret",
Parameter_Type = "Hutt_Rapid_Fire_Laser_Turret"
<!-- ,Parameter_Type = "FCU_Empire_Anti_Infantry_Turret",
Parameter_Type = "FCU_Rebel_Anti_Infantry_Turret",
Parameter_Type = "FCU_Hutt_Rapid_Fire_Laser_Turret"-->}
/ Function_Build_Pad_Count.Evaluate)
+
2 * (200 > Variable_Target.DistanceToNearestFriendly {Parameter_Category = GameObjectCategoryType[Structure]})
)
</Need_AntiInfantry_Turret>
<!--
Do we have a use for this
AND
Scale up big if we have none
Scale up less the more we get
Scale down if we're close to another
UNUSED
-->
<Need_Bacta_Tank>
Variable_Target.Type.IsType {Parameter_Type = "Skirmish_Build_Pad"
,Parameter_Type = "Rebel_Build_Pad"
,Parameter_Type = "Empire_Build_Pad"
,Parameter_Type = "Underworld_Build_Pad"
,Parameter_Type = "Hutt_Build_Pad"
<!-- ,Parameter_Type = "FCU_Empire_Utility_Pad"
,Parameter_Type = "FCU_Rebel_Utility_Pad"
,Parameter_Type = "FCU_Underworld_Utility_Pad"
,Parameter_Type = "FCU_Hutt_Utility_Pad"-->}
*
(1 - Variable_Target.HasBuiltObject)
*
Function_Is_Allowed_To_Build.Evaluate
*
(1 - Function_Is_Saving_For_Refineries_Land.Evaluate)
*
(1 - Function_Skirmish_Upgrade_Tech.Evaluate)
*
(Game.Age > 60)
*
(
Function_Has_Infantry_Hero.Evaluate
+
Variable_Self.FriendlyForce {Parameter_Category = GameObjectCategoryType[Infantry]}
)
*
(
10 * (0 == Variable_Self.TacticalBuiltStructureCount {Parameter_Type = "Empire_Bacta_Tank",
Parameter_Type = "Rebel_Bacta_Tank",
Parameter_Type = "Pirate_Bacta_Tank",
Parameter_Type = "Underworld_Bacta_Tank",
Parameter_Type = "Hutt_Bacta_Tank"
<!-- ,Parameter_Type = "FCU_Empire_Bacta_Tank",
Parameter_Type = "FCU_Rebel_Bacta_Tank",
Parameter_Type = "FCU_Underworld_Bacta_Tank",
Parameter_Type = "FCU_Hutt_Bacta_Tank"-->})
+
5 * (0.1 - Variable_Self.TacticalBuiltStructureCount {Parameter_Type = "Empire_Bacta_Tank",
Parameter_Type = "Rebel_Bacta_Tank",
Parameter_Type = "Pirate_Bacta_Tank",
Parameter_Type = "Underworld_Bacta_Tank",
Parameter_Type = "Hutt_Bacta_Tank"
<!-- ,Parameter_Type = "FCU_Empire_Bacta_Tank",
Parameter_Type = "FCU_Rebel_Bacta_Tank",
Parameter_Type = "FCU_Underworld_Bacta_Tank",
Parameter_Type = "FCU_Hutt_Bacta_Tank"-->} / Function_Build_Pad_Count.Evaluate)
-
2 * (800 > Variable_Target.DistanceToNearestFriendly {Parameter_Type = "Empire_Bacta_Tank",
Parameter_Type = "Rebel_Bacta_Tank",
Parameter_Type = "Pirate_Bacta_Tank",
Parameter_Type = "Underworld_Bacta_Tank",
Parameter_Type = "Hutt_Bacta_Tank"
<!-- ,Parameter_Type = "FCU_Empire_Bacta_Tank",
Parameter_Type = "FCU_Rebel_Bacta_Tank",
Parameter_Type = "FCU_Underworld_Bacta_Tank",
Parameter_Type = "FCU_Hutt_Bacta_Tank"-->})
)
</Need_Bacta_Tank>
<Has_Infantry_Hero>
Variable_Self.HasUnit{ Parameter_Type = "Emperor_Palpatine"
,Parameter_Type = "Boba_Fett"
,Parameter_Type = "Han_Solo"
,Parameter_Type = "Chewbacca"
,Parameter_Type = "Mara_Jade"
,Parameter_Type = "Obi_Wan_Kenobi"
,Parameter_Type = "Darth_Vader"
,Parameter_Type = "Darth_Vader_Expansion"
,Parameter_Type = "Kyle_Katarn"
,Parameter_Type = "Tyber_Zann"
,Parameter_Type = "Silri"
,Parameter_Type = "Urai_Fen"
,Parameter_Type = "Bossk"
,Parameter_Type = "Cuarson"
,Parameter_Type = "Sykariius"
,Parameter_Type = "Xizor"
,Parameter_Type = "Luke_Skywalker_Jedi"
,Parameter_Type = "Yoda"}
</Has_Infantry_Hero>
<Has_Vehicle_Hero>
Variable_Self.HasUnit { Parameter_Type = "General_Veers"
,Parameter_Type = "Gargantuan_Battle_Platform"
<!-- ,Parameter_Type = "IG-88"-->
,Parameter_Type = "Pestelous_the_Hutt"
,Parameter_Type = "Tactical_R2_3PO_Team"}
</Has_Vehicle_Hero>
<!--
Do we have a use for this
AND
Scale up big if we have none
Scale up less the more we get
Scale down if we're close to another
UNUSED
-->
<Need_Repair_Bay>
Variable_Target.Type.IsType {Parameter_Type = "Skirmish_Build_Pad"
,Parameter_Type = "Rebel_Build_Pad"
,Parameter_Type = "Empire_Build_Pad"
,Parameter_Type = "Underworld_Build_Pad"
,Parameter_Type = "Hutt_Build_Pad"
<!-- ,Parameter_Type = "FCU_Empire_Utility_Pad"
,Parameter_Type = "FCU_Rebel_Utility_Pad"
,Parameter_Type = "FCU_Underworld_Utility_Pad"
,Parameter_Type = "FCU_Hutt_Utility_Pad"-->}
*
(1 - Variable_Target.HasBuiltObject)
*
Function_Is_Allowed_To_Build.Evaluate
*
(1 - Function_Is_Saving_For_Refineries_Land.Evaluate)
*
(1 - Function_Skirmish_Upgrade_Tech.Evaluate)
*
(Game.Age > 60)
*
(
Function_Has_Vehicle_Hero.Evaluate
+
Variable_Self.FriendlyForce {Parameter_Category = GameObjectCategoryType[Vehicle]}
)
*
(
10 * (0 == Variable_Self.TacticalBuiltStructureCount {Parameter_Type = "Empire_Repair_Facility",
Parameter_Type = "Rebel_Repair_Facility",
Parameter_Type = "Pirate_Repair_Facility",
Parameter_Type = "Underworld_Repair_Facility",
Parameter_Type = "Hutt_Repair_Facility"
<!-- ,Parameter_Type = "FCU_Empire_Repair_Facility",
Parameter_Type = "FCU_Rebel_Repair_Facility",
Parameter_Type = "FCU_Underworld_Repair_Facility",
Parameter_Type = "FCU_Hutt_Repair_Facility"-->})
+
5 * (0.1 - Variable_Self.TacticalBuiltStructureCount {Parameter_Type = "Empire_Repair_Facility",
Parameter_Type = "Rebel_Repair_Facility",
Parameter_Type = "Pirate_Repair_Facility",
Parameter_Type = "Underworld_Repair_Facility",
Parameter_Type = "Hutt_Repair_Facility"
<!-- ,Parameter_Type = "FCU_Empire_Repair_Facility",
Parameter_Type = "FCU_Rebel_Repair_Facility",
Parameter_Type = "FCU_Underworld_Repair_Facility",
Parameter_Type = "FCU_Hutt_Repair_Facility"-->} / Function_Build_Pad_Count.Evaluate)
-
2 * (800 > Variable_Target.DistanceToNearestFriendly {Parameter_Type = "Empire_Repair_Facility",
Parameter_Type = "Rebel_Repair_Facility",
Parameter_Type = "Pirate_Repair_Facility",
Parameter_Type = "Underworld_Repair_Facility",
Parameter_Type = "Hutt_Repair_Facility"
<!-- ,Parameter_Type = "FCU_Empire_Repair_Facility",
Parameter_Type = "FCU_Rebel_Repair_Facility",
Parameter_Type = "FCU_Underworld_Repair_Facility",
Parameter_Type = "FCU_Hutt_Repair_Facility"-->})
)
</Need_Repair_Bay>
<!-- Defenders are generally allowed to build turrets
Attackers should only build if it will assist the front line
In skirmish games we must have both a barracks and a command center up before we think of building turrets etc.
*
(Variable_Target.Location.EnemyUnitConcentrationUnnormalized == 0)
-->
<Is_Allowed_To_Build>
Game.IsCampaignGame
*
(Variable_Self.IsDefender
+
(1 - Variable_Self.IsDefender)
*
(Variable_Target.Location.EnemyForce > 0))
+
Function_Is_Initial_Skirmish_State_Established.Evaluate
*
(1.0 - Function_May_Lose_Land_Control_Game.Evaluate)
</Is_Allowed_To_Build>
<!--
Is this the appropriate context for funding tactical structures? Only fund if
It's a campaign game
AND
We don't have significantly more force than the attacker
AND
We have more open pads than we've built out
(This aspect prevents a land, retreat, land, retreat exploit to get the AI to waste money)-->
<Need_For_Tactical_Funding>
Game.IsCampaignGame
*
(
Variable_Self.IsFaction {Parameter_Faction = "Pirates"}
+
Variable_Self.IsFaction {Parameter_Faction = "Hutts"}
+
(
(Variable_Self.OpenBuildPadCount > Variable_Self.TacticalBuiltStructureCount)
*
(
(Variable_Enemy.LandedForceUnnormalized > (Variable_Self.FriendlyForceUnnormalized / 2))
+
(Variable_Enemy.FriendlyForceUnnormalized {Parameter_Category = GameObjectCategoryType[Air]} > 0)
)
)
)
</Need_For_Tactical_Funding>
<!-- The total count, occupied or not -->
<Build_Pad_Count>
Variable_Self.TacticalBuiltStructureCount + Variable_Self.OpenBuildPadCount
</Build_Pad_Count>
<!-- always want more, unless the AI is easy and already has a couple of resource structures-->
<Want_More_Resource_Structures_Land>
(1 - Variable_Self.IsDifficulty{Parameter_Difficulty_Level_Type = DifficultyLevelType[Easy]})
+
(Variable_Self.IsDifficulty{Parameter_Difficulty_Level_Type = DifficultyLevelType[Easy]})
*
(2 > Function_Number_Resource_Structures_Land.Evaluate)
</Want_More_Resource_Structures_Land>
<!-- Desire to secure contestable things (build pads for turrets or refineries, cantinas, reinforcement points, etc.
Don't bother if we're trying to firesale
It must be a skirmish game
AND
We have no refineries yet
AND
this is a refinery pad
OR
half desire if not a refinery pad
AND
we've reached our initial comfort zone
OR
this is specifically a mineral processor pad (cheap to build on)
OR
We have at least one refinery
OR
It must ba a campaign game
AND
This is a build pad where we're allowed to build
AND
We've decided it's worth funding tactical structures
OR
Big boost, if this is a landing zone and we still have units in space waiting to land
AND
Make sure this is a contestable structure and desire unguarded contestables more
AND
Sink desire if we already have enough for this difficulty.
OR
Flat desire bonus for reinforcement points in land control games
OR
Huge desire bonus for reinforcement points in land control games if we currently have none
UNUSED PART
*
(Script_EvaluateInGalacticContext.Evaluate{Parameter_Script_String = "Offense_Delay_Ground_Expired"})-->
<Need_To_Secure_Contestable_Land>
(1 - Function_Should_Firesale_Land.Evaluate)
*
(
(Game.IsCampaignGame == 0)
*
(
(Function_Want_More_Resource_Structures_Land.Evaluate)
*
(1.0 + 3.0 * (Function_Num_Refineries.Evaluate == 0.0))
*
(
1.5 * Function_Is_Refinery_Pad.Evaluate
+
2.0 * Function_Is_Outpost_Pad.Evaluate
-
1.5 * Variable_Target.HasBuiltObject
)
+
Function_Is_Initial_Skirmish_State_Established.Evaluate
*
(
1.0
+
(1.0 + (3 > Variable_Self.UnitSpaceAvailable))
*
Variable_Target.AdditionalPopulationCapacity / 2.0
)
*
(0.5 - Variable_Target.Location.EnemyForce)
)
+
(Game.IsCampaignGame == 1)
*
(
Function_Is_Allowed_To_Build.Evaluate
*
Function_Need_For_Tactical_Funding.Evaluate
+
2 * Script_TargetHasProperty.Evaluate{Parameter_Script_String = "IsRushTarget"}
* (Variable_Self.ReinforcementsUnnormalized > 0)
)
)
*
Variable_Target.IsContestable
*
(
5 * (Variable_Target.Location.EnemyForce == 0)
+
5 * clamp( (500 / (Variable_Target.DistanceToNearestFriendly + 1)), 0, 1)
+
5
)
*
(1.0 - Function_May_Lose_Land_Control_Game.Evaluate)
</Need_To_Secure_Contestable_Land>
<Need_To_Secure_Contestable_Escorted_Land>
Function_Need_To_Secure_Contestable_Land.Evaluate * 1.5
</Need_To_Secure_Contestable_Escorted_Land>
<Number_Resource_Structures_Land>
Variable_Self.TacticalBuiltStructureCount{Parameter_Type = "Empire_Ground_Mining_Facility"
,Parameter_Type = "Rebel_Ground_Mining_Facility"
,Parameter_Type = "Underworld_Ground_Mining_Facility"
,Parameter_Type = "Hutts_Ground_Mining_Facility"
,Parameter_Type = "Empire_Mineral_Processor"
,Parameter_Type = "Rebel_Mineral_Processor"
,Parameter_Type = "Underworld_Mineral_Processor"
,Parameter_Type = "Hutts_Mineral_Processor"}
</Number_Resource_Structures_Land>
<!-- Boolean. Global desire to sell off a tactical structure to make room on a build pad for something else.
Are we out of build pads or money
AND
Is there high desire for a new structure
-->
<Need_To_Sell>
(
(
(Variable_Self.OpenBuildPadCount == 0)
+
(2000 > Variable_Self.CreditsUnnormalized)
)
> 0
)
*
(
(
(Function_Need_Repair_Bay.Evaluate > 20)
+
(Function_Need_Bacta_Tank.Evaluate > 20)
+
(Function_Need_AntiInfantry_Turret.Evaluate > 10)
+
(Function_Need_AntiVehicle_Turret.Evaluate > 20)
+
(Function_Need_AntiAir_Turret.Evaluate > 20)
)
> 0
)
</Need_To_Sell>
<!--Should this tactical structure be sold?
Do we need to sell in general
AND
Is there low desire for this particular structure
-->
<Need_To_Sell_Tactical_Structure>
Function_Need_To_Sell.Evaluate
*
(
Variable_Target.HasBuiltObject {Parameter_Type = "Empire_Anti_Vehicle_Turret",
Parameter_Type = "Rebel_Anti_Vehicle_Turret",
Parameter_Type = "Pirate_Anti_Vehicle_Turret",
Parameter_Type = "Hutt_Anti_Vehicle_Turret",
Parameter_Type = "Underworld_Torpedo_Turret"
<!-- ,Parameter_Type = "FCU_Empire_Anti_Vehicle_Turret",
Parameter_Type = "FCU_Rebel_Anti_Vehicle_Turret",
Parameter_Type = "FCU_Hutt_Anti_Vehicle_Turret",
Parameter_Type = "FCU_Underworld_Torpedo_Turret"-->}
*
(5 > Function_Need_AntiVehicle_Turret.Evaluate)
+
Variable_Target.HasBuiltObject {Parameter_Type = "Empire_Anti_Infantry_Turret",
Parameter_Type = "Rebel_Anti_Infantry_Turret",
Parameter_Type = "Underworld_Mass_Driver_Turret",
Parameter_Type = "Hutt_Rapid_Fire_Laser_Turret",
Parameter_Type = "Pirate_Anti_Infantry_Turret"
<!-- ,Parameter_Type = "FCU_Empire_Anti_Infantry_Turret",
Parameter_Type = "FCU_Rebel_Anti_Infantry_Turret",
Parameter_Type = "FCU_Hutt_Rapid_Fire_Laser_Turret"-->}
*
(5 > Function_Need_AntiInfantry_Turret.Evaluate)
+
Variable_Target.HasBuiltObject {Parameter_Type = "Empire_Anti_Aircraft_Turret",
Parameter_Type = "Rebel_Anti_Aircraft_Turret",
Parameter_Type = "Hutt_Anti_Aircraft_Turret",
Parameter_Type = "Underworld_Flak_Turret",
Parameter_Type = "Pirate_Anti_Aircraft_Turret"
<!-- ,Parameter_Type = "FCU_Empire_Anti_Aircraft_Turret",
Parameter_Type = "FCU_Rebel_Anti_Aircraft_Turret",
Parameter_Type = "FCU_Hutt_Anti_Aircraft_Turret",
Parameter_Type = "FCU_Underworld_Flak_Turret",
Parameter_Type = "FCU_Underworld_Mass_Driver_Turret"-->}
*
(5 > Function_Need_AntiAir_Turret.Evaluate)
+
Variable_Target.HasBuiltObject {Parameter_Type = "Empire_Bacta_Tank",
Parameter_Type = "Rebel_Bacta_Tank",
Parameter_Type = "Pirate_Bacta_Tank",
Parameter_Type = "Hutt_Bacta_Tank",
Parameter_Type = "Underworld_Bacta_Tank"
<!-- ,Parameter_Type = "FCU_Empire_Bacta_Tank",
Parameter_Type = "FCU_Rebel_Bacta_Tank",
Parameter_Type = "FCU_Hutt_Bacta_Tank",
Parameter_Type = "FCU_Underworld_Bacta_Tank"-->}
*
(5 > Function_Need_Bacta_Tank.Evaluate)
+
Variable_Target.HasBuiltObject {Parameter_Type = "Empire_Repair_Facility",
Parameter_Type = "Rebel_Repair_Facility",
Parameter_Type = "Pirate_Repair_Facility",
Parameter_Type = "Hutt_Repair_Facility",
Parameter_Type = "Underworld_Repair_Facility"
<!-- ,Parameter_Type = "FCU_Empire_Repair_Facility",
Parameter_Type = "FCU_Rebel_Repair_Facility",
Parameter_Type = "FCU_Hutt_Repair_Facility",
Parameter_Type = "FCU_Underworld_Repair_Facility"-->}
*
(5 > Function_Need_Repair_Bay.Evaluate)
)
</Need_To_Sell_Tactical_Structure>
<!-- A low desire plan to keep otherwise idle defensive units milling around the base.
We must be the defender
AND
Scale down as the zone our structure is in becomes more populated with friendlies
AND
Scale up as the nearest friendly becomes more distant
(divisor is to keep desirability relatively low, but high enough that the patrols will steal from each other)
Ignore this when we may lose a land control game
-->
<Need_To_Patrol_Land>
(1 - Function_Should_Burn_Units_Land.Evaluate)
*
clamp( Variable_Self.IsDefender
*
(1 - Variable_Target.Location.FriendlyForce)
*
(Variable_Target.DistanceToNearestFriendly / 10)
,0
,3
)
*
(1.0 - Function_May_Lose_Land_Control_Game.Evaluate)
</Need_To_Patrol_Land>
<!-- A high desire emergency response plan for reacting to a structure taking fire.
Ignore this when we may lose a land control game
-->
<Need_To_Defend_Structure>
(20 * Variable_Target.HasTakenDamage {Parameter_Time = 5}
+
10 * (Variable_Target.Location.EnemyForce))
*
(1.0 - Function_May_Lose_Land_Control_Game.Evaluate)
</Need_To_Defend_Structure>
<!-- The desire to put appropriate RPS units in place for structure defense increases with
The enemy's nearness to a structure of ours (nominal desire begins at 1000 units)
AND
The amount of enemy force at his location
Clamped so that Defend_Structure can steal units.
This is for a globally exclusive plan,
otherwise all units would tend to clump and
not at all handle multiple front attacks.
-->
<Need_To_PreDefend_Structure>
Variable_Self.IsDefender
*
clamp( 3000 / Script_GetDistanceToNearestWithProperty.Evaluate{Parameter_Script_String = "INBASE", Parameter_Script_String = "FRIENDLY"}
+
Variable_Target.Location.EnemyForce
,0
,20)
</Need_To_PreDefend_Structure>
<!--
Very low desire
if we're the attacker
OR
if we're the defender and we have overwhelming forces
OR
very high desire if the opponent is retreating
-->
<Need_To_Clean_Up>
0.01
*
(
(1 - Variable_Self.IsDefender)
+
(Variable_Self.IsDefender) *
(Variable_Self.LandedForceUnnormalized > (Variable_Self.EnemyForceUnnormalized * 3))
)
+
(50 * Variable_Enemy.IsRetreating)
</Need_To_Clean_Up>
<!-- send the ewoks out
+
(50 * Variable_Enemy.IsRetreating)
-->
<Need_To_Ewok_Hunt>
Variable_Target.EnemyForce {Parameter_Faction = "Empire"}
*
50
</Need_To_Ewok_Hunt>
<Needs_Magnepulse_Shot>
Variable_Target.Force {Parameter_Category = GameObjectCategoryType[Vehicle]}
+
Variable_Target.Location.EnemyForce {Parameter_Category = GameObjectCategoryType[Vehicle]}
</Needs_Magnepulse_Shot>
<!-- Desire to purchase upgrades
Try to ensure that resource facilities have been purchased first.
Is it not a campaign game
We have at least a third of the force the enemy does
AND SCALE UP
Small base desire
We have enough of a force advantage, attenuated for health
Randomly, half of the time we get extra desire to build units
OR
Is it a campaign game (where we're stuck with the units we've got)
-->
<Should_Purchase_Ability_Generic>
(Game.Age > 120)
*
(Variable_Self.FriendlyForce > (0.33 * Variable_Self.EnemyForce))
*
(
(Game.IsCampaignGame == 0)
*
(12 > Variable_Self.UnitSpaceAvailable)
*
(
2.0
+
10.0 * (Variable_Self.FriendlyForceUnnormalized{Parameter_Attenuator = 1.0} >= (0.8 * Variable_Enemy.ForceUnnormalized{Parameter_Attenuator = 1.0}))
+
(5.0 * (0#1>0.5))
)
+
(Game.IsCampaignGame)
)
*
(1.0 - Function_May_Lose_Land_Control_Game.Evaluate)
</Should_Purchase_Ability_Generic>
<Current_Enemy_Location>
Variable_Target.EnemyUnitConcentration
</Current_Enemy_Location>
<Current_Friendly_Location>
Variable_Target.FriendlyUnitConcentration
</Current_Friendly_Location>
<!--
This will trigger units attacking the enemy base, do or die.
Do we want to retreat
AND
We're not allowed
OR
We're near the pop cap
AND We have plenty of units in reserve because
We've got at least X% in reinforcements compared to what we have fielded
OR
We've got more in reinforcements than the enemy has fielded
-->
<Should_Burn_Units_Land>
(
Function_Want_To_Retreat_From_Land.Evaluate
*
(1 - Function_Allowed_To_Retreat_From_Land.Evaluate)
*
(
(Game.IsCampaignGame == 1)
+
(Game.IsCampaignGame == 0)
*
(Game.Age > 400)
*
(1 - Function_Is_Saving_For_Refineries_Land.Evaluate)
)
)
+
(Game.IsCampaignGame == 0)
*
(1 > Variable_Self.UnitSpaceAvailable)
*
(
(
(Variable_Self.ReinforcementsUnnormalized > (Variable_Self.FriendlyForceUnnormalized{Parameter_Category = GameObjectCategoryType[Infantry|Vehicle|Air]} * 0.25))
+
(Variable_Self.ReinforcementsUnnormalized > Variable_Self.EnemyForceUnnormalized{Parameter_Category = GameObjectCategoryType[Infantry|Vehicle|Air]})
)
> 0
)
</Should_Burn_Units_Land>
<Should_Firesale_Land>
Function_Want_To_Retreat_From_Land.Evaluate
*
(1 - Function_Allowed_To_Retreat_From_Land.Evaluate)
*
(
(Game.IsCampaignGame == 1)
+
(Game.IsCampaignGame == 0)
*
(Game.Age > 300)
*
(1 - Function_Is_Saving_For_Refineries_Land.Evaluate)
*
(Variable_Self.HasUnit {Parameter_Type = "E_Ground_Command_Center",
Parameter_Type = "R_Ground_Command_Center",
Parameter_Type = "H_Ground_Command_Center",
Parameter_Type = "U_Ground_Palace"} == 0.0)
*
(Function_Num_Refineries.Evaluate == 0)
*
(2000 > Variable_Self.CreditsUnnormalized)
)
</Should_Firesale_Land>
<!-- greatly prefer to attack infantry, but be willing to attack anything-->
<Need_To_Flame_Infantry>
40 * Variable_Target.EnemyForce {Parameter_Category = GameObjectCategoryType[Infantry]}
+
Variable_Target.EnemyForce
</Need_To_Flame_Infantry>
<!-- steal the most powerful and healthy vehicles
big multiplier, to get the desirability for normalized force in a reasonable range
make sure we only try to steal vehicles that aren't heroes
-->
<Need_To_Steal_Vehicle>
500
*
(
Variable_Target.Force{Parameter_Attenuator = 1.0, Parameter_Category = GameObjectCategoryType[Vehicle]}
-
Variable_Target.Force{Parameter_Category = GameObjectCategoryType[LandHero]}
)
</Need_To_Steal_Vehicle>
<!--
If it has less than N health, it needs repair
SCALE
BIG by how significant the vehicle is
SMALL by how much it's damaged
SMALL for having low shields
-->
<Needs_Repair>
(0.8 > Variable_Target.Health)
*
(
30 * Variable_Target.Force
+
10 * (1 - Variable_Target.Health)
+
5 * (0.3 > Variable_Target.Shield)
)
</Needs_Repair>
<Is_Build_Pad>
Variable_Target.IsBuildPad
</Is_Build_Pad>
<!-- Defensive rush is the push towards the attacker LZ (reinforcement points)
UNUSED PARTS
*
(Script_EvaluateInGalacticContext.Evaluate{Parameter_Script_String = "Offense_Delay_Ground_Expired"})
-->
<Should_Defensive_Rush>
40
*
(Game.IsCampaignGame == 1)
*
Variable_Self.IsDefender
*
(Variable_Self.FriendlyForceUnnormalized {Parameter_Category = GameObjectCategoryType[Infantry | Vehicle | Air]} > 3000)
</Should_Defensive_Rush>
<Non_Structure_Force_Unnormalized>
Variable_Self.FriendlyForceUnnormalized - Variable_Self.FriendlyForceUnnormalized {Parameter_Category = GameObjectCategoryType[Structure]}
</Non_Structure_Force_Unnormalized>
<Should_Hold_Position>
20.0
*
Game.IsLandControlGame
+
5.0
*
Game.IsCampaignGame
*
Variable_Self.IsDefender
*
Variable_Target.AdditionalPopulationCapacity
+
10.0
*
(Game.IsCampaignGame == 0.0)
*
(Variable_Target.AdditionalPopulationCapacity > Variable_Self.UnitSpaceAvailable)
*
Function_Is_Initial_Skirmish_State_Established.Evaluate
*
(Function_Num_Refineries.Evaluate > 1)
</Should_Hold_Position>
</Equations>