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

304 lines
12 KiB
XML

<?xml version="1.0" ?>
<Equations>
<!-- High priority whenever a friendly planet has an enemy force in orbit
... consider how valuable this planet is
... and if we don't own much space, this is even more important
and don't use this coventional goal/plan on systems disconnected by one planet-->
<Needs_Blockade_Lifted>
(Variable_Target.EnemyForce.HasSpaceForce)
*
Function_First_Attack_Allowed.Evaluate
*
(Variable_Target.EnemyForce.SpaceTotalUnnormalized > 0)
*
(30 +
(10.0 * Function_GenericPlanetValue.Evaluate) +
(10.0 * Function_More_Planets_Needed.Evaluate))
*
((Function_Need_To_Reconnect_Islands.Evaluate == 0.0) +
Variable_Target.ConnectsLargestIslands)
*
(Variable_Target.TimeSinceSpaceConflict > Function_Blockade_Wait_Time.Evaluate)
</Needs_Blockade_Lifted>
<Blockade_Wait_Time>
Variable_Self.IsDifficulty{Parameter_Difficulty_Level_Type = DifficultyLevelType[Easy]}
* 90.0
+
Variable_Self.IsDifficulty{Parameter_Difficulty_Level_Type = DifficultyLevelType[Normal]}
* 90.0
+
Variable_Self.IsDifficulty{Parameter_Difficulty_Level_Type = DifficultyLevelType[Hard]}
* 20.0
</Blockade_Wait_Time>
<Has_Friendly_Ground_Force>
Variable_Target.FriendlyForce.HasGroundForce
</Has_Friendly_Ground_Force>
<!-- Is there space? -->
<!-- Are the groundbase and defensive force worth protecting? -->
<!-- Is the planet worth protecting -->
<Needs_Ground_Defensive_Structure>
5.0 *
Variable_Target.OpenStructureSlots *
Variable_Target.GroundbaseLevel *
Variable_Target.FriendlyForce.GroundTotalNBTD *
Function_DefensiveValue.Evaluate
</Needs_Ground_Defensive_Structure>
<!-- Is there space? -->
<!-- Are the starbase and defensive force worth protecting? -->
<!-- Is the planet worth protecting -->
<Needs_Space_Defensive_Structure>
5.0 *
Variable_Target.OpenStructureSlots *
Variable_Target.StarbaseLevel *
Variable_Target.FriendlyForce.SpaceTotalNBTD *
Function_DefensiveValue.Evaluate
</Needs_Space_Defensive_Structure>
<!-- Don't defend planets with enemy forces blockading (handled by Lift_Blockade) -->
<!-- How valuable is the planet? -->
<!-- How many trade routes do I also control the other end for? -->
<!-- How strong is the enemy around here? -->
<!-- Is this planet already well-defended -->
<DefensiveValue>
(1.0 - Variable_Target.EnemyForce.SpaceTotalNBTT) *
(Function_GenericPlanetValue.Evaluate +
Variable_Target.ActiveTradeRoutes +
Variable_Target.EnemyForce.NearbyGroundTotal + Variable_Target.EnemyForce.NearbySpaceTotal -
Variable_Target.FriendlyForce.GroundTotal - Variable_Target.FriendlyForce.SpaceTotal)
+
Variable_Target.Hints.Chokepoint
+
Variable_Target.Hints.PriorityTarget
</DefensiveValue>
<GroundDefensiveValue>
(Variable_Target.EnemyForce.HasSpaceForce == 0.0)
*
(1.1 - Variable_Target.FriendlyForce.GroundTotalNBTD)
*
(
5.0 * Variable_Target.Hints.Chokepoint
+
5.0 * Function_Is_Connected_To_Enemy.Evaluate
+
5.0 * (Variable_Target.FriendlyForce.HasGroundUnitsBitfield {Parameter_Type = "MON_MOTHMA", Parameter_Type = "Emperor_Palpatine"} > 0)
+
Function_Defense_Level.Evaluate
)
</GroundDefensiveValue>
<SpaceDefensiveValue>
(1.1 - Variable_Target.FriendlyForce.SpaceTotalNBTD)
*
(
5.0 * Variable_Target.Hints.Chokepoint
+
5.0 * Function_Is_Connected_To_Enemy.Evaluate
+
Function_Defense_Level.Evaluate
)
</SpaceDefensiveValue>
<Needs_Weapon>
2.0 * Variable_Target.StarbaseLevelUnnormalized
+
2.0 * Variable_Target.GroundbaseLevelUnnormalized
+
8.0 * Variable_Target.Hints.Chokepoint
+
2.0 * Function_DefensiveValue.Evaluate
+
8.0 * Function_Is_Connected_To_Enemy.Evaluate
+
Variable_Target.FriendlyForce.SpaceTotalUnnormalized / 5000.0
+
Variable_Target.FriendlyForce.GroundTotalUnnormalized / 2500.0
</Needs_Weapon>
<!-- Regular in base shield.
The desire to have a ground shield depends upon:
investment in ground base
bonus for defensive value (including chokepoint markup)
bonus for having force here
-->
<Needs_Base_Shield>
2.0 * Variable_Target.GroundbaseLevelUnnormalized
+
8.0 * Variable_Target.Hints.Chokepoint
+
2.0 * Function_DefensiveValue.Evaluate
+
8.0 * Function_Is_Connected_To_Enemy.Evaluate
+
Variable_Target.FriendlyForce.GroundTotalUnnormalized / 2500.0
</Needs_Base_Shield>
<!--
Just like the need for a shield, but add a flat modifier rather than a force dependent one
since turbolaser effectiveness isn't very dependent on other units being present.
-->
<Needs_Turbolasers>
2.0 * Variable_Target.GroundbaseLevelUnnormalized
+
8.0 * Variable_Target.Hints.Chokepoint
+
2.0 * Function_DefensiveValue.Evaluate
+
8.0 * Function_Is_Connected_To_Enemy.Evaluate
+
10.0
</Needs_Turbolasers>
<Needs_Jamming_Station>
Variable_Target.OpenStructureSlots
*
Function_Has_Enough_Bases_For_Tech.Evaluate
*
(Function_Defense_Level.Evaluate > 5)
</Needs_Jamming_Station>
<Defense_Level>
Variable_Target.StarbaseLevelUnnormalized
+ Variable_Target.HasStructure {Parameter_Type = "E_Ground_Base_Shield_740", Parameter_Count = 1}
+ Variable_Target.HasStructure {Parameter_Type = "R_Ground_Base_Shield_740", Parameter_Count = 1}
+ Variable_Target.HasStructure {Parameter_Type = "H_Ground_Base_Shield_740", Parameter_Count = 1}
+ Variable_Target.HasStructure {Parameter_Type = "E_Galactic_Turbolaser_Tower_Defenses", Parameter_Count = 1}
+ Variable_Target.HasStructure {Parameter_Type = "R_Galactic_Turbolaser_Tower_Defenses", Parameter_Count = 1}
+ Variable_Target.HasStructure {Parameter_Type = "H_Galactic_Turbolaser_Tower_Defenses", Parameter_Count = 1}
+ Variable_Target.HasStructure {Parameter_Type = "Ground_Ion_Cannon", Parameter_Count = 1}
+ Variable_Target.HasStructure {Parameter_Type = "Ground_Empire_Hypervelocity_Gun", Parameter_Count = 1}
+ Variable_Target.HasStructure {Parameter_Type = "Ground_Hutts_Hypervelocity_Gun", Parameter_Count = 1}
+ Variable_Target.HasStructure {Parameter_Type = "E_Ground_Magnepulse_Cannon", Parameter_Count = 1}
</Defense_Level>
<Can_Park_Ground_Unit>
(Variable_Target.EnemyForce.HasSpaceForce == 0.0)
*
(Variable_Target.OpenGroundCompanySlots > 0)
*
Variable_Target.IsSurfaceAccessible
</Can_Park_Ground_Unit>
<Low_Ground_Defense_Score>
1.0 - Variable_Target.FriendlyForce.GroundTotalNBTD
</Low_Ground_Defense_Score>
<Low_Space_Defense_Score>
1.0 - Variable_Target.FriendlyForce.SpaceTotalNBTD
</Low_Space_Defense_Score>
<Ground_Priority_Defense_Score>
Variable_Target.Hints.Chokepoint
+
2.0 * Function_Is_Connected_To_Enemy.Evaluate
+
Variable_Target.HasStructure {Parameter_Type = "E_Ground_Base_Shield_740", Parameter_Type = "R_Ground_Base_Shield_740", Parameter_Type = "H_Ground_Base_Shield_740",
Parameter_Type = "E_Galactic_Turbolaser_Tower_Defenses", Parameter_Type = "R_Galactic_Turbolaser_Tower_Defenses", Parameter_Type = "H_Galactic_Turbolaser_Tower_Defenses",
Parameter_Type = "E_Ground_Magnepulse_Cannon", Parameter_Type = "Ground_Gravity_Generator"}
</Ground_Priority_Defense_Score>
<Space_Priority_Defense_Score>
Variable_Target.Hints.Chokepoint
+
2.0 * Function_Is_Connected_To_Enemy.Evaluate
+
Variable_Target.HasStructure {Parameter_Type = "Ground_Ion_Cannon", Parameter_Type = "Ground_Empire_Hypervelocity_Gun", Parameter_Type = "Ground_Hutts_Hypervelocity_Gun"}
</Space_Priority_Defense_Score>
<Friendly_Space_Unit_Raw_Total>
Variable_Target.FriendlyForce.SpaceTotalUnnormalized - Variable_Target.FriendlyForce.SpaceTotalUnnormalized {Parameter_Category = GameObjectCategoryType[SpaceHero]}
</Friendly_Space_Unit_Raw_Total>
<Friendly_Global_Space_Unit_Raw_Total>
Variable_Self.SpaceTotalUnnormalized - Variable_Self.SpaceTotalUnnormalized {Parameter_Category = GameObjectCategoryType[SpaceHero]}
</Friendly_Global_Space_Unit_Raw_Total>
<Friendly_Land_Unit_Raw_Total>
Variable_Target.FriendlyForce.GroundTotalUnnormalized - Variable_Target.FriendlyForce.GroundTotalUnnormalized {Parameter_Category = GameObjectCategoryType[LandHero]}
</Friendly_Land_Unit_Raw_Total>
<Friendly_Global_Land_Unit_Raw_Total>
Variable_Self.GroundTotalUnnormalized - Variable_Self.GroundTotalUnnormalized {Parameter_Category = GameObjectCategoryType[LandHero]}
</Friendly_Global_Land_Unit_Raw_Total>
<Enemy_Global_Space_Unit_Raw_Total>
Game.EnemyForce.SpaceTotalUnnormalized - Game.EnemyForce.SpaceTotalUnnormalized {Parameter_Category = GameObjectCategoryType[SpaceHero]}
</Enemy_Global_Space_Unit_Raw_Total>
<Enemy_Global_Land_Unit_Raw_Total>
Game.EnemyForce.GroundTotalUnnormalized - Game.EnemyForce.GroundTotalUnnormalized {Parameter_Category = GameObjectCategoryType[LandHero]}
</Enemy_Global_Land_Unit_Raw_Total>
<Needs_Magic_Ground_Defense>
(Variable_Target.OpenGroundCompanySlots > 6) *
Function_Is_Connected_To_Enemy.Evaluate *
Function_Is_Connected_To_Me.Evaluate *
Variable_Self.IsDifficulty {Parameter_Difficulty_Level_Type = DifficultyLevelType[Normal]} *
Variable_Target.IsSurfaceAccessible
</Needs_Magic_Ground_Defense>
<Needs_Magic_Space_Defense>
(3000 > Function_Friendly_Space_Unit_Raw_Total.Evaluate) *
Function_Is_Connected_To_Enemy.Evaluate *
Function_Is_Connected_To_Me.Evaluate *
(Variable_Target.EnemyForce.HasSpaceForce == 0.0) *
Variable_Self.IsDifficulty {Parameter_Difficulty_Level_Type = DifficultyLevelType[Normal]}
</Needs_Magic_Space_Defense>
<Needs_Magic_Ground_Defense_Easy>
(Variable_Target.OpenGroundCompanySlots > 7) *
Function_Is_Connected_To_Enemy.Evaluate *
Function_Is_Connected_To_Me.Evaluate *
Variable_Self.IsDifficulty {Parameter_Difficulty_Level_Type = DifficultyLevelType[Easy]} *
Variable_Target.IsSurfaceAccessible
</Needs_Magic_Ground_Defense_Easy>
<Needs_Magic_Space_Defense_Easy>
(2000 > Function_Friendly_Space_Unit_Raw_Total.Evaluate) *
Function_Is_Connected_To_Enemy.Evaluate *
Function_Is_Connected_To_Me.Evaluate *
(Variable_Target.EnemyForce.HasSpaceForce == 0.0) *
Variable_Self.IsDifficulty {Parameter_Difficulty_Level_Type = DifficultyLevelType[Easy]}
</Needs_Magic_Space_Defense_Easy>
<Needs_Magic_Ground_Defense_Hard>
(Variable_Target.OpenGroundCompanySlots > 5) *
Function_Is_Connected_To_Enemy.Evaluate *
Function_Is_Connected_To_Me.Evaluate *
Variable_Self.IsDifficulty {Parameter_Difficulty_Level_Type = DifficultyLevelType[Hard]} *
Variable_Target.IsSurfaceAccessible
</Needs_Magic_Ground_Defense_Hard>
<Needs_Magic_Space_Defense_Hard>
(7000 > Function_Friendly_Space_Unit_Raw_Total.Evaluate) *
Function_Is_Connected_To_Enemy.Evaluate *
Function_Is_Connected_To_Me.Evaluate *
(Variable_Target.EnemyForce.HasSpaceForce == 0.0) *
Variable_Self.IsDifficulty {Parameter_Difficulty_Level_Type = DifficultyLevelType[Hard]}
</Needs_Magic_Space_Defense_Hard>
<Needs_Magic_Ground_Structure>
Function_Is_Connected_To_Enemy.Evaluate *
(Variable_Target.OpenGroundCompanySlots > 0) *
(
(Variable_Self.IsDifficulty {Parameter_Difficulty_Level_Type = DifficultyLevelType[Hard]}) *
(Variable_Target.OpenStructureSlotsUnnormalized > 1) +
(Variable_Self.IsDifficulty {Parameter_Difficulty_Level_Type = DifficultyLevelType[Normal]}) *
(Variable_Target.OpenStructureSlotsUnnormalized > 2) +
(Variable_Self.IsDifficulty {Parameter_Difficulty_Level_Type = DifficultyLevelType[Easy]}) *
(Variable_Target.OpenStructureSlotsUnnormalized > 3)
)
</Needs_Magic_Ground_Structure>
<Needs_Magic_Cash_Drop>
(Game.Age > 300)
*
(2000 > Variable_Self.CreditsUnnormalized)
*
(Function_Am_I_In_Winning_Position.Evaluate == 0.0)
</Needs_Magic_Cash_Drop>
</Equations>